diff --git a/.github/_typos.toml b/.github/_typos.toml deleted file mode 100644 index d7fc0095f57..00000000000 --- a/.github/_typos.toml +++ /dev/null @@ -1,7 +0,0 @@ -[default.extend-words] -TGE = "TGE" -TKO = "TKO" -Ethereum = "Ethereum" - -[files] -extend-exclude = ["packages/protocol/audit"] \ No newline at end of file diff --git a/.github/actions/install-pnpm-dependencies/action.yml b/.github/actions/install-pnpm-dependencies/action.yml index 4f25f1d7908..e353f14dfa2 100644 --- a/.github/actions/install-pnpm-dependencies/action.yml +++ b/.github/actions/install-pnpm-dependencies/action.yml @@ -1,39 +1,25 @@ -name: "Install pnpm dependencies" -description: "Install pnpm dependencies" +name: Install pnpm dependencies +description: Reusable action to install pnpm dependencies runs: - using: "composite" + using: composite steps: - name: Set up Git to use HTTPS shell: bash run: | git config --global url."https://github.com/".insteadOf "git@github.com:" - - name: Setup Node.js - uses: actions/setup-node@v4 - with: - node-version: 20 - - name: Install pnpm uses: pnpm/action-setup@v4 - id: pnpm-install with: version: 9 run_install: false - - name: Get pnpm store directory - id: pnpm-cache - shell: bash - run: | - echo "STORE_PATH=$(pnpm store path)" >> $GITHUB_OUTPUT - - - name: Setup pnpm cache - uses: actions/cache@v4 + - name: Install Node.js + uses: actions/setup-node@v4 with: - path: ${{ steps.pnpm-cache.outputs.STORE_PATH }} - key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} - restore-keys: | - ${{ runner.os }}-pnpm-store- + node-version: 20 + cache: pnpm - name: Install dependencies shell: bash diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 7cb08e48c33..187d50f2309 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -1,13 +1,32 @@ +# Dependabot configuration for automated dependency updates. +# This file is the single source of truth and overrides any GitHub repo settings. +# +# Key features: +# - Monthly updates scheduled for Saturday 04:20 ET +# - Dependencies are grouped by ecosystem to minimize PR noise +# - Each group has designated reviewers and single PR limit +# - To ignore updates for a dependency, add to ecosystem's ignore field (and open +# a GitHub issue if needed for tracking): +# ignore: +# - dependency-name: "golang.org/x/crypto" # skip all crypto updates + version: 2 updates: - package-ecosystem: "gomod" directory: "/" schedule: - interval: "weekly" + interval: "monthly" day: "saturday" time: "04:20" timezone: "America/New_York" - open-pull-requests-limit: 10 + reviewers: + - "davidtaikocha" + - "RogerLamTd" + open-pull-requests-limit: 1 + groups: + go-updates: + patterns: + - "*" - package-ecosystem: "github-actions" directory: "/" @@ -16,13 +35,27 @@ updates: day: "saturday" time: "04:20" timezone: "America/New_York" - open-pull-requests-limit: 10 + reviewers: + - "davidtaikocha" + - "RogerLamTd" + open-pull-requests-limit: 1 + groups: + github-actions-updates: + patterns: + - "*" - package-ecosystem: "npm" directory: "/" schedule: - interval: "weekly" + interval: "monthly" day: "saturday" time: "04:20" timezone: "America/New_York" - open-pull-requests-limit: 10 + reviewers: + - "KorbinianK" + - "bearni95" + open-pull-requests-limit: 1 + groups: + npm-updates: + patterns: + - "*" diff --git a/packages/branding/RGB SVG (For Digital Use)/Taiko Icon/taiko-icon-blk.svg b/.github/taiko-icon-blk.svg similarity index 100% rename from packages/branding/RGB SVG (For Digital Use)/Taiko Icon/taiko-icon-blk.svg rename to .github/taiko-icon-blk.svg diff --git a/.github/workflows/bridge-ui--ci.yml b/.github/workflows/bridge-ui--ci.yml index d270c524ece..4c1bb10c375 100644 --- a/.github/workflows/bridge-ui--ci.yml +++ b/.github/workflows/bridge-ui--ci.yml @@ -4,13 +4,16 @@ on: workflow_call jobs: build: - runs-on: [taiko-runner] + runs-on: [arc-runner-set] steps: - name: Cancel previous runs uses: styfle/cancel-workflow-action@0.12.1 with: access_token: ${{ github.token }} + - name: Install Git + run: sudo apt-get update && sudo apt-get install -y git + - name: Checkout repository uses: actions/checkout@v4 diff --git a/.github/workflows/bridge-ui.yml b/.github/workflows/bridge-ui.yml index ff942d2b9a1..b767a57be71 100644 --- a/.github/workflows/bridge-ui.yml +++ b/.github/workflows/bridge-ui.yml @@ -2,34 +2,42 @@ name: Bridge UI CI/CD on: push: + paths: + - "packages/bridge-ui/**" + branches-ignore: + - dependabot/** + - release-please--branches--** tags: - "bridge-ui-v*" + pull_request: + types: [opened, synchronize, reopened, ready_for_review] paths: - "packages/bridge-ui/**" jobs: build-and-test: + if: ${{ github.event.pull_request.draft == false && !startsWith(github.head_ref, 'release-please') && github.actor != 'dependabot[bot]' }} uses: ./.github/workflows/bridge-ui--ci.yml # Deployment name follow the pattern: deploy___ # Internal Devnet - deploy_bridge-ui_devnet_preview: - if: ${{ github.ref_type != 'tag' }} - needs: build-and-test - uses: ./.github/workflows/repo--vercel-deploy.yml - with: - environment: "preview" - flags: "" - secrets: - vercel_project_id: ${{ secrets.VERCEL_PROJECT_ID_BRIDGE_UI_INTERNAL }} - vercel_org_id: ${{ secrets.VERCEL_ORG_ID }} - vercel_token: ${{ secrets.VERCEL_TOKEN }} + # deploy_bridge-ui_devnet_preview: + # if: ${{ github.event_name == 'pull_request' && (contains(github.event.pull_request.labels.*.name, 'option.workflow_on') || github.event.pull_request.draft == false && github.head_ref != 'release-please-*') }} + # needs: build-and-test + # uses: ./.github/workflows/repo--vercel-deploy.yml + # with: + # environment: "preview" + # flags: "" + # secrets: + # vercel_project_id: ${{ secrets.VERCEL_PROJECT_ID_BRIDGE_UI_INTERNAL }} + # vercel_org_id: ${{ secrets.VERCEL_ORG_ID }} + # vercel_token: ${{ secrets.VERCEL_TOKEN }} # Hekla testnet deploy_bridge-ui_hekla_preview: - if: ${{ github.ref_type != 'tag' }} + if: ${{ github.event.pull_request.draft == false && !startsWith(github.head_ref, 'release-please') && github.actor != 'dependabot[bot]' }} needs: build-and-test uses: ./.github/workflows/repo--vercel-deploy.yml with: @@ -54,7 +62,7 @@ jobs: # Mainnet deploy_bridge-ui_mainnet_preview: - if: ${{ github.ref_type != 'tag' }} + if: ${{ github.event.pull_request.draft == false && !startsWith(github.head_ref, 'release-please') && github.actor != 'dependabot[bot]' }} needs: build-and-test uses: ./.github/workflows/repo--vercel-deploy.yml with: diff --git a/.github/workflows/docs-site--preview.yml b/.github/workflows/docs-site--preview.yml index 910fa4dc969..acd2226b733 100644 --- a/.github/workflows/docs-site--preview.yml +++ b/.github/workflows/docs-site--preview.yml @@ -5,17 +5,21 @@ env: VERCEL_PROJECT_ID: ${{ secrets.VERCEL_PROJECT_ID_DOCS_SITE }} on: - push: - branches-ignore: - - main - - release-please-* + pull_request: + types: [opened, synchronize, reopened, ready_for_review] paths: - "packages/docs-site/**" + branches-ignore: + - release-please--branches--** jobs: deploy-docs-site-preview: - runs-on: [taiko-runner] + if: ${{ github.event.pull_request.draft == false && !startsWith(github.head_ref, 'release-please') && github.event.pull_request.head.repo.fork == false && github.actor != 'dependabot[bot]' }} + runs-on: [arc-runner-set] steps: + - name: Install Git + run: sudo apt-get update && sudo apt-get install -y git + - name: Checkout repository uses: actions/checkout@v4 diff --git a/.github/workflows/docs-site--production.yml b/.github/workflows/docs-site--production.yml index c450567596f..78e03a182a7 100644 --- a/.github/workflows/docs-site--production.yml +++ b/.github/workflows/docs-site--production.yml @@ -11,8 +11,11 @@ on: jobs: deploy-docs-site-production: - runs-on: [taiko-runner] + runs-on: [arc-runner-set] steps: + - name: Install Git + run: sudo apt-get update && sudo apt-get install -y git + - name: Checkout repository uses: actions/checkout@v4 diff --git a/.github/workflows/eventindexer.yml b/.github/workflows/eventindexer.yml index 5f947171e48..a8ee1217846 100644 --- a/.github/workflows/eventindexer.yml +++ b/.github/workflows/eventindexer.yml @@ -6,19 +6,21 @@ on: paths: - "packages/eventindexer/**" pull_request: + types: [opened, synchronize, reopened, ready_for_review] paths: - "packages/eventindexer/**" - - "go.mod" - - "go.sum" + branches-ignore: + - release-please--branches--** jobs: lint-eventindexer: name: lint-eventindexer - runs-on: [taiko-runner] + if: ${{ github.event.pull_request.draft == false && !startsWith(github.head_ref, 'release-please' && !startsWith(github.head_ref, 'refs/heads/dependabot/')) }} + runs-on: [arc-runner-set] steps: - uses: actions/setup-go@v5 with: - go-version: 1.21.0 + go-version: 1.23.0 - uses: actions/checkout@v4 - name: golangci-lint uses: golangci/golangci-lint-action@v6 @@ -28,10 +30,11 @@ jobs: # Optional: working directory, useful for monorepos working-directory: ./packages/eventindexer - args: --config=.golangci.yml --timeout=4m + args: --config=.golangci.yml --timeout=10m test-eventindexer: - runs-on: [taiko-runner] + runs-on: [arc-runner-set] + if: ${{ github.event.pull_request.draft == false && !startsWith(github.head_ref, 'release-please' && !startsWith(github.head_ref, 'refs/heads/dependabot/')) }} needs: lint-eventindexer steps: - name: Cancel Previous Runs @@ -39,27 +42,34 @@ jobs: with: access_token: ${{ github.token }} + - name: Install Git + run: sudo apt-get update && sudo apt-get install -y git + - uses: actions/checkout@v4 - uses: actions/setup-go@v5 with: - go-version: ">=1.21.0" + go-version: ">=1.23.0" - name: eventindexer - Unit Tests working-directory: ./packages/eventindexer run: go test `go list ./... | grep -v ./contracts | grep -v ./mock | grep -v ./cmd` -coverprofile=coverage.txt -covermode=atomic - name: eventindexer - Upload coverage to Codecov - uses: codecov/codecov-action@v4 + uses: codecov/codecov-action@v5 with: files: ./packages/eventindexer/coverage.txt flags: eventindexer push-eventindexer-docker-image: - if: ${{ github.event_name == 'pull_request' }} + # Skip dependabot PRs + if: ${{ github.event_name == 'pull_request' && ! startsWith(github.head_ref, 'refs/heads/dependabot/') && !startsWith(github.head_ref, 'release-please') && github.event.pull_request.head.repo.fork == false }} name: Build and push docker image - runs-on: [taiko-runner] + runs-on: [arc-runner-set] steps: + - name: Install Git + run: sudo apt-get update && sudo apt-get install -y git + - name: Checkout uses: actions/checkout@v4 with: @@ -91,9 +101,8 @@ jobs: type=sha - name: Build and push - uses: docker/build-push-action@v5 + uses: docker/build-push-action@v6 with: - platforms: linux/amd64 push: true context: . tags: ${{ steps.meta.outputs.tags }} diff --git a/.github/workflows/fork-diff--preview.yml b/.github/workflows/fork-diff--preview.yml index 64f4d69bca4..a93f356e107 100644 --- a/.github/workflows/fork-diff--preview.yml +++ b/.github/workflows/fork-diff--preview.yml @@ -5,18 +5,21 @@ env: VERCEL_PROJECT_ID: ${{ secrets.VERCEL_PROJECT_ID_FORK_DIFF }} on: - workflow_dispatch: - push: - branches-ignore: - - main - - release-please-* + pull_request: + types: [opened, synchronize, reopened, ready_for_review] paths: - "packages/fork-diff/**" + branches-ignore: + - release-please--branches--** jobs: deploy-fork-diff-preview: - runs-on: [taiko-runner] + if: ${{ github.event.pull_request.draft == false && !startsWith(github.head_ref, 'release-please') && github.actor != 'dependabot[bot]' }} + runs-on: [arc-runner-set] steps: + - name: Install Git + run: sudo apt-get update && sudo apt-get install -y git + - name: Checkout repository uses: actions/checkout@v4 diff --git a/.github/workflows/fork-diff--production.yml b/.github/workflows/fork-diff--production.yml index fa9c9db3f1f..c8c7b7cbce2 100644 --- a/.github/workflows/fork-diff--production.yml +++ b/.github/workflows/fork-diff--production.yml @@ -12,8 +12,11 @@ on: jobs: deploy-fork-diff-production: - runs-on: [taiko-runner] + runs-on: [arc-runner-set] steps: + - name: Install Git + run: sudo apt-get update && sudo apt-get install -y git + - name: Checkout repository uses: actions/checkout@v4 diff --git a/.github/workflows/guardian-prover-health-check-ui.yml b/.github/workflows/guardian-prover-health-check-ui.yml index 52edcb02cb3..f95cd350ad4 100644 --- a/.github/workflows/guardian-prover-health-check-ui.yml +++ b/.github/workflows/guardian-prover-health-check-ui.yml @@ -7,26 +7,30 @@ on: pull_request: paths: - "packages/guardian-prover-health-check-ui/**" + branches-ignore: + - release-please--branches--** jobs: build-and-test: + if: ${{ github.event.pull_request.draft == false && !startsWith(github.head_ref, 'release-please') && github.actor != 'dependabot[bot]' }} uses: ./.github/workflows/guardian-prover-health-check-ui--ci.yml # Deployment name follow the pattern: deploy___ - deploy_guardians-ui_mainnet_preview: - if: ${{ github.ref_name != 'main' }} - needs: build-and-test - uses: ./.github/workflows/repo--vercel-deploy.yml - with: - environment: "preview" - flags: "" - secrets: - vercel_project_id: ${{ secrets.VERCEL_PROJECT_ID_GUARDIAN_UI_MAINNET }} - vercel_org_id: ${{ secrets.VERCEL_ORG_ID }} - vercel_token: ${{ secrets.VERCEL_TOKEN }} + + # deploy_guardians-ui_devnet_preview: + # if: ${{ github.event.pull_request.draft == false && !startsWith(github.head_ref, 'release-please') }} + # needs: build-and-test + # uses: ./.github/workflows/repo--vercel-deploy.yml + # with: + # environment: "preview" + # flags: "" + # secrets: + # vercel_project_id: ${{ secrets.VERCEL_PROJECT_ID_GUARDIAN_UI_INTERNAL }} + # vercel_org_id: ${{ secrets.VERCEL_ORG_ID }} + # vercel_token: ${{ secrets.VERCEL_TOKEN }} deploy_guardians-ui_hekla_preview: - if: ${{ github.ref_name != 'main' }} + if: ${{ github.event.pull_request.draft == false && !startsWith(github.head_ref, 'release-please') && github.actor != 'dependabot[bot]' }} needs: build-and-test uses: ./.github/workflows/repo--vercel-deploy.yml with: @@ -37,15 +41,15 @@ jobs: vercel_org_id: ${{ secrets.VERCEL_ORG_ID }} vercel_token: ${{ secrets.VERCEL_TOKEN }} - deploy_guardians-ui_devnet_preview: - if: ${{ github.ref_name != 'main' }} + deploy_guardians-ui_mainnet_preview: + if: ${{ github.event.pull_request.draft == false && !startsWith(github.head_ref, 'release-please') && github.actor != 'dependabot[bot]' }} needs: build-and-test uses: ./.github/workflows/repo--vercel-deploy.yml with: environment: "preview" flags: "" secrets: - vercel_project_id: ${{ secrets.VERCEL_PROJECT_ID_GUARDIAN_UI_INTERNAL }} + vercel_project_id: ${{ secrets.VERCEL_PROJECT_ID_GUARDIAN_UI_MAINNET }} vercel_org_id: ${{ secrets.VERCEL_ORG_ID }} vercel_token: ${{ secrets.VERCEL_TOKEN }} diff --git a/.github/workflows/guardian-prover-health-check.yml b/.github/workflows/guardian-prover-health-check.yml index 6bbe33e603a..74277283274 100644 --- a/.github/workflows/guardian-prover-health-check.yml +++ b/.github/workflows/guardian-prover-health-check.yml @@ -8,17 +8,18 @@ on: pull_request: paths: - "packages/guardian-prover-health-check/**" - - "go.mod" - - "go.sum" + branches-ignore: + - release-please--branches--** jobs: lint-guardian-prover-health-check: + if: ${{ github.event.pull_request.draft == false && !startsWith(github.head_ref, 'release-please') && github.actor != 'dependabot[bot]' }} name: lint-guardian-prover-health-check runs-on: [taiko-runner] steps: - uses: actions/setup-go@v5 with: - go-version: 1.21.0 + go-version: 1.23.0 - uses: actions/checkout@v4 - name: golangci-lint uses: golangci/golangci-lint-action@v6 @@ -31,6 +32,7 @@ jobs: args: --config=.golangci.yml --timeout=4m test-guardian-prover-health-check: + if: ${{ github.event.pull_request.draft == false && !startsWith(github.head_ref, 'release-please') && github.actor != 'dependabot[bot]' }} runs-on: [taiko-runner] needs: lint-guardian-prover-health-check steps: @@ -42,20 +44,21 @@ jobs: - uses: actions/checkout@v4 - uses: actions/setup-go@v5 with: - go-version: "1.21.0" + go-version: "1.23.0" - name: guardian-prover-health-check - Unit Tests working-directory: ./packages/guardian-prover-health-check run: go test `go list ./... | grep -v ./contracts | grep -v ./mock | grep -v ./cmd` -coverprofile=coverage.txt -covermode=atomic - name: guardian-prover-health-check - Upload coverage to Codecov - uses: codecov/codecov-action@v4 + uses: codecov/codecov-action@v5 with: files: ./packages/guardian-prover-health-check/coverage.txt flags: guardian-prover-health-check push-guardian-prover-health-check-docker-image: - if: ${{ github.event_name == 'pull_request' }} + # Skip dependabot PRs + if: ${{ github.event.pull_request.draft == false && !startsWith(github.head_ref, 'release-please') && github.actor != 'dependabot[bot]' && github.event.pull_request.head.repo.fork == false }} name: Build and push docker image runs-on: [taiko-runner] @@ -91,9 +94,8 @@ jobs: type=sha - name: Build and push - uses: docker/build-push-action@v5 + uses: docker/build-push-action@v6 with: - platforms: linux/amd64 push: true context: . tags: ${{ steps.meta.outputs.tags }} diff --git a/.github/workflows/monitors.yml b/.github/workflows/monitors.yml new file mode 100644 index 00000000000..c7fadee635d --- /dev/null +++ b/.github/workflows/monitors.yml @@ -0,0 +1,40 @@ +name: Monitors + +on: + pull_request: + types: [opened, synchronize, reopened, ready_for_review] + paths: + - "packages/monitors/**" + - "!packages/monitors/**/*.md" + branches-ignore: + - release-please--branches--** + +jobs: + deploy-protocol-monitors: + if: ${{ github.event.pull_request.draft == false && !startsWith(github.head_ref, 'release-please') && github.actor != 'dependabot[bot]' }} + runs-on: [taiko-runner] + permissions: + # Give the necessary permissions for stefanzweifel/git-auto-commit-action. + contents: write + steps: + - name: Cancel previous runs + uses: styfle/cancel-workflow-action@0.12.1 + with: + access_token: ${{ github.token }} + + - name: Checkout repository + uses: actions/checkout@v4 + with: + submodules: recursive + + - name: Install pnpm dependencies + uses: ./.github/actions/install-pnpm-dependencies + + - name: Deploy Monitors on OZ Defender + working-directory: packages/monitors/defender/mainnet + env: + DEFENDER_API_KEY: ${{ secrets.DEFENDER_API_KEY }} + DEFENDER_API_SECRET: ${{ secrets.DEFENDER_API_SECRET }} + SERVERLESS_ACCESS_KEY: ${{ secrets.SERVERLESS_ACCESS_KEY }} + run: | + npx serverless deploy diff --git a/.github/workflows/nfts.yml b/.github/workflows/nfts.yml index 1ee342819fa..269caac6802 100644 --- a/.github/workflows/nfts.yml +++ b/.github/workflows/nfts.yml @@ -1,23 +1,27 @@ name: NFTs on: - push: - branches: [main] - paths: - - "packages/nfts/**" pull_request: + types: [opened, synchronize, reopened, ready_for_review] paths: - "packages/nfts/**" + - "!packages/nfts/contract_layout_*" + branches-ignore: + - release-please--branches--** jobs: build-nfts-contracts: - runs-on: [taiko-runner] + if: ${{ github.event.pull_request.draft == false && !startsWith(github.head_ref, 'release-please') }} + runs-on: [arc-runner-set] steps: - name: Cancel previous runs uses: styfle/cancel-workflow-action@0.12.1 with: access_token: ${{ github.token }} + - name: Install Git + run: sudo apt-get update && sudo apt-get install -y git + - name: Checkout repository uses: actions/checkout@v4 with: @@ -29,9 +33,9 @@ jobs: - name: Install pnpm dependencies uses: ./.github/actions/install-pnpm-dependencies - - name: Check formatting + - name: Format solidity && update contract layout table working-directory: ./packages/nfts - run: forge fmt --check + run: pnpm layout && forge fmt - name: Solidity compilation working-directory: ./packages/nfts diff --git a/.github/workflows/protocol.yml b/.github/workflows/protocol.yml index c27a94d479e..852364b0779 100644 --- a/.github/workflows/protocol.yml +++ b/.github/workflows/protocol.yml @@ -1,17 +1,22 @@ name: Protocol on: - push: - branches: [main] - paths: - - "packages/protocol/**" pull_request: + types: [opened, synchronize, reopened, ready_for_review] paths: - "packages/protocol/**" + - "!packages/protocol/contract_layout_*" + - "!packages/protocol/audit/**" + - "!packages/protocol/docs/**" + - "!packages/protocol/simulation/**" + - "!packages/protocol/deployments/**" + branches-ignore: + - release-please--branches--** jobs: build-protocol: - runs-on: [taiko-runner] + if: ${{ github.event.pull_request.draft == false && !startsWith(github.head_ref, 'release-please') && github.actor != 'dependabot[bot]' }} + runs-on: [arc-runner-set] permissions: # Give the necessary permissions for stefanzweifel/git-auto-commit-action. contents: write @@ -21,6 +26,10 @@ jobs: with: access_token: ${{ github.token }} + - name: Prepare environment + continue-on-error: true + run: sudo apt-get update && sudo apt-get install -y git wget + - name: Checkout repository uses: actions/checkout@v4 with: @@ -32,32 +41,60 @@ jobs: - name: Install pnpm dependencies uses: ./.github/actions/install-pnpm-dependencies - - name: Unit tests + - name: Clean up and fmt working-directory: ./packages/protocol - run: pnpm clean && pnpm test + run: pnpm clean && forge fmt - - name: Format solidity && update contract layout table + - name: L2-Unit tests working-directory: ./packages/protocol - run: pnpm layout && forge fmt + run: pnpm compile:l2 && pnpm test:l2 && pnpm layout:l2 + + - name: L1-Unit tests + working-directory: ./packages/protocol + run: pnpm compile:l1 && pnpm test:l1 && pnpm layout:l1 - name: Commit contract layout table uses: stefanzweifel/git-auto-commit-action@v5 with: - commit_message: "forge fmt & update contract layout table" - - - name: Generate genesis - working-directory: ./packages/protocol - run: pnpm test:genesis - - - name: Run snapshot (Foundry) - working-directory: ./packages/protocol - run: pnpm snapshot + commit_message: "forge fmt & update contract layout tables" - - name: Deploy L1 contracts + - name: L1-Deploy contracts working-directory: ./packages/protocol + timeout-minutes: 2 run: | anvil --hardfork cancun & - while ! nc -z localhost 8545; do + until cast chain-id --rpc-url "http://localhost:8545" 2> /dev/null; do sleep 1 done - pnpm test:deploy + pnpm test:deploy:l1 + + genesis-docker: + if: ${{ github.event.pull_request.draft == false && !startsWith(github.head_ref, 'release-please') && github.actor != 'dependabot[bot]' }} + runs-on: [taiko-runner] + permissions: + # Give the necessary permissions for stefanzweifel/git-auto-commit-action. + contents: write + steps: + - name: Cancel previous runs + uses: styfle/cancel-workflow-action@0.12.1 + with: + access_token: ${{ github.token }} + + - name: Checkout repository + uses: actions/checkout@v4 + with: + submodules: recursive + + - name: Install Foundry + uses: foundry-rs/foundry-toolchain@v1.2.0 + + - name: Install pnpm dependencies + uses: ./.github/actions/install-pnpm-dependencies + + - name: Compile + working-directory: ./packages/protocol + run: pnpm clean && pnpm compile + + - name: L2-Generate Genesis (using docker) + working-directory: ./packages/protocol + run: pnpm genesis:test diff --git a/.github/workflows/relayer.yml b/.github/workflows/relayer.yml index e8f334219f9..1c84fd58801 100644 --- a/.github/workflows/relayer.yml +++ b/.github/workflows/relayer.yml @@ -6,19 +6,21 @@ on: paths: - "packages/relayer/**" pull_request: + types: [opened, synchronize, reopened, ready_for_review] paths: - "packages/relayer/**" - - "go.mod" - - "go.sum" + branches-ignore: + - release-please--branches--** jobs: lint-relayer: name: lint-relayer - runs-on: [taiko-runner] + if: ${{ github.event.pull_request.draft == false && !startsWith(github.head_ref, 'release-please') && !startsWith(github.head_ref, 'refs/heads/dependabot/')}} + runs-on: [arc-runner-set] steps: - uses: actions/setup-go@v5 with: - go-version: 1.21.0 + go-version: 1.23.0 - uses: actions/checkout@v4 - name: golangci-lint uses: golangci/golangci-lint-action@v6 @@ -31,7 +33,8 @@ jobs: args: --config=.golangci.yml --timeout=4m test-relayer: - runs-on: [taiko-runner] + if: ${{ github.event.pull_request.draft == false && !startsWith(github.head_ref, 'release-please') && !startsWith(github.head_ref, 'refs/heads/dependabot/') }} + runs-on: [arc-runner-set] needs: lint-relayer steps: - name: Cancel Previous Runs @@ -39,27 +42,34 @@ jobs: with: access_token: ${{ github.token }} + - name: Install Git + run: sudo apt-get update && sudo apt-get install -y git + - uses: actions/checkout@v4 - uses: actions/setup-go@v5 with: - go-version: "1.21.0" + go-version: "1.23.0" - name: relayer - Unit Tests working-directory: ./packages/relayer run: go test `go list ./... | grep -v ./contracts | grep -v ./mock | grep -v ./cmd` -coverprofile=coverage.txt -covermode=atomic - name: relayer - Upload coverage to Codecov - uses: codecov/codecov-action@v4 + uses: codecov/codecov-action@v5 with: files: ./packages/relayer/coverage.txt flags: relayer push-relayer-docker-image: - if: ${{ github.event_name == 'pull_request' }} + # Skip dependabot PRs + if: ${{ github.event.pull_request.draft == false && !startsWith(github.head_ref, 'release-please') && !startsWith(github.head_ref, 'refs/heads/dependabot/') && github.event.pull_request.head.repo.fork == false }} name: Build and push docker image - runs-on: [taiko-runner] + runs-on: [arc-runner-set] steps: + - name: Install Git + run: sudo apt-get update && sudo apt-get install -y git + - name: Checkout uses: actions/checkout@v4 with: @@ -91,9 +101,8 @@ jobs: type=sha - name: Build and push - uses: docker/build-push-action@v5 + uses: docker/build-push-action@v6 with: - platforms: linux/amd64 push: true context: . tags: ${{ steps.meta.outputs.tags }} diff --git a/.github/workflows/repo--auto-approve-pr.yml b/.github/workflows/repo--auto-approve-pr.yml index eb73dc2ad40..7fc2d401c33 100644 --- a/.github/workflows/repo--auto-approve-pr.yml +++ b/.github/workflows/repo--auto-approve-pr.yml @@ -1,12 +1,16 @@ name: Auto Approve PR -on: pull_request_target +on: + pull_request: + types: [opened, synchronize, reopened, ready_for_review] + branches-ignore: + - release-please--branches--** jobs: auto-approve: - runs-on: ubuntu-latest + if: github.event.pull_request.draft == false && github.actor == 'dependabot[bot]' + runs-on: [arc-runner-set] permissions: pull-requests: write - if: github.actor == 'dependabot[bot]' steps: - uses: hmarr/auto-approve-action@v4 diff --git a/.github/workflows/repo--check-links.yml b/.github/workflows/repo--check-links.yml new file mode 100644 index 00000000000..44be99f6d9a --- /dev/null +++ b/.github/workflows/repo--check-links.yml @@ -0,0 +1,20 @@ +name: Check links + +on: + push: + paths: + - "**/README.md" + - docs/** + +jobs: + check-links: + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Check links + uses: lycheeverse/lychee-action@v2 + with: + args: --no-progress --verbose "**/README.md" diff --git a/.github/workflows/repo--close-inactive-issues.yml b/.github/workflows/repo--close-inactive-issues.yml deleted file mode 100644 index 7775bdf73ec..00000000000 --- a/.github/workflows/repo--close-inactive-issues.yml +++ /dev/null @@ -1,23 +0,0 @@ -name: Close Inactive Issues - -on: - schedule: - - cron: "30 1 * * *" - -jobs: - close-issues: - runs-on: ubuntu-latest - permissions: - issues: write - pull-requests: write - steps: - - uses: actions/stale@v9 - with: - days-before-issue-stale: 30 - days-before-issue-close: 7 - stale-issue-label: "stale" - stale-issue-message: "This issue is stale because it has been open for 30 days with no activity." - close-issue-message: "This issue was closed because it has been inactive for a week since being marked as stale." - days-before-pr-stale: -1 - days-before-pr-close: -1 - repo-token: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/repo--do-not-merge-pr.yml b/.github/workflows/repo--do-not-merge-pr.yml new file mode 100644 index 00000000000..b3e8484c8d6 --- /dev/null +++ b/.github/workflows/repo--do-not-merge-pr.yml @@ -0,0 +1,20 @@ +name: Check for "option.do-not-merge" Label + +on: + pull_request: + types: [labeled, unlabeled, synchronize, opened, reopened] + +jobs: + check_label: + if: github.event.pull_request.draft == false + runs-on: [arc-runner-set] + steps: + - name: Check for "option.do-not-merge" label + id: check_label + uses: actions/github-script@v7 + with: + script: | + const labels = context.payload.pull_request.labels.map(label => label.name); + if (labels.includes("option.do-not-merge")) { + core.setFailed('The "option.do-not-merge" label is present. PR cannot be merged.'); + } diff --git a/.github/workflows/repo--merge-gatekeeper.yml b/.github/workflows/repo--merge-gatekeeper.yml new file mode 100644 index 00000000000..795a81aa7cf --- /dev/null +++ b/.github/workflows/repo--merge-gatekeeper.yml @@ -0,0 +1,21 @@ +name: Merge Gatekeeper + +on: + pull_request: + branches: + - main + merge_group: # Trigger in merge queue to pass the required status check + +jobs: + merge-gatekeeper: + if: ${{ github.event_name == 'pull_request' && github.event.pull_request.draft == false }} + runs-on: [arc-runner-set] + permissions: + checks: read + statuses: read + steps: + - name: Run Merge Gatekeeper + uses: upsidr/merge-gatekeeper@v1 + with: + timeout: 1200 + token: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/repo--release-please.yml b/.github/workflows/repo--release-please.yml index 10a4bb7af6b..99559795b17 100644 --- a/.github/workflows/repo--release-please.yml +++ b/.github/workflows/repo--release-please.yml @@ -11,8 +11,8 @@ permissions: jobs: release-please: - runs-on: [taiko-runner] + runs-on: [arc-runner-set] steps: - - uses: google-github-actions/release-please-action@v4 + - uses: googleapis/release-please-action@v4 with: token: ${{ secrets.RELEASE_PLEASE_TOKEN }} diff --git a/.github/workflows/repo--typo-check.yml b/.github/workflows/repo--typo-check.yml index 415c8be1e64..503638d100f 100644 --- a/.github/workflows/repo--typo-check.yml +++ b/.github/workflows/repo--typo-check.yml @@ -4,12 +4,17 @@ on: [pull_request] jobs: check-for-typos: - runs-on: [taiko-runner] + if: ${{ contains(github.event.pull_request.labels.*.name, 'option.workflow_on') || github.event.pull_request.draft == false && github.head_ref != 'release-please-*' && github.actor != 'dependabot[bot]' }} + runs-on: [arc-runner-set] + steps: - name: Checkout the repository uses: actions/checkout@v4 + - name: Install wget + run: sudo apt-get update && sudo apt-get install -y wget + - name: Check for typos uses: crate-ci/typos@master with: - config: ${{github.workspace}}/.github/_typos.toml + config: ${{github.workspace}}/_typos.toml diff --git a/.github/workflows/repo--validate-pr-title.yml b/.github/workflows/repo--validate-pr-title.yml index 7112ecbb60e..87ff98d7cfb 100644 --- a/.github/workflows/repo--validate-pr-title.yml +++ b/.github/workflows/repo--validate-pr-title.yml @@ -5,16 +5,13 @@ on: types: - opened - edited - - synchronize - push: - branches: - - release-please-* # Trigger for release-please PRs, but skip the job - merge_group: # Trigger in the merge queue, but skip the job + +if: false # skipping for preconf-taiko-mono jobs: validate-pr-title: - if: github.event_name == 'pull_request_target' - runs-on: [taiko-runner] + if: contains(github.event.pull_request.labels.*.name, 'option.workflow_on') || github.event.pull_request.draft == false && github.head_ref != 'release-please-*' + runs-on: [arc-runner-set] steps: - uses: amannn/action-semantic-pull-request@v5 env: diff --git a/.github/workflows/repo--vercel-deploy.yml b/.github/workflows/repo--vercel-deploy.yml index 1c5ad381386..ff61914bdfc 100644 --- a/.github/workflows/repo--vercel-deploy.yml +++ b/.github/workflows/repo--vercel-deploy.yml @@ -26,8 +26,16 @@ env: jobs: build-deploy: - runs-on: [taiko-runner] + if: ${{ github.actor != 'dependabot' && github.event.pull_request.head.repo.fork == false }} + runs-on: [arc-runner-set] steps: + - name: Print Vercel Project ID + run: | + echo "Vercel Project ID: ${{ env.VERCEL_PROJECT_ID }}" + + - name: Install Git + run: sudo apt-get update && sudo apt-get install -y git + - name: Checkout repository uses: actions/checkout@v4 diff --git a/.github/workflows/snaefell-ui--ci.yml b/.github/workflows/snaefell-ui--ci.yml index 59eb8b0481a..0ac40398279 100644 --- a/.github/workflows/snaefell-ui--ci.yml +++ b/.github/workflows/snaefell-ui--ci.yml @@ -4,13 +4,16 @@ on: workflow_call jobs: build: - runs-on: [taiko-runner] + runs-on: [arc-runner-set] steps: - name: Cancel previous runs uses: styfle/cancel-workflow-action@0.12.1 with: access_token: ${{ github.token }} + - name: Install Git + run: sudo apt-get update && sudo apt-get install -y git + - name: Checkout repository uses: actions/checkout@v4 with: diff --git a/.github/workflows/snaefell-ui.yml b/.github/workflows/snaefell-ui.yml index 43d378d8dae..7a0971ca25c 100644 --- a/.github/workflows/snaefell-ui.yml +++ b/.github/workflows/snaefell-ui.yml @@ -1,20 +1,17 @@ name: Snaefell UI CI/CD on: - push: - tags: - - "snaefull-ui-v*" - pull_request: - paths: - - "packages/snaefell-ui/**" + workflow_dispatch: jobs: build-and-test: + if: ${{ github.actor != 'dependabot[bot]' }} uses: ./.github/workflows/snaefell-ui--ci.yml # Deployment name follow the pattern: deploy___ + # The following Vercel project is not found, so disable it at least for now. deploy_snaefell-ui_mainnet_preview: - if: ${{ github.ref_name != 'main' }} + if: ${{ github.actor != 'dependabot[bot]' }} needs: build-and-test uses: ./.github/workflows/repo--vercel-deploy.yml with: @@ -26,7 +23,7 @@ jobs: vercel_token: ${{ secrets.VERCEL_TOKEN }} deploy_snaefell-ui_mainnet_production: - if: ${{ startsWith(github.ref, 'refs/tags/snaefull-ui-v') }} + if: ${{ github.actor != 'dependabot[bot]' }} needs: build-and-test uses: ./.github/workflows/repo--vercel-deploy.yml with: diff --git a/.github/workflows/supplementary-contracts.yml b/.github/workflows/supplementary-contracts.yml index 5f144d0c9e7..1fb4203d178 100644 --- a/.github/workflows/supplementary-contracts.yml +++ b/.github/workflows/supplementary-contracts.yml @@ -1,23 +1,26 @@ name: Supplementary Contracts on: - push: - branches: [main] - paths: - - "packages/supplementary-contracts/**" pull_request: + types: [opened, synchronize, reopened, ready_for_review] paths: - "packages/supplementary-contracts/**" + branches-ignore: + - release-please--branches--** jobs: build-supplementary-contracts: - runs-on: [taiko-runner] + if: ${{ github.event.pull_request.draft == false && !startsWith(github.head_ref, 'release-please') }} + runs-on: [arc-runner-set] steps: - name: Cancel previous runs uses: styfle/cancel-workflow-action@0.12.1 with: access_token: ${{ github.token }} + - name: Install Git + run: sudo apt-get update && sudo apt-get install -y git + - name: Checkout repository uses: actions/checkout@v4 with: diff --git a/.github/workflows/taiko-client--docker.yml b/.github/workflows/taiko-client--docker.yml index 8159d5a3340..da509987b15 100644 --- a/.github/workflows/taiko-client--docker.yml +++ b/.github/workflows/taiko-client--docker.yml @@ -1,73 +1,131 @@ -name: "Push docker image to GAR" +name: "Build and Push Multi-Arch Docker Image" on: push: - branches: [main] + branches: [main, preconf-driver-apis] tags: - - "taiko-client-v*" + - "taiko-alethia-client-v*" paths: - "packages/taiko-client/**" +env: + REGISTRY_IMAGE: us-docker.pkg.dev/evmchain/images/taiko-client + jobs: - push-docker-image: + build: name: Build and push docker image - runs-on: ubuntu-latest + strategy: + matrix: + include: + - runner: arc-runner-set + platform: linux/amd64 + - runner: arc-runner-set-arm64 + platform: linux/arm64 + + runs-on: ${{ matrix.runner }} steps: + - name: Prepare Environment + run: | + platform=${{ matrix.platform }} + echo "PLATFORM_PAIR=${platform//\//-}" >> $GITHUB_ENV + sudo apt-get update && sudo apt-get install -y git + - name: Checkout uses: actions/checkout@v4 - name: Login to GAR - uses: docker/login-action@v2 + uses: docker/login-action@v3 with: registry: us-docker.pkg.dev username: _json_key password: ${{ secrets.GAR_JSON_KEY }} - name: Set up QEMU - uses: docker/setup-qemu-action@v1 + uses: docker/setup-qemu-action@v3 - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v1 + uses: docker/setup-buildx-action@v3 - name: Docker meta id: meta - uses: docker/metadata-action@v4 + uses: docker/metadata-action@v5 with: - images: | - us-docker.pkg.dev/evmchain/images/taiko-client + images: ${{ env.REGISTRY_IMAGE }} tags: | type=ref,event=branch type=ref,event=pr type=ref,event=tag type=sha - - name: Cache Go build - uses: actions/cache@v4 - with: - path: | - ${{ runner.os }}-go_build-platforms - key: ${{ runner.os }}-go_build-platforms - restore-keys: | - ${{ runner.os }}-go_build-platforms - - - name: Inject cache into docker - uses: reproducible-containers/buildkit-cache-dance@v3.1.0 - with: - cache-map: | - { - "${{ runner.os }}-go_build-platforms": "/root/.cache/go-build" - } - skip-extraction: ${{ steps.cache.outputs.cache-hit }} - - - name: Build and push - uses: docker/build-push-action@v2 + - name: Build and push by digest + id: build + uses: docker/build-push-action@v6 with: context: . - cache-from: type=gha - cache-to: type=gha,mode=max file: packages/taiko-client/Dockerfile - platforms: linux/amd64,linux/arm64 + platforms: ${{ matrix.platform }} push: true - tags: ${{ steps.meta.outputs.tags }} + tags: ${{ env.REGISTRY_IMAGE }} labels: ${{ steps.meta.outputs.labels }} + outputs: type=image,name=${{ env.REGISTRY_IMAGE }},push-by-digest=true,name-canonical=true,push=true + + - name: Export digest + run: | + mkdir -p /tmp/digests + digest="${{ steps.build.outputs.digest }}" + touch "/tmp/digests/${digest#sha256:}" + + - name: Upload digest + uses: actions/upload-artifact@v4 + with: + name: digests-${{ env.PLATFORM_PAIR }} + path: /tmp/digests/* + if-no-files-found: error + retention-days: 1 + + merge: + runs-on: arc-runner-set + needs: + - build + steps: + - name: Prepare Environment + run: sudo apt-get update && sudo apt-get install -y jq + + - name: Download digests + uses: actions/download-artifact@v4 + with: + path: /tmp/digests + pattern: digests-* + merge-multiple: true + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Docker meta + id: meta + uses: docker/metadata-action@v5 + with: + images: ${{ env.REGISTRY_IMAGE }} + tags: | + type=ref,event=branch + type=ref,event=pr + type=ref,event=tag + type=sha + + - name: Login to GAR + uses: docker/login-action@v3 + with: + registry: us-docker.pkg.dev + username: _json_key + password: ${{ secrets.GAR_JSON_KEY }} + + - name: Create manifest list and push + working-directory: /tmp/digests + run: | + docker buildx imagetools create $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \ + $(printf '${{ env.REGISTRY_IMAGE }}@sha256:%s ' *) + + - name: Inspect image + run: | + docker buildx imagetools inspect ${{ env.REGISTRY_IMAGE }}:${{ steps.meta.outputs.version }} diff --git a/.github/workflows/taiko-client--hive-test.yml b/.github/workflows/taiko-client--hive-test.yml new file mode 100644 index 00000000000..0a488e9f1cc --- /dev/null +++ b/.github/workflows/taiko-client--hive-test.yml @@ -0,0 +1,44 @@ +name: "Taiko Client Hive Tests" + +on: + pull_request: + types: [opened, synchronize, reopened, ready_for_review] + paths: + - "packages/taiko-client/**" + - "go.mod" + - "go.sum" + branches-ignore: + - release-please--branches--** + +jobs: + hive_tests: + if: ${{ github.event.pull_request.draft == false && contains(github.event.pull_request.labels.*.name, 'option.hive-test') }} + name: hive tests + runs-on: [arc-runner-set] + timeout-minutes: 40 + + steps: + - name: Cancel Previous Runs + uses: styfle/cancel-workflow-action@0.12.1 + with: + access_token: ${{ github.token }} + + - name: Install Git + run: sudo apt-get update && sudo apt-get install -y git + + - uses: actions/checkout@v4 + + - name: Set up Go + uses: actions/setup-go@v5 + with: + go-version: 1.23 + cache: true + + - name: Clone taikoxyz/hive + run: git clone https://github.com/taikoxyz/hive.git /tmp/hive + + - name: Hive tests + working-directory: packages/taiko-client + run: | + export HIVE_DIR=/tmp/hive + go test -v -p=1 ./integration_test -timeout=2400s diff --git a/.github/workflows/taiko-client--pages.yml b/.github/workflows/taiko-client--pages.yml new file mode 100644 index 00000000000..6a829504df9 --- /dev/null +++ b/.github/workflows/taiko-client--pages.yml @@ -0,0 +1,63 @@ +name: "Taiko Client Github Pages" + +on: + push: + branches: [main] + paths: + - "packages/taiko-client/**" + +jobs: + swagger-gen: + runs-on: [arc-runner-set] + steps: + - name: Checkout code + uses: actions/checkout@v4 + with: + fetch-depth: 0 + ref: main + + - name: Set up Go + uses: actions/setup-go@v4 + with: + go-version: "1.23" + + - name: Install swaggo + run: | + export CGO_ENABLED=0 + go install github.com/swaggo/swag/cmd/swag@latest + + - name: Generate Swagger documentation + run: | + export CGO_ENABLED=0 + cd packages/taiko-client + ./scripts/gen_swagger_json.sh + + - name: Commit Swagger docs + run: | + git config --global user.name "github-actions[bot]" + git config --global user.email "github-actions[bot]@users.noreply.github.com" + if ! git diff --quiet; then + git add -u + git commit -m "Update Swagger documentation" + git push origin HEAD:${{ github.ref_name }} + else + echo "No changes to commit" + fi + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + deploy: + runs-on: [arc-runner-set] + needs: swagger-gen + permissions: + contents: write + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Deploy to GitHub Pages + uses: peaceiris/actions-gh-pages@v4 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + publish_dir: packages/taiko-client/docs # Set this to where your `index.html` is located + publish_branch: gh-pages + destination_dir: soft-block-apis diff --git a/.github/workflows/taiko-client--test.yml b/.github/workflows/taiko-client--test.yml index 44664f18a40..ce1fc48cfbc 100644 --- a/.github/workflows/taiko-client--test.yml +++ b/.github/workflows/taiko-client--test.yml @@ -1,40 +1,50 @@ name: "CI" on: - push: - branches: [main] - paths: - - "packages/taiko-client/**" pull_request: + types: [opened, synchronize, reopened, ready_for_review] paths: - "packages/taiko-client/**" - "go.mod" - "go.sum" + - "!**/*.md" + branches-ignore: + - release-please--branches--** jobs: lint: + if: ${{ github.event.pull_request.draft == false && !startsWith(github.head_ref, 'release-please') && github.actor != 'dependabot[bot]' }} name: Lint - runs-on: ubuntu-latest + runs-on: [ubuntu-latest] steps: - uses: actions/checkout@v4 - name: Set up Go - uses: actions/setup-go@v4 + uses: actions/setup-go@v5 with: - go-version: 1.21 + go-version: 1.23 cache: true + - name: Install golangci-lint + run: go install -v github.com/golangci/golangci-lint/cmd/golangci-lint@v1.60.0 + - name: Lint working-directory: packages/taiko-client - run: make lint + run: golangci-lint run --path-prefix=./ --config=.golangci.yml integration_tests: + if: ${{ github.event.pull_request.draft == false && !startsWith(github.head_ref, 'release-please') }} name: Integration tests - runs-on: ubuntu-latest + runs-on: [ubuntu-latest] + timeout-minutes: 15 + + strategy: + matrix: + execution_node: [l2_geth] steps: - name: Cancel Previous Runs - uses: styfle/cancel-workflow-action@0.11.0 + uses: styfle/cancel-workflow-action@0.12.1 with: access_token: ${{ github.token }} @@ -44,19 +54,21 @@ jobs: uses: foundry-rs/foundry-toolchain@v1 - name: Set up Go - uses: actions/setup-go@v3 + uses: actions/setup-go@v5 with: - go-version: 1.21 + go-version: 1.23 cache: true - name: Install pnpm dependencies uses: ./.github/actions/install-pnpm-dependencies - - name: Test + - name: Run Tests on ${{ matrix.execution_node }} execution engine working-directory: packages/taiko-client + env: + L2_NODE: ${{ matrix.execution_node }} run: make test - name: Codecov.io - uses: codecov/codecov-action@v3 + uses: codecov/codecov-action@v5 with: files: packages/taiko-client/coverage.out diff --git a/.github/workflows/taikoon-ui--ci.yml b/.github/workflows/taikoon-ui--ci.yml index 8aecc97c8bd..7088ceb84f7 100644 --- a/.github/workflows/taikoon-ui--ci.yml +++ b/.github/workflows/taikoon-ui--ci.yml @@ -4,13 +4,16 @@ on: workflow_call jobs: build: - runs-on: [taiko-runner] + runs-on: [arc-runner-set] steps: - name: Cancel previous runs uses: styfle/cancel-workflow-action@0.12.1 with: access_token: ${{ github.token }} + - name: Install Git + run: sudo apt-get update && sudo apt-get install -y git + - name: Checkout repository uses: actions/checkout@v4 with: diff --git a/.github/workflows/taikoon-ui.yml b/.github/workflows/taikoon-ui.yml index c62bccee488..68dcd504654 100644 --- a/.github/workflows/taikoon-ui.yml +++ b/.github/workflows/taikoon-ui.yml @@ -1,12 +1,6 @@ name: Taikoon UI CI/CD - on: - push: - tags: - - "taikoon-ui-v*" - pull_request: - paths: - - "packages/taikoon-ui/**" + workflow_dispatch: jobs: build-and-test: @@ -14,7 +8,6 @@ jobs: # Deployment name follow the pattern: deploy___ deploy_taikoon-ui_mainnet_preview: - if: ${{ github.ref_name != 'main' }} needs: build-and-test uses: ./.github/workflows/repo--vercel-deploy.yml with: @@ -26,7 +19,6 @@ jobs: vercel_token: ${{ secrets.VERCEL_TOKEN }} deploy_taikoon-ui_mainnet_production: - if: ${{ startsWith(github.ref, 'refs/tags/taikoon-ui-v') }} needs: build-and-test uses: ./.github/workflows/repo--vercel-deploy.yml with: diff --git a/.github/workflows/ui-lib--ci.yml b/.github/workflows/ui-lib--ci.yml index 46160239765..9dc97e4b1c2 100644 --- a/.github/workflows/ui-lib--ci.yml +++ b/.github/workflows/ui-lib--ci.yml @@ -4,13 +4,16 @@ on: workflow_call jobs: build: - runs-on: [taiko-runner] + runs-on: [arc-runner-set] steps: - name: Cancel previous runs uses: styfle/cancel-workflow-action@0.12.1 with: access_token: ${{ github.token }} + - name: Install Git + run: sudo apt-get update && sudo apt-get install -y git + - name: Checkout repository uses: actions/checkout@v4 with: diff --git a/.gitignore b/.gitignore index 86e934589eb..0d0cf5a22b0 100644 --- a/.gitignore +++ b/.gitignore @@ -116,7 +116,6 @@ __pycache__/ # VSCode .vscode/launch.json -packages/protocol/config.js .vercel # Idea diff --git a/.release-please-manifest.json b/.release-please-manifest.json index d66f6fee1f1..f9eeba087e8 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,17 +1,15 @@ { - "packages/branding": "0.4.0", - "packages/bridge-ui": "2.11.0", - "packages/docs-site": "1.9.0", + "packages/bridge-ui": "2.13.0", + "packages/docs-site": "1.21.2", "packages/eventindexer": "0.13.0", - "packages/fork-diff": "0.6.0", + "packages/fork-diff": "0.6.1", "packages/guardian-prover-health-check": "0.1.0", - "packages/guardian-prover-health-check-ui": "0.1.0", - "packages/protocol": "1.6.0", + "packages/guardian-prover-health-check-ui": "0.2.0", + "packages/protocol": "1.11.0", "packages/relayer": "0.12.0", - "packages/taiko-client": "0.25.0", - "packages/nfts": "1.0.0", + "packages/snaefell-ui": "1.1.0", "packages/supplementary-contracts": "1.0.0", - "packages/taikoon-ui": "1.0.0", - "packages/ui-lib": "1.0.0", - "packages/snaefell-ui": "1.0.0" + "packages/taiko-client": "0.42.1", + "packages/taikoon-ui": "1.3.0", + "packages/ui-lib": "1.0.0" } diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 5c6e590f4db..a31271e28fb 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -26,7 +26,7 @@ This section describes our coding standards at Taiko. **It is important you use the correct commit type**. For minor semver bumps, use `feat`, for patches use `fix`. For a major bump use `feat(scope)!` or `fix(scope)!`. If you use `chore`, `docs`, or `ci`, then it won't result in a release-please PR or version bump. -Specify the scope of your change with a [conventional commit](https://www.conventionalcommits.org/en/v1.0.0/) in the PR title (for example, `feat(scope): description of feature`). This will be squashed and merged into the `main` branch. You can find the full list of allowed scopes [here](https://github.com/taikoxyz/taiko-mono/blob/main/.github/workflows/validate-pr-title.yml). +Specify the scope of your change with a [conventional commit](https://www.conventionalcommits.org/en/v1.0.0/) in the PR title (for example, `feat(scope): description of feature`). This will be squashed and merged into the `main` branch. You can find the full list of allowed scopes [here](https://github.com/taikoxyz/taiko-mono/blob/main/.github/workflows/repo--validate-pr-title.yml). Because we squash all of the changes into a single commit, please try to keep the PR limited to the scope specified in the commit message. This commit message will end up in the automated changelog by checking which packages are affected by the commit. diff --git a/Dockerfile b/Dockerfile index a1d52db69d5..106561266b2 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,6 +1,6 @@ ARG PACKAGE=eventindexer -FROM golang:1.21.0 as builder +FROM golang:1.23.0 AS builder ARG PACKAGE @@ -27,4 +27,4 @@ RUN apk add --no-cache ca-certificates COPY --from=builder /taiko-mono/packages/${PACKAGE}/bin/${PACKAGE} /usr/local/bin/ -ENTRYPOINT /usr/local/bin/${PACKAGE} \ No newline at end of file +ENTRYPOINT /usr/local/bin/${PACKAGE} diff --git a/LICENSE b/LICENSE new file mode 100644 index 00000000000..876c140821d --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2023–present Taiko Labs + +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/LICENSE.md b/LICENSE.md deleted file mode 100644 index 8ccef57ef1d..00000000000 --- a/LICENSE.md +++ /dev/null @@ -1,9 +0,0 @@ -MIT License - -Copyright 2023 Taiko Labs - -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/README.md b/README.md index 24413da7ef7..8ba1fea61f9 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,13 @@

- Logo for Taiko + Logo for Taiko

- Taiko + Taiko Alethia

- A based rollup. + The first based rollup.

@@ -17,40 +17,43 @@ [![YouTube](https://img.shields.io/youtube/channel/subscribers/UCxd_ARE9LtAEdnRQA6g1TaQ)](https://www.youtube.com/@taikoxyz) [![GitPOAP Badge](https://public-api.gitpoap.io/v1/repo/taikoxyz/taiko-mono/badge)](https://www.gitpoap.io/gh/taikoxyz/taiko-mono) -[![License](https://img.shields.io/github/license/taikoxyz/taiko-mono)](https://github.com/taikoxyz/taiko-mono/blob/main/LICENSE.md) +[![License](https://img.shields.io/github/license/taikoxyz/taiko-mono)](https://github.com/taikoxyz/taiko-mono/blob/main/LICENSE)
## Documentation -End user documentation can be found at [docs.taiko.xyz](https://docs.taiko.xyz). Protocol specs can be found [here](./packages/protocol/docs/README.md). - -Each package of the monorepo is well documented and includes a README. - -## Project structure - -
-taiko-mono/
-├── CHANGELOG.md
-├── CONTRIBUTING.md
-├── LICENSE.md
-├── README.md
-├── packages
-│   ├── branding: Taiko branding materials.
-│   ├── bridge-ui: Bridge UI.
-│   ├── docs-site: End user documentation site.
-│   ├── eventindexer: Event indexer.
-│   ├── fork-diff: Fork diff page.
-│   ├── guardian-prover-health-check: Guardian prover health check service.
-│   ├── guardian-prover-health-check-ui: Guardian prover health check UI.
-│   ├── protocol: Taiko protocol smart contracts.
-│   ├── relayer: Bridge backend relayer.
-│   ├── supplementary-contracts: Supplementary smart contracts that are not part of the Taiko rollup protocol.
-│   ├── taiko-client: Taiko client implementation in Go.
-│   ├── nfts: Taiko NFTs.
-│   └── taikoon-ui: Taikoon NFT UI.
-...
-
+Get started with Taiko Alethia: + +- [Taiko Alethia docs](https://docs.taiko.xyz) — High-level concepts, guides, resources, and reference pages for getting started. +- [Protocol specs](./packages/protocol/docs/README.md) — In-depth specifications of the Taiko Alethia protocol for deeper understanding. +- [Smart contracts](./packages/protocol/contracts/) — Taiko Alethia protocol smart contracts, fully documented with NatSpec. + +## Packages + +> [!TIP] +> Make sure your node is using the latest version tags for taiko-client and taiko-geth. Check out the [node releases page](https://docs.taiko.xyz/network-reference/software-releases-and-deployments)! + +| Package | Description | +| :---------------------------------------------------------------------------- | :----------------------------------------------------------------- | +| [balance-monitor](./packages/balance-monitor) | Service that monitors Ethereum L1/L2 addresses and token balances. | +| [blobstorage](./packages/blobstorage) | Service for storing and retrieving blob data. | +| [bridge-ui](./packages/bridge-ui) | Bridge UI. | +| [docs-site](./packages/docs-site) | End user documentation site. | +| [eventindexer](./packages/eventindexer) | Event indexer. | +| [fork-diff](./packages/fork-diff) | Fork diff page. | +| [geth-rpc-gateway](./packages/geth-rpc-gateway) | RPC gateway for geth nodes. | +| [guardian-prover-health-check](./packages/guardian-prover-health-check) | Guardian prover health check service. | +| [guardian-prover-health-check-ui](./packages/guardian-prover-health-check-ui) | Guardian prover health check UI. | +| [monitors](./packages/monitors) | Monitoring and alerting services. | +| [nfts](./packages/nfts) | NFT-related smart contracts and utilities. | +| [protocol](./packages/protocol) | Taiko Alethia protocol smart contracts. | +| [relayer](./packages/relayer) | Bridge backend relayer. | +| [snaefell-ui](./packages/snaefell-ui) | Snaefell UI. | +| [supplementary-contracts](./packages/supplementary-contracts) | Supplementary contracts not part of the Taiko Alethia protocol. | +| [taiko-client](./packages/taiko-client) | Taiko Alethia client implementation in Go. | +| [taikoon-ui](./packages/taikoon-ui) | Taikoon UI. | +| [ui-lib](./packages/ui-lib) | UI library. | ## Issues diff --git a/_typos.toml b/_typos.toml index 00649e4dd6b..b854bc37085 100644 --- a/_typos.toml +++ b/_typos.toml @@ -2,8 +2,15 @@ # False positives extend-ignore-identifiers-re = [ "QmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG", + "bafybeiegdqpwx3he5dvoxqklspdjekjepjcobfaakyficksratn73qbbyy", "TGE", "tge", + "preconf", + "preconfer", + "baed", + "Groth", + "groth", + "GROTH" ] [files] @@ -11,11 +18,13 @@ extend-exclude = [ "*.png", "*.svg", "go.mod", + "go.sum", + "pnpm-lock.yaml", + "**/**/pnpm-lock.yaml", "CHANGELOG.md", "packages/protocol/audit/code4rena-2024-03-taiko-final-report.md", - "packages/protocol/contracts/automata-attestation/**", - "packages/protocol/contracts/thirdparty/**", - "packages/protocol/contracts/compiled/**", + "packages/protocol/contracts/layer1/automata-attestation/**", + "packages/protocol/deployments/**", # TODO: fix typos and remove these "packages/taiko-client/**", ] diff --git a/go.mod b/go.mod index e7ca851f51f..5c4e824bc8e 100644 --- a/go.mod +++ b/go.mod @@ -1,197 +1,165 @@ module github.com/taikoxyz/taiko-mono -go 1.21 +go 1.23 require ( - github.com/btcsuite/btcd/btcec/v2 v2.3.3 - github.com/buildkite/terminal-to-html/v3 v3.8.0 + github.com/btcsuite/btcd/btcec/v2 v2.3.4 + github.com/buildkite/terminal-to-html/v3 v3.16.4 github.com/cenkalti/backoff v2.2.1+incompatible github.com/cenkalti/backoff/v4 v4.3.0 github.com/cyberhorsey/errors v0.0.0-20220929234051-087d6d8bb841 github.com/cyberhorsey/webutils v0.0.0-20230314183728-56890c6ddbe7 - github.com/davecgh/go-spew v1.1.1 + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 + github.com/dgraph-io/badger/v4 v4.2.0 github.com/ethereum-optimism/optimism v1.7.4 - github.com/ethereum/go-ethereum v1.13.15 - github.com/go-git/go-git/v5 v5.12.0 - github.com/go-resty/resty/v2 v2.7.0 + github.com/ethereum/go-ethereum v1.14.11 + github.com/ethereum/hive v0.0.0-20240822135954-91829ccfb2c5 + github.com/go-git/go-git/v5 v5.13.1 + github.com/go-resty/resty/v2 v2.16.2 github.com/gomarkdown/markdown v0.0.0-20231222211730-1d6d20845b47 github.com/google/uuid v1.6.0 github.com/gorilla/rpc v1.2.1 + github.com/gorilla/websocket v1.5.3 github.com/joho/godotenv v1.5.1 - github.com/labstack/echo-contrib v0.17.1 - github.com/labstack/echo/v4 v4.12.0 + github.com/labstack/echo-jwt/v4 v4.3.0 + github.com/labstack/echo-contrib v0.17.2 + github.com/labstack/echo-jwt/v4 v4.3.0 + github.com/labstack/echo/v4 v4.13.3 github.com/labstack/gommon v0.4.2 github.com/modern-go/reflect2 v1.0.2 - github.com/morkid/paginate v1.1.7 + github.com/morkid/paginate v1.1.8 github.com/patrickmn/go-cache v2.1.0+incompatible github.com/phayes/freeport v0.0.0-20220201140144-74d24b5ae9f5 github.com/pkg/errors v0.9.1 - github.com/pressly/goose/v3 v3.20.0 - github.com/prometheus/client_golang v1.19.0 - github.com/prysmaticlabs/prysm/v4 v4.2.0 + github.com/pressly/goose/v3 v3.24.0 + github.com/prometheus/client_golang v1.20.5 + github.com/prysmaticlabs/prysm/v5 v5.2.0 github.com/rabbitmq/amqp091-go v1.10.0 github.com/shopspring/decimal v1.4.0 - github.com/stretchr/testify v1.9.0 - github.com/swaggo/swag v1.16.3 - github.com/testcontainers/testcontainers-go v0.30.0 - github.com/urfave/cli/v2 v2.27.2 - golang.org/x/exp v0.0.0-20240325151524-a685a6edb6d8 - golang.org/x/sync v0.7.0 + github.com/stretchr/testify v1.10.0 + github.com/swaggo/swag v1.16.4 + github.com/testcontainers/testcontainers-go v0.34.0 + github.com/urfave/cli/v2 v2.27.5 + golang.org/x/exp v0.0.0-20240808152545-0cdaa3abc0fa + golang.org/x/sync v0.10.0 gopkg.in/go-playground/assert.v1 v1.2.1 gopkg.in/yaml.v3 v3.0.1 - gorm.io/datatypes v1.2.0 - gorm.io/driver/mysql v1.5.6 - gorm.io/gorm v1.25.10 + gorm.io/datatypes v1.2.5 + gorm.io/driver/mysql v1.5.7 + gorm.io/gorm v1.25.12 gotest.tools v2.2.0+incompatible ) require ( - contrib.go.opencensus.io/exporter/jaeger v0.2.1 // indirect dario.cat/mergo v1.0.0 // indirect filippo.io/edwards25519 v1.1.0 // indirect github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 // indirect - github.com/BurntSushi/toml v1.3.2 // indirect - github.com/DataDog/zstd v1.5.2 // indirect + github.com/BurntSushi/toml v1.4.0 // indirect + github.com/DataDog/zstd v1.5.6-0.20230824185856-869dae002e5e // indirect github.com/KyleBanks/depth v1.2.1 // indirect - github.com/Microsoft/go-winio v0.6.1 // indirect - github.com/Microsoft/hcsshim v0.11.4 // indirect - github.com/ProtonMail/go-crypto v1.0.0 // indirect - github.com/VictoriaMetrics/fastcache v1.12.1 // indirect - github.com/andybalholm/brotli v1.1.0 // indirect - github.com/aristanetworks/goarista v0.0.0-20200805130819-fd197cf57d96 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect + github.com/ProtonMail/go-crypto v1.1.3 // indirect + github.com/VictoriaMetrics/fastcache v1.12.2 // indirect + github.com/andybalholm/brotli v1.1.1 // indirect github.com/aymerick/douceur v0.2.0 // 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/btcsuite/btcd v0.24.0 // indirect + github.com/bits-and-blooms/bitset v1.13.0 // indirect + github.com/btcsuite/btcd v0.24.2 // indirect github.com/btcsuite/btcd/btcutil v1.1.5 // indirect github.com/btcsuite/btcd/chaincfg/chainhash v1.1.0 // indirect - github.com/cespare/xxhash v1.1.0 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/cloudflare/circl v1.3.7 // indirect - github.com/cockroachdb/errors v1.11.1 // 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/pebble v0.0.0-20231018212520-f6cde3fc2fa4 // indirect + github.com/cockroachdb/pebble v1.1.2 // 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/containerd/cgroups v1.1.0 // indirect - github.com/containerd/containerd v1.7.12 // indirect + github.com/containerd/containerd v1.7.18 // indirect github.com/containerd/log v0.1.0 // indirect - github.com/coreos/go-systemd/v22 v22.5.0 // indirect - github.com/cpuguy83/dockercfg v0.3.1 // indirect - github.com/cpuguy83/go-md2man/v2 v2.0.4 // 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/cyphar/filepath-securejoin v0.2.4 // indirect - github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c // indirect - github.com/deckarep/golang-set/v2 v2.1.0 // indirect - github.com/dgraph-io/ristretto v0.0.4-0.20210318174700-74754f61e018 // indirect - github.com/distribution/reference v0.5.0 // indirect - github.com/docker/docker v25.0.5+incompatible // indirect + github.com/containerd/platforms v0.2.1 // indirect + github.com/cpuguy83/dockercfg v0.3.2 // indirect + github.com/cpuguy83/go-md2man/v2 v2.0.5 // indirect + github.com/crate-crypto/go-ipa v0.0.0-20240223125850-b1e8a79f509c // indirect + github.com/crate-crypto/go-kzg-4844 v1.0.0 // indirect + github.com/cyphar/filepath-securejoin v0.3.6 // indirect + github.com/deckarep/golang-set/v2 v2.6.0 // indirect + github.com/distribution/reference v0.6.0 // indirect + github.com/docker/docker v27.1.1+incompatible // indirect github.com/docker/go-connections v0.5.0 // indirect github.com/docker/go-units v0.5.0 // indirect - github.com/dustin/go-humanize v1.0.1 // indirect - github.com/elastic/gosigar v0.14.2 // indirect github.com/emirpasic/gods v1.18.1 // indirect github.com/ethereum-optimism/go-ethereum-hdwallet v0.1.3 // indirect - github.com/ethereum/c-kzg-4844 v0.4.0 // indirect + github.com/ethereum/c-kzg-4844 v1.0.0 // indirect + github.com/ethereum/go-verkle v0.1.1-0.20240829091221-dffa7562dbe9 // indirect + github.com/ethereum/hive/hiveproxy v0.0.0-20240808014330-625b82294b46 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect - github.com/fjl/memsize v0.0.2 // indirect - github.com/flynn/noise v1.0.0 // indirect - github.com/francoispqt/gojay v1.2.13 // indirect github.com/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/fsouza/go-dockerclient v1.11.0 // indirect + github.com/getsentry/sentry-go v0.27.0 // indirect github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect - github.com/go-git/go-billy/v5 v5.5.0 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/go-git/go-billy/v5 v5.6.1 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-ole/go-ole v1.3.0 // indirect - github.com/go-openapi/jsonpointer v0.19.5 // indirect - github.com/go-openapi/jsonreference v0.20.0 // indirect + github.com/go-openapi/jsonpointer v0.19.6 // indirect + github.com/go-openapi/jsonreference v0.20.2 // indirect github.com/go-openapi/spec v0.20.4 // indirect - github.com/go-openapi/swag v0.19.15 // indirect + github.com/go-openapi/swag v0.22.3 // indirect github.com/go-playground/locales v0.14.1 // indirect github.com/go-playground/universal-translator v0.18.1 // indirect github.com/go-playground/validator/v10 v10.13.0 // indirect github.com/go-sql-driver/mysql v1.8.1 // indirect - github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect - github.com/godbus/dbus/v5 v5.1.0 // indirect + github.com/go-stack/stack v1.8.1 // indirect github.com/gofrs/flock v0.8.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang-jwt/jwt v3.2.2+incompatible // indirect - github.com/golang-jwt/jwt/v4 v4.5.0 // indirect + github.com/golang-jwt/jwt/v4 v4.5.1 // indirect + github.com/golang-jwt/jwt/v5 v5.2.1 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect - github.com/golang/protobuf v1.5.4 // indirect github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect + github.com/google/flatbuffers v1.12.1 // indirect github.com/google/go-cmp v0.6.0 // indirect github.com/google/gofuzz v1.2.1-0.20220503160820-4a35382e8fc8 // indirect - github.com/google/gopacket v1.1.19 // indirect - github.com/google/pprof v0.0.0-20231023181126-ff6d637d2a7b // indirect github.com/gorilla/css v1.0.0 // indirect - github.com/gorilla/mux v1.8.0 // indirect - github.com/gorilla/websocket v1.5.1 // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 // indirect + github.com/gorilla/mux v1.8.1 // indirect github.com/hashicorp/go-bexpr v0.1.11 // indirect github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d // indirect - github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect + github.com/hashicorp/yamux v0.1.1 // indirect github.com/herumi/bls-eth-go-binary v0.0.0-20210917013441-d37c07cfda4e // indirect github.com/holiman/bloomfilter/v2 v2.0.3 // indirect - github.com/holiman/uint256 v1.2.4 // indirect + github.com/holiman/uint256 v1.3.1 // indirect github.com/huin/goupnp v1.3.0 // indirect github.com/iancoleman/strcase v0.2.0 // indirect - github.com/ipfs/go-cid v0.4.1 // indirect - github.com/ipfs/go-log/v2 v2.5.1 // indirect github.com/jackpal/go-nat-pmp v1.0.2 // indirect github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect - github.com/jbenet/go-temp-err-catcher v0.1.0 // indirect github.com/jinzhu/inflection v1.0.0 // indirect github.com/jinzhu/now v1.1.5 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect - github.com/k0kubun/go-ansi v0.0.0-20180517002512-3bf9e2903213 // indirect github.com/kevinburke/ssh_config v1.2.0 // indirect - github.com/klauspost/compress v1.17.6 // indirect - github.com/klauspost/cpuid/v2 v2.2.6 // indirect - github.com/koron/go-ssdp v0.0.4 // indirect + github.com/klauspost/compress v1.17.11 // indirect + github.com/klauspost/cpuid/v2 v2.2.8 // indirect github.com/kr/pretty v0.3.1 // indirect github.com/kr/text v0.2.0 // indirect github.com/leodido/go-urn v1.2.3 // indirect - github.com/libp2p/go-buffer-pool v0.1.0 // indirect - github.com/libp2p/go-flow-metrics v0.1.0 // indirect - github.com/libp2p/go-libp2p v0.32.1 // indirect - github.com/libp2p/go-libp2p-asn-util v0.4.1 // indirect - github.com/libp2p/go-libp2p-mplex v0.9.0 // indirect - github.com/libp2p/go-libp2p-pubsub v0.10.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 - github.com/libp2p/go-netroute v0.2.1 // indirect - github.com/libp2p/go-reuseport v0.4.0 // indirect - github.com/libp2p/go-yamux/v4 v4.0.1 // indirect - github.com/logrusorgru/aurora v2.0.3+incompatible // indirect + github.com/lithammer/dedent v1.1.0 // indirect github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect github.com/magiconair/properties v1.8.7 // indirect github.com/mailru/easyjson v0.7.7 // indirect - github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect - github.com/mattn/go-runewidth v0.0.14 // indirect - github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect + github.com/mattn/go-runewidth v0.0.15 // indirect github.com/mfridman/interpolate v0.0.2 // indirect github.com/microcosm-cc/bluemonday v1.0.26 // indirect - github.com/miekg/dns v1.1.56 // indirect - github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b // indirect - github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc // indirect github.com/minio/highwayhash v1.0.2 // indirect github.com/minio/sha256-simd v1.0.1 // indirect - github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/mitchellh/pointerstructure v1.2.1 // indirect github.com/mmcloughlin/addchain v0.4.0 // indirect + github.com/moby/docker-image-spec v1.3.1 // indirect github.com/moby/patternmatcher v0.6.0 // indirect github.com/moby/sys/sequential v0.5.0 // indirect github.com/moby/sys/user v0.1.0 // indirect @@ -200,113 +168,80 @@ require ( github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 // indirect github.com/morikuni/aec v1.0.0 // indirect github.com/morkid/gocache v1.0.0 // indirect - github.com/mr-tron/base58 v1.2.0 // indirect - github.com/multiformats/go-base32 v0.1.0 // indirect - github.com/multiformats/go-base36 v0.2.0 // indirect - github.com/multiformats/go-multiaddr v0.12.3 // indirect - github.com/multiformats/go-multiaddr-dns v0.3.1 // indirect - github.com/multiformats/go-multiaddr-fmt v0.1.0 // indirect - github.com/multiformats/go-multibase v0.2.0 // indirect - github.com/multiformats/go-multicodec v0.9.0 // indirect - 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/neko-neko/echo-logrus/v2 v2.0.1 // indirect github.com/olekukonko/tablewriter v0.0.5 // indirect - github.com/onsi/ginkgo/v2 v2.15.0 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opencontainers/image-spec v1.1.0 // indirect - github.com/opencontainers/runtime-spec v1.1.0 // indirect - github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 // indirect github.com/pjbgf/sha1cd v0.3.0 // indirect - github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.53.0 // indirect - github.com/prometheus/procfs v0.13.0 // indirect - github.com/prometheus/prom2json v1.3.0 // indirect - github.com/prysmaticlabs/fastssz v0.0.0-20221107182844-78142813af44 // indirect - github.com/prysmaticlabs/go-bitfield v0.0.0-20210809151128-385d8c5e3fb7 // indirect - github.com/prysmaticlabs/gohashtree v0.0.3-alpha // indirect - github.com/prysmaticlabs/prombbolt v0.0.0-20210126082820-9b7adba6db7c // 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/raulk/go-watchdog v1.3.0 // indirect + github.com/prometheus/common v0.61.0 // indirect + github.com/prometheus/procfs v0.15.1 // indirect + github.com/prysmaticlabs/fastssz v0.0.0-20241008181541-518c4ce73516 // indirect + github.com/prysmaticlabs/go-bitfield v0.0.0-20240328144219-a1caa50c3a1e // indirect + github.com/prysmaticlabs/gohashtree v0.0.4-beta.0.20240624100937-73632381301b // indirect github.com/rivo/uniseg v0.4.4 // indirect - github.com/rogpeppe/go-internal v1.11.0 // indirect - github.com/rs/cors v1.9.0 // indirect + github.com/rogpeppe/go-internal v1.12.0 // indirect + github.com/rs/cors v1.11.0 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect - github.com/schollz/progressbar/v3 v3.3.4 // indirect github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 // indirect - github.com/sethvargo/go-retry v0.2.4 // indirect + github.com/sethvargo/go-retry v0.3.0 // indirect github.com/shirou/gopsutil v3.21.11+incompatible // indirect github.com/shirou/gopsutil/v3 v3.23.12 // indirect github.com/shoenig/go-m1cpu v0.1.6 // indirect github.com/sirupsen/logrus v1.9.3 // indirect - github.com/skeema/knownhosts v1.2.2 // indirect - github.com/spaolacci/murmur3 v1.1.0 // indirect - github.com/spf13/afero v1.10.0 // indirect - github.com/supranational/blst v0.3.11 // indirect + github.com/skeema/knownhosts v1.3.0 // indirect + github.com/supranational/blst v0.3.13 // indirect github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d // indirect github.com/thomaso-mirodin/intmath v0.0.0-20160323211736-5dc6d854e46e // indirect - github.com/tklauser/go-sysconf v0.3.12 // indirect - github.com/tklauser/numcpus v0.6.1 // indirect - github.com/trailofbits/go-mutexasserts v0.0.0-20230328101604-8cdbc5f3d279 // indirect + github.com/tklauser/go-sysconf v0.3.13 // indirect + github.com/tklauser/numcpus v0.7.0 // indirect github.com/tyler-smith/go-bip39 v1.1.0 // indirect - github.com/uber/jaeger-client-go v2.30.0+incompatible // indirect github.com/valyala/bytebufferpool v1.0.0 // indirect github.com/valyala/fasthttp v1.44.0 // indirect github.com/valyala/fasttemplate v1.2.2 // indirect - github.com/wealdtech/go-bytesutil v1.1.1 // indirect github.com/xanzy/ssh-agent v0.3.3 // indirect - github.com/xrash/smetrics v0.0.0-20240312152122-5f08fbb34913 // 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.8 // indirect - go.opencensus.io v0.24.0 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 // indirect - go.opentelemetry.io/otel v1.24.0 // indirect - go.opentelemetry.io/otel/metric v1.24.0 // indirect - go.opentelemetry.io/otel/trace v1.24.0 // 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.opentelemetry.io/otel v1.31.0 // indirect + go.opentelemetry.io/otel/metric v1.31.0 // indirect + go.opentelemetry.io/otel/trace v1.31.0 // indirect go.uber.org/multierr v1.11.0 // indirect - go.uber.org/zap v1.26.0 // indirect - golang.org/x/crypto v0.22.0 // indirect - golang.org/x/mod v0.16.0 // indirect - golang.org/x/net v0.24.0 // indirect - golang.org/x/oauth2 v0.18.0 // indirect - golang.org/x/sys v0.19.0 // indirect - golang.org/x/term v0.19.0 // indirect - golang.org/x/text v0.14.0 // indirect - golang.org/x/time v0.5.0 // indirect - golang.org/x/tools v0.19.0 // indirect - google.golang.org/api v0.44.0 // indirect - google.golang.org/appengine v1.6.8 // indirect - google.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240227224415-6ceb2ff114de // indirect - google.golang.org/grpc v1.63.2 // indirect - google.golang.org/protobuf v1.33.0 // indirect + golang.org/x/crypto v0.31.0 // indirect + golang.org/x/mod v0.20.0 // indirect + golang.org/x/net v0.33.0 // indirect + golang.org/x/oauth2 v0.24.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/term v0.27.0 // indirect + golang.org/x/text v0.21.0 // indirect + golang.org/x/time v0.8.0 // indirect + golang.org/x/tools v0.24.0 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20241015192408-796eee8c2d53 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20241015192408-796eee8c2d53 // indirect + google.golang.org/grpc v1.69.2 // indirect + google.golang.org/protobuf v1.36.1 // indirect + gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1 // indirect gopkg.in/inf.v0 v0.9.1 // indirect - gopkg.in/natefinch/lumberjack.v2 v2.0.0 // indirect + gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect gopkg.in/warnings.v0 v0.1.2 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect - k8s.io/apimachinery v0.26.2 // indirect - k8s.io/client-go v0.26.2 // indirect - k8s.io/klog/v2 v2.90.1 // indirect - k8s.io/utils v0.0.0-20230220204549-a5ecb0141aa5 // indirect - lukechampine.com/blake3 v1.2.1 // indirect + k8s.io/apimachinery v0.30.4 // indirect + k8s.io/client-go v0.30.4 // indirect + k8s.io/klog/v2 v2.120.1 // indirect + k8s.io/utils v0.0.0-20230726121419-3b25d923346b // indirect rsc.io/tmplfunc v0.0.3 // indirect - sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 // indirect - sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect + sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect + sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect sigs.k8s.io/yaml v1.3.0 // indirect ) -replace github.com/ethereum/go-ethereum v1.13.15 => github.com/taikoxyz/taiko-geth v0.0.0-20240504072040-7e1b8b65a3f8 +replace github.com/ethereum/go-ethereum v1.14.11 => github.com/taikoxyz/taiko-geth v1.11.2-0.20250107082544-a2cbf904eaae -replace github.com/ethereum-optimism/optimism v1.7.4 => github.com/taikoxyz/optimism v0.0.0-20240508063202-db34e8c760ea +replace github.com/ethereum-optimism/optimism v1.7.4 => github.com/taikoxyz/optimism v0.0.0-20241003061504-cdf8af288f39 replace github.com/uber/jaeger-client-go => github.com/uber/jaeger-client-go v2.25.0+incompatible + +replace github.com/ethereum/hive v0.0.0-20240822135954-91829ccfb2c5 => github.com/taikoxyz/hive v0.0.0-20240827015317-405b241dd082 diff --git a/go.sum b/go.sum index 2e10f46f909..80587bed24e 100644 --- a/go.sum +++ b/go.sum @@ -1,146 +1,57 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.31.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.37.0/go.mod h1:TS1dMSSfndXH133OKGwekG838Om/cQT0BUHV3HcBgoo= -cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= -cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= -cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= -cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= -cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= -cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= -cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= -cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= -cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= -cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= -cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= -cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= -cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= -cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= -cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= -cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= -cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= -cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= -cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= -cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= -cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= -cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= -cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= -cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= -cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= -cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= -cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= -cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= -contrib.go.opencensus.io/exporter/jaeger v0.2.1 h1:yGBYzYMewVL0yO9qqJv3Z5+IRhPdU7e9o/2oKpX4YvI= -contrib.go.opencensus.io/exporter/jaeger v0.2.1/go.mod h1:Y8IsLgdxqh1QxYxPC5IgXVmBaeLUeQFfBeBi9PbeZd0= dario.cat/mergo v1.0.0 h1:AGCNq9Evsj31mOgNPcLyXc+4PNABt905YmuqPYYpBWk= dario.cat/mergo v1.0.0/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= -dmitri.shuralyov.com/app/changes v0.0.0-20180602232624-0a106ad413e3/go.mod h1:Yl+fi1br7+Rr3LqpNJf1/uxUdtRUV+Tnj0o93V2B9MU= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -dmitri.shuralyov.com/html/belt v0.0.0-20180602232347-f7d459c86be0/go.mod h1:JLBrvjyP0v+ecvNYvCpyZgu5/xkfAUhi6wJj28eUfSU= -dmitri.shuralyov.com/service/change v0.0.0-20181023043359-a85b471d5412/go.mod h1:a1inKt/atXimZ4Mv927x+r7UpyzRUf4emIoiiSC2TN4= -dmitri.shuralyov.com/state v0.0.0-20180228185332-28bcc343414c/go.mod h1:0PRwlb0D6DFvNNtx+9ybjezNCa8XF0xaYcETyp6rHWU= filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= -git.apache.org/thrift.git v0.0.0-20180902110319-2566ecd5d999/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg= github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24 h1:bvDV9vkmnHYOMsOr4WLk+Vo07yKIzd94sVoIqshQ4bU= github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24/go.mod h1:8o94RPi1/7XTJvwPpRSzSUedZrtlirdB3r9Z20bi2f8= github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25UVaW/CKtUDjefjrs0SPonmDGUVOYP0= github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= 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/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/DataDog/zstd v1.5.2 h1:vUG4lAyuPCXO0TLbXvPv7EB7cNK1QV/luu55UHLrrn8= -github.com/DataDog/zstd v1.5.2/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= -github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= +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/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/KyleBanks/depth v1.2.1 h1:5h8fQADFrWtarTdtDudMmGsC7GPbOAu6RVB3ffsVFHc= github.com/KyleBanks/depth v1.2.1/go.mod h1:jzSb9d0L43HxTQfT+oSA1EEp2q+ne2uh6XgeJcm8brE= github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY= -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/hcsshim v0.11.4 h1:68vKo2VN8DE9AdN4tnkWnmdhqdbpUFM8OF3Airm7fz8= -github.com/Microsoft/hcsshim v0.11.4/go.mod h1:smjE4dvqPX9Zldna+t5FG3rnoHhaB7QYxPRqGcpAD9w= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/OneOfOne/xxhash v1.2.8 h1:31czK/TI9sNkxIKfaUfGlU47BAxQ0ztGgd9vPyqimf8= -github.com/OneOfOne/xxhash v1.2.8/go.mod h1:eZbhyaAYD41SGSSsnmcpxVoRiQ/MPUTjUdIIOT9Um7Q= -github.com/ProtonMail/go-crypto v1.0.0 h1:LRuvITjQWX+WIfr930YHG2HNfjR1uOfyf5vE0kC2U78= -github.com/ProtonMail/go-crypto v1.0.0/go.mod h1:EjAoLdwvbIOoOQr3ihjnSoLZRtE8azugULFRteWMNc0= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/ProtonMail/go-crypto v1.1.3 h1:nRBOetoydLeUb4nHajyO2bKqMLfWQ/ZPwkXqXxPxCFk= +github.com/ProtonMail/go-crypto v1.1.3/go.mod h1:rA3QumHc/FZ8pAHreoekgiAbzpNsfQAosU5td4SnOrE= github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= -github.com/Shopify/sarama v1.26.1/go.mod h1:NbSGBSSndYaIhRcBtY9V0U7AyH+x71bG668AuWys/yU= -github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= -github.com/VictoriaMetrics/fastcache v1.12.1 h1:i0mICQuojGDL3KblA7wUNlY5lOK6a4bwt3uRKnkZU40= -github.com/VictoriaMetrics/fastcache v1.12.1/go.mod h1:tX04vaqcNoQeGLD+ra5pU5sWkuxnzWhEzLwhP9w653o= -github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= +github.com/VictoriaMetrics/fastcache v1.12.2 h1:N0y9ASrJ0F6h0QaC3o6uJb3NIZ9VKLjCM7NQbSmF7WI= +github.com/VictoriaMetrics/fastcache v1.12.2/go.mod h1:AmC+Nzz1+3G2eCPapF6UcsnkThDcMsQicp4xDukwJYI= github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= -github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= -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= -github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= github.com/allegro/bigcache v1.2.1 h1:hg1sY1raCwic3Vnsvje6TT7/pnZba83LeFck5NrFKSc= github.com/allegro/bigcache v1.2.1/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= github.com/andybalholm/brotli v1.0.1/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu3qAvBg8x/Y= github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= -github.com/andybalholm/brotli v1.1.0 h1:eLKJA0d02Lf0mVpIDgYnqXcUn0GqVmEFny3VuID1U3M= -github.com/andybalholm/brotli v1.1.0/go.mod h1:sms7XGricyQI9K10gOSf56VKKWS4oLer58Q+mhRPtnY= -github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= +github.com/andybalholm/brotli v1.1.1 h1:PR2pgnyFznKEugtsUo0xLdDop5SKXd5Qf5ysW+7XdTA= +github.com/andybalholm/brotli v1.1.1/go.mod h1:05ib4cKhjx3OQYUY22hTVd34Bc8upXjOLL2rKwwZBoA= github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be h1:9AeTilPcZAjCFIImctFaOjnTIavg87rW78vTPkQqLI8= github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be/go.mod h1:ySMOLuWl6zY27l47sB3qLNK6tF2fkHG55UZxx8oIVo4= -github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= -github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= -github.com/aristanetworks/fsnotify v1.4.2/go.mod h1:D/rtu7LpjYM8tRJphJ0hUBYpjai8SfX+aSNsWDTq/Ks= -github.com/aristanetworks/glog v0.0.0-20191112221043-67e8567f59f3/go.mod h1:KASm+qXFKs/xjSoWn30NrWBBvdTTQq+UjkhjEJHfSFA= -github.com/aristanetworks/goarista v0.0.0-20200805130819-fd197cf57d96 h1:XJH0YfVFKbq782tlNThzN/Ud5qm/cx6LXOA/P6RkTxc= -github.com/aristanetworks/goarista v0.0.0-20200805130819-fd197cf57d96/go.mod h1:QZe5Yh80Hp1b6JxQdpfSEEe8X7hTyTEZSosSrFf/oJE= -github.com/aristanetworks/splunk-hec-go v0.3.3/go.mod h1:1VHO9r17b0K7WmOlLb9nTk/2YanvOEnLMUgsFrxBROc= -github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= -github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= -github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= -github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= -github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= -github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= -github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuPk= github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4= github.com/bazelbuild/rules_go v0.23.2 h1:Wxu7JjqnF78cKZbsBsARLSXx/jlGaSLCnUV3mTlyHvM= github.com/bazelbuild/rules_go v0.23.2/go.mod h1:MC23Dc/wkXEyk3Wpq6lCqz0ZAYOZDw2DR5y3N1q2i7M= -github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= -github.com/benbjohnson/clock v1.3.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= -github.com/benbjohnson/clock v1.3.5 h1:VvXlSJBzZpA/zum6Sj74hxwYI2DIxRWuNIoXAzHZz5o= -github.com/benbjohnson/clock v1.3.5/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= -github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= 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/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -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/bradfitz/go-smtpd v0.0.0-20170404230938-deb6d6237625/go.mod h1:HYsPBTaaSFSlLx/70C2HPIMNZpVV8+vt/A+FMnYP11g= +github.com/bits-and-blooms/bitset v1.13.0 h1:bAQ9OPNFYbGHV6Nez0tmNI0RiEu7/hxlYJRUA0wFAVE= +github.com/bits-and-blooms/bitset v1.13.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= 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.3.3 h1:6+iXlDKE8RMtKsvK0gshlXIuPbyWM/h84Ensb7o3sC0= -github.com/btcsuite/btcd/btcec/v2 v2.3.3/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= +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= @@ -158,11 +69,8 @@ github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku github.com/btcsuite/snappy-go v1.0.0/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= -github.com/buger/jsonparser v0.0.0-20181115193947-bf1c66bbce23/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s= -github.com/buildkite/terminal-to-html/v3 v3.8.0 h1:S7ImMS8W+2yS/9D4ugrXzB95C4AuNaKcaw/eR/95bFU= -github.com/buildkite/terminal-to-html/v3 v3.8.0/go.mod h1:j3XxsnYElte/Bo7Pft+U5eQWWbcx3j51uQ8fo43VrjM= -github.com/bwesterb/go-ristretto v1.2.3/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0= -github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= +github.com/buildkite/terminal-to-html/v3 v3.16.4 h1:QFYO8IGvRnp7tGgiQb8g9uFU8kY9wOzxsFFx17+yy6Q= +github.com/buildkite/terminal-to-html/v3 v3.16.4/go.mod h1:r/J7cC9c3EzBzP3/wDz0RJLPwv5PUAMp+KF2w+ntMc0= github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4= github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= @@ -170,9 +78,6 @@ github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyY github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/cp v1.1.1 h1:nCb6ZLdB7NRaqsm91JtQTAme2SKJzXVsdPIPkyJr1MU= github.com/cespare/cp v1.1.1/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s= -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/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= @@ -180,58 +85,42 @@ github.com/chris-ramon/douceur v0.2.0/go.mod h1:wDW5xjJdeoMm1mRt4sD4c/LbF/mWdEpR 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/cilium/ebpf v0.2.0/go.mod h1:To2CFviqOWL/M0gIMsvSMlqe7em/l1ALkX1PyjrX2Qs= -github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cloudflare/circl v1.3.3/go.mod h1:5XYMA4rFBvNIrhs50XuiBJ15vF2pZn4nnUKZrLbUZFA= github.com/cloudflare/circl v1.3.7 h1:qlCDlTPz2n9fu58M0Nh1J/JzcFpfgkFHHX3O35r5vcU= github.com/cloudflare/circl v1.3.7/go.mod h1:sRTcRWXGLrKw6yIGJ+l7amYJFfAXbZG0kBSc8r4zxgA= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= 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= github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ= -github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= 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/containerd/cgroups v0.0.0-20201119153540-4cbc285b3327/go.mod h1:ZJeTFisyysqgcCdecO57Dj79RfL0LNeGiFUqLYQRYLE= -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/containerd/containerd v1.7.12 h1:+KQsnv4VnzyxWcfO9mlxxELaoztsDEjOuCMPAuPqgU0= -github.com/containerd/containerd v1.7.12/go.mod h1:/5OMpE1p0ylxtEUGY8kuCYkDRzJm9NO1TFMWjUpdevk= +github.com/containerd/containerd v1.7.18 h1:jqjZTQNfXGoEaZdW1WwPU0RqSn1Bm2Ay/KJPUuO8nao= +github.com/containerd/containerd v1.7.18/go.mod h1:IYEk9/IO6wAPUz2bCMVUbsfXjzw5UNP5fLz4PsUygQ4= github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I= github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= -github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd v0.0.0-20181012123002-c6f51f82210d/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/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/cpuguy83/dockercfg v0.3.1 h1:/FpZ+JaygUR/lZP2NlFI2DVfrOEMAIKP5wWEJdoYe9E= -github.com/cpuguy83/dockercfg v0.3.1/go.mod h1:sugsbF4//dDlL/i+S+rtpIWp+5h0BHJHfjj5/jFyUJc= -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.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-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/containerd/platforms v0.2.1 h1:zvwtM3rz2YHPQsF2CHYM8+KtB5dvhISiXh5ZpSBQv6A= +github.com/containerd/platforms v0.2.1/go.mod h1:XHCb+2/hzowdiut9rkudds9bE5yJ7npe7dG/wG+uFPw= +github.com/cpuguy83/dockercfg v0.3.2 h1:DlJTyZGBDlXqUZ2Dk2Q3xHs/FtnooJJVaad2S9GKorA= +github.com/cpuguy83/dockercfg v0.3.2/go.mod h1:sugsbF4//dDlL/i+S+rtpIWp+5h0BHJHfjj5/jFyUJc= +github.com/cpuguy83/go-md2man/v2 v2.0.5 h1:ZtcqGrnekaHpVLArFSe4HK5DoKx1T0rq2DwVB0alcyc= +github.com/cpuguy83/go-md2man/v2 v2.0.5/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/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY= github.com/creack/pty v1.1.18/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= @@ -239,18 +128,17 @@ github.com/cyberhorsey/errors v0.0.0-20220929234051-087d6d8bb841 h1:FaPua89k9Kmk github.com/cyberhorsey/errors v0.0.0-20220929234051-087d6d8bb841/go.mod h1:qSH/IvpdArCjfny4ODMko/7U0z4JoNIWctgCnUrapnI= github.com/cyberhorsey/webutils v0.0.0-20230314183728-56890c6ddbe7 h1:KYOh2RfWAltxYsfD/Ar5D3zB4+AuNQejXW5BvMlGor4= github.com/cyberhorsey/webutils v0.0.0-20230314183728-56890c6ddbe7/go.mod h1:bNNUHadsCy1HleNUToQ/t11vmKI9/+9Taw8K6GyxERo= -github.com/cyphar/filepath-securejoin v0.2.4 h1:Ugdm7cg7i6ZK6x3xDF1oEu1nfkyfH53EtKeQYTC3kyg= -github.com/cyphar/filepath-securejoin v0.2.4/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= +github.com/cyphar/filepath-securejoin v0.3.6 h1:4d9N5ykBnSp5Xn2JkhocYDkOpURL/18CYMpo6xB9uWM= +github.com/cyphar/filepath-securejoin v0.3.6/go.mod h1:Sdj7gXlvMcPZsbhwhQ33GguGLDGQL7h7bg04C/+u9jI= github.com/d4l3k/messagediff v1.2.1 h1:ZcAIMYsUg0EAp9X+tt8/enBE/Q8Yd5kzPynLyKptt9U= github.com/d4l3k/messagediff v1.2.1/go.mod h1:Oozbb1TVXFac9FtSIxHBMnBCq2qeH/2KkEQxENCrlLo= 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/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/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/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= @@ -258,119 +146,81 @@ github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeC github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 h1:rpfIENRNNilwHwZeG5+P150SMrnNEcHYvcCuK6dPZSg= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= github.com/decred/dcrd/lru v1.0.0/go.mod h1:mxKOwFd7lFjN2GZYsiz/ecgqR6kkYAl+0pz0tEMk218= -github.com/dgraph-io/ristretto v0.0.4-0.20210318174700-74754f61e018 h1:cNcG4c2n5xanQzp2hMyxDxPYVQmZ91y4WN6fJFlndLo= -github.com/dgraph-io/ristretto v0.0.4-0.20210318174700-74754f61e018/go.mod h1:MIonLggsKgZLUSt414ExgwNtlOL5MuEoAJP514mwGe8= +github.com/dgraph-io/badger/v4 v4.2.0/go.mod h1:qfCqhPoWDFJRx1gp5QwwyGo8xk1lbHUxvK9nK0OGAak= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2 h1:tdlZCpZ/P9DhczCTSixgIKmwPv6+wP5DGjqLYw5SUiA= -github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= -github.com/distribution/reference v0.5.0 h1:/FUIFXtfc/x2gpa5/VGfiGLuOIdYa1t65IKK2OFGvA0= -github.com/distribution/reference v0.5.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= -github.com/docker/docker v25.0.5+incompatible h1:UmQydMduGkrD5nQde1mecF/YnSbTOaPeFIeP5C4W+DE= -github.com/docker/docker v25.0.5+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk= +github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= +github.com/docker/docker v27.1.1+incompatible h1:hO/M4MtV36kzKldqnA37IWhebRA+LnqqcqDja6kVaKY= +github.com/docker/docker v27.1.1+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c= github.com/docker/go-connections v0.5.0/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc= -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/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -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/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= -github.com/eapache/go-resiliency v1.2.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= -github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= -github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= -github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= -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/elazarl/goproxy v0.0.0-20230808193330-2592e75ae04a h1:mATvB/9r/3gvcejNsXKSkQ6lcIaNec2nyfOdlTBR2lU= -github.com/elazarl/goproxy v0.0.0-20230808193330-2592e75ae04a/go.mod h1:Ro8st/ElPeALwNFlcTpWmkr6IoMFfkjXAvTHpevnDsM= -github.com/emicklei/go-restful/v3 v3.10.1 h1:rc42Y5YTp7Am7CS630D7JmhRjq4UlEUuEKfrDac4bSQ= -github.com/emicklei/go-restful/v3 v3.10.1/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= +github.com/elazarl/goproxy v1.2.3 h1:xwIyKHbaP5yfT6O9KIeYJR5549MXRQkoQMRXGztz8YQ= +github.com/elazarl/goproxy v1.2.3/go.mod h1:YfEbZtqP4AetfO6d40vWchF3znWX7C7Vd6ZMfdL8z64= +github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g= +github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= -github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g= 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.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= -github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= 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/c-kzg-4844 v0.4.0 h1:3MS1s4JtA868KpJxroZoepdV0ZKBp3u/O5HcZ7R3nlY= -github.com/ethereum/c-kzg-4844 v0.4.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= -github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +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.20240829091221-dffa7562dbe9 h1:8NfxH2iXvJ60YRB8ChToFTUzl8awsc3cJ8CbLjGIl/A= +github.com/ethereum/go-verkle v0.1.1-0.20240829091221-dffa7562dbe9/go.mod h1:M3b90YRnzqKyyzBEWJGqj8Qff4IDeXnzFw0P9bFw3uk= +github.com/ethereum/hive/hiveproxy v0.0.0-20240808014330-625b82294b46 h1:paQKR+EGmEwr9viJoSgC0gOW4YPBRvrD5tPKn6CNRD8= +github.com/ethereum/hive/hiveproxy v0.0.0-20240808014330-625b82294b46/go.mod h1:H5dh/7x2Mf5SR7cKLXDZLWRMtolNhvb3uKR1Gy3aF60= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -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/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= -github.com/francoispqt/gojay v1.2.13 h1:d2m3sFjloqoIUQU3TsHBgj6qg/BVGlTBeHDUmyJnXKk= -github.com/francoispqt/gojay v1.2.13/go.mod h1:ehT5mTG4ua4581f1++1WLG0vPdaA9HaiDsoyrBGkyDY= -github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= -github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= -github.com/frankban/quicktest v1.7.2/go.mod h1:jaStnuzAqU1AJdCO0l53JDCJrVDKcS03DbaAcR7Ks/o= 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/garyburd/redigo v1.6.0/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY= +github.com/fsouza/go-dockerclient v1.11.0 h1:4ZAk6W7rPAtPXm7198EFqA5S68rwnNQORxlOA5OurCA= +github.com/fsouza/go-dockerclient v1.11.0/go.mod h1:0I3TQCRseuPTzqlY4Y3ajfsg2VAdMQoazrkxJTiJg8s= 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/gliderlabs/ssh v0.1.1/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= -github.com/gliderlabs/ssh v0.3.7 h1:iV3Bqi942d9huXnzEF2Mt+CY9gLu8DNM4Obd+8bODRE= -github.com/gliderlabs/ssh v0.3.7/go.mod h1:zpHEXBstFnQYtGnB8k8kQLol82umzn/2/snG7alWVD8= -github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= +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/gliderlabs/ssh v0.3.8 h1:a4YXD1V7xMF9g5nTkdfnja3Sxy1PVDCj1Zg4Wb8vY6c= +github.com/gliderlabs/ssh v0.3.8/go.mod h1:xYoytBv1sV0aL3CavoDuJIQNURXkkfPA/wxQ1pL1fAU= 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-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 h1:+zs/tPmkDkHx3U66DAb0lQFJrpS6731Oaa12ikc+DiI= github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376/go.mod h1:an3vInlBmSxCcxctByoQdvwPiA7DTK7jaaFDBTtu0ic= -github.com/go-git/go-billy/v5 v5.5.0 h1:yEY4yhzCDuMGSv83oGxiBotRzhwhNr8VZyphhiu+mTU= -github.com/go-git/go-billy/v5 v5.5.0/go.mod h1:hmexnoNsr2SJU1Ju67OaNz5ASJY3+sHgFRpCtpDCKow= +github.com/go-git/go-billy/v5 v5.6.1 h1:u+dcrgaguSSkbjzHwelEjc0Yj300NUevrrPphk/SoRA= +github.com/go-git/go-billy/v5 v5.6.1/go.mod h1:0AsLr1z2+Uksi4NlElmMblP5rPcDZNRCD8ujZCRR2BE= github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399 h1:eMje31YglSBqCdIqdhKBW8lokaMrL3uTkpGYlE2OOT4= github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399/go.mod h1:1OCfN199q1Jm3HZlxleg+Dw/mwps2Wbk9frAWm+4FII= -github.com/go-git/go-git/v5 v5.12.0 h1:7Md+ndsjrzZxbddRDZjF14qK+NN56sy6wkqaVrjZtys= -github.com/go-git/go-git/v5 v5.12.0/go.mod h1:FTM9VKtnI2m65hNI/TenDDDnUf2Q9FHnXYjuz9i5OEY= -github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -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/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o= -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.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-git/go-git/v5 v5.13.1 h1:DAQ9APonnlvSWpvolXWIuV6Q6zXy2wHbN4cVlNR5Q+M= +github.com/go-git/go-git/v5 v5.13.1/go.mod h1:qryJB4cSBoq3FRoBRf5A77joojuBcmPJ0qu3XXXVixc= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/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-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY= github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= +github.com/go-openapi/jsonpointer v0.19.6 h1:eCs3fxoIi3Wh6vtgmLTOjdhSpiqphQ+DaPn38N2ZdrE= +github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs= github.com/go-openapi/jsonreference v0.19.6/go.mod h1:diGHMEHg2IqXZGKxqyvWdfWU/aim5Dprw5bqpKkTvns= -github.com/go-openapi/jsonreference v0.20.0 h1:MYlu0sBgChmCfJxxUKZ8g1cPWFOB37YSZqewK7OKeyA= -github.com/go-openapi/jsonreference v0.20.0/go.mod h1:Ag74Ico3lPc+zR+qjn4XBUmXymS4zJbYVCZmcgkasdo= +github.com/go-openapi/jsonreference v0.20.2 h1:3sVjiK66+uXK/6oQ8xgcRKcFgQ5KXa2KvnJRumpMGbE= +github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= github.com/go-openapi/spec v0.20.4 h1:O8hJrt0UMnhHcluhIdUgCLRWyM2x7QkBXRvOs7m+O1M= github.com/go-openapi/spec v0.20.4/go.mod h1:faYFR1CvsJZ0mNsmsphTMSoRrNV3TEDoAM7FOEWeq8I= github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.15 h1:D2NRCBzS9/pEY3gP9Nl8aDqGUcPFrwG2p+CNFrLyrCM= github.com/go-openapi/swag v0.19.15/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= +github.com/go-openapi/swag v0.22.3 h1:yMBqmnQ0gyZvEb/+KzuWZOXgllrXT4SADYbvDaXHv/g= +github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= @@ -383,227 +233,115 @@ github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91 github.com/go-playground/validator/v10 v10.4.0/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4= github.com/go-playground/validator/v10 v10.13.0 h1:cFRQdfaSMCOSfGCCLB20MHvuoHb/s5G8L5pu2ppK5AQ= github.com/go-playground/validator/v10 v10.13.0/go.mod h1:dwu7+CG8/CtBiJFZDz4e+5Upb6OLw04gtBYw0mcG/z4= -github.com/go-resty/resty/v2 v2.7.0 h1:me+K9p3uhSmXtrBZ4k9jcEAfJmuC8IivWHwaLZwPrFY= -github.com/go-resty/resty/v2 v2.7.0/go.mod h1:9PWDzw47qPphMRFfhsyk0NnSgvluHcljSMVIq3w7q0I= -github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= +github.com/go-resty/resty/v2 v2.16.2 h1:CpRqTjIzq/rweXUt9+GxzzQdlkqMdt8Lm/fuK/CAbAg= +github.com/go-resty/resty/v2 v2.16.2/go.mod h1:0fHAoK7JoBy/Ch36N8VFeMsK7xQOHhvWaC3iOktwmIU= github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y= github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/go-stack/stack v1.8.1 h1:ntEHSVwIt7PNXNpgPmVfMrNhLtgjlmnZha2kOpuRiDw= +github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP3XYfe4= 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/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/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= -github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= -github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= 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 v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY= -github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= github.com/golang-jwt/jwt/v4 v4.4.3/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= -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-jwt/jwt/v4 v4.5.1 h1:JdqV9zKUdtaa9gdPlywC3aeoEsR681PlKC+4F5gQgeo= +github.com/golang-jwt/jwt/v4 v4.5.1/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk= +github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 h1:au07oEsX2xN0ktxqI+Sida1w446QrXBRJ0nee3SNZlA= github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= github.com/golang-sql/sqlexp v0.1.0 h1:ZCD6MBpcuOVfGVqsEmY5/4FtYiKz6tSyUv9LPEDei6A= github.com/golang-sql/sqlexp v0.1.0/go.mod h1:J4ad9Vo8ZCWQ2GMrC4UCQy1JpCbwU9m3EOqtpKwwwHI= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.2.0 h1:uCdmnmatrKCgMBlM4rMuJZWOkPDqdbZPnrMXDY4gI68= -github.com/golang/glog v1.2.0/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= -github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -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/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:tluoj9z5200jBnyusfRPU2LqT6J+DAorxEvtC7LHB+E= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= -github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= -github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= 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.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= 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.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= github.com/golang/protobuf v1.5.2/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.1/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= github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/gomarkdown/markdown v0.0.0-20231222211730-1d6d20845b47 h1:k4Tw0nt6lwro3Uin8eqoET7MDA4JnT8YgbCjc/g5E3k= github.com/gomarkdown/markdown v0.0.0-20231222211730-1d6d20845b47/go.mod h1:JDGcbDT52eL4fju3sZ4TeHGsQwhG9nbDV21aMyhwPoA= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/gnostic v0.5.7-v3refs h1:FhTMOKj2VhjpouxvWJAV1TL304uMlb9zcDqkl6cEI54= -github.com/google/gnostic v0.5.7-v3refs/go.mod h1:73MKFl6jIHelAJNaBGFzt3SPtZULs9dYrGFt8OiIsHQ= +github.com/google/flatbuffers v1.12.1/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= +github.com/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I= +github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U= 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.4.1/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.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.2/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.4/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.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= 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/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ= -github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.2.1-0.20220503160820-4a35382e8fc8 h1:Ep/joEub9YwcjRY6ND3+Y/w0ncE540RtGatVhtZL0/Q= github.com/google/gofuzz v1.2.1-0.20220503160820-4a35382e8fc8/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gopacket v1.1.19 h1:ves8RnFZPGiFnTS0uPQStjwru6uO6h+nlr9j6fL7kF8= -github.com/google/gopacket v1.1.19/go.mod h1:iJ8V8n6KS+z2U1A8pUwu8bW5SyEMkXJB8Yo/Vo+TKTo= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -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/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.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0/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= -github.com/googleapis/gax-go/v2 v2.0.3/go.mod h1:LLvjysVCY1JZeum8Z6l8qUty8fiNwE08qbEPm1M08qg= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= github.com/gorilla/css v1.0.0 h1:BQqNyPTi50JCFMTw/b67hByjMVXZRwGha6wxVGkeihY= github.com/gorilla/css v1.0.0/go.mod h1:Dn721qIggHpt4+EFCcTLTU/vk5ySda2ReITrtgBl60c= -github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= -github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= -github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= -github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= +github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= +github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= github.com/gorilla/rpc v1.2.1 h1:yC+LMV5esttgpVvNORL/xX4jvTTEUE30UZhZ5JF7K9k= github.com/gorilla/rpc v1.2.1/go.mod h1:uNpOihAlF5xRFLuTYhfR0yfCTm0WTQSQttkMSptRfGk= -github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= 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/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= -github.com/grpc-ecosystem/grpc-gateway v1.5.0/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw= -github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +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/grpc-ecosystem/grpc-gateway/v2 v2.16.0 h1:YBftPWNWd4WwGqtY2yeZL2ef8rHAxPBD8KFhJpmcqms= github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0/go.mod h1:YN5jB8ie0yfIUg6VvR9Kz84aCaG7AsGZnLjhHbUqwPg= -github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= -github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= -github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= 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/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= -github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= -github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= -github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d h1:dg1dEPuWpEqDnvIw251EVy4zlP8gWbsGj4BsUKCRpYs= github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= 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/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= -github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= -github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= -github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= +github.com/hashicorp/yamux v0.1.1 h1:yrQxtgseBDrq9Y652vSRDvsKCJKOUD+GzTS4Y0Y8pvE= +github.com/hashicorp/yamux v0.1.1/go.mod h1:CtWFDAQgb7dxtzFs4tWbplKIe2jSi3+5vKbgIO0SLnQ= github.com/herumi/bls-eth-go-binary v0.0.0-20210917013441-d37c07cfda4e h1:wCMygKUQhmcQAjlk2Gquzq6dLmyMv2kF+llRspoRgrk= github.com/herumi/bls-eth-go-binary v0.0.0-20210917013441-d37c07cfda4e/go.mod h1:luAnRm3OsMQeokhGzpYmc0ZKwawY7o87PUEP11Z7r7U= 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.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/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= github.com/huin/goupnp v1.3.0 h1:UvLUlWDNpoUdYzb2TCn+MuTWtcjXKSza2n6CBdQ0xXc= github.com/huin/goupnp v1.3.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= github.com/iancoleman/strcase v0.1.3/go.mod h1:SK73tn/9oHe+/Y0h39VT4UCxmurVJkR5NA7kMEAOgSE= github.com/iancoleman/strcase v0.2.0 h1:05I4QRnGpI0m37iZQRuskXh+w77mr6Z41lwQzuHLwW0= github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= -github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= -github.com/ipfs/go-cid v0.4.1 h1:A/T3qGvxi4kpKWWcPC/PgbvDA2bjVLO7n4UeVwnbs/s= -github.com/ipfs/go-cid v0.4.1/go.mod h1:uQHwDeX4c6CtyrFwdqyhpNcxVewur1M7l7fNU7LKwZk= -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/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= -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/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/v2 v2.2.1 h1:RhxXJtFG022u4ibrCSMSiu5aOq1i77R3OHKNJj77OAk= -github.com/jackc/puddle/v2 v2.2.1/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= +github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 h1:iCEnooe7UlwOQYpKFhBabPMi4aNAfoODPEFNiAnClxo= +github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= +github.com/jackc/pgx/v5 v5.7.1 h1:x7SYsPBYDkHDksogeSmZZ5xzThcTgRz++I5E+ePFUcs= +github.com/jackc/pgx/v5 v5.7.1/go.mod h1:e7O26IywZZ+naJtWWos6i6fvWK+29etgITqrqHLfoZA= +github.com/jackc/puddle/v2 v2.2.2 h1:PR8nw+E/1w0GLuRFSmiioY6UooMp6KJv0/61nB7icHo= +github.com/jackc/puddle/v2 v2.2.2/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-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= -github.com/jbenet/go-temp-err-catcher v0.1.0 h1:zpb3ZH6wIE8Shj2sKS+khgRvf7T7RABoLk/+KKHggpk= -github.com/jbenet/go-temp-err-catcher v0.1.0/go.mod h1:0kJRvmDZXNMIiJirNPEYfhpPwbGVtZVWC34vc5WLsDk= -github.com/jcmturner/gofork v1.0.0/go.mod h1:MK8+TM0La+2rjBD4jE12Kj1pCCxK7d2LK/UM3ncEo0o= -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= @@ -611,71 +349,44 @@ github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkr github.com/jinzhu/now v1.1.1/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= -github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= -github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= -github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= 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.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= -github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= -github.com/k0kubun/go-ansi v0.0.0-20180517002512-3bf9e2903213 h1:qGQQKEcAR99REcMpsXCp3lJ03zYT1PkRd3kQGPn9GVg= -github.com/k0kubun/go-ansi v0.0.0-20180517002512-3bf9e2903213/go.mod h1:vNUNkEQ1e29fT/6vq2aBdFsgNPmy8qMdSay1npru+Sw= github.com/kevinburke/ssh_config v1.2.0 h1:x584FjTGwHzMwvHx18PXxbBVzfnxogHaAReU4gf13a4= github.com/kevinburke/ssh_config v1.2.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= -github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= -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.9.8/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/compress v1.10.1/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.11.8/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.11.12/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= -github.com/klauspost/compress v1.17.6 h1:60eq2E/jlfwQXtvZEeBUYADs+BwKBWURIY+Gj2eRGjI= -github.com/klauspost/compress v1.17.6/go.mod h1:/dCuZOvVtNoHsyb+cuJD3itjs3NbnF6KH9zAO4BDxPM= -github.com/klauspost/cpuid v1.2.3/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= -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/reedsolomon v1.9.3/go.mod h1:CwCi+NUr9pqSVktrkN+Ondf06rkhYZ/pcNv7fu+8Un4= +github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc= +github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= +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/konsorten/go-windows-terminal-sequences v1.0.3/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/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= 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/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/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-contrib v0.17.1 h1:7I/he7ylVKsDUieaGRZ9XxxTYOjfQwVzHzUYrNykfCU= -github.com/labstack/echo-contrib v0.17.1/go.mod h1:SnsCZtwHBAZm5uBSAtQtXQHI3wqEA73hvTn0bYMKnZA= +github.com/labstack/echo-contrib v0.17.2 h1:K1zivqmtcC70X9VdBFdLomjPDEVHlrcAObqmuFj1c6w= +github.com/labstack/echo-contrib v0.17.2/go.mod h1:NeDh3PX7j/u+jR4iuDt1zHmWZSCz9c/p9mxXcDpyS8E= +github.com/labstack/echo-jwt/v4 v4.3.0 h1:8JcvVCrK9dRkPx/aWY3ZempZLO336Bebh4oAtBcxAv4= +github.com/labstack/echo-jwt/v4 v4.3.0/go.mod h1:OlWm3wqfnq3Ma8DLmmH7GiEAz2S7Bj23im2iPMEAR+Q= github.com/labstack/echo/v4 v4.0.0/go.mod h1:tZv7nai5buKSg5h/8E6zz4LsD/Dqh9/91Mvs7Z5Zyno= github.com/labstack/echo/v4 v4.1.15/go.mod h1:GWO5IBVzI371K8XJe50CSvHjQCafK6cw8R/moLhEU6o= -github.com/labstack/echo/v4 v4.12.0 h1:IKpw49IMryVB2p1a4dzwlhP1O2Tf2E0Ir/450lH+kI0= -github.com/labstack/echo/v4 v4.12.0/go.mod h1:UP9Cr2DJXbOK3Kr9ONYzNowSh7HP0aG0ShAyycHSJvM= +github.com/labstack/echo/v4 v4.13.3 h1:pwhpCPrTl5qry5HRdM5FwdXnhXSLSY+WE+YQSeCaafY= +github.com/labstack/echo/v4 v4.13.3/go.mod h1:o90YNEeQWjDozo584l7AwhJMHN0bOC4tAfg+Xox9q5g= github.com/labstack/gommon v0.2.8/go.mod h1:/tj9csK2iPSBvn+3NLM9e52usepMtrd5ilFYA+wQNJ4= github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= github.com/labstack/gommon v0.4.2 h1:F8qTUNXgG1+6WQmqoUWnz8WiEU60mXVVw0P4ht1WRA0= @@ -685,107 +396,46 @@ github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2 github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= github.com/leodido/go-urn v1.2.3 h1:6BE2vPT0lqoz3fmOesHZiaiFh7889ssCo2GMvLCfiuA= github.com/leodido/go-urn v1.2.3/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4= -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-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.1 h1:wy1J4kZIZxOaej6NveTWCZmHiJ/kY7GoAqXgqNCnPps= -github.com/libp2p/go-libp2p v0.32.1/go.mod h1:hXXC3kXPlBZ1eu8Q2hptGrMB4mZ3048JUoS4EKaHW5c= -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-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= -github.com/libp2p/go-mplex v0.7.0/go.mod h1:rW8ThnRcYWft/Jb2jeORBmPd6xuG3dGxWN/W168L9EU= -github.com/libp2p/go-msgio v0.3.0 h1:mf3Z8B1xcFN314sWX+2vOTShIE0Mmn2TXn3YCUQGNj0= -github.com/libp2p/go-msgio v0.3.0/go.mod h1:nyRM819GmVaF9LX3l03RMh10QdOroF++NBbxAb0mmDM= -github.com/libp2p/go-nat v0.2.0 h1:Tyz+bUFAYqGyJ/ppPPymMGbIgNRH+WqC5QrT5fKrrGk= -github.com/libp2p/go-nat v0.2.0/go.mod h1:3MJr+GRpRkyT65EpVPBstXLvOlAPzUVlG6Pwg9ohLJk= -github.com/libp2p/go-netroute v0.2.1 h1:V8kVrpD8GK0Riv15/7VN6RbUQ3URNZVosw7H2v9tksU= -github.com/libp2p/go-netroute v0.2.1/go.mod h1:hraioZr0fhBjG0ZRXJJ6Zj2IVEVNx6tDTFQfSmcq7mQ= -github.com/libp2p/go-reuseport v0.4.0 h1:nR5KU7hD0WxXCJbmw7r2rhRYruNRl2koHw8fQscQm2s= -github.com/libp2p/go-reuseport v0.4.0/go.mod h1:ZtI03j/wO5hZVDFo2jKywN6bYKWLOy8Se6DrI2E1cLU= -github.com/libp2p/go-yamux/v4 v4.0.1 h1:FfDR4S1wj6Bw2Pqbc8Uz7pCxeRBPbwsBbEdfwiCypkQ= -github.com/libp2p/go-yamux/v4 v4.0.1/go.mod h1:NWjl8ZTLOGlozrXSOZ/HlfG++39iKNnM5wwmtQP1YB4= -github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= -github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= -github.com/logrusorgru/aurora v2.0.3+incompatible h1:tOpm7WcpBTn4fjmVfgpQq0EfczGlG91VSDkswnjF5A8= -github.com/logrusorgru/aurora v2.0.3+incompatible/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= +github.com/lithammer/dedent v1.1.0 h1:VNzHMVCBNG1j0fh3OrsFRkVUwStdDArbgBWoPAffktY= +github.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z9BP0jIOc= github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4= github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= -github.com/lunixbochs/vtclean v1.0.0/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI= -github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= -github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -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/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= 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.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= -github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= 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= -github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= 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.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= 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/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U= +github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/mattn/go-sqlite3 v1.14.5/go.mod h1:WVKg1VTActs4Qso6iwGbiFih2UIHo0ENGwNd0Lj+XmI= github.com/mattn/go-sqlite3 v1.14.15 h1:vfoHhTN1af61xCRSWzFIWzx2YskyMTwHLrExkBOjvxI= github.com/mattn/go-sqlite3 v1.14.15/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= -github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= -github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= github.com/mfridman/interpolate v0.0.2 h1:pnuTK7MQIxxFz1Gr+rjSIx9u7qVjf5VOoM/u6BbAxPY= github.com/mfridman/interpolate v0.0.2/go.mod h1:p+7uk6oE07mpE/Ik1b8EckO0O4ZXiGAfshKBWLUM9Xg= -github.com/microcosm-cc/bluemonday v1.0.1/go.mod h1:hsXNsILzKxV+sX77C5b8FSuKF00vh2OMYv+xgHpAMF4= github.com/microcosm-cc/bluemonday v1.0.4/go.mod h1:8iwZnFn2CDDNZ0r6UXhF4xawGvzaqzCRa1n3/lO3W2w= github.com/microcosm-cc/bluemonday v1.0.26 h1:xbqSvqzQMeEHCqMi64VAs4d8uy6Mequs3rQ0k/Khz58= github.com/microcosm-cc/bluemonday v1.0.26/go.mod h1:JyzOCs9gkyQyjs+6h10UEVSe02CGwkhd72Xdqh78TWs= -github.com/microsoft/go-mssqldb v1.7.0 h1:sgMPW0HA6Ihd37Yx0MzHyKD726C2kY/8KJsQtXHNaAs= -github.com/microsoft/go-mssqldb v1.7.0/go.mod h1:kOvZKUdrhhFQmxLZqbwUV0rHkNkZpthMITIb2Ko1IoA= -github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -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/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= -github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b/go.mod h1:lxPUiZwKoFL8DUUmalo2yJJUCxbPKtm8OKfqr2/FTNU= -github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc h1:PTfri+PuQmWDqERdnNMiD9ZejrlswWrCpBEZgWOiTrc= -github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc/go.mod h1:cGKTAVKx4SxOuR/czcZ/E2RSJ3sfHs8FpHhQ5CWMf9s= -github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ= +github.com/microsoft/go-mssqldb v1.8.0 h1:7cyZ/AT7ycDsEoWPIXibd+aVKFtteUNhDGf3aobP+tw= +github.com/microsoft/go-mssqldb v1.8.0/go.mod h1:6znkekS3T2vp0waiMhen4GPU1BiAsrP+iXHcE7a7rFo= github.com/minio/highwayhash v1.0.2 h1:Aak5U0nElisjDCfPSG79Tgzkn2gl66NxOMspRrKnA/g= github.com/minio/highwayhash v1.0.2/go.mod h1:BQskDq+xkJ12lmlUUi7U0M5Swg3EWR+dLTk+kldvVxY= -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= -github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= -github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db h1:62I3jR2EmQ4l5rM/4FEfDWcRD+abF5XlKShorW5LRoQ= -github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db/go.mod h1:l0dey0ia/Uv7NcFFVbCLtqEBQbrT4OCwCSKTEv6enCw= -github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= -github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= -github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= -github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= @@ -794,6 +444,8 @@ github.com/mitchellh/pointerstructure v1.2.1/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8oh 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/moby/docker-image-spec v1.3.1 h1:jMKff3w6PgbfSa69GfNg+zN/XLhfXJGnEx3Nl2EsFP0= +github.com/moby/docker-image-spec v1.3.1/go.mod h1:eKmb5VW8vQEh/BAr2yvVNvuiJuY6UIocYsFu/DxxRpo= github.com/moby/patternmatcher v0.6.0 h1:GmP9lR19aU5GqSSFko+5pRqHi+Ohk1O69aFiKkVGiPk= github.com/moby/patternmatcher v0.6.0/go.mod h1:hDPoyOpDY7OrrMDLaYoY3hf52gNCR/YOUYxkhApJIxc= github.com/moby/sys/sequential v0.5.0 h1:OPvI35Lzn9K04PBbCLW0g4LcFAJgHsvXsRyewg5lXtc= @@ -805,8 +457,6 @@ github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3 github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 h1:RWengNIwukTxcDr9M+97sNutRR1RKhG96O6jWumTTnw= @@ -815,50 +465,12 @@ github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= github.com/morkid/gocache v1.0.0 h1:hTnU78Dqp2vs9al5vJC2TmmMF+Hm3nDH1AgRBjSXE+0= github.com/morkid/gocache v1.0.0/go.mod h1:xK+hmoEMjYffIBvjn7DE8WfSd/rF5Kz/G9f20OliMJY= -github.com/morkid/paginate v1.1.7 h1:qgU1qLhYxlckJ11CoUn7tQpT4k5SmWTTa1NpdSNbShg= -github.com/morkid/paginate v1.1.7/go.mod h1:1VCx2ARlAVEv2Yd+YHTGRMs0Gacvi75dCrPidrmPq5g= -github.com/mr-tron/base58 v1.1.2/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= -github.com/mr-tron/base58 v1.2.0 h1:T/HDJBh4ZCPbU39/+c3rRvE0uKBQlU27+QI8LJ4t64o= -github.com/mr-tron/base58 v1.2.0/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= -github.com/multiformats/go-base32 v0.1.0 h1:pVx9xoSPqEIQG8o+UbAe7DNi51oej1NtK+aGkbLYxPE= -github.com/multiformats/go-base32 v0.1.0/go.mod h1:Kj3tFY6zNr+ABYMqeUNeGvkIC/UYgtWibDcT0rExnbI= -github.com/multiformats/go-base36 v0.2.0 h1:lFsAbNOGeKtuKozrtBsAkSVhv1p9D0/qedU9rQyccr0= -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.3 h1:hVBXvPRcKG0w80VinQ23P5t7czWgg65BmIvQKjDydU8= -github.com/multiformats/go-multiaddr v0.12.3/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= -github.com/multiformats/go-multiaddr-fmt v0.1.0/go.mod h1:hGtDIW4PU4BqJ50gW2quDuPVjyWNZxToGUh/HwTZYJo= -github.com/multiformats/go-multibase v0.2.0 h1:isdYCVLvksgWlMW9OZRYJEa9pZETFivncJHmHnnd87g= -github.com/multiformats/go-multibase v0.2.0/go.mod h1:bFBZX4lKCA/2lyOFSAoKH5SS6oPyjtnzK/XTFDPkNuk= -github.com/multiformats/go-multicodec v0.9.0 h1:pb/dlPnzee/Sxv/j4PmkDRxCOi3hXTz3IbPKOXWJkmg= -github.com/multiformats/go-multicodec v0.9.0/go.mod h1:L3QTQvMIaVBkXOXXtVmYE+LI16i14xuaojr/H7Ai54k= -github.com/multiformats/go-multihash v0.0.8/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa63epEDmG8nTduyAew= -github.com/multiformats/go-multihash v0.2.3 h1:7Lyc8XfX/IY2jWb/gI7JP+o7JEq9hOa7BFvVU9RSh+U= -github.com/multiformats/go-multihash v0.2.3/go.mod h1:dXgKXCXjBzdscBLk9JkjINiEsCKRVch90MdaGiKsvSM= -github.com/multiformats/go-multistream v0.5.0 h1:5htLSLl7lvJk3xx3qT/8Zm9J4K8vEOf/QGkvOGQAyiE= -github.com/multiformats/go-multistream v0.5.0/go.mod h1:n6tMZiwiP2wUsR8DgfDWw1dydlEqV3l6N3/GBsX6ILA= -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/morkid/paginate v1.1.8 h1:nAk+ZIzSAjFdCeOFdH5j+xq2ipiuXKySsY3/DthVELQ= +github.com/morkid/paginate v1.1.8/go.mod h1:dmJDIOQirmfa03fH7M4neVRfl7xQth11OQdFT5e+4bY= 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/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= -github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU= -github.com/nats-io/nats-server/v2 v2.1.2/go.mod h1:Afk+wRZqkMQs/p45uXdrVLuab3gwv3Z8C4HTBu8GD/k= -github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= -github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= -github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= -github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= github.com/ncruces/go-strftime v0.1.9 h1:bY0MQC28UADQmHmaF5dgpLmImcShSi2kHU9XLdhx/f4= github.com/ncruces/go-strftime v0.1.9/go.mod h1:Fwc5htZGVVkseilnfgOVb9mKy6w1naJmn9CehxcKcls= -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/neko-neko/echo-logrus/v2 v2.0.1 h1:BX2U6uv2N3UiUY75y+SntQak5S1AJIel9j+5Y6h4Nb4= github.com/neko-neko/echo-logrus/v2 v2.0.1/go.mod h1:GDYWo9CY4VXk/vn5ac5reoutYEkZEexlFI01MzHXVG0= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= @@ -866,173 +478,83 @@ github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI 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/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= -github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= -github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= 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.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.10.1/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/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= 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/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/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.0/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/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= -github.com/openconfig/gnmi v0.0.0-20190823184014-89b2bf29312c/go.mod h1:t+O9It+LKzfOAhKTT5O0ehDix+MTqbtT0T9t+7zzOvc= -github.com/openconfig/reference v0.0.0-20190727015836-8dfd928c9696/go.mod h1:ym2A+zigScwkSEb/cVQB0/ZMpU3rqiH6X7WRRsxgOGw= +github.com/onsi/gomega v1.34.1 h1:EUMJIKUjM8sKjYbtxQI9A4z2o+rruxnzNvpknOXie6k= +github.com/onsi/gomega v1.34.1/go.mod h1:kU1QgUvBDLXBJq618Xvm2LUX6rSAfRaFRTcdOeDLwwY= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQb2IpWsCzug= github.com/opencontainers/image-spec v1.1.0/go.mod h1:W4s4sFTMaBeK1BQLXbG4AdM2szdn85PY75RI83NrTrM= -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/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis= -github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= -github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5/go.mod h1:/wsWhb9smxSfWAKL3wpBW7V8scJMt8N8gnaMCS9E/cA= -github.com/openzipkin/zipkin-go v0.1.1/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTmOf0Erfk+hxe8= -github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= -github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= -github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= -github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM= -github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/patrickmn/go-cache v2.1.0+incompatible h1:HRMgzkcYKYpi3C8ajMPV8OFXaaRUnok+kx1WdO15EQc= github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= -github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 h1:onHthvaw9LFnH4t2DcNVpwGmV9E1BkGknEliJkfwQj0= -github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58/go.mod h1:DXv8WO4yhMYhSNPKjeNKa5WY9YCIEBRbNzFFPJbWO6Y= -github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= -github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= github.com/phayes/freeport v0.0.0-20220201140144-74d24b5ae9f5 h1:Ii+DKncOVM8Cu1Hc+ETb5K+23HdAMvESYE3ZJ5b5cMI= github.com/phayes/freeport v0.0.0-20220201140144-74d24b5ae9f5/go.mod h1:iIss55rKnNBTvrwdmkUpLnDpZoAHvWaiq5+iMmen4AE= -github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= -github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= -github.com/pierrec/lz4 v2.4.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/pjbgf/sha1cd v0.3.0 h1:4D5XXmUUBUl/xQ6IjCkEAbqXskkq/4O7LmGn0AqMDs4= github.com/pjbgf/sha1cd v0.3.0/go.mod h1:nZ1rrWOcGJ5uZgEEVL1VUM9iRQiZvWdbZjkKyFzPPsI= 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= 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.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= -github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= -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/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= +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/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw= github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= -github.com/pressly/goose/v3 v3.20.0 h1:uPJdOxF/Ipj7ABVNOAMJXSxwFXZGwMGHNqjC8e61VA0= -github.com/pressly/goose/v3 v3.20.0/go.mod h1:BRfF2GcG4FTG12QfdBVy3q1yveaf4ckL9vWwEcIO3lA= -github.com/prometheus/client_golang v0.8.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= -github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= -github.com/prometheus/client_golang v1.4.1/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= -github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= -github.com/prometheus/client_golang v1.9.0/go.mod h1:FqZLKOZnGdFAhOK4nqGHa7D66IdsO+O441Eve7ptJDU= -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-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/pressly/goose/v3 v3.24.0 h1:sFbNms7Bd++2VMq6HSgDHDLWa7kHz1qXzPb3ZIU72VU= +github.com/pressly/goose/v3 v3.24.0/go.mod h1:rEWreU9uVtt0DHCyLzF9gRcWiiTF/V+528DV+4DORug= +github.com/prometheus/client_golang v1.20.5 h1:cxppBPuYhUnsO6yo/aoRol4L7q7UFfdm+bR9r+8l63Y= +github.com/prometheus/client_golang v1.20.5/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= 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.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= -github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= -github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= -github.com/prometheus/common v0.15.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= -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-20190117184657-bf6a532e95b1/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.0.10/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= -github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.13.0 h1:GqzLlQyfsPbaEHaQkO7tbDlriv/4o5Hudv6OXHGKX7o= -github.com/prometheus/procfs v0.13.0/go.mod h1:cd4PFCR54QLnGKPaKGA6l+cfuNXtht43ZKY6tow0Y1g= -github.com/prometheus/prom2json v1.3.0 h1:BlqrtbT9lLH3ZsOVhXPsHzFrApCTKRifB7gjJuypu6Y= -github.com/prometheus/prom2json v1.3.0/go.mod h1:rMN7m0ApCowcoDlypBHlkNbp5eJQf/+1isKykIP5ZnM= -github.com/prysmaticlabs/fastssz v0.0.0-20221107182844-78142813af44 h1:c3p3UzV4vFA7xaCDphnDWOjpxcadrQ26l5b+ypsvyxo= -github.com/prysmaticlabs/fastssz v0.0.0-20221107182844-78142813af44/go.mod h1:MA5zShstUwCQaE9faGHgCGvEWUbG87p4SAXINhmCkvg= -github.com/prysmaticlabs/go-bitfield v0.0.0-20210809151128-385d8c5e3fb7 h1:0tVE4tdWQK9ZpYygoV7+vS6QkDvQVySboMVEIxBJmXw= -github.com/prysmaticlabs/go-bitfield v0.0.0-20210809151128-385d8c5e3fb7/go.mod h1:wmuf/mdK4VMD+jA9ThwcUKjg3a2XWM9cVfFYjDyY4j4= -github.com/prysmaticlabs/gohashtree v0.0.3-alpha h1:1EVinCWdb3Lorq7xn8DYQHf48nCcdAM3Vb18KsFlRWY= -github.com/prysmaticlabs/gohashtree v0.0.3-alpha/go.mod h1:4pWaT30XoEx1j8KNJf3TV+E3mQkaufn7mf+jRNb/Fuk= -github.com/prysmaticlabs/prombbolt v0.0.0-20210126082820-9b7adba6db7c h1:9PHRCuO/VN0s9k+RmLykho7AjDxblNYI5bYKed16NPU= -github.com/prysmaticlabs/prombbolt v0.0.0-20210126082820-9b7adba6db7c/go.mod h1:ZRws458tYHS/Zs936OQ6oCrL+Ict5O4Xpwve1UQ6C9M= +github.com/prometheus/common v0.61.0 h1:3gv/GThfX0cV2lpO7gkTUwZru38mxevy90Bj8YFSRQQ= +github.com/prometheus/common v0.61.0/go.mod h1:zr29OCN/2BsJRaFwG8QOBr41D6kkchKbpeNH7pAjb/s= +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/prysmaticlabs/fastssz v0.0.0-20241008181541-518c4ce73516 h1:xuVAdtz5ShYblG2sPyb4gw01DF8InbOI/kBCQjk7NiM= +github.com/prysmaticlabs/fastssz v0.0.0-20241008181541-518c4ce73516/go.mod h1:h2OlIZD/M6wFvV3YMZbW16lFgh3Rsye00G44J2cwLyU= +github.com/prysmaticlabs/go-bitfield v0.0.0-20240328144219-a1caa50c3a1e h1:ATgOe+abbzfx9kCPeXIW4fiWyDdxlwHw07j8UGhdTd4= +github.com/prysmaticlabs/go-bitfield v0.0.0-20240328144219-a1caa50c3a1e/go.mod h1:wmuf/mdK4VMD+jA9ThwcUKjg3a2XWM9cVfFYjDyY4j4= +github.com/prysmaticlabs/gohashtree v0.0.4-beta.0.20240624100937-73632381301b h1:VK7thFOnhxAZ/5aolr5Os4beiubuD08WiuiHyRqgwks= +github.com/prysmaticlabs/gohashtree v0.0.4-beta.0.20240624100937-73632381301b/go.mod h1:HRuvtXLZ4WkaB1MItToVH2e8ZwKwZPY5/Rcby+CvvLY= github.com/prysmaticlabs/protoc-gen-go-cast v0.0.0-20230228205207-28762a7b9294 h1:q9wE0ZZRdTUAAeyFP/w0SwBEnCqlVy2+on6X2/e+eAU= github.com/prysmaticlabs/protoc-gen-go-cast v0.0.0-20230228205207-28762a7b9294/go.mod h1:ZVEbRdnMkGhp/pu35zq4SXxtvUwWK0J1MATtekZpH2Y= -github.com/prysmaticlabs/prysm/v4 v4.2.0 h1:87QoRT3Azs7c1Y6SnIq0+CNtQRbAt0sVKGj2OxRT1Rw= -github.com/prysmaticlabs/prysm/v4 v4.2.0/go.mod h1:PQrQtHJeeqTz4K3udN/EX1Gs2xhWR4j93gSj0OQZ1f4= -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/prysmaticlabs/prysm/v5 v5.2.0 h1:JqKKK5aqehZN9GiSOSSw4M57NpbvG0nIxqFK5KpPnRw= +github.com/prysmaticlabs/prysm/v5 v5.2.0/go.mod h1:cQc+NIMKaHjPvY566HsYcuni763nzuUWnDsDbk45bbs= github.com/rabbitmq/amqp091-go v1.10.0 h1:STpn5XsHlHGcecLmMFCtg7mqq0RnD+zFr4uzukfVhBw= github.com/rabbitmq/amqp091-go v1.10.0/go.mod h1:Hy4jKW5kQART1u+JkDTF9YYOQUHXqMuhrgxOEeS7G4o= -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/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= -github.com/rcrowley/go-metrics v0.0.0-20190826022208-cac0b30c2563/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= 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/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= 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.9.0 h1:l9HGsTsHJcvW14Nk7J9KFz8bzeAWXn3CG6bgt7LsrAE= -github.com/rs/cors v1.9.0/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= -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/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= +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/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/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= -github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= -github.com/schollz/progressbar/v3 v3.3.4 h1:nMinx+JaEm/zJz4cEyClQeAw5rsYSB5th3xv+5lV6Vg= -github.com/schollz/progressbar/v3 v3.3.4/go.mod h1:Rp5lZwpgtYmlvmGo1FyDwXMqagyRBQYSDwzlP9QDu84= -github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 h1:n661drycOFuPLCN3Uc8sB6B/s6Z4t2xvBgU1htSHuq8= github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3/go.mod h1:A0bzQcvG0E7Rwjx0REVgAGH58e96+X0MeOfepqsbeW4= -github.com/sethvargo/go-retry v0.2.4 h1:T+jHEQy/zKJf5s95UkguisicE0zuF9y7+/vgz08Ocec= -github.com/sethvargo/go-retry v0.2.4/go.mod h1:1afjQuvh7s4gflMObvjLPaWgluLLyhA1wmVZ6KLpICw= +github.com/sethvargo/go-retry v0.3.0 h1:EEt31A35QhrcRZtrYFDTBg91cqZVnFL2navjDrah2SE= +github.com/sethvargo/go-retry v0.3.0/go.mod h1:mNX17F0C/HguQMyMyJxcnU471gOZGxCLyYaFyAZraas= 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/shirou/gopsutil/v3 v3.23.12 h1:z90NtUkp3bMtmICZKpC4+WaknU1eXtp5vtbQ11DgpE4= @@ -1043,59 +565,17 @@ github.com/shoenig/test v0.6.4 h1:kVTaSd7WLz5WZ2IaoM0RSzRsUD+m8wRR+5qvntpn4LU= github.com/shoenig/test v0.6.4/go.mod h1:byHiCGXqrVaflBLAMq/srcZIHynQPQgeyvkvXnjqq0k= github.com/shopspring/decimal v1.4.0 h1:bxl37RwXBklmTi0C79JfXCEBD1cqqHt0bbgBAGFp81k= github.com/shopspring/decimal v1.4.0/go.mod h1:gawqmDU56v4yIKSwfBSFip1HdCCXN8/+DMd9qYNcwME= -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= -github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk= -github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041/go.mod h1:N5mDOmsrJOB+vfqUK+7DmDyjhSLIIBnXo9lvZJj3MWQ= -github.com/shurcooL/gofontwoff v0.0.0-20180329035133-29b52fc0a18d/go.mod h1:05UtEgK5zq39gLST6uB0cf3NEHjETfB4Fgr3Gx5R9Vw= -github.com/shurcooL/gopherjslib v0.0.0-20160914041154-feb6d3990c2c/go.mod h1:8d3azKNyqcHP1GaQE/c6dDgjkgSx2BZ4IoEi4F1reUI= -github.com/shurcooL/highlight_diff v0.0.0-20170515013008-09bb4053de1b/go.mod h1:ZpfEhSmds4ytuByIcDnOLkTHGUI6KNqRNPDLHDk+mUU= -github.com/shurcooL/highlight_go v0.0.0-20181028180052-98c3abbbae20/go.mod h1:UDKB5a1T23gOMUJrI+uSuH0VRDStOiUVSjBTRDVBVag= -github.com/shurcooL/home v0.0.0-20181020052607-80b7ffcb30f9/go.mod h1:+rgNQw2P9ARFAs37qieuu7ohDNQ3gds9msbT2yn85sg= -github.com/shurcooL/htmlg v0.0.0-20170918183704-d01228ac9e50/go.mod h1:zPn1wHpTIePGnXSHpsVPWEktKXHr6+SS6x/IKRb7cpw= -github.com/shurcooL/httperror v0.0.0-20170206035902-86b7830d14cc/go.mod h1:aYMfkZ6DWSJPJ6c4Wwz3QtW22G7mf/PEgaB9k/ik5+Y= -github.com/shurcooL/httpfs v0.0.0-20171119174359-809beceb2371/go.mod h1:ZY1cvUeJuFPAdZ/B6v7RHavJWZn2YPVFQ1OSXhCGOkg= -github.com/shurcooL/httpgzip v0.0.0-20180522190206-b1c53ac65af9/go.mod h1:919LwcH0M7/W4fcZ0/jy0qGght1GIhqyS/EgWGH2j5Q= -github.com/shurcooL/issues v0.0.0-20181008053335-6292fdc1e191/go.mod h1:e2qWDig5bLteJ4fwvDAc2NHzqFEthkqn7aOZAOpj+PQ= -github.com/shurcooL/issuesapp v0.0.0-20180602232740-048589ce2241/go.mod h1:NPpHK2TI7iSaM0buivtFUc9offApnI0Alt/K8hcHy0I= -github.com/shurcooL/notifications v0.0.0-20181007000457-627ab5aea122/go.mod h1:b5uSkrEVM1jQUspwbixRBhaIjIzL2xazXp6kntxYle0= -github.com/shurcooL/octicon v0.0.0-20181028054416-fa4f57f9efb2/go.mod h1:eWdoE5JD4R5UVWDucdOPg1g2fqQRq78IQa9zlOV1vpQ= -github.com/shurcooL/reactions v0.0.0-20181006231557-f2e0b4ca5b82/go.mod h1:TCR1lToEk4d2s07G3XGfz2QrgHXg4RJBvjrOozvoWfk= -github.com/shurcooL/sanitized_anchor_name v0.0.0-20170918181015-86672fcb3f95/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -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.3.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.8.1/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/skeema/knownhosts v1.2.2 h1:Iug2P4fLmDw9f41PB6thxUkNUkJzB5i+1/exaj40L3A= -github.com/skeema/knownhosts v1.2.2/go.mod h1:xYbVRSPxqBZFrdmDyMmsOs+uX1UZC3nTN3ThzgDxUwo= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= -github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= -github.com/sourcegraph/annotate v0.0.0-20160123013949-f4cad6c6324d/go.mod h1:UdhH50NIW0fCiwBSr0co2m7BnFLdv4fQTgdqdJTHFeE= -github.com/sourcegraph/syntaxhighlight v0.0.0-20170531221838-bd320f5d308e/go.mod h1:HuIsMU8RRBOtsCgI77wP899iHVBQpCmg4ErYMZB+2IA= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= -github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.10.0 h1:EaGW2JJh15aKOejeuJ+wpFSHnbd7GE6Wvp3TsNhb6LY= -github.com/spf13/afero v1.10.0/go.mod h1:UBogFpq8E9Hx+xc5CNTTEpTnuHVmXDwZcZcE1eb/UhQ= -github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= -github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/skeema/knownhosts v1.3.0 h1:AM+y0rI04VksttfwjkSTNQorvGqmwATnvnAHpSgc0LY= +github.com/skeema/knownhosts v1.3.0/go.mod h1:sPINvnADmT/qYH1kfv+ePMmOBTH6Tbl7b5LvTDjFK7M= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= 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/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= -github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= -github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= 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.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= @@ -1114,43 +594,35 @@ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= 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= -github.com/supranational/blst v0.3.11/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= -github.com/swaggo/swag v1.16.3 h1:PnCYjPCah8FK4I26l2F/KQ4yz3sILcVUN3cTlBFA9Pg= -github.com/swaggo/swag v1.16.3/go.mod h1:DImHIuOFXKpMFAQjcC7FG4m3Dg4+QuUgUzJmKjI/gRk= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/supranational/blst v0.3.13 h1:AYeSxdOMacwu7FBmpfloBz5pbFXDmJL33RuwnKtmTjk= +github.com/supranational/blst v0.3.13/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= +github.com/swaggo/swag v1.16.4 h1:clWJtd9LStiG3VeijiCfOVODP6VpHtKdQy9ELFG3s1A= +github.com/swaggo/swag v1.16.4/go.mod h1:VBsHJRsDvfYvqoiMKnsdwhNV9LEMHgEDZcyVYX0sxPg= github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc= github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d h1:vfofYNRScrDdvS342BElfbETmL1Aiz3i2t0zfRj16Hs= github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d/go.mod h1:RRCYJbIwD5jmqPI9XoAFR0OcDxqUctll6zUj/+B4S48= -github.com/taikoxyz/optimism v0.0.0-20240508063202-db34e8c760ea h1:+oLT2sxS+KLgHZVW4toyKavAMbgjYkFOiL0YpciATnQ= -github.com/taikoxyz/optimism v0.0.0-20240508063202-db34e8c760ea/go.mod h1:bkiRWtDE4T9nXmaK5NBKC/buX5GnyJ6VKozGFwiwKxs= -github.com/taikoxyz/taiko-geth v0.0.0-20240504072040-7e1b8b65a3f8 h1:z4juQ4Nyp2T836JTCNC8t3vrbr0K9v2pPUV/ir2dy9s= -github.com/taikoxyz/taiko-geth v0.0.0-20240504072040-7e1b8b65a3f8/go.mod h1:nqByouVW0a0qx5KKgvYgoXba+pYEHznAAQp6LhZilgM= -github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cbyO7IOYJZWg1U88JhDg3PB6klq9Hg2pA= -github.com/templexxx/cpufeat v0.0.0-20180724012125-cef66df7f161/go.mod h1:wM7WEvslTq+iOEAMDLSzhVuOt5BRZ05WirO+b09GHQU= -github.com/templexxx/xor v0.0.0-20191217153810-f85b25db303b/go.mod h1:5XA7W9S6mni3h5uvOC75dA3m9CCCaS83lltmc0ukdi4= -github.com/testcontainers/testcontainers-go v0.30.0 h1:jmn/XS22q4YRrcMwWg0pAwlClzs/abopbsBzrepyc4E= -github.com/testcontainers/testcontainers-go v0.30.0/go.mod h1:K+kHNGiM5zjklKjgTtcrEetF3uhWbMUyqAQoyoh8Pf0= +github.com/taikoxyz/hive v0.0.0-20240827015317-405b241dd082 h1:ymZR+Y88LOnA8i3KeuJXK7hff2n7bpMIhONPJwpcA5w= +github.com/taikoxyz/hive v0.0.0-20240827015317-405b241dd082/go.mod h1:RHnIu3EFehrWX3JhFAMQSXD5uz7l0xaNroTzXrap7EQ= +github.com/taikoxyz/optimism v0.0.0-20241003061504-cdf8af288f39 h1:JssMxaDmORjQ9RPZNulVJhAD8zSPd6LZFq5wsr6Nwz8= +github.com/taikoxyz/optimism v0.0.0-20241003061504-cdf8af288f39/go.mod h1:ym7scR7ZHvEmwx1DLGVDzFlAdR+uhP1+Z4XCiFuSD5s= +github.com/taikoxyz/taiko-geth v1.11.2-0.20250107082544-a2cbf904eaae h1:exc3MDRDbpNahMwIA+yGFLJb8Umtqs4JLOBpa8hh4Us= +github.com/taikoxyz/taiko-geth v1.11.2-0.20250107082544-a2cbf904eaae/go.mod h1:+l/fr42Mma+xBnhefL/+z11/hcmJ2egl+ScIVPjhc7E= +github.com/testcontainers/testcontainers-go v0.34.0 h1:5fbgF0vIN5u+nD3IWabQwRybuB4GY8G2HHgCkbMzMHo= +github.com/testcontainers/testcontainers-go v0.34.0/go.mod h1:6P/kMkQe8yqPHfPWNulFGdFHTD8HB2vLq/231xY2iPQ= github.com/thomaso-mirodin/intmath v0.0.0-20160323211736-5dc6d854e46e h1:cR8/SYRgyQCt5cNCMniB/ZScMkhI9nk8U5C7SbISXjo= github.com/thomaso-mirodin/intmath v0.0.0-20160323211736-5dc6d854e46e/go.mod h1:Tu4lItkATkonrYuvtVjG0/rhy15qrNGNTjPdaphtZ/8= -github.com/tjfoc/gmsm v1.3.0/go.mod h1:HaUcFuY0auTiaHB9MHFGCPx5IaLhTUd2atbCFBQXn9w= -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/go-sysconf v0.3.13 h1:GBUpcahXSpR2xN01jhkNAbTLRk2Yzgggk8IM08lq3r4= +github.com/tklauser/go-sysconf v0.3.13/go.mod h1:zwleP4Q4OehZHGn4CYZDipCgg9usW5IJePewFCGVEa0= github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= -github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/trailofbits/go-mutexasserts v0.0.0-20230328101604-8cdbc5f3d279 h1:+LynomhWB+14Plp/bOONEAZCtvCZk4leRbTvNzNVkL0= -github.com/trailofbits/go-mutexasserts v0.0.0-20230328101604-8cdbc5f3d279/go.mod h1:GA3+Mq3kt3tYAfM0WZCu7ofy+GW9PuGysHfhr+6JX7s= +github.com/tklauser/numcpus v0.7.0 h1:yjuerZP127QG9m5Zh/mSO4wqurYil27tHrqwRoRjpr4= +github.com/tklauser/numcpus v0.7.0/go.mod h1:bb6dMVcj8A42tSE7i32fsIUCbQNllK5iDguyOZRUzAY= 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/uber/jaeger-client-go v2.25.0+incompatible h1:IxcNZ7WRY1Y3G4poYlx24szfsn/3LvK9QHCq9oQw8+U= -github.com/uber/jaeger-client-go v2.25.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= -github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= -github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/urfave/cli/v2 v2.27.2 h1:6e0H+AkS+zDckwPCUrZkKX38mRaau4nL2uipkJpbkcI= -github.com/urfave/cli/v2 v2.27.2/go.mod h1:g0+79LmHHATl7DAcHO99smiR/T7uGLw84w8Y42x+4eM= +github.com/urfave/cli/v2 v2.27.5 h1:WoHEJLdsXr6dDWoJgMq/CboDmyY/8HMMH1fTECbih+w= +github.com/urfave/cli/v2 v2.27.5/go.mod h1:3Sevf16NykTbInEnD0yKkjDAeZDS0A6bzhBH5hrMvTQ= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/fasthttp v1.22.0/go.mod h1:0mw2RjXGOzxf4NL2jni3gUQ7LfjjUSiG5sskOUUSEpU= @@ -1163,691 +635,281 @@ github.com/valyala/fasttemplate v1.2.2 h1:lxLXG0uE3Qnshl9QyaK6XJxMXlQZELvChBOCmQ github.com/valyala/fasttemplate v1.2.2/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio= github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc= -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/wealdtech/go-bytesutil v1.1.1 h1:ocEg3Ke2GkZ4vQw5lp46rmO+pfqCCTgq35gqOy8JKVc= -github.com/wealdtech/go-bytesutil v1.1.1/go.mod h1:jENeMqeTEU8FNZyDFRVc7KqBdRKSnJ9CCh26TcuNb9s= github.com/xanzy/ssh-agent v0.3.3 h1:+/15pJfg/RsTxqYcX6fHqOXZwwMP+2VyYWJeWM2qQFM= github.com/xanzy/ssh-agent v0.3.3/go.mod h1:6dzNDKs0J9rVPHPhaGCukekBHKqfl+L3KghI1Bc68Uw= -github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I= -github.com/xdg/stringprep v1.0.0/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y= -github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -github.com/xrash/smetrics v0.0.0-20240312152122-5f08fbb34913 h1:+qGGcbkzsfDQNPPe9UDgpxAWQrhbbBXOYJFQDq/dtJw= -github.com/xrash/smetrics v0.0.0-20240312152122-5f08fbb34913/go.mod h1:4aEEwZQutDLsQv2Deui4iYQ6DWTxR14g6m8Wv88+Xqk= -github.com/xtaci/kcp-go v5.4.20+incompatible/go.mod h1:bN6vIwHQbfHaHtFpEssmWsN45a+AZwO7eyRCmEIbtvE= -github.com/xtaci/lossyconn v0.0.0-20190602105132-8df528c0c9ae/go.mod h1:gXtu8J62kEgmN++bm9BVICuT/e8yiLI2KFobd/TRFsE= -github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +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/xyproto/randomstring v1.0.5 h1:YtlWPoRdgMu3NZtP45drfy1GKoojuR7hmRcnhZqKjWU= +github.com/xyproto/randomstring v1.0.5/go.mod h1:rgmS5DeNXLivK7YprL0pY+lTuhNQW3iGxZ18UQApw/E= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.32/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= -go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= -go.etcd.io/bbolt v1.3.8 h1:xs88BrvEv273UsB79e0hcVrlUWmS0a8upikMFhSyAtA= -go.etcd.io/bbolt v1.3.8/go.mod h1:N9Mkw9X8x5fupy0IKsmuqVtoGDyxsaDlbk4Rd05IAQw= -go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= -go.opencensus.io v0.18.0/go.mod h1:vKdFvxhtzZ9onBp9VKHK8z/sRpBMnKAsufL7wlDrCOA= -go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= -go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= -go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= -go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 h1:jq9TW8u3so/bN+JPT166wjOI6/vQPF6Xe7nMNIltagk= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0/go.mod h1:p8pYQP+m5XfbZm9fxtSKAbM6oIllS7s2AfxrChvc7iw= -go.opentelemetry.io/otel v1.24.0 h1:0LAOdjNmQeSTzGBzduGe/rU4tZhMwL5rWgtp9Ku5Jfo= -go.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo= +go.opentelemetry.io/otel v1.31.0 h1:NsJcKPIW0D0H3NgzPDHmo0WW6SptzPdqg/L1zsIm2hY= +go.opentelemetry.io/otel v1.31.0/go.mod h1:O0C14Yl9FgkjqcCZAsE053C13OaddMYr/hz6clDkEJE= +go.opentelemetry.io/otel/exporters/jaeger v1.17.0 h1:D7UpUy2Xc2wsi1Ras6V40q806WM07rqoCWzXu7Sqy+4= +go.opentelemetry.io/otel/exporters/jaeger v1.17.0/go.mod h1:nPCqOnEH9rNLKqH/+rrUjiMzHJdV1BlpKcTwRTyKkKI= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.19.0 h1:Mne5On7VWdx7omSrSSZvM4Kw7cS7NQkOOmLcgscI51U= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.19.0/go.mod h1:IPtUMKL4O3tH5y+iXVyAXqpAwMuzC1IrxVS81rummfE= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.19.0 h1:IeMeyr1aBvBiPVYihXIaeIZba6b8E1bYp7lbdxK8CQg= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.19.0/go.mod h1:oVdCUtjq9MK9BlS7TtucsQwUcXcymNiEDjgDD2jMtZU= -go.opentelemetry.io/otel/metric v1.24.0 h1:6EhoGWWK28x1fbpA4tYTOWBkPefTDQnb8WSGXlc88kI= -go.opentelemetry.io/otel/metric v1.24.0/go.mod h1:VYhLe1rFfxuTXLgj4CBiyz+9WYBA8pNGJgDcSFRKBco= -go.opentelemetry.io/otel/sdk v1.19.0 h1:6USY6zH+L8uMH8L3t1enZPR3WFEmSTADlqldyHtJi3o= -go.opentelemetry.io/otel/sdk v1.19.0/go.mod h1:NedEbbS4w3C6zElbLdPJKOpJQOrGUJ+GfzpjUvI0v1A= -go.opentelemetry.io/otel/trace v1.24.0 h1:CsKnnL4dUAr/0llH9FKuc698G04IrpWV0MQA/Y1YELI= -go.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU= +go.opentelemetry.io/otel/metric v1.31.0 h1:FSErL0ATQAmYHUIzSezZibnyVlft1ybhy4ozRPcF2fE= +go.opentelemetry.io/otel/metric v1.31.0/go.mod h1:C3dEloVbLuYoX41KpmAhOqNriGbA+qqH6PQ5E5mUfnY= +go.opentelemetry.io/otel/sdk v1.31.0 h1:xLY3abVHYZ5HSfOg3l2E5LUj2Cwva5Y7yGxnSW9H5Gk= +go.opentelemetry.io/otel/sdk v1.31.0/go.mod h1:TfRbMdhvxIIr/B2N2LQW2S5v9m3gOQ/08KsbbO5BPT0= +go.opentelemetry.io/otel/sdk/metric v1.31.0 h1:i9hxxLJF/9kkvfHppyLL55aW7iIJz4JjxTeYusH7zMc= +go.opentelemetry.io/otel/sdk/metric v1.31.0/go.mod h1:CRInTMVvNhUKgSAMbKyTMxqOBC0zgyxzW55lZzX43Y8= +go.opentelemetry.io/otel/trace v1.31.0 h1:ffjsj1aRouKewfr85U2aGagJ46+MvodynlQ1HYdmJys= +go.opentelemetry.io/otel/trace v1.31.0/go.mod h1:TXZkRk7SM2ZQLtR6eoAWQFIHPvzQ06FJAsO1tJg480A= go.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I= go.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM= -go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.5.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/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/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= 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.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/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= +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.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.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= -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= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181030102418-4d3f4d9ffa16/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190130090550-b01c7a725664/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-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191219195013-becbf705a915/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200204104054-c9f3fb736b72/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200221231518-2aa609cf4a9d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -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-20210220033148-5ea612d1eb83/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-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.3.1-0.20221117191849-2c476679df9a/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= -golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= -golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30= -golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M= +golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U= +golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= -golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= -golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20240325151524-a685a6edb6d8 h1:aAcj0Da7eBAtrTp03QXWvm88pSyOt+UgdZw2BFZ+lEw= -golang.org/x/exp v0.0.0-20240325151524-a685a6edb6d8/go.mod h1:CQ1k9gNrJ50XIzaKCRR2hssIjF07kZFEiieALBM/ARQ= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +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-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-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= -golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.1/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.16.0 h1:QX4fJ0Rr5cPQCF7O9lh9Se4pmwfwskqZfq5moyldzic= -golang.org/x/mod v0.16.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= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181029044818-c44066c5c816/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181106065722-10aee1819953/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181220203305-927f97764cc3/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-20190125091013-d26f9f9a57f3/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-20190313220215-9f648a60d977/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/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-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-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/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-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/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-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -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-20201031054903-ff519b6c9102/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-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226101413-39120d07d75e/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210421230115-4e50805a0758/go.mod h1:72T/g9IO56b78aLF+1Kcs5dz7/ng1VjMUvfKvpfy+jM= golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= -golang.org/x/net v0.0.0-20211029224645-99673261e6eb/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= 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.0.0-20220906165146-f3363e06e74c/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= -golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= -golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= -golang.org/x/net v0.24.0 h1:1PcaxkF854Fu3+lvBIx5SYn9wRlBzzcnHZSiaFFAb0w= -golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8= +golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I= +golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4= 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= -golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.18.0 h1:09qnuIAgzdx1XplqJvW6CQqMCtGZykZWcXzPMPUusvI= -golang.org/x/oauth2 v0.18.0/go.mod h1:Wf7knwG0MPoWIMMBgFlEaSUDaKskp0dCfrlJRJXbBi8= -golang.org/x/perf v0.0.0-20180704124530-6e6d33e29852/go.mod h1:JLpeXjPJfIyPr5TlbXLkXWLhP8nz10XfvxElABhCtcw= +golang.org/x/oauth2 v0.24.0 h1:KTBBxWqUa0ykRPLtV69rRto9TLXcqYkeswu48x/gvNE= +golang.org/x/oauth2 v0.24.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= 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-20190227155943-e225da77a7e6/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-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/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-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= -golang.org/x/sync v0.7.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-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ= +golang.org/x/sync v0.10.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-20180905080454-ebe1bf3edb33/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-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181029174526-d69651ed3497/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190129075346-302c3dd5f1cc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190130150945-aca44879d564/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-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190316082340-a2f829d7f35f/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-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/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-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/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-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 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-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200219091948-cb0a6d8edb6c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/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-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201214210602-f9fddec55a1e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210420072515-93ed5bcd2bfe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/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-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-20220728004956-3c1f35247d10/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-20221010170243-090e33056c14/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.19.0 h1:q5f1RH2jigJ1MoAWp2KTp3gm5zAGFUTarQZ5U386+4o= -golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.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.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= -golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= -golang.org/x/term v0.19.0 h1:+ThwsDv+tYfnJFhF4L8jITxu1tdTWRTZpdsWgEgjL6Q= -golang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk= -golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/term v0.27.0 h1:WP60Sv1nlK1T6SupCHbXzSaN0b9wUmsPoRS9b61A23Q= +golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM= 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.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -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/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-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20191024005414-555d28b269f0/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/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= +golang.org/x/time v0.8.0 h1:9i3RxcPv3PZnitoVGMPDKZSq1xW1gK1Xy3ArNOGZfEg= +golang.org/x/time v0.8.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-20181030000716-a0a13e073c7b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/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-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/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-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/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-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/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-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200221224223-e1da425f72fd/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -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.19.0 h1:tfGCXNR1OsFG+sVdLAitlpjAvD/I6dHDKnYrpEZUHkw= -golang.org/x/tools v0.19.0/go.mod h1:qoJWxmGSIBmAeriMx19ogtrEPrGtDbPK634QFIcLAhc= +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= 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.0.0-20180910000450-7ca32eb868bf/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= -google.golang.org/api v0.0.0-20181030000543-1d582fd0359e/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= -google.golang.org/api v0.1.0/go.mod h1:UGEZY7KEX120AnNLIHFMKIo4obdJhkp2tPbaPlQx13Y= -google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= -google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= -google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= -google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= -google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= -google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= -google.golang.org/api v0.44.0 h1:URs6qR1lAxDsqWITsQXI4ZkGiYJ5dHtRNiCpfs2OeKA= -google.golang.org/api v0.44.0/go.mod h1:EBOGZqzyhtvMDoxwS97ctnh0zUmYY6CxqXsc1AvkYD8= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.3.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= -google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -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-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= -google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200218151345-dad8c97a84f5/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de h1:F6qOa9AZTYJXOUEr4jDysRDLrm4PHePlge4v4TGAlxY= -google.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:VUhTRKeHn9wwcdrk73nvdC9gF178Tzhmt/qyaFcPLSo= -google.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de h1:jFNzHPIeuzhdRwVhbZdiym9q0ory/xY3sA+v2wPg8I0= -google.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:5iCWqnniDlqZHrd3neWVTOwvh/v6s3232omMecelax8= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240227224415-6ceb2ff114de h1:cZGRis4/ot9uVm639a+rHCUaG0JJHEsdyzSQTMX+suY= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:H4O17MA/PE9BsGx3w+a+W2VOLLD1Qf7oJneAoU6WktY= -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/genproto/googleapis/api v0.0.0-20241015192408-796eee8c2d53 h1:fVoAXEKA4+yufmbdVYv+SE73+cPZbbbe8paLsHfkK+U= +google.golang.org/genproto/googleapis/api v0.0.0-20241015192408-796eee8c2d53/go.mod h1:riSXTwQ4+nqmPGtobMFyW5FqVAmIs0St6VPp4Ug7CE4= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241015192408-796eee8c2d53 h1:X58yt85/IXCx0Y3ZwN6sEIKZzQtDEYaBWrDvErdXrRE= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241015192408-796eee8c2d53/go.mod h1:GX3210XPVPUjJbTUbvwI8f2IpZDMZuPJWDzDuebbviI= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.22.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= -google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= -google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.63.2 h1:MUeiw1B2maTVZthpU5xvASfTh3LDbxHd6IJ6QQVU+xM= -google.golang.org/grpc v1.63.2/go.mod h1:WAX/8DgncnokcFUldAxq7GeB5DXHDbMF+lLvDomNkRA= +google.golang.org/grpc v1.69.2 h1:U3S9QEtbXC0bYNvRtcoklF3xGtLViumSYxWykJS+7AU= +google.golang.org/grpc v1.69.2/go.mod h1:vyjdE6jLBI76dgpDojsFGNaHlxdjXN9ghpnd2o7JGZ4= 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.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= -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/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= -gopkg.in/bsm/ratelimit.v1 v1.0.0-20160220154919-db14e161995a/go.mod h1:KF9sEfUPAXdG8Oev9e99iLGnl2uJMjc5B+4y3O7x610= +google.golang.org/protobuf v1.36.1 h1:yBPeRvTftaleIgM3PZ/WBIZ7XM/eEYAaEyCwvyjq/gk= +google.golang.org/protobuf v1.36.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= 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= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/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/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= -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/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= gopkg.in/go-playground/assert.v1 v1.2.1 h1:xoYuJVE7KT85PYWrN730RguIQO0ePzVRfFMXadIrXTM= gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= +gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1 h1:iiHuQZCNgYPmFQxd3BBN/Nc5+dAwzZuq5y40s20oQw0= +gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= -gopkg.in/jcmturner/aescts.v1 v1.0.1/go.mod h1:nsR8qBOg+OucoIW+WMhB3GspUQXq9XorLnQb9XtvcOo= -gopkg.in/jcmturner/dnsutils.v1 v1.0.1/go.mod h1:m3v+5svpVOhtFAP/wSz+yzh4Mc0Fg7eRhxkJMWSIz9Q= -gopkg.in/jcmturner/goidentity.v3 v3.0.0/go.mod h1:oG2kH0IvSYNIu80dVAyu/yoefjq1mNfM5bm88whjWx4= -gopkg.in/jcmturner/gokrb5.v7 v7.5.0/go.mod h1:l8VISx+WGYp+Fp7KRbsiUuXTTOnxIc3Tuvyavf11/WM= -gopkg.in/jcmturner/rpc.v1 v1.1.0/go.mod h1:YIdkC4XfD6GXbzje11McwsDuOlZQSb9W4vfLvuNnlv8= -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/redis.v4 v4.2.4/go.mod h1:8KREHdypkCEojGKQcjMqAODMICIVwZAONWq8RowTITA= -gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= +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/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= -gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/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.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -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/datatypes v1.2.0 h1:5YT+eokWdIxhJgWHdrb2zYUimyk0+TaFth+7a0ybzco= -gorm.io/datatypes v1.2.0/go.mod h1:o1dh0ZvjIjhH/bngTpypG6lVRJ5chTBxE09FH/71k04= -gorm.io/driver/mysql v1.5.6 h1:Ld4mkIickM+EliaQZQx3uOJDJHtrd70MxAUqWqlx3Y8= -gorm.io/driver/mysql v1.5.6/go.mod h1:sEtPWMiqiN1N1cMXoXmBbd8C6/l+TESwriotuRRpkDM= -gorm.io/driver/postgres v1.5.7 h1:8ptbNJTDbEmhdr62uReG5BGkdQyeasu/FZHxI0IMGnM= -gorm.io/driver/postgres v1.5.7/go.mod h1:3e019WlBaYI5o5LIdNV+LyxCMNtLOQETBXL2h4chKpA= +gorm.io/datatypes v1.2.5 h1:9UogU3jkydFVW1bIVVeoYsTpLRgwDVW3rHfJG6/Ek9I= +gorm.io/datatypes v1.2.5/go.mod h1:I5FUdlKpLb5PMqeMQhm30CQ6jXP8Rj89xkTeCSAaAD4= +gorm.io/driver/mysql v1.5.7 h1:MndhOPYOfEp2rHKgkZIhJ16eVUIRf2HmzgoPmh7FCWo= +gorm.io/driver/mysql v1.5.7/go.mod h1:sEtPWMiqiN1N1cMXoXmBbd8C6/l+TESwriotuRRpkDM= +gorm.io/driver/postgres v1.5.0 h1:u2FXTy14l45qc3UeCJ7QaAXZmZfDDv0YrthvmRq1l0U= +gorm.io/driver/postgres v1.5.0/go.mod h1:FUZXzO+5Uqg5zzwzv4KK49R8lvGIyscBOqYrtI1Ce9A= gorm.io/driver/sqlite v1.1.4/go.mod h1:mJCeTFr7+crvS+TRnWc5Z3UvwxUN1BGBLMrf5LA9DYw= gorm.io/driver/sqlite v1.4.3 h1:HBBcZSDnWi5BW3B3rwvVTc510KGkBkexlOg0QrmLUuU= gorm.io/driver/sqlite v1.4.3/go.mod h1:0Aq3iPO+v9ZKbcdiz8gLWRw5VOPcBOPUQJFLq5e2ecI= -gorm.io/driver/sqlserver v1.4.1 h1:t4r4r6Jam5E6ejqP7N82qAJIJAht27EGT41HyPfXRw0= -gorm.io/driver/sqlserver v1.4.1/go.mod h1:DJ4P+MeZbc5rvY58PnmN1Lnyvb5gw5NPzGshHDnJLig= +gorm.io/driver/sqlserver v1.5.4 h1:xA+Y1KDNspv79q43bPyjDMUgHoYHLhXYmdFcYPobg8g= +gorm.io/driver/sqlserver v1.5.4/go.mod h1:+frZ/qYmuna11zHPlh5oc2O6ZA/lS88Keb0XSH1Zh/g= gorm.io/gorm v1.20.7/go.mod h1:0HFTzE/SqkGTzK6TlDPPQbAYCluiVvhzoA1+aVyzenw= gorm.io/gorm v1.21.3/go.mod h1:0HFTzE/SqkGTzK6TlDPPQbAYCluiVvhzoA1+aVyzenw= gorm.io/gorm v1.25.7/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8= -gorm.io/gorm v1.25.10 h1:dQpO+33KalOA+aFYGlK+EfxcI5MbO7EP2yYygwh9h+s= -gorm.io/gorm v1.25.10/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8= +gorm.io/gorm v1.25.12 h1:I0u8i2hWQItBq1WfE0o2+WuL9+8L21K9e2HHSTE/0f8= +gorm.io/gorm v1.25.12/go.mod h1:xh7N7RHfYlNc5EmcI/El95gXusucDrQnHXe0+CgWcLQ= gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= -gotest.tools/v3 v3.5.0 h1:Ljk6PdHdOhAb5aDMWXjDLMMhph+BpztA4v1QdqEW2eY= -gotest.tools/v3 v3.5.0/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= -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= +gotest.tools/v3 v3.5.1 h1:EENdUnS3pdur5nybKYIh2Vfgc8IUNBjxDPSjtiJcOzU= +gotest.tools/v3 v3.5.1/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= 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.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -k8s.io/api v0.26.2 h1:dM3cinp3PGB6asOySalOZxEG4CZ0IAdJsrYZXE/ovGQ= -k8s.io/api v0.26.2/go.mod h1:1kjMQsFE+QHPfskEcVNgL3+Hp88B80uj0QtSOlj8itU= -k8s.io/apimachinery v0.26.2 h1:da1u3D5wfR5u2RpLhE/ZtZS2P7QvDgLZTi9wrNZl/tQ= -k8s.io/apimachinery v0.26.2/go.mod h1:ats7nN1LExKHvJ9TmwootT00Yz05MuYqPXEXaVeOy5I= -k8s.io/client-go v0.26.2 h1:s1WkVujHX3kTp4Zn4yGNFK+dlDXy1bAAkIl+cFAiuYI= -k8s.io/client-go v0.26.2/go.mod h1:u5EjOuSyBa09yqqyY7m3abZeovO/7D/WehVVlZ2qcqU= -k8s.io/klog/v2 v2.90.1 h1:m4bYOKall2MmOiRaR1J+We67Do7vm9KiQVlT96lnHUw= -k8s.io/klog/v2 v2.90.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= -k8s.io/kube-openapi v0.0.0-20221012153701-172d655c2280 h1:+70TFaan3hfJzs+7VK2o+OGxg8HsuBr/5f6tVAjDu6E= -k8s.io/kube-openapi v0.0.0-20221012153701-172d655c2280/go.mod h1:+Axhij7bCpeqhklhUTe3xmOn6bWxolyZEeyaFpjGtl4= -k8s.io/utils v0.0.0-20230220204549-a5ecb0141aa5 h1:kmDqav+P+/5e1i9tFfHq1qcF3sOrDp+YEkVDAHu7Jwk= -k8s.io/utils v0.0.0-20230220204549-a5ecb0141aa5/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= -lukechampine.com/blake3 v1.2.1 h1:YuqqRuaqsGV71BV/nm9xlI0MKUv4QC54jQnBChWbGnI= -lukechampine.com/blake3 v1.2.1/go.mod h1:0OFRp7fBtAylGVCO40o87sbupkyIGgbpv1+M1k1LM6k= +k8s.io/api v0.30.4 h1:XASIELmW8w8q0i1Y4124LqPoWMycLjyQti/fdYHYjCs= +k8s.io/api v0.30.4/go.mod h1:ZqniWRKu7WIeLijbbzetF4U9qZ03cg5IRwl8YVs8mX0= +k8s.io/apimachinery v0.30.4 h1:5QHQI2tInzr8LsT4kU/2+fSeibH1eIHswNx480cqIoY= +k8s.io/apimachinery v0.30.4/go.mod h1:iexa2somDaxdnj7bha06bhb43Zpa6eWH8N8dbqVjTUc= +k8s.io/client-go v0.30.4 h1:eculUe+HPQoPbixfwmaSZGsKcOf7D288tH6hDAdd+wY= +k8s.io/client-go v0.30.4/go.mod h1:IBS0R/Mt0LHkNHF4E6n+SUDPG7+m2po6RZU7YHeOpzc= +k8s.io/klog/v2 v2.120.1 h1:QXU6cPEOIslTGvZaXvFWiP9VKyeet3sawzTOvdXb4Vw= +k8s.io/klog/v2 v2.120.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= +k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 h1:BZqlfIlq5YbRMFko6/PM7FjZpUb45WallggurYhKGag= +k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340/go.mod h1:yD4MZYeKMBwQKVht279WycxKyM84kkAx2DPrTXaeb98= +k8s.io/utils v0.0.0-20230726121419-3b25d923346b h1:sgn3ZU783SCgtaSJjpcVVlRqd6GSnlTLKgpAAttJvpI= +k8s.io/utils v0.0.0-20230726121419-3b25d923346b/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= modernc.org/gc/v3 v3.0.0-20240107210532-573471604cb6 h1:5D53IMaUuA5InSeMu9eJtlQXS2NxAhyWQvkKEgXZhHI= modernc.org/gc/v3 v3.0.0-20240107210532-573471604cb6/go.mod h1:Qz0X07sNOR1jWYCrJMEnbW/X55x206Q7Vt4mz6/wHp4= -modernc.org/libc v1.41.0 h1:g9YAc6BkKlgORsUWj+JwqoB1wU3o4DE3bM3yvA3k+Gk= -modernc.org/libc v1.41.0/go.mod h1:w0eszPsiXoOnoMJgrXjglgLuDy/bt5RR4y3QzUUeodY= +modernc.org/libc v1.55.3 h1:AzcW1mhlPNrRtjS5sS+eW2ISCgSOLLNyFzRh/V3Qj/U= +modernc.org/libc v1.55.3/go.mod h1:qFXepLhz+JjFThQ4kzwzOjA/y/artDeg+pcYnY+Q83w= modernc.org/mathutil v1.6.0 h1:fRe9+AmYlaej+64JsEEhoWuAYBkOtQiMEU7n/XgfYi4= modernc.org/mathutil v1.6.0/go.mod h1:Ui5Q9q1TR2gFm0AQRqQUaBWFLAhQpCwNcuhBOSedWPo= -modernc.org/memory v1.7.2 h1:Klh90S215mmH8c9gO98QxQFsY+W451E8AnzjoE2ee1E= -modernc.org/memory v1.7.2/go.mod h1:NO4NVCQy0N7ln+T9ngWqOQfi7ley4vpwvARR+Hjw95E= -modernc.org/sqlite v1.29.6 h1:0lOXGrycJPptfHDuohfYgNqoe4hu+gYuN/pKgY5XjS4= -modernc.org/sqlite v1.29.6/go.mod h1:S02dvcmm7TnTRvGhv8IGYyLnIt7AS2KPaB1F/71p75U= +modernc.org/memory v1.8.0 h1:IqGTL6eFMaDZZhEWwcREgeMXYwmW83LYW8cROZYkg+E= +modernc.org/memory v1.8.0/go.mod h1:XPZ936zp5OMKGWPqbD3JShgd/ZoQ7899TUuQqxY+peU= +modernc.org/sqlite v1.34.1 h1:u3Yi6M0N8t9yKRDwhXcyp1eS5/ErhPTBggxWFuR6Hfk= +modernc.org/sqlite v1.34.1/go.mod h1:pXV2xHxhzXZsgT/RtTFAPY6JJDEvOTcTdwADQCCWD4k= modernc.org/strutil v1.2.0 h1:agBi9dp1I+eOnxXeiZawM8F4LawKv4NzGWSaLfyeNZA= modernc.org/strutil v1.2.0/go.mod h1:/mdcBmfOibveCTBxUl5B5l6W+TTH1FXPLHZE6bTosX0= modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y= modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= -rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU= rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA= -sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 h1:iXTIw73aPyC+oRdyqqvVJuloN1p0AC/kzH07hu3NE+k= -sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= -sigs.k8s.io/structured-merge-diff/v4 v4.2.3 h1:PRbqxJClWWYMNV1dhaG4NsibJbArud9kFxnAMREiWFE= -sigs.k8s.io/structured-merge-diff/v4 v4.2.3/go.mod h1:qjx8mGObPmV2aSZepjQjbmb2ihdVs8cGKBraizNC69E= -sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= +sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= +sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= +sigs.k8s.io/structured-merge-diff/v4 v4.4.1 h1:150L+0vs/8DA78h1u02ooW1/fFq/Lwr+sGiqlzvrtq4= +sigs.k8s.io/structured-merge-diff/v4 v4.4.1/go.mod h1:N8hJocpFajUSSeSJ9bOZ77VzejKZaXsTtZo4/u7Io08= sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= -sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU= -sourcegraph.com/sourcegraph/go-diff v0.5.0/go.mod h1:kuch7UrkMzY0X+p9CRK03kfuPQ2zzQcaEFbx8wA8rck= -sourcegraph.com/sqs/pbtypes v0.0.0-20180604144634-d3ebe8f20ae4/go.mod h1:ketZ/q3QxT9HOBeFhu6RdvsftgpsbFHBF5Cas6cDKZ0= diff --git a/lefthook.yml b/lefthook.yml index 1f17bb93795..b8708725161 100644 --- a/lefthook.yml +++ b/lefthook.yml @@ -1,19 +1,19 @@ # lefthook.yml -pre-commit: - parallel: true - commands: - bridge-ui: - glob: "packages/bridge-ui/**.{js,ts,css,svelte}" - run: pnpm -F bridge-ui svelte:check && pnpm -F bridge-ui lint:fix && git add {staged_files} - guardian-ui: - glob: "packages/guardian-prover-health-check-ui/**.{js,ts,css,svelte}" - run: pnpm -F guardian-prover-health-check-ui svelte:check && pnpm -F guardian-prover-health-check-ui lint:fix && git add {staged_files} - protocol_sol: - glob: "packages/protocol/**.{sol}" - run: pnpm -F protocol lint:sol && git add {staged_files} - protocol_ts: - glob: "packages/protocol/**.{ts}" - run: pnpm -F protocol eslint && git add {staged_files} - repo: - glob: "**.{json,md,yaml,yml}" - run: pnpm prettier {staged_files} --write && git add {staged_files} +# pre-commit: +# parallel: true +# commands: +# bridge-ui: +# glob: "packages/bridge-ui/**.{js,ts,css,svelte}" +# run: pnpm -F bridge-ui svelte:check && pnpm -F bridge-ui lint:fix && git add {staged_files} +# guardian-ui: +# glob: "packages/guardian-prover-health-check-ui/**.{js,ts,css,svelte}" +# run: pnpm -F guardian-prover-health-check-ui svelte:check && pnpm -F guardian-prover-health-check-ui lint:fix && git add {staged_files} +# protocol_sol: +# glob: "packages/protocol/**.{sol}" +# run: pnpm -F protocol lint:sol && git add {staged_files} +# protocol_ts: +# glob: "packages/protocol/**.{ts}" +# run: pnpm -F protocol eslint && git add {staged_files} +# repo: +# glob: "**.{json,md,yaml,yml}" +# run: pnpm prettier {staged_files} --write && git add {staged_files} diff --git a/lychee.toml b/lychee.toml new file mode 100644 index 00000000000..9ba6633e075 --- /dev/null +++ b/lychee.toml @@ -0,0 +1,2 @@ +exclude_path = ["node_modules"] +exclude = ["etherscan.io"] diff --git a/packages/balance-monitor/balance-monitor/balance_monitor.go b/packages/balance-monitor/balance-monitor/balance_monitor.go index e4735b1eefe..c91b54ef48b 100644 --- a/packages/balance-monitor/balance-monitor/balance_monitor.go +++ b/packages/balance-monitor/balance-monitor/balance_monitor.go @@ -96,10 +96,14 @@ func (b *BalanceMonitor) Start() error { b.checkEthBalance(context.Background(), b.l2EthClient, l2EthBalanceGauge, "L2", address) // Check ERC-20 token balances + var balance float64 = 0 for _, tokenAddress := range b.erc20Addresses { - b.checkErc20Balance(context.Background(), b.l1EthClient, l1Erc20BalanceGauge, "L1", tokenAddress, address) - b.checkErc20Balance(context.Background(), b.l2EthClient, l2Erc20BalanceGauge, "L2", tokenAddress, address) + balance = balance + b.checkErc20Balance(context.Background(), b.l1EthClient, "L1", tokenAddress, address) + balance = balance + b.checkErc20Balance(context.Background(), b.l2EthClient, "L2", tokenAddress, address) + } + l1Erc20BalanceGauge.WithLabelValues(address.Hex()).Set(balance) + slog.Info("ERC-20 Balance", "address", address.Hex(), "balance", balance) // Add a 1 second sleep between address checks time.Sleep(time.Second) } @@ -111,7 +115,7 @@ func (b *BalanceMonitor) Start() error { func (b *BalanceMonitor) checkEthBalance(ctx context.Context, client ethClient, gauge *prometheus.GaugeVec, clientLabel string, address common.Address) { balance, err := b.getEthBalance(ctx, client, address) if err != nil { - slog.Info(fmt.Sprintf("Failed to get %s ETH balance for address", clientLabel), "address", address.Hex(), "error", err) + slog.Warn(fmt.Sprintf("Failed to get %s ETH balance for address", clientLabel), "address", address.Hex(), "error", err) return } balanceFloat, _ := new(big.Float).Quo(new(big.Float).SetInt(balance), big.NewFloat(1e18)).Float64() @@ -119,32 +123,45 @@ func (b *BalanceMonitor) checkEthBalance(ctx context.Context, client ethClient, slog.Info(fmt.Sprintf("%s ETH Balance", clientLabel), "address", address.Hex(), "balance", balanceFloat) } -func (b *BalanceMonitor) checkErc20Balance(ctx context.Context, client ethClient, gauge *prometheus.GaugeVec, clientLabel string, tokenAddress, holderAddress common.Address) { - tokenBalance, err := b.getErc20Balance(ctx, client, tokenAddress, holderAddress) - if err != nil { - slog.Info(fmt.Sprintf("Failed to get %s ERC-20 balance for address", clientLabel), "address", holderAddress.Hex(), "tokenAddress", tokenAddress.Hex(), "error", err) - return - } - +func (b *BalanceMonitor) checkErc20Balance(ctx context.Context, client ethClient, clientLabel string, tokenAddress, holderAddress common.Address) float64 { // Check the cache for the token decimals tokenDecimals, ok := b.erc20DecimalsCache[tokenAddress] if !ok { // If not in the cache, fetch the decimals from the contract - tokenDecimals, err = b.getErc20Decimals(ctx, client, tokenAddress) + tokenDecimals, err := b.getErc20Decimals(ctx, client, tokenAddress) if err != nil { - slog.Info(fmt.Sprintf("Failed to get %s ERC-20 decimals for token", clientLabel), "tokenAddress", tokenAddress.Hex(), "error", err) - return + slog.Warn(fmt.Sprintf("Failed to get %s ERC-20 decimals for token. Use default value: 18", clientLabel), "tokenAddress", tokenAddress.Hex(), "error", err) + tokenDecimals = 18 } // Cache the fetched decimals b.erc20DecimalsCache[tokenAddress] = tokenDecimals } - tokenBalanceFloat, _ := new(big.Float).Quo(new(big.Float).SetInt(tokenBalance), big.NewFloat(math.Pow(10, float64(tokenDecimals)))).Float64() - gauge.WithLabelValues(tokenAddress.Hex(), holderAddress.Hex()).Set(tokenBalanceFloat) - slog.Info(fmt.Sprintf("%s ERC-20 Balance", clientLabel), "tokenAddress", tokenAddress.Hex(), "address", holderAddress.Hex(), "balance", tokenBalanceFloat) + var tokenBalanceFloat float64 = 0 + tokenBalance, err := b.getErc20Balance(ctx, client, tokenAddress, holderAddress) + if err != nil { + slog.Warn(fmt.Sprintf("Failed to get %s ERC-20 balance for address", clientLabel), "address", holderAddress.Hex(), "tokenAddress", tokenAddress.Hex(), "error", err) + tokenBalanceFloat = 0 + } else { + tokenBalanceFloat, _ = new(big.Float).Quo(new(big.Float).SetInt(tokenBalance), big.NewFloat(math.Pow(10, float64(tokenDecimals)))).Float64() + } + + var tokenBondBalanceFloat float64 = 0 + tokenBondBalance, err := b.getErc20BondBalance(ctx, client, tokenAddress, holderAddress) + if err != nil { + slog.Warn(fmt.Sprintf("Failed to get %s ERC-20 bond balance for address", clientLabel), "address", holderAddress.Hex(), "tokenAddress", tokenAddress.Hex(), "error", err) + tokenBondBalanceFloat = 0 + } else { + tokenBondBalanceFloat, _ = new(big.Float).Quo(new(big.Float).SetInt(tokenBondBalance), big.NewFloat(math.Pow(10, float64(tokenDecimals)))).Float64() + } + + balance := tokenBalanceFloat + tokenBondBalanceFloat + slog.Info(fmt.Sprintf("%s ERC-20 Balance", clientLabel), "tokenAddress", tokenAddress.Hex(), "address", holderAddress.Hex(), "balance", balance) + return balance } -const erc20ABI = `[{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"balance","type":"uint256"}],"type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"type":"function"}]` +const erc20BalanceOfABI = `[{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"balance","type":"uint256"}],"type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"type":"function"}]` +const erc20BondBalanceOfABI = `[{"constant":true,"inputs":[{"name":"_user","type":"address"}],"name":"bondBalanceOf","outputs":[{"name":"balance","type":"uint256"}],"type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"type":"function"}]` type ERC20 interface { BalanceOf(opts *bind.CallOpts, account common.Address) (*big.Int, error) @@ -159,8 +176,9 @@ func (b *BalanceMonitor) getEthBalance(ctx context.Context, client ethClient, ad return balance, nil } +// TODO (ruby): merge getErc20Balance and getErc20BondBalance func (b *BalanceMonitor) getErc20Balance(ctx context.Context, client ethClient, tokenAddress, holderAddress common.Address) (*big.Int, error) { - parsedABI, err := abi.JSON(strings.NewReader(erc20ABI)) + parsedABI, err := abi.JSON(strings.NewReader(erc20BalanceOfABI)) if err != nil { return nil, err } @@ -188,8 +206,37 @@ func (b *BalanceMonitor) getErc20Balance(ctx context.Context, client ethClient, return balance, nil } +func (b *BalanceMonitor) getErc20BondBalance(ctx context.Context, client ethClient, tokenAddress, holderAddress common.Address) (*big.Int, error) { + parsedABI, err := abi.JSON(strings.NewReader(erc20BondBalanceOfABI)) + if err != nil { + return nil, err + } + + tokenContract := bind.NewBoundContract(tokenAddress, parsedABI, client, client, client) + + var result []interface{} + err = tokenContract.Call(&bind.CallOpts{ + Context: ctx, + }, &result, "bondBalanceOf", holderAddress) + + if err != nil { + return nil, err + } + + if len(result) == 0 { + return nil, fmt.Errorf("no result from token contract call") + } + + balance, ok := result[0].(*big.Int) + if !ok { + return nil, fmt.Errorf("unexpected type for bondBalanceOf result") + } + + return balance, nil +} + func (b *BalanceMonitor) getErc20Decimals(ctx context.Context, client ethClient, tokenAddress common.Address) (uint8, error) { - parsedABI, err := abi.JSON(strings.NewReader(erc20ABI)) + parsedABI, err := abi.JSON(strings.NewReader(erc20BalanceOfABI)) if err != nil { return 0, err } diff --git a/packages/balance-monitor/balance-monitor/prometheus.go b/packages/balance-monitor/balance-monitor/prometheus.go index 7980ac72140..fa8d1673282 100644 --- a/packages/balance-monitor/balance-monitor/prometheus.go +++ b/packages/balance-monitor/balance-monitor/prometheus.go @@ -15,9 +15,9 @@ var ( l1Erc20BalanceGauge = prometheus.NewGaugeVec( prometheus.GaugeOpts{ Name: "l1_erc20_balance", - Help: "ERC-20 token balance of addresses on L1", + Help: "ERC-20 token balance of addresses", }, - []string{"token_address", "address"}, + []string{"address"}, ) l2EthBalanceGauge = prometheus.NewGaugeVec( prometheus.GaugeOpts{ @@ -26,18 +26,10 @@ var ( }, []string{"address"}, ) - l2Erc20BalanceGauge = prometheus.NewGaugeVec( - prometheus.GaugeOpts{ - Name: "l2_erc20_balance", - Help: "ERC-20 token balance of addresses on L2", - }, - []string{"token_address", "address"}, - ) ) func init() { prometheus.MustRegister(l1EthBalanceGauge) prometheus.MustRegister(l2EthBalanceGauge) prometheus.MustRegister(l1Erc20BalanceGauge) - prometheus.MustRegister(l2Erc20BalanceGauge) } diff --git a/packages/balance-monitor/cmd/main.go b/packages/balance-monitor/cmd/main.go index 7f01d6d1672..7dc4ba8b049 100644 --- a/packages/balance-monitor/cmd/main.go +++ b/packages/balance-monitor/cmd/main.go @@ -31,7 +31,7 @@ func main() { { Name: "balance-monitor", Flags: flags.CommonFlags, - Usage: "Starts the balance monitor oftware", + Usage: "Starts the balance monitor software", Description: "Taiko balance monitor", Action: utils.SubcommandAction(new(balanceMonitor.BalanceMonitor)), }, diff --git a/packages/branding/CHANGELOG.md b/packages/branding/CHANGELOG.md deleted file mode 100644 index aedb7801235..00000000000 --- a/packages/branding/CHANGELOG.md +++ /dev/null @@ -1,41 +0,0 @@ -# Changelog - -## [0.4.0](https://github.com/taikoxyz/taiko-mono/compare/branding-v0.3.0...branding-v0.4.0) (2024-05-13) - - -## [0.3.0](https://github.com/taikoxyz/taiko-mono/compare/branding-v0.2.0...branding-v0.3.0) (2023-08-15) - - -### Features - -* **bridge-ui-v2:** Activities page ([#14504](https://github.com/taikoxyz/taiko-mono/issues/14504)) ([4dff4b3](https://github.com/taikoxyz/taiko-mono/commit/4dff4b317e0ecda43c9804a9e04d2f22c8332a60)) -* **protocol:** alpha-4 with staking-based tokenomics ([#14065](https://github.com/taikoxyz/taiko-mono/issues/14065)) ([1eeba9d](https://github.com/taikoxyz/taiko-mono/commit/1eeba9d97ed8e6e4a8d07a8b0af163a16fbc9ccf)) - -## [0.2.0](https://github.com/taikoxyz/taiko-mono/compare/branding-v0.1.2...branding-v0.2.0) (2023-07-24) - - -### Features - -* **website:** update setting up wallet docs ([#14227](https://github.com/taikoxyz/taiko-mono/issues/14227)) ([3751198](https://github.com/taikoxyz/taiko-mono/commit/3751198826c1db7de00ecb83645c13b23d1ed9e3)) - -## [0.1.2](https://github.com/taikoxyz/taiko-mono/compare/branding-v0.1.1...branding-v0.1.2) (2023-06-12) - - -### Bug Fixes - -* **repo,branding:** update to new taiko logo ([#13881](https://github.com/taikoxyz/taiko-mono/issues/13881)) ([0878874](https://github.com/taikoxyz/taiko-mono/commit/08788746a7485831d1a590073049e2d9abccadbb)) - -## [0.1.1](https://github.com/taikoxyz/taiko-mono/compare/branding-v0.1.0...branding-v0.1.1) (2023-03-29) - - -### Bug Fixes - -* **branding:** remove deprecated logos and wordmarks ([#13393](https://github.com/taikoxyz/taiko-mono/issues/13393)) ([b14472c](https://github.com/taikoxyz/taiko-mono/commit/b14472c55e2109a0e3a6b6a9d44c80ca36992397)) - -## [0.1.0](https://github.com/taikoxyz/taiko-mono/compare/branding-v0.0.1...branding-v0.1.0) (2023-01-19) - - -### Features - -* implement release-please workflow ([#12967](https://github.com/taikoxyz/taiko-mono/issues/12967)) ([b0c8b60](https://github.com/taikoxyz/taiko-mono/commit/b0c8b60da0af3160db758f83c1f6368a3a712593)) -* **website:** update website homepage ([#278](https://github.com/taikoxyz/taiko-mono/issues/278)) ([07a2709](https://github.com/taikoxyz/taiko-mono/commit/07a270995351849bf63acdf0878dcc91fae8f71a)) diff --git a/packages/branding/RBG PNG (For Digital Use)/Taiko Icon/taiko-icon-mono-2x.png b/packages/branding/RBG PNG (For Digital Use)/Taiko Icon/taiko-icon-mono-2x.png deleted file mode 100644 index 381c8795f39..00000000000 Binary files a/packages/branding/RBG PNG (For Digital Use)/Taiko Icon/taiko-icon-mono-2x.png and /dev/null differ diff --git a/packages/branding/RBG PNG (For Digital Use)/Taiko Icon/taiko-icon-mono.png b/packages/branding/RBG PNG (For Digital Use)/Taiko Icon/taiko-icon-mono.png deleted file mode 100644 index d1b40c4f068..00000000000 Binary files a/packages/branding/RBG PNG (For Digital Use)/Taiko Icon/taiko-icon-mono.png and /dev/null differ diff --git a/packages/branding/RBG PNG (For Digital Use)/Taiko Icon/taiko-icon-wht-2x.png b/packages/branding/RBG PNG (For Digital Use)/Taiko Icon/taiko-icon-wht-2x.png deleted file mode 100644 index a27c17f5d52..00000000000 Binary files a/packages/branding/RBG PNG (For Digital Use)/Taiko Icon/taiko-icon-wht-2x.png and /dev/null differ diff --git a/packages/branding/RBG PNG (For Digital Use)/Taiko Icon/taiko-icon-wht.png b/packages/branding/RBG PNG (For Digital Use)/Taiko Icon/taiko-icon-wht.png deleted file mode 100644 index e0118802172..00000000000 Binary files a/packages/branding/RBG PNG (For Digital Use)/Taiko Icon/taiko-icon-wht.png and /dev/null differ diff --git a/packages/branding/RBG PNG (For Digital Use)/Taiko Icon/taiko-icon-wht_background.png b/packages/branding/RBG PNG (For Digital Use)/Taiko Icon/taiko-icon-wht_background.png deleted file mode 100644 index cd8b64069fc..00000000000 Binary files a/packages/branding/RBG PNG (For Digital Use)/Taiko Icon/taiko-icon-wht_background.png and /dev/null differ diff --git a/packages/branding/RBG PNG (For Digital Use)/Taiko Logos/taiko-h-blk.png b/packages/branding/RBG PNG (For Digital Use)/Taiko Logos/taiko-h-blk.png deleted file mode 100644 index 98e6505fbef..00000000000 Binary files a/packages/branding/RBG PNG (For Digital Use)/Taiko Logos/taiko-h-blk.png and /dev/null differ diff --git a/packages/branding/RBG PNG (For Digital Use)/Taiko Logos/taiko-h-mono.png b/packages/branding/RBG PNG (For Digital Use)/Taiko Logos/taiko-h-mono.png deleted file mode 100644 index d6bf87de455..00000000000 Binary files a/packages/branding/RBG PNG (For Digital Use)/Taiko Logos/taiko-h-mono.png and /dev/null differ diff --git a/packages/branding/RBG PNG (For Digital Use)/Taiko Logos/taiko-h-wht.png b/packages/branding/RBG PNG (For Digital Use)/Taiko Logos/taiko-h-wht.png deleted file mode 100644 index 5473dcaac25..00000000000 Binary files a/packages/branding/RBG PNG (For Digital Use)/Taiko Logos/taiko-h-wht.png and /dev/null differ diff --git a/packages/branding/RBG PNG (For Digital Use)/Taiko Logos/taiko-h-wht_background.png b/packages/branding/RBG PNG (For Digital Use)/Taiko Logos/taiko-h-wht_background.png deleted file mode 100644 index 44b7aa16483..00000000000 Binary files a/packages/branding/RBG PNG (For Digital Use)/Taiko Logos/taiko-h-wht_background.png and /dev/null differ diff --git a/packages/branding/RBG PNG (For Digital Use)/Taiko Logos/taiko-v-blk.png b/packages/branding/RBG PNG (For Digital Use)/Taiko Logos/taiko-v-blk.png deleted file mode 100644 index e26a6483717..00000000000 Binary files a/packages/branding/RBG PNG (For Digital Use)/Taiko Logos/taiko-v-blk.png and /dev/null differ diff --git a/packages/branding/RBG PNG (For Digital Use)/Taiko Logos/taiko-v-mono.png b/packages/branding/RBG PNG (For Digital Use)/Taiko Logos/taiko-v-mono.png deleted file mode 100644 index 9e0c5e5c232..00000000000 Binary files a/packages/branding/RBG PNG (For Digital Use)/Taiko Logos/taiko-v-mono.png and /dev/null differ diff --git a/packages/branding/RBG PNG (For Digital Use)/Taiko Logos/taiko-v-wht-background.png b/packages/branding/RBG PNG (For Digital Use)/Taiko Logos/taiko-v-wht-background.png deleted file mode 100644 index 2c28cec6ff1..00000000000 Binary files a/packages/branding/RBG PNG (For Digital Use)/Taiko Logos/taiko-v-wht-background.png and /dev/null differ diff --git a/packages/branding/RBG PNG (For Digital Use)/Taiko Logos/taiko-v-wht.png b/packages/branding/RBG PNG (For Digital Use)/Taiko Logos/taiko-v-wht.png deleted file mode 100644 index 4d91bfce969..00000000000 Binary files a/packages/branding/RBG PNG (For Digital Use)/Taiko Logos/taiko-v-wht.png and /dev/null differ diff --git a/packages/branding/README.md b/packages/branding/README.md deleted file mode 100644 index 4310f3767ab..00000000000 --- a/packages/branding/README.md +++ /dev/null @@ -1,17 +0,0 @@ -# Taiko branding guide - -This package contains some branding assets for Taiko. The full brand kit can be found on [Figma](). - -## Naming - -Use `Taiko` or `Taiko Labs` for the name. - -Use `taikoxyz` for the social handle (e.g., Twitter: [@taikoxyz](https://twitter.com/taikoxyz), GitHub: [@taikoxyz](https://github.com/taikoxyz)). - -## Files - -Look inside of this package for some common files you can use. Otherwise, please resort to the [Figma](). - -## Colors - -Our primary hex color is `#E81899`. For the full color palette and further details, please resort to the [Figma](). diff --git a/packages/branding/RGB SVG (For Digital Use)/Taiko Icon/taiko-icon-mono.svg b/packages/branding/RGB SVG (For Digital Use)/Taiko Icon/taiko-icon-mono.svg deleted file mode 100644 index c5a360a4ec4..00000000000 --- a/packages/branding/RGB SVG (For Digital Use)/Taiko Icon/taiko-icon-mono.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/packages/branding/RGB SVG (For Digital Use)/Taiko Logos/taiko-h-blk.svg b/packages/branding/RGB SVG (For Digital Use)/Taiko Logos/taiko-h-blk.svg deleted file mode 100644 index 07be42d8fa5..00000000000 --- a/packages/branding/RGB SVG (For Digital Use)/Taiko Logos/taiko-h-blk.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/packages/branding/RGB SVG (For Digital Use)/Taiko Logos/taiko-h-mono.svg b/packages/branding/RGB SVG (For Digital Use)/Taiko Logos/taiko-h-mono.svg deleted file mode 100644 index a3f703443c6..00000000000 --- a/packages/branding/RGB SVG (For Digital Use)/Taiko Logos/taiko-h-mono.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/packages/branding/RGB SVG (For Digital Use)/Taiko Logos/taiko-h-wht.svg b/packages/branding/RGB SVG (For Digital Use)/Taiko Logos/taiko-h-wht.svg deleted file mode 100644 index 74b63e542e9..00000000000 --- a/packages/branding/RGB SVG (For Digital Use)/Taiko Logos/taiko-h-wht.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/packages/branding/RGB SVG (For Digital Use)/Taiko Logos/taiko-v-blk.svg b/packages/branding/RGB SVG (For Digital Use)/Taiko Logos/taiko-v-blk.svg deleted file mode 100644 index 210b2484787..00000000000 --- a/packages/branding/RGB SVG (For Digital Use)/Taiko Logos/taiko-v-blk.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/packages/branding/RGB SVG (For Digital Use)/Taiko Logos/taiko-v-mono.svg b/packages/branding/RGB SVG (For Digital Use)/Taiko Logos/taiko-v-mono.svg deleted file mode 100644 index 1b4fa1da044..00000000000 --- a/packages/branding/RGB SVG (For Digital Use)/Taiko Logos/taiko-v-mono.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/packages/branding/RGB SVG (For Digital Use)/Taiko Logos/taiko-v-wht.svg b/packages/branding/RGB SVG (For Digital Use)/Taiko Logos/taiko-v-wht.svg deleted file mode 100644 index 37b726687f4..00000000000 --- a/packages/branding/RGB SVG (For Digital Use)/Taiko Logos/taiko-v-wht.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/packages/branding/package.json b/packages/branding/package.json deleted file mode 100644 index 16625484576..00000000000 --- a/packages/branding/package.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "name": "@taiko/branding", - "version": "0.4.0", - "private": true -} diff --git a/packages/branding/taiko-icon-wht-200x200.png b/packages/branding/taiko-icon-wht-200x200.png deleted file mode 100644 index bbe444a7b82..00000000000 Binary files a/packages/branding/taiko-icon-wht-200x200.png and /dev/null differ diff --git a/packages/branding/testnet-token-images/bull.svg b/packages/branding/testnet-token-images/bull.svg deleted file mode 100644 index deae0a33f16..00000000000 --- a/packages/branding/testnet-token-images/bull.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/packages/branding/testnet-token-images/horse.svg b/packages/branding/testnet-token-images/horse.svg deleted file mode 100644 index 2fdee8a6793..00000000000 --- a/packages/branding/testnet-token-images/horse.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/packages/branding/testnet-token-images/ttko.svg b/packages/branding/testnet-token-images/ttko.svg deleted file mode 100644 index 9e02705a372..00000000000 --- a/packages/branding/testnet-token-images/ttko.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/packages/bridge-ui/CHANGELOG.md b/packages/bridge-ui/CHANGELOG.md index 475bd4f6832..95b3a0b3280 100644 --- a/packages/bridge-ui/CHANGELOG.md +++ b/packages/bridge-ui/CHANGELOG.md @@ -1,5 +1,68 @@ # Changelog +## [2.13.0](https://github.com/taikoxyz/taiko-mono/compare/bridge-ui-v2.12.0...bridge-ui-v2.13.0) (2024-12-17) + + +### Features + +* **bridge-ui:** add curve ([#18549](https://github.com/taikoxyz/taiko-mono/issues/18549)) ([fd6feef](https://github.com/taikoxyz/taiko-mono/commit/fd6feef545c2432eea8e71c68dc3f3964fe65c17)) +* **bridge-ui:** add padding when claiming to smart contract ([#18141](https://github.com/taikoxyz/taiko-mono/issues/18141)) ([ce5d485](https://github.com/taikoxyz/taiko-mono/commit/ce5d4859a77631ec406ccb5d571efcd91e5fd2f8)) +* **bridge-ui:** more detailed transactions view ([#17899](https://github.com/taikoxyz/taiko-mono/issues/17899)) ([6fe7c44](https://github.com/taikoxyz/taiko-mono/commit/6fe7c447b7c9c13b5868c65c69a9ddfeb968901a)) +* **bridge-ui:** remove fee padding ([#18546](https://github.com/taikoxyz/taiko-mono/issues/18546)) ([3966bb1](https://github.com/taikoxyz/taiko-mono/commit/3966bb1cea358923284de74b81e3ce512b8291dd)) + + +### Bug Fixes + +* **bridge-ui:** balance visually not updating correctly when switching chains ([#17832](https://github.com/taikoxyz/taiko-mono/issues/17832)) ([f495e40](https://github.com/taikoxyz/taiko-mono/commit/f495e406633fc9349e8d3a125c463c0be1e15b66)) +* **bridge-ui:** increase pagesize ([#17886](https://github.com/taikoxyz/taiko-mono/issues/17886)) ([9e38a33](https://github.com/taikoxyz/taiko-mono/commit/9e38a33cd361dc6bd2e2e77a8017151eb08400f3)) + + +### Workflow + +* **protocol:** trigger patch release (1.10.1) ([#18358](https://github.com/taikoxyz/taiko-mono/issues/18358)) ([f4f4796](https://github.com/taikoxyz/taiko-mono/commit/f4f4796488059b02c79d6fb15170df58dd31dc4e)) + + +### Build + +* **deps-dev:** bump @sveltejs/kit from 2.5.7 to 2.5.21 ([#17901](https://github.com/taikoxyz/taiko-mono/issues/17901)) ([7a32ac4](https://github.com/taikoxyz/taiko-mono/commit/7a32ac40a654521c82cb3ff5b6f5af87d0a915a4)) +* **deps:** bump github.com/stretchr/testify from 1.9.0 to 1.10.0 ([#18539](https://github.com/taikoxyz/taiko-mono/issues/18539)) ([79f3fab](https://github.com/taikoxyz/taiko-mono/commit/79f3fab5f1d1ec1bb4ee18afb9268b622e894780)) +* **deps:** bump golang.org/x/sync from 0.9.0 to 0.10.0 ([#18560](https://github.com/taikoxyz/taiko-mono/issues/18560)) ([3d51970](https://github.com/taikoxyz/taiko-mono/commit/3d51970aa0953bbfecaeebf76ea7e664c875c0e4)) + +## [2.12.0](https://github.com/taikoxyz/taiko-mono/compare/bridge-ui-v2.11.0...bridge-ui-v2.12.0) (2024-07-18) + + +### Features + +* **bridge-ui:** configurable destOwner ([#17721](https://github.com/taikoxyz/taiko-mono/issues/17721)) ([3220a22](https://github.com/taikoxyz/taiko-mono/commit/3220a22ad11fb3bded7e1641b1de93d5a391461e)) +* **bridge-ui:** fallback gasprice for processingfee ([#17578](https://github.com/taikoxyz/taiko-mono/issues/17578)) ([c621426](https://github.com/taikoxyz/taiko-mono/commit/c621426c430bd01a3f7dbbb39058e8357601c507)) +* **bridge-ui:** polishing ([#17460](https://github.com/taikoxyz/taiko-mono/issues/17460)) ([a3faee0](https://github.com/taikoxyz/taiko-mono/commit/a3faee088ee5ed235f9b4020aa2afce77d0f8108)) +* **bridge-ui:** relayer component ([#17777](https://github.com/taikoxyz/taiko-mono/issues/17777)) ([458e259](https://github.com/taikoxyz/taiko-mono/commit/458e259e3f2cbcf316d27a239fc19a7ca417ce4d)) +* **bridge-ui:** rounding fix. ([#17409](https://github.com/taikoxyz/taiko-mono/issues/17409)) ([eac7434](https://github.com/taikoxyz/taiko-mono/commit/eac743445b9a1c21ed03aede036098ba3add261a)) +* **bridge-ui:** update usdc wording, add minimum fee check ([#17419](https://github.com/taikoxyz/taiko-mono/issues/17419)) ([07211da](https://github.com/taikoxyz/taiko-mono/commit/07211da83c9f5ca782fc5d9a02680968bf81ee24)) + + +### Bug Fixes + +* **bridge-ui:** bigint conversion ([#17534](https://github.com/taikoxyz/taiko-mono/issues/17534)) ([4279ccd](https://github.com/taikoxyz/taiko-mono/commit/4279ccd59024578d51b39a6b26a0138409a42f44)) +* **bridge-ui:** fix claiming for recipients that do not match srcOwner ([#17576](https://github.com/taikoxyz/taiko-mono/issues/17576)) ([6eaaa12](https://github.com/taikoxyz/taiko-mono/commit/6eaaa127bf12df486ce648f66d719138631e851f)) +* **bridge-ui:** fix funds message ([#17507](https://github.com/taikoxyz/taiko-mono/issues/17507)) ([55293a5](https://github.com/taikoxyz/taiko-mono/commit/55293a5208f729964279fb07056a90b08e56a4ec)) +* **bridge-ui:** fix manual claim issue ([#17518](https://github.com/taikoxyz/taiko-mono/issues/17518)) ([3f5b73d](https://github.com/taikoxyz/taiko-mono/commit/3f5b73ddf47dd1c9853d5d2d9a75e8cd95ecccbf)) +* **bridge-ui:** fix parsing relayer ([#17551](https://github.com/taikoxyz/taiko-mono/issues/17551)) ([1b3eb90](https://github.com/taikoxyz/taiko-mono/commit/1b3eb9029ae7e6903496d774c9c115c73774c097)) +* **bridge-ui:** fix USDT approvals ([#17539](https://github.com/taikoxyz/taiko-mono/issues/17539)) ([37cb7af](https://github.com/taikoxyz/taiko-mono/commit/37cb7af834d189051c2de895b384997c4fc13b9a)) +* **bridge-ui:** handle local tx better ([#17684](https://github.com/taikoxyz/taiko-mono/issues/17684)) ([3455e11](https://github.com/taikoxyz/taiko-mono/commit/3455e11c5f82b25fcb9a35d2f781b46891493372)) +* **bridge-ui:** increase gaslimit for erc20 ([#17531](https://github.com/taikoxyz/taiko-mono/issues/17531)) ([3a7268d](https://github.com/taikoxyz/taiko-mono/commit/3a7268df33e5f778b22b7624c4baec6739083641)) +* **bridge-ui:** lock continue button when fee is calculating ([#17548](https://github.com/taikoxyz/taiko-mono/issues/17548)) ([5781b33](https://github.com/taikoxyz/taiko-mono/commit/5781b338221dbe1e8ab2a1556ffeeaa239b8d957)) +* **bridge-ui:** msg value mapping ([#17554](https://github.com/taikoxyz/taiko-mono/issues/17554)) ([e58d41a](https://github.com/taikoxyz/taiko-mono/commit/e58d41a39b7e132fe094d04bb453929155f4ba4b)) +* **bridge-ui:** recallMessage fix ([#17547](https://github.com/taikoxyz/taiko-mono/issues/17547)) ([11755d1](https://github.com/taikoxyz/taiko-mono/commit/11755d164a532980214e69219d328fa66a06f6cc)) +* **bridge-ui:** small fixes ([#17375](https://github.com/taikoxyz/taiko-mono/issues/17375)) ([5236d0a](https://github.com/taikoxyz/taiko-mono/commit/5236d0a50a82e3915eb955962ccc930110d6274e)) + + +### Chores + +* **bridge-ui:** add DAI ([#17714](https://github.com/taikoxyz/taiko-mono/issues/17714)) ([3439579](https://github.com/taikoxyz/taiko-mono/commit/3439579356c8f8bfbcc77b68c1d08cb142ab4196)) +* **bridge-ui:** add symbiosis ([#17505](https://github.com/taikoxyz/taiko-mono/issues/17505)) ([9e504d2](https://github.com/taikoxyz/taiko-mono/commit/9e504d27976d25da89a48e7a4453f6e36f8055f3)) +* **bridge-ui:** update stablecoin warning and campaign info ([#17716](https://github.com/taikoxyz/taiko-mono/issues/17716)) ([c370c7e](https://github.com/taikoxyz/taiko-mono/commit/c370c7e0976bbe1160b074be665d751410367d16)) + ## [2.11.0](https://github.com/taikoxyz/taiko-mono/compare/bridge-ui-v2.10.1...bridge-ui-v2.11.0) (2024-05-27) diff --git a/packages/bridge-ui/package.json b/packages/bridge-ui/package.json index 18cc131771b..601c5923d39 100644 --- a/packages/bridge-ui/package.json +++ b/packages/bridge-ui/package.json @@ -1,6 +1,6 @@ { "name": "bridge-ui", - "version": "2.11.0", + "version": "2.13.0", "private": true, "scripts": { "dev": "vite dev", @@ -23,7 +23,7 @@ "devDependencies": { "@playwright/test": "^1.43.1", "@sveltejs/adapter-auto": "^3.2.0", - "@sveltejs/kit": "^2.5.7", + "@sveltejs/kit": "^2.5.21", "@sveltejs/vite-plugin-svelte": "^3.1.0", "@types/debug": "^4.1.12", "@types/object-hash": "^3.0.6", diff --git a/packages/bridge-ui/src/app.config.ts b/packages/bridge-ui/src/app.config.ts index 2ae6db4e931..8c9ebc03692 100644 --- a/packages/bridge-ui/src/app.config.ts +++ b/packages/bridge-ui/src/app.config.ts @@ -1,8 +1,8 @@ export const gasLimitConfig = { GAS_RESERVE: 650_000, // based on Bridge.sol ethGasLimit: 100_000, - erc20NotDeployedGasLimit: 650_000, - erc20DeployedGasLimit: 200_000, + erc20NotDeployedGasLimit: 750_000, + erc20DeployedGasLimit: 500_000, erc721NotDeployedGasLimit: 2_400_000, erc721DeployedGasLimit: 1_100_000, erc1155NotDeployedGasLimit: 2_600_000, @@ -42,7 +42,7 @@ export const toastConfig = { }; export const apiService = { - timeout: 5000, + timeout: 10_000, // 10 seconds }; export const ipfsConfig = { diff --git a/packages/bridge-ui/src/components/Bridge/FungibleBridgeComponents/ImportStep/ImportStep.svelte b/packages/bridge-ui/src/components/Bridge/FungibleBridgeComponents/ImportStep/ImportStep.svelte index 7a86cff7250..b928cf206cc 100644 --- a/packages/bridge-ui/src/components/Bridge/FungibleBridgeComponents/ImportStep/ImportStep.svelte +++ b/packages/bridge-ui/src/components/Bridge/FungibleBridgeComponents/ImportStep/ImportStep.svelte @@ -1,7 +1,7 @@
@@ -326,7 +342,7 @@
- + diff --git a/packages/bridge-ui/src/components/Transactions/Rows/NftTransactionRow.svelte b/packages/bridge-ui/src/components/Transactions/Rows/NftTransactionRow.svelte new file mode 100644 index 00000000000..51214d9396c --- /dev/null +++ b/packages/bridge-ui/src/components/Transactions/Rows/NftTransactionRow.svelte @@ -0,0 +1,289 @@ + + + +
+ + {#if $isMobile} +
+
+
+
+ + {shortenAddress(bridgeTx.message?.from, 4, 3)} +
+
+ + {shortenAddress(bridgeTx.message?.to, 4, 3)} +
+
+ +
+ {#if loading} + + {:else} + NFT + {/if} +
+ + + {:else if $isDesktop} +
+ NFT +
+ {token?.name ? truncateString(token?.name, 8) : $t('common.not_available_short')} + #{token?.tokenId} +
+
+ +
+ + {shortenAddress(bridgeTx.message?.from)} +
+
+ + {shortenAddress(bridgeTx.message?.to)} +
+ + {:else if $isTablet} +
+ NFT +
+ +
+ + {shortenAddress(bridgeTx.message?.from, 5, 1)} +
+
+ + {shortenAddress(bridgeTx.message?.to, 5, 1)} +
+ {/if} + +
+ +
+ + {#if $isDesktop} +
+ {#if timestamp} + {timestamp} + {:else} + + {/if} +
+ +
+ +
+ {/if} +
+ + + + + + + + + + + + handleClaimingDone()} /> + + diff --git a/packages/bridge-ui/src/components/Transactions/Rows/index.ts b/packages/bridge-ui/src/components/Transactions/Rows/index.ts new file mode 100644 index 00000000000..64e41f1f2ea --- /dev/null +++ b/packages/bridge-ui/src/components/Transactions/Rows/index.ts @@ -0,0 +1,2 @@ +export { default as FungibleTransactionRow } from './FungibleTransactionRow.svelte'; +export { default as NftTransactionRow } from './NftTransactionRow.svelte'; diff --git a/packages/bridge-ui/src/components/Transactions/Status/Status.svelte b/packages/bridge-ui/src/components/Transactions/Status/Status.svelte index 868218e8a6a..8c0d8efe8ea 100644 --- a/packages/bridge-ui/src/components/Transactions/Status/Status.svelte +++ b/packages/bridge-ui/src/components/Transactions/Status/Status.svelte @@ -8,6 +8,7 @@ import { isTransactionProcessable } from '$libs/bridge/isTransactionProcessable'; import { BridgePausedError } from '$libs/error'; import { PollingEvent, startPolling } from '$libs/polling/messageStatusPoller'; + import { bridgeTxService } from '$libs/storage'; import { isBridgePaused } from '$libs/util/checkForPausedContracts'; import { account } from '$stores/account'; import { connectedSourceChain } from '$stores/network'; @@ -15,14 +16,14 @@ const dispatch = createEventDispatcher(); export let bridgeTx: BridgeTransaction; - - let polling: ReturnType; + export let bridgeTxStatus: Maybe; + export let textOnly: boolean = false; // UI state let isProcessable = false; // bridge tx state to be processed: claimed/retried/released - export let bridgeTxStatus: Maybe; - + let polling: ReturnType; let loading = false; + let hasError = false; function onProcessable(isTxProcessable: boolean) { isProcessable = isTxProcessable; @@ -31,6 +32,7 @@ function onStatusChange(status: MessageStatus) { // Keeping model and UI in sync bridgeTxStatus = bridgeTx.msgStatus = status; + dispatch('statusChange', status); } async function handleRetryClick() { @@ -69,6 +71,16 @@ // TODO: implement release handling } + $: if (hasError && $account.address) { + if (bridgeTxService.transactionIsStoredLocally($account.address, bridgeTx)) { + // If we can't start polling, it maybe an old/outdated transaction in the local storage, so we remove it + bridgeTxService.removeTransactions($account.address, [bridgeTx]); + if (!bridgeTxService.transactionIsStoredLocally($account.address, bridgeTx)) { + dispatch('transactionRemoved', bridgeTx); + } + } + } + onMount(async () => { if (bridgeTx && $account?.address) { bridgeTxStatus = bridgeTx.msgStatus; @@ -87,8 +99,8 @@ polling.emitter.on(PollingEvent.STATUS, onStatusChange); } } catch (err) { - console.error(err); - // TODO: handle error + console.warn('Cannot start polling', err); + hasError = true; } } }); @@ -110,20 +122,38 @@ {$t(`transactions.status.${loading}`)} {:else if bridgeTxStatus === MessageStatus.NEW} - + {#if textOnly} + + {$t('transactions.status.claimable')} + {:else} + + {/if} {:else if bridgeTxStatus === MessageStatus.RETRIABLE} - + {#if textOnly} + + {$t('transactions.status.retriable')} + {:else} + + {/if} {:else if bridgeTxStatus === MessageStatus.DONE} {$t('transactions.status.claimed.name')} {:else if bridgeTxStatus === MessageStatus.FAILED} - + {#if textOnly} + + {$t('transactions.status.releasable')} + {:else} + + {/if} + {:else if bridgeTxStatus === MessageStatus.RECALLED} + + {$t('transactions.status.released.name')} {:else} diff --git a/packages/bridge-ui/src/components/Transactions/Status/StatusInfoDialog.svelte b/packages/bridge-ui/src/components/Transactions/Status/StatusInfoDialog.svelte index 3dc7f7245b5..672480a605e 100644 --- a/packages/bridge-ui/src/components/Transactions/Status/StatusInfoDialog.svelte +++ b/packages/bridge-ui/src/components/Transactions/Status/StatusInfoDialog.svelte @@ -3,13 +3,12 @@ import { CloseButton } from '$components/Button'; import { Icon } from '$components/Icon'; - import { uid } from '$libs/util/uid'; export let modalOpen = false; export let noIcon = false; - const dialogId = `dialog-${uid()}`; + const dialogId = `dialog-${crypto.randomUUID()}`; const closeModal = () => (modalOpen = false); diff --git a/packages/bridge-ui/src/components/Transactions/Transaction.svelte b/packages/bridge-ui/src/components/Transactions/Transaction.svelte deleted file mode 100644 index a27e720be9e..00000000000 --- a/packages/bridge-ui/src/components/Transactions/Transaction.svelte +++ /dev/null @@ -1,289 +0,0 @@ - - -{#if isNFT} - - -
- {#if isDesktopOrLarger} -
- {#if loading} -
- -
-
- - - -
- {:else} - -
-
{token?.name ? truncateString(token?.name, 15) : 'No Token Name'}
-
- {token?.metadata?.name ? truncateString(token?.metadata?.name, 15) : ''} -
-
{token?.tokenId}
-
- {/if} -
-
- -
-
- -
-
- {itemAmountDisplay} -
- {:else} - -
- {#if loading} -
- -
- {:else} - nft - {/if} - - {#if loading} -
-
- -
- -
- {:else} -
-
- {truncateString(getChainName(Number(item.srcChainId)), 8)} - - - - {truncateString(getChainName(Number(item.destChainId)), 8)} -
- {token?.name ? truncateString(token?.name, 15) : ''} -
- {/if} -
- {/if} -
- -
- -
-{:else} - -
- {#if isDesktopOrLarger} -
- -
-
- -
-
- {#if item.tokenType === TokenType.ERC20} - {formatUnits(item.amount ? item.amount : BigInt(0), item.decimals ?? 0)} - {:else if item.tokenType === TokenType.ETH} - {formatEther(item.amount ? item.amount : BigInt(0))} - {/if} - {item.symbol} -
- {:else} -
-
-
- {getChainName(Number(item.srcChainId))} - - - - {getChainName(Number(item.destChainId))} -
-
- {#if item.tokenType === TokenType.ERC20} - {formatUnits(item.amount ? item.amount : BigInt(0), item.decimals ?? 0)} - {:else if item.tokenType === TokenType.ETH} - {formatEther(item.amount ? item.amount : BigInt(0))} - {/if} - {item.symbol} -
-
-
- {/if} - -
- -
- -
-{/if} - - - - - - - - - - - - - - claimingDone()} /> diff --git a/packages/bridge-ui/src/components/Transactions/Transactions.svelte b/packages/bridge-ui/src/components/Transactions/Transactions.svelte index 8c278355759..d26de657103 100644 --- a/packages/bridge-ui/src/components/Transactions/Transactions.svelte +++ b/packages/bridge-ui/src/components/Transactions/Transactions.svelte @@ -3,7 +3,6 @@ import { t } from 'svelte-i18n'; import type { Address } from 'viem'; - import { Alert } from '$components/Alert'; import { activeBridge } from '$components/Bridge/state'; import { destNetwork } from '$components/Bridge/state'; import { BridgeTypes } from '$components/Bridge/types'; @@ -20,18 +19,18 @@ import { Spinner } from '$components/Spinner'; import StatusDot from '$components/StatusDot/StatusDot.svelte'; import { transactionConfig } from '$config'; - import { PUBLIC_SLOW_L1_BRIDGING_WARNING } from '$env/static/public'; import { type BridgeTransaction, fetchTransactions, MessageStatus } from '$libs/bridge'; import { chainIdToChain } from '$libs/chain'; import { getAlternateNetwork } from '$libs/network'; import { bridgeTxService } from '$libs/storage'; import { TokenType } from '$libs/token'; + import { isDesktop, isTablet } from '$libs/util/responsiveCheck'; import { account } from '$stores'; import type { Account } from '$stores/account'; import { StatusFilterDialog, StatusFilterDropdown } from './Filter'; + import { FungibleTransactionRow, NftTransactionRow } from './Rows/'; import { StatusInfoDialog } from './Status'; - import Transaction from './Transaction.svelte'; let transactions: BridgeTransaction[] = []; @@ -49,8 +48,6 @@ let selectedStatus: MessageStatus | null = null; // null indicates no filter is applied - let slowL1Warning = PUBLIC_SLOW_L1_BRIDGING_WARNING || false; - let menuOpen = false; const toggleMenu = () => { @@ -85,6 +82,10 @@ } }; + const handleTransactionRemoved = () => { + refresh(); + }; + const updateTransactions = async (address: Address) => { if (loadingTxs) return; loadingTxs = true; @@ -116,14 +117,14 @@ $: transactionsToShow = getTransactionsToShow(currentPage, pageSize, tokenAndStatusFilteredTransactions); - $: fungibleDesktopView = isDesktopOrLarger && $activeBridge === BridgeTypes.FUNGIBLE; - $: nftDesktopView = isDesktopOrLarger && $activeBridge === BridgeTypes.NFT; + $: fungibleView = $activeBridge === BridgeTypes.FUNGIBLE; + $: nftView = $activeBridge === BridgeTypes.NFT; $: fungibleTokens = [TokenType.ERC20, TokenType.ETH]; $: nftTokens = [TokenType.ERC721, TokenType.ERC1155]; $: allTokens = [...fungibleTokens, ...nftTokens]; - $: displayTokenTypesBasedOnType = fungibleDesktopView ? fungibleTokens : nftDesktopView ? nftTokens : allTokens; + $: displayTokenTypesBasedOnType = fungibleView ? fungibleTokens : nftView ? nftTokens : allTokens; $: filteredTransactions = transactions.filter((tx) => displayTokenTypesBasedOnType.includes(tx.tokenType)); @@ -140,8 +141,6 @@ $: renderTransactions = !renderLoading && isConnected && hasTxs; $: renderNoTransactions = !renderLoading && transactionsToShow.length === 0; - $: displayL1Warning = slowL1Warning; - onMount(() => { const alternateChainID = getAlternateNetwork(); if (!$destNetwork && alternateChainID) { @@ -154,7 +153,7 @@
- {#if isDesktopOrLarger} + {#if $isDesktop}
- +
@@ -197,42 +196,74 @@
{/if} - {#if displayL1Warning} -
- {$t('bridge.alerts.slow_bridging')} -
- {/if}
-
- {#if isDesktopOrLarger} -
- {#if $activeBridge === BridgeTypes.FUNGIBLE} -
{$t('transactions.header.from')}
-
{$t('transactions.header.to')}
-
{$t('transactions.header.amount')}
-
+
+ +
+ {#if $activeBridge === BridgeTypes.FUNGIBLE} + {#if $isDesktop} +
{$t('transactions.header.from')}
+
{$t('transactions.header.to')}
+
{$t('transactions.header.amount')}
+
{$t('transactions.header.status')}
-
{$t('transactions.header.explorer')}
- {:else if $activeBridge === BridgeTypes.NFT} -
{$t('transactions.header.item')}
-
{$t('transactions.header.from')}
-
{$t('transactions.header.to')}
-
{$t('transactions.header.amount')}
-
+
{$t('transactions.header.date')}
+
+ {:else if $isTablet} +
{$t('transactions.header.from')}
+
{$t('transactions.header.to')}
+
{$t('transactions.header.amount')}
+
{$t('transactions.header.status')}
-
- {$t('transactions.header.explorer')} + {:else} +
+ {$t('transactions.header.details')} +
+
{$t('transactions.header.amount')}
+
+ {$t('transactions.header.status')} +
{/if} -
-
- {/if} + {:else if $activeBridge === BridgeTypes.NFT} + {#if $isDesktop} +
{$t('transactions.header.nft')}
+
{$t('transactions.header.from')}
+
{$t('transactions.header.to')}
+
+ {$t('transactions.header.status')} + +
+
{$t('transactions.header.date')}
+
+ {:else if $isTablet} +
{$t('transactions.header.nft')}
+
{$t('transactions.header.from')}
+
{$t('transactions.header.to')}
+ +
+ {$t('transactions.header.status')} + +
+ {:else} +
+ {$t('transactions.header.details')} +
+
{$t('transactions.header.nft')}
+
+ {$t('transactions.header.status')} + +
+ {/if} + {/if} +
+
{#if renderLoading}
@@ -244,9 +275,15 @@
- {#each transactionsToShow as item (item.hash)} - -
+ {#each transactionsToShow as bridgeTx (bridgeTx.srcTxHash)} + {@const status = bridgeTx.msgStatus} + {@const isFungible = bridgeTx.tokenType === TokenType.ERC20 || bridgeTx.tokenType === TokenType.ETH} + {#if isFungible} + + {:else} + + {/if} +
{/each}
{/if} @@ -260,7 +297,7 @@
-
+
handlePageChange(detail)} />
diff --git a/packages/bridge-ui/src/i18n/en.json b/packages/bridge-ui/src/i18n/en.json index f9e04b28cec..927488038db 100644 --- a/packages/bridge-ui/src/i18n/en.json +++ b/packages/bridge-ui/src/i18n/en.json @@ -39,10 +39,9 @@ "nft_scan_again": "Scan again" }, "alerts": { - "not_enough_funds": "You do not have enough ETH to cover the processing fee and transaction fee", - "slow_bridging": "Please note: Bridging to L1 will take around 24hrs!", + "not_enough_funds": "You do not have enough ETH to cover the processing fee and transaction fee. Please add more ETH to your wallet (>= 0.0015 ETH).", + "slow_bridging": "Please note: Bridging to L1 will take around 4hs!", "smart_contract_wallet": "It seems you are using a smart contract wallet. Please double check that the recipient matches your wallet on the destination or change it accordingly.", - "stable_coin": "You are bridging a stable coin. For USDC, we are currently partnering with Stargate Bridge for liquidity. Consider using their bridge, as the ecosystem partners are likely using their bridged version", "wrapped_eth": "You are bridging wrapped ETH. Please be aware that un-wrapping will only work on the original chain of the token, NOT on the destination." }, "button": { @@ -53,6 +52,9 @@ "bridging": "Bridging", "fetch": "Fetch NFT data", "import": "Import", + "reset": "Reset", + "reset_approval": "Reset Approval", + "resetting": "Resetting", "validating": "Validating..." }, "description": { @@ -205,6 +207,9 @@ "recipient": "Recipient", "review": "Review" } + }, + "usdt_approval": { + "info": "You have previously approved a lower amount of USDT. To adjust the approval, you must first reset the previous amount to 0. This requirement is unique to USDT." } }, "chain_selector": { @@ -243,7 +248,12 @@ "name": "Name", "not_available_short": "N/A", "ok": "Okay", + "owner": { + "destination": "Destination owner" + }, "recipient": "Recipient", + "relayer": "Relayer", + "reset_to_wallet": "Reset to current address", "review": "Review", "search_token": "Search token", "see_results": "See results", @@ -255,11 +265,22 @@ "symbol": "Symbol", "to": "To", "token_id": "Token ID", - "token_standard": "Token standard" + "token_standard": "Token standard", + "tx_hash": "Tx hash" }, "custom_recipient": { "placeholder": "Add custom recipient" }, + "destOwner": { + "alerts": { + "smartContract": "You cannot set the destination owner to a contract address" + }, + "description": "You can set a custom address that should be able to claim the transaction on the destination chain, for example if the recipient is a smart contract that cannot manually claim.", + "placeholder": "add address that should be able to manually claim...", + "title": "Destination owner", + "tooltip": "Defaults to your address. You can specify a different address that should be able to claim this transaction.", + "tooltip_title": "What is Destination Owner?" + }, "faucet": { "button": { "checking": "Checking mintability", @@ -285,7 +306,7 @@ }, "title": "Faucet", "warning": { - "insufficient_balance": "You don't have enough ETH to complete the transaction. Please add some ETH to your wallet.", + "insufficient_balance": "You don't have enough ETH to complete the transaction. Please add more ETH to your wallet (>= 0.0015 ETH)", "no_connected": "Please connect your wallet to mint tokens.", "not_mintable": "This token is not mintable on this network. Please switch to the correct network.", "token_minted": "You have already minted this token.", @@ -420,6 +441,18 @@ "tooltip": "Defaults to your address. You can add a custom recipient address as well.", "tooltip_title": "What is Custom Recipient?" }, + "relayer_component": { + "address_input_label": "Enter the recipient address", + "description": "This component allows you to manually claim any claimable transaction", + "no_tx_found": "No claimable transactions found", + "step1": { + "title": "Step 1: Select the recipient" + }, + "step2": { + "title": "Step 2: Search the transaction you want" + }, + "title": "Relayer Component" + }, "switch_modal": { "description": "Your current network is not supported. Please select one of the following chains to proceed:", "title": "Incorrect network detected" @@ -486,6 +519,7 @@ "pre_check": { "chain_check": "Connected to the correct chain", "funds_check": "Sufficient funds to claim", + "only_destowner_can_claim": "This transaction can only be claimed by the destination owner. Please connect to the correct wallet to claim this transaction.", "quota_check": "Sufficient daily quota", "ready": "You can continue with the claim process!", "step": "Claim step", @@ -497,9 +531,12 @@ "title": "What is \"Connected to the correct chain\"?" }, "funds": { - "description": "In order to claim the transaction yourself, you need enough funds on the destination chain. If you've kept the default processing fee, the relayer will likely claim for you soon.", + "description": "In order to claim the transaction yourself, you need enough funds on the destination chain (>= 0.0015 ETH). If you've kept the default processing fee, the relayer will likely claim for you soon.", "title": "What is \"Sufficient funds to claim\"?" }, + "processing_fee": { + "description": "A processing fee has been set for this transaction. If the fee is high enough, a relayer may claim it automatically. Regardless, you can choose to manually claim the transaction. Note that the fee is non-refundable." + }, "quota": { "description": "Currently there is a daily limit of how much of this asset can be bridged to L1. If the quota is reached, please try again the next day.", "title": "What is \"Sufficient daily quota\"?" @@ -515,6 +552,11 @@ }, "description": "Track your bridge transactions here.", "details_dialog": { + "claimed_by": "Claimed by", + "destination_owner": "Destination owner", + "initiated_date": "Date initiated", + "recipient_address": "Recipient address", + "sender_address": "Sender address", "title": "Transaction details" }, "errors": { @@ -526,20 +568,25 @@ "claimed": "Claimed", "failed": "Failed", "processing": "Processing", + "released": "Released", "retry": "Retriable", "title": "Filters" }, "header": { "amount": "Amount", + "date": "Date", + "details": "Details", "explorer": "Explorer", "from": "From", "item": "Item", + "nft": "NFT", "status": "Status", "to": "To" }, "link": { "explorer": "View details", - "explorer_short": "View" + "explorer_short": "View", + "view": "Details" }, "no_transactions": "No transactions found", "release": { @@ -558,6 +605,7 @@ "description": "Your asset is now ready for claiming on the destination chain and requires a transaction. If you have set a processing fee, the relayer will automatically handle the claiming process on your behalf.", "name": "Claim" }, + "claimable": "Claimable", "claimed": { "description": "Your asset has successfully completed the bridging process and is now available to you on the destination chain.", "name": "Claimed" @@ -582,11 +630,16 @@ "description": "Transaction is processing. Depending on the pending blocks to be verified this can take up to several minutes.", "name": "Processing" }, + "releasable": "Releasable", "release": { "description": "Your bridged asset cannot be processed and is now accessible to you on the source chain.", "name": "Release" }, + "released": { + "name": "Released" + }, "releasing": "Releasing", + "retriable": "Retriable", "retry": { "description": "The relayer was unable to process this message, and you will need to retry the processing yourself.", "name": "Retry" diff --git a/packages/bridge-ui/src/libs/bridge/Bridge.ts b/packages/bridge-ui/src/libs/bridge/Bridge.ts index 54fabdc98d1..5e73e5d268d 100644 --- a/packages/bridge-ui/src/libs/bridge/Bridge.ts +++ b/packages/bridge-ui/src/libs/bridge/Bridge.ts @@ -1,11 +1,12 @@ import { getPublicClient, readContract, simulateContract, writeContract } from '@wagmi/core'; -import { getContract, type Hash, UserRejectedRequestError, type WalletClient } from 'viem'; +import { getAddress, getContract, type Hash, UserRejectedRequestError, type WalletClient } from 'viem'; import { bridgeAbi } from '$abi'; import { routingContractsMap } from '$bridgeConfig'; import { MessageStatusError, ProcessMessageError, ReleaseError, WrongChainError, WrongOwnerError } from '$libs/error'; import type { BridgeProver } from '$libs/proof'; import { getConnectedWallet } from '$libs/util/getConnectedWallet'; +import { isSmartContract } from '$libs/util/isSmartContract'; import { getLogger } from '$libs/util/logger'; import { config } from '$libs/wagmi'; @@ -40,13 +41,15 @@ export abstract class Bridge { const srcChainId = Number(message.srcChainId); const destChainId = Number(message.destChainId); - const { srcOwner } = message; + const { srcOwner, destOwner } = message; if (!wallet || !wallet.account || !wallet.chain) throw new Error('Wallet is not connected'); const userAddress = wallet.account.address; - // Are we the owner of the message? - if (srcOwner.toLowerCase() !== userAddress.toLowerCase()) { - throw new WrongOwnerError('user cannot process this as it is not their message'); + // Are we the owner of the message, either src or dest? + if (getAddress(srcOwner) !== getAddress(userAddress) && getAddress(destOwner) !== getAddress(userAddress)) { + if (bridgeTx.message?.gasLimit === 0) { + throw new WrongOwnerError('user cannot process this as it is not their message'); + } } const destBridgeAddress = routingContractsMap[destChainId][srcChainId].bridgeAddress; @@ -166,7 +169,7 @@ export abstract class Bridge { abstract estimateGas(args: BridgeArgs): Promise; abstract bridge(args: BridgeArgs): Promise; - async processMessage(args: ClaimArgs): Promise { + async processMessage(args: ClaimArgs, force = false): Promise { const { messageStatus, destBridgeAddress } = await this.beforeProcessing(args); let blockNumber; @@ -203,7 +206,7 @@ export abstract class Bridge { // Initial claim await this.beforeClaiming({ ...args, messageStatus }); - txHash = await this.processNewMessage({ ...args, bridgeContract, client }); + txHash = await this.processNewMessage({ ...args, bridgeContract, client }, force); } else if (messageStatus === MessageStatus.RETRIABLE) { // Claiming after a failed attempt await this.beforeRetrying({ ...args, messageStatus }); @@ -225,7 +228,7 @@ export abstract class Bridge { } } - private async processNewMessage(args: ProcessMessageType): Promise { + private async processNewMessage(args: ProcessMessageType, force = false): Promise { const { bridgeTx, bridgeContract, client } = args; const { message } = bridgeTx; if (!message) throw new ProcessMessageError('Message is not defined'); @@ -261,24 +264,30 @@ export abstract class Bridge { estimatedGas = 1_300_000n; } - const { request } = await simulateContract(config, { - address: bridgeContract.address, - abi: bridgeContract.abi, - functionName: 'processMessage', - args: [message, proof], - gas: estimatedGas, - }); - log('Simulate contract for processMessage', request); - - return await writeContract(config, request); + if (message.to && (await isSmartContract(message.to, Number(message.destChainId)))) { + log(`Recipient is a smart contract, increasing fees by 5 percent`); + estimatedGas = (estimatedGas * 105n) / 100n; + } + if (force) { + return await writeContract(config, { + address: bridgeContract.address, + abi: bridgeContract.abi, + functionName: 'processMessage', + args: [message, proof], + gas: estimatedGas, + }); + } else { + const { request } = await simulateContract(config, { + address: bridgeContract.address, + abi: bridgeContract.abi, + functionName: 'processMessage', + args: [message, proof], + gas: estimatedGas, + }); + log('Simulate contract for processMessage', request); - // return await writeContract(config, { - // address: bridgeContract.address, - // abi: bridgeContract.abi, - // functionName: 'processMessage', - // args: [message, proof], - // gas: estimatedGas, - // }); + return await writeContract(config, request); + } } private async retryMessage(args: RetryMessageArgs): Promise { @@ -290,10 +299,13 @@ export abstract class Bridge { if (!message) throw new ProcessMessageError('Message is not defined'); - const estimatedGas = await bridgeContract.estimateGas.retryMessage([message, isFinalAttempt], { + let estimatedGas = await bridgeContract.estimateGas.retryMessage([message, isFinalAttempt], { account: client.account, }); - + if (message.to && (await isSmartContract(message.to, Number(message.destChainId)))) { + log(`Recipient is a smart contract, increasing fees by 5 percent`); + estimatedGas = (estimatedGas * 105n) / 100n; + } log('Estimated gas for retryMessage', estimatedGas); const { request } = await simulateContract(config, { @@ -316,9 +328,15 @@ export abstract class Bridge { log('Estimating gas for recallMessage', bridgeContract.address, [message, proof]); - const estimatedGas = await bridgeContract.estimateGas.recallMessage([message, proof], { account: client.account }); + let estimatedGas = await bridgeContract.estimateGas.recallMessage([message, proof], { account: client.account }); log('Estimated gas for recallMessage', estimatedGas); + if (message.from && (await isSmartContract(message.from, Number(message.srcChainId)))) { + log(`Sender is a smart contract, increasing fees by 5 percent`); + estimatedGas = (estimatedGas * 105n) / 100n; + } + log('Estimated gas for retryMessage', estimatedGas); + const { request } = await simulateContract(config, { address: bridgeContract.address, abi: bridgeContract.abi, diff --git a/packages/bridge-ui/src/libs/bridge/ERC1155Bridge.ts b/packages/bridge-ui/src/libs/bridge/ERC1155Bridge.ts index bdc64eab286..94f9931e828 100644 --- a/packages/bridge-ui/src/libs/bridge/ERC1155Bridge.ts +++ b/packages/bridge-ui/src/libs/bridge/ERC1155Bridge.ts @@ -4,7 +4,7 @@ import { getContract, UserRejectedRequestError } from 'viem'; import { bridgeAbi, erc1155Abi, erc1155VaultAbi } from '$abi'; import { routingContractsMap } from '$bridgeConfig'; -import { gasLimitZero } from '$components/Bridge/state'; +import { destOwnerAddress, gasLimitZero } from '$components/Bridge/state'; import { gasLimitConfig } from '$config'; import { ApproveError, @@ -223,7 +223,7 @@ export class ERC1155Bridge extends Bridge { const sendERC1155Args: NFTBridgeTransferOp = { destChainId: BigInt(destChainId), to, - destOwner: to, + destOwner: get(destOwnerAddress) || to, token, gasLimit: Number(gasLimit), fee, diff --git a/packages/bridge-ui/src/libs/bridge/ERC20Bridge.ts b/packages/bridge-ui/src/libs/bridge/ERC20Bridge.ts index 3eb95ee70aa..e3023d93070 100644 --- a/packages/bridge-ui/src/libs/bridge/ERC20Bridge.ts +++ b/packages/bridge-ui/src/libs/bridge/ERC20Bridge.ts @@ -4,7 +4,7 @@ import { getContract, UserRejectedRequestError } from 'viem'; import { bridgeAbi, erc20Abi, erc20VaultAbi } from '$abi'; import { routingContractsMap } from '$bridgeConfig'; -import { gasLimitZero } from '$components/Bridge/state'; +import { destOwnerAddress, gasLimitZero } from '$components/Bridge/state'; import { gasLimitConfig } from '$config'; import { ApproveError, @@ -75,7 +75,7 @@ export class ERC20Bridge extends Bridge { const sendERC20Args = { destChainId: BigInt(destChainId), - destOwner: to, + destOwner: get(destOwnerAddress) || to, to, token, amount, @@ -111,7 +111,7 @@ export class ERC20Bridge extends Bridge { return estimatedGas; } - async requireAllowance({ amount, tokenAddress, ownerAddress, spenderAddress }: RequireAllowanceArgs) { + async getAllowance({ amount, tokenAddress, ownerAddress, spenderAddress }: RequireAllowanceArgs) { isBridgePaused().then((paused) => { if (paused) throw new BridgePausedError('Bridge is paused'); }); @@ -125,6 +125,14 @@ export class ERC20Bridge extends Bridge { chainId: (await getConnectedWallet()).chain.id, }); + return allowance; + } + async requireAllowance({ amount, tokenAddress, ownerAddress, spenderAddress }: RequireAllowanceArgs, reset = false) { + const allowance = await this.getAllowance({ amount, tokenAddress, ownerAddress, spenderAddress }); + + if (reset) { + return true; + } const requiresAllowance = allowance < amount; log('Allowance is', allowance, 'requires allowance?', requiresAllowance); @@ -132,15 +140,18 @@ export class ERC20Bridge extends Bridge { return requiresAllowance; } - async approve(args: ApproveArgs) { + async approve(args: ApproveArgs, reset = false) { const { amount, tokenAddress, spenderAddress, wallet } = args; if (!wallet || !wallet.account) throw new Error('No wallet found'); - const requireAllowance = await this.requireAllowance({ - amount, - tokenAddress, - ownerAddress: wallet.account.address, - spenderAddress, - }); + const requireAllowance = await this.requireAllowance( + { + amount, + tokenAddress, + ownerAddress: wallet.account.address, + spenderAddress, + }, + reset, + ); if (!requireAllowance) { throw new NoAllowanceRequiredError(`no allowance required for the amount ${amount}`); @@ -148,10 +159,31 @@ export class ERC20Bridge extends Bridge { try { log(`Calling approve for spender "${spenderAddress}" for token "${tokenAddress}" with amount`, amount); + // USDT does not play nice with the default ERC20 ABI, this works for both + const approvalABI = [ + { + constant: false, + inputs: [ + { + name: '_spender', + type: 'address', + }, + { + name: '_value', + type: 'uint256', + }, + ], + name: 'approve', + outputs: [], + payable: false, + stateMutability: 'nonpayable', + type: 'function', + }, + ]; const { request } = await simulateContract(config, { address: tokenAddress, - abi: erc20Abi, + abi: approvalABI, functionName: 'approve', args: [spenderAddress, amount], }); diff --git a/packages/bridge-ui/src/libs/bridge/ERC721Bridge.ts b/packages/bridge-ui/src/libs/bridge/ERC721Bridge.ts index 294bdb69909..45c5f6968b7 100644 --- a/packages/bridge-ui/src/libs/bridge/ERC721Bridge.ts +++ b/packages/bridge-ui/src/libs/bridge/ERC721Bridge.ts @@ -4,7 +4,7 @@ import { getContract, UserRejectedRequestError } from 'viem'; import { bridgeAbi, erc721Abi, erc721VaultAbi } from '$abi'; import { routingContractsMap } from '$bridgeConfig'; -import { gasLimitZero } from '$components/Bridge/state'; +import { destOwnerAddress, gasLimitZero } from '$components/Bridge/state'; import { gasLimitConfig } from '$config'; import { ApproveError, @@ -235,7 +235,7 @@ export class ERC721Bridge extends Bridge { const sendERC721Args: NFTBridgeTransferOp = { destChainId: BigInt(destChainId), to, - destOwner: to, + destOwner: get(destOwnerAddress) || to, token, gasLimit: Number(gasLimit), fee, diff --git a/packages/bridge-ui/src/libs/bridge/ETHBridge.ts b/packages/bridge-ui/src/libs/bridge/ETHBridge.ts index 5cbae26530e..b81911ec2cd 100644 --- a/packages/bridge-ui/src/libs/bridge/ETHBridge.ts +++ b/packages/bridge-ui/src/libs/bridge/ETHBridge.ts @@ -3,7 +3,7 @@ import { get } from 'svelte/store'; import { getContract, UserRejectedRequestError } from 'viem'; import { bridgeAbi } from '$abi'; -import { gasLimitZero } from '$components/Bridge/state'; +import { destOwnerAddress, gasLimitZero } from '$components/Bridge/state'; import { BridgePausedError, SendMessageError } from '$libs/error'; import type { BridgeProver } from '$libs/proof'; import { isBridgePaused } from '$libs/util/checkForPausedContracts'; @@ -55,7 +55,7 @@ export class ETHBridge extends Bridge { srcOwner: owner, from: owner, - destOwner: to, + destOwner: get(destOwnerAddress) || to, srcChainId: BigInt(srcChainId), destChainId: BigInt(destChainId), diff --git a/packages/bridge-ui/src/libs/bridge/fetchTransactions.ts b/packages/bridge-ui/src/libs/bridge/fetchTransactions.ts index 0e5b180aeb0..9df3998b429 100644 --- a/packages/bridge-ui/src/libs/bridge/fetchTransactions.ts +++ b/packages/bridge-ui/src/libs/bridge/fetchTransactions.ts @@ -10,16 +10,20 @@ import { type BridgeTransaction, MessageStatus } from './types'; const log = getLogger('bridge:fetchTransactions'); let error: Error; -export async function fetchTransactions(userAddress: Address) { +export async function fetchTransactions(userAddress: Address, chainId?: number) { // Transactions from local storage const localTxs: BridgeTransaction[] = await bridgeTxService.getAllTxByAddress(userAddress); // Get all transactions from all relayers const relayerTxPromises: Promise[] = relayerApiServices.map(async (relayerApiService) => { - const { txs } = await relayerApiService.getAllBridgeTransactionByAddress(userAddress, { - page: 0, - size: 100, - }); + const { txs } = await relayerApiService.getAllBridgeTransactionByAddress( + userAddress, + { + page: 0, + size: 500, + }, + chainId, + ); log(`fetched ${txs?.length ?? 0} transactions from relayer`, txs); return txs; }); @@ -46,7 +50,7 @@ export async function fetchTransactions(userAddress: Address) { if (outdatedLocalTransactions.length > 0) { log( `found ${outdatedLocalTransactions.length} outdated transaction(s)`, - outdatedLocalTransactions.map((tx) => tx.hash), + outdatedLocalTransactions.map((tx) => tx.srcTxHash), ); } diff --git a/packages/bridge-ui/src/libs/bridge/types.ts b/packages/bridge-ui/src/libs/bridge/types.ts index 099035c7387..dc794acf422 100644 --- a/packages/bridge-ui/src/libs/bridge/types.ts +++ b/packages/bridge-ui/src/libs/bridge/types.ts @@ -9,7 +9,7 @@ export enum MessageStatus { RETRIABLE, DONE, FAILED, - PROVEN, // UI ONLY + RECALLED, } // struct Message { @@ -90,7 +90,8 @@ export type RelayerMessage = { export type ModifiedTransactionReceipt = Omit & { blockNumber: Hex }; export type BridgeTransaction = { - hash: Hash; + srcTxHash: Hash; + destTxHash: Hash; from: Address; amount: bigint; symbol: string; @@ -100,6 +101,7 @@ export type BridgeTransaction = { tokenType: TokenType; blockNumber: Hex; msgHash: Hash; + processingFee: bigint; message?: Message; msgStatus?: MessageStatus; @@ -109,6 +111,8 @@ export type BridgeTransaction = { status?: MessageStatus; receipt?: TransactionReceipt; canonicalTokenAddress?: Address; + claimedBy?: Address; + fee?: bigint; }; interface BaseBridgeTransferOp { diff --git a/packages/bridge-ui/src/libs/fee/recommendProcessingFee.ts b/packages/bridge-ui/src/libs/fee/recommendProcessingFee.ts index 8e1595d8ad0..780031c07ff 100644 --- a/packages/bridge-ui/src/libs/fee/recommendProcessingFee.ts +++ b/packages/bridge-ui/src/libs/fee/recommendProcessingFee.ts @@ -1,5 +1,5 @@ import { getPublicClient } from '@wagmi/core'; -import { formatGwei } from 'viem'; +import { formatGwei, parseGwei } from 'viem'; import { gasLimitConfig } from '$config'; import { PUBLIC_FEE_MULTIPLIER } from '$env/static/public'; @@ -38,9 +38,14 @@ export async function recommendProcessingFee({ const maxPriorityFee = await destPublicClient.estimateMaxPriorityFeePerGas(); log(`maxPriorityFee: ${formatGwei(maxPriorityFee)} gwei`); - const gasPrice = await destPublicClient.getGasPrice(); + let gasPrice = await destPublicClient.getGasPrice(); log(`gasPrice: ${formatGwei(gasPrice)} gwei`); + if (gasPrice < parseGwei('0.01')) { + log(`gasPrice is less than 0.01 gwei, setting gasPrice to 0.01 gwei`); + gasPrice = parseGwei('0.01'); + } + if (!baseFee) throw new Error('Unable to get base fee'); log(`baseFee: ${formatGwei(baseFee)} gwei`); @@ -89,20 +94,20 @@ export async function recommendProcessingFee({ if (!estimatedMsgGaslimit) throw new Error('Unable to calculate fee'); // Initial fee multiplicator and add fallback - let feeMultiplicator: number = parseInt(PUBLIC_FEE_MULTIPLIER); - - if (gasPrice <= 50000000n) { - feeMultiplicator = 4; - log(`gasPrice ${formatGwei(gasPrice)} is less than 0.5 gwei, setting feeMultiplicator to 4`); - } else if (gasPrice <= 100000000n && gasPrice > 50000000n) { - feeMultiplicator = 3; - log( - `gasPrice ${formatGwei(gasPrice)} is less than 0.1 gwei and more than 0.05 gwei, setting feeMultiplicator to 3`, - ); - } else { - feeMultiplicator = 2; - log(`gasPrice ${formatGwei(gasPrice)} is more than 0.1 gwei, setting feeMultiplicator to 2`); - } + const feeMultiplicator: number = parseInt(PUBLIC_FEE_MULTIPLIER) || 1; + + // if (gasPrice <= parseGwei('0.05')) { + // feeMultiplicator = 4; + // log(`gasPrice {formatGwei(gasPrice)} is less than 0.5 gwei, setting feeMultiplicator to 4`); + // } else if (gasPrice <= parseGwei('0.1') && gasPrice > parseGwei('0.05')) { + // feeMultiplicator = 3; + // log( + // `gasPrice ${formatGwei(gasPrice)} is less than 0.1 gwei and more than 0.05 gwei, setting feeMultiplicator to 3`, + // ); + // } else { + // feeMultiplicator = 2; + // log(`gasPrice ${formatGwei(gasPrice)} is more than 0.1 gwei, setting feeMultiplicator to 2`); + // } const fee = estimatedMsgGaslimit * Number(gasPrice) * feeMultiplicator; return BigInt(fee); diff --git a/packages/bridge-ui/src/libs/fee/recommendedProcessingFee.test.ts b/packages/bridge-ui/src/libs/fee/recommendedProcessingFee.test.ts new file mode 100644 index 00000000000..22190579d79 --- /dev/null +++ b/packages/bridge-ui/src/libs/fee/recommendedProcessingFee.test.ts @@ -0,0 +1,155 @@ +import { getPublicClient } from '@wagmi/core'; +import { parseGwei } from 'viem'; + +import { gasLimitConfig } from '$config'; +import { ETHToken } from '$libs/token'; +import { getTokenAddresses } from '$libs/token/getTokenAddresses'; +import { L1_CHAIN_ID, L2_CHAIN_ID, MOCK_ERC20, MOCK_ERC721, MOCK_ERC1155 } from '$mocks'; + +import { recommendProcessingFee } from './recommendProcessingFee'; + +vi.mock('@wagmi/core'); +vi.mock('$customToken'); +vi.mock('$bridgeConfig'); +vi.mock('$libs/token/getTokenAddresses'); + +const mockClient = { + request: vi.fn(), + getBlock: vi.fn(), + estimateMaxPriorityFeePerGas: vi.fn(), + getGasPrice: vi.fn(), +}; + +describe('recommendedProcessingFee', () => { + beforeAll(() => { + vi.mocked(getPublicClient).mockReturnValue(mockClient); + vi.mocked(mockClient.getBlock).mockReturnValue({ baseFeePerGas: 11n }); + vi.mocked(mockClient.estimateMaxPriorityFeePerGas).mockReturnValue(42n); + }); + + describe('ETH fees', () => { + it('should calculate the recommended processing fee for ETH when gasPrice is a normal value (0.15 gwei)', async () => { + // Given + const token = ETHToken; + const srcChainId = L1_CHAIN_ID; + const destChainId = L2_CHAIN_ID; + + const gasLimit = gasLimitConfig.GAS_RESERVE; + + const reportedGasPrice = parseGwei('0.15'); + const feeMultiplicator = 1; + + const expectedFee = gasLimit * Number(reportedGasPrice) * feeMultiplicator; + + vi.mocked(mockClient.getGasPrice).mockReturnValue(reportedGasPrice); + + // When + const result = await recommendProcessingFee({ token, destChainId, srcChainId }); + + // Then + expect(result).toBe(BigInt(expectedFee)); + }); + }); + + describe('ERC20 fees', () => { + it('should calculate the recommended processing fee for deployed ERC20', async () => { + // Given + const token = MOCK_ERC20; + const srcChainId = L1_CHAIN_ID; + const destChainId = L2_CHAIN_ID; + + const gasLimit = gasLimitConfig.GAS_RESERVE + gasLimitConfig.erc20DeployedGasLimit; + + const reportedGasPrice = parseGwei('0.15'); + const feeMultiplicator = 1; + + const expectedFee = gasLimit * Number(reportedGasPrice) * feeMultiplicator; + + vi.mocked(mockClient.getGasPrice).mockReturnValue(reportedGasPrice); + vi.mocked(getTokenAddresses).mockResolvedValue({ + bridged: { + chainId: L1_CHAIN_ID, + address: MOCK_ERC20.addresses[L1_CHAIN_ID], + }, + canonical: { + chainId: L2_CHAIN_ID, + address: MOCK_ERC20.addresses[L2_CHAIN_ID], + }, + }); + + // When + const result = await recommendProcessingFee({ token, destChainId, srcChainId }); + + // Then + expect(result).toBe(BigInt(expectedFee)); + }); + }); + + describe('ERC721 fees', () => { + it('should calculate the recommended processing fee for deployed ERC721', async () => { + // Given + const token = MOCK_ERC721; + const srcChainId = L1_CHAIN_ID; + const destChainId = L2_CHAIN_ID; + + const gasLimit = gasLimitConfig.GAS_RESERVE + gasLimitConfig.erc721DeployedGasLimit; + + const reportedGasPrice = parseGwei('0.12'); + const feeMultiplicator = 1; + + const expectedFee = gasLimit * Number(reportedGasPrice) * feeMultiplicator; + + vi.mocked(mockClient.getGasPrice).mockReturnValue(reportedGasPrice); + vi.mocked(getTokenAddresses).mockResolvedValue({ + bridged: { + chainId: L1_CHAIN_ID, + address: MOCK_ERC721.addresses[L1_CHAIN_ID], + }, + canonical: { + chainId: L2_CHAIN_ID, + address: MOCK_ERC721.addresses[L2_CHAIN_ID], + }, + }); + + // When + const result = await recommendProcessingFee({ token, destChainId, srcChainId }); + + // Then + expect(result).toBe(BigInt(expectedFee)); + }); + }); + + describe('ERC1155 fees', () => { + it('should calculate the recommended processing fee for deployed ERC1155', async () => { + // Given + const token = MOCK_ERC1155; + const srcChainId = L1_CHAIN_ID; + const destChainId = L2_CHAIN_ID; + + const gasLimit = gasLimitConfig.GAS_RESERVE + gasLimitConfig.erc1155DeployedGasLimit; + + const reportedGasPrice = parseGwei('0.12'); + const feeMultiplicator = 1; + + const expectedFee = gasLimit * Number(reportedGasPrice) * feeMultiplicator; + + vi.mocked(mockClient.getGasPrice).mockReturnValue(reportedGasPrice); + vi.mocked(getTokenAddresses).mockResolvedValue({ + bridged: { + chainId: L1_CHAIN_ID, + address: MOCK_ERC1155.addresses[L1_CHAIN_ID], + }, + canonical: { + chainId: L2_CHAIN_ID, + address: MOCK_ERC1155.addresses[L2_CHAIN_ID], + }, + }); + + // When + const result = await recommendProcessingFee({ token, destChainId, srcChainId }); + + // Then + expect(result).toBe(BigInt(expectedFee)); + }); + }); +}); diff --git a/packages/bridge-ui/src/libs/polling/messageStatusPoller.ts b/packages/bridge-ui/src/libs/polling/messageStatusPoller.ts index b517e8f41dc..fc2f0b5f56a 100644 --- a/packages/bridge-ui/src/libs/polling/messageStatusPoller.ts +++ b/packages/bridge-ui/src/libs/polling/messageStatusPoller.ts @@ -49,7 +49,7 @@ const hashIntervalMap: Record = {}; * } */ export function startPolling(bridgeTx: BridgeTransaction, runImmediately = true) { - const { hash, srcChainId, destChainId, msgHash, msgStatus } = bridgeTx; + const { srcTxHash, srcChainId, destChainId, msgHash, msgStatus } = bridgeTx; // Without this we cannot poll at all. Let's throw an error // that can be handled in the UI @@ -63,14 +63,19 @@ export function startPolling(bridgeTx: BridgeTransaction, runImmediately = true) // We want to notify whoever is calling this function of different // events: PollingEvent - let emitter = hashEmitterMap[hash]; - let interval = hashIntervalMap[hash]; + let emitter = hashEmitterMap[srcTxHash]; + let interval = hashIntervalMap[srcTxHash]; const destChainClient = createPublicClient({ chain: chains.find((chain) => chain.id === Number(destChainId)), transport: http(), }); + const srcChainClient = createPublicClient({ + chain: chains.find((chain) => chain.id === Number(srcChainId)), + transport: http(), + }); + // We are gonna be polling the destination bridge contract const destBridgeAddress = routingContractsMap[Number(destChainId)][Number(srcChainId)].bridgeAddress; const destBridgeContract = getContract({ @@ -79,16 +84,24 @@ export function startPolling(bridgeTx: BridgeTransaction, runImmediately = true) client: destChainClient, }); + // In case for recalled messages we need to check the source bridge contract + const srcBridgeAddress = routingContractsMap[Number(srcChainId)][Number(destChainId)].bridgeAddress; + const srcBridgeContract = getContract({ + address: srcBridgeAddress, + abi: bridgeAbi, + client: srcChainClient, + }); + const stopPolling = () => { - const interval = hashIntervalMap[hash]; + const interval = hashIntervalMap[srcTxHash]; if (interval) { log('Stop polling for transaction', bridgeTx); // Clean up clearInterval(interval as ReturnType); // clearInterval only needs the ID - delete hashEmitterMap[hash]; - delete hashIntervalMap[hash]; - hashIntervalMap[hash] = null; + delete hashEmitterMap[srcTxHash]; + delete hashIntervalMap[srcTxHash]; + hashIntervalMap[srcTxHash] = null; emitter.emit(PollingEvent.STOP); } @@ -100,7 +113,7 @@ export function startPolling(bridgeTx: BridgeTransaction, runImmediately = true) }; const pollingFn = async () => { - log('Polling for transaction', bridgeTx.hash); + log('Polling for transaction', bridgeTx.srcTxHash); const isProcessable = await isTransactionProcessable(bridgeTx); emitter.emit(PollingEvent.PROCESSABLE, isProcessable); @@ -108,15 +121,26 @@ export function startPolling(bridgeTx: BridgeTransaction, runImmediately = true) const messageStatus: MessageStatus = await destBridgeContract.read.messageStatus([bridgeTx.msgHash]); emitter.emit(PollingEvent.STATUS, messageStatus); + if (messageStatus === MessageStatus.FAILED) { + // check if the message is recalled + const recallStatus = await srcBridgeContract.read.messageStatus([bridgeTx.msgHash]); + if (recallStatus === MessageStatus.RECALLED) { + log(`Message ${bridgeTx.msgHash} has been recalled.`); + emitter.emit(PollingEvent.STATUS, MessageStatus.RECALLED); + stopPolling(); + return; + } + } + let blockNumber: Hex; if (!bridgeTx.blockNumber) { - const receipt = await getTransactionReceipt(config, { hash: bridgeTx.hash }); + const receipt = await getTransactionReceipt(config, { hash: bridgeTx.srcTxHash }); blockNumber = toHex(receipt.blockNumber); bridgeTx.blockNumber = blockNumber; } if (messageStatus === MessageStatus.DONE) { - log(`Poller has picked up the change of status to DONE for hash ${hash}.`); + log(`Poller has picked up the change of status to DONE for hash ${srcTxHash}.`); stopPolling(); } } catch (err) { @@ -132,8 +156,8 @@ export function startPolling(bridgeTx: BridgeTransaction, runImmediately = true) emitter = new EventEmitter(); interval = setInterval(pollingFn, bridgeTransactionPoller.interval); - hashEmitterMap[hash] = emitter; - hashIntervalMap[hash] = interval; + hashEmitterMap[srcTxHash] = emitter; + hashIntervalMap[srcTxHash] = interval; // setImmediate isn't standard if (runImmediately) { diff --git a/packages/bridge-ui/src/libs/proof/BridgeProver.test.ts b/packages/bridge-ui/src/libs/proof/BridgeProver.test.ts index 4282167757e..a92d2d402e5 100644 --- a/packages/bridge-ui/src/libs/proof/BridgeProver.test.ts +++ b/packages/bridge-ui/src/libs/proof/BridgeProver.test.ts @@ -1,5 +1,14 @@ import { getPublicClient, readContract } from '@wagmi/core'; -import { BlockNotFoundError, keccak256, numberToHex, stringToHex, toBytes, zeroAddress, zeroHash } from 'viem'; +import { + BlockNotFoundError, + type Hash, + keccak256, + numberToHex, + stringToHex, + toBytes, + zeroAddress, + zeroHash, +} from 'viem'; import { signalServiceAbi } from '$abi'; import { routingContractsMap } from '$bridgeConfig'; @@ -102,9 +111,11 @@ describe('BridgeProver', () => { decimals: 0, destChainId: BigInt(167001), from: '0x8626f6940E2eb28930eFb4CeF49B2d1F2C9C1199', - hash: '0xc0a3476ac80c3468a65702864ff4ef22ca5b54afac3d0911fb14165cdada7f1c', + srcTxHash: '0xc0a3476ac80c3468a65702864ff4ef22ca5b54afac3d0911fb14165cdada7f1c', + destTxHash: '' as Hash, msgHash: '0x36973cd4172846df09d48d0bf428802d674848d39229962bbaec2e2fea465f15', srcChainId: 32382n, + processingFee: 0n, message: { data: '0x', destChainId: 167001n, diff --git a/packages/bridge-ui/src/libs/proof/BridgeProver.ts b/packages/bridge-ui/src/libs/proof/BridgeProver.ts index 9ff338e88b4..b942b748523 100644 --- a/packages/bridge-ui/src/libs/proof/BridgeProver.ts +++ b/packages/bridge-ui/src/libs/proof/BridgeProver.ts @@ -211,7 +211,7 @@ export class BridgeProver { } async getEncodedSignalProofForRecall({ bridgeTx }: { bridgeTx: BridgeTransaction }) { - const { message, msgHash } = bridgeTx; + const { blockNumber, message, msgHash } = bridgeTx; log('msgHash', msgHash); if (!message) throw new ProofGenerationError('Message is not defined'); @@ -304,8 +304,36 @@ export class BridgeProver { // Get the signalServiceAddress for the source chain const destSignalServiceAddress = routingContractsMap[Number(destChainId)][Number(srcChainId)].signalServiceAddress; + const srcSignalServiceAddress = routingContractsMap[Number(srcChainId)][Number(destChainId)].signalServiceAddress; + + const syncedChainData = await readContract(config, { + address: srcSignalServiceAddress, + abi: signalServiceAbi, + functionName: 'getSyncedChainData', + args: [destChainId, keccak256(toBytes('STATE_ROOT')), 0n], + chainId: Number(srcChainId), + }); + + log('syncedChainData', syncedChainData); + + const latestSyncedblock = syncedChainData[0]; + + const synced = latestSyncedblock >= hexToBigInt(blockNumber); + log('synced', synced, latestSyncedblock, hexToBigInt(blockNumber)); + if (!synced) { + throw new BlockNotSyncedError('block is not synced yet'); + } - const block = await destChainClient.getBlock({ blockTag: 'latest' }); + // Get the block based on the blocknumber from the destination chain + let block; + try { + block = await destChainClient.getBlock({ blockNumber: latestSyncedblock }); + if (!block || block.hash === null || block.number === null) { + throw new BlockNotFoundError({ blockNumber: latestSyncedblock }); + } + } catch { + throw new BlockNotFoundError({ blockNumber: latestSyncedblock }); + } const signal = await this.getSignalForFailedMessage(msgHash); @@ -330,7 +358,7 @@ export class BridgeProver { // Build the hopProof const hopProof: HopProof = { - chainId: BigInt(destChainId), + chainId: BigInt(srcChainId), blockId: BigInt(block.number), rootHash: block.stateRoot, cacheOption: 0n, // Todo: could be configurable diff --git a/packages/bridge-ui/src/libs/relayer/RelayerAPIService.test.ts b/packages/bridge-ui/src/libs/relayer/RelayerAPIService.test.ts index e36fa5b2a62..54bb60637f4 100644 --- a/packages/bridge-ui/src/libs/relayer/RelayerAPIService.test.ts +++ b/packages/bridge-ui/src/libs/relayer/RelayerAPIService.test.ts @@ -7,36 +7,18 @@ function setupMocks() { vi.mock('axios'); vi.mock('@wagmi/core'); vi.mock('@web3modal/wagmi'); - vi.mock('$customToken', () => { - return { - customToken: [ - { - name: 'Bull Token', - addresses: { - '31336': '0xA51c1fc2f0D1a1b8494Ed1FE312d7C3a78Ed91C0', - '167002': '0x9A9f2CCfdE556A7E9Ff0848998Aa4a0CFD8863AE', - }, - symbol: 'BLL', - decimals: 18, - type: 'ERC20', - logoURI: 'ipfs://QmezMTpT6ovJ3szb3SKDM9GVGeQ1R8DfjYyXG12ppMe2BY', - mintable: true, - }, - { - name: 'Horse Token', - addresses: { - '31336': '0xB7f8BC63BbcaD18155201308C8f3540b07f84F5e', - '167002': '0x959922bE3CAee4b8Cd9a407cc3ac1C251C2007B1', - }, - symbol: 'HORSE', - decimals: 18, - type: 'ERC20', - logoURI: 'ipfs://QmU52ZxmSiGX24uDPNUGG3URyZr5aQdLpACCiD6tap4Mgc', - mintable: true, + vi.mock('$bridgeConfig', () => ({ + routingContractsMap: { + 1: { + 167000: { bridgeAddress: '0xd60247c6848b7ca29eddf63aa924e53db6ddd8ec' }, + }, + 167000: { + 1: { + bridgeAddress: '', }, - ], - }; - }); + }, + }, + })); } describe('RelayerAPIService', () => { @@ -44,6 +26,11 @@ describe('RelayerAPIService', () => { setupMocks(); }); + afterEach(() => { + vi.clearAllMocks(); + vi.resetAllMocks(); + }); + // Given const mockedAxios = vi.mocked(axios, true); @@ -76,10 +63,20 @@ describe('RelayerAPIService', () => { const relayerAPIService = new RelayerAPIService(baseUrl); const address = '0x123'; const paginationParams = { page: 1, size: 10 }; - const chainID = 1; + + const mockResponse = { + data: { + page: 1, + size: 10, + total: 100, + items: [], + }, + status: 200, + }; + mockedAxios.get.mockResolvedValue(mockResponse); // When - const result = await relayerAPIService.getAllBridgeTransactionByAddress(address, paginationParams, chainID); + const result = await relayerAPIService.getAllBridgeTransactionByAddress(address, paginationParams); // Then expect(result).toBeDefined(); diff --git a/packages/bridge-ui/src/libs/relayer/RelayerAPIService.ts b/packages/bridge-ui/src/libs/relayer/RelayerAPIService.ts index 3e98f8754b1..c3fe07c7a86 100644 --- a/packages/bridge-ui/src/libs/relayer/RelayerAPIService.ts +++ b/packages/bridge-ui/src/libs/relayer/RelayerAPIService.ts @@ -1,7 +1,7 @@ import { getTransactionReceipt, readContract } from '@wagmi/core'; import axios from 'axios'; import { Buffer } from 'buffer'; -import type { Address, Hash, Hex, TransactionReceipt } from 'viem'; +import { type Address, getAddress, type Hash, type Hex, type TransactionReceipt } from 'viem'; import { bridgeAbi } from '$abi'; import { routingContractsMap } from '$bridgeConfig'; @@ -137,14 +137,23 @@ export class RelayerAPIService { async getAllBridgeTransactionByAddress( address: Address, paginationParams: PaginationParams, - chainID?: number, + chainId?: number, ): Promise { - const params = { - address, - chainID, - event: 'MessageSent', - ...paginationParams, - }; + let params; + if (chainId) { + params = { + address, + chainID: chainId, + event: 'MessageSent', + ...paginationParams, + }; + } else { + params = { + address, + event: 'MessageSent', + ...paginationParams, + }; + } const apiTxs: APIResponse = await this.getTransactionsFromAPI(params); @@ -168,6 +177,7 @@ export class RelayerAPIService { } const items = RelayerAPIService._filterDuplicateAndWrongBridge(apiTxs.items); + const txs: BridgeTransaction[] = items.map((tx: APIResponseTransaction) => { let data: string | Hex = tx.data.Message.Data; if (data === '') { @@ -177,31 +187,39 @@ export class RelayerAPIService { data = `0x${buffer.toString('hex')}`; } + const tokenType: TokenType = _eventToTokenType(tx.eventType); + + const value = tx.data.Message.Value > 0n ? BigInt(tx.amount) : 0n; + const transformedTx = { status: tx.status, amount: BigInt(tx.amount), symbol: tx.canonicalTokenSymbol || 'ETH', decimals: tx.canonicalTokenDecimals, - hash: tx.data.Raw.transactionHash, - from: tx.messageOwner, + srcTxHash: tx.data.Raw.transactionHash, + destTxHash: tx.processedTxHash, + from: getAddress(tx.messageOwner), srcChainId: tx.data.Message.SrcChainId, destChainId: tx.data.Message.DestChainId, msgHash: tx.msgHash, - tokenType: _eventToTokenType(tx.eventType), + tokenType: tokenType, blockNumber: tx.data.Raw.blockNumber, canonicalTokenAddress: tx.canonicalTokenAddress, + processingFee: BigInt(tx.data.Message.Fee.toString()), + claimedBy: tx.claimedBy ? getAddress(tx.claimedBy) : undefined, + fee: tx.fee ? BigInt(tx.fee) : undefined, message: { id: tx.data.Message.Id, - to: tx.data.Message.To, - destOwner: tx.data.Message.DestOwner, + to: getAddress(tx.data.Message.To), + destOwner: getAddress(tx.data.Message.DestOwner), data: data as Hex, - srcOwner: tx.data.Message.SrcOwner, - from: tx.data.Message.From, - gasLimit: Number(tx.data.Message.GasLimit), - value: BigInt(tx.amount), + srcOwner: getAddress(tx.data.Message.SrcOwner), + from: getAddress(tx.data.Message.From), + gasLimit: tx.data.Message.GasLimit, + value, srcChainId: BigInt(tx.data.Message.SrcChainId), destChainId: BigInt(tx.data.Message.DestChainId), - fee: BigInt(tx.data.Message.Fee), + fee: BigInt(tx.data.Message.Fee.toString()), }, } satisfies BridgeTransaction; @@ -210,16 +228,21 @@ export class RelayerAPIService { const txsPromises = txs.map(async (bridgeTx) => { if (!bridgeTx) return; - if (bridgeTx.from.toLowerCase() !== address.toLowerCase()) return; - const { destChainId, srcChainId, hash, msgHash } = bridgeTx; + + const senderMatch = getAddress(bridgeTx.from) === getAddress(address); + const receiverMatch = bridgeTx.message && getAddress(bridgeTx.message.destOwner) === getAddress(address); + + if (!senderMatch && !receiverMatch) return; + + const { destChainId, srcChainId, srcTxHash, msgHash } = bridgeTx; // Returns the transaction receipt for hash or null // if the transaction has not been mined. - const receipt = await RelayerAPIService._getTransactionReceipt(Number(srcChainId), hash); + const receipt = await RelayerAPIService._getTransactionReceipt(Number(srcChainId), srcTxHash); // TODO: do we want to show these transactions? if (!receipt || receipt === null) { - log('Transaction not mined yet', { hash, srcChainId }); + log('Transaction not mined yet', { srcTxHash, srcChainId }); } bridgeTx.receipt = receipt as TransactionReceipt; @@ -234,6 +257,7 @@ export class RelayerAPIService { // Update the status bridgeTx.msgStatus = msgStatus; + return bridgeTx; }); diff --git a/packages/bridge-ui/src/libs/relayer/types.ts b/packages/bridge-ui/src/libs/relayer/types.ts index 90ed2b64ed0..48504ea28a5 100644 --- a/packages/bridge-ui/src/libs/relayer/types.ts +++ b/packages/bridge-ui/src/libs/relayer/types.ts @@ -1,4 +1,4 @@ -import type { Address, Hex } from 'viem'; +import type { Address, Hash, Hex } from 'viem'; import type { BridgeTransaction, RelayerMessage } from '$libs/bridge'; @@ -58,9 +58,14 @@ export type APIResponseTransaction = { canonicalTokenName: string; canonicalTokenDecimals: number; amount: string; - msgHash: Hex; + msgHash: Hash; messageOwner: Address; event: string; + claimedBy: Address; + processedTxHash: Hash; + fee: string; + isProfitable: boolean; + isProfitableEvaluatedAt: string; }; export type RelayerBlockInfo = { diff --git a/packages/bridge-ui/src/libs/storage/BridgeTxService.ts b/packages/bridge-ui/src/libs/storage/BridgeTxService.ts index f69c8373287..c46ef355d26 100644 --- a/packages/bridge-ui/src/libs/storage/BridgeTxService.ts +++ b/packages/bridge-ui/src/libs/storage/BridgeTxService.ts @@ -8,7 +8,6 @@ import { type BridgeTransaction, MessageStatus } from '$libs/bridge'; import { getMessageStatusForMsgHash } from '$libs/bridge/getMessageStatusForMsgHash'; import { isSupportedChain } from '$libs/chain'; import { FilterLogsError } from '$libs/error'; -import { fetchTransactionReceipt } from '$libs/util/fetchTransactionReceipt'; import { jsonParseWithDefault } from '$libs/util/jsonParseWithDefault'; import { getLogger } from '$libs/util/logger'; import { config } from '$libs/wagmi'; @@ -21,7 +20,11 @@ export class BridgeTxService { //Todo: duplicate code in RelayerAPIService private static async _getTransactionReceipt(chainId: number, hash: Hash) { try { - return await fetchTransactionReceipt(hash, chainId); + return await waitForTransactionReceipt(config, { + hash, + chainId: Number(chainId), + timeout: pendingTransaction.waitTimeout, + }); } catch (error) { log(`Error getting transaction receipt for ${hash}: ${error}`); return null; @@ -94,11 +97,11 @@ export class BridgeTxService { private async _enhanceTx(tx: BridgeTransaction, address: Address, waitForTx: boolean) { // Filters out the transactions that are not from the current address - if (tx.from.toLowerCase() !== address.toLowerCase()) return; + // if (tx.from.toLowerCase() !== address.toLowerCase()) return; const bridgeTx: BridgeTransaction = { ...tx }; // prevent mutation - const { destChainId, srcChainId, hash } = bridgeTx; + const { destChainId, srcChainId, srcTxHash } = bridgeTx; // Ignore transactions from chains not supported by the bridge if (!isSupportedChain(Number(srcChainId))) return; @@ -107,15 +110,11 @@ export class BridgeTxService { if (waitForTx) { // We might want to wait for the transaction to be mined - receipt = await waitForTransactionReceipt(config, { - hash, - chainId: Number(srcChainId), - timeout: pendingTransaction.waitTimeout, - }); - } else { - // Returns the transaction receipt for hash or null - // if the transaction has not been mined. - receipt = await BridgeTxService._getTransactionReceipt(Number(srcChainId), hash); + try { + receipt = await BridgeTxService._getTransactionReceipt(Number(srcChainId), srcTxHash); + } catch (error) { + console.error('Error waiting for transaction receipt', error); + } } if (!receipt) { @@ -201,7 +200,7 @@ export class BridgeTxService { async getTxByHash(hash: Hash, address: Address) { const txs = this._getTxFromStorage(address); - const tx = txs.find((tx) => tx.hash === hash) as BridgeTransaction; + const tx = txs.find((tx) => tx.srcTxHash === hash) as BridgeTransaction; log('Transaction from storage', { ...tx }); @@ -237,9 +236,9 @@ export class BridgeTxService { log('Removing transactions from storage', txs); const txsFromStorage = this._getTxFromStorage(address); - const txsToRemove = txs.map((tx) => tx.hash); + const txsToRemove = txs.map((tx) => tx.srcTxHash); - const filteredTxs = txsFromStorage.filter((tx) => !txsToRemove.includes(tx.hash)); + const filteredTxs = txsFromStorage.filter((tx) => !txsToRemove.includes(tx.srcTxHash)); this.updateByAddress(address, filteredTxs); } @@ -249,4 +248,9 @@ export class BridgeTxService { const key = `${storageService.bridgeTxPrefix}-${address}`; this.storage.removeItem(key); } + + transactionIsStoredLocally(address: Address, tx: BridgeTransaction) { + const txs = this._getTxFromStorage(address); + return txs.some((t) => t.srcTxHash === tx.srcTxHash); + } } diff --git a/packages/bridge-ui/src/libs/token/getTokenApprovalStatus.ts b/packages/bridge-ui/src/libs/token/getTokenApprovalStatus.ts index 94a5cbcf88d..0fa606db40b 100644 --- a/packages/bridge-ui/src/libs/token/getTokenApprovalStatus.ts +++ b/packages/bridge-ui/src/libs/token/getTokenApprovalStatus.ts @@ -6,6 +6,7 @@ import { destNetwork, enteredAmount, insufficientAllowance, + needsApprovalReset, selectedToken, } from '$components/Bridge/state'; import { bridges, ContractType, type RequireApprovalArgs } from '$libs/bridge'; @@ -27,6 +28,7 @@ export enum ApprovalStatus { ETH_NO_APPROVAL_REQUIRED, APPROVAL_REQUIRED, NO_APPROVAL_REQUIRED, + RESET_REQUIRED, } export const getTokenApprovalStatus = async (token: Maybe): Promise => { @@ -57,6 +59,7 @@ export const getTokenApprovalStatus = async (token: Maybe): Promise } if (token.type === TokenType.ERC20) { log('checking approval status for ERC20'); + needsApprovalReset.set(false); const tokenVaultAddress = routingContractsMap[currentChainId][destinationChainId].erc20VaultAddress; const bridge = bridges[TokenType.ERC20] as ERC20Bridge; @@ -72,6 +75,19 @@ export const getTokenApprovalStatus = async (token: Maybe): Promise insufficientAllowance.set(requireAllowance); allApproved.set(!requireAllowance); if (requireAllowance) { + // specific check for USDT + if (get(selectedToken)?.symbol === 'tUSDT') { + const allowance = await bridge.getAllowance({ + amount: get(enteredAmount), + tokenAddress, + ownerAddress, + spenderAddress: tokenVaultAddress, + }); + if (allowance > 0n) { + needsApprovalReset.set(true); + return ApprovalStatus.RESET_REQUIRED; + } + } return ApprovalStatus.APPROVAL_REQUIRED; } return ApprovalStatus.NO_APPROVAL_REQUIRED; diff --git a/packages/bridge-ui/src/libs/util/formatTimestamp.ts b/packages/bridge-ui/src/libs/util/formatTimestamp.ts new file mode 100644 index 00000000000..a183fb5fb8a --- /dev/null +++ b/packages/bridge-ui/src/libs/util/formatTimestamp.ts @@ -0,0 +1,11 @@ +export const formatTimestamp = (timestamp: number): string => { + const date = new Date(timestamp * 1000); + const day = String(date.getDate()).padStart(2, '0'); + const month = String(date.getMonth() + 1).padStart(2, '0'); // Months are zero-based + const year = String(date.getFullYear()); + const hours = String(date.getHours()).padStart(2, '0'); + const minutes = String(date.getMinutes()).padStart(2, '0'); + const seconds = String(date.getSeconds()).padStart(2, '0'); + + return `${day}/${month}/${year}, ${hours}:${minutes}:${seconds}`; +}; diff --git a/packages/bridge-ui/src/libs/util/getBlockFromTxHash.ts b/packages/bridge-ui/src/libs/util/getBlockFromTxHash.ts new file mode 100644 index 00000000000..4ca49781db4 --- /dev/null +++ b/packages/bridge-ui/src/libs/util/getBlockFromTxHash.ts @@ -0,0 +1,23 @@ +import { getTransaction, type GetTransactionReturnType } from '@wagmi/core'; +import type { Hash } from 'viem'; + +import { getLogger } from '$libs/util/logger'; +import { config } from '$libs/wagmi'; + +const log = getLogger('getBlockFromTxHash'); + +export const getBlockFromTxHash = async (txHash: Hash, chainId: bigint) => { + if (!txHash || !chainId) { + console.error('Missing txHash or chainId', txHash, chainId); + throw new Error('Missing txHash or chainId'); + } + + log('Getting block from tx hash', txHash, chainId); + const transactionData: GetTransactionReturnType = await getTransaction(config, { + hash: txHash, + chainId: Number(chainId), + }); + log('Transaction data', transactionData); + const { blockNumber } = transactionData; + return blockNumber; +}; diff --git a/packages/bridge-ui/src/libs/util/getBlockTimestamp.ts b/packages/bridge-ui/src/libs/util/getBlockTimestamp.ts new file mode 100644 index 00000000000..067d2f78509 --- /dev/null +++ b/packages/bridge-ui/src/libs/util/getBlockTimestamp.ts @@ -0,0 +1,13 @@ +import { getPublicClient } from '@wagmi/core'; + +import { ClientError } from '$libs/error'; +import { config } from '$libs/wagmi'; + +export const geBlockTimestamp = async (srcChainId: bigint, blockNumber: bigint) => { + const client = getPublicClient(config, { chainId: Number(srcChainId) }); + if (!client) throw new ClientError('Client not found'); + const block = await client.getBlock({ + blockNumber, + }); + return block.timestamp; +}; diff --git a/packages/bridge-ui/src/libs/util/isSmartContractWallet.test.ts b/packages/bridge-ui/src/libs/util/isSmartContract.test.ts similarity index 79% rename from packages/bridge-ui/src/libs/util/isSmartContractWallet.test.ts rename to packages/bridge-ui/src/libs/util/isSmartContract.test.ts index ba9be467fff..64d9d996582 100644 --- a/packages/bridge-ui/src/libs/util/isSmartContractWallet.test.ts +++ b/packages/bridge-ui/src/libs/util/isSmartContract.test.ts @@ -4,7 +4,7 @@ import { beforeEach, describe, expect, it, vi } from 'vitest'; import { config } from '$libs/wagmi'; import { L1_CHAIN_ID } from '$mocks'; -import { isSmartContractWallet } from './isSmartContractWallet'; +import { isSmartContract } from './isSmartContract'; // Mock wagmi core vi.mock('@wagmi/core'); @@ -13,7 +13,7 @@ vi.mock('$customToken'); vi.mock('$libs/token'); -describe('isSmartContractWallet', () => { +describe('isSmartContract', () => { const mockWalletAddress = '0x1234567890abcdef1234567890abcdef12345678'; const mockChainId = L1_CHAIN_ID; const mockClient = { @@ -30,7 +30,7 @@ describe('isSmartContractWallet', () => { mockClient.getBytecode.mockResolvedValueOnce('0x6000600055'); // When - const result = await isSmartContractWallet(mockWalletAddress, mockChainId); + const result = await isSmartContract(mockWalletAddress, mockChainId); // Then expect(result).toBe(true); @@ -43,7 +43,7 @@ describe('isSmartContractWallet', () => { mockClient.getBytecode.mockResolvedValueOnce('0x'); // When - const result = await isSmartContractWallet(mockWalletAddress, mockChainId); + const result = await isSmartContract(mockWalletAddress, mockChainId); // Then expect(result).toBe(false); @@ -56,6 +56,6 @@ describe('isSmartContractWallet', () => { vi.mocked(getPublicClient).mockReturnValueOnce(null); // When/Then - await expect(isSmartContractWallet(mockWalletAddress, mockChainId)).rejects.toThrow('No public client found'); + await expect(isSmartContract(mockWalletAddress, mockChainId)).rejects.toThrow('No public client found'); }); }); diff --git a/packages/bridge-ui/src/libs/util/isSmartContractWallet.ts b/packages/bridge-ui/src/libs/util/isSmartContract.ts similarity index 70% rename from packages/bridge-ui/src/libs/util/isSmartContractWallet.ts rename to packages/bridge-ui/src/libs/util/isSmartContract.ts index 53c49bf1e35..9bbc18e2332 100644 --- a/packages/bridge-ui/src/libs/util/isSmartContractWallet.ts +++ b/packages/bridge-ui/src/libs/util/isSmartContract.ts @@ -5,9 +5,9 @@ import { config } from '$libs/wagmi'; import { getLogger } from './logger'; -const log = getLogger('util:isSmartContractWallet'); +const log = getLogger('util:isSmartContract'); -export const isSmartContractWallet = async (walletAddress: Address, chainId: number) => { +export const isSmartContract = async (walletAddress: Address, chainId: number) => { const publicClient = getPublicClient(config, { chainId }); if (!publicClient) throw new Error('No public client found'); @@ -18,6 +18,6 @@ export const isSmartContractWallet = async (walletAddress: Address, chainId: num if (byteCode !== '0x' && byteCode !== undefined) { isSmartContract = true; } - log('isSmartContractWallet', isSmartContract, walletAddress, chainId); + log('isSmartContract', isSmartContract, walletAddress, chainId); return isSmartContract; }; diff --git a/packages/bridge-ui/src/libs/util/mergeTransactions.test.ts b/packages/bridge-ui/src/libs/util/mergeTransactions.test.ts index f6196e92cee..ffb09bc4a03 100644 --- a/packages/bridge-ui/src/libs/util/mergeTransactions.test.ts +++ b/packages/bridge-ui/src/libs/util/mergeTransactions.test.ts @@ -47,11 +47,13 @@ describe('mergeUniqueTransactions', () => { // Given const localTxs: BridgeTransaction[] = [ { - hash: 'hash1' as Hex, + srcTxHash: 'hash1' as Hex, + destTxHash: 'destHash1' as Hex, from: 'address1' as Address, amount: BigInt(1000), symbol: 'symbol1', decimals: 2, + processingFee: 1111n, srcChainId: BigInt(1), destChainId: BigInt(2), msgStatus: MessageStatus.DONE, @@ -62,11 +64,13 @@ describe('mergeUniqueTransactions', () => { tokenType: 'ERC20' as TokenType, }, { - hash: 'hash2' as Hex, + srcTxHash: 'hash2' as Hex, + destTxHash: 'destHash2' as Hex, from: 'address2' as Address, amount: BigInt(2000), symbol: 'symbol2', decimals: 2, + processingFee: 1111n, srcChainId: BigInt(1), destChainId: BigInt(2), msgStatus: MessageStatus.DONE, @@ -79,11 +83,13 @@ describe('mergeUniqueTransactions', () => { const relayerTx: BridgeTransaction[] = [ { - hash: 'hash3' as Hex, + srcTxHash: 'hash3' as Hex, + destTxHash: 'destHash3' as Hex, from: 'address3' as Address, amount: BigInt(3000), symbol: 'symbol3', decimals: 2, + processingFee: 1111n, srcChainId: BigInt(1), destChainId: BigInt(2), msgStatus: MessageStatus.DONE, @@ -93,11 +99,13 @@ describe('mergeUniqueTransactions', () => { blockNumber: '0x123', }, { - hash: 'hash4' as Hex, + srcTxHash: 'hash4' as Hex, + destTxHash: 'destHash4' as Hex, from: 'address4' as Address, amount: BigInt(4000), symbol: 'symbol4', decimals: 2, + processingFee: 1111n, srcChainId: BigInt(1), destChainId: BigInt(2), msgStatus: MessageStatus.DONE, @@ -136,10 +144,12 @@ describe('mergeUniqueTransactions', () => { const localWithOutdated = [ ...localTxs, { - hash: 'hash3' as Hex, + srcTxHash: 'hash3' as Hex, + destTxHash: 'destHash3' as Hex, from: 'address2' as Address, amount: BigInt(2000), symbol: 'symbol2', + processingFee: 1111n, decimals: 2, srcChainId: BigInt(1), destChainId: BigInt(2), @@ -164,5 +174,5 @@ describe('mergeUniqueTransactions', () => { }); function extractHashes(transactions: BridgeTransaction[]): Hex[] { - return transactions.map((tx) => tx.hash); + return transactions.map((tx) => tx.srcTxHash); } diff --git a/packages/bridge-ui/src/libs/util/mergeTransactions.ts b/packages/bridge-ui/src/libs/util/mergeTransactions.ts index 42805471ed3..d5865fa665b 100644 --- a/packages/bridge-ui/src/libs/util/mergeTransactions.ts +++ b/packages/bridge-ui/src/libs/util/mergeTransactions.ts @@ -10,13 +10,13 @@ export const mergeAndCaptureOutdatedTransactions = ( relayerTx: BridgeTransaction[], ): MergeResult => { const relayerTxMap: Map = new Map(); - relayerTx.forEach((tx) => relayerTxMap.set(tx.hash, tx)); + relayerTx.forEach((tx) => relayerTxMap.set(tx.srcTxHash, tx)); const outdatedLocalTransactions: BridgeTransaction[] = []; const mergedTransactions: BridgeTransaction[] = []; for (const tx of localTxs) { - if (!relayerTxMap.has(tx.hash)) { + if (!relayerTxMap.has(tx.srcTxHash)) { mergedTransactions.push(tx); } else { outdatedLocalTransactions.push(tx); diff --git a/packages/bridge-ui/src/libs/util/responsiveCheck.ts b/packages/bridge-ui/src/libs/util/responsiveCheck.ts new file mode 100644 index 00000000000..295f9142dd2 --- /dev/null +++ b/packages/bridge-ui/src/libs/util/responsiveCheck.ts @@ -0,0 +1,49 @@ +import { derived, writable } from 'svelte/store'; + +export let desktopQuery: MediaQueryList; +export let tabletQuery: MediaQueryList; +export let mobileQuery: MediaQueryList; + +// Writable stores to track media query states +const isDesktopQuery = writable(true); +const isTabletQuery = writable(false); +const isMobileQuery = writable(false); + +// Function to update the writable stores based on media query changes +export function updateMediaQueries() { + if (desktopQuery) { + isDesktopQuery.set(desktopQuery.matches); + } + if (tabletQuery) { + isTabletQuery.set(tabletQuery.matches); + } + if (mobileQuery) { + isMobileQuery.set(mobileQuery.matches); + } +} + +export function mediaQueryHandler() { + updateMediaQueries(); +} + +// Derived stores to compute the values based on media queries +export const isDesktop = derived(isDesktopQuery, ($isDesktopQuery) => $isDesktopQuery); +export const isTablet = derived(isTabletQuery, ($isTabletQuery) => $isTabletQuery); +export const isMobile = derived(isMobileQuery, ($isMobileQuery) => $isMobileQuery); + +// Function to initialize media queries only on the client side +export function initializeMediaQueries() { + if (typeof window !== 'undefined') { + desktopQuery = window.matchMedia('(min-width: 1200px)'); + tabletQuery = window.matchMedia('(min-width: 768px) and (max-width: 1199px)'); + mobileQuery = window.matchMedia('(max-width: 767px)'); + + // Set initial values + updateMediaQueries(); + + // Listen for changes + desktopQuery.addEventListener('change', updateMediaQueries); + tabletQuery.addEventListener('change', updateMediaQueries); + mobileQuery.addEventListener('change', updateMediaQueries); + } +} diff --git a/packages/bridge-ui/src/libs/util/shortenAddress.ts b/packages/bridge-ui/src/libs/util/shortenAddress.ts index 23902b714fa..25588b0718b 100644 --- a/packages/bridge-ui/src/libs/util/shortenAddress.ts +++ b/packages/bridge-ui/src/libs/util/shortenAddress.ts @@ -1,4 +1,4 @@ -export const shortenAddress = (address: string, charsStart = 6, charsEnd = 4, sep = '…') => { +export const shortenAddress = (address: string | undefined, charsStart = 6, charsEnd = 4, sep = '…') => { if (!address) return '0x'; return [address.slice(0, charsStart), address.slice(-charsEnd)].join(sep); }; diff --git a/packages/bridge-ui/src/libs/util/truncateString.ts b/packages/bridge-ui/src/libs/util/truncateString.ts index 266795e21dd..593065a6070 100644 --- a/packages/bridge-ui/src/libs/util/truncateString.ts +++ b/packages/bridge-ui/src/libs/util/truncateString.ts @@ -1,3 +1,4 @@ export function truncateString(str: string, maxlength: number, strBoundary = '…') { + if (!str) return; return str.length > maxlength ? `${str.substring(0, maxlength)}${strBoundary}` : str; } diff --git a/packages/bridge-ui/src/libs/util/uid.test.ts b/packages/bridge-ui/src/libs/util/uid.test.ts deleted file mode 100644 index 44ee4aa327e..00000000000 --- a/packages/bridge-ui/src/libs/util/uid.test.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { uid } from './uid'; - -describe('uid', () => { - it('should always return a unique id', () => { - const generatedIds = new Set(); - - // Is this unique enough? 😅 - for (let i = 0; i < 1000; i++) { - generatedIds.add(uid()); - } - - expect(generatedIds.size).toBe(1000); - }); -}); diff --git a/packages/bridge-ui/src/libs/util/uid.ts b/packages/bridge-ui/src/libs/util/uid.ts deleted file mode 100644 index 62cb3175f16..00000000000 --- a/packages/bridge-ui/src/libs/util/uid.ts +++ /dev/null @@ -1,3 +0,0 @@ -export function uid() { - return Math.floor(Math.random() * Date.now()).toString(16); -} diff --git a/packages/bridge-ui/src/libs/wagmi/watcher.ts b/packages/bridge-ui/src/libs/wagmi/watcher.ts index 3523b253ddf..31fe27791c6 100644 --- a/packages/bridge-ui/src/libs/wagmi/watcher.ts +++ b/packages/bridge-ui/src/libs/wagmi/watcher.ts @@ -3,13 +3,14 @@ import { watchAccount } from '@wagmi/core'; import { chains, isSupportedChain } from '$libs/chain'; import { refreshUserBalance } from '$libs/util/balance'; import { checkForPausedContracts } from '$libs/util/checkForPausedContracts'; -import { isSmartContractWallet } from '$libs/util/isSmartContractWallet'; +import { isSmartContract } from '$libs/util/isSmartContract'; import { getLogger } from '$libs/util/logger'; import { account, connectedSmartContractWallet } from '$stores/account'; import { switchChainModal } from '$stores/modal'; import { connectedSourceChain } from '$stores/network'; import { config } from './client'; + const log = getLogger('wagmi:watcher'); let isWatching = false; @@ -23,6 +24,7 @@ export async function startWatching() { async onChange(data) { await checkForPausedContracts(); log('Account changed', data); + account.set(data); refreshUserBalance(); const { chainId, address } = data; @@ -30,7 +32,7 @@ export async function startWatching() { if (chainId && address) { let smartWallet = false; try { - smartWallet = (await isSmartContractWallet(address, Number(chainId))) || false; + smartWallet = (await isSmartContract(address, Number(chainId))) || false; } catch (error) { console.error('Error checking for smart contract wallet', error); } finally { @@ -49,10 +51,8 @@ export async function startWatching() { // the source chain. const srcChain = chains.find((c) => c.id === Number(chainId)); if (srcChain) connectedSourceChain.set(srcChain); - refreshUserBalance(); } - account.set(data); }, }); diff --git a/packages/bridge-ui/src/routes/+layout.svelte b/packages/bridge-ui/src/routes/+layout.svelte index 2a1865c3636..b54c6cf4f2c 100644 --- a/packages/bridge-ui/src/routes/+layout.svelte +++ b/packages/bridge-ui/src/routes/+layout.svelte @@ -4,14 +4,24 @@ import { onDestroy, onMount } from 'svelte'; + import { browser } from '$app/environment'; import { AccountConnectionToast } from '$components/AccountConnectionToast'; import { BridgePausedModal } from '$components/BridgePausedModal'; import { Header } from '$components/Header'; import { NotificationToast } from '$components/NotificationToast'; import { SideNavigation } from '$components/SideNavigation'; import { SwitchChainModal } from '$components/SwitchChainModal'; + import { + desktopQuery, + initializeMediaQueries, + mediaQueryHandler, + mobileQuery, + tabletQuery, + } from '$libs/util/responsiveCheck'; import { startWatching, stopWatching } from '$libs/wagmi'; + let sideBarOpen = false; + const syncPointer = ({ x, y }: { x: number; y: number }) => { document.documentElement.style.setProperty('--x', x.toFixed(2)); document.documentElement.style.setProperty('--xp', (x / window.innerWidth).toFixed(2)); @@ -21,18 +31,40 @@ onMount(async () => { await startWatching(); - document.body.addEventListener('pointermove', syncPointer); + initializeMediaQueries(); + + if (desktopQuery) { + desktopQuery.addEventListener('change', mediaQueryHandler); + document.body.addEventListener('pointermove', syncPointer); + } + if (tabletQuery) { + tabletQuery.addEventListener('change', mediaQueryHandler); + } + if (mobileQuery) { + mobileQuery.addEventListener('change', mediaQueryHandler); + } }); onDestroy(() => { stopWatching(); - document.body.removeEventListener('pointermove', syncPointer); + if (browser) { + document.body.removeEventListener('pointermove', syncPointer); + } + if (desktopQuery) { + desktopQuery.removeEventListener('change', mediaQueryHandler); + } + if (tabletQuery) { + tabletQuery.removeEventListener('change', mediaQueryHandler); + } + if (mobileQuery) { + mobileQuery.removeEventListener('change', mediaQueryHandler); + } }); - -
+
+
diff --git a/packages/bridge-ui/src/routes/relayer/+page.svelte b/packages/bridge-ui/src/routes/relayer/+page.svelte new file mode 100644 index 00000000000..ae0d824f7e0 --- /dev/null +++ b/packages/bridge-ui/src/routes/relayer/+page.svelte @@ -0,0 +1,11 @@ + + + + Taiko Bridge | Relayer + + + + diff --git a/packages/bridge-ui/src/routes/transactions/+page.svelte b/packages/bridge-ui/src/routes/transactions/+page.svelte index f821c3def6a..c775c4aa328 100644 --- a/packages/bridge-ui/src/routes/transactions/+page.svelte +++ b/packages/bridge-ui/src/routes/transactions/+page.svelte @@ -4,7 +4,7 @@ - Taiko Bridge | Activities + Taiko Bridge | Transactions diff --git a/packages/bridge-ui/src/styles/override.css b/packages/bridge-ui/src/styles/override.css index 2ac1f9b46f2..d3e2c6c6800 100644 --- a/packages/bridge-ui/src/styles/override.css +++ b/packages/bridge-ui/src/styles/override.css @@ -83,3 +83,13 @@ input[type='number'] { .label { padding: 0; } + +html:has(.drawer-toggle:checked) { + overflow-y: hidden; + scrollbar-gutter: unset; +} + +:root:has(:is(.modal-open, .modal:target, .modal-toggle:checked + .modal, .modal[open])) { + overflow: hidden; + scrollbar-gutter: unset; +} diff --git a/packages/bridge-ui/src/tests/mocks/transactions.ts b/packages/bridge-ui/src/tests/mocks/transactions.ts index 57dfaa6fa80..101ee295376 100644 --- a/packages/bridge-ui/src/tests/mocks/transactions.ts +++ b/packages/bridge-ui/src/tests/mocks/transactions.ts @@ -9,10 +9,12 @@ import { L1_CHAIN_ID, L2_CHAIN_ID } from './chains'; import { MOCK_MESSAGE_L1_L2 } from './messages'; export const MOCK_BRIDGE_TX_1 = { - hash: zeroHash, + srcTxHash: zeroHash, + destTxHash: zeroHash, status: 0, msgStatus: MessageStatus.NEW, msgHash: zeroHash, + processingFee: 1111n, from: ALICE, amount: 123n, symbol: 'WAGMI', diff --git a/packages/bridge-ui/static/coins/crvUSD.png b/packages/bridge-ui/static/coins/crvUSD.png new file mode 100644 index 00000000000..0ae01bbed98 Binary files /dev/null and b/packages/bridge-ui/static/coins/crvUSD.png differ diff --git a/packages/bridge-ui/static/coins/curve.png b/packages/bridge-ui/static/coins/curve.png new file mode 100644 index 00000000000..1f869a2d96b Binary files /dev/null and b/packages/bridge-ui/static/coins/curve.png differ diff --git a/packages/bridge-ui/static/coins/dai.webp b/packages/bridge-ui/static/coins/dai.webp new file mode 100644 index 00000000000..84219514856 Binary files /dev/null and b/packages/bridge-ui/static/coins/dai.webp differ diff --git a/packages/bridge-ui/static/coins/scrvUSD.png b/packages/bridge-ui/static/coins/scrvUSD.png new file mode 100644 index 00000000000..4ee5a0072b0 Binary files /dev/null and b/packages/bridge-ui/static/coins/scrvUSD.png differ diff --git a/packages/bridge-ui/tailwind.config.js b/packages/bridge-ui/tailwind.config.js index 2aef58aa151..f1a37132d25 100644 --- a/packages/bridge-ui/tailwind.config.js +++ b/packages/bridge-ui/tailwind.config.js @@ -6,6 +6,9 @@ export default { content: ['./src/**/*.{html,js,svelte,ts}'], theme: { extend: { + width: { + dvw: '100dvw', + }, colors: { /*************** * Base colors * @@ -248,6 +251,9 @@ export default { '--warning-sentiment': '#EBB222', // yellow-400 '--warning-background': '#382800', // yellow-800 + '--neutral-sentiment': '#0052CC', // blue-500 + '--neutral-sentiment-background': '#002966', // blue-700 + '--elevated-background': '#191E28', // grey-800 '--neutral-background': '#2B303B', // grey-700 '--neutral-content': '#2B303B', // grey-800 diff --git a/packages/docs-site/CHANGELOG.md b/packages/docs-site/CHANGELOG.md index a47c16e9666..db1bac8ab3a 100644 --- a/packages/docs-site/CHANGELOG.md +++ b/packages/docs-site/CHANGELOG.md @@ -1,5 +1,291 @@ # Changelog +## [1.21.2](https://github.com/taikoxyz/taiko-mono/compare/docs-site-v1.21.1...docs-site-v1.21.2) (2025-01-07) + + +### Chores + +* **docs-site:** update codebase analysis to reflect protocol changes ([#18714](https://github.com/taikoxyz/taiko-mono/issues/18714)) ([6157af5](https://github.com/taikoxyz/taiko-mono/commit/6157af5c63608876c5f090017c315ca59c6bd4ef)) + +## [1.21.1](https://github.com/taikoxyz/taiko-mono/compare/docs-site-v1.21.0...docs-site-v1.21.1) (2025-01-03) + + +### Chores + +* **docs-site:** revert zk coverage docs ([#18682](https://github.com/taikoxyz/taiko-mono/issues/18682)) ([26c5fb3](https://github.com/taikoxyz/taiko-mono/commit/26c5fb3ad09a061997ffba28e91938b172d28798)) +* **repo:** fix broken links ([#18635](https://github.com/taikoxyz/taiko-mono/issues/18635)) ([8e53a6e](https://github.com/taikoxyz/taiko-mono/commit/8e53a6e6a2654b8a599fe1df187e2fd88c22d96e)) + +## [1.21.0](https://github.com/taikoxyz/taiko-mono/compare/docs-site-v1.20.3...docs-site-v1.21.0) (2024-12-23) + + +### Features + +* **docs-site:** add doc for SGX Verifier. ([#18579](https://github.com/taikoxyz/taiko-mono/issues/18579)) ([08b2c49](https://github.com/taikoxyz/taiko-mono/commit/08b2c49f19b25643b4570642d1612b15d5d71290)) + + +### Chores + +* **docs-site:** fix broken link ([#18585](https://github.com/taikoxyz/taiko-mono/issues/18585)) ([38bbb55](https://github.com/taikoxyz/taiko-mono/commit/38bbb55dc076a03751871dde5d61729282a68d9a)) +* **docs-site:** fix typos in node operator guides ([#18586](https://github.com/taikoxyz/taiko-mono/issues/18586)) ([b4bd23c](https://github.com/taikoxyz/taiko-mono/commit/b4bd23ca0798ab239730765a4ca1d8e49ef6e52e)) +* **docs-site:** update proof tier graphic ([#18617](https://github.com/taikoxyz/taiko-mono/issues/18617)) ([becffb7](https://github.com/taikoxyz/taiko-mono/commit/becffb7cc81c6f17436985a81750a5eef7f980e1)) + + +### Build + +* **deps:** bump github.com/stretchr/testify from 1.9.0 to 1.10.0 ([#18539](https://github.com/taikoxyz/taiko-mono/issues/18539)) ([79f3fab](https://github.com/taikoxyz/taiko-mono/commit/79f3fab5f1d1ec1bb4ee18afb9268b622e894780)) +* **deps:** bump golang.org/x/sync from 0.9.0 to 0.10.0 ([#18560](https://github.com/taikoxyz/taiko-mono/issues/18560)) ([3d51970](https://github.com/taikoxyz/taiko-mono/commit/3d51970aa0953bbfecaeebf76ea7e664c875c0e4)) + +## [1.20.3](https://github.com/taikoxyz/taiko-mono/compare/docs-site-v1.20.2...docs-site-v1.20.3) (2024-12-09) + + +### Bug Fixes + +* **docs-site:** update hekla graphic ([#18572](https://github.com/taikoxyz/taiko-mono/issues/18572)) ([ee50fdc](https://github.com/taikoxyz/taiko-mono/commit/ee50fdceec2d8f3a58a67f07b41e832898108e5d)) + + +### Chores + +* **main:** release docs-site 1.20.2 ([#18563](https://github.com/taikoxyz/taiko-mono/issues/18563)) ([ca837f1](https://github.com/taikoxyz/taiko-mono/commit/ca837f1ec3126871d6e8da3323fd8dc8becf7107)) + +## [1.20.2](https://github.com/taikoxyz/taiko-mono/compare/docs-site-v1.20.1...docs-site-v1.20.2) (2024-12-08) + + +### Bug Fixes + +* **docs-site:** link of goldsky in dev tools ([#18562](https://github.com/taikoxyz/taiko-mono/issues/18562)) ([802569a](https://github.com/taikoxyz/taiko-mono/commit/802569ab2b7ebde69eae45e63228bb280b30fc12)) + +## [1.20.1](https://github.com/taikoxyz/taiko-mono/compare/docs-site-v1.20.0...docs-site-v1.20.1) (2024-12-07) + + +### Bug Fixes + +* **docs-site:** correct graphic ([#18561](https://github.com/taikoxyz/taiko-mono/issues/18561)) ([b574358](https://github.com/taikoxyz/taiko-mono/commit/b5743588e6492a67e1e5d3cc88906f92fec673bb)) + + +### Chores + +* **docs-site:** add goldsky to dev tools ([#18552](https://github.com/taikoxyz/taiko-mono/issues/18552)) ([4b83b5f](https://github.com/taikoxyz/taiko-mono/commit/4b83b5f76157d73f2c798195730b67adaf9ef09d)) +* **docs-site:** update hekla proof tier config graphic and address ([#18554](https://github.com/taikoxyz/taiko-mono/issues/18554)) ([0854e12](https://github.com/taikoxyz/taiko-mono/commit/0854e12beb8ad4036eecaa3d72589bdb5ab82927)) + +## [1.20.0](https://github.com/taikoxyz/taiko-mono/compare/docs-site-v1.19.0...docs-site-v1.20.0) (2024-12-06) + + +### Features + +* **docs-site:** add taiko-protocol section with economics and codebase analysis ([#18542](https://github.com/taikoxyz/taiko-mono/issues/18542)) ([55acc93](https://github.com/taikoxyz/taiko-mono/commit/55acc93c1cf6628f2d1ca6f0b2ca20a257f74e1f)) + +## [1.19.0](https://github.com/taikoxyz/taiko-mono/compare/docs-site-v1.18.0...docs-site-v1.19.0) (2024-11-28) + + +### Features + +* **docs-site:** add escenario and explanation for contestable rollup ([#18530](https://github.com/taikoxyz/taiko-mono/issues/18530)) ([7246fbb](https://github.com/taikoxyz/taiko-mono/commit/7246fbb76d46532af61f147b0761851f0cc90b91)) + +## [1.18.0](https://github.com/taikoxyz/taiko-mono/compare/docs-site-v1.17.1...docs-site-v1.18.0) (2024-11-26) + + +### Features + +* **docs-site:** add software releases page that shows latest software releases and protocol deployments ([#18523](https://github.com/taikoxyz/taiko-mono/issues/18523)) ([23862a2](https://github.com/taikoxyz/taiko-mono/commit/23862a26890492231cdbf5dd07366e294debda99)) + +## [1.17.1](https://github.com/taikoxyz/taiko-mono/compare/docs-site-v1.17.0...docs-site-v1.17.1) (2024-11-18) + + +### Chores + +* **docs-site:** update tier router address ([#18495](https://github.com/taikoxyz/taiko-mono/issues/18495)) ([73ba72e](https://github.com/taikoxyz/taiko-mono/commit/73ba72e27586119f269a2c6baf29b6386fcf352c)) + +## [1.17.0](https://github.com/taikoxyz/taiko-mono/compare/docs-site-v1.16.0...docs-site-v1.17.0) (2024-11-12) + + +### Features + +* **docs-site:** update testnet address ([#18472](https://github.com/taikoxyz/taiko-mono/issues/18472)) ([cda3956](https://github.com/taikoxyz/taiko-mono/commit/cda3956f23f5ae913d1432e90417351db52572fb)) +* **docs-site:** update tier config and graphic ([#18487](https://github.com/taikoxyz/taiko-mono/issues/18487)) ([af081af](https://github.com/taikoxyz/taiko-mono/commit/af081af99512e07763f1b95f2f747d43633320da)) + + +### Chores + +* **docs-site:** update block-states.mdx ([#18480](https://github.com/taikoxyz/taiko-mono/issues/18480)) ([3dff524](https://github.com/taikoxyz/taiko-mono/commit/3dff5248ae06be93c69c99b3d891133d8cbe2057)) + +## [1.16.0](https://github.com/taikoxyz/taiko-mono/compare/docs-site-v1.15.0...docs-site-v1.16.0) (2024-11-07) + + +### Features + +* **docs-site:** update graphic for hekla network config ([#18457](https://github.com/taikoxyz/taiko-mono/issues/18457)) ([1d9b753](https://github.com/taikoxyz/taiko-mono/commit/1d9b753d7163104e5593d3c46d019d9cdae7d549)) + +## [1.15.0](https://github.com/taikoxyz/taiko-mono/compare/docs-site-v1.14.0...docs-site-v1.15.0) (2024-11-05) + + +### Features + +* **docs-site:** update network config, list cooldown, proving windows and bonds for every tier, remove banner ([#18377](https://github.com/taikoxyz/taiko-mono/issues/18377)) ([df16035](https://github.com/taikoxyz/taiko-mono/commit/df160358ad022025e76b5957ad0952e4f804dacd)) + + +### Documentation + +* **docs-site:** update mainnet prover docs ([#18367](https://github.com/taikoxyz/taiko-mono/issues/18367)) ([4fd7b59](https://github.com/taikoxyz/taiko-mono/commit/4fd7b5922dd1447d91ec7fea83c987cb1643cc1b)) + + +### Workflow + +* **protocol:** trigger patch release (1.10.1) ([#18358](https://github.com/taikoxyz/taiko-mono/issues/18358)) ([f4f4796](https://github.com/taikoxyz/taiko-mono/commit/f4f4796488059b02c79d6fb15170df58dd31dc4e)) + +## [1.14.0](https://github.com/taikoxyz/taiko-mono/compare/docs-site-v1.13.0...docs-site-v1.14.0) (2024-10-25) + + +### Features + +* **docs-site:** add banner for mainnet protocol upgrade ([#18306](https://github.com/taikoxyz/taiko-mono/issues/18306)) ([550dda3](https://github.com/taikoxyz/taiko-mono/commit/550dda334dfa2d53a757ce46091acaba4248371a)) + +## [1.13.0](https://github.com/taikoxyz/taiko-mono/compare/docs-site-v1.12.3...docs-site-v1.13.0) (2024-10-25) + + +### Features + +* **docs-site:** add pyth to taiko docs ([#18294](https://github.com/taikoxyz/taiko-mono/issues/18294)) ([59832f1](https://github.com/taikoxyz/taiko-mono/commit/59832f1324cbf98de339552fd8d5039afe3d0e9c)) + +## [1.12.3](https://github.com/taikoxyz/taiko-mono/compare/docs-site-v1.12.2...docs-site-v1.12.3) (2024-10-20) + + +### Chores + +* **docs-site:** remove banner ([#18267](https://github.com/taikoxyz/taiko-mono/issues/18267)) ([1a46093](https://github.com/taikoxyz/taiko-mono/commit/1a460932a704d3660269336540812f33d7e8cbc4)) + +## [1.12.2](https://github.com/taikoxyz/taiko-mono/compare/docs-site-v1.12.1...docs-site-v1.12.2) (2024-10-14) + + +### Bug Fixes + +* **docs-site:** fix edit link ([#18243](https://github.com/taikoxyz/taiko-mono/issues/18243)) ([ea55bc2](https://github.com/taikoxyz/taiko-mono/commit/ea55bc24ea7184655804b88cc3c424b69fc87103)) + +## [1.12.1](https://github.com/taikoxyz/taiko-mono/compare/docs-site-v1.12.0...docs-site-v1.12.1) (2024-09-30) + + +### Chores + +* **docs-site:** fix broken diagram and delete self-direction link ([#18180](https://github.com/taikoxyz/taiko-mono/issues/18180)) ([2e20c28](https://github.com/taikoxyz/taiko-mono/commit/2e20c28e1ac482d3f6bb8ac5e182a43675853166)) + + +### Documentation + +* **docs-site:** add warning to proposer page and update banner ([#18186](https://github.com/taikoxyz/taiko-mono/issues/18186)) ([b02ea92](https://github.com/taikoxyz/taiko-mono/commit/b02ea92af01b37670c2545dbd4e332ab4803ae03)) + +## [1.12.0](https://github.com/taikoxyz/taiko-mono/compare/docs-site-v1.11.9...docs-site-v1.12.0) (2024-09-19) + + +### Features + +* **docs-site:** sitewide banner for ontake fork notification ([#18111](https://github.com/taikoxyz/taiko-mono/issues/18111)) ([5ed6c80](https://github.com/taikoxyz/taiko-mono/commit/5ed6c8085e44b77283fe5ef8874f751126364d84)) +* **docs-site:** update docs for ontake fork hekla ([#18143](https://github.com/taikoxyz/taiko-mono/issues/18143)) ([49b5071](https://github.com/taikoxyz/taiko-mono/commit/49b50712551849d185c98237098d236bb0cf884c)) +* **docs-site:** update graphics and links for hekla ontake fork ([#18146](https://github.com/taikoxyz/taiko-mono/issues/18146)) ([48a27af](https://github.com/taikoxyz/taiko-mono/commit/48a27afe6be22fc7e1a9d2346ae292544faac0b3)) + + +### Bug Fixes + +* **docs-site:** remove duplicate wording ([#18105](https://github.com/taikoxyz/taiko-mono/issues/18105)) ([92c53f8](https://github.com/taikoxyz/taiko-mono/commit/92c53f8655dbdab4c7db1b023823a4e760240894)) + + +### Documentation + +* **docs-site:** fix broken link ([#18139](https://github.com/taikoxyz/taiko-mono/issues/18139)) ([e56b81b](https://github.com/taikoxyz/taiko-mono/commit/e56b81bbd83f26c95641cf7deab82dbb5a3da835)) + +## [1.11.9](https://github.com/taikoxyz/taiko-mono/compare/docs-site-v1.11.8...docs-site-v1.11.9) (2024-09-15) + + +### Documentation + +* **docs-site:** add forge verify in faq ([#17937](https://github.com/taikoxyz/taiko-mono/issues/17937)) ([513d9fe](https://github.com/taikoxyz/taiko-mono/commit/513d9fe745ff947e6a1f3f21cfc568432b008d65)) +* **docs-site:** added documentation for PORTERS ([#18033](https://github.com/taikoxyz/taiko-mono/issues/18033)) ([548884d](https://github.com/taikoxyz/taiko-mono/commit/548884d10ca3dc9931c025428f827335e42b55db)) +* **docs-site:** update docs for hekla ontake ([#18090](https://github.com/taikoxyz/taiko-mono/issues/18090)) ([f877568](https://github.com/taikoxyz/taiko-mono/commit/f8775684f32f46f04e8bc8a416f7e2bacfb32530)) + +## [1.11.8](https://github.com/taikoxyz/taiko-mono/compare/docs-site-v1.11.7...docs-site-v1.11.8) (2024-08-08) + + +### Documentation + +* **docs-site:** add more node troubleshooting ([#17872](https://github.com/taikoxyz/taiko-mono/issues/17872)) ([9c31ffc](https://github.com/taikoxyz/taiko-mono/commit/9c31ffc58b36a07286606e8e289504f49301d4df)) + +## [1.11.7](https://github.com/taikoxyz/taiko-mono/compare/docs-site-v1.11.6...docs-site-v1.11.7) (2024-07-20) + + +### Documentation + +* **repo, docs-site:** add release info links ([#17819](https://github.com/taikoxyz/taiko-mono/issues/17819)) ([c268467](https://github.com/taikoxyz/taiko-mono/commit/c268467b5af165855bdc909ac245e14aa92f1e17)) + +## [1.11.6](https://github.com/taikoxyz/taiko-mono/compare/docs-site-v1.11.5...docs-site-v1.11.6) (2024-07-19) + + +### Documentation + +* **docs-site:** address docs and scripts friction points ([#17815](https://github.com/taikoxyz/taiko-mono/issues/17815)) ([c74968b](https://github.com/taikoxyz/taiko-mono/commit/c74968b61828babf218fbc8e8ded001a853a93c3)) +* **docs-site:** update deploy-a-proverset.mdx ([#17813](https://github.com/taikoxyz/taiko-mono/issues/17813)) ([dd09223](https://github.com/taikoxyz/taiko-mono/commit/dd09223de53669b84241672eeb4b8574e5c7f821)) + +## [1.11.5](https://github.com/taikoxyz/taiko-mono/compare/docs-site-v1.11.4...docs-site-v1.11.5) (2024-07-17) + + +### Documentation + +* **docs-site:** add upgrade proverset script instructions ([#17799](https://github.com/taikoxyz/taiko-mono/issues/17799)) ([91d307c](https://github.com/taikoxyz/taiko-mono/commit/91d307c8edd527fa46011f2e21f5cc928853e0c8)) +* **docs-site:** update developer tools page ([#17738](https://github.com/taikoxyz/taiko-mono/issues/17738)) ([21ad192](https://github.com/taikoxyz/taiko-mono/commit/21ad192df174b78820c83910d559652c7ceefec0)) +* **docs-site:** update edited Taiko BCR Explorer link ([#17798](https://github.com/taikoxyz/taiko-mono/issues/17798)) ([11ecf83](https://github.com/taikoxyz/taiko-mono/commit/11ecf8325b79b25ee9fdf32bfd0c5971edf43670)) +* **docs-site:** update URL for .env.sample file ([#17794](https://github.com/taikoxyz/taiko-mono/issues/17794)) ([e8c1b18](https://github.com/taikoxyz/taiko-mono/commit/e8c1b18e89133daeade27e8e16d9328363c1a263)) + +## [1.11.4](https://github.com/taikoxyz/taiko-mono/compare/docs-site-v1.11.3...docs-site-v1.11.4) (2024-07-10) + + +### Documentation + +* **docs-site:** remove prover_endpoints from guide ([#17769](https://github.com/taikoxyz/taiko-mono/issues/17769)) ([ed4c9d6](https://github.com/taikoxyz/taiko-mono/commit/ed4c9d69cb60c0e3547c65b748f9fa78211713c3)) +* **docs-site:** update enable-prover site ([#17757](https://github.com/taikoxyz/taiko-mono/issues/17757)) ([15a5e7f](https://github.com/taikoxyz/taiko-mono/commit/15a5e7f059ca0c7d17f8b6c6cf472338a9d04fec)) + +## [1.11.3](https://github.com/taikoxyz/taiko-mono/compare/docs-site-v1.11.2...docs-site-v1.11.3) (2024-07-04) + + +### Documentation + +* **docs-site,protocol:** streamline ProverSet deployment ([#17730](https://github.com/taikoxyz/taiko-mono/issues/17730)) ([919cb4c](https://github.com/taikoxyz/taiko-mono/commit/919cb4cd0064d1cfa994e53a30a73f98975cfe34)) + +## [1.11.2](https://github.com/taikoxyz/taiko-mono/compare/docs-site-v1.11.1...docs-site-v1.11.2) (2024-07-01) + + +### Chores + +* **docs-site:** updates outdated client link in docs ([#17713](https://github.com/taikoxyz/taiko-mono/issues/17713)) ([4c321e2](https://github.com/taikoxyz/taiko-mono/commit/4c321e29a6714820290cc04b5b5f8662414feea5)) + + +### Documentation + +* **docs-site,protocol:** deploy proverset guide and scripts ([#17702](https://github.com/taikoxyz/taiko-mono/issues/17702)) ([a3e1cf7](https://github.com/taikoxyz/taiko-mono/commit/a3e1cf72bc4ad925d3652359a2f4d5fb466b79b0)) +* **docs-site:** add definitions and explanations for bonds ([#17673](https://github.com/taikoxyz/taiko-mono/issues/17673)) ([98276cc](https://github.com/taikoxyz/taiko-mono/commit/98276cc5dfb7ca828119163014488a3fe44605cf)) +* **docs-site:** add disclaimer and reminder to set addresses ([#17712](https://github.com/taikoxyz/taiko-mono/issues/17712)) ([677a0b6](https://github.com/taikoxyz/taiko-mono/commit/677a0b666b58ad2f56f0e4cad4d52f56d75cbcca)) +* **docs-site:** add warning about rpc rate limit ([#17700](https://github.com/taikoxyz/taiko-mono/issues/17700)) ([eebb9df](https://github.com/taikoxyz/taiko-mono/commit/eebb9df8d02b97cf210006b1de35dcf2df2b1b5e)) + +## [1.11.1](https://github.com/taikoxyz/taiko-mono/compare/docs-site-v1.11.0...docs-site-v1.11.1) (2024-06-24) + + +### Documentation + +* **docs-site:** update guardian minority bond amount and enable a prover guide ([#17636](https://github.com/taikoxyz/taiko-mono/issues/17636)) ([801a85e](https://github.com/taikoxyz/taiko-mono/commit/801a85e4ea958fed11a6b85bdcac501da0a9ed47)) +* **docs-site:** update proof tier config for testnet ([#17627](https://github.com/taikoxyz/taiko-mono/issues/17627)) ([53d672b](https://github.com/taikoxyz/taiko-mono/commit/53d672b2a87b1b26521ce4b782226e1ff22e5b40)) + +## [1.11.0](https://github.com/taikoxyz/taiko-mono/compare/docs-site-v1.10.0...docs-site-v1.11.0) (2024-06-18) + + +### Features + +* **docs-site:** add dune dashboard to dev tools ([#17617](https://github.com/taikoxyz/taiko-mono/issues/17617)) ([ae0b0f0](https://github.com/taikoxyz/taiko-mono/commit/ae0b0f0838541a58ff4f5018098881c15eeae46c)) +* **docs-site:** add verify in batches explanation ([#17600](https://github.com/taikoxyz/taiko-mono/issues/17600)) ([0a8a886](https://github.com/taikoxyz/taiko-mono/commit/0a8a88675413b0f579d4d4889897d2e8404a67f6)) + +## [1.10.0](https://github.com/taikoxyz/taiko-mono/compare/docs-site-v1.9.0...docs-site-v1.10.0) (2024-06-14) + + +### Features + +* **docs-site:** update guides ([#17536](https://github.com/taikoxyz/taiko-mono/issues/17536)) ([4a9ba42](https://github.com/taikoxyz/taiko-mono/commit/4a9ba42cadd1b2cd7d1a29097192ffe167eda3e2)) +* **docs-site:** update multiple articles ([#17552](https://github.com/taikoxyz/taiko-mono/issues/17552)) ([1561f92](https://github.com/taikoxyz/taiko-mono/commit/1561f92dded423676ced15c28ff7fa26cd6c96f5)) + ## [1.9.0](https://github.com/taikoxyz/taiko-mono/compare/docs-site-v1.8.1...docs-site-v1.9.0) (2024-06-07) diff --git a/packages/docs-site/astro.config.ts b/packages/docs-site/astro.config.ts index f504f963c4f..0c4eeda19e7 100644 --- a/packages/docs-site/astro.config.ts +++ b/packages/docs-site/astro.config.ts @@ -17,18 +17,12 @@ export default defineConfig({ plugins: [ starlightLinksValidator({ exclude: [ - // "/api-reference/blob-storage", "/api-reference/bridge-relayer", "/api-reference/event-indexer", "/api-reference/prover-server", ], }), starlightOpenAPI([ - // { - // base: "api-reference/blob-storage", - // label: "Blob Storage API", - // schema: "../blobstorage/docs/swagger.yaml", - // }, { base: "api-reference/bridge-relayer", label: "Bridge Relayer API", @@ -39,11 +33,6 @@ export default defineConfig({ label: "Event Indexer API", schema: "../eventindexer/docs/swagger.yaml", }, - { - base: "api-reference/prover-server", - label: "Prover Server API", - schema: "../taiko-client/docs/swagger.yaml", - }, ]), ], components: { @@ -52,7 +41,8 @@ export default defineConfig({ }, title: "Docs", editLink: { - baseUrl: "https://github.com/taikoxyz/docs/edit/main/", + baseUrl: + "https://github.com/taikoxyz/taiko-mono/edit/main/packages/docs-site", }, customCss: ["./src/styles/custom.css"], logo: { @@ -78,34 +68,39 @@ export default defineConfig({ label: "Core Concepts", items: [ { label: "What is Taiko?", link: "/core-concepts/what-is-taiko/" }, - { - label: "Based sequencing", - link: "/core-concepts/based-sequencing/", - }, { label: "Contestable rollups (BCR)", - link: "/core-concepts/contestable-rollups/", + link: "/core-concepts/contestable-rollup/", }, { label: "Booster rollups (BBR)", link: "/core-concepts/booster-rollups/", }, { label: "Multi-proofs", link: "/core-concepts/multi-proofs/" }, - { label: "Block states", link: "/core-concepts/block-states" }, - { - label: "Taiko nodes", - link: "/core-concepts/taiko-nodes/", - }, - { - label: "Bridging", - link: "/core-concepts/bridging/", - }, { label: "Inception layers", link: "/core-concepts/inception-layers/", }, ], }, + { + label: "Taiko Protocol", + items: [ + { + label: "Codebase Analysis", + collapsed: true, + items: [ + {label: "TaikoL1 Contract", link: "/taiko-protocol/codebase-analysis/taikol1-contract"}, + {label: "TaikoL2 Contract", link: "/taiko-protocol/codebase-analysis/taikol2-contract"}, + {label: "SGXVerifier Contract", link: "/taiko-protocol/codebase-analysis/sgxverifier-contract"}, + ], + }, + { label: "Block states", link: "/taiko-protocol/block-states" }, + { label: "Bridging", link: "/taiko-protocol/bridging" }, + { label: "Economics", link: "/taiko-protocol/economics" }, + { label: "Taiko nodes", link: "/taiko-protocol/taiko-nodes" }, + ] + }, { label: "Guides", items: [ @@ -117,8 +112,14 @@ export default defineConfig({ label: "Set up your wallet", link: "/guides/app-developers/set-up-your-wallet/", }, - { label: "Receive tokens", link: "/guides/app-developers/receive-tokens/" }, - { label: "Bridge tokens", link: "/guides/app-developers/bridge-tokens/" }, + { + label: "Receive tokens", + link: "/guides/app-developers/receive-tokens/", + }, + { + label: "Bridge tokens", + link: "/guides/app-developers/bridge-tokens/", + }, { label: "Deploy a contract", link: "/guides/app-developers/deploy-a-contract/", @@ -155,13 +156,17 @@ export default defineConfig({ link: "/guides/node-operators/run-a-testnet-taiko-node-from-source/", }, { - label: "Run a Taiko testnet proposer", + label: "Run a Taiko proposer", link: "/guides/node-operators/enable-a-proposer/", }, { - label: "Run a Taiko testnet prover", + label: "Run a Taiko prover", link: "/guides/node-operators/enable-a-prover/", }, + { + label: "Deploy a ProverSet", + link: "guides/node-operators/deploy-a-proverset/", + }, { label: "Node troubleshooting", link: "/guides/node-operators/node-troubleshooting/", @@ -189,6 +194,10 @@ export default defineConfig({ label: "Network configuration", link: "/network-reference/network-configuration", }, + { + label: "Software releases", + link: "/network-reference/software-releases-and-deployments", + }, { label: "RPC configuration", link: "/network-reference/rpc-configuration", diff --git a/packages/docs-site/package.json b/packages/docs-site/package.json index 158b67160fd..511b09a51c3 100644 --- a/packages/docs-site/package.json +++ b/packages/docs-site/package.json @@ -1,7 +1,7 @@ { "name": "docs-site", "type": "module", - "version": "1.9.0", + "version": "1.21.2", "scripts": { "dev": "astro dev", "start": "astro dev", @@ -10,9 +10,9 @@ "astro": "astro" }, "dependencies": { - "@astrojs/check": "^0.6.0", - "@astrojs/starlight": "^0.22.2", - "astro": "^4.8.3", + "@astrojs/check": "^0.8.0", + "@astrojs/starlight": "^0.25.0", + "astro": "^4.11.5", "astro-og-canvas": "^0.5.0", "canvaskit-wasm": "^0.39.1", "sharp": "^0.33.3", diff --git a/packages/docs-site/src/assets/content/docs/core-concepts/bridging-process-message.excalidraw.png b/packages/docs-site/src/assets/content/docs/core-concepts/bridging-process-message.excalidraw.png deleted file mode 100644 index 791c444d134..00000000000 Binary files a/packages/docs-site/src/assets/content/docs/core-concepts/bridging-process-message.excalidraw.png and /dev/null differ diff --git a/packages/docs-site/src/assets/content/docs/core-concepts/bridging-send-message.excalidraw.png b/packages/docs-site/src/assets/content/docs/core-concepts/bridging-send-message.excalidraw.png deleted file mode 100644 index c53a592c5cf..00000000000 Binary files a/packages/docs-site/src/assets/content/docs/core-concepts/bridging-send-message.excalidraw.png and /dev/null differ diff --git a/packages/docs-site/src/assets/content/docs/core-concepts/contestable.png b/packages/docs-site/src/assets/content/docs/core-concepts/contestable.png new file mode 100644 index 00000000000..00aebddb7d3 Binary files /dev/null and b/packages/docs-site/src/assets/content/docs/core-concepts/contestable.png differ diff --git a/packages/docs-site/src/assets/content/docs/core-concepts/proof-tiers.png b/packages/docs-site/src/assets/content/docs/core-concepts/proof-tiers.png new file mode 100644 index 00000000000..a0e5974dd0f Binary files /dev/null and b/packages/docs-site/src/assets/content/docs/core-concepts/proof-tiers.png differ diff --git a/packages/docs-site/src/assets/content/docs/guides/verify-as-proxy.webp b/packages/docs-site/src/assets/content/docs/guides/verify-as-proxy.webp new file mode 100644 index 00000000000..35c03e48345 Binary files /dev/null and b/packages/docs-site/src/assets/content/docs/guides/verify-as-proxy.webp differ diff --git a/packages/docs-site/src/assets/content/docs/network-reference/proof-tier-config-hekla.webp b/packages/docs-site/src/assets/content/docs/network-reference/proof-tier-config-hekla.webp new file mode 100644 index 00000000000..4a8a0bc7fd2 Binary files /dev/null and b/packages/docs-site/src/assets/content/docs/network-reference/proof-tier-config-hekla.webp differ diff --git a/packages/docs-site/src/assets/content/docs/network-reference/proof-tier-config-mn.webp b/packages/docs-site/src/assets/content/docs/network-reference/proof-tier-config-mn.webp index ac172ffb6be..74c2fcd1e4b 100644 Binary files a/packages/docs-site/src/assets/content/docs/network-reference/proof-tier-config-mn.webp and b/packages/docs-site/src/assets/content/docs/network-reference/proof-tier-config-mn.webp differ diff --git a/packages/docs-site/src/assets/content/docs/network-reference/proof-tier-config.webp b/packages/docs-site/src/assets/content/docs/network-reference/proof-tier-config.webp deleted file mode 100644 index 68d286310e5..00000000000 Binary files a/packages/docs-site/src/assets/content/docs/network-reference/proof-tier-config.webp and /dev/null differ diff --git a/packages/docs-site/src/assets/content/docs/taiko-protocol/based-economics.png b/packages/docs-site/src/assets/content/docs/taiko-protocol/based-economics.png new file mode 100644 index 00000000000..e714579a595 Binary files /dev/null and b/packages/docs-site/src/assets/content/docs/taiko-protocol/based-economics.png differ diff --git a/packages/docs-site/src/assets/content/docs/taiko-protocol/bridging-dest-chain.webp b/packages/docs-site/src/assets/content/docs/taiko-protocol/bridging-dest-chain.webp new file mode 100644 index 00000000000..dadf102e481 Binary files /dev/null and b/packages/docs-site/src/assets/content/docs/taiko-protocol/bridging-dest-chain.webp differ diff --git a/packages/docs-site/src/assets/content/docs/taiko-protocol/bridging-source-chain.webp b/packages/docs-site/src/assets/content/docs/taiko-protocol/bridging-source-chain.webp new file mode 100644 index 00000000000..9143e89a5f8 Binary files /dev/null and b/packages/docs-site/src/assets/content/docs/taiko-protocol/bridging-source-chain.webp differ diff --git a/packages/docs-site/src/assets/content/docs/core-concepts/proposed.png b/packages/docs-site/src/assets/content/docs/taiko-protocol/proposed.png similarity index 100% rename from packages/docs-site/src/assets/content/docs/core-concepts/proposed.png rename to packages/docs-site/src/assets/content/docs/taiko-protocol/proposed.png diff --git a/packages/docs-site/src/assets/content/docs/core-concepts/proved.png b/packages/docs-site/src/assets/content/docs/taiko-protocol/proved.png similarity index 100% rename from packages/docs-site/src/assets/content/docs/core-concepts/proved.png rename to packages/docs-site/src/assets/content/docs/taiko-protocol/proved.png diff --git a/packages/docs-site/src/assets/content/docs/core-concepts/taiko-nodes.png b/packages/docs-site/src/assets/content/docs/taiko-protocol/taiko-nodes.png similarity index 100% rename from packages/docs-site/src/assets/content/docs/core-concepts/taiko-nodes.png rename to packages/docs-site/src/assets/content/docs/taiko-protocol/taiko-nodes.png diff --git a/packages/docs-site/src/assets/content/docs/core-concepts/verified.png b/packages/docs-site/src/assets/content/docs/taiko-protocol/verified.png similarity index 100% rename from packages/docs-site/src/assets/content/docs/core-concepts/verified.png rename to packages/docs-site/src/assets/content/docs/taiko-protocol/verified.png diff --git a/packages/docs-site/src/content/config.ts b/packages/docs-site/src/content/config.ts index 35f8545faaf..96cdce61ff5 100644 --- a/packages/docs-site/src/content/config.ts +++ b/packages/docs-site/src/content/config.ts @@ -8,6 +8,9 @@ export const collections = { description: z .string() .max(160, { message: "Must be 160 characters or less." }).optional(), + // banner: z.object({ content: z.string() }).default({ + // content: '', + // }), }), }), }), diff --git a/packages/docs-site/src/content/docs/core-concepts/based-sequencing.md b/packages/docs-site/src/content/docs/core-concepts/based-rollup.md similarity index 58% rename from packages/docs-site/src/content/docs/core-concepts/based-sequencing.md rename to packages/docs-site/src/content/docs/core-concepts/based-rollup.md index b431f95bc77..acf2b80380f 100644 --- a/packages/docs-site/src/content/docs/core-concepts/based-sequencing.md +++ b/packages/docs-site/src/content/docs/core-concepts/based-rollup.md @@ -1,8 +1,8 @@ --- -title: Based sequencing -description: Core concept page for "Based sequencing". +title: Based rollup +description: Core concept page for based rollups. --- One of Taiko's major differentiators from other rollups is that it is a **based rollup**. That is, it's sequencing is driven by the base L1. On Taiko, there is **no centralized sequencer**. The sequencer role instead falls on the shoulders of the Ethereum L1 validator. -Check out plenty of great resources on based sequencing in our [Learning resources](/resources/learning-resources)! +Check out plenty of great resources on **based sequencing** in our [Learning resources](/resources/learning-resources)! diff --git a/packages/docs-site/src/content/docs/core-concepts/contestable-rollup.md b/packages/docs-site/src/content/docs/core-concepts/contestable-rollup.md new file mode 100644 index 00000000000..18f71b74922 --- /dev/null +++ b/packages/docs-site/src/content/docs/core-concepts/contestable-rollup.md @@ -0,0 +1,27 @@ +--- +title: Contestable rollups +description: Core concept page for "Contestable rollups". +--- + +## Based Contestable Rollup + +In based rollups, block building is permissionless. But permissionless block building comes at a cost, in the form of permissionless attacks to the chain if there is a vulnerability in the Taiko codebase. Centralized rollups can tolerate these risks due to their centralized nature, but Taiko cannot as fully decentralized design. Therefore, Taiko needs a robust multi-proof structure to prevent malicious behaviours. + +Taiko is configured as a based contestable rollup (BCR). This means that there is a hierarchy of proofs in Taiko and it's permissionless to contest all tiers of proofs. Currently Taiko has SGX as a TEE proof, RiscO(RiscZero) and SP1(Succinct) as ZK proofs, Guardian (multi-sig) proof which is owned by Taiko Labs. Guardian proof is not contestable and we plan to phase out after the next protocol hard fork. + +![Proof Tiers](~/assets/content/docs/core-concepts/proof-tiers.png) + +**Scenario:** + +The process begins when a proposer submits a new block, followed by a tier-1 (SGX) prover who submits a proof with a TAIKO bond. During the 4 hour cooldown period, anyone can contest this proof by posting their own bond, as demonstrated by Cindy. + +The system then supports two possible scenarios: If a higher-tier proof confirms the original proof was correct, the original prover receives back their bond plus a reward, while the contester loses their bond. Conversely, if the higher-tier proof shows the original was wrong, the contester receives back their bond plus a reward, and the original prover loses their stake. + +If the contester wins: The contester receives their contestation bond back plus 1/4 of the original prover's validity bond. The new prover receives 1/4 of the original prover's validity bond as a proving fee. The remaining 1/2 goes to the DAO treasury. + +If the original prover wins: The original prover reclaims their validity bond and receives 1/4 of the contestation bond as a reward. The new prover (who may be the original prover) earns 1/4 of the contestation bond. The remaining 1/2 goes to the DAO treasury. + +![BCR Workflow](~/assets/content/docs/core-concepts/contestable.png) + + +Check out our blog post on the [Based Contestable Rollup (BCR): A configurable, multi-proof rollup design](https://taiko.mirror.xyz/Z4I5ZhreGkyfdaL5I9P0Rj0DNX4zaWFmcws-0CVMJ2A). diff --git a/packages/docs-site/src/content/docs/core-concepts/contestable-rollups.md b/packages/docs-site/src/content/docs/core-concepts/contestable-rollups.md deleted file mode 100644 index 4d1c9275e61..00000000000 --- a/packages/docs-site/src/content/docs/core-concepts/contestable-rollups.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -title: Contestable rollups -description: Core concept page for "Contestable rollups". ---- - -The current Taiko mainnet and testnet are both configured as a based contestable rollup (BCR). - -Check out our blog post on the [Based Contestable Rollup (BCR): A configurable, multi-proof rollup design](https://taiko.mirror.xyz/Z4I5ZhreGkyfdaL5I9P0Rj0DNX4zaWFmcws-0CVMJ2A). diff --git a/packages/docs-site/src/content/docs/core-concepts/inception-layers.md b/packages/docs-site/src/content/docs/core-concepts/inception-layers.md index 4b7b3d99fbf..ebcc602c304 100644 --- a/packages/docs-site/src/content/docs/core-concepts/inception-layers.md +++ b/packages/docs-site/src/content/docs/core-concepts/inception-layers.md @@ -17,4 +17,4 @@ Further, Ethereum-equivalence across L2s, L3s, and beyond means inheriting some ![Inception layers diagram](~/assets/content/docs/core-concepts/inception-layers-diagram.png) -For more information on how Taiko's message passing works see the concept page on [Bridging](/core-concepts/bridging). +For more information on how Taiko's message passing works see the concept page on [Bridging](/taiko-protocol/bridging). diff --git a/packages/docs-site/src/content/docs/core-concepts/multi-proofs.md b/packages/docs-site/src/content/docs/core-concepts/multi-proofs.md index a0f79048ebe..84be7328275 100644 --- a/packages/docs-site/src/content/docs/core-concepts/multi-proofs.md +++ b/packages/docs-site/src/content/docs/core-concepts/multi-proofs.md @@ -21,19 +21,23 @@ We already know what a proposed block is (must pass at least the block-level int Now, a block can be proved, but also further "verified". What's the difference? A block is proved if it has a valid proof which proves a state transition from one state (parent block) to another (current block). However, blocks are proven in parallel by the decentralized provers. So while a block can prove a parent block transitions to the current block, we don't know if the parent block itself has been proven. As you can see, for a block to be "verified", it needs to prove the valid state transition to the current block, but the parent also needs to be verified. We assume that the genesis block (which has no parent), is verified. So all the children blocks from genesis to the current block need to have proofs of their state transition for the current block to be "verified". +A recent change in our protocol means we verify blocks in batches. Previously, so long as a block was verified it's `verifiedTransitionId` in block data would be non-zero; now that we verify in batches, only the last block in a batch will have a non-zero `verifiedTransitionId`. + +i.e. It is now possible for a block to be verified, and have `verifiedTransitionId` == 0. + For the visual learners here is a visualization of the three stages (proposed -> proved -> verified) **Proposed:** -![proposed](~/assets/content/docs/core-concepts/proposed.png) +![proposed](~/assets/content/docs/taiko-protocol/proposed.png) **Proved:** -![proved](~/assets/content/docs/core-concepts/proved.png) +![proved](~/assets/content/docs/taiko-protocol/proved.png) **Verified:** -![verified](~/assets/content/docs/core-concepts/verified.png) +![verified](~/assets/content/docs/taiko-protocol/verified.png) ## Off chain prover market (PBS style) diff --git a/packages/docs-site/src/content/docs/core-concepts/what-is-taiko.md b/packages/docs-site/src/content/docs/core-concepts/what-is-taiko.md index 2380604a9c6..41ca6aa6ddd 100644 --- a/packages/docs-site/src/content/docs/core-concepts/what-is-taiko.md +++ b/packages/docs-site/src/content/docs/core-concepts/what-is-taiko.md @@ -5,9 +5,9 @@ description: Core concept page for "What is Taiko?". Ethereum is too expensive. We believe in Ethereum's core properties (e.g., censorship-resistant, permissionless, secure). We also believe that rollups should **extend** (not augment) these properties. -Taiko is a [based rollup](/core-concepts/based-sequencing) which makes Ethereum cheaper while maintaining its properties: +Taiko is a [based rollup](/core-concepts/based-rollup) which makes Ethereum cheaper while maintaining its properties: -- [Based contestable rollup](/core-concepts/contestable-rollups): A configurable rollup to reduce transaction fees on Ethereum. +- [Based contestable rollup](/core-concepts/contestable-rollup): A configurable rollup to reduce transaction fees on Ethereum. - [Based booster rollup](/core-concepts/booster-rollups): An innovative approach to **native L1 scaling**. Taiko is a **highly configurable, fully open source, permissionless (based), Ethereum-equivalent rollup**. @@ -32,7 +32,7 @@ It can be easily configured as a fully ZK rollup, optimistic rollup, or anything ### Non-critical infrastructure :::note -Anyone can run these components, not just Taiko Labs. Yes you can sequence blocks on Taiko, host your own bridge using our [signal service](/core-concepts/bridging#the-signal-service), etc. +Anyone can run these components, not just Taiko Labs. Yes you can sequence blocks on Taiko, host your own bridge using our [signal service](/taiko-protocol/bridging#the-signal-service), etc. ::: #### Frontends diff --git a/packages/docs-site/src/content/docs/guides/node-operators/deploy-a-proverset.mdx b/packages/docs-site/src/content/docs/guides/node-operators/deploy-a-proverset.mdx new file mode 100644 index 00000000000..dabf6a58b97 --- /dev/null +++ b/packages/docs-site/src/content/docs/guides/node-operators/deploy-a-proverset.mdx @@ -0,0 +1,185 @@ +--- +title: Deploy a ProverSet +description: This guide will you help you deploy a ProverSet which enables you to use 2 separate EOAs to propose and prove blocks with the new protocol design. +--- + +import { Aside, Card, Steps, Tabs, TabItem } from '@astrojs/starlight/components' + +The recent protocol upgrade now requires that the address of the prover and proposer are the same. This can be achieved by simply using the same private keys to run the proposer and prover software, +but this is not recommended as it can cause nonce issues. + +This guide outlines how to achieve this with separate EOAs running prover and proposer through the ProverSet smart contract. + + + +## Prerequisites + +- You have TAIKO or TTKOh depending on which network you are proving on +- You have enough ETH or holesky ETH for gas fees + +## Deploying a ProverSet + + + +1. **Clone the Taiko monorepo** + + The [Taiko monorepo](https://github.com/taikoxyz/taiko-mono) contains the scripts for deploying your `ProverSet`. Checkout the latest stable release. (Use `protocol-v1.9.0` for Hekla!) + + + + ```bash + git clone https://github.com/taikoxyz/taiko-mono.git + cd taiko-mono/packages/protocol + git checkout tags/{release-tag} + ``` + + + ```sh + git clone https://github.com/taikoxyz/taiko-mono.git + cd taiko-mono/packages/protocol && git config core.autocrlf false + git checkout tags/{release-tag} + ``` + + + +2. **Deploy the ProverSet** + + Set `ROLLUP_ADDRESS_MANAGER` to the address of the RollupAddressManager contract on the network you are deploying to. You can find these values in our network reference docs. + + Set `PROVER_SET_ADMIN` to the address of your **prover** EOA. You will be able to withdraw TAIKO/TTKOh from the contract to this address. + + Run the `DeployProverSet.s.sol` script with your **proposer's private key**. You can find the script [here](https://github.com/taikoxyz/taiko-mono/blob/main/packages/protocol/script/layer1/DeployProverSet.s.sol). + + ```bash + ROLLUP_ADDRESS_MANAGER={ADDRESS} PROVER_SET_ADMIN={ADDRESS} forge script --chain-id {CHAIN_ID} --rpc-url {YOUR_RPC_URL} --private-key {PRIVATE_KEY} --broadcast script/DeployProverSet.s.sol:DeployProverSet + ``` + + + + The script should print your implementation and proxy address with the log: + + ``` + Deployed ProverSet impl at address: 0x.... + Deployed ProverSet proxy at address: 0x.... + ``` + + Use proxy address for the following steps. + +3. **Verify the contract as a proxy on Etherscan** + + Navigate to the `proxyAddress` logged as output of the script above in Etherscan. + + In the `Contract` tab, you can find the `More options` section as follows: + + ![Verify as Proxy](~/assets/content/docs/guides/verify-as-proxy.webp) + + Select the `Is this a proxy?` option and follow the instructions. This should verify the contract as a proxy to your `ProverSet` implementation. + +4. **Write to the Proxy to `enableProver()`** + + If the above step was completed correctly, you should be able to see the `Write as Proxy` option in the `Contract` tab. + + Connect to Etherscan with the EOA you used to deploy the ProverSet and send two `enableProver()` transactions, enabling **both** your `proposer` and `prover` EOAs as provers. Set `isProver` as `true` for both transactions. You can set these as `false` if you want to disable these provers in the future. + + + + This will allow both EOAs to send transactions to your ProverSet implementation which will act as a proxy to TaikoL1. + +5. **Configure the contract as necessary** + + Manage the contract's allowance with [approveAllowance()](https://github.com/taikoxyz/taiko-mono/blob/protocol-v1.9.0/packages/protocol/contracts/layer1/provers/ProverSet.sol#L64). TaikoL1's contract allowance is by default set to `UINT256.MAX` in the init function. + +6. **Deposit your tokens and run your proposer + prover as usual!** + + If you've followed the instructions, send your TAIKO/TTKOh to the ProverSet proxy and begin running your prover and proposer as usual. If you've set up your allowance properly, there should be no need to use the `depositBond` function, as it deposits TTKOh from the ProverSet to TaikoL1. + + + + Ensure that you have set up the EOAs correctly to avoid problems. + + + + + +## Upgrading a ProverSet + +If you've already deployed a ProverSet but would like to upgrade it through the Proxy, this guide is for you! + + + +1. **Find your existing Proxy's address** + + This will be necessary for the following step. + +2. **Navigate to the taiko monorepo and checkout the release version of ProverSet you want to deploy.** + + ```bash + cd taiko-mono/packages/protocol + git checkout tags/{PROTOCOL_RELEASE_TAG} + ``` + +3. **Deploy the ProverSet contract from your prover EOA and call upgradeTo with the new implementation address on your original Proxy** + + Execute the following command, filling in the values in the curly braces appropriately. + + ```bash + forge create --private-key {YOUR_PRIVATE_KEY} --chain-id {CHAIN_ID} --rpc-url {YOUR_RPC_URL} contracts/layer1/provers/ProverSet.sol:ProverSet + ``` + + + + You should see logs like these: + + ``` + Deployer: 0x3e5c... + Deployed to: 0x9186... + Transaction hash: 0xf0ebb... + ``` + + Then, proceed to your original Proxy contract; access the `Write to Proxy` tab and scroll to the `upgradeTo()` function. + + Connect your EOA that you originally deployed the ProverSet from and call the function with your new `Deployed to:` address. + + Once the transaction succeeds, you have successfully upgraded your ProverSet. + + + +## FAQ + +### Where is my TTKOh/TAIKO? + + If you've managed to propose and prove some blocks, it's likely you're wondering where your tokens went after. + + It's not missing, it's just been deposited as bond in the TaikoL1 contract; you can withdraw it to the ProverSet contract with [withdrawBond()](https://github.com/taikoxyz/taiko-mono/blob/protocol-v1.9.0/packages/protocol/contracts/layer1/provers/ProverSet.sol#L136) manually. + +### How do I verify my ProverSet contract? + + Once you've deployed the contract, you should be able to find the contract address. You can do this on Etherscan manually or with forge! + + You will need foundry installed, and an Etherscan API key; you can get this by signing in on `etherscan.io` and navigating to your profile's `API Keys`. + Then, navigate to the `protocol` package in `taiko-mono` and execute the following command substituting values in curly braces as necessary. + + ```bash + forge verify-contract --chain-id {CHAIN_ID} --etherscan-api-key {GET-API-KEY-FROM-ETHERSCAN-FIRST} {PUT-CONTRACT-ADDRESS-HERE} contracts/layer1/provers/ProverSet.sol:ProverSet + ``` + + You should get a success message and your contract should now show up as verified on Etherscan! + + + If you run into any problems, please visit the [node troubleshooting page](/guides/node-operators/node-troubleshooting) for help. + If you run into an error that isn't yet listed, please reach out in our [Discord](https://discord.com/invite/taikoxyz)! + diff --git a/packages/docs-site/src/content/docs/guides/node-operators/enable-a-proposer.mdx b/packages/docs-site/src/content/docs/guides/node-operators/enable-a-proposer.mdx index c60f377f6a4..08352468df2 100644 --- a/packages/docs-site/src/content/docs/guides/node-operators/enable-a-proposer.mdx +++ b/packages/docs-site/src/content/docs/guides/node-operators/enable-a-proposer.mdx @@ -3,36 +3,42 @@ title: Enable a proposer description: This guide will you help you enable your Taiko node as a proposer. --- -import { Aside, Steps } from '@astrojs/starlight/components'; +import { Aside, Card, CardGrid, Steps} from '@astrojs/starlight/components'; + + ## Prerequisites - You are already running a Taiko node [with Docker](/guides/node-operators/run-a-taiko-node-with-docker) or [from source](/guides/node-operators/build-a-taiko-node-from-source). -- You are able to receive prover bonds from your own prover or from [a community marketplace](https://dojonode.xyz/tatami). - -{/*## Using `stn` - -1. Install [stn](https://github.com/d1onys1us/stn) if you haven't already. -2. Execute `stn config proposer` in your terminal and walk through the steps.*/} +- You have [set up a prover](/guides/node-operators/enable-a-prover) or [configured a ProverSet](/guides/node-operators/deploy-a-proverset) with a third-party partner. ## Using simple-taiko-node - Next, you will set the L1 node endpoints. If you are running a local L1 node, you cannot reference the L1 endpoints as `http://127.0.0.1:8545`, `ws://127.0.0.1:8546` and `http://127.0.0.1:5052` because that is local to inside the simple-taiko-node Docker networking. Instead you can try: diff --git a/packages/docs-site/src/content/docs/guides/node-operators/run-a-testnet-taiko-node-from-source.mdx b/packages/docs-site/src/content/docs/guides/node-operators/run-a-testnet-taiko-node-from-source.mdx index cdc07766408..489a027e929 100644 --- a/packages/docs-site/src/content/docs/guides/node-operators/run-a-testnet-taiko-node-from-source.mdx +++ b/packages/docs-site/src/content/docs/guides/node-operators/run-a-testnet-taiko-node-from-source.mdx @@ -5,7 +5,7 @@ description: This guide will help you start up a Testnet (Hekla) Taiko node. import { Aside, Card, Steps, Tabs, TabItem } from "@astrojs/starlight/components"; -This tutorial explains how to run an Taiko node for our testnet Hekla from source code. +This tutorial explains how to run a Taiko node for our testnet Hekla from source code. ## Building the Source Code diff --git a/packages/docs-site/src/content/docs/network-reference/differences-from-ethereum.md b/packages/docs-site/src/content/docs/network-reference/differences-from-ethereum.md index a5e5cec40e5..24065643beb 100644 --- a/packages/docs-site/src/content/docs/network-reference/differences-from-ethereum.md +++ b/packages/docs-site/src/content/docs/network-reference/differences-from-ethereum.md @@ -3,8 +3,8 @@ title: Differences from Ethereum description: Network reference page describing the differences between Taiko and Ethereum. --- -| Parameter | Ethereum (Holesky) | Taiko (Hekla) | Reasoning | -| ---------------- | ------------------ | ----------------------------- | ------------------------------------------------------------------------------------------------------------------------ | -| Block gas limit | 30,000,000 gas | 15,000,000 gas | Circuit constraint limitation in PSE circuits; addressed by zkVM, chunking, etc. | -| Block gas target | 15,000,000 gas | 60,000,000 gas (per L1 block) | Assuming an L2 block time of ~3 seconds will have a ~15,000,000 gas target. | -| Block time | 12 seconds | ~3 seconds | Allow for greater throughput on L2 as it does not threaten the node decentralization the same as on the consensus layer. | +| Parameter | Ethereum | Taiko | Reasoning | +| ---------------- | -------------- | ----------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Block gas limit | 30,000,000 gas | 240,000,000 gas | Currently in Raiko, memory use scales linearly with block size both in the host (witness generation) and in the guest (memory use inside the VM/program being proven) so we set the block gas limit to 240m gas. | +| Block gas target | 15,000,000 gas | 60,000,000 gas (per L1 block) | Assuming an L2 block time of ~3 seconds will have a ~15,000,000 gas target. | +| Block time | 12 seconds | 12-20~ seconds | Currently, we are the only block proposer. Once we move to decentralized proposing / achieve preconfirmations, this value is expected to decrease. | diff --git a/packages/docs-site/src/content/docs/network-reference/mainnet-addresses.md b/packages/docs-site/src/content/docs/network-reference/mainnet-addresses.md index 8c6d4df8e0b..e98c0898edd 100644 --- a/packages/docs-site/src/content/docs/network-reference/mainnet-addresses.md +++ b/packages/docs-site/src/content/docs/network-reference/mainnet-addresses.md @@ -15,14 +15,15 @@ description: Network reference page describing various important addresses on Ta | ERC20Vault | `0x996282cA11E5DEb6B5D122CC3B9A1FcAAD4415Ab` | v20.based.taiko.eth | | ERC721Vault | `0x0b470dd3A0e1C41228856Fb319649E7c08f419Aa` | v721.based.taiko.eth | | ERC1155Vault | `0xaf145913EA4a56BE22E120ED9C24589659881702` | v1155.based.taiko.eth | -| BridgedERC20 | `0xcc5d488073FA918cBbd73B9A523F3858C4de7372` | N/A | -| BridgedERC721 | `0xc4096E9ff1526Bd1840B65e9f45695135aC12De7` | N/A | -| BridgedERC1155 | `0x39E4C1214e733639d059979079A151911e42791d` | N/A | +| BridgedERC20 | `0x65666141a541423606365123Ed280AB16a09A2e1` | N/A | +| BridgedERC721 | `0xC3310905E2BC9Cfb198695B75EF3e5B69C6A1Bf7` | N/A | +| BridgedERC1155 | `0x3c90963cFBa436400B0F9C46Aa9224cB379c2c40` | N/A | | Contract Name (Rollup-Specific) | Address | ENS | | ------------------------------- | -------------------------------------------- | -------------------------- | | TaikoL1 | `0x06a9Ab27c7e2255df1815E6CC0168d7755Feb19a` | based.taiko.eth | | RollupAddressManager | `0x579f40D0BE111b823962043702cabe6Aaa290780` | ram.based.taiko.eth | +| TierRouter | `0x8a4c692F12d3a9750E744A4CE24a1d351bE52E66` | N/A | | GuardianProver | `0xE3D777143Ea25A6E031d1e921F396750885f43aC` | guardians.based.taiko.eth | | GuardianProverMinority | `0x579A8d63a2Db646284CBFE31FE5082c9989E985c` | guardians1.based.taiko.eth | | AssignmentHook | `0x537a2f0D3a5879b41BCb5A2afE2EA5c4961796F6` | N/A | @@ -33,7 +34,7 @@ description: Network reference page describing various important addresses on Ta | P256Verifier | `0x11A9ebA17EbF92b40fcf9a640Ebbc47Db6fBeab0` | N/A | | SigVerifyLib | `0x47bB416ee947fE4a4b655011aF7d6E3A1B80E6e9` | N/A | | TokenUnlock | `0x035AFfC82612de31E9Db2259B9482D0Dd53B7819` | N/A | -| ProverSet | `0x34f2B21107AfE3584949c184A1E6236FFDAC4f6F` | N/A | +| ProverSet | `0x3022Ed0346CCE0c08268c8ad081458AfD95E8763` | N/A | | labprover | `0x68d30f47F19c07bCCEf4Ac7FAE2Dc12FCa3e0dC9` | labprover.taiko.eth | | labcontester | `0xa01d464ca3982DAa97B19fa7F8a232eB11A9DDb3` | labcontester.taiko.eth | @@ -74,10 +75,10 @@ The owner has the ability to upgrade the contracts. | Name | Address | | ------------ | -------------------------------------------- | -| Proposer #1 | `0x000000633b68f5d8d3a86593ebb815b4663bcbe0` | -| Prover #1 | `0x000000629FBCf27A347d1AEbA658435230D74a5f` | +| Proposer #1 | `0x000000629FBCf27A347d1AEbA658435230D74a5f` | +| Prover #1 | `0x000000633b68f5d8d3a86593ebb815b4663bcbe0` | | Contester #1 | `0x00000027F51a57E7FcBC4b481d15fcE5BE68b30B` | ## Taiko Labs' bootnode addresses -Find the latest bootnodes here in [simple-taiko-node](https://github.com/taikoxyz/simple-taiko-node/blob/mainnet/.env.sample). +Find the latest bootnodes here in [simple-taiko-node](https://github.com/taikoxyz/simple-taiko-node/blob/v1.7.0/.env.sample). diff --git a/packages/docs-site/src/content/docs/network-reference/network-configuration.md b/packages/docs-site/src/content/docs/network-reference/network-configuration.md deleted file mode 100644 index 9dda021de32..00000000000 --- a/packages/docs-site/src/content/docs/network-reference/network-configuration.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -title: Network configuration -description: The network configuration page describes many of the configuration details of the network. ---- - -## Tier configuration (Hekla) - -You can view the full `TierProviderV1` tier configuration [here](https://github.com/taikoxyz/taiko-mono/blob/main/packages/protocol/contracts/L1/tiers/TierProviderV1.sol): - -Here is a diagram of the proof tier configuration: - -![alpha 7 proof tiers](~/assets/content/docs/network-reference/proof-tier-config.webp) - -## Network configuration (Hekla) - -You can view the full network configuration by visiting the TaikoL1 contract on Etherscan [here](https://holesky.etherscan.io/address/0x79C9109b764609df928d16fC4a91e9081F7e87DB#readProxyContract). Then connect your wallet, and select "Read as Proxy". You can then see the config details for the network. - -## Tier configuration (Mainnet) - -![mainnet proof tiers](~/assets/content/docs/network-reference/proof-tier-config-mn.webp) - -## Network configuration (Mainnet) - -You can view the full network configuration by visiting the TaikoL1 contract on Etherscan [here](https://etherscan.io/address/0x06a9Ab27c7e2255df1815E6CC0168d7755Feb19a#readProxyContract). Then connect your wallet, and select "Read as Proxy". You can then see the config details for the network. diff --git a/packages/docs-site/src/content/docs/network-reference/network-configuration.mdx b/packages/docs-site/src/content/docs/network-reference/network-configuration.mdx new file mode 100644 index 00000000000..e615b575524 --- /dev/null +++ b/packages/docs-site/src/content/docs/network-reference/network-configuration.mdx @@ -0,0 +1,47 @@ +--- +title: Network configuration +description: The network configuration page describes many of the configuration details of the network. +--- + +import {Aside} from '@astrojs/starlight/components'; + +## Cooldown Window, Proving Window and Bonds + +This segment lists the cooldown windows and proving windows for every tier of proof in the Taiko protocol. + +The cooldown window describes how long after the proof has been provided that the block is verified. + +The proving window describes how long a prover has to provide a proof for a block after they have been assigned the block (i.e. a block has been proposed with them as the assigned prover). + +You can find all the corresponding values below in the [deployed TierProviderBase contract](https://etherscan.io/address/0x394E30d83d020469a1F8b16E89D7fD5FdB1935b0#code#F3#L1)! + +| Tier | Cooldown Window | Proving Window | Bond | +| ----------------- | --------------- | -------------- | --------- | +| Optimistic | 1440 minutes | 255 minutes | 75 TAIKO | +| SGX | 240 minutes | 300 minutes | 150 TAIKO | +| ZK | 240 minutes | 420 minutes | 225 TAIKO | +| SGX & ZK | 240 minutes | 420 minutes | 225 TAIKO | +| Guardian Minority | 240 minutes | 240 minutes | 225 TAIKO | +| Guardian | 240 minutes | 240 minutes | 0 TAIKO | + +## Tier configuration (Mainnet) + +You can view the full `MainnetTierRouter` tier configuration [here](https://etherscan.io/address/0x8a4c692F12d3a9750E744A4CE24a1d351bE52E66#code): + +![mainnet proof tiers](~/assets/content/docs/network-reference/proof-tier-config-mn.webp) + +If the function of the bonds is not clear to you, please find out more [here](/resources/terminology#bonding-related). + +## Network configuration (Mainnet) + +You can view the full network configuration by visiting the TaikoL1 contract on Etherscan [here](https://etherscan.io/address/0x06a9Ab27c7e2255df1815E6CC0168d7755Feb19a#readProxyContract). Then connect your wallet, and select "Read as Proxy". You can then see the config details for the network. + +## Tier configuration (Hekla) + +You can view the full post ontake fork `HeklaTierRouter` tier configuration [here](https://holesky.etherscan.io/address/0x6A666F2C56a6559dB0BD8866Bd0c0dDB9ec03c66#code): + +![hekla proof tiers](~/assets/content/docs/network-reference/proof-tier-config-hekla.webp) + +## Network configuration (Hekla) + +You can view the full network configuration by visiting the TaikoL1 contract on Etherscan [here](https://holesky.etherscan.io/address/0x79C9109b764609df928d16fC4a91e9081F7e87DB#readProxyContract). Then connect your wallet, and select "Read as Proxy". You can then see the config details for the network. diff --git a/packages/docs-site/src/content/docs/network-reference/rpc-configuration.md b/packages/docs-site/src/content/docs/network-reference/rpc-configuration.mdx similarity index 86% rename from packages/docs-site/src/content/docs/network-reference/rpc-configuration.md rename to packages/docs-site/src/content/docs/network-reference/rpc-configuration.mdx index c6bfcaca7f5..aff22a13f3e 100644 --- a/packages/docs-site/src/content/docs/network-reference/rpc-configuration.md +++ b/packages/docs-site/src/content/docs/network-reference/rpc-configuration.mdx @@ -3,8 +3,15 @@ title: RPC configuration description: Network reference page describing Ethereum and Taiko RPC configurations. --- +import {Aside} from '@astrojs/starlight/components'; + + Below are the RPCs maintained by Taiko Labs. You can find additional RPCs at [chainlist](https://chainlist.org). + + ## Ethereum (Holesky) | Name | Value | diff --git a/packages/docs-site/src/content/docs/network-reference/software-releases-and-deployments.md b/packages/docs-site/src/content/docs/network-reference/software-releases-and-deployments.md new file mode 100644 index 00000000000..f07a85dd624 --- /dev/null +++ b/packages/docs-site/src/content/docs/network-reference/software-releases-and-deployments.md @@ -0,0 +1,26 @@ +--- +title: Software releases and deployments +description: Reference page showing the latest Taiko software versions and deployments. +--- + +## Software releases + +It is **highly recommended** you use the latest software. You can find the latest versions here: + +| Package | Release notes | +| :------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| [protocol](https://github.com/taikoxyz/taiko-mono/tree/main/packages/protocol) | [![Github Release](https://img.shields.io/github/v/release/taikoxyz/taiko-mono?filter=protocol*&label=)](https://github.com/taikoxyz/taiko-mono/blob/main/packages/protocol/CHANGELOG.md) | +| [taiko-geth](https://github.com/taikoxyz/taiko-geth) | [![GitHub Release](https://img.shields.io/github/v/release/taikoxyz/taiko-geth?label=)](https://github.com/taikoxyz/taiko-geth/blob/taiko/CHANGELOG.md) | +| [taiko-client](https://github.com/taikoxyz/taiko-mono/tree/main/packages/taiko-client) | [![GitHub Release](https://img.shields.io/github/v/release/taikoxyz/taiko-mono?filter=taiko-client*&label=)](https://github.com/taikoxyz/taiko-mono/blob/main/packages/taiko-client/CHANGELOG.md) | +| [simple-taiko-node](https://github.com/taikoxyz/simple-taiko-node/tree/main) | [![Github Release](https://img.shields.io/github/v/release/taikoxyz/simple-taiko-node?label=)](https://github.com/taikoxyz/simple-taiko-node/blob/main/CHANGELOG.md) | +| [raiko](https://github.com/taikoxyz/raiko/tree/main) | [![Github Release](https://img.shields.io/github/v/release/taikoxyz/raiko?label=)](https://github.com/taikoxyz/raiko/blob/main/CHANGELOG.md) | + +## Mainnet deployment logs + +You can find the contract addresses of the latest smart contract deployments of the Taiko Protocol on Ethereum [here](https://github.com/taikoxyz/taiko-mono/blob/main/packages/protocol/deployments/mainnet-contract-logs-L1.md). + +You can find the smart contract addresses of L2 contracts for the Taiko Protocol on Mainnet [here](https://github.com/taikoxyz/taiko-mono/blob/main/packages/protocol/deployments/mainnet-contract-logs-L2.md). + +## Hekla deployment logs + +You can find the all L1 and L2 contract addresses of the latest smart contract deployments of the Taiko Protocol [here](https://github.com/taikoxyz/taiko-mono/blob/main/packages/protocol/deployments/hekla-contract-logs.md). diff --git a/packages/docs-site/src/content/docs/network-reference/testnet-addresses.md b/packages/docs-site/src/content/docs/network-reference/testnet-addresses.md index 6763a2cd3f5..6eaad487371 100644 --- a/packages/docs-site/src/content/docs/network-reference/testnet-addresses.md +++ b/packages/docs-site/src/content/docs/network-reference/testnet-addresses.md @@ -14,16 +14,28 @@ description: Network reference page describing various important addresses on Ta | ERC20Vault | `0x2259662ed5dE0E09943Abe701bc5f5a108eABBAa` | | ERC721Vault | `0x046b82D9010b534c716742BE98ac3FEf3f2EC99f` | | ERC1155Vault | `0x9Ae5945Ab34f6182F75E16B73e037421F341fEe3` | +| BridgedERC20 | `0xe3661857941E4A711fa6b4Fc080bC5c5948a70f1` | +| BridgedERC721 | `0xbD832CAf65c8a73609EFd62E2A4FCB1292e4c9C1` | +| BridgedERC1155 | `0x0B5B063dc89EcfCedf8aF570d82598F72a7dfF35` | | Contract Name (Rollup-Specific) | Address | | ------------------------------- | -------------------------------------------- | | TaikoL1 | `0x79C9109b764609df928d16fC4a91e9081F7e87DB` | | RollupAddressManager | `0x1F027871F286Cf4B7F898B21298E7B3e090a8403` | | GuardianProver | `0x92F195a8702da2104aE8E3E10779176E7C35d6BC` | +| GuardianMinority | `0x31d4d27da5c299d4b6CE19c869B8891C0002795d` | | AssignmentHook | `0x9e640a6aadf4f664CF467B795c31332f44AcBe6c` | +| TierProvider | `0x9AaBba3Ae6D4aC3F5487608Da81006454e7933d3` | +| TierRouter | `0x98d4FaD098526c4582063FA588C5e96229270366` | | SgxVerifier | `0x532EFBf6D62720D0B2a2Bb9d11066E8588cAE6D9` | +| Groth16Verifier | `0x5fd84014c62D5ea28D4533D5B1B48Ca44e571057` | +| Risc0Verifier | `0x4fEd801C5a876D4289e869cbEfA1E1A448b10714` | +| SP1Verifier | `0xFbE49f777E0078b3Fa0bae6de4794c88d6EA6DDD` | +| PlonkVerifier | `0xfb2d02219D065eBF3Aa8d2D1a1C52b1868EE7384` | | AutomataDcapAttestation | `0xC6cD3878Fc56F2b2BaB0769C580fc230A95e1398` | | PemCertChainLib | `0x08d7865e7F534d743Aba5874A9AD04bcB223a92E` | +| ProverSet | `0xD3f681bD6B49887A48cC9C9953720903967E9DC0` | +| ProverSetContester | `0x335103c4fa2F55451975082136F1478eCFeB84B9` | ## Taiko L2 (Hekla) contracts @@ -60,4 +72,4 @@ The owner has the ability to upgrade the contracts. ## Taiko Labs' bootnode addresses -Find the latest bootnodes here in [simple-taiko-node](https://github.com/taikoxyz/simple-taiko-node/blob/main/.env.sample). +Find the latest bootnodes here in [simple-taiko-node](https://github.com/taikoxyz/simple-taiko-node/blob/v1.7.0/.env.sample.hekla). diff --git a/packages/docs-site/src/content/docs/resources/developer-tools.mdx b/packages/docs-site/src/content/docs/resources/developer-tools.mdx index 69663291505..1e400817277 100644 --- a/packages/docs-site/src/content/docs/resources/developer-tools.mdx +++ b/packages/docs-site/src/content/docs/resources/developer-tools.mdx @@ -11,7 +11,12 @@ import { LinkCard, CardGrid } from "@astrojs/starlight/components"; + @@ -21,6 +26,41 @@ import { LinkCard, CardGrid } from "@astrojs/starlight/components"; + + +## Oracles + + + + + + +## Node Providers + + + + + +## Indexers + + + diff --git a/packages/docs-site/src/content/docs/resources/terminology.mdx b/packages/docs-site/src/content/docs/resources/terminology.mdx new file mode 100644 index 00000000000..3347e76ea8d --- /dev/null +++ b/packages/docs-site/src/content/docs/resources/terminology.mdx @@ -0,0 +1,22 @@ +--- +title: Terminology +description: Resource page detailing relevant rollup terminology that might need explaining. +--- + +This page is dedicated to explaining some terms relevant to the protocol that might be a bit hard to understand! + +## Bonding-related + +- **Liveness Bond**: The bond provided by a block's assigned prover, serving as a commitment to initially prove the first transition and to provide post-contest proofs within the corresponding proving window. + +- **Validity Bond**: The bond provided by the actual prover of a proof, signifying their commitment that the proof is indeed correct and that they are ready to withstand a contest. + +- **Contest Bond**: The bond provided by the contester. + +In layman's terms, the above terms relate to the protocol in the following manner: + +- A **Liveness Bond** is deposited when a prover gets assigned a block to prove (`proposeBlock` tx); when the block proof is provided within the proofWindow it gets debited to the prover. + +- A **Validity Bond** is deposited when a block proof is submitted (`proveBlock` tx), and the prover is ready to withstand a contest. If the proof gets verified (i.e. is not contested and is valid), the bond is returned to the prover. The prover can be different from the original assigned prover if the proof is outside the proofWindow, in which case the new prover has to provide the full validityBond amount. + +- A **Contest Bond** is someone putting up a bond to say that a block should be contested and a higher tier should handle this case. If the higher tier proof is incorrect then contestBond is forfeited. diff --git a/packages/docs-site/src/content/docs/start-here/contributing.md b/packages/docs-site/src/content/docs/start-here/contributing.md index 385d2898455..13d7d5b57b5 100644 --- a/packages/docs-site/src/content/docs/start-here/contributing.md +++ b/packages/docs-site/src/content/docs/start-here/contributing.md @@ -39,7 +39,7 @@ Before we can consider your contributions, please have a look at the following r - Any contribution must follow the standards documented in this file. - The scope must be larger than a simple rename, or typo fix. We kindly request that small, incremental updates be combined into more substantial pull requests. This approach will streamline our development and ensure focus on core improvements. -Specify the scope of your change with a [conventional commit](https://www.conventionalcommits.org/en/v1.0.0/) in the PR title (for example, `feat(scope): description of feature`). This will be squashed and merged into the `main` branch. You can find the full list of allowed scopes [here](https://github.com/taikoxyz/taiko-mono/blob/main/.github/workflows/validate-pr-title.yml#L28). +Specify the scope of your change with a [conventional commit](https://www.conventionalcommits.org/en/v1.0.0/) in the PR title (for example, `feat(scope): description of feature`). This will be squashed and merged into the `main` branch. You can find the full list of allowed scopes [here](https://github.com/taikoxyz/taiko-mono/blob/main/.github/workflows/repo--validate-pr-title.yml#L23). Because we squash all of the changes into a single commit, please try to keep the PR limited to the scope specified in the commit message. This commit message will end up in the automated changelog by checking which packages are affected by the commit. diff --git a/packages/docs-site/src/content/docs/core-concepts/block-states.mdx b/packages/docs-site/src/content/docs/taiko-protocol/block-states.mdx similarity index 74% rename from packages/docs-site/src/content/docs/core-concepts/block-states.mdx rename to packages/docs-site/src/content/docs/taiko-protocol/block-states.mdx index 1655172bd07..8ba4d50cefc 100644 --- a/packages/docs-site/src/content/docs/core-concepts/block-states.mdx +++ b/packages/docs-site/src/content/docs/taiko-protocol/block-states.mdx @@ -8,7 +8,7 @@ import { Code } from '@astrojs/starlight/components'; ## How can you determine when a Taiko block is `Safe` or `Finalized`? The `Safe` block state on Taiko is analogous to a `Safe` block state on Ethereum. -Every Taiko L2 block has a corresponding Ethereum L1 block as it's origin that can be queried through a [`taiko-geth API`](https://github.com/taikoxyz/taiko-geth/blob/caf87509fe0f53fc937a3f5cc26325a380a1744e/eth/taiko_api_backend.go#L50). +Every Taiko L2 block has a corresponding Ethereum L1 block as it's origin that can be queried through a [`taiko-geth API`](https://github.com/taikoxyz/taiko-geth/blob/v1.8.0/eth/taiko_api_backend.go#L50). When that Ethereum L1 block can be considered `Safe`, the corresponding Taiko L2 block can be considered to have reached the same block state. The `Finalized` block state is referred to as the [`Verified` block state](/core-concepts/multi-proofs#verified-blocks-and-parallel-proving) on Taiko. @@ -18,20 +18,20 @@ A Taiko block is `Finalized`/`Verified` when every state transition from genesis The above Taiko block with blockID `0x19a3c` would thus be considered `Safe` if the L1 block with the blockHash `0x419f..` reaches a `Safe` state. -The Taiko block with blockID `019a3c` would be `Finalized`/`Verified` if every state transition from genesis to the current block has a valid proof. +The Taiko block with blockID `0x19a3c` would be `Finalized`/`Verified` if every state transition from genesis to the current block has a valid proof. diff --git a/packages/docs-site/src/content/docs/core-concepts/bridging.md b/packages/docs-site/src/content/docs/taiko-protocol/bridging.md similarity index 61% rename from packages/docs-site/src/content/docs/core-concepts/bridging.md rename to packages/docs-site/src/content/docs/taiko-protocol/bridging.md index b6619138a2c..fe5926a6d67 100644 --- a/packages/docs-site/src/content/docs/core-concepts/bridging.md +++ b/packages/docs-site/src/content/docs/taiko-protocol/bridging.md @@ -19,10 +19,15 @@ The Taiko protocol's design, specifically its Ethereum-equivalence enables secur Taiko deploys two smart contracts which store the hashes of the other chain: -- TaikoL1 stores a blockNumber->blockHash mapping `l2Hashes` (deployed on Ethereum) -- TaikoL2 stores a blockNumber->blockHash mapping `l1Hashes` (deployed on Taiko) +- TaikoL1 stores the L2 world state root on L1 (deployed on Ethereum) +- TaikoL2 stores the L1 world state root on L2 (deployed on Taiko) -Every time an L2 block is created on Taiko, the hash of the enclosing block on L1 is stored in the TaikoL2 contract. And every time an L1 block is verified, the L2 hash is stored in the TaikoL1 contract (only the latest one, if multiple ones are verified at once). +Every time an L2 block is created on Taiko, the world state root of the enclosing block on L1 is stored in the [TaikoL2](https://github.com/taikoxyz/taiko-mono/blob/protocol-v1.9.0/packages/protocol/contracts/layer2/based/TaikoL2.sol#L145) contract using the `anchor` transaction. To ensure validity, it is part of the (previously the zk circuits, now SGX and ZK) proof data submitted with each block, so no fake L1 world state root can be synchronized to L2." + +The L2 world state root is stored in the TaikoL1 contract using the `syncChainData` function call in +[`LibVerifying`](https://github.com/taikoxyz/taiko-mono/blob/protocol-v1.9.0/packages/protocol/contracts/layer1/based/LibVerifying.sol#L179). + +Taiko by default synchronizes the world state roots cross-chain with the above mechanism. ### Merkle trees enable verifying values exist on the other chain @@ -30,26 +35,26 @@ Merkle trees are a data storage structure that allows a lot of data to be finger - The merkle root, this is the single "fingerprint" hash of the merkle tree - The value, this is the value we are checking is inside the merkle root -- A list of intermediate sibling hashes, these are the hashes that enable the verifier to re-calculate the merkle root +- A list of intermediate sibling hashes (sometimes called paths or proofs), these are the hashes that enable the verifier to re-calculate the merkle root -You can get the latest known merkle root stored on the destination chain by calling `getCrossChainBlockHash(0)` on the TaikoL1/TaikoL2 contract. You can get the value / message to verify and the sibling hashes for that latest known merkle root by asking for it with the standard RPC call `eth_getProof` on the "source chain". Then you just need to send them to be verified against that latest known block hash that is stored in a list on the "destination chain". +The `signalForChainData` function is used to store and retrieve chain data in the `SignalService` contract. This is a multi-purpose storage function, we can sync the state root or signal service storage roots as needed for each chain respectively. -A verifier will take the value (a leaf in the merkle tree) and the sibling hashes to re-calculate the merkle root. If the calculated merkle root matches the one that is stored in the destination chain's list of block hashes (the block hashes of the source chain), then we have proved that the message was sent on the source chain, assuming the source chain block hashes stored on the destination chain were correct. +A verifier will take the value (a leaf in the merkle tree) and the sibling hashes to re-calculate the merkle root. If the calculated merkle root matches the one that is stored in the destination chain’s list of block hashes (the block hashes of the source chain), then we have proved that the message was sent on the source chain, assuming the source chain block hashes stored on the destination chain were correct. ## The signal service -Taiko's signal service is a smart contract available on both L1 and L2, available for any dapp developer to use. It's what uses the previously mentioned merkle proofs to provide a service for secure cross-chain messaging. +Taiko's signal service is a smart contract available on both L1 and L2, for any dapp developer to use. It uses the previously mentioned merkle proofs to provide a service for secure cross-chain messaging. -You can store signals and check if a signal was sent from an address. It also exposes one more important function: `isSignalReceived`. +You can store signals and check if a signal was sent from an address. It also exposes an important function: `verifySignalReceived`. What does this function do? The first thing to understand is that the Taiko protocol maintains two important contracts: - `TaikoL1` - `TaikoL2` -These contracts both keep track of the block hashes on the **other chain**. So TaikoL1, which is deployed on Ethereum, has access to the latest block hashes on Taiko. And TaikoL2, which is deployed on Taiko, has access to the latest block hashes on Ethereum. +These contracts both keep track of the world state roots on the **other chain**. So TaikoL1, which is deployed on Ethereum, has access to the latest world state roots on Taiko. And TaikoL2, which is deployed on Taiko, has access to the latest world state roots on Ethereum. -So, `isSignalReceived` can prove on either chain that you sent a signal to the Signal Service on the other chain. A user or dapp can call `eth_getProof`(https://eips.ethereum.org/EIPS/eip-1186) which generates a merkle proof. +So, `verifySignalReceived` can prove on either chain that you sent a signal to the Signal Service on the other chain. A user or dapp can call `eth_getProof` which generates a merkle proof. You need to provide `eth_getProof` with: @@ -65,7 +70,7 @@ Let's walk through an example: 1. First, we can send a message on some source chain, and store it on the signal service. 2. Next, we call `eth_getProof`, which will give us a proof that we did indeed send a message on the source chain. -3. Finally, we call `isSignalReceived` on the destination chain's SignalService which essentially just verifies the merkle proof. `isSignalReceived` will look up the block hash you are asserting you had stored a message on the source chain (where you originally sent the message), and with the sibling hashes inside the merkle proof it will rebuild the merkle root, which verifies the signal was included in that merkle root—meaning it was sent. +3. Finally, we call `verifySignalReceived` on the destination chain's SignalService which essentially just verifies the merkle proof. `verifySignalReceived` will look up the block hash you are asserting you had stored a message on the source chain (where you originally sent the message), and with the sibling hashes inside the merkle proof it will rebuild the merkle root, which verifies the signal was included in that merkle root—meaning it was sent. And boom! We have sent a cross-chain message. If this is confusing, you can also find a simple dApp that was built during one of our workshops to demonstrate the fundamentals. You can find it [here](https://github.com/taikoxyz/MessageServiceShowCaseApp). @@ -75,8 +80,8 @@ The bridge is a set of smart contracts and a frontend web app that allow you to First, here is a flowchart of how our bridge dapp implementation works, which uses the signal service: -![bridging send message flowchart](~/assets/content/docs/core-concepts/bridging-send-message.excalidraw.png) \ -![bridging process message flowchart](~/assets/content/docs/core-concepts/bridging-process-message.excalidraw.png) +![bridging send message flowchart](~/assets/content/docs/taiko-protocol/bridging-source-chain.webp) +![bridging process message flowchart](~/assets/content/docs/taiko-protocol/bridging-dest-chain.webp) ### How does Ether bridging work? @@ -89,7 +94,7 @@ Taiko's bridge utilizes the Signal Service we described. Here is the general use With the current design there are 2 ways to bridge `Ether`: 1. `Ether` only case: The user interacts directly with the Bridge contract by calling `sendMessage` -2. `ERC-XXX` + `Ether` + case: The user interacts with the `ERCXXXVault` (ERC20, ERC721, ERC1155) because he/she wants to bridge over some tokens, but in case he/she fills the `message.value` field, also `Ether` will be bridged +2. `ERC-XXX` + `Ether` case: The user interacts with the `ERCXXXVault` (ERC20, ERC721, ERC1155) because they want to bridge over some tokens, but if they fill the `message.value` field, `Ether` will also be bridged ### How does ERC-20 (or ERC-721, ERC-1155) bridging work? @@ -100,18 +105,15 @@ ERC-20 tokens originate from a canonical chain. To send a token and bridge it to Here are the overall steps for transferring canonical ERC-20 (the overall process is identical for ERC-721, and ERC-1155 token types as well!) from a source chain to the destination chain: 1. A contract for the ERC-20 (or ERC-721, ERC-1155) must first be deployed on the destination chain (will be done automatically by the ERC20Vault if not already deployed) - 2. Call `sendToken` on the source chain ERC20Vault, this will **transfer** the amount by using the `safeTransferFrom` function on the canonical ERC-20 contract, on the source chain, to the ERC20Vault. - -3. The vault contract (via the Bridge) sends a message to the Signal Service (on the source chain), this message will contain some metadata related to the bridge request, but most importantly it includes the calldata for the `receiveToken` method. - -4. Process the message on the destination chain by submitting a merkle proof (generated from the source chain), proving that a message is included in the state of the source chain Signal Service. After verifying this occurred and doing some checks, it will attempt to invoke the `receiveToken` method encoded in the message. This will **mint** ERC-20 (or ERC-721, ERC-1155) on the BridgedERC20 contract to the `to` address on the destination chain! +3. The vault contract (via the Bridge) sends a message to the Signal Service (on the source chain), this message will contain some metadata related to the bridge request, but most importantly it includes the calldata for the `onMessageInvocation()` method. +4. Process the message on the destination chain by submitting a merkle proof (generated from the source chain), proving that a message is included in the state of the source chain Signal Service. After verifying this occurred and doing some checks, it will attempt to invoke the `onMessageInvocation()` method encoded in the message. This will **mint** ERC-20 (or ERC-721, ERC-1155) on the BridgedERC20 contract to the `to` address on the destination chain! #### Bridge from destination chain back to the canonical chain -Okay now let's do the reverse, how do we transfer a bridged token from a source chain to the destination chain? (Destination chain in this case is the canonical chain, where the original token lives.) +Okay now let’s do the reverse, how do we transfer a bridged token from a source chain to the destination chain? (Destination chain in this case is the canonical chain, where the original token lives.) 1. A contract for the ERC-20 (or ERC-721, ERC-1155) already exists on the canonical chain, so no need to deploy a new one. 2. Call `sendToken` on the source chain token vault contract, this will **burn** the ERC-20 on the BridgedERC20 contract. -3. The vault contract (via the Bridge) sends a message to the Signal Service (on the source chain), this message will contain some metadata related to the bridge request, but most importantly it includes the calldata for the `receiveToken` method. -4. Process the message on the destination chain by submitting a merkle proof (generated from the source chain), proving that a message is included in the state of the source chain Signal Service. After verifying this occurred and doing some checks, it will attempt to invoke the `receiveToken` method encoded in this message. This will **transfer** the amount from the destination chain TokenVault to the `to` address on the destination chain. +3. The vault contract (via the Bridge) sends a message to the Signal Service (on the source chain), this message will contain some metadata related to the bridge request, but most importantly it includes the calldata for the `onMessageInvocation()` method. +4. Process the message on the destination chain by submitting a merkle proof (generated from the source chain), proving that a message is included in the state of the source chain SignalService. After verifying this occurred and doing some checks, it will attempt to invoke the `onMessageInvocation()` method encoded in this message. This will transfer the amount from the destination chain TokenVault to the `to` address on the destination chain. diff --git a/packages/docs-site/src/content/docs/taiko-protocol/codebase-analysis/sgxverifier-contract.md b/packages/docs-site/src/content/docs/taiko-protocol/codebase-analysis/sgxverifier-contract.md new file mode 100644 index 00000000000..3f9c832fb4d --- /dev/null +++ b/packages/docs-site/src/content/docs/taiko-protocol/codebase-analysis/sgxverifier-contract.md @@ -0,0 +1,108 @@ +--- +title: SGXVerifier +description: Taiko protocol page for "SGXVerifier.sol". +--- + +The `SGXVerifier` smart contract implements SGX (Software Guard Extensions) signature proof verification on-chain. This verification ensures integrity and security of rollup state transitions by validating SGX-generated signatures. It also enables management and tracking of SGX instances through registration and replacement. + +--- + +## Core Purpose + +1. **Instance Registry**: + +- Each SGX instance is uniquely identified by its Ethereum address (derived from an ECDSA public-private key pair generated in the SGX enclave). +- The registry ensures: + - Only valid instances are allowed. + - Instances are valid for a predefined duration (`INSTANCE_EXPIRY`). + +2. **Instance Lifecycle**: + +- **Addition**: SGX instances can be added via the `addInstances` function or the `registerInstance` method (following attestation verification). +- **Replacement**: Old SGX instances can be replaced with new ones to maintain security. +- **Deletion**: Instances can be removed using the `deleteInstances` function. + +--- + +## Key Functions + +### `addInstances` + +- **Purpose**: Adds new SGX instances to the registry. +- **Input**: + - `_instances`: Array of Ethereum addresses corresponding to the SGX instances. +- **Output**: Returns an array of assigned instance IDs. +- **Access Control**: Restricted to the owner. + +--- + +### `deleteInstances` + +- **Purpose**: Removes SGX instances from the registry. +- **Input**: + - `_ids`: Array of instance IDs to be removed. +- **Access Control**: Restricted to the owner or the `SGX_WATCHDOG` role. + +--- + +### `registerInstance` + +- **Purpose**: Registers an SGX instance by verifying its attestation off-chain and adding it to the registry. +- **Input**: + - `_attestation`: Parsed attestation quote containing SGX enclave report details. +- **Output**: Returns the assigned instance ID. +- **Access Control**: Open to external calls. + +--- + +### `verifyProof` + +- **Purpose**: Validates the SGX signature proof for a single block state transition. +- **Input**: + - `_ctx`: Context of the proof. + - `_tran`: Transition data. + - `_proof`: SGX signature proof. +- **Mechanism**: + - Validates the instance ID and signature. + - Ensures the SGX instance is valid and replaces it if needed. + +--- + +### `verifyBatchProof` + +- **Purpose**: Validates SGX signature proofs for multiple block state transitions in a batch. +- **Input**: + - `_ctxs`: Array of contexts for the batch. + - `_proof`: SGX batch signature proof. +- **Mechanism**: + - Verifies the signature against public inputs for all blocks. + - Replaces the SGX instance if necessary. + +--- + +## Key Events + +1. **`InstanceAdded`**: + +- Emitted when a new SGX instance is added or an old instance is replaced. +- Parameters: + - `id`: ID of the SGX instance. + - `instance`: Address of the new SGX instance. + - `replaced`: Address of the replaced instance (if any). + - `validSince`: Timestamp indicating when the instance became valid. + +2. **`InstanceDeleted`**: + +- Emitted when an SGX instance is removed from the registry. +- Parameters: + - `id`: ID of the SGX instance. + - `instance`: Address of the removed instance. + +--- + +## Constants + +1. **`INSTANCE_EXPIRY`**: Duration (365 days) for which an SGX instance remains valid. +2. **`INSTANCE_VALIDITY_DELAY`**: Delay before an SGX instance becomes valid after registration. + +--- diff --git a/packages/docs-site/src/content/docs/taiko-protocol/codebase-analysis/taikol1-contract.md b/packages/docs-site/src/content/docs/taiko-protocol/codebase-analysis/taikol1-contract.md new file mode 100644 index 00000000000..3f1472fdbee --- /dev/null +++ b/packages/docs-site/src/content/docs/taiko-protocol/codebase-analysis/taikol1-contract.md @@ -0,0 +1,143 @@ +--- +title: TaikoL1 +description: Taiko protocol page for "TaikoL1.sol". +--- + +[TaikoL1](https://github.com/taikoxyz/taiko-mono/blob/main/packages/protocol/contracts/layer1/based/TaikoL1.sol) is a smart contract that serves as the **base layer** of the Taiko protocol. It provides functionalities for **proposing, proving, and verifying blocks**, enabling the rollup's consensus and state transitions. The contract also supports **bond deposits and withdrawals** and manages state synchronization between L1 and L2. + +--- + +## Core Purpose + +1. **Block Lifecycle Management** + Manages the proposal, proof, and verification of Taiko blocks, ensuring consistent state transitions. + +2. **Cross-Layer Synchronization** + Ensures the synchronization of states between Layer 1 (L1) and Layer 2 (L2). + +3. **Bond Management** + Handles the deposit and withdrawal of bonds to incentivize proposers and ensure accountability. + +4. **Base Layer Scalability** + Enables the deployment on L2 to create L3 rollups, expanding Taiko's scalability. + +--- + +## Key Functions + +### `proposeBlockV2` + +- **Purpose:** + Proposes a single block for inclusion in the rollup. + +- **Parameters:** + + - `_params`: Encoded block parameters. + - `_txList`: Transactions to include in the block. + +- **Returns:** + `TaikoData.BlockMetadataV2` containing metadata of the proposed block. + +--- + +### `proposeBlocksV2` + +- **Purpose:** + Proposes multiple blocks in batch. + +- **Parameters:** + + - `_paramsArr`: Array of encoded block parameters. + - `_txListArr`: Arrays of transactions for each block. + +- **Returns:** + Array of `TaikoData.BlockMetadataV2` for all proposed blocks. + +--- + +### `proveBlock` + +- **Purpose:** + Proves the validity of a single block. + +- **Parameters:** + - `_blockId`: ID of the block to be proven. + - `_input`: Encoded proof data. + +--- + +### `proveBlocks` + +- **Purpose:** + Proves multiple blocks in a single call. + +- **Parameters:** + - `_blockIds`: IDs of the blocks to be proven. + - `_inputs`: Proofs for each block. + - `_batchProof`: Batch proof covering all blocks. + +--- + +### `verifyBlocks` + +- **Purpose:** + Verifies a batch of blocks after proofs are submitted. + +- **Parameters:** + - `_maxBlocksToVerify`: Maximum number of blocks to verify. + +--- + +### `depositBond` + +- **Purpose:** + Deposits a bond required for proposing blocks. + +- **Parameters:** + - `_amount`: Amount of bond to deposit. + +--- + +### `withdrawBond` + +- **Purpose:** + Withdraws bond deposits after successful proposals. + +- **Parameters:** + - `_amount`: Amount of bond to withdraw. + +--- + +### `getLastVerifiedBlock` + +- **Purpose:** + Retrieves the details of the most recently verified block. + +- **Returns:** + - `blockId_`: ID of the last verified block. + - `blockHash_`: Block hash of the verified block. + - `stateRoot_`: State root of the verified block. + - `verifiedAt_`: Timestamp when the block was verified. + +--- + +## Key Events + +1. **`StateVariablesUpdated`** + Signals updates to the state variables. + +--- + +## Important Data Structures + +1. **`state`**: + Tracks the rollup state, including blocks, bonds, and configurations. + +2. **`__gap`**: + Reserved storage for future upgrades. + +--- + +## Design Highlights + +--- diff --git a/packages/docs-site/src/content/docs/taiko-protocol/codebase-analysis/taikol2-contract.md b/packages/docs-site/src/content/docs/taiko-protocol/codebase-analysis/taikol2-contract.md new file mode 100644 index 00000000000..cac45ed4a95 --- /dev/null +++ b/packages/docs-site/src/content/docs/taiko-protocol/codebase-analysis/taikol2-contract.md @@ -0,0 +1,116 @@ +--- +title: TaikoL2 +description: Taiko protocol page for "TaikoL2.sol". +--- + +[TaikoL2](https://github.com/taikoxyz/taiko-mono/blob/main/packages/protocol/contracts/layer2/based/TaikoL2.sol) is a smart contract that handles cross-layer message verification and manages EIP-1559 gas pricing for Taiko operations. It is used to anchor the latest L1 block details to L2 for cross-layer communication, manage EIP-1559 parameters for gas pricing, and store verified L1 block information. + +--- + +## Core Purpose + +1. **Anchor:** + Due to Taiko's **based rollup** nature, each L2 block requires anchoring to the latest L1 block details. The first transaction of every block must perform this anchor, or all calls will revert with `L2_PUBLIC_INPUT_HASH_MISMATCH`. + +2. **Gas Pricing:** + The contract calculates **EIP-1559 base fee** and updates gas parameters dynamically for optimal gas pricing using key inputs such as `_parentGasUsed` and `_baseFeeConfig`. + +3. **State Synchronization:** + The contract ensures L2 remains in sync with L1 by storing verified block information and updating state data like block hashes and timestamps. + +4. **Bridging Support:** + It plays a crucial role in **L1-L2 bridging**, anchoring state roots to enable secure and efficient communication between layers. For more, visit the [Bridging page](/taiko-protocol/bridging). + +--- + +## Key Functions + +### `anchorV2` + +- **Purpose:** + Anchors the latest L1 block details to L2, enabling **cross-layer message verification**. + +- **Parameters:** + + - `_anchorBlockId`: The L1 block ID to anchor. + - `_anchorStateRoot`: State root of the specified L1 block. + - `_parentGasUsed`: Gas usage in the parent block. + - `_baseFeeConfig`: Configuration for base fee calculation. + +- **Mechanism:** + Verifies and updates the `publicInputHash`, calculates the base fee and gas excess using `getBasefeeV2`, and synchronizes chain data. + +--- + +### `getBasefeeV2` + +- **Purpose:** + Computes the **EIP-1559 base fee** and updates gas parameters like **gas excess** and **gas target**. + +- **Parameters:** + + - `_parentGasUsed`: Gas used in the parent block. + - `_baseFeeConfig`: Configuration for EIP-1559 calculations. + +- **Returns:** + + - `basefee_`: Calculated base fee per gas. + - `newGasTarget_`: Updated gas target. + - `newGasExcess_`: Updated gas excess. + +- **Technical Details:** + Uses `LibEIP1559.calc1559BaseFee` and `LibEIP1559.adjustExcess` for precise gas pricing dynamics. + +--- + +### `getBlockHash` + +- **Purpose:** + Fetches the block hash for a specified block ID. + +- **Technical Note:** + If the block ID is too old (not in the last 256 blocks), it uses an internal mapping (`_blockhashes`) to retrieve stored hashes. + +--- + +## Key Events + +1. **`Anchored`** + Emitted when L1 block details are successfully anchored to L2. + + **Parameters:** + + - `parentHash`: Hash of the parent block. + - `parentGasExcess`: Gas excess for base fee calculation. +

+ +2. **`EIP1559Update`** + Emitted when gas parameters (e.g., target, excess, base fee) are updated. + + **Parameters:** + + - `oldGasTarget`: Previous gas target. + - `newGasTarget`: Updated gas target. + - `oldGasExcess`: Previous gas excess. + - `newGasExcess`: Updated gas excess. + - `basefee`: Calculated base fee. + +--- + +## Important Data Structures + +### State Variables + +1. **`publicInputHash`**: + Validates the integrity of public inputs for block verification. + +2. **`parentGasExcess`**: + Tracks gas usage exceeding the target for dynamic base fee adjustment. + +3. **`lastSyncedBlock`**: + Stores the ID of the most recent L1 block synced with L2. + +4. **`l1ChainId`**: + Chain ID of the base layer (L1). + +--- diff --git a/packages/docs-site/src/content/docs/taiko-protocol/economics.md b/packages/docs-site/src/content/docs/taiko-protocol/economics.md new file mode 100644 index 00000000000..6f9187386c9 --- /dev/null +++ b/packages/docs-site/src/content/docs/taiko-protocol/economics.md @@ -0,0 +1,15 @@ +--- +title: Economics +description: Core concept page for "Economics". +--- + + +## taiko-economics + +Thanks to its based and multi-proof structure, Taiko has a unique economic cycle. + +This diagram illustrates Taiko's fee distribution mechanism. When users submit transactions on Taiko L2, they pay fees that are split into two components: a priority tip and a base fee. The priority tip goes to the L2 block proposer, who builds and proposes new blocks. The base fee is split between Taiko DAO Treasury (25%) and the L2 block proposer (75%). L2 block proposers have to pay two fees: L1 fee to the TaikoL1 contract on Ethereum to call `proposeBlock` function and a prover fee to the block prover. Block provers incur proof generation costs while proving the correctness of proposed blocks. + +For the current amount of the validity/contest bond on mainnet, please see [network configuration](/network-reference/network-configuration) page. + +![Economics](~/assets/content/docs/taiko-protocol/based-economics.png) diff --git a/packages/docs-site/src/content/docs/core-concepts/taiko-nodes.md b/packages/docs-site/src/content/docs/taiko-protocol/taiko-nodes.md similarity index 93% rename from packages/docs-site/src/content/docs/core-concepts/taiko-nodes.md rename to packages/docs-site/src/content/docs/taiko-protocol/taiko-nodes.md index 6a36216f0ec..1db1eb3b197 100644 --- a/packages/docs-site/src/content/docs/core-concepts/taiko-nodes.md +++ b/packages/docs-site/src/content/docs/taiko-protocol/taiko-nodes.md @@ -10,7 +10,7 @@ Taiko nodes are minimally modified Ethereum [execution clients](https://ethereum You can think of it like an Ethereum mainnet node, except replacing the consensus client with `taiko-client`. `taiko-client` then drives `taiko-geth` over the [Engine API](https://github.com/ethereum/execution-apis/tree/main/src/engine). This is a modular design that allows easily plugging in other execution clients. -![Taiko nodes diagram](~/assets/content/docs/core-concepts/taiko-nodes.png) +![Taiko nodes diagram](~/assets/content/docs/taiko-protocol/taiko-nodes.png) ## taiko-geth @@ -22,7 +22,7 @@ You can see all the changes made in the `taiko-geth` fork at [geth.taiko.xyz](ht ## taiko-client -The [taiko-client](https://github.com/taikoxyz/taiko-client) software replaces the consensus client piece of an Ethereum mainnet node. It connects to `taiko-geth`, and the compiled binary includes three sub-commands: +The [taiko-client](https://github.com/taikoxyz/taiko-mono/tree/main/packages/taiko-client) software replaces the consensus client piece of an Ethereum mainnet node. It connects to `taiko-geth`, and the compiled binary includes three sub-commands: ### `driver` @@ -89,7 +89,7 @@ If the proposed block has a **valid** or **invalid** `txList`, the `prover`: ## Taiko Node API -Using a Taiko node should feel the same as using any other L1 node, because we essentially re-use the L1 client and make a few backwards-compatible modifications. You can first read about the architecture of Taiko nodes [here](/core-concepts/taiko-nodes). +Using a Taiko node should feel the same as using any other L1 node, because we essentially re-use the L1 client and make a few backwards-compatible modifications. ### Differences from a Geth client diff --git a/packages/eventindexer/.gitignore b/packages/eventindexer/.gitignore index 9dbce223f63..af36bba2839 100644 --- a/packages/eventindexer/.gitignore +++ b/packages/eventindexer/.gitignore @@ -41,7 +41,8 @@ terraform.rc .idea -Bridge.json -TaikoL2.json -IHeaderSync.json -AssignmentHook.json \ No newline at end of file +# Ignore binary file +eventindexer + +# Ignore abi files +contracts/**/*.json diff --git a/packages/eventindexer/.golangci.yml b/packages/eventindexer/.golangci.yml index 4d07f36217d..f8f1767ce33 100644 --- a/packages/eventindexer/.golangci.yml +++ b/packages/eventindexer/.golangci.yml @@ -9,7 +9,7 @@ # ], output: - format: colored-line-number + formats: colored-line-number linters: enable: @@ -19,7 +19,6 @@ linters: - gocritic - gofmt # - revive - - gosec - gosimple - lll - unused diff --git a/packages/eventindexer/.l2.env b/packages/eventindexer/.l2.env index 983f2ac3069..c48d34537b3 100644 --- a/packages/eventindexer/.l2.env +++ b/packages/eventindexer/.l2.env @@ -1,15 +1,15 @@ HTTP_PORT=4009 METRICS_HTTP_PORT=6067 -DATABASE_USER= -DATABASE_PASSWORD= +DATABASE_USER=root +DATABASE_PASSWORD=root DATABASE_NAME=eventindexer DATABASE_HOST=localhost:3306 DATABASE_MAX_IDLE_CONNS=50 DATABASE_MAX_OPEN_CONNS=3000 DATABASE_CONN_MAX_LIFETIME_IN_MS=100000 -RPC_URL=wss://ws.katla.taiko.xyz +RPC_URL=wss://ws.mainnet.taiko.xyz CORS_ORIGINS=* BLOCK_BATCH_SIZE=50 CACHE_INTERVAL_IN_SECONDS=60 LAYER=l2 -INDEX_NFTS=true +INDEX_ERC20S=true diff --git a/packages/eventindexer/.swaggo b/packages/eventindexer/.swaggo new file mode 100644 index 00000000000..0b3f2a25004 --- /dev/null +++ b/packages/eventindexer/.swaggo @@ -0,0 +1,3 @@ +replace json.RawMessage string +replace sql.NullInt64 uint64 +replace sql.NullInt16 uint16 \ No newline at end of file diff --git a/packages/guardian-prover-health-check/GuardianProver.json b/packages/eventindexer/AssignmentHook.json similarity index 73% rename from packages/guardian-prover-health-check/GuardianProver.json rename to packages/eventindexer/AssignmentHook.json index 9e25400fb01..b7b29927cb6 100644 --- a/packages/guardian-prover-health-check/GuardianProver.json +++ b/packages/eventindexer/AssignmentHook.json @@ -1,4 +1,17 @@ [ + { + "type": "function", + "name": "MAX_GAS_PAYING_PROVER", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, { "type": "function", "name": "acceptOwnership", @@ -21,186 +34,93 @@ }, { "type": "function", - "name": "approve", + "name": "hashAssignment", "inputs": [ { - "name": "_meta", + "name": "_assignment", "type": "tuple", - "internalType": "struct TaikoData.BlockMetadata", + "internalType": "struct AssignmentHook.ProverAssignment", "components": [ { - "name": "l1Hash", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "difficulty", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "blobHash", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "extraData", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "depositsHash", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "coinbase", + "name": "feeToken", "type": "address", "internalType": "address" }, { - "name": "id", + "name": "expiry", "type": "uint64", "internalType": "uint64" }, { - "name": "gasLimit", - "type": "uint32", - "internalType": "uint32" - }, - { - "name": "timestamp", + "name": "maxBlockId", "type": "uint64", "internalType": "uint64" }, { - "name": "l1Height", + "name": "maxProposedIn", "type": "uint64", "internalType": "uint64" }, { - "name": "minTier", - "type": "uint16", - "internalType": "uint16" - }, - { - "name": "blobUsed", - "type": "bool", - "internalType": "bool" - }, - { - "name": "parentMetaHash", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "sender", - "type": "address", - "internalType": "address" - } - ] - }, - { - "name": "_tran", - "type": "tuple", - "internalType": "struct TaikoData.Transition", - "components": [ - { - "name": "parentHash", + "name": "metaHash", "type": "bytes32", "internalType": "bytes32" }, { - "name": "blockHash", + "name": "parentMetaHash", "type": "bytes32", "internalType": "bytes32" }, { - "name": "stateRoot", - "type": "bytes32", - "internalType": "bytes32" + "name": "tierFees", + "type": "tuple[]", + "internalType": "struct TaikoData.TierFee[]", + "components": [ + { + "name": "tier", + "type": "uint16", + "internalType": "uint16" + }, + { + "name": "fee", + "type": "uint128", + "internalType": "uint128" + } + ] }, { - "name": "graffiti", - "type": "bytes32", - "internalType": "bytes32" - } - ] - }, - { - "name": "_proof", - "type": "tuple", - "internalType": "struct TaikoData.TierProof", - "components": [ - { - "name": "tier", - "type": "uint16", - "internalType": "uint16" - }, - { - "name": "data", + "name": "signature", "type": "bytes", "internalType": "bytes" } ] - } - ], - "outputs": [ - { - "name": "approved_", - "type": "bool", - "internalType": "bool" - } - ], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "enableTaikoTokenAllowance", - "inputs": [ + }, { - "name": "_enable", - "type": "bool", - "internalType": "bool" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "guardianIds", - "inputs": [ + "name": "_taikoL1Address", + "type": "address", + "internalType": "address" + }, { - "name": "guardian", + "name": "_blockProposer", "type": "address", "internalType": "address" - } - ], - "outputs": [ + }, { - "name": "id", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "guardians", - "inputs": [ + "name": "_assignedProver", + "type": "address", + "internalType": "address" + }, { - "name": "", - "type": "uint256", - "internalType": "uint256" + "name": "_blobHash", + "type": "bytes32", + "internalType": "bytes32" } ], "outputs": [ { "name": "", - "type": "address", - "internalType": "address" + "type": "bytes32", + "internalType": "bytes32" } ], "stateMutability": "view" @@ -249,25 +169,6 @@ "outputs": [], "stateMutability": "nonpayable" }, - { - "type": "function", - "name": "isApproved", - "inputs": [ - { - "name": "_hash", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "outputs": [ - { - "name": "", - "type": "bool", - "internalType": "bool" - } - ], - "stateMutability": "view" - }, { "type": "function", "name": "lastUnpausedAt", @@ -283,29 +184,140 @@ }, { "type": "function", - "name": "minGuardians", - "inputs": [], - "outputs": [ + "name": "onBlockProposed", + "inputs": [ { - "name": "", - "type": "uint32", - "internalType": "uint32" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "numGuardians", - "inputs": [], - "outputs": [ + "name": "_blk", + "type": "tuple", + "internalType": "struct TaikoData.Block", + "components": [ + { + "name": "metaHash", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "assignedProver", + "type": "address", + "internalType": "address" + }, + { + "name": "livenessBond", + "type": "uint96", + "internalType": "uint96" + }, + { + "name": "blockId", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "proposedAt", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "proposedIn", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "nextTransitionId", + "type": "uint32", + "internalType": "uint32" + }, + { + "name": "verifiedTransitionId", + "type": "uint32", + "internalType": "uint32" + } + ] + }, + { + "name": "_meta", + "type": "tuple", + "internalType": "struct TaikoData.BlockMetadata", + "components": [ + { + "name": "l1Hash", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "difficulty", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "blobHash", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "extraData", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "depositsHash", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "coinbase", + "type": "address", + "internalType": "address" + }, + { + "name": "id", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "gasLimit", + "type": "uint32", + "internalType": "uint32" + }, + { + "name": "timestamp", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "l1Height", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "minTier", + "type": "uint16", + "internalType": "uint16" + }, + { + "name": "blobUsed", + "type": "bool", + "internalType": "bool" + }, + { + "name": "parentMetaHash", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "sender", + "type": "address", + "internalType": "address" + } + ] + }, { - "name": "", - "type": "uint256", - "internalType": "uint256" + "name": "_data", + "type": "bytes", + "internalType": "bytes" } ], - "stateMutability": "view" + "outputs": [], + "stateMutability": "payable" }, { "type": "function", @@ -426,24 +438,6 @@ ], "stateMutability": "view" }, - { - "type": "function", - "name": "setGuardians", - "inputs": [ - { - "name": "_newGuardians", - "type": "address[]", - "internalType": "address[]" - }, - { - "name": "_minGuardians", - "type": "uint8", - "internalType": "uint8" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, { "type": "function", "name": "transferOwnership", @@ -496,16 +490,60 @@ "stateMutability": "payable" }, { - "type": "function", - "name": "verifyProof", + "type": "event", + "name": "AdminChanged", + "inputs": [ + { + "name": "previousAdmin", + "type": "address", + "indexed": false, + "internalType": "address" + }, + { + "name": "newAdmin", + "type": "address", + "indexed": false, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "BeaconUpgraded", + "inputs": [ + { + "name": "beacon", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "BlockAssigned", "inputs": [ { - "name": "_ctx", + "name": "assignedProver", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "meta", "type": "tuple", - "internalType": "struct IVerifier.Context", + "indexed": false, + "internalType": "struct TaikoData.BlockMetadata", "components": [ { - "name": "metaHash", + "name": "l1Hash", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "difficulty", "type": "bytes32", "internalType": "bytes32" }, @@ -515,19 +553,44 @@ "internalType": "bytes32" }, { - "name": "prover", + "name": "extraData", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "depositsHash", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "coinbase", "type": "address", "internalType": "address" }, { - "name": "blockId", + "name": "id", "type": "uint64", "internalType": "uint64" }, { - "name": "isContesting", - "type": "bool", - "internalType": "bool" + "name": "gasLimit", + "type": "uint32", + "internalType": "uint32" + }, + { + "name": "timestamp", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "l1Height", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "minTier", + "type": "uint16", + "internalType": "uint16" }, { "name": "blobUsed", @@ -535,200 +598,95 @@ "internalType": "bool" }, { - "name": "msgSender", + "name": "parentMetaHash", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "sender", "type": "address", "internalType": "address" } ] }, { - "name": "", + "name": "assignment", "type": "tuple", - "internalType": "struct TaikoData.Transition", + "indexed": false, + "internalType": "struct AssignmentHook.ProverAssignment", "components": [ { - "name": "parentHash", - "type": "bytes32", - "internalType": "bytes32" + "name": "feeToken", + "type": "address", + "internalType": "address" }, { - "name": "blockHash", - "type": "bytes32", - "internalType": "bytes32" + "name": "expiry", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "maxBlockId", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "maxProposedIn", + "type": "uint64", + "internalType": "uint64" }, { - "name": "stateRoot", + "name": "metaHash", "type": "bytes32", "internalType": "bytes32" }, { - "name": "graffiti", + "name": "parentMetaHash", "type": "bytes32", "internalType": "bytes32" - } - ] - }, - { - "name": "", - "type": "tuple", - "internalType": "struct TaikoData.TierProof", - "components": [ + }, { - "name": "tier", - "type": "uint16", - "internalType": "uint16" + "name": "tierFees", + "type": "tuple[]", + "internalType": "struct TaikoData.TierFee[]", + "components": [ + { + "name": "tier", + "type": "uint16", + "internalType": "uint16" + }, + { + "name": "fee", + "type": "uint128", + "internalType": "uint128" + } + ] }, { - "name": "data", + "name": "signature", "type": "bytes", "internalType": "bytes" } ] } ], - "outputs": [], - "stateMutability": "view" - }, - { - "type": "function", - "name": "version", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "uint32", - "internalType": "uint32" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "withdrawTaikoToken", - "inputs": [ - { - "name": "_to", - "type": "address", - "internalType": "address" - }, - { - "name": "_amount", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [], - "stateMutability": "nonpayable" + "anonymous": false }, { "type": "event", - "name": "AdminChanged", + "name": "EtherPaymentFailed", "inputs": [ { - "name": "previousAdmin", - "type": "address", - "indexed": false, - "internalType": "address" - }, - { - "name": "newAdmin", + "name": "to", "type": "address", "indexed": false, "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "Approved", - "inputs": [ - { - "name": "operationId", - "type": "uint256", - "indexed": true, - "internalType": "uint256" }, { - "name": "approvalBits", + "name": "maxGas", "type": "uint256", "indexed": false, "internalType": "uint256" - }, - { - "name": "minGuardiansReached", - "type": "bool", - "indexed": false, - "internalType": "bool" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "BeaconUpgraded", - "inputs": [ - { - "name": "beacon", - "type": "address", - "indexed": true, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "GuardianApproval", - "inputs": [ - { - "name": "addr", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "blockId", - "type": "uint256", - "indexed": true, - "internalType": "uint256" - }, - { - "name": "blockHash", - "type": "bytes32", - "indexed": true, - "internalType": "bytes32" - }, - { - "name": "approved", - "type": "bool", - "indexed": false, - "internalType": "bool" - }, - { - "name": "proofData", - "type": "bytes", - "indexed": false, - "internalType": "bytes" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "GuardiansUpdated", - "inputs": [ - { - "name": "version", - "type": "uint32", - "indexed": false, - "internalType": "uint32" - }, - { - "name": "guardians", - "type": "address[]", - "indexed": false, - "internalType": "address[]" } ], "anonymous": false @@ -825,32 +783,27 @@ }, { "type": "error", - "name": "FUNC_NOT_IMPLEMENTED", - "inputs": [] - }, - { - "type": "error", - "name": "GP_INVALID_GUARDIAN", + "name": "ETH_TRANSFER_FAILED", "inputs": [] }, { "type": "error", - "name": "GP_INVALID_GUARDIAN_SET", + "name": "FUNC_NOT_IMPLEMENTED", "inputs": [] }, { "type": "error", - "name": "GP_INVALID_MIN_GUARDIANS", + "name": "HOOK_ASSIGNMENT_EXPIRED", "inputs": [] }, { "type": "error", - "name": "GV_PERMISSION_DENIED", + "name": "HOOK_ASSIGNMENT_INVALID_SIG", "inputs": [] }, { "type": "error", - "name": "GV_ZERO_ADDRESS", + "name": "HOOK_TIER_NOT_FOUND", "inputs": [] }, { diff --git a/packages/relayer/TaikoL1.json b/packages/eventindexer/Bridge.json similarity index 50% rename from packages/relayer/TaikoL1.json rename to packages/eventindexer/Bridge.json index d84c004bf37..3b85df5ac36 100644 --- a/packages/relayer/TaikoL1.json +++ b/packages/eventindexer/Bridge.json @@ -1,7 +1,42 @@ [ { - "type": "receive", - "stateMutability": "payable" + "type": "function", + "name": "GAS_OVERHEAD", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint32", + "internalType": "uint32" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "GAS_RESERVE", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint32", + "internalType": "uint32" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "RELAYER_MAX_PROOF_BYTES", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" }, { "type": "function", @@ -25,59 +60,28 @@ }, { "type": "function", - "name": "getBlock", - "inputs": [ - { - "name": "_blockId", - "type": "uint64", - "internalType": "uint64" - } - ], + "name": "context", + "inputs": [], "outputs": [ { - "name": "blk_", + "name": "ctx_", "type": "tuple", - "internalType": "struct TaikoData.Block", + "internalType": "struct IBridge.Context", "components": [ { - "name": "metaHash", + "name": "msgHash", "type": "bytes32", "internalType": "bytes32" }, { - "name": "assignedProver", + "name": "from", "type": "address", "internalType": "address" }, { - "name": "livenessBond", - "type": "uint96", - "internalType": "uint96" - }, - { - "name": "blockId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "proposedAt", + "name": "srcChainId", "type": "uint64", "internalType": "uint64" - }, - { - "name": "proposedIn", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "nextTransitionId", - "type": "uint32", - "internalType": "uint32" - }, - { - "name": "verifiedTransitionId", - "type": "uint32", - "internalType": "uint32" } ] } @@ -86,282 +90,168 @@ }, { "type": "function", - "name": "getConfig", - "inputs": [], - "outputs": [ + "name": "failMessage", + "inputs": [ { - "name": "", + "name": "_message", "type": "tuple", - "internalType": "struct TaikoData.Config", + "internalType": "struct IBridge.Message", "components": [ { - "name": "chainId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "blockMaxProposals", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "blockRingBufferSize", + "name": "id", "type": "uint64", "internalType": "uint64" }, { - "name": "maxBlocksToVerifyPerProposal", + "name": "fee", "type": "uint64", "internalType": "uint64" }, { - "name": "blockMaxGasLimit", + "name": "gasLimit", "type": "uint32", "internalType": "uint32" }, { - "name": "livenessBond", - "type": "uint96", - "internalType": "uint96" - }, - { - "name": "blockSyncThreshold", - "type": "uint8", - "internalType": "uint8" - } - ] - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "getStateVariables", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "tuple", - "internalType": "struct TaikoData.SlotA", - "components": [ - { - "name": "genesisHeight", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "genesisTimestamp", - "type": "uint64", - "internalType": "uint64" + "name": "from", + "type": "address", + "internalType": "address" }, { - "name": "lastSyncedBlockId", + "name": "srcChainId", "type": "uint64", "internalType": "uint64" }, { - "name": "lastSynecdAt", - "type": "uint64", - "internalType": "uint64" - } - ] - }, - { - "name": "", - "type": "tuple", - "internalType": "struct TaikoData.SlotB", - "components": [ - { - "name": "numBlocks", - "type": "uint64", - "internalType": "uint64" + "name": "srcOwner", + "type": "address", + "internalType": "address" }, { - "name": "lastVerifiedBlockId", + "name": "destChainId", "type": "uint64", "internalType": "uint64" }, { - "name": "provingPaused", - "type": "bool", - "internalType": "bool" - }, - { - "name": "__reservedB1", - "type": "uint8", - "internalType": "uint8" + "name": "destOwner", + "type": "address", + "internalType": "address" }, { - "name": "__reservedB2", - "type": "uint16", - "internalType": "uint16" + "name": "to", + "type": "address", + "internalType": "address" }, { - "name": "__reservedB3", - "type": "uint32", - "internalType": "uint32" + "name": "value", + "type": "uint256", + "internalType": "uint256" }, { - "name": "lastUnpausedAt", - "type": "uint64", - "internalType": "uint64" + "name": "data", + "type": "bytes", + "internalType": "bytes" } ] } ], - "stateMutability": "view" + "outputs": [], + "stateMutability": "nonpayable" }, { "type": "function", - "name": "getTransition", + "name": "getMessageMinGasLimit", "inputs": [ { - "name": "_blockId", - "type": "uint64", - "internalType": "uint64" - }, + "name": "dataLength", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ { - "name": "_tid", + "name": "", "type": "uint32", "internalType": "uint32" } ], - "outputs": [ + "stateMutability": "pure" + }, + { + "type": "function", + "name": "hashMessage", + "inputs": [ { - "name": "", + "name": "_message", "type": "tuple", - "internalType": "struct TaikoData.TransitionState", + "internalType": "struct IBridge.Message", "components": [ { - "name": "key", - "type": "bytes32", - "internalType": "bytes32" + "name": "id", + "type": "uint64", + "internalType": "uint64" }, { - "name": "blockHash", - "type": "bytes32", - "internalType": "bytes32" + "name": "fee", + "type": "uint64", + "internalType": "uint64" }, { - "name": "stateRoot", - "type": "bytes32", - "internalType": "bytes32" + "name": "gasLimit", + "type": "uint32", + "internalType": "uint32" }, { - "name": "prover", + "name": "from", "type": "address", "internalType": "address" }, { - "name": "validityBond", - "type": "uint96", - "internalType": "uint96" + "name": "srcChainId", + "type": "uint64", + "internalType": "uint64" }, { - "name": "contester", + "name": "srcOwner", "type": "address", "internalType": "address" }, { - "name": "contestBond", - "type": "uint96", - "internalType": "uint96" - }, - { - "name": "timestamp", + "name": "destChainId", "type": "uint64", "internalType": "uint64" }, { - "name": "tier", - "type": "uint16", - "internalType": "uint16" - }, - { - "name": "__reserved1", - "type": "uint8", - "internalType": "uint8" - } - ] - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "getTransition", - "inputs": [ - { - "name": "_blockId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "_parentHash", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "outputs": [ - { - "name": "", - "type": "tuple", - "internalType": "struct TaikoData.TransitionState", - "components": [ - { - "name": "key", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "blockHash", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "stateRoot", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "prover", + "name": "destOwner", "type": "address", "internalType": "address" }, { - "name": "validityBond", - "type": "uint96", - "internalType": "uint96" - }, - { - "name": "contester", + "name": "to", "type": "address", "internalType": "address" }, { - "name": "contestBond", - "type": "uint96", - "internalType": "uint96" - }, - { - "name": "timestamp", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "tier", - "type": "uint16", - "internalType": "uint16" + "name": "value", + "type": "uint256", + "internalType": "uint256" }, { - "name": "__reserved1", - "type": "uint8", - "internalType": "uint8" + "name": "data", + "type": "bytes", + "internalType": "bytes" } ] } ], - "stateMutability": "view" + "outputs": [ + { + "name": "", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "stateMutability": "pure" }, { "type": "function", @@ -402,16 +292,6 @@ "name": "_addressManager", "type": "address", "internalType": "address" - }, - { - "name": "_genesisBlockHash", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "_toPause", - "type": "bool", - "internalType": "bool" } ], "outputs": [], @@ -426,24 +306,22 @@ }, { "type": "function", - "name": "lastUnpausedAt", - "inputs": [], - "outputs": [ + "name": "isDestChainEnabled", + "inputs": [ { - "name": "", + "name": "_chainId", "type": "uint64", "internalType": "uint64" } ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "owner", - "inputs": [], "outputs": [ { - "name": "", + "name": "enabled_", + "type": "bool", + "internalType": "bool" + }, + { + "name": "destBridge_", "type": "address", "internalType": "address" } @@ -452,447 +330,502 @@ }, { "type": "function", - "name": "pause", - "inputs": [], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "pauseProving", + "name": "isMessageFailed", "inputs": [ { - "name": "_pause", - "type": "bool", - "internalType": "bool" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "paused", - "inputs": [], - "outputs": [ + "name": "_message", + "type": "tuple", + "internalType": "struct IBridge.Message", + "components": [ + { + "name": "id", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "fee", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "gasLimit", + "type": "uint32", + "internalType": "uint32" + }, + { + "name": "from", + "type": "address", + "internalType": "address" + }, + { + "name": "srcChainId", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "srcOwner", + "type": "address", + "internalType": "address" + }, + { + "name": "destChainId", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "destOwner", + "type": "address", + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "internalType": "address" + }, + { + "name": "value", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "data", + "type": "bytes", + "internalType": "bytes" + } + ] + }, { - "name": "", - "type": "bool", - "internalType": "bool" + "name": "_proof", + "type": "bytes", + "internalType": "bytes" } ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "pendingOwner", - "inputs": [], "outputs": [ { "name": "", - "type": "address", - "internalType": "address" + "type": "bool", + "internalType": "bool" } ], "stateMutability": "view" }, { "type": "function", - "name": "proposeBlock", + "name": "isMessageReceived", "inputs": [ { - "name": "_params", - "type": "bytes", - "internalType": "bytes" - }, - { - "name": "_txList", - "type": "bytes", - "internalType": "bytes" - } - ], - "outputs": [ - { - "name": "meta_", + "name": "_message", "type": "tuple", - "internalType": "struct TaikoData.BlockMetadata", + "internalType": "struct IBridge.Message", "components": [ { - "name": "l1Hash", - "type": "bytes32", - "internalType": "bytes32" + "name": "id", + "type": "uint64", + "internalType": "uint64" }, { - "name": "difficulty", - "type": "bytes32", - "internalType": "bytes32" + "name": "fee", + "type": "uint64", + "internalType": "uint64" }, { - "name": "blobHash", - "type": "bytes32", - "internalType": "bytes32" + "name": "gasLimit", + "type": "uint32", + "internalType": "uint32" }, { - "name": "extraData", - "type": "bytes32", - "internalType": "bytes32" + "name": "from", + "type": "address", + "internalType": "address" }, { - "name": "depositsHash", - "type": "bytes32", - "internalType": "bytes32" + "name": "srcChainId", + "type": "uint64", + "internalType": "uint64" }, { - "name": "coinbase", + "name": "srcOwner", "type": "address", "internalType": "address" }, { - "name": "id", + "name": "destChainId", "type": "uint64", "internalType": "uint64" }, { - "name": "gasLimit", - "type": "uint32", - "internalType": "uint32" + "name": "destOwner", + "type": "address", + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "internalType": "address" + }, + { + "name": "value", + "type": "uint256", + "internalType": "uint256" }, { - "name": "timestamp", + "name": "data", + "type": "bytes", + "internalType": "bytes" + } + ] + }, + { + "name": "_proof", + "type": "bytes", + "internalType": "bytes" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "isMessageSent", + "inputs": [ + { + "name": "_message", + "type": "tuple", + "internalType": "struct IBridge.Message", + "components": [ + { + "name": "id", "type": "uint64", "internalType": "uint64" }, { - "name": "l1Height", + "name": "fee", "type": "uint64", "internalType": "uint64" }, { - "name": "minTier", - "type": "uint16", - "internalType": "uint16" + "name": "gasLimit", + "type": "uint32", + "internalType": "uint32" }, { - "name": "blobUsed", - "type": "bool", - "internalType": "bool" + "name": "from", + "type": "address", + "internalType": "address" }, { - "name": "parentMetaHash", - "type": "bytes32", - "internalType": "bytes32" + "name": "srcChainId", + "type": "uint64", + "internalType": "uint64" }, { - "name": "sender", + "name": "srcOwner", "type": "address", "internalType": "address" - } - ] - }, - { - "name": "deposits_", - "type": "tuple[]", - "internalType": "struct TaikoData.EthDeposit[]", - "components": [ + }, + { + "name": "destChainId", + "type": "uint64", + "internalType": "uint64" + }, { - "name": "recipient", + "name": "destOwner", "type": "address", "internalType": "address" }, { - "name": "amount", - "type": "uint96", - "internalType": "uint96" + "name": "to", + "type": "address", + "internalType": "address" }, { - "name": "id", - "type": "uint64", - "internalType": "uint64" + "name": "value", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "data", + "type": "bytes", + "internalType": "bytes" } ] } ], - "stateMutability": "payable" - }, - { - "type": "function", - "name": "proveBlock", - "inputs": [ - { - "name": "_blockId", - "type": "uint64", - "internalType": "uint64" - }, + "outputs": [ { - "name": "_input", - "type": "bytes", - "internalType": "bytes" + "name": "", + "type": "bool", + "internalType": "bool" } ], - "outputs": [], - "stateMutability": "nonpayable" + "stateMutability": "view" }, { "type": "function", - "name": "proxiableUUID", + "name": "lastUnpausedAt", "inputs": [], "outputs": [ { "name": "", - "type": "bytes32", - "internalType": "bytes32" + "type": "uint64", + "internalType": "uint64" } ], "stateMutability": "view" }, { "type": "function", - "name": "renounceOwnership", - "inputs": [], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "resetGenesisHash", + "name": "messageStatus", "inputs": [ { - "name": "_genesisBlockHash", + "name": "msgHash", "type": "bytes32", "internalType": "bytes32" } ], - "outputs": [], - "stateMutability": "nonpayable" + "outputs": [ + { + "name": "status", + "type": "uint8", + "internalType": "enum IBridge.Status" + } + ], + "stateMutability": "view" }, { "type": "function", - "name": "resolve", - "inputs": [ + "name": "nextMessageId", + "inputs": [], + "outputs": [ { - "name": "_chainId", + "name": "", "type": "uint64", "internalType": "uint64" - }, - { - "name": "_name", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "_allowZeroAddress", - "type": "bool", - "internalType": "bool" } ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "owner", + "inputs": [], "outputs": [ { "name": "", "type": "address", - "internalType": "address payable" + "internalType": "address" } ], "stateMutability": "view" }, { "type": "function", - "name": "resolve", - "inputs": [ - { - "name": "_name", - "type": "bytes32", - "internalType": "bytes32" - }, + "name": "pause", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "paused", + "inputs": [], + "outputs": [ { - "name": "_allowZeroAddress", + "name": "", "type": "bool", "internalType": "bool" } ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "pendingOwner", + "inputs": [], "outputs": [ { "name": "", "type": "address", - "internalType": "address payable" + "internalType": "address" } ], "stateMutability": "view" }, { "type": "function", - "name": "slotA", - "inputs": [], - "outputs": [ + "name": "processMessage", + "inputs": [ { - "name": "", + "name": "_message", "type": "tuple", - "internalType": "struct TaikoData.SlotA", + "internalType": "struct IBridge.Message", "components": [ { - "name": "genesisHeight", + "name": "id", "type": "uint64", "internalType": "uint64" }, { - "name": "genesisTimestamp", + "name": "fee", "type": "uint64", "internalType": "uint64" }, { - "name": "lastSyncedBlockId", - "type": "uint64", - "internalType": "uint64" + "name": "gasLimit", + "type": "uint32", + "internalType": "uint32" }, { - "name": "lastSynecdAt", - "type": "uint64", - "internalType": "uint64" - } - ] - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "slotB", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "tuple", - "internalType": "struct TaikoData.SlotB", - "components": [ + "name": "from", + "type": "address", + "internalType": "address" + }, { - "name": "numBlocks", + "name": "srcChainId", "type": "uint64", "internalType": "uint64" }, { - "name": "lastVerifiedBlockId", - "type": "uint64", - "internalType": "uint64" + "name": "srcOwner", + "type": "address", + "internalType": "address" }, { - "name": "provingPaused", - "type": "bool", - "internalType": "bool" + "name": "destChainId", + "type": "uint64", + "internalType": "uint64" }, { - "name": "__reservedB1", - "type": "uint8", - "internalType": "uint8" + "name": "destOwner", + "type": "address", + "internalType": "address" }, { - "name": "__reservedB2", - "type": "uint16", - "internalType": "uint16" + "name": "to", + "type": "address", + "internalType": "address" }, { - "name": "__reservedB3", - "type": "uint32", - "internalType": "uint32" + "name": "value", + "type": "uint256", + "internalType": "uint256" }, { - "name": "lastUnpausedAt", - "type": "uint64", - "internalType": "uint64" + "name": "data", + "type": "bytes", + "internalType": "bytes" } ] + }, + { + "name": "_proof", + "type": "bytes", + "internalType": "bytes" } ], - "stateMutability": "view" + "outputs": [ + { + "name": "status_", + "type": "uint8", + "internalType": "enum IBridge.Status" + }, + { + "name": "reason_", + "type": "uint8", + "internalType": "enum IBridge.StatusReason" + } + ], + "stateMutability": "nonpayable" }, { "type": "function", - "name": "state", + "name": "proxiableUUID", "inputs": [], "outputs": [ { - "name": "__reserve1", + "name": "", "type": "bytes32", "internalType": "bytes32" - }, + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "recallMessage", + "inputs": [ { - "name": "slotA", + "name": "_message", "type": "tuple", - "internalType": "struct TaikoData.SlotA", + "internalType": "struct IBridge.Message", "components": [ { - "name": "genesisHeight", + "name": "id", "type": "uint64", "internalType": "uint64" }, { - "name": "genesisTimestamp", + "name": "fee", "type": "uint64", "internalType": "uint64" }, { - "name": "lastSyncedBlockId", - "type": "uint64", - "internalType": "uint64" + "name": "gasLimit", + "type": "uint32", + "internalType": "uint32" }, { - "name": "lastSynecdAt", - "type": "uint64", - "internalType": "uint64" - } - ] - }, - { - "name": "slotB", - "type": "tuple", - "internalType": "struct TaikoData.SlotB", - "components": [ + "name": "from", + "type": "address", + "internalType": "address" + }, { - "name": "numBlocks", + "name": "srcChainId", "type": "uint64", "internalType": "uint64" }, { - "name": "lastVerifiedBlockId", - "type": "uint64", - "internalType": "uint64" + "name": "srcOwner", + "type": "address", + "internalType": "address" }, { - "name": "provingPaused", - "type": "bool", - "internalType": "bool" + "name": "destChainId", + "type": "uint64", + "internalType": "uint64" }, { - "name": "__reservedB1", - "type": "uint8", - "internalType": "uint8" + "name": "destOwner", + "type": "address", + "internalType": "address" }, { - "name": "__reservedB2", - "type": "uint16", - "internalType": "uint16" + "name": "to", + "type": "address", + "internalType": "address" }, { - "name": "__reservedB3", - "type": "uint32", - "internalType": "uint32" + "name": "value", + "type": "uint256", + "internalType": "uint256" }, { - "name": "lastUnpausedAt", - "type": "uint64", - "internalType": "uint64" + "name": "data", + "type": "bytes", + "internalType": "bytes" } ] - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "transferOwnership", - "inputs": [ + }, { - "name": "newOwner", - "type": "address", - "internalType": "address" + "name": "_proof", + "type": "bytes", + "internalType": "bytes" } ], "outputs": [], @@ -900,147 +833,80 @@ }, { "type": "function", - "name": "unpause", + "name": "renounceOwnership", "inputs": [], "outputs": [], "stateMutability": "nonpayable" }, { "type": "function", - "name": "upgradeTo", + "name": "resolve", "inputs": [ { - "name": "newImplementation", - "type": "address", - "internalType": "address" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "upgradeToAndCall", - "inputs": [ + "name": "_chainId", + "type": "uint64", + "internalType": "uint64" + }, { - "name": "newImplementation", - "type": "address", - "internalType": "address" + "name": "_name", + "type": "bytes32", + "internalType": "bytes32" }, { - "name": "data", - "type": "bytes", - "internalType": "bytes" + "name": "_allowZeroAddress", + "type": "bool", + "internalType": "bool" } ], - "outputs": [], - "stateMutability": "payable" - }, - { - "type": "function", - "name": "verifyBlocks", - "inputs": [ + "outputs": [ { - "name": "_maxBlocksToVerify", - "type": "uint64", - "internalType": "uint64" + "name": "", + "type": "address", + "internalType": "address payable" } ], - "outputs": [], - "stateMutability": "nonpayable" + "stateMutability": "view" }, { - "type": "event", - "name": "AdminChanged", + "type": "function", + "name": "resolve", "inputs": [ { - "name": "previousAdmin", - "type": "address", - "indexed": false, - "internalType": "address" + "name": "_name", + "type": "bytes32", + "internalType": "bytes32" }, { - "name": "newAdmin", - "type": "address", - "indexed": false, - "internalType": "address" + "name": "_allowZeroAddress", + "type": "bool", + "internalType": "bool" } ], - "anonymous": false - }, - { - "type": "event", - "name": "BeaconUpgraded", - "inputs": [ + "outputs": [ { - "name": "beacon", + "name": "", "type": "address", - "indexed": true, - "internalType": "address" + "internalType": "address payable" } ], - "anonymous": false + "stateMutability": "view" }, { - "type": "event", - "name": "BlockProposed", + "type": "function", + "name": "retryMessage", "inputs": [ { - "name": "blockId", - "type": "uint256", - "indexed": true, - "internalType": "uint256" - }, - { - "name": "assignedProver", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "livenessBond", - "type": "uint96", - "indexed": false, - "internalType": "uint96" - }, - { - "name": "meta", + "name": "_message", "type": "tuple", - "indexed": false, - "internalType": "struct TaikoData.BlockMetadata", + "internalType": "struct IBridge.Message", "components": [ { - "name": "l1Hash", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "difficulty", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "blobHash", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "extraData", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "depositsHash", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "coinbase", - "type": "address", - "internalType": "address" + "name": "id", + "type": "uint64", + "internalType": "uint64" }, { - "name": "id", + "name": "fee", "type": "uint64", "internalType": "uint64" }, @@ -1050,309 +916,291 @@ "internalType": "uint32" }, { - "name": "timestamp", - "type": "uint64", - "internalType": "uint64" + "name": "from", + "type": "address", + "internalType": "address" }, { - "name": "l1Height", + "name": "srcChainId", "type": "uint64", "internalType": "uint64" }, { - "name": "minTier", - "type": "uint16", - "internalType": "uint16" - }, - { - "name": "blobUsed", - "type": "bool", - "internalType": "bool" + "name": "srcOwner", + "type": "address", + "internalType": "address" }, { - "name": "parentMetaHash", - "type": "bytes32", - "internalType": "bytes32" + "name": "destChainId", + "type": "uint64", + "internalType": "uint64" }, { - "name": "sender", + "name": "destOwner", "type": "address", "internalType": "address" - } - ] - }, - { - "name": "depositsProcessed", - "type": "tuple[]", - "indexed": false, - "internalType": "struct TaikoData.EthDeposit[]", - "components": [ + }, { - "name": "recipient", + "name": "to", "type": "address", "internalType": "address" }, { - "name": "amount", - "type": "uint96", - "internalType": "uint96" + "name": "value", + "type": "uint256", + "internalType": "uint256" }, { - "name": "id", - "type": "uint64", - "internalType": "uint64" + "name": "data", + "type": "bytes", + "internalType": "bytes" } ] + }, + { + "name": "_isLastAttempt", + "type": "bool", + "internalType": "bool" } ], - "anonymous": false + "outputs": [], + "stateMutability": "nonpayable" }, { - "type": "event", - "name": "BlockProposed", + "type": "function", + "name": "selfDelegate", "inputs": [ { - "name": "blockId", - "type": "uint256", - "indexed": true, - "internalType": "uint256" - }, - { - "name": "assignedProver", + "name": "_anyToken", "type": "address", - "indexed": true, "internalType": "address" - }, - { - "name": "livenessBond", - "type": "uint96", - "indexed": false, - "internalType": "uint96" - }, + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "sendMessage", + "inputs": [ { - "name": "meta", + "name": "_message", "type": "tuple", - "indexed": false, - "internalType": "struct TaikoData.BlockMetadata", + "internalType": "struct IBridge.Message", "components": [ { - "name": "l1Hash", - "type": "bytes32", - "internalType": "bytes32" + "name": "id", + "type": "uint64", + "internalType": "uint64" }, { - "name": "difficulty", - "type": "bytes32", - "internalType": "bytes32" + "name": "fee", + "type": "uint64", + "internalType": "uint64" }, { - "name": "blobHash", - "type": "bytes32", - "internalType": "bytes32" + "name": "gasLimit", + "type": "uint32", + "internalType": "uint32" }, { - "name": "extraData", - "type": "bytes32", - "internalType": "bytes32" + "name": "from", + "type": "address", + "internalType": "address" }, { - "name": "depositsHash", - "type": "bytes32", - "internalType": "bytes32" + "name": "srcChainId", + "type": "uint64", + "internalType": "uint64" }, { - "name": "coinbase", + "name": "srcOwner", "type": "address", "internalType": "address" }, { - "name": "id", + "name": "destChainId", "type": "uint64", "internalType": "uint64" }, { - "name": "gasLimit", - "type": "uint32", - "internalType": "uint32" + "name": "destOwner", + "type": "address", + "internalType": "address" }, { - "name": "timestamp", + "name": "to", + "type": "address", + "internalType": "address" + }, + { + "name": "value", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "data", + "type": "bytes", + "internalType": "bytes" + } + ] + } + ], + "outputs": [ + { + "name": "msgHash_", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "message_", + "type": "tuple", + "internalType": "struct IBridge.Message", + "components": [ + { + "name": "id", "type": "uint64", "internalType": "uint64" }, { - "name": "l1Height", + "name": "fee", "type": "uint64", "internalType": "uint64" }, { - "name": "minTier", - "type": "uint16", - "internalType": "uint16" + "name": "gasLimit", + "type": "uint32", + "internalType": "uint32" }, { - "name": "blobUsed", - "type": "bool", - "internalType": "bool" + "name": "from", + "type": "address", + "internalType": "address" }, { - "name": "parentMetaHash", - "type": "bytes32", - "internalType": "bytes32" + "name": "srcChainId", + "type": "uint64", + "internalType": "uint64" }, { - "name": "sender", + "name": "srcOwner", "type": "address", "internalType": "address" - } - ] - }, - { - "name": "depositsProcessed", - "type": "tuple[]", - "indexed": false, - "internalType": "struct TaikoData.EthDeposit[]", - "components": [ + }, + { + "name": "destChainId", + "type": "uint64", + "internalType": "uint64" + }, { - "name": "recipient", + "name": "destOwner", "type": "address", "internalType": "address" }, { - "name": "amount", - "type": "uint96", - "internalType": "uint96" + "name": "to", + "type": "address", + "internalType": "address" }, { - "name": "id", - "type": "uint64", - "internalType": "uint64" + "name": "value", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "data", + "type": "bytes", + "internalType": "bytes" } ] } ], - "anonymous": false + "stateMutability": "payable" }, { - "type": "event", - "name": "BlockVerified", + "type": "function", + "name": "signalForFailedMessage", "inputs": [ { - "name": "blockId", - "type": "uint256", - "indexed": true, - "internalType": "uint256" - }, - { - "name": "prover", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "blockHash", + "name": "_msgHash", "type": "bytes32", - "indexed": false, "internalType": "bytes32" - }, + } + ], + "outputs": [ { - "name": "stateRoot", + "name": "", "type": "bytes32", - "indexed": false, "internalType": "bytes32" - }, - { - "name": "tier", - "type": "uint16", - "indexed": false, - "internalType": "uint16" } ], - "anonymous": false + "stateMutability": "pure" }, { - "type": "event", - "name": "BlockVerified", + "type": "function", + "name": "transferOwnership", "inputs": [ { - "name": "blockId", - "type": "uint256", - "indexed": true, - "internalType": "uint256" - }, - { - "name": "prover", + "name": "newOwner", "type": "address", - "indexed": true, "internalType": "address" - }, - { - "name": "blockHash", - "type": "bytes32", - "indexed": false, - "internalType": "bytes32" - }, - { - "name": "stateRoot", - "type": "bytes32", - "indexed": false, - "internalType": "bytes32" - }, - { - "name": "tier", - "type": "uint16", - "indexed": false, - "internalType": "uint16" } ], - "anonymous": false + "outputs": [], + "stateMutability": "nonpayable" }, { - "type": "event", - "name": "Initialized", + "type": "function", + "name": "unpause", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "upgradeTo", "inputs": [ { - "name": "version", - "type": "uint8", - "indexed": false, - "internalType": "uint8" + "name": "newImplementation", + "type": "address", + "internalType": "address" } ], - "anonymous": false + "outputs": [], + "stateMutability": "nonpayable" }, { - "type": "event", - "name": "OwnershipTransferStarted", + "type": "function", + "name": "upgradeToAndCall", "inputs": [ { - "name": "previousOwner", + "name": "newImplementation", "type": "address", - "indexed": true, "internalType": "address" }, { - "name": "newOwner", - "type": "address", - "indexed": true, - "internalType": "address" + "name": "data", + "type": "bytes", + "internalType": "bytes" } ], - "anonymous": false + "outputs": [], + "stateMutability": "payable" }, { "type": "event", - "name": "OwnershipTransferred", + "name": "AdminChanged", "inputs": [ { - "name": "previousOwner", + "name": "previousAdmin", "type": "address", - "indexed": true, + "indexed": false, "internalType": "address" }, { - "name": "newOwner", + "name": "newAdmin", "type": "address", - "indexed": true, + "indexed": false, "internalType": "address" } ], @@ -1360,12 +1208,12 @@ }, { "type": "event", - "name": "Paused", + "name": "BeaconUpgraded", "inputs": [ { - "name": "account", + "name": "beacon", "type": "address", - "indexed": false, + "indexed": true, "internalType": "address" } ], @@ -1373,74 +1221,115 @@ }, { "type": "event", - "name": "ProvingPaused", + "name": "Initialized", "inputs": [ { - "name": "paused", - "type": "bool", + "name": "version", + "type": "uint8", "indexed": false, - "internalType": "bool" + "internalType": "uint8" } ], "anonymous": false }, { "type": "event", - "name": "ProvingPaused", + "name": "MessageProcessed", "inputs": [ { - "name": "paused", - "type": "bool", - "indexed": false, - "internalType": "bool" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "StateVariablesUpdated", - "inputs": [ + "name": "msgHash", + "type": "bytes32", + "indexed": true, + "internalType": "bytes32" + }, { - "name": "slotB", + "name": "message", "type": "tuple", "indexed": false, - "internalType": "struct TaikoData.SlotB", + "internalType": "struct IBridge.Message", "components": [ { - "name": "numBlocks", + "name": "id", "type": "uint64", "internalType": "uint64" }, { - "name": "lastVerifiedBlockId", + "name": "fee", "type": "uint64", "internalType": "uint64" }, { - "name": "provingPaused", - "type": "bool", - "internalType": "bool" + "name": "gasLimit", + "type": "uint32", + "internalType": "uint32" }, { - "name": "__reservedB1", - "type": "uint8", - "internalType": "uint8" + "name": "from", + "type": "address", + "internalType": "address" }, { - "name": "__reservedB2", - "type": "uint16", - "internalType": "uint16" + "name": "srcChainId", + "type": "uint64", + "internalType": "uint64" }, { - "name": "__reservedB3", - "type": "uint32", - "internalType": "uint32" + "name": "srcOwner", + "type": "address", + "internalType": "address" }, { - "name": "lastUnpausedAt", + "name": "destChainId", "type": "uint64", "internalType": "uint64" + }, + { + "name": "destOwner", + "type": "address", + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "internalType": "address" + }, + { + "name": "value", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "data", + "type": "bytes", + "internalType": "bytes" + } + ] + }, + { + "name": "stats", + "type": "tuple", + "indexed": false, + "internalType": "struct Bridge.ProcessingStats", + "components": [ + { + "name": "gasUsedInFeeCalc", + "type": "uint32", + "internalType": "uint32" + }, + { + "name": "proofSize", + "type": "uint32", + "internalType": "uint32" + }, + { + "name": "numCacheOps", + "type": "uint32", + "internalType": "uint32" + }, + { + "name": "processedByRelayer", + "type": "bool", + "internalType": "bool" } ] } @@ -1449,48 +1338,74 @@ }, { "type": "event", - "name": "StateVariablesUpdated", + "name": "MessageSent", "inputs": [ { - "name": "slotB", + "name": "msgHash", + "type": "bytes32", + "indexed": true, + "internalType": "bytes32" + }, + { + "name": "message", "type": "tuple", "indexed": false, - "internalType": "struct TaikoData.SlotB", + "internalType": "struct IBridge.Message", "components": [ { - "name": "numBlocks", + "name": "id", "type": "uint64", "internalType": "uint64" }, { - "name": "lastVerifiedBlockId", + "name": "fee", "type": "uint64", "internalType": "uint64" }, { - "name": "provingPaused", - "type": "bool", - "internalType": "bool" + "name": "gasLimit", + "type": "uint32", + "internalType": "uint32" }, { - "name": "__reservedB1", - "type": "uint8", - "internalType": "uint8" + "name": "from", + "type": "address", + "internalType": "address" }, { - "name": "__reservedB2", - "type": "uint16", - "internalType": "uint16" + "name": "srcChainId", + "type": "uint64", + "internalType": "uint64" }, { - "name": "__reservedB3", - "type": "uint32", - "internalType": "uint32" + "name": "srcOwner", + "type": "address", + "internalType": "address" }, { - "name": "lastUnpausedAt", + "name": "destChainId", "type": "uint64", "internalType": "uint64" + }, + { + "name": "destOwner", + "type": "address", + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "internalType": "address" + }, + { + "name": "value", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "data", + "type": "bytes", + "internalType": "bytes" } ] } @@ -1499,236 +1414,70 @@ }, { "type": "event", - "name": "TransitionContested", + "name": "MessageStatusChanged", "inputs": [ { - "name": "blockId", - "type": "uint256", + "name": "msgHash", + "type": "bytes32", "indexed": true, - "internalType": "uint256" - }, - { - "name": "tran", - "type": "tuple", - "indexed": false, - "internalType": "struct TaikoData.Transition", - "components": [ - { - "name": "parentHash", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "blockHash", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "stateRoot", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "graffiti", - "type": "bytes32", - "internalType": "bytes32" - } - ] - }, - { - "name": "contester", - "type": "address", - "indexed": false, - "internalType": "address" - }, - { - "name": "contestBond", - "type": "uint96", - "indexed": false, - "internalType": "uint96" + "internalType": "bytes32" }, { - "name": "tier", - "type": "uint16", + "name": "status", + "type": "uint8", "indexed": false, - "internalType": "uint16" + "internalType": "enum IBridge.Status" } ], "anonymous": false }, { "type": "event", - "name": "TransitionContested", + "name": "OwnershipTransferStarted", "inputs": [ { - "name": "blockId", - "type": "uint256", + "name": "previousOwner", + "type": "address", "indexed": true, - "internalType": "uint256" - }, - { - "name": "tran", - "type": "tuple", - "indexed": false, - "internalType": "struct TaikoData.Transition", - "components": [ - { - "name": "parentHash", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "blockHash", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "stateRoot", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "graffiti", - "type": "bytes32", - "internalType": "bytes32" - } - ] + "internalType": "address" }, { - "name": "contester", + "name": "newOwner", "type": "address", - "indexed": false, + "indexed": true, "internalType": "address" - }, - { - "name": "contestBond", - "type": "uint96", - "indexed": false, - "internalType": "uint96" - }, - { - "name": "tier", - "type": "uint16", - "indexed": false, - "internalType": "uint16" } ], "anonymous": false }, { "type": "event", - "name": "TransitionProved", + "name": "OwnershipTransferred", "inputs": [ { - "name": "blockId", - "type": "uint256", + "name": "previousOwner", + "type": "address", "indexed": true, - "internalType": "uint256" - }, - { - "name": "tran", - "type": "tuple", - "indexed": false, - "internalType": "struct TaikoData.Transition", - "components": [ - { - "name": "parentHash", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "blockHash", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "stateRoot", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "graffiti", - "type": "bytes32", - "internalType": "bytes32" - } - ] + "internalType": "address" }, { - "name": "prover", + "name": "newOwner", "type": "address", - "indexed": false, + "indexed": true, "internalType": "address" - }, - { - "name": "validityBond", - "type": "uint96", - "indexed": false, - "internalType": "uint96" - }, - { - "name": "tier", - "type": "uint16", - "indexed": false, - "internalType": "uint16" } ], "anonymous": false }, { "type": "event", - "name": "TransitionProved", + "name": "Paused", "inputs": [ { - "name": "blockId", - "type": "uint256", - "indexed": true, - "internalType": "uint256" - }, - { - "name": "tran", - "type": "tuple", - "indexed": false, - "internalType": "struct TaikoData.Transition", - "components": [ - { - "name": "parentHash", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "blockHash", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "stateRoot", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "graffiti", - "type": "bytes32", - "internalType": "bytes32" - } - ] - }, - { - "name": "prover", + "name": "account", "type": "address", "indexed": false, "internalType": "address" - }, - { - "name": "validityBond", - "type": "uint96", - "indexed": false, - "internalType": "uint96" - }, - { - "name": "tier", - "type": "uint16", - "indexed": false, - "internalType": "uint16" } ], "anonymous": false @@ -1761,282 +1510,82 @@ }, { "type": "error", - "name": "ETH_TRANSFER_FAILED", - "inputs": [] - }, - { - "type": "error", - "name": "FUNC_NOT_IMPLEMENTED", - "inputs": [] - }, - { - "type": "error", - "name": "INVALID_PAUSE_STATUS", - "inputs": [] - }, - { - "type": "error", - "name": "L1_ALREADY_CONTESTED", - "inputs": [] - }, - { - "type": "error", - "name": "L1_ALREADY_CONTESTED", - "inputs": [] - }, - { - "type": "error", - "name": "L1_ALREADY_PROVED", - "inputs": [] - }, - { - "type": "error", - "name": "L1_ALREADY_PROVED", - "inputs": [] - }, - { - "type": "error", - "name": "L1_BLOB_NOT_AVAILABLE", + "name": "B_INSUFFICIENT_GAS", "inputs": [] }, { "type": "error", - "name": "L1_BLOB_NOT_AVAILABLE", + "name": "B_INVALID_CHAINID", "inputs": [] }, { "type": "error", - "name": "L1_BLOB_NOT_FOUND", + "name": "B_INVALID_CONTEXT", "inputs": [] }, { "type": "error", - "name": "L1_BLOB_NOT_FOUND", + "name": "B_INVALID_FEE", "inputs": [] }, { "type": "error", - "name": "L1_BLOCK_MISMATCH", + "name": "B_INVALID_GAS_LIMIT", "inputs": [] }, { "type": "error", - "name": "L1_BLOCK_MISMATCH", + "name": "B_INVALID_STATUS", "inputs": [] }, { "type": "error", - "name": "L1_BLOCK_MISMATCH", + "name": "B_INVALID_VALUE", "inputs": [] }, { "type": "error", - "name": "L1_CANNOT_CONTEST", + "name": "B_MESSAGE_NOT_SENT", "inputs": [] }, { "type": "error", - "name": "L1_CANNOT_CONTEST", + "name": "B_OUT_OF_ETH_QUOTA", "inputs": [] }, { "type": "error", - "name": "L1_INVALID_BLOCK_ID", + "name": "B_PERMISSION_DENIED", "inputs": [] }, { "type": "error", - "name": "L1_INVALID_BLOCK_ID", + "name": "B_PROOF_TOO_LARGE", "inputs": [] }, { "type": "error", - "name": "L1_INVALID_BLOCK_ID", + "name": "B_RETRY_FAILED", "inputs": [] }, { "type": "error", - "name": "L1_INVALID_CONFIG", + "name": "B_SIGNAL_NOT_RECEIVED", "inputs": [] }, { "type": "error", - "name": "L1_INVALID_CONFIG", - "inputs": [] - }, - { - "type": "error", - "name": "L1_INVALID_GENESIS_HASH", - "inputs": [] - }, - { - "type": "error", - "name": "L1_INVALID_GENESIS_HASH", - "inputs": [] - }, - { - "type": "error", - "name": "L1_INVALID_HOOK", - "inputs": [] - }, - { - "type": "error", - "name": "L1_INVALID_HOOK", - "inputs": [] - }, - { - "type": "error", - "name": "L1_INVALID_PARAM", - "inputs": [] - }, - { - "type": "error", - "name": "L1_INVALID_PAUSE_STATUS", - "inputs": [] - }, - { - "type": "error", - "name": "L1_INVALID_PAUSE_STATUS", - "inputs": [] - }, - { - "type": "error", - "name": "L1_INVALID_PROVER", - "inputs": [] - }, - { - "type": "error", - "name": "L1_INVALID_PROVER", - "inputs": [] - }, - { - "type": "error", - "name": "L1_INVALID_SIG", - "inputs": [] - }, - { - "type": "error", - "name": "L1_INVALID_SIG", - "inputs": [] - }, - { - "type": "error", - "name": "L1_INVALID_TIER", - "inputs": [] - }, - { - "type": "error", - "name": "L1_INVALID_TIER", - "inputs": [] - }, - { - "type": "error", - "name": "L1_INVALID_TRANSITION", - "inputs": [] - }, - { - "type": "error", - "name": "L1_INVALID_TRANSITION", - "inputs": [] - }, - { - "type": "error", - "name": "L1_LIVENESS_BOND_NOT_RECEIVED", - "inputs": [] - }, - { - "type": "error", - "name": "L1_LIVENESS_BOND_NOT_RECEIVED", - "inputs": [] - }, - { - "type": "error", - "name": "L1_NOT_ASSIGNED_PROVER", - "inputs": [] - }, - { - "type": "error", - "name": "L1_NOT_ASSIGNED_PROVER", - "inputs": [] - }, - { - "type": "error", - "name": "L1_PROVING_PAUSED", - "inputs": [] - }, - { - "type": "error", - "name": "L1_RECEIVE_DISABLED", - "inputs": [] - }, - { - "type": "error", - "name": "L1_TOO_LATE", - "inputs": [] - }, - { - "type": "error", - "name": "L1_TOO_LATE", - "inputs": [] - }, - { - "type": "error", - "name": "L1_TOO_MANY_BLOCKS", - "inputs": [] - }, - { - "type": "error", - "name": "L1_TOO_MANY_BLOCKS", - "inputs": [] - }, - { - "type": "error", - "name": "L1_TRANSITION_ID_ZERO", - "inputs": [] - }, - { - "type": "error", - "name": "L1_TRANSITION_ID_ZERO", - "inputs": [] - }, - { - "type": "error", - "name": "L1_TRANSITION_NOT_FOUND", - "inputs": [] - }, - { - "type": "error", - "name": "L1_TRANSITION_NOT_FOUND", - "inputs": [] - }, - { - "type": "error", - "name": "L1_UNAUTHORIZED", - "inputs": [] - }, - { - "type": "error", - "name": "L1_UNAUTHORIZED", - "inputs": [] - }, - { - "type": "error", - "name": "L1_UNEXPECTED_PARENT", - "inputs": [] - }, - { - "type": "error", - "name": "L1_UNEXPECTED_PARENT", + "name": "ETH_TRANSFER_FAILED", "inputs": [] }, { "type": "error", - "name": "L1_UNEXPECTED_TRANSITION_ID", + "name": "FUNC_NOT_IMPLEMENTED", "inputs": [] }, { "type": "error", - "name": "L1_UNEXPECTED_TRANSITION_ID", + "name": "INVALID_PAUSE_STATUS", "inputs": [] }, { diff --git a/packages/eventindexer/ProverPool.json b/packages/eventindexer/ProverPool.json deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/packages/eventindexer/README.md b/packages/eventindexer/README.md index aabcf07dc91..f1284b51a16 100644 --- a/packages/eventindexer/README.md +++ b/packages/eventindexer/README.md @@ -1,4 +1,3 @@ -[![Golang](https://github.com/taikoxyz/taiko-mono/actions/workflows/golang.yml/badge.svg)](https://github.com/taikoxyz/taiko-mono/actions/workflows/golang.yml) [![Relayer](https://codecov.io/gh/taikoxyz/taiko-mono/branch/main/graph/badge.svg?token=E468X2PTJC&flag=relayer)](https://codecov.io/gh/taikoxyz/taiko-mono) # Indexer diff --git a/packages/eventindexer/SgxVerifier.json b/packages/eventindexer/SgxVerifier.json deleted file mode 100644 index d8975035755..00000000000 --- a/packages/eventindexer/SgxVerifier.json +++ /dev/null @@ -1,968 +0,0 @@ -[ - { - "type": "function", - "name": "INSTANCE_EXPIRY", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "uint64", - "internalType": "uint64" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "INSTANCE_VALIDITY_DELAY", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "uint64", - "internalType": "uint64" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "acceptOwnership", - "inputs": [], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "addInstances", - "inputs": [ - { - "name": "_instances", - "type": "address[]", - "internalType": "address[]" - } - ], - "outputs": [ - { - "name": "", - "type": "uint256[]", - "internalType": "uint256[]" - } - ], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "addressManager", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "addressRegistered", - "inputs": [ - { - "name": "instanceAddress", - "type": "address", - "internalType": "address" - } - ], - "outputs": [ - { - "name": "alreadyAttested", - "type": "bool", - "internalType": "bool" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "deleteInstances", - "inputs": [ - { - "name": "_ids", - "type": "uint256[]", - "internalType": "uint256[]" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "impl", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "inNonReentrant", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "bool", - "internalType": "bool" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "init", - "inputs": [ - { - "name": "_owner", - "type": "address", - "internalType": "address" - }, - { - "name": "_addressManager", - "type": "address", - "internalType": "address" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "instances", - "inputs": [ - { - "name": "instanceId", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [ - { - "name": "addr", - "type": "address", - "internalType": "address" - }, - { - "name": "validSince", - "type": "uint64", - "internalType": "uint64" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "lastUnpausedAt", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "uint64", - "internalType": "uint64" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "nextInstanceId", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "owner", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "pause", - "inputs": [], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "paused", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "bool", - "internalType": "bool" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "pendingOwner", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "proxiableUUID", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "registerInstance", - "inputs": [ - { - "name": "_attestation", - "type": "tuple", - "internalType": "struct V3Struct.ParsedV3QuoteStruct", - "components": [ - { - "name": "header", - "type": "tuple", - "internalType": "struct V3Struct.Header", - "components": [ - { - "name": "version", - "type": "bytes2", - "internalType": "bytes2" - }, - { - "name": "attestationKeyType", - "type": "bytes2", - "internalType": "bytes2" - }, - { - "name": "teeType", - "type": "bytes4", - "internalType": "bytes4" - }, - { - "name": "qeSvn", - "type": "bytes2", - "internalType": "bytes2" - }, - { - "name": "pceSvn", - "type": "bytes2", - "internalType": "bytes2" - }, - { - "name": "qeVendorId", - "type": "bytes16", - "internalType": "bytes16" - }, - { - "name": "userData", - "type": "bytes20", - "internalType": "bytes20" - } - ] - }, - { - "name": "localEnclaveReport", - "type": "tuple", - "internalType": "struct V3Struct.EnclaveReport", - "components": [ - { - "name": "cpuSvn", - "type": "bytes16", - "internalType": "bytes16" - }, - { - "name": "miscSelect", - "type": "bytes4", - "internalType": "bytes4" - }, - { - "name": "reserved1", - "type": "bytes28", - "internalType": "bytes28" - }, - { - "name": "attributes", - "type": "bytes16", - "internalType": "bytes16" - }, - { - "name": "mrEnclave", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "reserved2", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "mrSigner", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "reserved3", - "type": "bytes", - "internalType": "bytes" - }, - { - "name": "isvProdId", - "type": "uint16", - "internalType": "uint16" - }, - { - "name": "isvSvn", - "type": "uint16", - "internalType": "uint16" - }, - { - "name": "reserved4", - "type": "bytes", - "internalType": "bytes" - }, - { - "name": "reportData", - "type": "bytes", - "internalType": "bytes" - } - ] - }, - { - "name": "v3AuthData", - "type": "tuple", - "internalType": "struct V3Struct.ECDSAQuoteV3AuthData", - "components": [ - { - "name": "ecdsa256BitSignature", - "type": "bytes", - "internalType": "bytes" - }, - { - "name": "ecdsaAttestationKey", - "type": "bytes", - "internalType": "bytes" - }, - { - "name": "pckSignedQeReport", - "type": "tuple", - "internalType": "struct V3Struct.EnclaveReport", - "components": [ - { - "name": "cpuSvn", - "type": "bytes16", - "internalType": "bytes16" - }, - { - "name": "miscSelect", - "type": "bytes4", - "internalType": "bytes4" - }, - { - "name": "reserved1", - "type": "bytes28", - "internalType": "bytes28" - }, - { - "name": "attributes", - "type": "bytes16", - "internalType": "bytes16" - }, - { - "name": "mrEnclave", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "reserved2", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "mrSigner", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "reserved3", - "type": "bytes", - "internalType": "bytes" - }, - { - "name": "isvProdId", - "type": "uint16", - "internalType": "uint16" - }, - { - "name": "isvSvn", - "type": "uint16", - "internalType": "uint16" - }, - { - "name": "reserved4", - "type": "bytes", - "internalType": "bytes" - }, - { - "name": "reportData", - "type": "bytes", - "internalType": "bytes" - } - ] - }, - { - "name": "qeReportSignature", - "type": "bytes", - "internalType": "bytes" - }, - { - "name": "qeAuthData", - "type": "tuple", - "internalType": "struct V3Struct.QEAuthData", - "components": [ - { - "name": "parsedDataSize", - "type": "uint16", - "internalType": "uint16" - }, - { - "name": "data", - "type": "bytes", - "internalType": "bytes" - } - ] - }, - { - "name": "certification", - "type": "tuple", - "internalType": "struct V3Struct.CertificationData", - "components": [ - { - "name": "certType", - "type": "uint16", - "internalType": "uint16" - }, - { - "name": "certDataSize", - "type": "uint32", - "internalType": "uint32" - }, - { - "name": "decodedCertDataArray", - "type": "bytes[3]", - "internalType": "bytes[3]" - } - ] - } - ] - } - ] - } - ], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "renounceOwnership", - "inputs": [], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "resolve", - "inputs": [ - { - "name": "_chainId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "_name", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "_allowZeroAddress", - "type": "bool", - "internalType": "bool" - } - ], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address payable" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "resolve", - "inputs": [ - { - "name": "_name", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "_allowZeroAddress", - "type": "bool", - "internalType": "bool" - } - ], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address payable" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "transferOwnership", - "inputs": [ - { - "name": "newOwner", - "type": "address", - "internalType": "address" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "unpause", - "inputs": [], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "upgradeTo", - "inputs": [ - { - "name": "newImplementation", - "type": "address", - "internalType": "address" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "upgradeToAndCall", - "inputs": [ - { - "name": "newImplementation", - "type": "address", - "internalType": "address" - }, - { - "name": "data", - "type": "bytes", - "internalType": "bytes" - } - ], - "outputs": [], - "stateMutability": "payable" - }, - { - "type": "function", - "name": "verifyProof", - "inputs": [ - { - "name": "_ctx", - "type": "tuple", - "internalType": "struct IVerifier.Context", - "components": [ - { - "name": "metaHash", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "blobHash", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "prover", - "type": "address", - "internalType": "address" - }, - { - "name": "blockId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "isContesting", - "type": "bool", - "internalType": "bool" - }, - { - "name": "blobUsed", - "type": "bool", - "internalType": "bool" - }, - { - "name": "msgSender", - "type": "address", - "internalType": "address" - } - ] - }, - { - "name": "_tran", - "type": "tuple", - "internalType": "struct TaikoData.Transition", - "components": [ - { - "name": "parentHash", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "blockHash", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "stateRoot", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "graffiti", - "type": "bytes32", - "internalType": "bytes32" - } - ] - }, - { - "name": "_proof", - "type": "tuple", - "internalType": "struct TaikoData.TierProof", - "components": [ - { - "name": "tier", - "type": "uint16", - "internalType": "uint16" - }, - { - "name": "data", - "type": "bytes", - "internalType": "bytes" - } - ] - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "event", - "name": "AdminChanged", - "inputs": [ - { - "name": "previousAdmin", - "type": "address", - "indexed": false, - "internalType": "address" - }, - { - "name": "newAdmin", - "type": "address", - "indexed": false, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "BeaconUpgraded", - "inputs": [ - { - "name": "beacon", - "type": "address", - "indexed": true, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "Initialized", - "inputs": [ - { - "name": "version", - "type": "uint8", - "indexed": false, - "internalType": "uint8" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "InstanceAdded", - "inputs": [ - { - "name": "id", - "type": "uint256", - "indexed": true, - "internalType": "uint256" - }, - { - "name": "instance", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "replaced", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "validSince", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "InstanceDeleted", - "inputs": [ - { - "name": "id", - "type": "uint256", - "indexed": true, - "internalType": "uint256" - }, - { - "name": "instance", - "type": "address", - "indexed": true, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "OwnershipTransferStarted", - "inputs": [ - { - "name": "previousOwner", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "newOwner", - "type": "address", - "indexed": true, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "OwnershipTransferred", - "inputs": [ - { - "name": "previousOwner", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "newOwner", - "type": "address", - "indexed": true, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "Paused", - "inputs": [ - { - "name": "account", - "type": "address", - "indexed": false, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "Unpaused", - "inputs": [ - { - "name": "account", - "type": "address", - "indexed": false, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "Upgraded", - "inputs": [ - { - "name": "implementation", - "type": "address", - "indexed": true, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "error", - "name": "FUNC_NOT_IMPLEMENTED", - "inputs": [] - }, - { - "type": "error", - "name": "INVALID_PAUSE_STATUS", - "inputs": [] - }, - { - "type": "error", - "name": "REENTRANT_CALL", - "inputs": [] - }, - { - "type": "error", - "name": "RESOLVER_DENIED", - "inputs": [] - }, - { - "type": "error", - "name": "RESOLVER_INVALID_MANAGER", - "inputs": [] - }, - { - "type": "error", - "name": "RESOLVER_UNEXPECTED_CHAINID", - "inputs": [] - }, - { - "type": "error", - "name": "RESOLVER_ZERO_ADDR", - "inputs": [ - { - "name": "chainId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "name", - "type": "bytes32", - "internalType": "bytes32" - } - ] - }, - { - "type": "error", - "name": "SGX_ALREADY_ATTESTED", - "inputs": [] - }, - { - "type": "error", - "name": "SGX_INVALID_ATTESTATION", - "inputs": [] - }, - { - "type": "error", - "name": "SGX_INVALID_INSTANCE", - "inputs": [] - }, - { - "type": "error", - "name": "SGX_INVALID_PROOF", - "inputs": [] - }, - { - "type": "error", - "name": "SGX_RA_NOT_SUPPORTED", - "inputs": [] - }, - { - "type": "error", - "name": "ZERO_ADDRESS", - "inputs": [] - }, - { - "type": "error", - "name": "ZERO_VALUE", - "inputs": [] - } -] diff --git a/packages/eventindexer/Swap.json b/packages/eventindexer/Swap.json deleted file mode 100644 index 97a2bc659b3..00000000000 --- a/packages/eventindexer/Swap.json +++ /dev/null @@ -1,1032 +0,0 @@ -[ - { - "inputs": [ - { - "internalType": "address", - "name": "_factory", - "type": "address" - }, - { - "internalType": "address", - "name": "_WETH", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "inputs": [], - "name": "WETH", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "tokenA", - "type": "address" - }, - { - "internalType": "address", - "name": "tokenB", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amountADesired", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "amountBDesired", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "amountAMin", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "amountBMin", - "type": "uint256" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "deadline", - "type": "uint256" - } - ], - "name": "addLiquidity", - "outputs": [ - { - "internalType": "uint256", - "name": "amountA", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "amountB", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "liquidity", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "token", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amountTokenDesired", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "amountTokenMin", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "amountETHMin", - "type": "uint256" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "deadline", - "type": "uint256" - } - ], - "name": "addLiquidityETH", - "outputs": [ - { - "internalType": "uint256", - "name": "amountToken", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "amountETH", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "liquidity", - "type": "uint256" - } - ], - "stateMutability": "payable", - "type": "function" - }, - { - "inputs": [], - "name": "factory", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "amountOut", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "reserveIn", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "reserveOut", - "type": "uint256" - } - ], - "name": "getAmountIn", - "outputs": [ - { - "internalType": "uint256", - "name": "amountIn", - "type": "uint256" - } - ], - "stateMutability": "pure", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "amountIn", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "reserveIn", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "reserveOut", - "type": "uint256" - } - ], - "name": "getAmountOut", - "outputs": [ - { - "internalType": "uint256", - "name": "amountOut", - "type": "uint256" - } - ], - "stateMutability": "pure", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "amountOut", - "type": "uint256" - }, - { - "internalType": "address[]", - "name": "path", - "type": "address[]" - } - ], - "name": "getAmountsIn", - "outputs": [ - { - "internalType": "uint256[]", - "name": "amounts", - "type": "uint256[]" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "amountIn", - "type": "uint256" - }, - { - "internalType": "address[]", - "name": "path", - "type": "address[]" - } - ], - "name": "getAmountsOut", - "outputs": [ - { - "internalType": "uint256[]", - "name": "amounts", - "type": "uint256[]" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "amountA", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "reserveA", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "reserveB", - "type": "uint256" - } - ], - "name": "quote", - "outputs": [ - { - "internalType": "uint256", - "name": "amountB", - "type": "uint256" - } - ], - "stateMutability": "pure", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "tokenA", - "type": "address" - }, - { - "internalType": "address", - "name": "tokenB", - "type": "address" - }, - { - "internalType": "uint256", - "name": "liquidity", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "amountAMin", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "amountBMin", - "type": "uint256" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "deadline", - "type": "uint256" - } - ], - "name": "removeLiquidity", - "outputs": [ - { - "internalType": "uint256", - "name": "amountA", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "amountB", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "token", - "type": "address" - }, - { - "internalType": "uint256", - "name": "liquidity", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "amountTokenMin", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "amountETHMin", - "type": "uint256" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "deadline", - "type": "uint256" - } - ], - "name": "removeLiquidityETH", - "outputs": [ - { - "internalType": "uint256", - "name": "amountToken", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "amountETH", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "token", - "type": "address" - }, - { - "internalType": "uint256", - "name": "liquidity", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "amountTokenMin", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "amountETHMin", - "type": "uint256" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "deadline", - "type": "uint256" - } - ], - "name": "removeLiquidityETHSupportingFeeOnTransferTokens", - "outputs": [ - { - "internalType": "uint256", - "name": "amountETH", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "token", - "type": "address" - }, - { - "internalType": "uint256", - "name": "liquidity", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "amountTokenMin", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "amountETHMin", - "type": "uint256" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "deadline", - "type": "uint256" - }, - { - "internalType": "bool", - "name": "approveMax", - "type": "bool" - }, - { - "internalType": "uint8", - "name": "v", - "type": "uint8" - }, - { - "internalType": "bytes32", - "name": "r", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "s", - "type": "bytes32" - } - ], - "name": "removeLiquidityETHWithPermit", - "outputs": [ - { - "internalType": "uint256", - "name": "amountToken", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "amountETH", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "token", - "type": "address" - }, - { - "internalType": "uint256", - "name": "liquidity", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "amountTokenMin", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "amountETHMin", - "type": "uint256" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "deadline", - "type": "uint256" - }, - { - "internalType": "bool", - "name": "approveMax", - "type": "bool" - }, - { - "internalType": "uint8", - "name": "v", - "type": "uint8" - }, - { - "internalType": "bytes32", - "name": "r", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "s", - "type": "bytes32" - } - ], - "name": "removeLiquidityETHWithPermitSupportingFeeOnTransferTokens", - "outputs": [ - { - "internalType": "uint256", - "name": "amountETH", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "tokenA", - "type": "address" - }, - { - "internalType": "address", - "name": "tokenB", - "type": "address" - }, - { - "internalType": "uint256", - "name": "liquidity", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "amountAMin", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "amountBMin", - "type": "uint256" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "deadline", - "type": "uint256" - }, - { - "internalType": "bool", - "name": "approveMax", - "type": "bool" - }, - { - "internalType": "uint8", - "name": "v", - "type": "uint8" - }, - { - "internalType": "bytes32", - "name": "r", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "s", - "type": "bytes32" - } - ], - "name": "removeLiquidityWithPermit", - "outputs": [ - { - "internalType": "uint256", - "name": "amountA", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "amountB", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "amountOut", - "type": "uint256" - }, - { - "internalType": "address[]", - "name": "path", - "type": "address[]" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "deadline", - "type": "uint256" - } - ], - "name": "swapETHForExactTokens", - "outputs": [ - { - "internalType": "uint256[]", - "name": "amounts", - "type": "uint256[]" - } - ], - "stateMutability": "payable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "amountOutMin", - "type": "uint256" - }, - { - "internalType": "address[]", - "name": "path", - "type": "address[]" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "deadline", - "type": "uint256" - } - ], - "name": "swapExactETHForTokens", - "outputs": [ - { - "internalType": "uint256[]", - "name": "amounts", - "type": "uint256[]" - } - ], - "stateMutability": "payable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "amountOutMin", - "type": "uint256" - }, - { - "internalType": "address[]", - "name": "path", - "type": "address[]" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "deadline", - "type": "uint256" - } - ], - "name": "swapExactETHForTokensSupportingFeeOnTransferTokens", - "outputs": [], - "stateMutability": "payable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "amountIn", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "amountOutMin", - "type": "uint256" - }, - { - "internalType": "address[]", - "name": "path", - "type": "address[]" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "deadline", - "type": "uint256" - } - ], - "name": "swapExactTokensForETH", - "outputs": [ - { - "internalType": "uint256[]", - "name": "amounts", - "type": "uint256[]" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "amountIn", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "amountOutMin", - "type": "uint256" - }, - { - "internalType": "address[]", - "name": "path", - "type": "address[]" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "deadline", - "type": "uint256" - } - ], - "name": "swapExactTokensForETHSupportingFeeOnTransferTokens", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "amountIn", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "amountOutMin", - "type": "uint256" - }, - { - "internalType": "address[]", - "name": "path", - "type": "address[]" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "deadline", - "type": "uint256" - } - ], - "name": "swapExactTokensForTokens", - "outputs": [ - { - "internalType": "uint256[]", - "name": "amounts", - "type": "uint256[]" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "amountIn", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "amountOutMin", - "type": "uint256" - }, - { - "internalType": "address[]", - "name": "path", - "type": "address[]" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "deadline", - "type": "uint256" - } - ], - "name": "swapExactTokensForTokensSupportingFeeOnTransferTokens", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "amountOut", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "amountInMax", - "type": "uint256" - }, - { - "internalType": "address[]", - "name": "path", - "type": "address[]" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "deadline", - "type": "uint256" - } - ], - "name": "swapTokensForExactETH", - "outputs": [ - { - "internalType": "uint256[]", - "name": "amounts", - "type": "uint256[]" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "amountOut", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "amountInMax", - "type": "uint256" - }, - { - "internalType": "address[]", - "name": "path", - "type": "address[]" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "deadline", - "type": "uint256" - } - ], - "name": "swapTokensForExactTokens", - "outputs": [ - { - "internalType": "uint256[]", - "name": "amounts", - "type": "uint256[]" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "type": "event", - "name": "Swap", - "inputs": [ - { - "type": "address", - "name": "sender", - "indexed": true - }, - { - "type": "uint256", - "name": "amount0In", - "indexed": false - }, - { - "type": "uint256", - "name": "amount1In", - "indexed": false - }, - { - "type": "uint256", - "name": "amount0Out", - "indexed": false - }, - { - "type": "uint256", - "name": "amount1Out", - "indexed": false - }, - { - "type": "address", - "name": "to", - "indexed": true - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "Mint", - "inputs": [ - { - "type": "address", - "name": "sender", - "indexed": true - }, - { - "type": "uint256", - "name": "amount0", - "indexed": false - }, - { - "type": "uint256", - "name": "amount1", - "indexed": false - } - ], - "anonymous": false - }, - { - "stateMutability": "payable", - "type": "receive" - } -] diff --git a/packages/eventindexer/TaikoL1.json b/packages/eventindexer/TaikoL1.json deleted file mode 100644 index d84c004bf37..00000000000 --- a/packages/eventindexer/TaikoL1.json +++ /dev/null @@ -1,2088 +0,0 @@ -[ - { - "type": "receive", - "stateMutability": "payable" - }, - { - "type": "function", - "name": "acceptOwnership", - "inputs": [], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "addressManager", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "getBlock", - "inputs": [ - { - "name": "_blockId", - "type": "uint64", - "internalType": "uint64" - } - ], - "outputs": [ - { - "name": "blk_", - "type": "tuple", - "internalType": "struct TaikoData.Block", - "components": [ - { - "name": "metaHash", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "assignedProver", - "type": "address", - "internalType": "address" - }, - { - "name": "livenessBond", - "type": "uint96", - "internalType": "uint96" - }, - { - "name": "blockId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "proposedAt", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "proposedIn", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "nextTransitionId", - "type": "uint32", - "internalType": "uint32" - }, - { - "name": "verifiedTransitionId", - "type": "uint32", - "internalType": "uint32" - } - ] - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "getConfig", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "tuple", - "internalType": "struct TaikoData.Config", - "components": [ - { - "name": "chainId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "blockMaxProposals", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "blockRingBufferSize", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "maxBlocksToVerifyPerProposal", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "blockMaxGasLimit", - "type": "uint32", - "internalType": "uint32" - }, - { - "name": "livenessBond", - "type": "uint96", - "internalType": "uint96" - }, - { - "name": "blockSyncThreshold", - "type": "uint8", - "internalType": "uint8" - } - ] - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "getStateVariables", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "tuple", - "internalType": "struct TaikoData.SlotA", - "components": [ - { - "name": "genesisHeight", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "genesisTimestamp", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "lastSyncedBlockId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "lastSynecdAt", - "type": "uint64", - "internalType": "uint64" - } - ] - }, - { - "name": "", - "type": "tuple", - "internalType": "struct TaikoData.SlotB", - "components": [ - { - "name": "numBlocks", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "lastVerifiedBlockId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "provingPaused", - "type": "bool", - "internalType": "bool" - }, - { - "name": "__reservedB1", - "type": "uint8", - "internalType": "uint8" - }, - { - "name": "__reservedB2", - "type": "uint16", - "internalType": "uint16" - }, - { - "name": "__reservedB3", - "type": "uint32", - "internalType": "uint32" - }, - { - "name": "lastUnpausedAt", - "type": "uint64", - "internalType": "uint64" - } - ] - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "getTransition", - "inputs": [ - { - "name": "_blockId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "_tid", - "type": "uint32", - "internalType": "uint32" - } - ], - "outputs": [ - { - "name": "", - "type": "tuple", - "internalType": "struct TaikoData.TransitionState", - "components": [ - { - "name": "key", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "blockHash", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "stateRoot", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "prover", - "type": "address", - "internalType": "address" - }, - { - "name": "validityBond", - "type": "uint96", - "internalType": "uint96" - }, - { - "name": "contester", - "type": "address", - "internalType": "address" - }, - { - "name": "contestBond", - "type": "uint96", - "internalType": "uint96" - }, - { - "name": "timestamp", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "tier", - "type": "uint16", - "internalType": "uint16" - }, - { - "name": "__reserved1", - "type": "uint8", - "internalType": "uint8" - } - ] - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "getTransition", - "inputs": [ - { - "name": "_blockId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "_parentHash", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "outputs": [ - { - "name": "", - "type": "tuple", - "internalType": "struct TaikoData.TransitionState", - "components": [ - { - "name": "key", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "blockHash", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "stateRoot", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "prover", - "type": "address", - "internalType": "address" - }, - { - "name": "validityBond", - "type": "uint96", - "internalType": "uint96" - }, - { - "name": "contester", - "type": "address", - "internalType": "address" - }, - { - "name": "contestBond", - "type": "uint96", - "internalType": "uint96" - }, - { - "name": "timestamp", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "tier", - "type": "uint16", - "internalType": "uint16" - }, - { - "name": "__reserved1", - "type": "uint8", - "internalType": "uint8" - } - ] - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "impl", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "inNonReentrant", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "bool", - "internalType": "bool" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "init", - "inputs": [ - { - "name": "_owner", - "type": "address", - "internalType": "address" - }, - { - "name": "_addressManager", - "type": "address", - "internalType": "address" - }, - { - "name": "_genesisBlockHash", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "_toPause", - "type": "bool", - "internalType": "bool" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "init2", - "inputs": [], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "lastUnpausedAt", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "uint64", - "internalType": "uint64" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "owner", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "pause", - "inputs": [], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "pauseProving", - "inputs": [ - { - "name": "_pause", - "type": "bool", - "internalType": "bool" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "paused", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "bool", - "internalType": "bool" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "pendingOwner", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "proposeBlock", - "inputs": [ - { - "name": "_params", - "type": "bytes", - "internalType": "bytes" - }, - { - "name": "_txList", - "type": "bytes", - "internalType": "bytes" - } - ], - "outputs": [ - { - "name": "meta_", - "type": "tuple", - "internalType": "struct TaikoData.BlockMetadata", - "components": [ - { - "name": "l1Hash", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "difficulty", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "blobHash", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "extraData", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "depositsHash", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "coinbase", - "type": "address", - "internalType": "address" - }, - { - "name": "id", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "gasLimit", - "type": "uint32", - "internalType": "uint32" - }, - { - "name": "timestamp", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "l1Height", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "minTier", - "type": "uint16", - "internalType": "uint16" - }, - { - "name": "blobUsed", - "type": "bool", - "internalType": "bool" - }, - { - "name": "parentMetaHash", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "sender", - "type": "address", - "internalType": "address" - } - ] - }, - { - "name": "deposits_", - "type": "tuple[]", - "internalType": "struct TaikoData.EthDeposit[]", - "components": [ - { - "name": "recipient", - "type": "address", - "internalType": "address" - }, - { - "name": "amount", - "type": "uint96", - "internalType": "uint96" - }, - { - "name": "id", - "type": "uint64", - "internalType": "uint64" - } - ] - } - ], - "stateMutability": "payable" - }, - { - "type": "function", - "name": "proveBlock", - "inputs": [ - { - "name": "_blockId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "_input", - "type": "bytes", - "internalType": "bytes" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "proxiableUUID", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "renounceOwnership", - "inputs": [], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "resetGenesisHash", - "inputs": [ - { - "name": "_genesisBlockHash", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "resolve", - "inputs": [ - { - "name": "_chainId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "_name", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "_allowZeroAddress", - "type": "bool", - "internalType": "bool" - } - ], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address payable" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "resolve", - "inputs": [ - { - "name": "_name", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "_allowZeroAddress", - "type": "bool", - "internalType": "bool" - } - ], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address payable" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "slotA", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "tuple", - "internalType": "struct TaikoData.SlotA", - "components": [ - { - "name": "genesisHeight", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "genesisTimestamp", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "lastSyncedBlockId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "lastSynecdAt", - "type": "uint64", - "internalType": "uint64" - } - ] - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "slotB", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "tuple", - "internalType": "struct TaikoData.SlotB", - "components": [ - { - "name": "numBlocks", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "lastVerifiedBlockId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "provingPaused", - "type": "bool", - "internalType": "bool" - }, - { - "name": "__reservedB1", - "type": "uint8", - "internalType": "uint8" - }, - { - "name": "__reservedB2", - "type": "uint16", - "internalType": "uint16" - }, - { - "name": "__reservedB3", - "type": "uint32", - "internalType": "uint32" - }, - { - "name": "lastUnpausedAt", - "type": "uint64", - "internalType": "uint64" - } - ] - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "state", - "inputs": [], - "outputs": [ - { - "name": "__reserve1", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "slotA", - "type": "tuple", - "internalType": "struct TaikoData.SlotA", - "components": [ - { - "name": "genesisHeight", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "genesisTimestamp", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "lastSyncedBlockId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "lastSynecdAt", - "type": "uint64", - "internalType": "uint64" - } - ] - }, - { - "name": "slotB", - "type": "tuple", - "internalType": "struct TaikoData.SlotB", - "components": [ - { - "name": "numBlocks", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "lastVerifiedBlockId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "provingPaused", - "type": "bool", - "internalType": "bool" - }, - { - "name": "__reservedB1", - "type": "uint8", - "internalType": "uint8" - }, - { - "name": "__reservedB2", - "type": "uint16", - "internalType": "uint16" - }, - { - "name": "__reservedB3", - "type": "uint32", - "internalType": "uint32" - }, - { - "name": "lastUnpausedAt", - "type": "uint64", - "internalType": "uint64" - } - ] - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "transferOwnership", - "inputs": [ - { - "name": "newOwner", - "type": "address", - "internalType": "address" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "unpause", - "inputs": [], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "upgradeTo", - "inputs": [ - { - "name": "newImplementation", - "type": "address", - "internalType": "address" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "upgradeToAndCall", - "inputs": [ - { - "name": "newImplementation", - "type": "address", - "internalType": "address" - }, - { - "name": "data", - "type": "bytes", - "internalType": "bytes" - } - ], - "outputs": [], - "stateMutability": "payable" - }, - { - "type": "function", - "name": "verifyBlocks", - "inputs": [ - { - "name": "_maxBlocksToVerify", - "type": "uint64", - "internalType": "uint64" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "event", - "name": "AdminChanged", - "inputs": [ - { - "name": "previousAdmin", - "type": "address", - "indexed": false, - "internalType": "address" - }, - { - "name": "newAdmin", - "type": "address", - "indexed": false, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "BeaconUpgraded", - "inputs": [ - { - "name": "beacon", - "type": "address", - "indexed": true, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "BlockProposed", - "inputs": [ - { - "name": "blockId", - "type": "uint256", - "indexed": true, - "internalType": "uint256" - }, - { - "name": "assignedProver", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "livenessBond", - "type": "uint96", - "indexed": false, - "internalType": "uint96" - }, - { - "name": "meta", - "type": "tuple", - "indexed": false, - "internalType": "struct TaikoData.BlockMetadata", - "components": [ - { - "name": "l1Hash", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "difficulty", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "blobHash", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "extraData", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "depositsHash", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "coinbase", - "type": "address", - "internalType": "address" - }, - { - "name": "id", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "gasLimit", - "type": "uint32", - "internalType": "uint32" - }, - { - "name": "timestamp", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "l1Height", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "minTier", - "type": "uint16", - "internalType": "uint16" - }, - { - "name": "blobUsed", - "type": "bool", - "internalType": "bool" - }, - { - "name": "parentMetaHash", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "sender", - "type": "address", - "internalType": "address" - } - ] - }, - { - "name": "depositsProcessed", - "type": "tuple[]", - "indexed": false, - "internalType": "struct TaikoData.EthDeposit[]", - "components": [ - { - "name": "recipient", - "type": "address", - "internalType": "address" - }, - { - "name": "amount", - "type": "uint96", - "internalType": "uint96" - }, - { - "name": "id", - "type": "uint64", - "internalType": "uint64" - } - ] - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "BlockProposed", - "inputs": [ - { - "name": "blockId", - "type": "uint256", - "indexed": true, - "internalType": "uint256" - }, - { - "name": "assignedProver", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "livenessBond", - "type": "uint96", - "indexed": false, - "internalType": "uint96" - }, - { - "name": "meta", - "type": "tuple", - "indexed": false, - "internalType": "struct TaikoData.BlockMetadata", - "components": [ - { - "name": "l1Hash", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "difficulty", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "blobHash", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "extraData", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "depositsHash", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "coinbase", - "type": "address", - "internalType": "address" - }, - { - "name": "id", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "gasLimit", - "type": "uint32", - "internalType": "uint32" - }, - { - "name": "timestamp", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "l1Height", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "minTier", - "type": "uint16", - "internalType": "uint16" - }, - { - "name": "blobUsed", - "type": "bool", - "internalType": "bool" - }, - { - "name": "parentMetaHash", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "sender", - "type": "address", - "internalType": "address" - } - ] - }, - { - "name": "depositsProcessed", - "type": "tuple[]", - "indexed": false, - "internalType": "struct TaikoData.EthDeposit[]", - "components": [ - { - "name": "recipient", - "type": "address", - "internalType": "address" - }, - { - "name": "amount", - "type": "uint96", - "internalType": "uint96" - }, - { - "name": "id", - "type": "uint64", - "internalType": "uint64" - } - ] - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "BlockVerified", - "inputs": [ - { - "name": "blockId", - "type": "uint256", - "indexed": true, - "internalType": "uint256" - }, - { - "name": "prover", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "blockHash", - "type": "bytes32", - "indexed": false, - "internalType": "bytes32" - }, - { - "name": "stateRoot", - "type": "bytes32", - "indexed": false, - "internalType": "bytes32" - }, - { - "name": "tier", - "type": "uint16", - "indexed": false, - "internalType": "uint16" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "BlockVerified", - "inputs": [ - { - "name": "blockId", - "type": "uint256", - "indexed": true, - "internalType": "uint256" - }, - { - "name": "prover", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "blockHash", - "type": "bytes32", - "indexed": false, - "internalType": "bytes32" - }, - { - "name": "stateRoot", - "type": "bytes32", - "indexed": false, - "internalType": "bytes32" - }, - { - "name": "tier", - "type": "uint16", - "indexed": false, - "internalType": "uint16" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "Initialized", - "inputs": [ - { - "name": "version", - "type": "uint8", - "indexed": false, - "internalType": "uint8" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "OwnershipTransferStarted", - "inputs": [ - { - "name": "previousOwner", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "newOwner", - "type": "address", - "indexed": true, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "OwnershipTransferred", - "inputs": [ - { - "name": "previousOwner", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "newOwner", - "type": "address", - "indexed": true, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "Paused", - "inputs": [ - { - "name": "account", - "type": "address", - "indexed": false, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "ProvingPaused", - "inputs": [ - { - "name": "paused", - "type": "bool", - "indexed": false, - "internalType": "bool" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "ProvingPaused", - "inputs": [ - { - "name": "paused", - "type": "bool", - "indexed": false, - "internalType": "bool" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "StateVariablesUpdated", - "inputs": [ - { - "name": "slotB", - "type": "tuple", - "indexed": false, - "internalType": "struct TaikoData.SlotB", - "components": [ - { - "name": "numBlocks", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "lastVerifiedBlockId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "provingPaused", - "type": "bool", - "internalType": "bool" - }, - { - "name": "__reservedB1", - "type": "uint8", - "internalType": "uint8" - }, - { - "name": "__reservedB2", - "type": "uint16", - "internalType": "uint16" - }, - { - "name": "__reservedB3", - "type": "uint32", - "internalType": "uint32" - }, - { - "name": "lastUnpausedAt", - "type": "uint64", - "internalType": "uint64" - } - ] - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "StateVariablesUpdated", - "inputs": [ - { - "name": "slotB", - "type": "tuple", - "indexed": false, - "internalType": "struct TaikoData.SlotB", - "components": [ - { - "name": "numBlocks", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "lastVerifiedBlockId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "provingPaused", - "type": "bool", - "internalType": "bool" - }, - { - "name": "__reservedB1", - "type": "uint8", - "internalType": "uint8" - }, - { - "name": "__reservedB2", - "type": "uint16", - "internalType": "uint16" - }, - { - "name": "__reservedB3", - "type": "uint32", - "internalType": "uint32" - }, - { - "name": "lastUnpausedAt", - "type": "uint64", - "internalType": "uint64" - } - ] - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "TransitionContested", - "inputs": [ - { - "name": "blockId", - "type": "uint256", - "indexed": true, - "internalType": "uint256" - }, - { - "name": "tran", - "type": "tuple", - "indexed": false, - "internalType": "struct TaikoData.Transition", - "components": [ - { - "name": "parentHash", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "blockHash", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "stateRoot", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "graffiti", - "type": "bytes32", - "internalType": "bytes32" - } - ] - }, - { - "name": "contester", - "type": "address", - "indexed": false, - "internalType": "address" - }, - { - "name": "contestBond", - "type": "uint96", - "indexed": false, - "internalType": "uint96" - }, - { - "name": "tier", - "type": "uint16", - "indexed": false, - "internalType": "uint16" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "TransitionContested", - "inputs": [ - { - "name": "blockId", - "type": "uint256", - "indexed": true, - "internalType": "uint256" - }, - { - "name": "tran", - "type": "tuple", - "indexed": false, - "internalType": "struct TaikoData.Transition", - "components": [ - { - "name": "parentHash", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "blockHash", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "stateRoot", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "graffiti", - "type": "bytes32", - "internalType": "bytes32" - } - ] - }, - { - "name": "contester", - "type": "address", - "indexed": false, - "internalType": "address" - }, - { - "name": "contestBond", - "type": "uint96", - "indexed": false, - "internalType": "uint96" - }, - { - "name": "tier", - "type": "uint16", - "indexed": false, - "internalType": "uint16" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "TransitionProved", - "inputs": [ - { - "name": "blockId", - "type": "uint256", - "indexed": true, - "internalType": "uint256" - }, - { - "name": "tran", - "type": "tuple", - "indexed": false, - "internalType": "struct TaikoData.Transition", - "components": [ - { - "name": "parentHash", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "blockHash", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "stateRoot", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "graffiti", - "type": "bytes32", - "internalType": "bytes32" - } - ] - }, - { - "name": "prover", - "type": "address", - "indexed": false, - "internalType": "address" - }, - { - "name": "validityBond", - "type": "uint96", - "indexed": false, - "internalType": "uint96" - }, - { - "name": "tier", - "type": "uint16", - "indexed": false, - "internalType": "uint16" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "TransitionProved", - "inputs": [ - { - "name": "blockId", - "type": "uint256", - "indexed": true, - "internalType": "uint256" - }, - { - "name": "tran", - "type": "tuple", - "indexed": false, - "internalType": "struct TaikoData.Transition", - "components": [ - { - "name": "parentHash", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "blockHash", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "stateRoot", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "graffiti", - "type": "bytes32", - "internalType": "bytes32" - } - ] - }, - { - "name": "prover", - "type": "address", - "indexed": false, - "internalType": "address" - }, - { - "name": "validityBond", - "type": "uint96", - "indexed": false, - "internalType": "uint96" - }, - { - "name": "tier", - "type": "uint16", - "indexed": false, - "internalType": "uint16" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "Unpaused", - "inputs": [ - { - "name": "account", - "type": "address", - "indexed": false, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "Upgraded", - "inputs": [ - { - "name": "implementation", - "type": "address", - "indexed": true, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "error", - "name": "ETH_TRANSFER_FAILED", - "inputs": [] - }, - { - "type": "error", - "name": "FUNC_NOT_IMPLEMENTED", - "inputs": [] - }, - { - "type": "error", - "name": "INVALID_PAUSE_STATUS", - "inputs": [] - }, - { - "type": "error", - "name": "L1_ALREADY_CONTESTED", - "inputs": [] - }, - { - "type": "error", - "name": "L1_ALREADY_CONTESTED", - "inputs": [] - }, - { - "type": "error", - "name": "L1_ALREADY_PROVED", - "inputs": [] - }, - { - "type": "error", - "name": "L1_ALREADY_PROVED", - "inputs": [] - }, - { - "type": "error", - "name": "L1_BLOB_NOT_AVAILABLE", - "inputs": [] - }, - { - "type": "error", - "name": "L1_BLOB_NOT_AVAILABLE", - "inputs": [] - }, - { - "type": "error", - "name": "L1_BLOB_NOT_FOUND", - "inputs": [] - }, - { - "type": "error", - "name": "L1_BLOB_NOT_FOUND", - "inputs": [] - }, - { - "type": "error", - "name": "L1_BLOCK_MISMATCH", - "inputs": [] - }, - { - "type": "error", - "name": "L1_BLOCK_MISMATCH", - "inputs": [] - }, - { - "type": "error", - "name": "L1_BLOCK_MISMATCH", - "inputs": [] - }, - { - "type": "error", - "name": "L1_CANNOT_CONTEST", - "inputs": [] - }, - { - "type": "error", - "name": "L1_CANNOT_CONTEST", - "inputs": [] - }, - { - "type": "error", - "name": "L1_INVALID_BLOCK_ID", - "inputs": [] - }, - { - "type": "error", - "name": "L1_INVALID_BLOCK_ID", - "inputs": [] - }, - { - "type": "error", - "name": "L1_INVALID_BLOCK_ID", - "inputs": [] - }, - { - "type": "error", - "name": "L1_INVALID_CONFIG", - "inputs": [] - }, - { - "type": "error", - "name": "L1_INVALID_CONFIG", - "inputs": [] - }, - { - "type": "error", - "name": "L1_INVALID_GENESIS_HASH", - "inputs": [] - }, - { - "type": "error", - "name": "L1_INVALID_GENESIS_HASH", - "inputs": [] - }, - { - "type": "error", - "name": "L1_INVALID_HOOK", - "inputs": [] - }, - { - "type": "error", - "name": "L1_INVALID_HOOK", - "inputs": [] - }, - { - "type": "error", - "name": "L1_INVALID_PARAM", - "inputs": [] - }, - { - "type": "error", - "name": "L1_INVALID_PAUSE_STATUS", - "inputs": [] - }, - { - "type": "error", - "name": "L1_INVALID_PAUSE_STATUS", - "inputs": [] - }, - { - "type": "error", - "name": "L1_INVALID_PROVER", - "inputs": [] - }, - { - "type": "error", - "name": "L1_INVALID_PROVER", - "inputs": [] - }, - { - "type": "error", - "name": "L1_INVALID_SIG", - "inputs": [] - }, - { - "type": "error", - "name": "L1_INVALID_SIG", - "inputs": [] - }, - { - "type": "error", - "name": "L1_INVALID_TIER", - "inputs": [] - }, - { - "type": "error", - "name": "L1_INVALID_TIER", - "inputs": [] - }, - { - "type": "error", - "name": "L1_INVALID_TRANSITION", - "inputs": [] - }, - { - "type": "error", - "name": "L1_INVALID_TRANSITION", - "inputs": [] - }, - { - "type": "error", - "name": "L1_LIVENESS_BOND_NOT_RECEIVED", - "inputs": [] - }, - { - "type": "error", - "name": "L1_LIVENESS_BOND_NOT_RECEIVED", - "inputs": [] - }, - { - "type": "error", - "name": "L1_NOT_ASSIGNED_PROVER", - "inputs": [] - }, - { - "type": "error", - "name": "L1_NOT_ASSIGNED_PROVER", - "inputs": [] - }, - { - "type": "error", - "name": "L1_PROVING_PAUSED", - "inputs": [] - }, - { - "type": "error", - "name": "L1_RECEIVE_DISABLED", - "inputs": [] - }, - { - "type": "error", - "name": "L1_TOO_LATE", - "inputs": [] - }, - { - "type": "error", - "name": "L1_TOO_LATE", - "inputs": [] - }, - { - "type": "error", - "name": "L1_TOO_MANY_BLOCKS", - "inputs": [] - }, - { - "type": "error", - "name": "L1_TOO_MANY_BLOCKS", - "inputs": [] - }, - { - "type": "error", - "name": "L1_TRANSITION_ID_ZERO", - "inputs": [] - }, - { - "type": "error", - "name": "L1_TRANSITION_ID_ZERO", - "inputs": [] - }, - { - "type": "error", - "name": "L1_TRANSITION_NOT_FOUND", - "inputs": [] - }, - { - "type": "error", - "name": "L1_TRANSITION_NOT_FOUND", - "inputs": [] - }, - { - "type": "error", - "name": "L1_UNAUTHORIZED", - "inputs": [] - }, - { - "type": "error", - "name": "L1_UNAUTHORIZED", - "inputs": [] - }, - { - "type": "error", - "name": "L1_UNEXPECTED_PARENT", - "inputs": [] - }, - { - "type": "error", - "name": "L1_UNEXPECTED_PARENT", - "inputs": [] - }, - { - "type": "error", - "name": "L1_UNEXPECTED_TRANSITION_ID", - "inputs": [] - }, - { - "type": "error", - "name": "L1_UNEXPECTED_TRANSITION_ID", - "inputs": [] - }, - { - "type": "error", - "name": "REENTRANT_CALL", - "inputs": [] - }, - { - "type": "error", - "name": "RESOLVER_DENIED", - "inputs": [] - }, - { - "type": "error", - "name": "RESOLVER_INVALID_MANAGER", - "inputs": [] - }, - { - "type": "error", - "name": "RESOLVER_UNEXPECTED_CHAINID", - "inputs": [] - }, - { - "type": "error", - "name": "RESOLVER_ZERO_ADDR", - "inputs": [ - { - "name": "chainId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "name", - "type": "bytes32", - "internalType": "bytes32" - } - ] - }, - { - "type": "error", - "name": "ZERO_ADDRESS", - "inputs": [] - }, - { - "type": "error", - "name": "ZERO_VALUE", - "inputs": [] - } -] diff --git a/packages/eventindexer/TaikoToken.json b/packages/eventindexer/TaikoToken.json deleted file mode 100644 index 8dad17e504a..00000000000 --- a/packages/eventindexer/TaikoToken.json +++ /dev/null @@ -1,1084 +0,0 @@ -[ - { - "type": "function", - "name": "CLOCK_MODE", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "string", - "internalType": "string" - } - ], - "stateMutability": "pure" - }, - { - "type": "function", - "name": "DOMAIN_SEPARATOR", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "acceptOwnership", - "inputs": [], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "addressManager", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "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": "checkpoints", - "inputs": [ - { - "name": "account", - "type": "address", - "internalType": "address" - }, - { - "name": "pos", - "type": "uint32", - "internalType": "uint32" - } - ], - "outputs": [ - { - "name": "", - "type": "tuple", - "internalType": "struct ERC20VotesUpgradeable.Checkpoint", - "components": [ - { - "name": "fromBlock", - "type": "uint32", - "internalType": "uint32" - }, - { - "name": "votes", - "type": "uint224", - "internalType": "uint224" - } - ] - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "clock", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "uint48", - "internalType": "uint48" - } - ], - "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": "delegate", - "inputs": [ - { - "name": "delegatee", - "type": "address", - "internalType": "address" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "delegateBySig", - "inputs": [ - { - "name": "delegatee", - "type": "address", - "internalType": "address" - }, - { - "name": "nonce", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "expiry", - "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": "delegates", - "inputs": [ - { - "name": "account", - "type": "address", - "internalType": "address" - } - ], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "eip712Domain", - "inputs": [], - "outputs": [ - { - "name": "fields", - "type": "bytes1", - "internalType": "bytes1" - }, - { - "name": "name", - "type": "string", - "internalType": "string" - }, - { - "name": "version", - "type": "string", - "internalType": "string" - }, - { - "name": "chainId", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "verifyingContract", - "type": "address", - "internalType": "address" - }, - { - "name": "salt", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "extensions", - "type": "uint256[]", - "internalType": "uint256[]" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "getPastTotalSupply", - "inputs": [ - { - "name": "timepoint", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "getPastVotes", - "inputs": [ - { - "name": "account", - "type": "address", - "internalType": "address" - }, - { - "name": "timepoint", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "getVotes", - "inputs": [ - { - "name": "account", - "type": "address", - "internalType": "address" - } - ], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "impl", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "inNonReentrant", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "bool", - "internalType": "bool" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "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": "init", - "inputs": [ - { - "name": "_owner", - "type": "address", - "internalType": "address" - }, - { - "name": "_recipient", - "type": "address", - "internalType": "address" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "lastUnpausedAt", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "uint64", - "internalType": "uint64" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "name", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "string", - "internalType": "string" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "nonces", - "inputs": [ - { - "name": "owner", - "type": "address", - "internalType": "address" - } - ], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "numCheckpoints", - "inputs": [ - { - "name": "account", - "type": "address", - "internalType": "address" - } - ], - "outputs": [ - { - "name": "", - "type": "uint32", - "internalType": "uint32" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "owner", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "pause", - "inputs": [], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "paused", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "bool", - "internalType": "bool" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "pendingOwner", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "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": "proxiableUUID", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "renounceOwnership", - "inputs": [], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "resolve", - "inputs": [ - { - "name": "_chainId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "_name", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "_allowZeroAddress", - "type": "bool", - "internalType": "bool" - } - ], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address payable" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "resolve", - "inputs": [ - { - "name": "_name", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "_allowZeroAddress", - "type": "bool", - "internalType": "bool" - } - ], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address payable" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "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": "transferOwnership", - "inputs": [ - { - "name": "newOwner", - "type": "address", - "internalType": "address" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "unpause", - "inputs": [], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "upgradeTo", - "inputs": [ - { - "name": "newImplementation", - "type": "address", - "internalType": "address" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "upgradeToAndCall", - "inputs": [ - { - "name": "newImplementation", - "type": "address", - "internalType": "address" - }, - { - "name": "data", - "type": "bytes", - "internalType": "bytes" - } - ], - "outputs": [], - "stateMutability": "payable" - }, - { - "type": "event", - "name": "AdminChanged", - "inputs": [ - { - "name": "previousAdmin", - "type": "address", - "indexed": false, - "internalType": "address" - }, - { - "name": "newAdmin", - "type": "address", - "indexed": false, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "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": "BeaconUpgraded", - "inputs": [ - { - "name": "beacon", - "type": "address", - "indexed": true, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "DelegateChanged", - "inputs": [ - { - "name": "delegator", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "fromDelegate", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "toDelegate", - "type": "address", - "indexed": true, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "DelegateVotesChanged", - "inputs": [ - { - "name": "delegate", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "previousBalance", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - }, - { - "name": "newBalance", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "EIP712DomainChanged", - "inputs": [], - "anonymous": false - }, - { - "type": "event", - "name": "Initialized", - "inputs": [ - { - "name": "version", - "type": "uint8", - "indexed": false, - "internalType": "uint8" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "OwnershipTransferStarted", - "inputs": [ - { - "name": "previousOwner", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "newOwner", - "type": "address", - "indexed": true, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "OwnershipTransferred", - "inputs": [ - { - "name": "previousOwner", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "newOwner", - "type": "address", - "indexed": true, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "Paused", - "inputs": [ - { - "name": "account", - "type": "address", - "indexed": false, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "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 - }, - { - "type": "event", - "name": "Unpaused", - "inputs": [ - { - "name": "account", - "type": "address", - "indexed": false, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "Upgraded", - "inputs": [ - { - "name": "implementation", - "type": "address", - "indexed": true, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "error", - "name": "FUNC_NOT_IMPLEMENTED", - "inputs": [] - }, - { - "type": "error", - "name": "INVALID_PAUSE_STATUS", - "inputs": [] - }, - { - "type": "error", - "name": "REENTRANT_CALL", - "inputs": [] - }, - { - "type": "error", - "name": "RESOLVER_DENIED", - "inputs": [] - }, - { - "type": "error", - "name": "RESOLVER_INVALID_MANAGER", - "inputs": [] - }, - { - "type": "error", - "name": "RESOLVER_UNEXPECTED_CHAINID", - "inputs": [] - }, - { - "type": "error", - "name": "RESOLVER_ZERO_ADDR", - "inputs": [ - { - "name": "chainId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "name", - "type": "bytes32", - "internalType": "bytes32" - } - ] - }, - { - "type": "error", - "name": "ZERO_ADDRESS", - "inputs": [] - }, - { - "type": "error", - "name": "ZERO_VALUE", - "inputs": [] - } -] diff --git a/packages/eventindexer/api/api.go b/packages/eventindexer/api/api.go index 9fe005eca40..7e156b55572 100644 --- a/packages/eventindexer/api/api.go +++ b/packages/eventindexer/api/api.go @@ -9,12 +9,16 @@ import ( "github.com/ethereum/go-ethereum/ethclient" "github.com/labstack/echo/v4" + "github.com/urfave/cli/v2" + + "github.com/taikoxyz/taiko-mono/packages/eventindexer/pkg/db" "github.com/taikoxyz/taiko-mono/packages/eventindexer/pkg/http" "github.com/taikoxyz/taiko-mono/packages/eventindexer/pkg/repo" - "github.com/urfave/cli/v2" ) type API struct { + db db.DB + httpPort uint64 srv *http.Server @@ -67,23 +71,30 @@ func InitFromConfig(ctx context.Context, api *API, cfg *Config) error { return err } + erc20BalanceRepository, err := repo.NewERC20BalanceRepository(db) + if err != nil { + return err + } + ethClient, err := ethclient.Dial(cfg.RPCUrl) if err != nil { return err } srv, err := http.NewServer(http.NewServerOpts{ - EventRepo: eventRepository, - NFTBalanceRepo: nftBalanceRepository, - ChartRepo: chartRepository, - Echo: echo.New(), - CorsOrigins: cfg.CORSOrigins, - EthClient: ethClient, + EventRepo: eventRepository, + NFTBalanceRepo: nftBalanceRepository, + ERC20BalanceRepo: erc20BalanceRepository, + ChartRepo: chartRepository, + Echo: echo.New(), + CorsOrigins: cfg.CORSOrigins, + EthClient: ethClient, }) if err != nil { return err } + api.db = db api.srv = srv api.httpPort = cfg.HTTPPort @@ -94,4 +105,9 @@ func (api *API) Close(ctx context.Context) { if err := api.srv.Shutdown(ctx); err != nil { slog.Error("srv shutdown", "error", err) } + + // Close db connection. + if err := api.db.Close(); err != nil { + slog.Error("Failed to close db connection", "err", err) + } } diff --git a/packages/eventindexer/api/config.go b/packages/eventindexer/api/config.go index 430f12d37f9..b407f711cfe 100644 --- a/packages/eventindexer/api/config.go +++ b/packages/eventindexer/api/config.go @@ -1,21 +1,16 @@ package api import ( - "database/sql" "strings" - "github.com/taikoxyz/taiko-mono/packages/eventindexer/cmd/flags" - "github.com/taikoxyz/taiko-mono/packages/eventindexer/pkg/db" "github.com/urfave/cli/v2" "gorm.io/driver/mysql" "gorm.io/gorm" "gorm.io/gorm/logger" -) -type DB interface { - DB() (*sql.DB, error) - GormDB() *gorm.DB -} + "github.com/taikoxyz/taiko-mono/packages/eventindexer/cmd/flags" + "github.com/taikoxyz/taiko-mono/packages/eventindexer/pkg/db" +) type Config struct { // db configs @@ -31,7 +26,7 @@ type Config struct { MetricsHTTPPort uint64 ETHClientTimeout uint64 CORSOrigins []string - OpenDBFunc func() (DB, error) + OpenDBFunc func() (db.DB, error) } // NewConfigFromCliContext creates a new config instance from command line flags. @@ -52,7 +47,7 @@ func NewConfigFromCliContext(c *cli.Context) (*Config, error) { MetricsHTTPPort: c.Uint64(flags.MetricsHTTPPort.Name), CORSOrigins: cors, RPCUrl: c.String(flags.APIRPCUrl.Name), - OpenDBFunc: func() (DB, error) { + OpenDBFunc: func() (db.DB, error) { return db.OpenDBConnection(db.DBConnectionOpts{ Name: c.String(flags.DatabaseUsername.Name), Password: c.String(flags.DatabasePassword.Name), @@ -61,7 +56,7 @@ func NewConfigFromCliContext(c *cli.Context) (*Config, error) { MaxIdleConns: c.Uint64(flags.DatabaseMaxIdleConns.Name), MaxOpenConns: c.Uint64(flags.DatabaseMaxOpenConns.Name), MaxConnLifetime: c.Uint64(flags.DatabaseConnMaxLifetime.Name), - OpenFunc: func(dsn string) (*db.DB, error) { + OpenFunc: func(dsn string) (db.DB, error) { gormDB, err := gorm.Open(mysql.Open(dsn), &gorm.Config{ Logger: logger.Default.LogMode(logger.Silent), }) diff --git a/packages/eventindexer/cmd/flags/common.go b/packages/eventindexer/cmd/flags/common.go index a9a1a258fd5..4b3f0056a47 100644 --- a/packages/eventindexer/cmd/flags/common.go +++ b/packages/eventindexer/cmd/flags/common.go @@ -5,10 +5,9 @@ import ( ) var ( - commonCategory = "COMMON" - indexerCategory = "INDEXER" - generatorCategory = "GENERATOR" - txmgrCategory = "TX_MANAGER" + commonCategory = "COMMON" + indexerCategory = "INDEXER" + txmgrCategory = "TX_MANAGER" ) var ( diff --git a/packages/eventindexer/cmd/flags/generator.go b/packages/eventindexer/cmd/flags/generator.go deleted file mode 100644 index 9f9f4988ee0..00000000000 --- a/packages/eventindexer/cmd/flags/generator.go +++ /dev/null @@ -1,24 +0,0 @@ -package flags - -import "github.com/urfave/cli/v2" - -var ( - GenesisDate = &cli.StringFlag{ - Name: "genesisDate", - Usage: "Genesis date to start generating data from, YYYY-MM-DD", - Required: true, - Category: generatorCategory, - EnvVars: []string{"GENESIS_DATE"}, - } - Regenerate = &cli.StringFlag{ - Name: "regenerate", - Usage: "True to delete all existing data and regenerate from genesis, false to not", - Required: false, - Category: generatorCategory, - EnvVars: []string{"REGENERATE"}, - } -) -var GeneratorFlags = MergeFlags(CommonFlags, []cli.Flag{ - GenesisDate, - Regenerate, -}) diff --git a/packages/eventindexer/cmd/flags/indexer.go b/packages/eventindexer/cmd/flags/indexer.go index 687ca449dbd..b41d929dd0a 100644 --- a/packages/eventindexer/cmd/flags/indexer.go +++ b/packages/eventindexer/cmd/flags/indexer.go @@ -37,13 +37,6 @@ var ( Category: indexerCategory, EnvVars: []string{"BRIDGE_ADDRESS"}, } - AssignmentHookAddress = &cli.StringFlag{ - Name: "assignmentHookAddress", - Usage: "Address of the AssignmentHook contract", - Required: false, - Category: indexerCategory, - EnvVars: []string{"ASSIGNMENT_HOOK_ADDRESS"}, - } BlockBatchSize = &cli.Uint64Flag{ Name: "blockBatchSize", Usage: "Block batch size when iterating through blocks", @@ -74,6 +67,20 @@ var ( Category: indexerCategory, EnvVars: []string{"INDEX_NFTS"}, } + IndexERC20s = &cli.BoolFlag{ + Name: "indexERC20s", + Usage: "Whether to index erc20 transfer events or not", + Required: false, + Category: indexerCategory, + EnvVars: []string{"INDEX_ERC20S"}, + } + OntakeForkHeight = &cli.Uint64Flag{ + Name: "ontakeForkHeight", + Usage: "Block number ontake fork height happened", + Value: 21134698, + Category: indexerCategory, + EnvVars: []string{"ONTAKE_FORK_HEIGHT"}, + } ) var IndexerFlags = MergeFlags(CommonFlags, []cli.Flag{ @@ -82,9 +89,10 @@ var IndexerFlags = MergeFlags(CommonFlags, []cli.Flag{ ETHClientTimeout, L1TaikoAddress, BridgeAddress, - AssignmentHookAddress, BlockBatchSize, SubscriptionBackoff, SyncMode, IndexNFTs, + IndexERC20s, + OntakeForkHeight, }) diff --git a/packages/eventindexer/cmd/main.go b/packages/eventindexer/cmd/main.go index fac9c636791..f8749ba109a 100644 --- a/packages/eventindexer/cmd/main.go +++ b/packages/eventindexer/cmd/main.go @@ -9,7 +9,6 @@ import ( "github.com/taikoxyz/taiko-mono/packages/eventindexer/api" "github.com/taikoxyz/taiko-mono/packages/eventindexer/cmd/flags" "github.com/taikoxyz/taiko-mono/packages/eventindexer/cmd/utils" - "github.com/taikoxyz/taiko-mono/packages/eventindexer/generator" "github.com/taikoxyz/taiko-mono/packages/eventindexer/indexer" "github.com/urfave/cli/v2" ) @@ -51,13 +50,6 @@ func main() { Description: "Taiko indexer software", Action: utils.SubcommandAction(new(indexer.Indexer)), }, - { - Name: "generator", - Flags: flags.GeneratorFlags, - Usage: "Starts the generator software", - Description: "Taiko time-series data generator", - Action: utils.SubcommandAction(new(generator.Generator)), - }, } if err := app.Run(os.Args); err != nil { diff --git a/packages/eventindexer/contracts/assignmenthook/AssignmentHook.go b/packages/eventindexer/contracts/assignmenthook/AssignmentHook.go deleted file mode 100644 index 6c2c584dac2..00000000000 --- a/packages/eventindexer/contracts/assignmenthook/AssignmentHook.go +++ /dev/null @@ -1,2202 +0,0 @@ -// Code generated - DO NOT EDIT. -// This file is a generated binding and any manual changes will be lost. - -package assignmenthook - -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 -) - -// AssignmentHookProverAssignment is an auto generated low-level Go binding around an user-defined struct. -type AssignmentHookProverAssignment struct { - FeeToken common.Address - Expiry uint64 - MaxBlockId uint64 - MaxProposedIn uint64 - MetaHash [32]byte - ParentMetaHash [32]byte - TierFees []TaikoDataTierFee - Signature []byte -} - -// TaikoDataBlock is an auto generated low-level Go binding around an user-defined struct. -type TaikoDataBlock struct { - MetaHash [32]byte - AssignedProver common.Address - LivenessBond *big.Int - BlockId uint64 - ProposedAt uint64 - ProposedIn uint64 - NextTransitionId uint32 - VerifiedTransitionId uint32 -} - -// TaikoDataBlockMetadata is an auto generated low-level Go binding around an user-defined struct. -type TaikoDataBlockMetadata struct { - L1Hash [32]byte - Difficulty [32]byte - BlobHash [32]byte - ExtraData [32]byte - DepositsHash [32]byte - Coinbase common.Address - Id uint64 - GasLimit uint32 - Timestamp uint64 - L1Height uint64 - MinTier uint16 - BlobUsed bool - ParentMetaHash [32]byte - Sender common.Address -} - -// TaikoDataTierFee is an auto generated low-level Go binding around an user-defined struct. -type TaikoDataTierFee struct { - Tier uint16 - Fee *big.Int -} - -// AssignmentHookMetaData contains all meta data concerning the AssignmentHook contract. -var AssignmentHookMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"function\",\"name\":\"MAX_GAS_PAYING_PROVER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addressManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"hashAssignment\",\"inputs\":[{\"name\":\"_assignment\",\"type\":\"tuple\",\"internalType\":\"structAssignmentHook.ProverAssignment\",\"components\":[{\"name\":\"feeToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"expiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxProposedIn\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"metaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"parentMetaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"tierFees\",\"type\":\"tuple[]\",\"internalType\":\"structTaikoData.TierFee[]\",\"components\":[{\"name\":\"tier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"fee\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"_taikoL1Address\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_blockProposer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_assignedProver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_blobHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"impl\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"inNonReentrant\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"init\",\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_addressManager\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"onBlockProposed\",\"inputs\":[{\"name\":\"_blk\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.Block\",\"components\":[{\"name\":\"metaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"assignedProver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"livenessBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"proposedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"proposedIn\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nextTransitionId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"verifiedTransitionId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"_meta\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.BlockMetadata\",\"components\":[{\"name\":\"l1Hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"difficulty\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blobHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"extraData\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"depositsHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"coinbase\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"l1Height\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minTier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"blobUsed\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"parentMetaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"_data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeTo\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"event\",\"name\":\"AdminChanged\",\"inputs\":[{\"name\":\"previousAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconUpgraded\",\"inputs\":[{\"name\":\"beacon\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BlockAssigned\",\"inputs\":[{\"name\":\"assignedProver\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"meta\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.BlockMetadata\",\"components\":[{\"name\":\"l1Hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"difficulty\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blobHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"extraData\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"depositsHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"coinbase\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"l1Height\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minTier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"blobUsed\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"parentMetaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"assignment\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structAssignmentHook.ProverAssignment\",\"components\":[{\"name\":\"feeToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"expiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxProposedIn\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"metaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"parentMetaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"tierFees\",\"type\":\"tuple[]\",\"internalType\":\"structTaikoData.TierFee[]\",\"components\":[{\"name\":\"tier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"fee\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"EtherPaymentFailed\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"maxGas\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"ETH_TRANSFER_FAILED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FUNC_NOT_IMPLEMENTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"HOOK_ASSIGNMENT_EXPIRED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"HOOK_ASSIGNMENT_INVALID_SIG\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"HOOK_TIER_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"REENTRANT_CALL\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_INVALID_MANAGER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_UNEXPECTED_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_ZERO_ADDR\",\"inputs\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ZERO_ADDRESS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_VALUE\",\"inputs\":[]}]", -} - -// AssignmentHookABI is the input ABI used to generate the binding from. -// Deprecated: Use AssignmentHookMetaData.ABI instead. -var AssignmentHookABI = AssignmentHookMetaData.ABI - -// AssignmentHook is an auto generated Go binding around an Ethereum contract. -type AssignmentHook struct { - AssignmentHookCaller // Read-only binding to the contract - AssignmentHookTransactor // Write-only binding to the contract - AssignmentHookFilterer // Log filterer for contract events -} - -// AssignmentHookCaller is an auto generated read-only Go binding around an Ethereum contract. -type AssignmentHookCaller struct { - contract *bind.BoundContract // Generic contract wrapper for the low level calls -} - -// AssignmentHookTransactor is an auto generated write-only Go binding around an Ethereum contract. -type AssignmentHookTransactor struct { - contract *bind.BoundContract // Generic contract wrapper for the low level calls -} - -// AssignmentHookFilterer is an auto generated log filtering Go binding around an Ethereum contract events. -type AssignmentHookFilterer struct { - contract *bind.BoundContract // Generic contract wrapper for the low level calls -} - -// AssignmentHookSession is an auto generated Go binding around an Ethereum contract, -// with pre-set call and transact options. -type AssignmentHookSession struct { - Contract *AssignmentHook // 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 -} - -// AssignmentHookCallerSession is an auto generated read-only Go binding around an Ethereum contract, -// with pre-set call options. -type AssignmentHookCallerSession struct { - Contract *AssignmentHookCaller // Generic contract caller binding to set the session for - CallOpts bind.CallOpts // Call options to use throughout this session -} - -// AssignmentHookTransactorSession is an auto generated write-only Go binding around an Ethereum contract, -// with pre-set transact options. -type AssignmentHookTransactorSession struct { - Contract *AssignmentHookTransactor // Generic contract transactor binding to set the session for - TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session -} - -// AssignmentHookRaw is an auto generated low-level Go binding around an Ethereum contract. -type AssignmentHookRaw struct { - Contract *AssignmentHook // Generic contract binding to access the raw methods on -} - -// AssignmentHookCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. -type AssignmentHookCallerRaw struct { - Contract *AssignmentHookCaller // Generic read-only contract binding to access the raw methods on -} - -// AssignmentHookTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. -type AssignmentHookTransactorRaw struct { - Contract *AssignmentHookTransactor // Generic write-only contract binding to access the raw methods on -} - -// NewAssignmentHook creates a new instance of AssignmentHook, bound to a specific deployed contract. -func NewAssignmentHook(address common.Address, backend bind.ContractBackend) (*AssignmentHook, error) { - contract, err := bindAssignmentHook(address, backend, backend, backend) - if err != nil { - return nil, err - } - return &AssignmentHook{AssignmentHookCaller: AssignmentHookCaller{contract: contract}, AssignmentHookTransactor: AssignmentHookTransactor{contract: contract}, AssignmentHookFilterer: AssignmentHookFilterer{contract: contract}}, nil -} - -// NewAssignmentHookCaller creates a new read-only instance of AssignmentHook, bound to a specific deployed contract. -func NewAssignmentHookCaller(address common.Address, caller bind.ContractCaller) (*AssignmentHookCaller, error) { - contract, err := bindAssignmentHook(address, caller, nil, nil) - if err != nil { - return nil, err - } - return &AssignmentHookCaller{contract: contract}, nil -} - -// NewAssignmentHookTransactor creates a new write-only instance of AssignmentHook, bound to a specific deployed contract. -func NewAssignmentHookTransactor(address common.Address, transactor bind.ContractTransactor) (*AssignmentHookTransactor, error) { - contract, err := bindAssignmentHook(address, nil, transactor, nil) - if err != nil { - return nil, err - } - return &AssignmentHookTransactor{contract: contract}, nil -} - -// NewAssignmentHookFilterer creates a new log filterer instance of AssignmentHook, bound to a specific deployed contract. -func NewAssignmentHookFilterer(address common.Address, filterer bind.ContractFilterer) (*AssignmentHookFilterer, error) { - contract, err := bindAssignmentHook(address, nil, nil, filterer) - if err != nil { - return nil, err - } - return &AssignmentHookFilterer{contract: contract}, nil -} - -// bindAssignmentHook binds a generic wrapper to an already deployed contract. -func bindAssignmentHook(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { - parsed, err := AssignmentHookMetaData.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 (_AssignmentHook *AssignmentHookRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { - return _AssignmentHook.Contract.AssignmentHookCaller.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 (_AssignmentHook *AssignmentHookRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { - return _AssignmentHook.Contract.AssignmentHookTransactor.contract.Transfer(opts) -} - -// Transact invokes the (paid) contract method with params as input values. -func (_AssignmentHook *AssignmentHookRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { - return _AssignmentHook.Contract.AssignmentHookTransactor.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 (_AssignmentHook *AssignmentHookCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { - return _AssignmentHook.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 (_AssignmentHook *AssignmentHookTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { - return _AssignmentHook.Contract.contract.Transfer(opts) -} - -// Transact invokes the (paid) contract method with params as input values. -func (_AssignmentHook *AssignmentHookTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { - return _AssignmentHook.Contract.contract.Transact(opts, method, params...) -} - -// MAXGASPAYINGPROVER is a free data retrieval call binding the contract method 0x12925031. -// -// Solidity: function MAX_GAS_PAYING_PROVER() view returns(uint256) -func (_AssignmentHook *AssignmentHookCaller) MAXGASPAYINGPROVER(opts *bind.CallOpts) (*big.Int, error) { - var out []interface{} - err := _AssignmentHook.contract.Call(opts, &out, "MAX_GAS_PAYING_PROVER") - - if err != nil { - return *new(*big.Int), err - } - - out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) - - return out0, err - -} - -// MAXGASPAYINGPROVER is a free data retrieval call binding the contract method 0x12925031. -// -// Solidity: function MAX_GAS_PAYING_PROVER() view returns(uint256) -func (_AssignmentHook *AssignmentHookSession) MAXGASPAYINGPROVER() (*big.Int, error) { - return _AssignmentHook.Contract.MAXGASPAYINGPROVER(&_AssignmentHook.CallOpts) -} - -// MAXGASPAYINGPROVER is a free data retrieval call binding the contract method 0x12925031. -// -// Solidity: function MAX_GAS_PAYING_PROVER() view returns(uint256) -func (_AssignmentHook *AssignmentHookCallerSession) MAXGASPAYINGPROVER() (*big.Int, error) { - return _AssignmentHook.Contract.MAXGASPAYINGPROVER(&_AssignmentHook.CallOpts) -} - -// AddressManager is a free data retrieval call binding the contract method 0x3ab76e9f. -// -// Solidity: function addressManager() view returns(address) -func (_AssignmentHook *AssignmentHookCaller) AddressManager(opts *bind.CallOpts) (common.Address, error) { - var out []interface{} - err := _AssignmentHook.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 (_AssignmentHook *AssignmentHookSession) AddressManager() (common.Address, error) { - return _AssignmentHook.Contract.AddressManager(&_AssignmentHook.CallOpts) -} - -// AddressManager is a free data retrieval call binding the contract method 0x3ab76e9f. -// -// Solidity: function addressManager() view returns(address) -func (_AssignmentHook *AssignmentHookCallerSession) AddressManager() (common.Address, error) { - return _AssignmentHook.Contract.AddressManager(&_AssignmentHook.CallOpts) -} - -// HashAssignment is a free data retrieval call binding the contract method 0xaf3a0228. -// -// Solidity: function hashAssignment((address,uint64,uint64,uint64,bytes32,bytes32,(uint16,uint128)[],bytes) _assignment, address _taikoL1Address, address _blockProposer, address _assignedProver, bytes32 _blobHash) view returns(bytes32) -func (_AssignmentHook *AssignmentHookCaller) HashAssignment(opts *bind.CallOpts, _assignment AssignmentHookProverAssignment, _taikoL1Address common.Address, _blockProposer common.Address, _assignedProver common.Address, _blobHash [32]byte) ([32]byte, error) { - var out []interface{} - err := _AssignmentHook.contract.Call(opts, &out, "hashAssignment", _assignment, _taikoL1Address, _blockProposer, _assignedProver, _blobHash) - - if err != nil { - return *new([32]byte), err - } - - out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) - - return out0, err - -} - -// HashAssignment is a free data retrieval call binding the contract method 0xaf3a0228. -// -// Solidity: function hashAssignment((address,uint64,uint64,uint64,bytes32,bytes32,(uint16,uint128)[],bytes) _assignment, address _taikoL1Address, address _blockProposer, address _assignedProver, bytes32 _blobHash) view returns(bytes32) -func (_AssignmentHook *AssignmentHookSession) HashAssignment(_assignment AssignmentHookProverAssignment, _taikoL1Address common.Address, _blockProposer common.Address, _assignedProver common.Address, _blobHash [32]byte) ([32]byte, error) { - return _AssignmentHook.Contract.HashAssignment(&_AssignmentHook.CallOpts, _assignment, _taikoL1Address, _blockProposer, _assignedProver, _blobHash) -} - -// HashAssignment is a free data retrieval call binding the contract method 0xaf3a0228. -// -// Solidity: function hashAssignment((address,uint64,uint64,uint64,bytes32,bytes32,(uint16,uint128)[],bytes) _assignment, address _taikoL1Address, address _blockProposer, address _assignedProver, bytes32 _blobHash) view returns(bytes32) -func (_AssignmentHook *AssignmentHookCallerSession) HashAssignment(_assignment AssignmentHookProverAssignment, _taikoL1Address common.Address, _blockProposer common.Address, _assignedProver common.Address, _blobHash [32]byte) ([32]byte, error) { - return _AssignmentHook.Contract.HashAssignment(&_AssignmentHook.CallOpts, _assignment, _taikoL1Address, _blockProposer, _assignedProver, _blobHash) -} - -// Impl is a free data retrieval call binding the contract method 0x8abf6077. -// -// Solidity: function impl() view returns(address) -func (_AssignmentHook *AssignmentHookCaller) Impl(opts *bind.CallOpts) (common.Address, error) { - var out []interface{} - err := _AssignmentHook.contract.Call(opts, &out, "impl") - - if err != nil { - return *new(common.Address), err - } - - out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) - - return out0, err - -} - -// Impl is a free data retrieval call binding the contract method 0x8abf6077. -// -// Solidity: function impl() view returns(address) -func (_AssignmentHook *AssignmentHookSession) Impl() (common.Address, error) { - return _AssignmentHook.Contract.Impl(&_AssignmentHook.CallOpts) -} - -// Impl is a free data retrieval call binding the contract method 0x8abf6077. -// -// Solidity: function impl() view returns(address) -func (_AssignmentHook *AssignmentHookCallerSession) Impl() (common.Address, error) { - return _AssignmentHook.Contract.Impl(&_AssignmentHook.CallOpts) -} - -// InNonReentrant is a free data retrieval call binding the contract method 0x3075db56. -// -// Solidity: function inNonReentrant() view returns(bool) -func (_AssignmentHook *AssignmentHookCaller) InNonReentrant(opts *bind.CallOpts) (bool, error) { - var out []interface{} - err := _AssignmentHook.contract.Call(opts, &out, "inNonReentrant") - - if err != nil { - return *new(bool), err - } - - out0 := *abi.ConvertType(out[0], new(bool)).(*bool) - - return out0, err - -} - -// InNonReentrant is a free data retrieval call binding the contract method 0x3075db56. -// -// Solidity: function inNonReentrant() view returns(bool) -func (_AssignmentHook *AssignmentHookSession) InNonReentrant() (bool, error) { - return _AssignmentHook.Contract.InNonReentrant(&_AssignmentHook.CallOpts) -} - -// InNonReentrant is a free data retrieval call binding the contract method 0x3075db56. -// -// Solidity: function inNonReentrant() view returns(bool) -func (_AssignmentHook *AssignmentHookCallerSession) InNonReentrant() (bool, error) { - return _AssignmentHook.Contract.InNonReentrant(&_AssignmentHook.CallOpts) -} - -// LastUnpausedAt is a free data retrieval call binding the contract method 0xe07baba6. -// -// Solidity: function lastUnpausedAt() view returns(uint64) -func (_AssignmentHook *AssignmentHookCaller) LastUnpausedAt(opts *bind.CallOpts) (uint64, error) { - var out []interface{} - err := _AssignmentHook.contract.Call(opts, &out, "lastUnpausedAt") - - if err != nil { - return *new(uint64), err - } - - out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) - - return out0, err - -} - -// LastUnpausedAt is a free data retrieval call binding the contract method 0xe07baba6. -// -// Solidity: function lastUnpausedAt() view returns(uint64) -func (_AssignmentHook *AssignmentHookSession) LastUnpausedAt() (uint64, error) { - return _AssignmentHook.Contract.LastUnpausedAt(&_AssignmentHook.CallOpts) -} - -// LastUnpausedAt is a free data retrieval call binding the contract method 0xe07baba6. -// -// Solidity: function lastUnpausedAt() view returns(uint64) -func (_AssignmentHook *AssignmentHookCallerSession) LastUnpausedAt() (uint64, error) { - return _AssignmentHook.Contract.LastUnpausedAt(&_AssignmentHook.CallOpts) -} - -// Owner is a free data retrieval call binding the contract method 0x8da5cb5b. -// -// Solidity: function owner() view returns(address) -func (_AssignmentHook *AssignmentHookCaller) Owner(opts *bind.CallOpts) (common.Address, error) { - var out []interface{} - err := _AssignmentHook.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 (_AssignmentHook *AssignmentHookSession) Owner() (common.Address, error) { - return _AssignmentHook.Contract.Owner(&_AssignmentHook.CallOpts) -} - -// Owner is a free data retrieval call binding the contract method 0x8da5cb5b. -// -// Solidity: function owner() view returns(address) -func (_AssignmentHook *AssignmentHookCallerSession) Owner() (common.Address, error) { - return _AssignmentHook.Contract.Owner(&_AssignmentHook.CallOpts) -} - -// Paused is a free data retrieval call binding the contract method 0x5c975abb. -// -// Solidity: function paused() view returns(bool) -func (_AssignmentHook *AssignmentHookCaller) Paused(opts *bind.CallOpts) (bool, error) { - var out []interface{} - err := _AssignmentHook.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 (_AssignmentHook *AssignmentHookSession) Paused() (bool, error) { - return _AssignmentHook.Contract.Paused(&_AssignmentHook.CallOpts) -} - -// Paused is a free data retrieval call binding the contract method 0x5c975abb. -// -// Solidity: function paused() view returns(bool) -func (_AssignmentHook *AssignmentHookCallerSession) Paused() (bool, error) { - return _AssignmentHook.Contract.Paused(&_AssignmentHook.CallOpts) -} - -// PendingOwner is a free data retrieval call binding the contract method 0xe30c3978. -// -// Solidity: function pendingOwner() view returns(address) -func (_AssignmentHook *AssignmentHookCaller) PendingOwner(opts *bind.CallOpts) (common.Address, error) { - var out []interface{} - err := _AssignmentHook.contract.Call(opts, &out, "pendingOwner") - - if err != nil { - return *new(common.Address), err - } - - out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) - - return out0, err - -} - -// PendingOwner is a free data retrieval call binding the contract method 0xe30c3978. -// -// Solidity: function pendingOwner() view returns(address) -func (_AssignmentHook *AssignmentHookSession) PendingOwner() (common.Address, error) { - return _AssignmentHook.Contract.PendingOwner(&_AssignmentHook.CallOpts) -} - -// PendingOwner is a free data retrieval call binding the contract method 0xe30c3978. -// -// Solidity: function pendingOwner() view returns(address) -func (_AssignmentHook *AssignmentHookCallerSession) PendingOwner() (common.Address, error) { - return _AssignmentHook.Contract.PendingOwner(&_AssignmentHook.CallOpts) -} - -// ProxiableUUID is a free data retrieval call binding the contract method 0x52d1902d. -// -// Solidity: function proxiableUUID() view returns(bytes32) -func (_AssignmentHook *AssignmentHookCaller) ProxiableUUID(opts *bind.CallOpts) ([32]byte, error) { - var out []interface{} - err := _AssignmentHook.contract.Call(opts, &out, "proxiableUUID") - - if err != nil { - return *new([32]byte), err - } - - out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) - - return out0, err - -} - -// ProxiableUUID is a free data retrieval call binding the contract method 0x52d1902d. -// -// Solidity: function proxiableUUID() view returns(bytes32) -func (_AssignmentHook *AssignmentHookSession) ProxiableUUID() ([32]byte, error) { - return _AssignmentHook.Contract.ProxiableUUID(&_AssignmentHook.CallOpts) -} - -// ProxiableUUID is a free data retrieval call binding the contract method 0x52d1902d. -// -// Solidity: function proxiableUUID() view returns(bytes32) -func (_AssignmentHook *AssignmentHookCallerSession) ProxiableUUID() ([32]byte, error) { - return _AssignmentHook.Contract.ProxiableUUID(&_AssignmentHook.CallOpts) -} - -// Resolve is a free data retrieval call binding the contract method 0x3eb6b8cf. -// -// Solidity: function resolve(uint64 _chainId, bytes32 _name, bool _allowZeroAddress) view returns(address) -func (_AssignmentHook *AssignmentHookCaller) Resolve(opts *bind.CallOpts, _chainId uint64, _name [32]byte, _allowZeroAddress bool) (common.Address, error) { - var out []interface{} - err := _AssignmentHook.contract.Call(opts, &out, "resolve", _chainId, _name, _allowZeroAddress) - - 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 0x3eb6b8cf. -// -// Solidity: function resolve(uint64 _chainId, bytes32 _name, bool _allowZeroAddress) view returns(address) -func (_AssignmentHook *AssignmentHookSession) Resolve(_chainId uint64, _name [32]byte, _allowZeroAddress bool) (common.Address, error) { - return _AssignmentHook.Contract.Resolve(&_AssignmentHook.CallOpts, _chainId, _name, _allowZeroAddress) -} - -// Resolve is a free data retrieval call binding the contract method 0x3eb6b8cf. -// -// Solidity: function resolve(uint64 _chainId, bytes32 _name, bool _allowZeroAddress) view returns(address) -func (_AssignmentHook *AssignmentHookCallerSession) Resolve(_chainId uint64, _name [32]byte, _allowZeroAddress bool) (common.Address, error) { - return _AssignmentHook.Contract.Resolve(&_AssignmentHook.CallOpts, _chainId, _name, _allowZeroAddress) -} - -// Resolve0 is a free data retrieval call binding the contract method 0xa86f9d9e. -// -// Solidity: function resolve(bytes32 _name, bool _allowZeroAddress) view returns(address) -func (_AssignmentHook *AssignmentHookCaller) Resolve0(opts *bind.CallOpts, _name [32]byte, _allowZeroAddress bool) (common.Address, error) { - var out []interface{} - err := _AssignmentHook.contract.Call(opts, &out, "resolve0", _name, _allowZeroAddress) - - if err != nil { - return *new(common.Address), err - } - - out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) - - return out0, err - -} - -// Resolve0 is a free data retrieval call binding the contract method 0xa86f9d9e. -// -// Solidity: function resolve(bytes32 _name, bool _allowZeroAddress) view returns(address) -func (_AssignmentHook *AssignmentHookSession) Resolve0(_name [32]byte, _allowZeroAddress bool) (common.Address, error) { - return _AssignmentHook.Contract.Resolve0(&_AssignmentHook.CallOpts, _name, _allowZeroAddress) -} - -// Resolve0 is a free data retrieval call binding the contract method 0xa86f9d9e. -// -// Solidity: function resolve(bytes32 _name, bool _allowZeroAddress) view returns(address) -func (_AssignmentHook *AssignmentHookCallerSession) Resolve0(_name [32]byte, _allowZeroAddress bool) (common.Address, error) { - return _AssignmentHook.Contract.Resolve0(&_AssignmentHook.CallOpts, _name, _allowZeroAddress) -} - -// AcceptOwnership is a paid mutator transaction binding the contract method 0x79ba5097. -// -// Solidity: function acceptOwnership() returns() -func (_AssignmentHook *AssignmentHookTransactor) AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) { - return _AssignmentHook.contract.Transact(opts, "acceptOwnership") -} - -// AcceptOwnership is a paid mutator transaction binding the contract method 0x79ba5097. -// -// Solidity: function acceptOwnership() returns() -func (_AssignmentHook *AssignmentHookSession) AcceptOwnership() (*types.Transaction, error) { - return _AssignmentHook.Contract.AcceptOwnership(&_AssignmentHook.TransactOpts) -} - -// AcceptOwnership is a paid mutator transaction binding the contract method 0x79ba5097. -// -// Solidity: function acceptOwnership() returns() -func (_AssignmentHook *AssignmentHookTransactorSession) AcceptOwnership() (*types.Transaction, error) { - return _AssignmentHook.Contract.AcceptOwnership(&_AssignmentHook.TransactOpts) -} - -// Init is a paid mutator transaction binding the contract method 0xf09a4016. -// -// Solidity: function init(address _owner, address _addressManager) returns() -func (_AssignmentHook *AssignmentHookTransactor) Init(opts *bind.TransactOpts, _owner common.Address, _addressManager common.Address) (*types.Transaction, error) { - return _AssignmentHook.contract.Transact(opts, "init", _owner, _addressManager) -} - -// Init is a paid mutator transaction binding the contract method 0xf09a4016. -// -// Solidity: function init(address _owner, address _addressManager) returns() -func (_AssignmentHook *AssignmentHookSession) Init(_owner common.Address, _addressManager common.Address) (*types.Transaction, error) { - return _AssignmentHook.Contract.Init(&_AssignmentHook.TransactOpts, _owner, _addressManager) -} - -// Init is a paid mutator transaction binding the contract method 0xf09a4016. -// -// Solidity: function init(address _owner, address _addressManager) returns() -func (_AssignmentHook *AssignmentHookTransactorSession) Init(_owner common.Address, _addressManager common.Address) (*types.Transaction, error) { - return _AssignmentHook.Contract.Init(&_AssignmentHook.TransactOpts, _owner, _addressManager) -} - -// OnBlockProposed is a paid mutator transaction binding the contract method 0x36b6ea4e. -// -// Solidity: function onBlockProposed((bytes32,address,uint96,uint64,uint64,uint64,uint32,uint32) _blk, (bytes32,bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address) _meta, bytes _data) payable returns() -func (_AssignmentHook *AssignmentHookTransactor) OnBlockProposed(opts *bind.TransactOpts, _blk TaikoDataBlock, _meta TaikoDataBlockMetadata, _data []byte) (*types.Transaction, error) { - return _AssignmentHook.contract.Transact(opts, "onBlockProposed", _blk, _meta, _data) -} - -// OnBlockProposed is a paid mutator transaction binding the contract method 0x36b6ea4e. -// -// Solidity: function onBlockProposed((bytes32,address,uint96,uint64,uint64,uint64,uint32,uint32) _blk, (bytes32,bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address) _meta, bytes _data) payable returns() -func (_AssignmentHook *AssignmentHookSession) OnBlockProposed(_blk TaikoDataBlock, _meta TaikoDataBlockMetadata, _data []byte) (*types.Transaction, error) { - return _AssignmentHook.Contract.OnBlockProposed(&_AssignmentHook.TransactOpts, _blk, _meta, _data) -} - -// OnBlockProposed is a paid mutator transaction binding the contract method 0x36b6ea4e. -// -// Solidity: function onBlockProposed((bytes32,address,uint96,uint64,uint64,uint64,uint32,uint32) _blk, (bytes32,bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address) _meta, bytes _data) payable returns() -func (_AssignmentHook *AssignmentHookTransactorSession) OnBlockProposed(_blk TaikoDataBlock, _meta TaikoDataBlockMetadata, _data []byte) (*types.Transaction, error) { - return _AssignmentHook.Contract.OnBlockProposed(&_AssignmentHook.TransactOpts, _blk, _meta, _data) -} - -// Pause is a paid mutator transaction binding the contract method 0x8456cb59. -// -// Solidity: function pause() returns() -func (_AssignmentHook *AssignmentHookTransactor) Pause(opts *bind.TransactOpts) (*types.Transaction, error) { - return _AssignmentHook.contract.Transact(opts, "pause") -} - -// Pause is a paid mutator transaction binding the contract method 0x8456cb59. -// -// Solidity: function pause() returns() -func (_AssignmentHook *AssignmentHookSession) Pause() (*types.Transaction, error) { - return _AssignmentHook.Contract.Pause(&_AssignmentHook.TransactOpts) -} - -// Pause is a paid mutator transaction binding the contract method 0x8456cb59. -// -// Solidity: function pause() returns() -func (_AssignmentHook *AssignmentHookTransactorSession) Pause() (*types.Transaction, error) { - return _AssignmentHook.Contract.Pause(&_AssignmentHook.TransactOpts) -} - -// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6. -// -// Solidity: function renounceOwnership() returns() -func (_AssignmentHook *AssignmentHookTransactor) RenounceOwnership(opts *bind.TransactOpts) (*types.Transaction, error) { - return _AssignmentHook.contract.Transact(opts, "renounceOwnership") -} - -// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6. -// -// Solidity: function renounceOwnership() returns() -func (_AssignmentHook *AssignmentHookSession) RenounceOwnership() (*types.Transaction, error) { - return _AssignmentHook.Contract.RenounceOwnership(&_AssignmentHook.TransactOpts) -} - -// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6. -// -// Solidity: function renounceOwnership() returns() -func (_AssignmentHook *AssignmentHookTransactorSession) RenounceOwnership() (*types.Transaction, error) { - return _AssignmentHook.Contract.RenounceOwnership(&_AssignmentHook.TransactOpts) -} - -// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b. -// -// Solidity: function transferOwnership(address newOwner) returns() -func (_AssignmentHook *AssignmentHookTransactor) TransferOwnership(opts *bind.TransactOpts, newOwner common.Address) (*types.Transaction, error) { - return _AssignmentHook.contract.Transact(opts, "transferOwnership", newOwner) -} - -// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b. -// -// Solidity: function transferOwnership(address newOwner) returns() -func (_AssignmentHook *AssignmentHookSession) TransferOwnership(newOwner common.Address) (*types.Transaction, error) { - return _AssignmentHook.Contract.TransferOwnership(&_AssignmentHook.TransactOpts, newOwner) -} - -// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b. -// -// Solidity: function transferOwnership(address newOwner) returns() -func (_AssignmentHook *AssignmentHookTransactorSession) TransferOwnership(newOwner common.Address) (*types.Transaction, error) { - return _AssignmentHook.Contract.TransferOwnership(&_AssignmentHook.TransactOpts, newOwner) -} - -// Unpause is a paid mutator transaction binding the contract method 0x3f4ba83a. -// -// Solidity: function unpause() returns() -func (_AssignmentHook *AssignmentHookTransactor) Unpause(opts *bind.TransactOpts) (*types.Transaction, error) { - return _AssignmentHook.contract.Transact(opts, "unpause") -} - -// Unpause is a paid mutator transaction binding the contract method 0x3f4ba83a. -// -// Solidity: function unpause() returns() -func (_AssignmentHook *AssignmentHookSession) Unpause() (*types.Transaction, error) { - return _AssignmentHook.Contract.Unpause(&_AssignmentHook.TransactOpts) -} - -// Unpause is a paid mutator transaction binding the contract method 0x3f4ba83a. -// -// Solidity: function unpause() returns() -func (_AssignmentHook *AssignmentHookTransactorSession) Unpause() (*types.Transaction, error) { - return _AssignmentHook.Contract.Unpause(&_AssignmentHook.TransactOpts) -} - -// UpgradeTo is a paid mutator transaction binding the contract method 0x3659cfe6. -// -// Solidity: function upgradeTo(address newImplementation) returns() -func (_AssignmentHook *AssignmentHookTransactor) UpgradeTo(opts *bind.TransactOpts, newImplementation common.Address) (*types.Transaction, error) { - return _AssignmentHook.contract.Transact(opts, "upgradeTo", newImplementation) -} - -// UpgradeTo is a paid mutator transaction binding the contract method 0x3659cfe6. -// -// Solidity: function upgradeTo(address newImplementation) returns() -func (_AssignmentHook *AssignmentHookSession) UpgradeTo(newImplementation common.Address) (*types.Transaction, error) { - return _AssignmentHook.Contract.UpgradeTo(&_AssignmentHook.TransactOpts, newImplementation) -} - -// UpgradeTo is a paid mutator transaction binding the contract method 0x3659cfe6. -// -// Solidity: function upgradeTo(address newImplementation) returns() -func (_AssignmentHook *AssignmentHookTransactorSession) UpgradeTo(newImplementation common.Address) (*types.Transaction, error) { - return _AssignmentHook.Contract.UpgradeTo(&_AssignmentHook.TransactOpts, newImplementation) -} - -// UpgradeToAndCall is a paid mutator transaction binding the contract method 0x4f1ef286. -// -// Solidity: function upgradeToAndCall(address newImplementation, bytes data) payable returns() -func (_AssignmentHook *AssignmentHookTransactor) UpgradeToAndCall(opts *bind.TransactOpts, newImplementation common.Address, data []byte) (*types.Transaction, error) { - return _AssignmentHook.contract.Transact(opts, "upgradeToAndCall", newImplementation, data) -} - -// UpgradeToAndCall is a paid mutator transaction binding the contract method 0x4f1ef286. -// -// Solidity: function upgradeToAndCall(address newImplementation, bytes data) payable returns() -func (_AssignmentHook *AssignmentHookSession) UpgradeToAndCall(newImplementation common.Address, data []byte) (*types.Transaction, error) { - return _AssignmentHook.Contract.UpgradeToAndCall(&_AssignmentHook.TransactOpts, newImplementation, data) -} - -// UpgradeToAndCall is a paid mutator transaction binding the contract method 0x4f1ef286. -// -// Solidity: function upgradeToAndCall(address newImplementation, bytes data) payable returns() -func (_AssignmentHook *AssignmentHookTransactorSession) UpgradeToAndCall(newImplementation common.Address, data []byte) (*types.Transaction, error) { - return _AssignmentHook.Contract.UpgradeToAndCall(&_AssignmentHook.TransactOpts, newImplementation, data) -} - -// AssignmentHookAdminChangedIterator is returned from FilterAdminChanged and is used to iterate over the raw logs and unpacked data for AdminChanged events raised by the AssignmentHook contract. -type AssignmentHookAdminChangedIterator struct { - Event *AssignmentHookAdminChanged // 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 *AssignmentHookAdminChangedIterator) 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(AssignmentHookAdminChanged) - 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(AssignmentHookAdminChanged) - 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 *AssignmentHookAdminChangedIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *AssignmentHookAdminChangedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// AssignmentHookAdminChanged represents a AdminChanged event raised by the AssignmentHook contract. -type AssignmentHookAdminChanged struct { - PreviousAdmin common.Address - NewAdmin common.Address - Raw types.Log // Blockchain specific contextual infos -} - -// FilterAdminChanged is a free log retrieval operation binding the contract event 0x7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f. -// -// Solidity: event AdminChanged(address previousAdmin, address newAdmin) -func (_AssignmentHook *AssignmentHookFilterer) FilterAdminChanged(opts *bind.FilterOpts) (*AssignmentHookAdminChangedIterator, error) { - - logs, sub, err := _AssignmentHook.contract.FilterLogs(opts, "AdminChanged") - if err != nil { - return nil, err - } - return &AssignmentHookAdminChangedIterator{contract: _AssignmentHook.contract, event: "AdminChanged", logs: logs, sub: sub}, nil -} - -// WatchAdminChanged is a free log subscription operation binding the contract event 0x7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f. -// -// Solidity: event AdminChanged(address previousAdmin, address newAdmin) -func (_AssignmentHook *AssignmentHookFilterer) WatchAdminChanged(opts *bind.WatchOpts, sink chan<- *AssignmentHookAdminChanged) (event.Subscription, error) { - - logs, sub, err := _AssignmentHook.contract.WatchLogs(opts, "AdminChanged") - 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(AssignmentHookAdminChanged) - if err := _AssignmentHook.contract.UnpackLog(event, "AdminChanged", 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 -} - -// ParseAdminChanged is a log parse operation binding the contract event 0x7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f. -// -// Solidity: event AdminChanged(address previousAdmin, address newAdmin) -func (_AssignmentHook *AssignmentHookFilterer) ParseAdminChanged(log types.Log) (*AssignmentHookAdminChanged, error) { - event := new(AssignmentHookAdminChanged) - if err := _AssignmentHook.contract.UnpackLog(event, "AdminChanged", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// AssignmentHookBeaconUpgradedIterator is returned from FilterBeaconUpgraded and is used to iterate over the raw logs and unpacked data for BeaconUpgraded events raised by the AssignmentHook contract. -type AssignmentHookBeaconUpgradedIterator struct { - Event *AssignmentHookBeaconUpgraded // 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 *AssignmentHookBeaconUpgradedIterator) 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(AssignmentHookBeaconUpgraded) - 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(AssignmentHookBeaconUpgraded) - 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 *AssignmentHookBeaconUpgradedIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *AssignmentHookBeaconUpgradedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// AssignmentHookBeaconUpgraded represents a BeaconUpgraded event raised by the AssignmentHook contract. -type AssignmentHookBeaconUpgraded struct { - Beacon common.Address - Raw types.Log // Blockchain specific contextual infos -} - -// FilterBeaconUpgraded is a free log retrieval operation binding the contract event 0x1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e. -// -// Solidity: event BeaconUpgraded(address indexed beacon) -func (_AssignmentHook *AssignmentHookFilterer) FilterBeaconUpgraded(opts *bind.FilterOpts, beacon []common.Address) (*AssignmentHookBeaconUpgradedIterator, error) { - - var beaconRule []interface{} - for _, beaconItem := range beacon { - beaconRule = append(beaconRule, beaconItem) - } - - logs, sub, err := _AssignmentHook.contract.FilterLogs(opts, "BeaconUpgraded", beaconRule) - if err != nil { - return nil, err - } - return &AssignmentHookBeaconUpgradedIterator{contract: _AssignmentHook.contract, event: "BeaconUpgraded", logs: logs, sub: sub}, nil -} - -// WatchBeaconUpgraded is a free log subscription operation binding the contract event 0x1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e. -// -// Solidity: event BeaconUpgraded(address indexed beacon) -func (_AssignmentHook *AssignmentHookFilterer) WatchBeaconUpgraded(opts *bind.WatchOpts, sink chan<- *AssignmentHookBeaconUpgraded, beacon []common.Address) (event.Subscription, error) { - - var beaconRule []interface{} - for _, beaconItem := range beacon { - beaconRule = append(beaconRule, beaconItem) - } - - logs, sub, err := _AssignmentHook.contract.WatchLogs(opts, "BeaconUpgraded", beaconRule) - 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(AssignmentHookBeaconUpgraded) - if err := _AssignmentHook.contract.UnpackLog(event, "BeaconUpgraded", 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 -} - -// ParseBeaconUpgraded is a log parse operation binding the contract event 0x1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e. -// -// Solidity: event BeaconUpgraded(address indexed beacon) -func (_AssignmentHook *AssignmentHookFilterer) ParseBeaconUpgraded(log types.Log) (*AssignmentHookBeaconUpgraded, error) { - event := new(AssignmentHookBeaconUpgraded) - if err := _AssignmentHook.contract.UnpackLog(event, "BeaconUpgraded", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// AssignmentHookBlockAssignedIterator is returned from FilterBlockAssigned and is used to iterate over the raw logs and unpacked data for BlockAssigned events raised by the AssignmentHook contract. -type AssignmentHookBlockAssignedIterator struct { - Event *AssignmentHookBlockAssigned // 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 *AssignmentHookBlockAssignedIterator) 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(AssignmentHookBlockAssigned) - 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(AssignmentHookBlockAssigned) - 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 *AssignmentHookBlockAssignedIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *AssignmentHookBlockAssignedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// AssignmentHookBlockAssigned represents a BlockAssigned event raised by the AssignmentHook contract. -type AssignmentHookBlockAssigned struct { - AssignedProver common.Address - Meta TaikoDataBlockMetadata - Assignment AssignmentHookProverAssignment - Raw types.Log // Blockchain specific contextual infos -} - -// FilterBlockAssigned is a free log retrieval operation binding the contract event 0x983b2c64d5e49fdb74b580110b1c64f6f6572b114331e9fee6b7531627eaf0b1. -// -// Solidity: event BlockAssigned(address indexed assignedProver, (bytes32,bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address) meta, (address,uint64,uint64,uint64,bytes32,bytes32,(uint16,uint128)[],bytes) assignment) -func (_AssignmentHook *AssignmentHookFilterer) FilterBlockAssigned(opts *bind.FilterOpts, assignedProver []common.Address) (*AssignmentHookBlockAssignedIterator, error) { - - var assignedProverRule []interface{} - for _, assignedProverItem := range assignedProver { - assignedProverRule = append(assignedProverRule, assignedProverItem) - } - - logs, sub, err := _AssignmentHook.contract.FilterLogs(opts, "BlockAssigned", assignedProverRule) - if err != nil { - return nil, err - } - return &AssignmentHookBlockAssignedIterator{contract: _AssignmentHook.contract, event: "BlockAssigned", logs: logs, sub: sub}, nil -} - -// WatchBlockAssigned is a free log subscription operation binding the contract event 0x983b2c64d5e49fdb74b580110b1c64f6f6572b114331e9fee6b7531627eaf0b1. -// -// Solidity: event BlockAssigned(address indexed assignedProver, (bytes32,bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address) meta, (address,uint64,uint64,uint64,bytes32,bytes32,(uint16,uint128)[],bytes) assignment) -func (_AssignmentHook *AssignmentHookFilterer) WatchBlockAssigned(opts *bind.WatchOpts, sink chan<- *AssignmentHookBlockAssigned, assignedProver []common.Address) (event.Subscription, error) { - - var assignedProverRule []interface{} - for _, assignedProverItem := range assignedProver { - assignedProverRule = append(assignedProverRule, assignedProverItem) - } - - logs, sub, err := _AssignmentHook.contract.WatchLogs(opts, "BlockAssigned", assignedProverRule) - 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(AssignmentHookBlockAssigned) - if err := _AssignmentHook.contract.UnpackLog(event, "BlockAssigned", 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 -} - -// ParseBlockAssigned is a log parse operation binding the contract event 0x983b2c64d5e49fdb74b580110b1c64f6f6572b114331e9fee6b7531627eaf0b1. -// -// Solidity: event BlockAssigned(address indexed assignedProver, (bytes32,bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address) meta, (address,uint64,uint64,uint64,bytes32,bytes32,(uint16,uint128)[],bytes) assignment) -func (_AssignmentHook *AssignmentHookFilterer) ParseBlockAssigned(log types.Log) (*AssignmentHookBlockAssigned, error) { - event := new(AssignmentHookBlockAssigned) - if err := _AssignmentHook.contract.UnpackLog(event, "BlockAssigned", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// AssignmentHookEtherPaymentFailedIterator is returned from FilterEtherPaymentFailed and is used to iterate over the raw logs and unpacked data for EtherPaymentFailed events raised by the AssignmentHook contract. -type AssignmentHookEtherPaymentFailedIterator struct { - Event *AssignmentHookEtherPaymentFailed // 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 *AssignmentHookEtherPaymentFailedIterator) 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(AssignmentHookEtherPaymentFailed) - 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(AssignmentHookEtherPaymentFailed) - 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 *AssignmentHookEtherPaymentFailedIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *AssignmentHookEtherPaymentFailedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// AssignmentHookEtherPaymentFailed represents a EtherPaymentFailed event raised by the AssignmentHook contract. -type AssignmentHookEtherPaymentFailed struct { - To common.Address - MaxGas *big.Int - Raw types.Log // Blockchain specific contextual infos -} - -// FilterEtherPaymentFailed is a free log retrieval operation binding the contract event 0x193fbe934858a5b7669033de55612da355d11604360d59535b5bfaa25c42209e. -// -// Solidity: event EtherPaymentFailed(address to, uint256 maxGas) -func (_AssignmentHook *AssignmentHookFilterer) FilterEtherPaymentFailed(opts *bind.FilterOpts) (*AssignmentHookEtherPaymentFailedIterator, error) { - - logs, sub, err := _AssignmentHook.contract.FilterLogs(opts, "EtherPaymentFailed") - if err != nil { - return nil, err - } - return &AssignmentHookEtherPaymentFailedIterator{contract: _AssignmentHook.contract, event: "EtherPaymentFailed", logs: logs, sub: sub}, nil -} - -// WatchEtherPaymentFailed is a free log subscription operation binding the contract event 0x193fbe934858a5b7669033de55612da355d11604360d59535b5bfaa25c42209e. -// -// Solidity: event EtherPaymentFailed(address to, uint256 maxGas) -func (_AssignmentHook *AssignmentHookFilterer) WatchEtherPaymentFailed(opts *bind.WatchOpts, sink chan<- *AssignmentHookEtherPaymentFailed) (event.Subscription, error) { - - logs, sub, err := _AssignmentHook.contract.WatchLogs(opts, "EtherPaymentFailed") - 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(AssignmentHookEtherPaymentFailed) - if err := _AssignmentHook.contract.UnpackLog(event, "EtherPaymentFailed", 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 -} - -// ParseEtherPaymentFailed is a log parse operation binding the contract event 0x193fbe934858a5b7669033de55612da355d11604360d59535b5bfaa25c42209e. -// -// Solidity: event EtherPaymentFailed(address to, uint256 maxGas) -func (_AssignmentHook *AssignmentHookFilterer) ParseEtherPaymentFailed(log types.Log) (*AssignmentHookEtherPaymentFailed, error) { - event := new(AssignmentHookEtherPaymentFailed) - if err := _AssignmentHook.contract.UnpackLog(event, "EtherPaymentFailed", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// AssignmentHookInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the AssignmentHook contract. -type AssignmentHookInitializedIterator struct { - Event *AssignmentHookInitialized // 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 *AssignmentHookInitializedIterator) 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(AssignmentHookInitialized) - 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(AssignmentHookInitialized) - 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 *AssignmentHookInitializedIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *AssignmentHookInitializedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// AssignmentHookInitialized represents a Initialized event raised by the AssignmentHook contract. -type AssignmentHookInitialized 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 (_AssignmentHook *AssignmentHookFilterer) FilterInitialized(opts *bind.FilterOpts) (*AssignmentHookInitializedIterator, error) { - - logs, sub, err := _AssignmentHook.contract.FilterLogs(opts, "Initialized") - if err != nil { - return nil, err - } - return &AssignmentHookInitializedIterator{contract: _AssignmentHook.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 (_AssignmentHook *AssignmentHookFilterer) WatchInitialized(opts *bind.WatchOpts, sink chan<- *AssignmentHookInitialized) (event.Subscription, error) { - - logs, sub, err := _AssignmentHook.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(AssignmentHookInitialized) - if err := _AssignmentHook.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 (_AssignmentHook *AssignmentHookFilterer) ParseInitialized(log types.Log) (*AssignmentHookInitialized, error) { - event := new(AssignmentHookInitialized) - if err := _AssignmentHook.contract.UnpackLog(event, "Initialized", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// AssignmentHookOwnershipTransferStartedIterator is returned from FilterOwnershipTransferStarted and is used to iterate over the raw logs and unpacked data for OwnershipTransferStarted events raised by the AssignmentHook contract. -type AssignmentHookOwnershipTransferStartedIterator struct { - Event *AssignmentHookOwnershipTransferStarted // 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 *AssignmentHookOwnershipTransferStartedIterator) 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(AssignmentHookOwnershipTransferStarted) - 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(AssignmentHookOwnershipTransferStarted) - 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 *AssignmentHookOwnershipTransferStartedIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *AssignmentHookOwnershipTransferStartedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// AssignmentHookOwnershipTransferStarted represents a OwnershipTransferStarted event raised by the AssignmentHook contract. -type AssignmentHookOwnershipTransferStarted struct { - PreviousOwner common.Address - NewOwner common.Address - Raw types.Log // Blockchain specific contextual infos -} - -// FilterOwnershipTransferStarted is a free log retrieval operation binding the contract event 0x38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e22700. -// -// Solidity: event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner) -func (_AssignmentHook *AssignmentHookFilterer) FilterOwnershipTransferStarted(opts *bind.FilterOpts, previousOwner []common.Address, newOwner []common.Address) (*AssignmentHookOwnershipTransferStartedIterator, 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 := _AssignmentHook.contract.FilterLogs(opts, "OwnershipTransferStarted", previousOwnerRule, newOwnerRule) - if err != nil { - return nil, err - } - return &AssignmentHookOwnershipTransferStartedIterator{contract: _AssignmentHook.contract, event: "OwnershipTransferStarted", logs: logs, sub: sub}, nil -} - -// WatchOwnershipTransferStarted is a free log subscription operation binding the contract event 0x38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e22700. -// -// Solidity: event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner) -func (_AssignmentHook *AssignmentHookFilterer) WatchOwnershipTransferStarted(opts *bind.WatchOpts, sink chan<- *AssignmentHookOwnershipTransferStarted, 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 := _AssignmentHook.contract.WatchLogs(opts, "OwnershipTransferStarted", 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(AssignmentHookOwnershipTransferStarted) - if err := _AssignmentHook.contract.UnpackLog(event, "OwnershipTransferStarted", 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 -} - -// ParseOwnershipTransferStarted is a log parse operation binding the contract event 0x38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e22700. -// -// Solidity: event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner) -func (_AssignmentHook *AssignmentHookFilterer) ParseOwnershipTransferStarted(log types.Log) (*AssignmentHookOwnershipTransferStarted, error) { - event := new(AssignmentHookOwnershipTransferStarted) - if err := _AssignmentHook.contract.UnpackLog(event, "OwnershipTransferStarted", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// AssignmentHookOwnershipTransferredIterator is returned from FilterOwnershipTransferred and is used to iterate over the raw logs and unpacked data for OwnershipTransferred events raised by the AssignmentHook contract. -type AssignmentHookOwnershipTransferredIterator struct { - Event *AssignmentHookOwnershipTransferred // 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 *AssignmentHookOwnershipTransferredIterator) 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(AssignmentHookOwnershipTransferred) - 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(AssignmentHookOwnershipTransferred) - 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 *AssignmentHookOwnershipTransferredIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *AssignmentHookOwnershipTransferredIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// AssignmentHookOwnershipTransferred represents a OwnershipTransferred event raised by the AssignmentHook contract. -type AssignmentHookOwnershipTransferred 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 (_AssignmentHook *AssignmentHookFilterer) FilterOwnershipTransferred(opts *bind.FilterOpts, previousOwner []common.Address, newOwner []common.Address) (*AssignmentHookOwnershipTransferredIterator, 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 := _AssignmentHook.contract.FilterLogs(opts, "OwnershipTransferred", previousOwnerRule, newOwnerRule) - if err != nil { - return nil, err - } - return &AssignmentHookOwnershipTransferredIterator{contract: _AssignmentHook.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 (_AssignmentHook *AssignmentHookFilterer) WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *AssignmentHookOwnershipTransferred, 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 := _AssignmentHook.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(AssignmentHookOwnershipTransferred) - if err := _AssignmentHook.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 (_AssignmentHook *AssignmentHookFilterer) ParseOwnershipTransferred(log types.Log) (*AssignmentHookOwnershipTransferred, error) { - event := new(AssignmentHookOwnershipTransferred) - if err := _AssignmentHook.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// AssignmentHookPausedIterator is returned from FilterPaused and is used to iterate over the raw logs and unpacked data for Paused events raised by the AssignmentHook contract. -type AssignmentHookPausedIterator struct { - Event *AssignmentHookPaused // 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 *AssignmentHookPausedIterator) 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(AssignmentHookPaused) - 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(AssignmentHookPaused) - 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 *AssignmentHookPausedIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *AssignmentHookPausedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// AssignmentHookPaused represents a Paused event raised by the AssignmentHook contract. -type AssignmentHookPaused struct { - Account common.Address - Raw types.Log // Blockchain specific contextual infos -} - -// FilterPaused is a free log retrieval operation binding the contract event 0x62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258. -// -// Solidity: event Paused(address account) -func (_AssignmentHook *AssignmentHookFilterer) FilterPaused(opts *bind.FilterOpts) (*AssignmentHookPausedIterator, error) { - - logs, sub, err := _AssignmentHook.contract.FilterLogs(opts, "Paused") - if err != nil { - return nil, err - } - return &AssignmentHookPausedIterator{contract: _AssignmentHook.contract, event: "Paused", logs: logs, sub: sub}, nil -} - -// WatchPaused is a free log subscription operation binding the contract event 0x62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258. -// -// Solidity: event Paused(address account) -func (_AssignmentHook *AssignmentHookFilterer) WatchPaused(opts *bind.WatchOpts, sink chan<- *AssignmentHookPaused) (event.Subscription, error) { - - logs, sub, err := _AssignmentHook.contract.WatchLogs(opts, "Paused") - 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(AssignmentHookPaused) - if err := _AssignmentHook.contract.UnpackLog(event, "Paused", 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 -} - -// ParsePaused is a log parse operation binding the contract event 0x62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258. -// -// Solidity: event Paused(address account) -func (_AssignmentHook *AssignmentHookFilterer) ParsePaused(log types.Log) (*AssignmentHookPaused, error) { - event := new(AssignmentHookPaused) - if err := _AssignmentHook.contract.UnpackLog(event, "Paused", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// AssignmentHookUnpausedIterator is returned from FilterUnpaused and is used to iterate over the raw logs and unpacked data for Unpaused events raised by the AssignmentHook contract. -type AssignmentHookUnpausedIterator struct { - Event *AssignmentHookUnpaused // 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 *AssignmentHookUnpausedIterator) 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(AssignmentHookUnpaused) - 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(AssignmentHookUnpaused) - 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 *AssignmentHookUnpausedIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *AssignmentHookUnpausedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// AssignmentHookUnpaused represents a Unpaused event raised by the AssignmentHook contract. -type AssignmentHookUnpaused struct { - Account common.Address - Raw types.Log // Blockchain specific contextual infos -} - -// FilterUnpaused is a free log retrieval operation binding the contract event 0x5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa. -// -// Solidity: event Unpaused(address account) -func (_AssignmentHook *AssignmentHookFilterer) FilterUnpaused(opts *bind.FilterOpts) (*AssignmentHookUnpausedIterator, error) { - - logs, sub, err := _AssignmentHook.contract.FilterLogs(opts, "Unpaused") - if err != nil { - return nil, err - } - return &AssignmentHookUnpausedIterator{contract: _AssignmentHook.contract, event: "Unpaused", logs: logs, sub: sub}, nil -} - -// WatchUnpaused is a free log subscription operation binding the contract event 0x5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa. -// -// Solidity: event Unpaused(address account) -func (_AssignmentHook *AssignmentHookFilterer) WatchUnpaused(opts *bind.WatchOpts, sink chan<- *AssignmentHookUnpaused) (event.Subscription, error) { - - logs, sub, err := _AssignmentHook.contract.WatchLogs(opts, "Unpaused") - 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(AssignmentHookUnpaused) - if err := _AssignmentHook.contract.UnpackLog(event, "Unpaused", 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 -} - -// ParseUnpaused is a log parse operation binding the contract event 0x5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa. -// -// Solidity: event Unpaused(address account) -func (_AssignmentHook *AssignmentHookFilterer) ParseUnpaused(log types.Log) (*AssignmentHookUnpaused, error) { - event := new(AssignmentHookUnpaused) - if err := _AssignmentHook.contract.UnpackLog(event, "Unpaused", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// AssignmentHookUpgradedIterator is returned from FilterUpgraded and is used to iterate over the raw logs and unpacked data for Upgraded events raised by the AssignmentHook contract. -type AssignmentHookUpgradedIterator struct { - Event *AssignmentHookUpgraded // 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 *AssignmentHookUpgradedIterator) 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(AssignmentHookUpgraded) - 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(AssignmentHookUpgraded) - 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 *AssignmentHookUpgradedIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *AssignmentHookUpgradedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// AssignmentHookUpgraded represents a Upgraded event raised by the AssignmentHook contract. -type AssignmentHookUpgraded struct { - Implementation common.Address - Raw types.Log // Blockchain specific contextual infos -} - -// FilterUpgraded is a free log retrieval operation binding the contract event 0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b. -// -// Solidity: event Upgraded(address indexed implementation) -func (_AssignmentHook *AssignmentHookFilterer) FilterUpgraded(opts *bind.FilterOpts, implementation []common.Address) (*AssignmentHookUpgradedIterator, error) { - - var implementationRule []interface{} - for _, implementationItem := range implementation { - implementationRule = append(implementationRule, implementationItem) - } - - logs, sub, err := _AssignmentHook.contract.FilterLogs(opts, "Upgraded", implementationRule) - if err != nil { - return nil, err - } - return &AssignmentHookUpgradedIterator{contract: _AssignmentHook.contract, event: "Upgraded", logs: logs, sub: sub}, nil -} - -// WatchUpgraded is a free log subscription operation binding the contract event 0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b. -// -// Solidity: event Upgraded(address indexed implementation) -func (_AssignmentHook *AssignmentHookFilterer) WatchUpgraded(opts *bind.WatchOpts, sink chan<- *AssignmentHookUpgraded, implementation []common.Address) (event.Subscription, error) { - - var implementationRule []interface{} - for _, implementationItem := range implementation { - implementationRule = append(implementationRule, implementationItem) - } - - logs, sub, err := _AssignmentHook.contract.WatchLogs(opts, "Upgraded", implementationRule) - 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(AssignmentHookUpgraded) - if err := _AssignmentHook.contract.UnpackLog(event, "Upgraded", 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 -} - -// ParseUpgraded is a log parse operation binding the contract event 0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b. -// -// Solidity: event Upgraded(address indexed implementation) -func (_AssignmentHook *AssignmentHookFilterer) ParseUpgraded(log types.Log) (*AssignmentHookUpgraded, error) { - event := new(AssignmentHookUpgraded) - if err := _AssignmentHook.contract.UnpackLog(event, "Upgraded", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} diff --git a/packages/eventindexer/contracts/bridge/Bridge.go b/packages/eventindexer/contracts/bridge/Bridge.go index 6e31225296b..d674263b28d 100644 --- a/packages/eventindexer/contracts/bridge/Bridge.go +++ b/packages/eventindexer/contracts/bridge/Bridge.go @@ -31,9 +31,10 @@ var ( // BridgeProcessingStats is an auto generated low-level Go binding around an user-defined struct. type BridgeProcessingStats struct { - GasUsedInFeeCalc uint32 - ProofSize uint32 - NumCacheOps uint32 + GasUsedInFeeCalc uint32 + ProofSize uint32 + NumCacheOps uint32 + ProcessedByRelayer bool } // IBridgeContext is an auto generated low-level Go binding around an user-defined struct. @@ -60,7 +61,7 @@ type IBridgeMessage struct { // BridgeMetaData contains all meta data concerning the Bridge contract. var BridgeMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"receive\",\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"GAS_OVERHEAD\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"GAS_RESERVE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addressManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"context\",\"inputs\":[],\"outputs\":[{\"name\":\"ctx_\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Context\",\"components\":[{\"name\":\"msgHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"failMessage\",\"inputs\":[{\"name\":\"_message\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getMessageMinGasLimit\",\"inputs\":[{\"name\":\"dataLength\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"hashMessage\",\"inputs\":[{\"name\":\"_message\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"impl\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"inNonReentrant\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"init\",\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_addressManager\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"init2\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isDestChainEnabled\",\"inputs\":[{\"name\":\"_chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"enabled_\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"destBridge_\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isMessageFailed\",\"inputs\":[{\"name\":\"_message\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"_proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isMessageReceived\",\"inputs\":[{\"name\":\"_message\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"_proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isMessageSent\",\"inputs\":[{\"name\":\"_message\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"messageStatus\",\"inputs\":[{\"name\":\"msgHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumIBridge.Status\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"nextMessageId\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"processMessage\",\"inputs\":[{\"name\":\"_message\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"_proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"status_\",\"type\":\"uint8\",\"internalType\":\"enumIBridge.Status\"},{\"name\":\"reason_\",\"type\":\"uint8\",\"internalType\":\"enumIBridge.StatusReason\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"recallMessage\",\"inputs\":[{\"name\":\"_message\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"_proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"retryMessage\",\"inputs\":[{\"name\":\"_message\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"_isLastAttempt\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"selfDelegate\",\"inputs\":[{\"name\":\"_anyToken\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"sendMessage\",\"inputs\":[{\"name\":\"_message\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[{\"name\":\"msgHash_\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"message_\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"signalForFailedMessage\",\"inputs\":[{\"name\":\"_msgHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeTo\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"event\",\"name\":\"AdminChanged\",\"inputs\":[{\"name\":\"previousAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconUpgraded\",\"inputs\":[{\"name\":\"beacon\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MessageProcessed\",\"inputs\":[{\"name\":\"msgHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"message\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"stats\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structBridge.ProcessingStats\",\"components\":[{\"name\":\"gasUsedInFeeCalc\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"proofSize\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"numCacheOps\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MessageSent\",\"inputs\":[{\"name\":\"msgHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"message\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MessageStatusChanged\",\"inputs\":[{\"name\":\"msgHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"enumIBridge.Status\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"B_INSUFFICIENT_GAS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_CONTEXT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_FEE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_GAS_LIMIT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_VALUE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_MESSAGE_NOT_SENT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_OUT_OF_ETH_QUOTA\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_PERMISSION_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_RETRY_FAILED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_SIGNAL_NOT_RECEIVED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ETH_TRANSFER_FAILED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FUNC_NOT_IMPLEMENTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"REENTRANT_CALL\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_INVALID_MANAGER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_UNEXPECTED_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_ZERO_ADDR\",\"inputs\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ZERO_ADDRESS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_VALUE\",\"inputs\":[]}]", + ABI: "[{\"type\":\"function\",\"name\":\"GAS_OVERHEAD\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"GAS_RESERVE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"RELAYER_MAX_PROOF_BYTES\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addressManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"context\",\"inputs\":[],\"outputs\":[{\"name\":\"ctx_\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Context\",\"components\":[{\"name\":\"msgHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"failMessage\",\"inputs\":[{\"name\":\"_message\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getMessageMinGasLimit\",\"inputs\":[{\"name\":\"dataLength\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"hashMessage\",\"inputs\":[{\"name\":\"_message\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"impl\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"inNonReentrant\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"init\",\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_sharedAddressManager\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"init2\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isDestChainEnabled\",\"inputs\":[{\"name\":\"_chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"enabled_\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"destBridge_\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isMessageFailed\",\"inputs\":[{\"name\":\"_message\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"_proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isMessageReceived\",\"inputs\":[{\"name\":\"_message\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"_proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isMessageSent\",\"inputs\":[{\"name\":\"_message\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"messageStatus\",\"inputs\":[{\"name\":\"msgHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumIBridge.Status\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"nextMessageId\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"processMessage\",\"inputs\":[{\"name\":\"_message\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"_proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"status_\",\"type\":\"uint8\",\"internalType\":\"enumIBridge.Status\"},{\"name\":\"reason_\",\"type\":\"uint8\",\"internalType\":\"enumIBridge.StatusReason\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"recallMessage\",\"inputs\":[{\"name\":\"_message\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"_proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"retryMessage\",\"inputs\":[{\"name\":\"_message\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"_isLastAttempt\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"selfDelegate\",\"inputs\":[{\"name\":\"_anyToken\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"sendMessage\",\"inputs\":[{\"name\":\"_message\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[{\"name\":\"msgHash_\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"message_\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"signalForFailedMessage\",\"inputs\":[{\"name\":\"_msgHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeTo\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"event\",\"name\":\"AdminChanged\",\"inputs\":[{\"name\":\"previousAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconUpgraded\",\"inputs\":[{\"name\":\"beacon\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MessageProcessed\",\"inputs\":[{\"name\":\"msgHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"message\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"stats\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structBridge.ProcessingStats\",\"components\":[{\"name\":\"gasUsedInFeeCalc\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"proofSize\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"numCacheOps\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"processedByRelayer\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MessageSent\",\"inputs\":[{\"name\":\"msgHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"message\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MessageStatusChanged\",\"inputs\":[{\"name\":\"msgHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"enumIBridge.Status\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"B_INSUFFICIENT_GAS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_CONTEXT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_FEE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_GAS_LIMIT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_VALUE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_MESSAGE_NOT_SENT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_OUT_OF_ETH_QUOTA\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_PERMISSION_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_PROOF_TOO_LARGE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_RETRY_FAILED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_SIGNAL_NOT_RECEIVED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ETH_TRANSFER_FAILED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FUNC_NOT_IMPLEMENTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"REENTRANT_CALL\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_INVALID_MANAGER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_UNEXPECTED_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_ZERO_ADDR\",\"inputs\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ZERO_ADDRESS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_VALUE\",\"inputs\":[]}]", } // BridgeABI is the input ABI used to generate the binding from. @@ -271,6 +272,37 @@ func (_Bridge *BridgeCallerSession) GASRESERVE() (uint32, error) { return _Bridge.Contract.GASRESERVE(&_Bridge.CallOpts) } +// RELAYERMAXPROOFBYTES is a free data retrieval call binding the contract method 0x422770fa. +// +// Solidity: function RELAYER_MAX_PROOF_BYTES() view returns(uint256) +func (_Bridge *BridgeCaller) RELAYERMAXPROOFBYTES(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _Bridge.contract.Call(opts, &out, "RELAYER_MAX_PROOF_BYTES") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// RELAYERMAXPROOFBYTES is a free data retrieval call binding the contract method 0x422770fa. +// +// Solidity: function RELAYER_MAX_PROOF_BYTES() view returns(uint256) +func (_Bridge *BridgeSession) RELAYERMAXPROOFBYTES() (*big.Int, error) { + return _Bridge.Contract.RELAYERMAXPROOFBYTES(&_Bridge.CallOpts) +} + +// RELAYERMAXPROOFBYTES is a free data retrieval call binding the contract method 0x422770fa. +// +// Solidity: function RELAYER_MAX_PROOF_BYTES() view returns(uint256) +func (_Bridge *BridgeCallerSession) RELAYERMAXPROOFBYTES() (*big.Int, error) { + return _Bridge.Contract.RELAYERMAXPROOFBYTES(&_Bridge.CallOpts) +} + // AddressManager is a free data retrieval call binding the contract method 0x3ab76e9f. // // Solidity: function addressManager() view returns(address) @@ -949,23 +981,23 @@ func (_Bridge *BridgeTransactorSession) FailMessage(_message IBridgeMessage) (*t // Init is a paid mutator transaction binding the contract method 0xf09a4016. // -// Solidity: function init(address _owner, address _addressManager) returns() -func (_Bridge *BridgeTransactor) Init(opts *bind.TransactOpts, _owner common.Address, _addressManager common.Address) (*types.Transaction, error) { - return _Bridge.contract.Transact(opts, "init", _owner, _addressManager) +// Solidity: function init(address _owner, address _sharedAddressManager) returns() +func (_Bridge *BridgeTransactor) Init(opts *bind.TransactOpts, _owner common.Address, _sharedAddressManager common.Address) (*types.Transaction, error) { + return _Bridge.contract.Transact(opts, "init", _owner, _sharedAddressManager) } // Init is a paid mutator transaction binding the contract method 0xf09a4016. // -// Solidity: function init(address _owner, address _addressManager) returns() -func (_Bridge *BridgeSession) Init(_owner common.Address, _addressManager common.Address) (*types.Transaction, error) { - return _Bridge.Contract.Init(&_Bridge.TransactOpts, _owner, _addressManager) +// Solidity: function init(address _owner, address _sharedAddressManager) returns() +func (_Bridge *BridgeSession) Init(_owner common.Address, _sharedAddressManager common.Address) (*types.Transaction, error) { + return _Bridge.Contract.Init(&_Bridge.TransactOpts, _owner, _sharedAddressManager) } // Init is a paid mutator transaction binding the contract method 0xf09a4016. // -// Solidity: function init(address _owner, address _addressManager) returns() -func (_Bridge *BridgeTransactorSession) Init(_owner common.Address, _addressManager common.Address) (*types.Transaction, error) { - return _Bridge.Contract.Init(&_Bridge.TransactOpts, _owner, _addressManager) +// Solidity: function init(address _owner, address _sharedAddressManager) returns() +func (_Bridge *BridgeTransactorSession) Init(_owner common.Address, _sharedAddressManager common.Address) (*types.Transaction, error) { + return _Bridge.Contract.Init(&_Bridge.TransactOpts, _owner, _sharedAddressManager) } // Init2 is a paid mutator transaction binding the contract method 0x069489a2. @@ -1220,27 +1252,6 @@ func (_Bridge *BridgeTransactorSession) UpgradeToAndCall(newImplementation commo return _Bridge.Contract.UpgradeToAndCall(&_Bridge.TransactOpts, newImplementation, data) } -// Receive is a paid mutator transaction binding the contract receive function. -// -// Solidity: receive() payable returns() -func (_Bridge *BridgeTransactor) Receive(opts *bind.TransactOpts) (*types.Transaction, error) { - return _Bridge.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 (_Bridge *BridgeSession) Receive() (*types.Transaction, error) { - return _Bridge.Contract.Receive(&_Bridge.TransactOpts) -} - -// Receive is a paid mutator transaction binding the contract receive function. -// -// Solidity: receive() payable returns() -func (_Bridge *BridgeTransactorSession) Receive() (*types.Transaction, error) { - return _Bridge.Contract.Receive(&_Bridge.TransactOpts) -} - // BridgeAdminChangedIterator is returned from FilterAdminChanged and is used to iterate over the raw logs and unpacked data for AdminChanged events raised by the Bridge contract. type BridgeAdminChangedIterator struct { Event *BridgeAdminChanged // Event containing the contract specifics and raw log @@ -1729,9 +1740,9 @@ type BridgeMessageProcessed struct { Raw types.Log // Blockchain specific contextual infos } -// FilterMessageProcessed is a free log retrieval operation binding the contract event 0xdaa934be05606f60ac49cd6e2ca4fbb3a5c15680dd3304880ea6abb590486e3d. +// FilterMessageProcessed is a free log retrieval operation binding the contract event 0x8580f507761043ecdd2bdca084d6fb0109150b3d9842d854d34e3dea6d69387d. // -// Solidity: event MessageProcessed(bytes32 indexed msgHash, (uint64,uint64,uint32,address,uint64,address,uint64,address,address,uint256,bytes) message, (uint32,uint32,uint32) stats) +// Solidity: event MessageProcessed(bytes32 indexed msgHash, (uint64,uint64,uint32,address,uint64,address,uint64,address,address,uint256,bytes) message, (uint32,uint32,uint32,bool) stats) func (_Bridge *BridgeFilterer) FilterMessageProcessed(opts *bind.FilterOpts, msgHash [][32]byte) (*BridgeMessageProcessedIterator, error) { var msgHashRule []interface{} @@ -1746,9 +1757,9 @@ func (_Bridge *BridgeFilterer) FilterMessageProcessed(opts *bind.FilterOpts, msg return &BridgeMessageProcessedIterator{contract: _Bridge.contract, event: "MessageProcessed", logs: logs, sub: sub}, nil } -// WatchMessageProcessed is a free log subscription operation binding the contract event 0xdaa934be05606f60ac49cd6e2ca4fbb3a5c15680dd3304880ea6abb590486e3d. +// WatchMessageProcessed is a free log subscription operation binding the contract event 0x8580f507761043ecdd2bdca084d6fb0109150b3d9842d854d34e3dea6d69387d. // -// Solidity: event MessageProcessed(bytes32 indexed msgHash, (uint64,uint64,uint32,address,uint64,address,uint64,address,address,uint256,bytes) message, (uint32,uint32,uint32) stats) +// Solidity: event MessageProcessed(bytes32 indexed msgHash, (uint64,uint64,uint32,address,uint64,address,uint64,address,address,uint256,bytes) message, (uint32,uint32,uint32,bool) stats) func (_Bridge *BridgeFilterer) WatchMessageProcessed(opts *bind.WatchOpts, sink chan<- *BridgeMessageProcessed, msgHash [][32]byte) (event.Subscription, error) { var msgHashRule []interface{} @@ -1788,9 +1799,9 @@ func (_Bridge *BridgeFilterer) WatchMessageProcessed(opts *bind.WatchOpts, sink }), nil } -// ParseMessageProcessed is a log parse operation binding the contract event 0xdaa934be05606f60ac49cd6e2ca4fbb3a5c15680dd3304880ea6abb590486e3d. +// ParseMessageProcessed is a log parse operation binding the contract event 0x8580f507761043ecdd2bdca084d6fb0109150b3d9842d854d34e3dea6d69387d. // -// Solidity: event MessageProcessed(bytes32 indexed msgHash, (uint64,uint64,uint32,address,uint64,address,uint64,address,address,uint256,bytes) message, (uint32,uint32,uint32) stats) +// Solidity: event MessageProcessed(bytes32 indexed msgHash, (uint64,uint64,uint32,address,uint64,address,uint64,address,address,uint256,bytes) message, (uint32,uint32,uint32,bool) stats) func (_Bridge *BridgeFilterer) ParseMessageProcessed(log types.Log) (*BridgeMessageProcessed, error) { event := new(BridgeMessageProcessed) if err := _Bridge.contract.UnpackLog(event, "MessageProcessed", log); err != nil { diff --git a/packages/eventindexer/contracts/erc721/abi.go b/packages/eventindexer/contracts/erc721/abi.go new file mode 100644 index 00000000000..02523857c28 --- /dev/null +++ b/packages/eventindexer/contracts/erc721/abi.go @@ -0,0 +1,39 @@ +package erc721 + +var ( + ABI = `[ + { + "constant":true, + "inputs":[ + { + "name":"_tokenId", + "type":"uint256" + } + ], + "name":"tokenURI", + "outputs":[ + { + "name":"", + "type":"string" + } + ], + "payable":false, + "stateMutability":"view", + "type":"function" + }, + { + "constant": true, + "inputs": [], + "name": "symbol", + "outputs": [ + { + "name": "", + "type": "string" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + } + ]` +) diff --git a/packages/eventindexer/contracts/sgxverifier/SgxVerifier.go b/packages/eventindexer/contracts/sgxverifier/SgxVerifier.go index 1e63f0022d1..14b110d3450 100644 --- a/packages/eventindexer/contracts/sgxverifier/SgxVerifier.go +++ b/packages/eventindexer/contracts/sgxverifier/SgxVerifier.go @@ -40,6 +40,18 @@ type IVerifierContext struct { MsgSender common.Address } +// IVerifierContextV2 is an auto generated low-level Go binding around an user-defined struct. +type IVerifierContextV2 struct { + MetaHash [32]byte + BlobHash [32]byte + Prover common.Address + BlockId uint64 + IsContesting bool + BlobUsed bool + MsgSender common.Address + Tran TaikoDataTransition +} + // TaikoDataTierProof is an auto generated low-level Go binding around an user-defined struct. type TaikoDataTierProof struct { Tier uint16 @@ -113,7 +125,7 @@ type V3StructQEAuthData struct { // SgxVerifierMetaData contains all meta data concerning the SgxVerifier contract. var SgxVerifierMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"function\",\"name\":\"INSTANCE_EXPIRY\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"INSTANCE_VALIDITY_DELAY\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addInstances\",\"inputs\":[{\"name\":\"_instances\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addressManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"addressRegistered\",\"inputs\":[{\"name\":\"instanceAddress\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"alreadyAttested\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"deleteInstances\",\"inputs\":[{\"name\":\"_ids\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"impl\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"inNonReentrant\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"init\",\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_addressManager\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"instances\",\"inputs\":[{\"name\":\"instanceId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"validSince\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"nextInstanceId\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"registerInstance\",\"inputs\":[{\"name\":\"_attestation\",\"type\":\"tuple\",\"internalType\":\"structV3Struct.ParsedV3QuoteStruct\",\"components\":[{\"name\":\"header\",\"type\":\"tuple\",\"internalType\":\"structV3Struct.Header\",\"components\":[{\"name\":\"version\",\"type\":\"bytes2\",\"internalType\":\"bytes2\"},{\"name\":\"attestationKeyType\",\"type\":\"bytes2\",\"internalType\":\"bytes2\"},{\"name\":\"teeType\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"},{\"name\":\"qeSvn\",\"type\":\"bytes2\",\"internalType\":\"bytes2\"},{\"name\":\"pceSvn\",\"type\":\"bytes2\",\"internalType\":\"bytes2\"},{\"name\":\"qeVendorId\",\"type\":\"bytes16\",\"internalType\":\"bytes16\"},{\"name\":\"userData\",\"type\":\"bytes20\",\"internalType\":\"bytes20\"}]},{\"name\":\"localEnclaveReport\",\"type\":\"tuple\",\"internalType\":\"structV3Struct.EnclaveReport\",\"components\":[{\"name\":\"cpuSvn\",\"type\":\"bytes16\",\"internalType\":\"bytes16\"},{\"name\":\"miscSelect\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"},{\"name\":\"reserved1\",\"type\":\"bytes28\",\"internalType\":\"bytes28\"},{\"name\":\"attributes\",\"type\":\"bytes16\",\"internalType\":\"bytes16\"},{\"name\":\"mrEnclave\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"reserved2\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"mrSigner\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"reserved3\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"isvProdId\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"isvSvn\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"reserved4\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"reportData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"v3AuthData\",\"type\":\"tuple\",\"internalType\":\"structV3Struct.ECDSAQuoteV3AuthData\",\"components\":[{\"name\":\"ecdsa256BitSignature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"ecdsaAttestationKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"pckSignedQeReport\",\"type\":\"tuple\",\"internalType\":\"structV3Struct.EnclaveReport\",\"components\":[{\"name\":\"cpuSvn\",\"type\":\"bytes16\",\"internalType\":\"bytes16\"},{\"name\":\"miscSelect\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"},{\"name\":\"reserved1\",\"type\":\"bytes28\",\"internalType\":\"bytes28\"},{\"name\":\"attributes\",\"type\":\"bytes16\",\"internalType\":\"bytes16\"},{\"name\":\"mrEnclave\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"reserved2\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"mrSigner\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"reserved3\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"isvProdId\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"isvSvn\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"reserved4\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"reportData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"qeReportSignature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"qeAuthData\",\"type\":\"tuple\",\"internalType\":\"structV3Struct.QEAuthData\",\"components\":[{\"name\":\"parsedDataSize\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"certification\",\"type\":\"tuple\",\"internalType\":\"structV3Struct.CertificationData\",\"components\":[{\"name\":\"certType\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"certDataSize\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"decodedCertDataArray\",\"type\":\"bytes[3]\",\"internalType\":\"bytes[3]\"}]}]}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeTo\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"verifyProof\",\"inputs\":[{\"name\":\"_ctx\",\"type\":\"tuple\",\"internalType\":\"structIVerifier.Context\",\"components\":[{\"name\":\"metaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blobHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"prover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"isContesting\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"blobUsed\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"msgSender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"_tran\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.Transition\",\"components\":[{\"name\":\"parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"graffiti\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"_proof\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.TierProof\",\"components\":[{\"name\":\"tier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AdminChanged\",\"inputs\":[{\"name\":\"previousAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconUpgraded\",\"inputs\":[{\"name\":\"beacon\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InstanceAdded\",\"inputs\":[{\"name\":\"id\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"instance\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"replaced\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"validSince\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InstanceDeleted\",\"inputs\":[{\"name\":\"id\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"instance\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"FUNC_NOT_IMPLEMENTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"REENTRANT_CALL\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_INVALID_MANAGER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_UNEXPECTED_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_ZERO_ADDR\",\"inputs\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"SGX_ALREADY_ATTESTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SGX_INVALID_ATTESTATION\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SGX_INVALID_INSTANCE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SGX_INVALID_PROOF\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SGX_RA_NOT_SUPPORTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_ADDRESS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_VALUE\",\"inputs\":[]}]", + ABI: "[{\"type\":\"function\",\"name\":\"INSTANCE_EXPIRY\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"INSTANCE_VALIDITY_DELAY\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addInstances\",\"inputs\":[{\"name\":\"_instances\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addressManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"addressRegistered\",\"inputs\":[{\"name\":\"instanceAddress\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"alreadyAttested\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"deleteInstances\",\"inputs\":[{\"name\":\"_ids\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"impl\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"inNonReentrant\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"init\",\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_rollupAddressManager\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"instances\",\"inputs\":[{\"name\":\"instanceId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"validSince\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"nextInstanceId\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"registerInstance\",\"inputs\":[{\"name\":\"_attestation\",\"type\":\"tuple\",\"internalType\":\"structV3Struct.ParsedV3QuoteStruct\",\"components\":[{\"name\":\"header\",\"type\":\"tuple\",\"internalType\":\"structV3Struct.Header\",\"components\":[{\"name\":\"version\",\"type\":\"bytes2\",\"internalType\":\"bytes2\"},{\"name\":\"attestationKeyType\",\"type\":\"bytes2\",\"internalType\":\"bytes2\"},{\"name\":\"teeType\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"},{\"name\":\"qeSvn\",\"type\":\"bytes2\",\"internalType\":\"bytes2\"},{\"name\":\"pceSvn\",\"type\":\"bytes2\",\"internalType\":\"bytes2\"},{\"name\":\"qeVendorId\",\"type\":\"bytes16\",\"internalType\":\"bytes16\"},{\"name\":\"userData\",\"type\":\"bytes20\",\"internalType\":\"bytes20\"}]},{\"name\":\"localEnclaveReport\",\"type\":\"tuple\",\"internalType\":\"structV3Struct.EnclaveReport\",\"components\":[{\"name\":\"cpuSvn\",\"type\":\"bytes16\",\"internalType\":\"bytes16\"},{\"name\":\"miscSelect\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"},{\"name\":\"reserved1\",\"type\":\"bytes28\",\"internalType\":\"bytes28\"},{\"name\":\"attributes\",\"type\":\"bytes16\",\"internalType\":\"bytes16\"},{\"name\":\"mrEnclave\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"reserved2\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"mrSigner\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"reserved3\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"isvProdId\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"isvSvn\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"reserved4\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"reportData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"v3AuthData\",\"type\":\"tuple\",\"internalType\":\"structV3Struct.ECDSAQuoteV3AuthData\",\"components\":[{\"name\":\"ecdsa256BitSignature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"ecdsaAttestationKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"pckSignedQeReport\",\"type\":\"tuple\",\"internalType\":\"structV3Struct.EnclaveReport\",\"components\":[{\"name\":\"cpuSvn\",\"type\":\"bytes16\",\"internalType\":\"bytes16\"},{\"name\":\"miscSelect\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"},{\"name\":\"reserved1\",\"type\":\"bytes28\",\"internalType\":\"bytes28\"},{\"name\":\"attributes\",\"type\":\"bytes16\",\"internalType\":\"bytes16\"},{\"name\":\"mrEnclave\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"reserved2\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"mrSigner\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"reserved3\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"isvProdId\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"isvSvn\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"reserved4\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"reportData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"qeReportSignature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"qeAuthData\",\"type\":\"tuple\",\"internalType\":\"structV3Struct.QEAuthData\",\"components\":[{\"name\":\"parsedDataSize\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"certification\",\"type\":\"tuple\",\"internalType\":\"structV3Struct.CertificationData\",\"components\":[{\"name\":\"certType\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"certDataSize\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"decodedCertDataArray\",\"type\":\"bytes[3]\",\"internalType\":\"bytes[3]\"}]}]}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeTo\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"verifyBatchProof\",\"inputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structIVerifier.ContextV2[]\",\"components\":[{\"name\":\"metaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blobHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"prover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"isContesting\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"blobUsed\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"msgSender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"tran\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.Transition\",\"components\":[{\"name\":\"parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"graffiti\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}]},{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.TierProof\",\"components\":[{\"name\":\"tier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"verifyProof\",\"inputs\":[{\"name\":\"_ctx\",\"type\":\"tuple\",\"internalType\":\"structIVerifier.Context\",\"components\":[{\"name\":\"metaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blobHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"prover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"isContesting\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"blobUsed\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"msgSender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"_tran\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.Transition\",\"components\":[{\"name\":\"parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"graffiti\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"_proof\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.TierProof\",\"components\":[{\"name\":\"tier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AdminChanged\",\"inputs\":[{\"name\":\"previousAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconUpgraded\",\"inputs\":[{\"name\":\"beacon\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InstanceAdded\",\"inputs\":[{\"name\":\"id\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"instance\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"replaced\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"validSince\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InstanceDeleted\",\"inputs\":[{\"name\":\"id\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"instance\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"FUNC_NOT_IMPLEMENTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"REENTRANT_CALL\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_INVALID_MANAGER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_UNEXPECTED_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_ZERO_ADDR\",\"inputs\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"SGX_ALREADY_ATTESTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SGX_INVALID_ATTESTATION\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SGX_INVALID_INSTANCE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SGX_INVALID_PROOF\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SGX_RA_NOT_SUPPORTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_ADDRESS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_VALUE\",\"inputs\":[]}]", } // SgxVerifierABI is the input ABI used to generate the binding from. @@ -741,6 +753,35 @@ func (_SgxVerifier *SgxVerifierCallerSession) Resolve0(_name [32]byte, _allowZer return _SgxVerifier.Contract.Resolve0(&_SgxVerifier.CallOpts, _name, _allowZeroAddress) } +// VerifyBatchProof is a free data retrieval call binding the contract method 0x7103b6da. +// +// Solidity: function verifyBatchProof((bytes32,bytes32,address,uint64,bool,bool,address,(bytes32,bytes32,bytes32,bytes32))[] , (uint16,bytes) ) view returns() +func (_SgxVerifier *SgxVerifierCaller) VerifyBatchProof(opts *bind.CallOpts, arg0 []IVerifierContextV2, arg1 TaikoDataTierProof) error { + var out []interface{} + err := _SgxVerifier.contract.Call(opts, &out, "verifyBatchProof", arg0, arg1) + + if err != nil { + return err + } + + return err + +} + +// VerifyBatchProof is a free data retrieval call binding the contract method 0x7103b6da. +// +// Solidity: function verifyBatchProof((bytes32,bytes32,address,uint64,bool,bool,address,(bytes32,bytes32,bytes32,bytes32))[] , (uint16,bytes) ) view returns() +func (_SgxVerifier *SgxVerifierSession) VerifyBatchProof(arg0 []IVerifierContextV2, arg1 TaikoDataTierProof) error { + return _SgxVerifier.Contract.VerifyBatchProof(&_SgxVerifier.CallOpts, arg0, arg1) +} + +// VerifyBatchProof is a free data retrieval call binding the contract method 0x7103b6da. +// +// Solidity: function verifyBatchProof((bytes32,bytes32,address,uint64,bool,bool,address,(bytes32,bytes32,bytes32,bytes32))[] , (uint16,bytes) ) view returns() +func (_SgxVerifier *SgxVerifierCallerSession) VerifyBatchProof(arg0 []IVerifierContextV2, arg1 TaikoDataTierProof) error { + return _SgxVerifier.Contract.VerifyBatchProof(&_SgxVerifier.CallOpts, arg0, arg1) +} + // AcceptOwnership is a paid mutator transaction binding the contract method 0x79ba5097. // // Solidity: function acceptOwnership() returns() @@ -806,23 +847,23 @@ func (_SgxVerifier *SgxVerifierTransactorSession) DeleteInstances(_ids []*big.In // Init is a paid mutator transaction binding the contract method 0xf09a4016. // -// Solidity: function init(address _owner, address _addressManager) returns() -func (_SgxVerifier *SgxVerifierTransactor) Init(opts *bind.TransactOpts, _owner common.Address, _addressManager common.Address) (*types.Transaction, error) { - return _SgxVerifier.contract.Transact(opts, "init", _owner, _addressManager) +// Solidity: function init(address _owner, address _rollupAddressManager) returns() +func (_SgxVerifier *SgxVerifierTransactor) Init(opts *bind.TransactOpts, _owner common.Address, _rollupAddressManager common.Address) (*types.Transaction, error) { + return _SgxVerifier.contract.Transact(opts, "init", _owner, _rollupAddressManager) } // Init is a paid mutator transaction binding the contract method 0xf09a4016. // -// Solidity: function init(address _owner, address _addressManager) returns() -func (_SgxVerifier *SgxVerifierSession) Init(_owner common.Address, _addressManager common.Address) (*types.Transaction, error) { - return _SgxVerifier.Contract.Init(&_SgxVerifier.TransactOpts, _owner, _addressManager) +// Solidity: function init(address _owner, address _rollupAddressManager) returns() +func (_SgxVerifier *SgxVerifierSession) Init(_owner common.Address, _rollupAddressManager common.Address) (*types.Transaction, error) { + return _SgxVerifier.Contract.Init(&_SgxVerifier.TransactOpts, _owner, _rollupAddressManager) } // Init is a paid mutator transaction binding the contract method 0xf09a4016. // -// Solidity: function init(address _owner, address _addressManager) returns() -func (_SgxVerifier *SgxVerifierTransactorSession) Init(_owner common.Address, _addressManager common.Address) (*types.Transaction, error) { - return _SgxVerifier.Contract.Init(&_SgxVerifier.TransactOpts, _owner, _addressManager) +// Solidity: function init(address _owner, address _rollupAddressManager) returns() +func (_SgxVerifier *SgxVerifierTransactorSession) Init(_owner common.Address, _rollupAddressManager common.Address) (*types.Transaction, error) { + return _SgxVerifier.Contract.Init(&_SgxVerifier.TransactOpts, _owner, _rollupAddressManager) } // Pause is a paid mutator transaction binding the contract method 0x8456cb59. diff --git a/packages/eventindexer/contracts/taikol1/TaikoL1.go b/packages/eventindexer/contracts/taikol1/TaikoL1.go index 6aa08ced8a5..c0212e5e1f8 100644 --- a/packages/eventindexer/contracts/taikol1/TaikoL1.go +++ b/packages/eventindexer/contracts/taikol1/TaikoL1.go @@ -29,6 +29,15 @@ var ( _ = abi.ConvertType ) +// LibSharedDataBaseFeeConfig is an auto generated low-level Go binding around an user-defined struct. +type LibSharedDataBaseFeeConfig struct { + AdjustmentQuotient uint8 + SharingPctg uint8 + GasIssuancePerSecond uint32 + MinGasExcess uint64 + MaxGasIssuancePerBlock uint32 +} + // TaikoDataBlock is an auto generated low-level Go binding around an user-defined struct. type TaikoDataBlock struct { MetaHash [32]byte @@ -59,15 +68,55 @@ type TaikoDataBlockMetadata struct { Sender common.Address } +// TaikoDataBlockMetadataV2 is an auto generated low-level Go binding around an user-defined struct. +type TaikoDataBlockMetadataV2 struct { + AnchorBlockHash [32]byte + Difficulty [32]byte + BlobHash [32]byte + ExtraData [32]byte + Coinbase common.Address + Id uint64 + GasLimit uint32 + Timestamp uint64 + AnchorBlockId uint64 + MinTier uint16 + BlobUsed bool + ParentMetaHash [32]byte + Proposer common.Address + LivenessBond *big.Int + ProposedAt uint64 + ProposedIn uint64 + BlobTxListOffset uint32 + BlobTxListLength uint32 + BlobIndex uint8 + BaseFeeConfig LibSharedDataBaseFeeConfig +} + +// TaikoDataBlockV2 is an auto generated low-level Go binding around an user-defined struct. +type TaikoDataBlockV2 struct { + MetaHash [32]byte + AssignedProver common.Address + LivenessBond *big.Int + BlockId uint64 + ProposedAt uint64 + ProposedIn uint64 + NextTransitionId *big.Int + LivenessBondReturned bool + VerifiedTransitionId *big.Int +} + // TaikoDataConfig is an auto generated low-level Go binding around an user-defined struct. type TaikoDataConfig struct { - ChainId uint64 - BlockMaxProposals uint64 - BlockRingBufferSize uint64 - MaxBlocksToVerifyPerProposal uint64 - BlockMaxGasLimit uint32 - LivenessBond *big.Int - BlockSyncThreshold uint8 + ChainId uint64 + BlockMaxProposals uint64 + BlockRingBufferSize uint64 + MaxBlocksToVerify uint64 + BlockMaxGasLimit uint32 + LivenessBond *big.Int + StateRootSyncInternal uint8 + MaxAnchorHeightOffset uint64 + BaseFeeConfig LibSharedDataBaseFeeConfig + OntakeForkHeight uint64 } // TaikoDataEthDeposit is an auto generated low-level Go binding around an user-defined struct. @@ -120,7 +169,7 @@ type TaikoDataTransitionState struct { // TaikoL1MetaData contains all meta data concerning the TaikoL1 contract. var TaikoL1MetaData = &bind.MetaData{ - ABI: "[{\"type\":\"receive\",\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addressManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getBlock\",\"inputs\":[{\"name\":\"_blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"blk_\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.Block\",\"components\":[{\"name\":\"metaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"assignedProver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"livenessBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"proposedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"proposedIn\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nextTransitionId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"verifiedTransitionId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getConfig\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.Config\",\"components\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blockMaxProposals\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blockRingBufferSize\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxBlocksToVerifyPerProposal\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blockMaxGasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"livenessBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"blockSyncThreshold\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStateVariables\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.SlotA\",\"components\":[{\"name\":\"genesisHeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"genesisTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastSyncedBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastSynecdAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.SlotB\",\"components\":[{\"name\":\"numBlocks\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastVerifiedBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"provingPaused\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"__reservedB1\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"__reservedB2\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"__reservedB3\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"lastUnpausedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getTransition\",\"inputs\":[{\"name\":\"_blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_tid\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.TransitionState\",\"components\":[{\"name\":\"key\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"prover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"validityBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"contester\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"contestBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"tier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"__reserved1\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getTransition\",\"inputs\":[{\"name\":\"_blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.TransitionState\",\"components\":[{\"name\":\"key\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"prover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"validityBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"contester\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"contestBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"tier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"__reserved1\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"impl\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"inNonReentrant\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"init\",\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_addressManager\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_genesisBlockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_toPause\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"init2\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseProving\",\"inputs\":[{\"name\":\"_pause\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proposeBlock\",\"inputs\":[{\"name\":\"_params\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"_txList\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"meta_\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.BlockMetadata\",\"components\":[{\"name\":\"l1Hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"difficulty\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blobHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"extraData\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"depositsHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"coinbase\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"l1Height\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minTier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"blobUsed\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"parentMetaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"deposits_\",\"type\":\"tuple[]\",\"internalType\":\"structTaikoData.EthDeposit[]\",\"components\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"proveBlock\",\"inputs\":[{\"name\":\"_blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_input\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resetGenesisHash\",\"inputs\":[{\"name\":\"_genesisBlockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"slotA\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.SlotA\",\"components\":[{\"name\":\"genesisHeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"genesisTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastSyncedBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastSynecdAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"slotB\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.SlotB\",\"components\":[{\"name\":\"numBlocks\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastVerifiedBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"provingPaused\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"__reservedB1\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"__reservedB2\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"__reservedB3\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"lastUnpausedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"state\",\"inputs\":[],\"outputs\":[{\"name\":\"__reserve1\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"slotA\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.SlotA\",\"components\":[{\"name\":\"genesisHeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"genesisTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastSyncedBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastSynecdAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"name\":\"slotB\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.SlotB\",\"components\":[{\"name\":\"numBlocks\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastVerifiedBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"provingPaused\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"__reservedB1\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"__reservedB2\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"__reservedB3\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"lastUnpausedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeTo\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"verifyBlocks\",\"inputs\":[{\"name\":\"_maxBlocksToVerify\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AdminChanged\",\"inputs\":[{\"name\":\"previousAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconUpgraded\",\"inputs\":[{\"name\":\"beacon\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BlockProposed\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"assignedProver\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"livenessBond\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"meta\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.BlockMetadata\",\"components\":[{\"name\":\"l1Hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"difficulty\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blobHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"extraData\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"depositsHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"coinbase\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"l1Height\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minTier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"blobUsed\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"parentMetaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"depositsProcessed\",\"type\":\"tuple[]\",\"indexed\":false,\"internalType\":\"structTaikoData.EthDeposit[]\",\"components\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BlockProposed\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"assignedProver\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"livenessBond\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"meta\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.BlockMetadata\",\"components\":[{\"name\":\"l1Hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"difficulty\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blobHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"extraData\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"depositsHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"coinbase\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"l1Height\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minTier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"blobUsed\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"parentMetaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"depositsProcessed\",\"type\":\"tuple[]\",\"indexed\":false,\"internalType\":\"structTaikoData.EthDeposit[]\",\"components\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BlockVerified\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"prover\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BlockVerified\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"prover\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ProvingPaused\",\"inputs\":[{\"name\":\"paused\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ProvingPaused\",\"inputs\":[{\"name\":\"paused\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StateVariablesUpdated\",\"inputs\":[{\"name\":\"slotB\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.SlotB\",\"components\":[{\"name\":\"numBlocks\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastVerifiedBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"provingPaused\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"__reservedB1\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"__reservedB2\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"__reservedB3\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"lastUnpausedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StateVariablesUpdated\",\"inputs\":[{\"name\":\"slotB\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.SlotB\",\"components\":[{\"name\":\"numBlocks\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastVerifiedBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"provingPaused\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"__reservedB1\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"__reservedB2\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"__reservedB3\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"lastUnpausedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TransitionContested\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"tran\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.Transition\",\"components\":[{\"name\":\"parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"graffiti\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"contester\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"contestBond\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TransitionContested\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"tran\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.Transition\",\"components\":[{\"name\":\"parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"graffiti\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"contester\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"contestBond\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TransitionProved\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"tran\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.Transition\",\"components\":[{\"name\":\"parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"graffiti\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"prover\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"validityBond\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TransitionProved\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"tran\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.Transition\",\"components\":[{\"name\":\"parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"graffiti\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"prover\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"validityBond\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"ETH_TRANSFER_FAILED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FUNC_NOT_IMPLEMENTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_ALREADY_CONTESTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_ALREADY_CONTESTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_ALREADY_PROVED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_ALREADY_PROVED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOB_NOT_AVAILABLE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOB_NOT_AVAILABLE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOB_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOB_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOCK_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOCK_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOCK_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_CANNOT_CONTEST\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_CANNOT_CONTEST\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_BLOCK_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_BLOCK_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_BLOCK_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_CONFIG\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_CONFIG\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_GENESIS_HASH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_GENESIS_HASH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_HOOK\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_HOOK\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_PARAM\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_PROVER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_PROVER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_SIG\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_SIG\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_TIER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_TIER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_TRANSITION\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_TRANSITION\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_LIVENESS_BOND_NOT_RECEIVED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_LIVENESS_BOND_NOT_RECEIVED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_NOT_ASSIGNED_PROVER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_NOT_ASSIGNED_PROVER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_PROVING_PAUSED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_RECEIVE_DISABLED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TOO_LATE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TOO_LATE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TOO_MANY_BLOCKS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TOO_MANY_BLOCKS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TRANSITION_ID_ZERO\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TRANSITION_ID_ZERO\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TRANSITION_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TRANSITION_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNAUTHORIZED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNAUTHORIZED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNEXPECTED_PARENT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNEXPECTED_PARENT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNEXPECTED_TRANSITION_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNEXPECTED_TRANSITION_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"REENTRANT_CALL\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_INVALID_MANAGER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_UNEXPECTED_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_ZERO_ADDR\",\"inputs\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ZERO_ADDRESS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_VALUE\",\"inputs\":[]}]", + ABI: "[{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addressManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"bondBalanceOf\",\"inputs\":[{\"name\":\"_user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"depositBond\",\"inputs\":[{\"name\":\"_amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getBlock\",\"inputs\":[{\"name\":\"_blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"blk_\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.Block\",\"components\":[{\"name\":\"metaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"assignedProver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"livenessBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"proposedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"proposedIn\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nextTransitionId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"verifiedTransitionId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getBlockV2\",\"inputs\":[{\"name\":\"_blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"blk_\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.BlockV2\",\"components\":[{\"name\":\"metaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"assignedProver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"livenessBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"proposedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"proposedIn\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nextTransitionId\",\"type\":\"uint24\",\"internalType\":\"uint24\"},{\"name\":\"livenessBondReturned\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"verifiedTransitionId\",\"type\":\"uint24\",\"internalType\":\"uint24\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getConfig\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.Config\",\"components\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blockMaxProposals\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blockRingBufferSize\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxBlocksToVerify\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blockMaxGasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"livenessBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"stateRootSyncInternal\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"maxAnchorHeightOffset\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"baseFeeConfig\",\"type\":\"tuple\",\"internalType\":\"structLibSharedData.BaseFeeConfig\",\"components\":[{\"name\":\"adjustmentQuotient\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"sharingPctg\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"gasIssuancePerSecond\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"minGasExcess\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxGasIssuancePerBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"ontakeForkHeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"getLastSyncedBlock\",\"inputs\":[],\"outputs\":[{\"name\":\"blockId_\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blockHash_\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot_\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"verifiedAt_\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getLastVerifiedBlock\",\"inputs\":[],\"outputs\":[{\"name\":\"blockId_\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blockHash_\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot_\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"verifiedAt_\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStateVariables\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.SlotA\",\"components\":[{\"name\":\"genesisHeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"genesisTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastSyncedBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastSynecdAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.SlotB\",\"components\":[{\"name\":\"numBlocks\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastVerifiedBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"provingPaused\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"__reservedB1\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"__reservedB2\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"__reservedB3\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"lastUnpausedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getTransition\",\"inputs\":[{\"name\":\"_blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_tid\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.TransitionState\",\"components\":[{\"name\":\"key\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"prover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"validityBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"contester\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"contestBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"tier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"__reserved1\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getTransition\",\"inputs\":[{\"name\":\"_blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.TransitionState\",\"components\":[{\"name\":\"key\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"prover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"validityBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"contester\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"contestBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"tier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"__reserved1\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getTransitions\",\"inputs\":[{\"name\":\"_blockIds\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"},{\"name\":\"_tids\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structTaikoData.TransitionState[]\",\"components\":[{\"name\":\"key\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"prover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"validityBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"contester\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"contestBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"tier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"__reserved1\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getTransitions\",\"inputs\":[{\"name\":\"_blockIds\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"},{\"name\":\"_parentHashes\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structTaikoData.TransitionState[]\",\"components\":[{\"name\":\"key\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"prover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"validityBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"contester\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"contestBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"tier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"__reserved1\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getVerifiedBlockProver\",\"inputs\":[{\"name\":\"_blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"prover_\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"impl\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"inNonReentrant\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"init\",\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_rollupAddressManager\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_genesisBlockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_toPause\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"init2\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseProving\",\"inputs\":[{\"name\":\"_pause\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proposeBlock\",\"inputs\":[{\"name\":\"_params\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"_txList\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"meta_\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.BlockMetadata\",\"components\":[{\"name\":\"l1Hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"difficulty\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blobHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"extraData\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"depositsHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"coinbase\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"l1Height\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minTier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"blobUsed\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"parentMetaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"deposits_\",\"type\":\"tuple[]\",\"internalType\":\"structTaikoData.EthDeposit[]\",\"components\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"proposeBlockV2\",\"inputs\":[{\"name\":\"_params\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"_txList\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"meta_\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.BlockMetadataV2\",\"components\":[{\"name\":\"anchorBlockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"difficulty\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blobHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"extraData\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"coinbase\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"anchorBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minTier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"blobUsed\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"parentMetaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proposer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"livenessBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"proposedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"proposedIn\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blobTxListOffset\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"blobTxListLength\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"blobIndex\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"baseFeeConfig\",\"type\":\"tuple\",\"internalType\":\"structLibSharedData.BaseFeeConfig\",\"components\":[{\"name\":\"adjustmentQuotient\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"sharingPctg\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"gasIssuancePerSecond\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"minGasExcess\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxGasIssuancePerBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}]}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"proposeBlocksV2\",\"inputs\":[{\"name\":\"_paramsArr\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"_txListArr\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"}],\"outputs\":[{\"name\":\"metaArr_\",\"type\":\"tuple[]\",\"internalType\":\"structTaikoData.BlockMetadataV2[]\",\"components\":[{\"name\":\"anchorBlockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"difficulty\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blobHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"extraData\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"coinbase\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"anchorBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minTier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"blobUsed\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"parentMetaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proposer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"livenessBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"proposedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"proposedIn\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blobTxListOffset\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"blobTxListLength\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"blobIndex\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"baseFeeConfig\",\"type\":\"tuple\",\"internalType\":\"structLibSharedData.BaseFeeConfig\",\"components\":[{\"name\":\"adjustmentQuotient\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"sharingPctg\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"gasIssuancePerSecond\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"minGasExcess\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxGasIssuancePerBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}]}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"proveBlock\",\"inputs\":[{\"name\":\"_blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_input\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"proveBlocks\",\"inputs\":[{\"name\":\"_blockIds\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"},{\"name\":\"_inputs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"_batchProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"state\",\"inputs\":[],\"outputs\":[{\"name\":\"__reserve1\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"slotA\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.SlotA\",\"components\":[{\"name\":\"genesisHeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"genesisTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastSyncedBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastSynecdAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"name\":\"slotB\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.SlotB\",\"components\":[{\"name\":\"numBlocks\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastVerifiedBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"provingPaused\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"__reservedB1\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"__reservedB2\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"__reservedB3\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"lastUnpausedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeTo\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"verifyBlocks\",\"inputs\":[{\"name\":\"_maxBlocksToVerify\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawBond\",\"inputs\":[{\"name\":\"_amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AdminChanged\",\"inputs\":[{\"name\":\"previousAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconUpgraded\",\"inputs\":[{\"name\":\"beacon\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BlockProposed\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"assignedProver\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"livenessBond\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"meta\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.BlockMetadata\",\"components\":[{\"name\":\"l1Hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"difficulty\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blobHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"extraData\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"depositsHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"coinbase\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"l1Height\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minTier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"blobUsed\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"parentMetaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"depositsProcessed\",\"type\":\"tuple[]\",\"indexed\":false,\"internalType\":\"structTaikoData.EthDeposit[]\",\"components\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BlockProposedV2\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"meta\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.BlockMetadataV2\",\"components\":[{\"name\":\"anchorBlockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"difficulty\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blobHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"extraData\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"coinbase\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"anchorBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minTier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"blobUsed\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"parentMetaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proposer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"livenessBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"proposedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"proposedIn\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blobTxListOffset\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"blobTxListLength\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"blobIndex\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"baseFeeConfig\",\"type\":\"tuple\",\"internalType\":\"structLibSharedData.BaseFeeConfig\",\"components\":[{\"name\":\"adjustmentQuotient\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"sharingPctg\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"gasIssuancePerSecond\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"minGasExcess\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxGasIssuancePerBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BlockVerified\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"prover\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BlockVerified\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"prover\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BlockVerifiedV2\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"prover\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BlockVerifiedV2\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"prover\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BondCredited\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BondDebited\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"CalldataTxList\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"txList\",\"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\":\"OwnershipTransferStarted\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ProvingPaused\",\"inputs\":[{\"name\":\"paused\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ProvingPaused\",\"inputs\":[{\"name\":\"paused\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StateVariablesUpdated\",\"inputs\":[{\"name\":\"slotB\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.SlotB\",\"components\":[{\"name\":\"numBlocks\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastVerifiedBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"provingPaused\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"__reservedB1\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"__reservedB2\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"__reservedB3\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"lastUnpausedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TransitionContested\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"tran\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.Transition\",\"components\":[{\"name\":\"parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"graffiti\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"contester\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"contestBond\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TransitionContestedV2\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"tran\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.Transition\",\"components\":[{\"name\":\"parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"graffiti\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"contester\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"contestBond\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"proposedIn\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TransitionProved\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"tran\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.Transition\",\"components\":[{\"name\":\"parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"graffiti\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"prover\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"validityBond\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TransitionProvedV2\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"tran\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.Transition\",\"components\":[{\"name\":\"parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"graffiti\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"prover\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"validityBond\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"proposedIn\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"FUNC_NOT_IMPLEMENTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_FORK_ERROR\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_BLOCK_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_GENESIS_HASH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_PARAMS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_PARAMS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_PROVING_PAUSED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TRANSITION_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNEXPECTED_TRANSITION_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"REENTRANT_CALL\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_INVALID_MANAGER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_UNEXPECTED_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_ZERO_ADDR\",\"inputs\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ZERO_ADDRESS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_VALUE\",\"inputs\":[]}]", } // TaikoL1ABI is the input ABI used to generate the binding from. @@ -300,6 +349,37 @@ func (_TaikoL1 *TaikoL1CallerSession) AddressManager() (common.Address, error) { return _TaikoL1.Contract.AddressManager(&_TaikoL1.CallOpts) } +// BondBalanceOf is a free data retrieval call binding the contract method 0xa9c2c835. +// +// Solidity: function bondBalanceOf(address _user) view returns(uint256) +func (_TaikoL1 *TaikoL1Caller) BondBalanceOf(opts *bind.CallOpts, _user common.Address) (*big.Int, error) { + var out []interface{} + err := _TaikoL1.contract.Call(opts, &out, "bondBalanceOf", _user) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// BondBalanceOf is a free data retrieval call binding the contract method 0xa9c2c835. +// +// Solidity: function bondBalanceOf(address _user) view returns(uint256) +func (_TaikoL1 *TaikoL1Session) BondBalanceOf(_user common.Address) (*big.Int, error) { + return _TaikoL1.Contract.BondBalanceOf(&_TaikoL1.CallOpts, _user) +} + +// BondBalanceOf is a free data retrieval call binding the contract method 0xa9c2c835. +// +// Solidity: function bondBalanceOf(address _user) view returns(uint256) +func (_TaikoL1 *TaikoL1CallerSession) BondBalanceOf(_user common.Address) (*big.Int, error) { + return _TaikoL1.Contract.BondBalanceOf(&_TaikoL1.CallOpts, _user) +} + // GetBlock is a free data retrieval call binding the contract method 0x5fa15e79. // // Solidity: function getBlock(uint64 _blockId) view returns((bytes32,address,uint96,uint64,uint64,uint64,uint32,uint32) blk_) @@ -331,9 +411,40 @@ func (_TaikoL1 *TaikoL1CallerSession) GetBlock(_blockId uint64) (TaikoDataBlock, return _TaikoL1.Contract.GetBlock(&_TaikoL1.CallOpts, _blockId) } +// GetBlockV2 is a free data retrieval call binding the contract method 0x3f0c544a. +// +// Solidity: function getBlockV2(uint64 _blockId) view returns((bytes32,address,uint96,uint64,uint64,uint64,uint24,bool,uint24) blk_) +func (_TaikoL1 *TaikoL1Caller) GetBlockV2(opts *bind.CallOpts, _blockId uint64) (TaikoDataBlockV2, error) { + var out []interface{} + err := _TaikoL1.contract.Call(opts, &out, "getBlockV2", _blockId) + + if err != nil { + return *new(TaikoDataBlockV2), err + } + + out0 := *abi.ConvertType(out[0], new(TaikoDataBlockV2)).(*TaikoDataBlockV2) + + return out0, err + +} + +// GetBlockV2 is a free data retrieval call binding the contract method 0x3f0c544a. +// +// Solidity: function getBlockV2(uint64 _blockId) view returns((bytes32,address,uint96,uint64,uint64,uint64,uint24,bool,uint24) blk_) +func (_TaikoL1 *TaikoL1Session) GetBlockV2(_blockId uint64) (TaikoDataBlockV2, error) { + return _TaikoL1.Contract.GetBlockV2(&_TaikoL1.CallOpts, _blockId) +} + +// GetBlockV2 is a free data retrieval call binding the contract method 0x3f0c544a. +// +// Solidity: function getBlockV2(uint64 _blockId) view returns((bytes32,address,uint96,uint64,uint64,uint64,uint24,bool,uint24) blk_) +func (_TaikoL1 *TaikoL1CallerSession) GetBlockV2(_blockId uint64) (TaikoDataBlockV2, error) { + return _TaikoL1.Contract.GetBlockV2(&_TaikoL1.CallOpts, _blockId) +} + // GetConfig is a free data retrieval call binding the contract method 0xc3f909d4. // -// Solidity: function getConfig() view returns((uint64,uint64,uint64,uint64,uint32,uint96,uint8)) +// Solidity: function getConfig() pure returns((uint64,uint64,uint64,uint64,uint32,uint96,uint8,uint64,(uint8,uint8,uint32,uint64,uint32),uint64)) func (_TaikoL1 *TaikoL1Caller) GetConfig(opts *bind.CallOpts) (TaikoDataConfig, error) { var out []interface{} err := _TaikoL1.contract.Call(opts, &out, "getConfig") @@ -350,18 +461,128 @@ func (_TaikoL1 *TaikoL1Caller) GetConfig(opts *bind.CallOpts) (TaikoDataConfig, // GetConfig is a free data retrieval call binding the contract method 0xc3f909d4. // -// Solidity: function getConfig() view returns((uint64,uint64,uint64,uint64,uint32,uint96,uint8)) +// Solidity: function getConfig() pure returns((uint64,uint64,uint64,uint64,uint32,uint96,uint8,uint64,(uint8,uint8,uint32,uint64,uint32),uint64)) func (_TaikoL1 *TaikoL1Session) GetConfig() (TaikoDataConfig, error) { return _TaikoL1.Contract.GetConfig(&_TaikoL1.CallOpts) } // GetConfig is a free data retrieval call binding the contract method 0xc3f909d4. // -// Solidity: function getConfig() view returns((uint64,uint64,uint64,uint64,uint32,uint96,uint8)) +// Solidity: function getConfig() pure returns((uint64,uint64,uint64,uint64,uint32,uint96,uint8,uint64,(uint8,uint8,uint32,uint64,uint32),uint64)) func (_TaikoL1 *TaikoL1CallerSession) GetConfig() (TaikoDataConfig, error) { return _TaikoL1.Contract.GetConfig(&_TaikoL1.CallOpts) } +// GetLastSyncedBlock is a free data retrieval call binding the contract method 0x9413caa9. +// +// Solidity: function getLastSyncedBlock() view returns(uint64 blockId_, bytes32 blockHash_, bytes32 stateRoot_, uint64 verifiedAt_) +func (_TaikoL1 *TaikoL1Caller) GetLastSyncedBlock(opts *bind.CallOpts) (struct { + BlockId uint64 + BlockHash [32]byte + StateRoot [32]byte + VerifiedAt uint64 +}, error) { + var out []interface{} + err := _TaikoL1.contract.Call(opts, &out, "getLastSyncedBlock") + + outstruct := new(struct { + BlockId uint64 + BlockHash [32]byte + StateRoot [32]byte + VerifiedAt uint64 + }) + if err != nil { + return *outstruct, err + } + + outstruct.BlockId = *abi.ConvertType(out[0], new(uint64)).(*uint64) + outstruct.BlockHash = *abi.ConvertType(out[1], new([32]byte)).(*[32]byte) + outstruct.StateRoot = *abi.ConvertType(out[2], new([32]byte)).(*[32]byte) + outstruct.VerifiedAt = *abi.ConvertType(out[3], new(uint64)).(*uint64) + + return *outstruct, err + +} + +// GetLastSyncedBlock is a free data retrieval call binding the contract method 0x9413caa9. +// +// Solidity: function getLastSyncedBlock() view returns(uint64 blockId_, bytes32 blockHash_, bytes32 stateRoot_, uint64 verifiedAt_) +func (_TaikoL1 *TaikoL1Session) GetLastSyncedBlock() (struct { + BlockId uint64 + BlockHash [32]byte + StateRoot [32]byte + VerifiedAt uint64 +}, error) { + return _TaikoL1.Contract.GetLastSyncedBlock(&_TaikoL1.CallOpts) +} + +// GetLastSyncedBlock is a free data retrieval call binding the contract method 0x9413caa9. +// +// Solidity: function getLastSyncedBlock() view returns(uint64 blockId_, bytes32 blockHash_, bytes32 stateRoot_, uint64 verifiedAt_) +func (_TaikoL1 *TaikoL1CallerSession) GetLastSyncedBlock() (struct { + BlockId uint64 + BlockHash [32]byte + StateRoot [32]byte + VerifiedAt uint64 +}, error) { + return _TaikoL1.Contract.GetLastSyncedBlock(&_TaikoL1.CallOpts) +} + +// GetLastVerifiedBlock is a free data retrieval call binding the contract method 0x26af7986. +// +// Solidity: function getLastVerifiedBlock() view returns(uint64 blockId_, bytes32 blockHash_, bytes32 stateRoot_, uint64 verifiedAt_) +func (_TaikoL1 *TaikoL1Caller) GetLastVerifiedBlock(opts *bind.CallOpts) (struct { + BlockId uint64 + BlockHash [32]byte + StateRoot [32]byte + VerifiedAt uint64 +}, error) { + var out []interface{} + err := _TaikoL1.contract.Call(opts, &out, "getLastVerifiedBlock") + + outstruct := new(struct { + BlockId uint64 + BlockHash [32]byte + StateRoot [32]byte + VerifiedAt uint64 + }) + if err != nil { + return *outstruct, err + } + + outstruct.BlockId = *abi.ConvertType(out[0], new(uint64)).(*uint64) + outstruct.BlockHash = *abi.ConvertType(out[1], new([32]byte)).(*[32]byte) + outstruct.StateRoot = *abi.ConvertType(out[2], new([32]byte)).(*[32]byte) + outstruct.VerifiedAt = *abi.ConvertType(out[3], new(uint64)).(*uint64) + + return *outstruct, err + +} + +// GetLastVerifiedBlock is a free data retrieval call binding the contract method 0x26af7986. +// +// Solidity: function getLastVerifiedBlock() view returns(uint64 blockId_, bytes32 blockHash_, bytes32 stateRoot_, uint64 verifiedAt_) +func (_TaikoL1 *TaikoL1Session) GetLastVerifiedBlock() (struct { + BlockId uint64 + BlockHash [32]byte + StateRoot [32]byte + VerifiedAt uint64 +}, error) { + return _TaikoL1.Contract.GetLastVerifiedBlock(&_TaikoL1.CallOpts) +} + +// GetLastVerifiedBlock is a free data retrieval call binding the contract method 0x26af7986. +// +// Solidity: function getLastVerifiedBlock() view returns(uint64 blockId_, bytes32 blockHash_, bytes32 stateRoot_, uint64 verifiedAt_) +func (_TaikoL1 *TaikoL1CallerSession) GetLastVerifiedBlock() (struct { + BlockId uint64 + BlockHash [32]byte + StateRoot [32]byte + VerifiedAt uint64 +}, error) { + return _TaikoL1.Contract.GetLastVerifiedBlock(&_TaikoL1.CallOpts) +} + // GetStateVariables is a free data retrieval call binding the contract method 0xdde89cf5. // // Solidity: function getStateVariables() view returns((uint64,uint64,uint64,uint64), (uint64,uint64,bool,uint8,uint16,uint32,uint64)) @@ -456,6 +677,99 @@ func (_TaikoL1 *TaikoL1CallerSession) GetTransition0(_blockId uint64, _parentHas return _TaikoL1.Contract.GetTransition0(&_TaikoL1.CallOpts, _blockId, _parentHash) } +// GetTransitions is a free data retrieval call binding the contract method 0xaf2ba709. +// +// Solidity: function getTransitions(uint64[] _blockIds, uint32[] _tids) view returns((bytes32,bytes32,bytes32,address,uint96,address,uint96,uint64,uint16,uint8)[]) +func (_TaikoL1 *TaikoL1Caller) GetTransitions(opts *bind.CallOpts, _blockIds []uint64, _tids []uint32) ([]TaikoDataTransitionState, error) { + var out []interface{} + err := _TaikoL1.contract.Call(opts, &out, "getTransitions", _blockIds, _tids) + + if err != nil { + return *new([]TaikoDataTransitionState), err + } + + out0 := *abi.ConvertType(out[0], new([]TaikoDataTransitionState)).(*[]TaikoDataTransitionState) + + return out0, err + +} + +// GetTransitions is a free data retrieval call binding the contract method 0xaf2ba709. +// +// Solidity: function getTransitions(uint64[] _blockIds, uint32[] _tids) view returns((bytes32,bytes32,bytes32,address,uint96,address,uint96,uint64,uint16,uint8)[]) +func (_TaikoL1 *TaikoL1Session) GetTransitions(_blockIds []uint64, _tids []uint32) ([]TaikoDataTransitionState, error) { + return _TaikoL1.Contract.GetTransitions(&_TaikoL1.CallOpts, _blockIds, _tids) +} + +// GetTransitions is a free data retrieval call binding the contract method 0xaf2ba709. +// +// Solidity: function getTransitions(uint64[] _blockIds, uint32[] _tids) view returns((bytes32,bytes32,bytes32,address,uint96,address,uint96,uint64,uint16,uint8)[]) +func (_TaikoL1 *TaikoL1CallerSession) GetTransitions(_blockIds []uint64, _tids []uint32) ([]TaikoDataTransitionState, error) { + return _TaikoL1.Contract.GetTransitions(&_TaikoL1.CallOpts, _blockIds, _tids) +} + +// GetTransitions0 is a free data retrieval call binding the contract method 0xb89c61bc. +// +// Solidity: function getTransitions(uint64[] _blockIds, bytes32[] _parentHashes) view returns((bytes32,bytes32,bytes32,address,uint96,address,uint96,uint64,uint16,uint8)[]) +func (_TaikoL1 *TaikoL1Caller) GetTransitions0(opts *bind.CallOpts, _blockIds []uint64, _parentHashes [][32]byte) ([]TaikoDataTransitionState, error) { + var out []interface{} + err := _TaikoL1.contract.Call(opts, &out, "getTransitions0", _blockIds, _parentHashes) + + if err != nil { + return *new([]TaikoDataTransitionState), err + } + + out0 := *abi.ConvertType(out[0], new([]TaikoDataTransitionState)).(*[]TaikoDataTransitionState) + + return out0, err + +} + +// GetTransitions0 is a free data retrieval call binding the contract method 0xb89c61bc. +// +// Solidity: function getTransitions(uint64[] _blockIds, bytes32[] _parentHashes) view returns((bytes32,bytes32,bytes32,address,uint96,address,uint96,uint64,uint16,uint8)[]) +func (_TaikoL1 *TaikoL1Session) GetTransitions0(_blockIds []uint64, _parentHashes [][32]byte) ([]TaikoDataTransitionState, error) { + return _TaikoL1.Contract.GetTransitions0(&_TaikoL1.CallOpts, _blockIds, _parentHashes) +} + +// GetTransitions0 is a free data retrieval call binding the contract method 0xb89c61bc. +// +// Solidity: function getTransitions(uint64[] _blockIds, bytes32[] _parentHashes) view returns((bytes32,bytes32,bytes32,address,uint96,address,uint96,uint64,uint16,uint8)[]) +func (_TaikoL1 *TaikoL1CallerSession) GetTransitions0(_blockIds []uint64, _parentHashes [][32]byte) ([]TaikoDataTransitionState, error) { + return _TaikoL1.Contract.GetTransitions0(&_TaikoL1.CallOpts, _blockIds, _parentHashes) +} + +// GetVerifiedBlockProver is a free data retrieval call binding the contract method 0x6074b8c1. +// +// Solidity: function getVerifiedBlockProver(uint64 _blockId) view returns(address prover_) +func (_TaikoL1 *TaikoL1Caller) GetVerifiedBlockProver(opts *bind.CallOpts, _blockId uint64) (common.Address, error) { + var out []interface{} + err := _TaikoL1.contract.Call(opts, &out, "getVerifiedBlockProver", _blockId) + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// GetVerifiedBlockProver is a free data retrieval call binding the contract method 0x6074b8c1. +// +// Solidity: function getVerifiedBlockProver(uint64 _blockId) view returns(address prover_) +func (_TaikoL1 *TaikoL1Session) GetVerifiedBlockProver(_blockId uint64) (common.Address, error) { + return _TaikoL1.Contract.GetVerifiedBlockProver(&_TaikoL1.CallOpts, _blockId) +} + +// GetVerifiedBlockProver is a free data retrieval call binding the contract method 0x6074b8c1. +// +// Solidity: function getVerifiedBlockProver(uint64 _blockId) view returns(address prover_) +func (_TaikoL1 *TaikoL1CallerSession) GetVerifiedBlockProver(_blockId uint64) (common.Address, error) { + return _TaikoL1.Contract.GetVerifiedBlockProver(&_TaikoL1.CallOpts, _blockId) +} + // Impl is a free data retrieval call binding the contract method 0x8abf6077. // // Solidity: function impl() view returns(address) @@ -735,68 +1049,6 @@ func (_TaikoL1 *TaikoL1CallerSession) Resolve0(_name [32]byte, _allowZeroAddress return _TaikoL1.Contract.Resolve0(&_TaikoL1.CallOpts, _name, _allowZeroAddress) } -// SlotA is a free data retrieval call binding the contract method 0xc7821568. -// -// Solidity: function slotA() view returns((uint64,uint64,uint64,uint64)) -func (_TaikoL1 *TaikoL1Caller) SlotA(opts *bind.CallOpts) (TaikoDataSlotA, error) { - var out []interface{} - err := _TaikoL1.contract.Call(opts, &out, "slotA") - - if err != nil { - return *new(TaikoDataSlotA), err - } - - out0 := *abi.ConvertType(out[0], new(TaikoDataSlotA)).(*TaikoDataSlotA) - - return out0, err - -} - -// SlotA is a free data retrieval call binding the contract method 0xc7821568. -// -// Solidity: function slotA() view returns((uint64,uint64,uint64,uint64)) -func (_TaikoL1 *TaikoL1Session) SlotA() (TaikoDataSlotA, error) { - return _TaikoL1.Contract.SlotA(&_TaikoL1.CallOpts) -} - -// SlotA is a free data retrieval call binding the contract method 0xc7821568. -// -// Solidity: function slotA() view returns((uint64,uint64,uint64,uint64)) -func (_TaikoL1 *TaikoL1CallerSession) SlotA() (TaikoDataSlotA, error) { - return _TaikoL1.Contract.SlotA(&_TaikoL1.CallOpts) -} - -// SlotB is a free data retrieval call binding the contract method 0x19e8dce2. -// -// Solidity: function slotB() view returns((uint64,uint64,bool,uint8,uint16,uint32,uint64)) -func (_TaikoL1 *TaikoL1Caller) SlotB(opts *bind.CallOpts) (TaikoDataSlotB, error) { - var out []interface{} - err := _TaikoL1.contract.Call(opts, &out, "slotB") - - if err != nil { - return *new(TaikoDataSlotB), err - } - - out0 := *abi.ConvertType(out[0], new(TaikoDataSlotB)).(*TaikoDataSlotB) - - return out0, err - -} - -// SlotB is a free data retrieval call binding the contract method 0x19e8dce2. -// -// Solidity: function slotB() view returns((uint64,uint64,bool,uint8,uint16,uint32,uint64)) -func (_TaikoL1 *TaikoL1Session) SlotB() (TaikoDataSlotB, error) { - return _TaikoL1.Contract.SlotB(&_TaikoL1.CallOpts) -} - -// SlotB is a free data retrieval call binding the contract method 0x19e8dce2. -// -// Solidity: function slotB() view returns((uint64,uint64,bool,uint8,uint16,uint32,uint64)) -func (_TaikoL1 *TaikoL1CallerSession) SlotB() (TaikoDataSlotB, error) { - return _TaikoL1.Contract.SlotB(&_TaikoL1.CallOpts) -} - // State is a free data retrieval call binding the contract method 0xc19d93fb. // // Solidity: function state() view returns(bytes32 __reserve1, (uint64,uint64,uint64,uint64) slotA, (uint64,uint64,bool,uint8,uint16,uint32,uint64) slotB) @@ -868,25 +1120,46 @@ func (_TaikoL1 *TaikoL1TransactorSession) AcceptOwnership() (*types.Transaction, return _TaikoL1.Contract.AcceptOwnership(&_TaikoL1.TransactOpts) } +// DepositBond is a paid mutator transaction binding the contract method 0x4dcb05f9. +// +// Solidity: function depositBond(uint256 _amount) returns() +func (_TaikoL1 *TaikoL1Transactor) DepositBond(opts *bind.TransactOpts, _amount *big.Int) (*types.Transaction, error) { + return _TaikoL1.contract.Transact(opts, "depositBond", _amount) +} + +// DepositBond is a paid mutator transaction binding the contract method 0x4dcb05f9. +// +// Solidity: function depositBond(uint256 _amount) returns() +func (_TaikoL1 *TaikoL1Session) DepositBond(_amount *big.Int) (*types.Transaction, error) { + return _TaikoL1.Contract.DepositBond(&_TaikoL1.TransactOpts, _amount) +} + +// DepositBond is a paid mutator transaction binding the contract method 0x4dcb05f9. +// +// Solidity: function depositBond(uint256 _amount) returns() +func (_TaikoL1 *TaikoL1TransactorSession) DepositBond(_amount *big.Int) (*types.Transaction, error) { + return _TaikoL1.Contract.DepositBond(&_TaikoL1.TransactOpts, _amount) +} + // Init is a paid mutator transaction binding the contract method 0x29d1b62f. // -// Solidity: function init(address _owner, address _addressManager, bytes32 _genesisBlockHash, bool _toPause) returns() -func (_TaikoL1 *TaikoL1Transactor) Init(opts *bind.TransactOpts, _owner common.Address, _addressManager common.Address, _genesisBlockHash [32]byte, _toPause bool) (*types.Transaction, error) { - return _TaikoL1.contract.Transact(opts, "init", _owner, _addressManager, _genesisBlockHash, _toPause) +// Solidity: function init(address _owner, address _rollupAddressManager, bytes32 _genesisBlockHash, bool _toPause) returns() +func (_TaikoL1 *TaikoL1Transactor) Init(opts *bind.TransactOpts, _owner common.Address, _rollupAddressManager common.Address, _genesisBlockHash [32]byte, _toPause bool) (*types.Transaction, error) { + return _TaikoL1.contract.Transact(opts, "init", _owner, _rollupAddressManager, _genesisBlockHash, _toPause) } // Init is a paid mutator transaction binding the contract method 0x29d1b62f. // -// Solidity: function init(address _owner, address _addressManager, bytes32 _genesisBlockHash, bool _toPause) returns() -func (_TaikoL1 *TaikoL1Session) Init(_owner common.Address, _addressManager common.Address, _genesisBlockHash [32]byte, _toPause bool) (*types.Transaction, error) { - return _TaikoL1.Contract.Init(&_TaikoL1.TransactOpts, _owner, _addressManager, _genesisBlockHash, _toPause) +// Solidity: function init(address _owner, address _rollupAddressManager, bytes32 _genesisBlockHash, bool _toPause) returns() +func (_TaikoL1 *TaikoL1Session) Init(_owner common.Address, _rollupAddressManager common.Address, _genesisBlockHash [32]byte, _toPause bool) (*types.Transaction, error) { + return _TaikoL1.Contract.Init(&_TaikoL1.TransactOpts, _owner, _rollupAddressManager, _genesisBlockHash, _toPause) } // Init is a paid mutator transaction binding the contract method 0x29d1b62f. // -// Solidity: function init(address _owner, address _addressManager, bytes32 _genesisBlockHash, bool _toPause) returns() -func (_TaikoL1 *TaikoL1TransactorSession) Init(_owner common.Address, _addressManager common.Address, _genesisBlockHash [32]byte, _toPause bool) (*types.Transaction, error) { - return _TaikoL1.Contract.Init(&_TaikoL1.TransactOpts, _owner, _addressManager, _genesisBlockHash, _toPause) +// Solidity: function init(address _owner, address _rollupAddressManager, bytes32 _genesisBlockHash, bool _toPause) returns() +func (_TaikoL1 *TaikoL1TransactorSession) Init(_owner common.Address, _rollupAddressManager common.Address, _genesisBlockHash [32]byte, _toPause bool) (*types.Transaction, error) { + return _TaikoL1.Contract.Init(&_TaikoL1.TransactOpts, _owner, _rollupAddressManager, _genesisBlockHash, _toPause) } // Init2 is a paid mutator transaction binding the contract method 0x069489a2. @@ -973,6 +1246,48 @@ func (_TaikoL1 *TaikoL1TransactorSession) ProposeBlock(_params []byte, _txList [ return _TaikoL1.Contract.ProposeBlock(&_TaikoL1.TransactOpts, _params, _txList) } +// ProposeBlockV2 is a paid mutator transaction binding the contract method 0x648885fb. +// +// Solidity: function proposeBlockV2(bytes _params, bytes _txList) returns((bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address,uint96,uint64,uint64,uint32,uint32,uint8,(uint8,uint8,uint32,uint64,uint32)) meta_) +func (_TaikoL1 *TaikoL1Transactor) ProposeBlockV2(opts *bind.TransactOpts, _params []byte, _txList []byte) (*types.Transaction, error) { + return _TaikoL1.contract.Transact(opts, "proposeBlockV2", _params, _txList) +} + +// ProposeBlockV2 is a paid mutator transaction binding the contract method 0x648885fb. +// +// Solidity: function proposeBlockV2(bytes _params, bytes _txList) returns((bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address,uint96,uint64,uint64,uint32,uint32,uint8,(uint8,uint8,uint32,uint64,uint32)) meta_) +func (_TaikoL1 *TaikoL1Session) ProposeBlockV2(_params []byte, _txList []byte) (*types.Transaction, error) { + return _TaikoL1.Contract.ProposeBlockV2(&_TaikoL1.TransactOpts, _params, _txList) +} + +// ProposeBlockV2 is a paid mutator transaction binding the contract method 0x648885fb. +// +// Solidity: function proposeBlockV2(bytes _params, bytes _txList) returns((bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address,uint96,uint64,uint64,uint32,uint32,uint8,(uint8,uint8,uint32,uint64,uint32)) meta_) +func (_TaikoL1 *TaikoL1TransactorSession) ProposeBlockV2(_params []byte, _txList []byte) (*types.Transaction, error) { + return _TaikoL1.Contract.ProposeBlockV2(&_TaikoL1.TransactOpts, _params, _txList) +} + +// ProposeBlocksV2 is a paid mutator transaction binding the contract method 0x0c8f4a10. +// +// Solidity: function proposeBlocksV2(bytes[] _paramsArr, bytes[] _txListArr) returns((bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address,uint96,uint64,uint64,uint32,uint32,uint8,(uint8,uint8,uint32,uint64,uint32))[] metaArr_) +func (_TaikoL1 *TaikoL1Transactor) ProposeBlocksV2(opts *bind.TransactOpts, _paramsArr [][]byte, _txListArr [][]byte) (*types.Transaction, error) { + return _TaikoL1.contract.Transact(opts, "proposeBlocksV2", _paramsArr, _txListArr) +} + +// ProposeBlocksV2 is a paid mutator transaction binding the contract method 0x0c8f4a10. +// +// Solidity: function proposeBlocksV2(bytes[] _paramsArr, bytes[] _txListArr) returns((bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address,uint96,uint64,uint64,uint32,uint32,uint8,(uint8,uint8,uint32,uint64,uint32))[] metaArr_) +func (_TaikoL1 *TaikoL1Session) ProposeBlocksV2(_paramsArr [][]byte, _txListArr [][]byte) (*types.Transaction, error) { + return _TaikoL1.Contract.ProposeBlocksV2(&_TaikoL1.TransactOpts, _paramsArr, _txListArr) +} + +// ProposeBlocksV2 is a paid mutator transaction binding the contract method 0x0c8f4a10. +// +// Solidity: function proposeBlocksV2(bytes[] _paramsArr, bytes[] _txListArr) returns((bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address,uint96,uint64,uint64,uint32,uint32,uint8,(uint8,uint8,uint32,uint64,uint32))[] metaArr_) +func (_TaikoL1 *TaikoL1TransactorSession) ProposeBlocksV2(_paramsArr [][]byte, _txListArr [][]byte) (*types.Transaction, error) { + return _TaikoL1.Contract.ProposeBlocksV2(&_TaikoL1.TransactOpts, _paramsArr, _txListArr) +} + // ProveBlock is a paid mutator transaction binding the contract method 0x10d008bd. // // Solidity: function proveBlock(uint64 _blockId, bytes _input) returns() @@ -994,6 +1309,27 @@ func (_TaikoL1 *TaikoL1TransactorSession) ProveBlock(_blockId uint64, _input []b return _TaikoL1.Contract.ProveBlock(&_TaikoL1.TransactOpts, _blockId, _input) } +// ProveBlocks is a paid mutator transaction binding the contract method 0x440b6e18. +// +// Solidity: function proveBlocks(uint64[] _blockIds, bytes[] _inputs, bytes _batchProof) returns() +func (_TaikoL1 *TaikoL1Transactor) ProveBlocks(opts *bind.TransactOpts, _blockIds []uint64, _inputs [][]byte, _batchProof []byte) (*types.Transaction, error) { + return _TaikoL1.contract.Transact(opts, "proveBlocks", _blockIds, _inputs, _batchProof) +} + +// ProveBlocks is a paid mutator transaction binding the contract method 0x440b6e18. +// +// Solidity: function proveBlocks(uint64[] _blockIds, bytes[] _inputs, bytes _batchProof) returns() +func (_TaikoL1 *TaikoL1Session) ProveBlocks(_blockIds []uint64, _inputs [][]byte, _batchProof []byte) (*types.Transaction, error) { + return _TaikoL1.Contract.ProveBlocks(&_TaikoL1.TransactOpts, _blockIds, _inputs, _batchProof) +} + +// ProveBlocks is a paid mutator transaction binding the contract method 0x440b6e18. +// +// Solidity: function proveBlocks(uint64[] _blockIds, bytes[] _inputs, bytes _batchProof) returns() +func (_TaikoL1 *TaikoL1TransactorSession) ProveBlocks(_blockIds []uint64, _inputs [][]byte, _batchProof []byte) (*types.Transaction, error) { + return _TaikoL1.Contract.ProveBlocks(&_TaikoL1.TransactOpts, _blockIds, _inputs, _batchProof) +} + // RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6. // // Solidity: function renounceOwnership() returns() @@ -1015,27 +1351,6 @@ func (_TaikoL1 *TaikoL1TransactorSession) RenounceOwnership() (*types.Transactio return _TaikoL1.Contract.RenounceOwnership(&_TaikoL1.TransactOpts) } -// ResetGenesisHash is a paid mutator transaction binding the contract method 0xb008bedb. -// -// Solidity: function resetGenesisHash(bytes32 _genesisBlockHash) returns() -func (_TaikoL1 *TaikoL1Transactor) ResetGenesisHash(opts *bind.TransactOpts, _genesisBlockHash [32]byte) (*types.Transaction, error) { - return _TaikoL1.contract.Transact(opts, "resetGenesisHash", _genesisBlockHash) -} - -// ResetGenesisHash is a paid mutator transaction binding the contract method 0xb008bedb. -// -// Solidity: function resetGenesisHash(bytes32 _genesisBlockHash) returns() -func (_TaikoL1 *TaikoL1Session) ResetGenesisHash(_genesisBlockHash [32]byte) (*types.Transaction, error) { - return _TaikoL1.Contract.ResetGenesisHash(&_TaikoL1.TransactOpts, _genesisBlockHash) -} - -// ResetGenesisHash is a paid mutator transaction binding the contract method 0xb008bedb. -// -// Solidity: function resetGenesisHash(bytes32 _genesisBlockHash) returns() -func (_TaikoL1 *TaikoL1TransactorSession) ResetGenesisHash(_genesisBlockHash [32]byte) (*types.Transaction, error) { - return _TaikoL1.Contract.ResetGenesisHash(&_TaikoL1.TransactOpts, _genesisBlockHash) -} - // TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b. // // Solidity: function transferOwnership(address newOwner) returns() @@ -1141,25 +1456,25 @@ func (_TaikoL1 *TaikoL1TransactorSession) VerifyBlocks(_maxBlocksToVerify uint64 return _TaikoL1.Contract.VerifyBlocks(&_TaikoL1.TransactOpts, _maxBlocksToVerify) } -// Receive is a paid mutator transaction binding the contract receive function. +// WithdrawBond is a paid mutator transaction binding the contract method 0xc3daab96. // -// Solidity: receive() payable returns() -func (_TaikoL1 *TaikoL1Transactor) Receive(opts *bind.TransactOpts) (*types.Transaction, error) { - return _TaikoL1.contract.RawTransact(opts, nil) // calldata is disallowed for receive function +// Solidity: function withdrawBond(uint256 _amount) returns() +func (_TaikoL1 *TaikoL1Transactor) WithdrawBond(opts *bind.TransactOpts, _amount *big.Int) (*types.Transaction, error) { + return _TaikoL1.contract.Transact(opts, "withdrawBond", _amount) } -// Receive is a paid mutator transaction binding the contract receive function. +// WithdrawBond is a paid mutator transaction binding the contract method 0xc3daab96. // -// Solidity: receive() payable returns() -func (_TaikoL1 *TaikoL1Session) Receive() (*types.Transaction, error) { - return _TaikoL1.Contract.Receive(&_TaikoL1.TransactOpts) +// Solidity: function withdrawBond(uint256 _amount) returns() +func (_TaikoL1 *TaikoL1Session) WithdrawBond(_amount *big.Int) (*types.Transaction, error) { + return _TaikoL1.Contract.WithdrawBond(&_TaikoL1.TransactOpts, _amount) } -// Receive is a paid mutator transaction binding the contract receive function. +// WithdrawBond is a paid mutator transaction binding the contract method 0xc3daab96. // -// Solidity: receive() payable returns() -func (_TaikoL1 *TaikoL1TransactorSession) Receive() (*types.Transaction, error) { - return _TaikoL1.Contract.Receive(&_TaikoL1.TransactOpts) +// Solidity: function withdrawBond(uint256 _amount) returns() +func (_TaikoL1 *TaikoL1TransactorSession) WithdrawBond(_amount *big.Int) (*types.Transaction, error) { + return _TaikoL1.Contract.WithdrawBond(&_TaikoL1.TransactOpts, _amount) } // TaikoL1AdminChangedIterator is returned from FilterAdminChanged and is used to iterate over the raw logs and unpacked data for AdminChanged events raised by the TaikoL1 contract. @@ -1520,40 +1835,807 @@ type TaikoL1BlockProposed struct { // FilterBlockProposed is a free log retrieval operation binding the contract event 0xcda4e564245eb15494bc6da29f6a42e1941cf57f5314bf35bab8a1fca0a9c60a. // -// Solidity: event BlockProposed(uint256 indexed blockId, address indexed assignedProver, uint96 livenessBond, (bytes32,bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address) meta, (address,uint96,uint64)[] depositsProcessed) -func (_TaikoL1 *TaikoL1Filterer) FilterBlockProposed(opts *bind.FilterOpts, blockId []*big.Int, assignedProver []common.Address) (*TaikoL1BlockProposedIterator, error) { +// Solidity: event BlockProposed(uint256 indexed blockId, address indexed assignedProver, uint96 livenessBond, (bytes32,bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address) meta, (address,uint96,uint64)[] depositsProcessed) +func (_TaikoL1 *TaikoL1Filterer) FilterBlockProposed(opts *bind.FilterOpts, blockId []*big.Int, assignedProver []common.Address) (*TaikoL1BlockProposedIterator, error) { + + var blockIdRule []interface{} + for _, blockIdItem := range blockId { + blockIdRule = append(blockIdRule, blockIdItem) + } + var assignedProverRule []interface{} + for _, assignedProverItem := range assignedProver { + assignedProverRule = append(assignedProverRule, assignedProverItem) + } + + logs, sub, err := _TaikoL1.contract.FilterLogs(opts, "BlockProposed", blockIdRule, assignedProverRule) + if err != nil { + return nil, err + } + return &TaikoL1BlockProposedIterator{contract: _TaikoL1.contract, event: "BlockProposed", logs: logs, sub: sub}, nil +} + +// WatchBlockProposed is a free log subscription operation binding the contract event 0xcda4e564245eb15494bc6da29f6a42e1941cf57f5314bf35bab8a1fca0a9c60a. +// +// Solidity: event BlockProposed(uint256 indexed blockId, address indexed assignedProver, uint96 livenessBond, (bytes32,bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address) meta, (address,uint96,uint64)[] depositsProcessed) +func (_TaikoL1 *TaikoL1Filterer) WatchBlockProposed(opts *bind.WatchOpts, sink chan<- *TaikoL1BlockProposed, blockId []*big.Int, assignedProver []common.Address) (event.Subscription, error) { + + var blockIdRule []interface{} + for _, blockIdItem := range blockId { + blockIdRule = append(blockIdRule, blockIdItem) + } + var assignedProverRule []interface{} + for _, assignedProverItem := range assignedProver { + assignedProverRule = append(assignedProverRule, assignedProverItem) + } + + logs, sub, err := _TaikoL1.contract.WatchLogs(opts, "BlockProposed", blockIdRule, assignedProverRule) + 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(TaikoL1BlockProposed) + if err := _TaikoL1.contract.UnpackLog(event, "BlockProposed", 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 +} + +// ParseBlockProposed is a log parse operation binding the contract event 0xcda4e564245eb15494bc6da29f6a42e1941cf57f5314bf35bab8a1fca0a9c60a. +// +// Solidity: event BlockProposed(uint256 indexed blockId, address indexed assignedProver, uint96 livenessBond, (bytes32,bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address) meta, (address,uint96,uint64)[] depositsProcessed) +func (_TaikoL1 *TaikoL1Filterer) ParseBlockProposed(log types.Log) (*TaikoL1BlockProposed, error) { + event := new(TaikoL1BlockProposed) + if err := _TaikoL1.contract.UnpackLog(event, "BlockProposed", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// TaikoL1BlockProposedV2Iterator is returned from FilterBlockProposedV2 and is used to iterate over the raw logs and unpacked data for BlockProposedV2 events raised by the TaikoL1 contract. +type TaikoL1BlockProposedV2Iterator struct { + Event *TaikoL1BlockProposedV2 // 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 *TaikoL1BlockProposedV2Iterator) 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(TaikoL1BlockProposedV2) + 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(TaikoL1BlockProposedV2) + 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 *TaikoL1BlockProposedV2Iterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *TaikoL1BlockProposedV2Iterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// TaikoL1BlockProposedV2 represents a BlockProposedV2 event raised by the TaikoL1 contract. +type TaikoL1BlockProposedV2 struct { + BlockId *big.Int + Meta TaikoDataBlockMetadataV2 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterBlockProposedV2 is a free log retrieval operation binding the contract event 0xefe9c6c0b5cbd9c0eed2d1e9c00cfc1a010d6f1aff50f7facd665a639b622b26. +// +// Solidity: event BlockProposedV2(uint256 indexed blockId, (bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address,uint96,uint64,uint64,uint32,uint32,uint8,(uint8,uint8,uint32,uint64,uint32)) meta) +func (_TaikoL1 *TaikoL1Filterer) FilterBlockProposedV2(opts *bind.FilterOpts, blockId []*big.Int) (*TaikoL1BlockProposedV2Iterator, error) { + + var blockIdRule []interface{} + for _, blockIdItem := range blockId { + blockIdRule = append(blockIdRule, blockIdItem) + } + + logs, sub, err := _TaikoL1.contract.FilterLogs(opts, "BlockProposedV2", blockIdRule) + if err != nil { + return nil, err + } + return &TaikoL1BlockProposedV2Iterator{contract: _TaikoL1.contract, event: "BlockProposedV2", logs: logs, sub: sub}, nil +} + +// WatchBlockProposedV2 is a free log subscription operation binding the contract event 0xefe9c6c0b5cbd9c0eed2d1e9c00cfc1a010d6f1aff50f7facd665a639b622b26. +// +// Solidity: event BlockProposedV2(uint256 indexed blockId, (bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address,uint96,uint64,uint64,uint32,uint32,uint8,(uint8,uint8,uint32,uint64,uint32)) meta) +func (_TaikoL1 *TaikoL1Filterer) WatchBlockProposedV2(opts *bind.WatchOpts, sink chan<- *TaikoL1BlockProposedV2, blockId []*big.Int) (event.Subscription, error) { + + var blockIdRule []interface{} + for _, blockIdItem := range blockId { + blockIdRule = append(blockIdRule, blockIdItem) + } + + logs, sub, err := _TaikoL1.contract.WatchLogs(opts, "BlockProposedV2", blockIdRule) + 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(TaikoL1BlockProposedV2) + if err := _TaikoL1.contract.UnpackLog(event, "BlockProposedV2", 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 +} + +// ParseBlockProposedV2 is a log parse operation binding the contract event 0xefe9c6c0b5cbd9c0eed2d1e9c00cfc1a010d6f1aff50f7facd665a639b622b26. +// +// Solidity: event BlockProposedV2(uint256 indexed blockId, (bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address,uint96,uint64,uint64,uint32,uint32,uint8,(uint8,uint8,uint32,uint64,uint32)) meta) +func (_TaikoL1 *TaikoL1Filterer) ParseBlockProposedV2(log types.Log) (*TaikoL1BlockProposedV2, error) { + event := new(TaikoL1BlockProposedV2) + if err := _TaikoL1.contract.UnpackLog(event, "BlockProposedV2", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// TaikoL1BlockVerifiedIterator is returned from FilterBlockVerified and is used to iterate over the raw logs and unpacked data for BlockVerified events raised by the TaikoL1 contract. +type TaikoL1BlockVerifiedIterator struct { + Event *TaikoL1BlockVerified // 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 *TaikoL1BlockVerifiedIterator) 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(TaikoL1BlockVerified) + 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(TaikoL1BlockVerified) + 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 *TaikoL1BlockVerifiedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *TaikoL1BlockVerifiedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// TaikoL1BlockVerified represents a BlockVerified event raised by the TaikoL1 contract. +type TaikoL1BlockVerified struct { + BlockId *big.Int + Prover common.Address + BlockHash [32]byte + StateRoot [32]byte + Tier uint16 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterBlockVerified is a free log retrieval operation binding the contract event 0xdecbd2c61cbda254917d6fd4c980a470701e8f9f1b744f6ad163ca70ca5db289. +// +// Solidity: event BlockVerified(uint256 indexed blockId, address indexed prover, bytes32 blockHash, bytes32 stateRoot, uint16 tier) +func (_TaikoL1 *TaikoL1Filterer) FilterBlockVerified(opts *bind.FilterOpts, blockId []*big.Int, prover []common.Address) (*TaikoL1BlockVerifiedIterator, error) { + + var blockIdRule []interface{} + for _, blockIdItem := range blockId { + blockIdRule = append(blockIdRule, blockIdItem) + } + var proverRule []interface{} + for _, proverItem := range prover { + proverRule = append(proverRule, proverItem) + } + + logs, sub, err := _TaikoL1.contract.FilterLogs(opts, "BlockVerified", blockIdRule, proverRule) + if err != nil { + return nil, err + } + return &TaikoL1BlockVerifiedIterator{contract: _TaikoL1.contract, event: "BlockVerified", logs: logs, sub: sub}, nil +} + +// WatchBlockVerified is a free log subscription operation binding the contract event 0xdecbd2c61cbda254917d6fd4c980a470701e8f9f1b744f6ad163ca70ca5db289. +// +// Solidity: event BlockVerified(uint256 indexed blockId, address indexed prover, bytes32 blockHash, bytes32 stateRoot, uint16 tier) +func (_TaikoL1 *TaikoL1Filterer) WatchBlockVerified(opts *bind.WatchOpts, sink chan<- *TaikoL1BlockVerified, blockId []*big.Int, prover []common.Address) (event.Subscription, error) { + + var blockIdRule []interface{} + for _, blockIdItem := range blockId { + blockIdRule = append(blockIdRule, blockIdItem) + } + var proverRule []interface{} + for _, proverItem := range prover { + proverRule = append(proverRule, proverItem) + } + + logs, sub, err := _TaikoL1.contract.WatchLogs(opts, "BlockVerified", blockIdRule, proverRule) + 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(TaikoL1BlockVerified) + if err := _TaikoL1.contract.UnpackLog(event, "BlockVerified", 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 +} + +// ParseBlockVerified is a log parse operation binding the contract event 0xdecbd2c61cbda254917d6fd4c980a470701e8f9f1b744f6ad163ca70ca5db289. +// +// Solidity: event BlockVerified(uint256 indexed blockId, address indexed prover, bytes32 blockHash, bytes32 stateRoot, uint16 tier) +func (_TaikoL1 *TaikoL1Filterer) ParseBlockVerified(log types.Log) (*TaikoL1BlockVerified, error) { + event := new(TaikoL1BlockVerified) + if err := _TaikoL1.contract.UnpackLog(event, "BlockVerified", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// TaikoL1BlockVerified0Iterator is returned from FilterBlockVerified0 and is used to iterate over the raw logs and unpacked data for BlockVerified0 events raised by the TaikoL1 contract. +type TaikoL1BlockVerified0Iterator struct { + Event *TaikoL1BlockVerified0 // 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 *TaikoL1BlockVerified0Iterator) 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(TaikoL1BlockVerified0) + 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(TaikoL1BlockVerified0) + 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 *TaikoL1BlockVerified0Iterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *TaikoL1BlockVerified0Iterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// TaikoL1BlockVerified0 represents a BlockVerified0 event raised by the TaikoL1 contract. +type TaikoL1BlockVerified0 struct { + BlockId *big.Int + Prover common.Address + BlockHash [32]byte + StateRoot [32]byte + Tier uint16 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterBlockVerified0 is a free log retrieval operation binding the contract event 0xdecbd2c61cbda254917d6fd4c980a470701e8f9f1b744f6ad163ca70ca5db289. +// +// Solidity: event BlockVerified(uint256 indexed blockId, address indexed prover, bytes32 blockHash, bytes32 stateRoot, uint16 tier) +func (_TaikoL1 *TaikoL1Filterer) FilterBlockVerified0(opts *bind.FilterOpts, blockId []*big.Int, prover []common.Address) (*TaikoL1BlockVerified0Iterator, error) { + + var blockIdRule []interface{} + for _, blockIdItem := range blockId { + blockIdRule = append(blockIdRule, blockIdItem) + } + var proverRule []interface{} + for _, proverItem := range prover { + proverRule = append(proverRule, proverItem) + } + + logs, sub, err := _TaikoL1.contract.FilterLogs(opts, "BlockVerified0", blockIdRule, proverRule) + if err != nil { + return nil, err + } + return &TaikoL1BlockVerified0Iterator{contract: _TaikoL1.contract, event: "BlockVerified0", logs: logs, sub: sub}, nil +} + +// WatchBlockVerified0 is a free log subscription operation binding the contract event 0xdecbd2c61cbda254917d6fd4c980a470701e8f9f1b744f6ad163ca70ca5db289. +// +// Solidity: event BlockVerified(uint256 indexed blockId, address indexed prover, bytes32 blockHash, bytes32 stateRoot, uint16 tier) +func (_TaikoL1 *TaikoL1Filterer) WatchBlockVerified0(opts *bind.WatchOpts, sink chan<- *TaikoL1BlockVerified0, blockId []*big.Int, prover []common.Address) (event.Subscription, error) { + + var blockIdRule []interface{} + for _, blockIdItem := range blockId { + blockIdRule = append(blockIdRule, blockIdItem) + } + var proverRule []interface{} + for _, proverItem := range prover { + proverRule = append(proverRule, proverItem) + } + + logs, sub, err := _TaikoL1.contract.WatchLogs(opts, "BlockVerified0", blockIdRule, proverRule) + 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(TaikoL1BlockVerified0) + if err := _TaikoL1.contract.UnpackLog(event, "BlockVerified0", 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 +} + +// ParseBlockVerified0 is a log parse operation binding the contract event 0xdecbd2c61cbda254917d6fd4c980a470701e8f9f1b744f6ad163ca70ca5db289. +// +// Solidity: event BlockVerified(uint256 indexed blockId, address indexed prover, bytes32 blockHash, bytes32 stateRoot, uint16 tier) +func (_TaikoL1 *TaikoL1Filterer) ParseBlockVerified0(log types.Log) (*TaikoL1BlockVerified0, error) { + event := new(TaikoL1BlockVerified0) + if err := _TaikoL1.contract.UnpackLog(event, "BlockVerified0", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// TaikoL1BlockVerifiedV2Iterator is returned from FilterBlockVerifiedV2 and is used to iterate over the raw logs and unpacked data for BlockVerifiedV2 events raised by the TaikoL1 contract. +type TaikoL1BlockVerifiedV2Iterator struct { + Event *TaikoL1BlockVerifiedV2 // 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 *TaikoL1BlockVerifiedV2Iterator) 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(TaikoL1BlockVerifiedV2) + 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(TaikoL1BlockVerifiedV2) + 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 *TaikoL1BlockVerifiedV2Iterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *TaikoL1BlockVerifiedV2Iterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// TaikoL1BlockVerifiedV2 represents a BlockVerifiedV2 event raised by the TaikoL1 contract. +type TaikoL1BlockVerifiedV2 struct { + BlockId *big.Int + Prover common.Address + BlockHash [32]byte + Tier uint16 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterBlockVerifiedV2 is a free log retrieval operation binding the contract event 0xe5a390d9800811154279af0c1a80d3bdf558ea91f1301e7c6ec3c1ad83e80aef. +// +// Solidity: event BlockVerifiedV2(uint256 indexed blockId, address indexed prover, bytes32 blockHash, uint16 tier) +func (_TaikoL1 *TaikoL1Filterer) FilterBlockVerifiedV2(opts *bind.FilterOpts, blockId []*big.Int, prover []common.Address) (*TaikoL1BlockVerifiedV2Iterator, error) { + + var blockIdRule []interface{} + for _, blockIdItem := range blockId { + blockIdRule = append(blockIdRule, blockIdItem) + } + var proverRule []interface{} + for _, proverItem := range prover { + proverRule = append(proverRule, proverItem) + } + + logs, sub, err := _TaikoL1.contract.FilterLogs(opts, "BlockVerifiedV2", blockIdRule, proverRule) + if err != nil { + return nil, err + } + return &TaikoL1BlockVerifiedV2Iterator{contract: _TaikoL1.contract, event: "BlockVerifiedV2", logs: logs, sub: sub}, nil +} + +// WatchBlockVerifiedV2 is a free log subscription operation binding the contract event 0xe5a390d9800811154279af0c1a80d3bdf558ea91f1301e7c6ec3c1ad83e80aef. +// +// Solidity: event BlockVerifiedV2(uint256 indexed blockId, address indexed prover, bytes32 blockHash, uint16 tier) +func (_TaikoL1 *TaikoL1Filterer) WatchBlockVerifiedV2(opts *bind.WatchOpts, sink chan<- *TaikoL1BlockVerifiedV2, blockId []*big.Int, prover []common.Address) (event.Subscription, error) { + + var blockIdRule []interface{} + for _, blockIdItem := range blockId { + blockIdRule = append(blockIdRule, blockIdItem) + } + var proverRule []interface{} + for _, proverItem := range prover { + proverRule = append(proverRule, proverItem) + } + + logs, sub, err := _TaikoL1.contract.WatchLogs(opts, "BlockVerifiedV2", blockIdRule, proverRule) + 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(TaikoL1BlockVerifiedV2) + if err := _TaikoL1.contract.UnpackLog(event, "BlockVerifiedV2", 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 +} + +// ParseBlockVerifiedV2 is a log parse operation binding the contract event 0xe5a390d9800811154279af0c1a80d3bdf558ea91f1301e7c6ec3c1ad83e80aef. +// +// Solidity: event BlockVerifiedV2(uint256 indexed blockId, address indexed prover, bytes32 blockHash, uint16 tier) +func (_TaikoL1 *TaikoL1Filterer) ParseBlockVerifiedV2(log types.Log) (*TaikoL1BlockVerifiedV2, error) { + event := new(TaikoL1BlockVerifiedV2) + if err := _TaikoL1.contract.UnpackLog(event, "BlockVerifiedV2", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// TaikoL1BlockVerifiedV20Iterator is returned from FilterBlockVerifiedV20 and is used to iterate over the raw logs and unpacked data for BlockVerifiedV20 events raised by the TaikoL1 contract. +type TaikoL1BlockVerifiedV20Iterator struct { + Event *TaikoL1BlockVerifiedV20 // 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 *TaikoL1BlockVerifiedV20Iterator) 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(TaikoL1BlockVerifiedV20) + 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(TaikoL1BlockVerifiedV20) + 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 *TaikoL1BlockVerifiedV20Iterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *TaikoL1BlockVerifiedV20Iterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// TaikoL1BlockVerifiedV20 represents a BlockVerifiedV20 event raised by the TaikoL1 contract. +type TaikoL1BlockVerifiedV20 struct { + BlockId *big.Int + Prover common.Address + BlockHash [32]byte + Tier uint16 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterBlockVerifiedV20 is a free log retrieval operation binding the contract event 0xe5a390d9800811154279af0c1a80d3bdf558ea91f1301e7c6ec3c1ad83e80aef. +// +// Solidity: event BlockVerifiedV2(uint256 indexed blockId, address indexed prover, bytes32 blockHash, uint16 tier) +func (_TaikoL1 *TaikoL1Filterer) FilterBlockVerifiedV20(opts *bind.FilterOpts, blockId []*big.Int, prover []common.Address) (*TaikoL1BlockVerifiedV20Iterator, error) { var blockIdRule []interface{} for _, blockIdItem := range blockId { blockIdRule = append(blockIdRule, blockIdItem) } - var assignedProverRule []interface{} - for _, assignedProverItem := range assignedProver { - assignedProverRule = append(assignedProverRule, assignedProverItem) + var proverRule []interface{} + for _, proverItem := range prover { + proverRule = append(proverRule, proverItem) } - logs, sub, err := _TaikoL1.contract.FilterLogs(opts, "BlockProposed", blockIdRule, assignedProverRule) + logs, sub, err := _TaikoL1.contract.FilterLogs(opts, "BlockVerifiedV20", blockIdRule, proverRule) if err != nil { return nil, err } - return &TaikoL1BlockProposedIterator{contract: _TaikoL1.contract, event: "BlockProposed", logs: logs, sub: sub}, nil + return &TaikoL1BlockVerifiedV20Iterator{contract: _TaikoL1.contract, event: "BlockVerifiedV20", logs: logs, sub: sub}, nil } -// WatchBlockProposed is a free log subscription operation binding the contract event 0xcda4e564245eb15494bc6da29f6a42e1941cf57f5314bf35bab8a1fca0a9c60a. +// WatchBlockVerifiedV20 is a free log subscription operation binding the contract event 0xe5a390d9800811154279af0c1a80d3bdf558ea91f1301e7c6ec3c1ad83e80aef. // -// Solidity: event BlockProposed(uint256 indexed blockId, address indexed assignedProver, uint96 livenessBond, (bytes32,bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address) meta, (address,uint96,uint64)[] depositsProcessed) -func (_TaikoL1 *TaikoL1Filterer) WatchBlockProposed(opts *bind.WatchOpts, sink chan<- *TaikoL1BlockProposed, blockId []*big.Int, assignedProver []common.Address) (event.Subscription, error) { +// Solidity: event BlockVerifiedV2(uint256 indexed blockId, address indexed prover, bytes32 blockHash, uint16 tier) +func (_TaikoL1 *TaikoL1Filterer) WatchBlockVerifiedV20(opts *bind.WatchOpts, sink chan<- *TaikoL1BlockVerifiedV20, blockId []*big.Int, prover []common.Address) (event.Subscription, error) { var blockIdRule []interface{} for _, blockIdItem := range blockId { blockIdRule = append(blockIdRule, blockIdItem) } - var assignedProverRule []interface{} - for _, assignedProverItem := range assignedProver { - assignedProverRule = append(assignedProverRule, assignedProverItem) + var proverRule []interface{} + for _, proverItem := range prover { + proverRule = append(proverRule, proverItem) } - logs, sub, err := _TaikoL1.contract.WatchLogs(opts, "BlockProposed", blockIdRule, assignedProverRule) + logs, sub, err := _TaikoL1.contract.WatchLogs(opts, "BlockVerifiedV20", blockIdRule, proverRule) if err != nil { return nil, err } @@ -1563,8 +2645,8 @@ func (_TaikoL1 *TaikoL1Filterer) WatchBlockProposed(opts *bind.WatchOpts, sink c select { case log := <-logs: // New log arrived, parse the event and forward to the user - event := new(TaikoL1BlockProposed) - if err := _TaikoL1.contract.UnpackLog(event, "BlockProposed", log); err != nil { + event := new(TaikoL1BlockVerifiedV20) + if err := _TaikoL1.contract.UnpackLog(event, "BlockVerifiedV20", log); err != nil { return err } event.Raw = log @@ -1585,21 +2667,21 @@ func (_TaikoL1 *TaikoL1Filterer) WatchBlockProposed(opts *bind.WatchOpts, sink c }), nil } -// ParseBlockProposed is a log parse operation binding the contract event 0xcda4e564245eb15494bc6da29f6a42e1941cf57f5314bf35bab8a1fca0a9c60a. +// ParseBlockVerifiedV20 is a log parse operation binding the contract event 0xe5a390d9800811154279af0c1a80d3bdf558ea91f1301e7c6ec3c1ad83e80aef. // -// Solidity: event BlockProposed(uint256 indexed blockId, address indexed assignedProver, uint96 livenessBond, (bytes32,bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address) meta, (address,uint96,uint64)[] depositsProcessed) -func (_TaikoL1 *TaikoL1Filterer) ParseBlockProposed(log types.Log) (*TaikoL1BlockProposed, error) { - event := new(TaikoL1BlockProposed) - if err := _TaikoL1.contract.UnpackLog(event, "BlockProposed", log); err != nil { +// Solidity: event BlockVerifiedV2(uint256 indexed blockId, address indexed prover, bytes32 blockHash, uint16 tier) +func (_TaikoL1 *TaikoL1Filterer) ParseBlockVerifiedV20(log types.Log) (*TaikoL1BlockVerifiedV20, error) { + event := new(TaikoL1BlockVerifiedV20) + if err := _TaikoL1.contract.UnpackLog(event, "BlockVerifiedV20", log); err != nil { return nil, err } event.Raw = log return event, nil } -// TaikoL1BlockProposed0Iterator is returned from FilterBlockProposed0 and is used to iterate over the raw logs and unpacked data for BlockProposed0 events raised by the TaikoL1 contract. -type TaikoL1BlockProposed0Iterator struct { - Event *TaikoL1BlockProposed0 // Event containing the contract specifics and raw log +// TaikoL1BondCreditedIterator is returned from FilterBondCredited and is used to iterate over the raw logs and unpacked data for BondCredited events raised by the TaikoL1 contract. +type TaikoL1BondCreditedIterator struct { + Event *TaikoL1BondCredited // 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 @@ -1613,7 +2695,7 @@ type TaikoL1BlockProposed0Iterator struct { // 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 *TaikoL1BlockProposed0Iterator) Next() bool { +func (it *TaikoL1BondCreditedIterator) Next() bool { // If the iterator failed, stop iterating if it.fail != nil { return false @@ -1622,7 +2704,7 @@ func (it *TaikoL1BlockProposed0Iterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(TaikoL1BlockProposed0) + it.Event = new(TaikoL1BondCredited) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -1637,7 +2719,7 @@ func (it *TaikoL1BlockProposed0Iterator) Next() bool { // Iterator still in progress, wait for either a data or an error event select { case log := <-it.logs: - it.Event = new(TaikoL1BlockProposed0) + it.Event = new(TaikoL1BondCredited) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -1653,63 +2735,52 @@ func (it *TaikoL1BlockProposed0Iterator) Next() bool { } // Error returns any retrieval or parsing error occurred during filtering. -func (it *TaikoL1BlockProposed0Iterator) Error() error { +func (it *TaikoL1BondCreditedIterator) Error() error { return it.fail } // Close terminates the iteration process, releasing any pending underlying // resources. -func (it *TaikoL1BlockProposed0Iterator) Close() error { +func (it *TaikoL1BondCreditedIterator) Close() error { it.sub.Unsubscribe() return nil } -// TaikoL1BlockProposed0 represents a BlockProposed0 event raised by the TaikoL1 contract. -type TaikoL1BlockProposed0 struct { - BlockId *big.Int - AssignedProver common.Address - LivenessBond *big.Int - Meta TaikoDataBlockMetadata - DepositsProcessed []TaikoDataEthDeposit - Raw types.Log // Blockchain specific contextual infos +// TaikoL1BondCredited represents a BondCredited event raised by the TaikoL1 contract. +type TaikoL1BondCredited struct { + User common.Address + Amount *big.Int + Raw types.Log // Blockchain specific contextual infos } -// FilterBlockProposed0 is a free log retrieval operation binding the contract event 0xcda4e564245eb15494bc6da29f6a42e1941cf57f5314bf35bab8a1fca0a9c60a. +// FilterBondCredited is a free log retrieval operation binding the contract event 0x6de6fe586196fa05b73b973026c5fda3968a2933989bff3a0b6bd57644fab606. // -// Solidity: event BlockProposed(uint256 indexed blockId, address indexed assignedProver, uint96 livenessBond, (bytes32,bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address) meta, (address,uint96,uint64)[] depositsProcessed) -func (_TaikoL1 *TaikoL1Filterer) FilterBlockProposed0(opts *bind.FilterOpts, blockId []*big.Int, assignedProver []common.Address) (*TaikoL1BlockProposed0Iterator, error) { +// Solidity: event BondCredited(address indexed user, uint256 amount) +func (_TaikoL1 *TaikoL1Filterer) FilterBondCredited(opts *bind.FilterOpts, user []common.Address) (*TaikoL1BondCreditedIterator, error) { - var blockIdRule []interface{} - for _, blockIdItem := range blockId { - blockIdRule = append(blockIdRule, blockIdItem) - } - var assignedProverRule []interface{} - for _, assignedProverItem := range assignedProver { - assignedProverRule = append(assignedProverRule, assignedProverItem) + var userRule []interface{} + for _, userItem := range user { + userRule = append(userRule, userItem) } - logs, sub, err := _TaikoL1.contract.FilterLogs(opts, "BlockProposed0", blockIdRule, assignedProverRule) + logs, sub, err := _TaikoL1.contract.FilterLogs(opts, "BondCredited", userRule) if err != nil { return nil, err } - return &TaikoL1BlockProposed0Iterator{contract: _TaikoL1.contract, event: "BlockProposed0", logs: logs, sub: sub}, nil + return &TaikoL1BondCreditedIterator{contract: _TaikoL1.contract, event: "BondCredited", logs: logs, sub: sub}, nil } -// WatchBlockProposed0 is a free log subscription operation binding the contract event 0xcda4e564245eb15494bc6da29f6a42e1941cf57f5314bf35bab8a1fca0a9c60a. +// WatchBondCredited is a free log subscription operation binding the contract event 0x6de6fe586196fa05b73b973026c5fda3968a2933989bff3a0b6bd57644fab606. // -// Solidity: event BlockProposed(uint256 indexed blockId, address indexed assignedProver, uint96 livenessBond, (bytes32,bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address) meta, (address,uint96,uint64)[] depositsProcessed) -func (_TaikoL1 *TaikoL1Filterer) WatchBlockProposed0(opts *bind.WatchOpts, sink chan<- *TaikoL1BlockProposed0, blockId []*big.Int, assignedProver []common.Address) (event.Subscription, error) { +// Solidity: event BondCredited(address indexed user, uint256 amount) +func (_TaikoL1 *TaikoL1Filterer) WatchBondCredited(opts *bind.WatchOpts, sink chan<- *TaikoL1BondCredited, user []common.Address) (event.Subscription, error) { - var blockIdRule []interface{} - for _, blockIdItem := range blockId { - blockIdRule = append(blockIdRule, blockIdItem) - } - var assignedProverRule []interface{} - for _, assignedProverItem := range assignedProver { - assignedProverRule = append(assignedProverRule, assignedProverItem) + var userRule []interface{} + for _, userItem := range user { + userRule = append(userRule, userItem) } - logs, sub, err := _TaikoL1.contract.WatchLogs(opts, "BlockProposed0", blockIdRule, assignedProverRule) + logs, sub, err := _TaikoL1.contract.WatchLogs(opts, "BondCredited", userRule) if err != nil { return nil, err } @@ -1719,8 +2790,8 @@ func (_TaikoL1 *TaikoL1Filterer) WatchBlockProposed0(opts *bind.WatchOpts, sink select { case log := <-logs: // New log arrived, parse the event and forward to the user - event := new(TaikoL1BlockProposed0) - if err := _TaikoL1.contract.UnpackLog(event, "BlockProposed0", log); err != nil { + event := new(TaikoL1BondCredited) + if err := _TaikoL1.contract.UnpackLog(event, "BondCredited", log); err != nil { return err } event.Raw = log @@ -1741,21 +2812,21 @@ func (_TaikoL1 *TaikoL1Filterer) WatchBlockProposed0(opts *bind.WatchOpts, sink }), nil } -// ParseBlockProposed0 is a log parse operation binding the contract event 0xcda4e564245eb15494bc6da29f6a42e1941cf57f5314bf35bab8a1fca0a9c60a. +// ParseBondCredited is a log parse operation binding the contract event 0x6de6fe586196fa05b73b973026c5fda3968a2933989bff3a0b6bd57644fab606. // -// Solidity: event BlockProposed(uint256 indexed blockId, address indexed assignedProver, uint96 livenessBond, (bytes32,bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address) meta, (address,uint96,uint64)[] depositsProcessed) -func (_TaikoL1 *TaikoL1Filterer) ParseBlockProposed0(log types.Log) (*TaikoL1BlockProposed0, error) { - event := new(TaikoL1BlockProposed0) - if err := _TaikoL1.contract.UnpackLog(event, "BlockProposed0", log); err != nil { +// Solidity: event BondCredited(address indexed user, uint256 amount) +func (_TaikoL1 *TaikoL1Filterer) ParseBondCredited(log types.Log) (*TaikoL1BondCredited, error) { + event := new(TaikoL1BondCredited) + if err := _TaikoL1.contract.UnpackLog(event, "BondCredited", log); err != nil { return nil, err } event.Raw = log return event, nil } -// TaikoL1BlockVerifiedIterator is returned from FilterBlockVerified and is used to iterate over the raw logs and unpacked data for BlockVerified events raised by the TaikoL1 contract. -type TaikoL1BlockVerifiedIterator struct { - Event *TaikoL1BlockVerified // Event containing the contract specifics and raw log +// TaikoL1BondDebitedIterator is returned from FilterBondDebited and is used to iterate over the raw logs and unpacked data for BondDebited events raised by the TaikoL1 contract. +type TaikoL1BondDebitedIterator struct { + Event *TaikoL1BondDebited // 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 @@ -1769,7 +2840,7 @@ type TaikoL1BlockVerifiedIterator struct { // 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 *TaikoL1BlockVerifiedIterator) Next() bool { +func (it *TaikoL1BondDebitedIterator) Next() bool { // If the iterator failed, stop iterating if it.fail != nil { return false @@ -1778,7 +2849,7 @@ func (it *TaikoL1BlockVerifiedIterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(TaikoL1BlockVerified) + it.Event = new(TaikoL1BondDebited) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -1793,7 +2864,7 @@ func (it *TaikoL1BlockVerifiedIterator) Next() bool { // Iterator still in progress, wait for either a data or an error event select { case log := <-it.logs: - it.Event = new(TaikoL1BlockVerified) + it.Event = new(TaikoL1BondDebited) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -1809,63 +2880,52 @@ func (it *TaikoL1BlockVerifiedIterator) Next() bool { } // Error returns any retrieval or parsing error occurred during filtering. -func (it *TaikoL1BlockVerifiedIterator) Error() error { +func (it *TaikoL1BondDebitedIterator) Error() error { return it.fail } // Close terminates the iteration process, releasing any pending underlying // resources. -func (it *TaikoL1BlockVerifiedIterator) Close() error { +func (it *TaikoL1BondDebitedIterator) Close() error { it.sub.Unsubscribe() return nil } -// TaikoL1BlockVerified represents a BlockVerified event raised by the TaikoL1 contract. -type TaikoL1BlockVerified struct { - BlockId *big.Int - Prover common.Address - BlockHash [32]byte - StateRoot [32]byte - Tier uint16 - Raw types.Log // Blockchain specific contextual infos +// TaikoL1BondDebited represents a BondDebited event raised by the TaikoL1 contract. +type TaikoL1BondDebited struct { + User common.Address + Amount *big.Int + Raw types.Log // Blockchain specific contextual infos } -// FilterBlockVerified is a free log retrieval operation binding the contract event 0xdecbd2c61cbda254917d6fd4c980a470701e8f9f1b744f6ad163ca70ca5db289. +// FilterBondDebited is a free log retrieval operation binding the contract event 0x85f32beeaff2d0019a8d196f06790c9a652191759c46643311344fd38920423c. // -// Solidity: event BlockVerified(uint256 indexed blockId, address indexed prover, bytes32 blockHash, bytes32 stateRoot, uint16 tier) -func (_TaikoL1 *TaikoL1Filterer) FilterBlockVerified(opts *bind.FilterOpts, blockId []*big.Int, prover []common.Address) (*TaikoL1BlockVerifiedIterator, error) { +// Solidity: event BondDebited(address indexed user, uint256 amount) +func (_TaikoL1 *TaikoL1Filterer) FilterBondDebited(opts *bind.FilterOpts, user []common.Address) (*TaikoL1BondDebitedIterator, error) { - var blockIdRule []interface{} - for _, blockIdItem := range blockId { - blockIdRule = append(blockIdRule, blockIdItem) - } - var proverRule []interface{} - for _, proverItem := range prover { - proverRule = append(proverRule, proverItem) + var userRule []interface{} + for _, userItem := range user { + userRule = append(userRule, userItem) } - logs, sub, err := _TaikoL1.contract.FilterLogs(opts, "BlockVerified", blockIdRule, proverRule) + logs, sub, err := _TaikoL1.contract.FilterLogs(opts, "BondDebited", userRule) if err != nil { return nil, err } - return &TaikoL1BlockVerifiedIterator{contract: _TaikoL1.contract, event: "BlockVerified", logs: logs, sub: sub}, nil + return &TaikoL1BondDebitedIterator{contract: _TaikoL1.contract, event: "BondDebited", logs: logs, sub: sub}, nil } -// WatchBlockVerified is a free log subscription operation binding the contract event 0xdecbd2c61cbda254917d6fd4c980a470701e8f9f1b744f6ad163ca70ca5db289. +// WatchBondDebited is a free log subscription operation binding the contract event 0x85f32beeaff2d0019a8d196f06790c9a652191759c46643311344fd38920423c. // -// Solidity: event BlockVerified(uint256 indexed blockId, address indexed prover, bytes32 blockHash, bytes32 stateRoot, uint16 tier) -func (_TaikoL1 *TaikoL1Filterer) WatchBlockVerified(opts *bind.WatchOpts, sink chan<- *TaikoL1BlockVerified, blockId []*big.Int, prover []common.Address) (event.Subscription, error) { +// Solidity: event BondDebited(address indexed user, uint256 amount) +func (_TaikoL1 *TaikoL1Filterer) WatchBondDebited(opts *bind.WatchOpts, sink chan<- *TaikoL1BondDebited, user []common.Address) (event.Subscription, error) { - var blockIdRule []interface{} - for _, blockIdItem := range blockId { - blockIdRule = append(blockIdRule, blockIdItem) - } - var proverRule []interface{} - for _, proverItem := range prover { - proverRule = append(proverRule, proverItem) + var userRule []interface{} + for _, userItem := range user { + userRule = append(userRule, userItem) } - logs, sub, err := _TaikoL1.contract.WatchLogs(opts, "BlockVerified", blockIdRule, proverRule) + logs, sub, err := _TaikoL1.contract.WatchLogs(opts, "BondDebited", userRule) if err != nil { return nil, err } @@ -1875,8 +2935,8 @@ func (_TaikoL1 *TaikoL1Filterer) WatchBlockVerified(opts *bind.WatchOpts, sink c select { case log := <-logs: // New log arrived, parse the event and forward to the user - event := new(TaikoL1BlockVerified) - if err := _TaikoL1.contract.UnpackLog(event, "BlockVerified", log); err != nil { + event := new(TaikoL1BondDebited) + if err := _TaikoL1.contract.UnpackLog(event, "BondDebited", log); err != nil { return err } event.Raw = log @@ -1897,21 +2957,21 @@ func (_TaikoL1 *TaikoL1Filterer) WatchBlockVerified(opts *bind.WatchOpts, sink c }), nil } -// ParseBlockVerified is a log parse operation binding the contract event 0xdecbd2c61cbda254917d6fd4c980a470701e8f9f1b744f6ad163ca70ca5db289. +// ParseBondDebited is a log parse operation binding the contract event 0x85f32beeaff2d0019a8d196f06790c9a652191759c46643311344fd38920423c. // -// Solidity: event BlockVerified(uint256 indexed blockId, address indexed prover, bytes32 blockHash, bytes32 stateRoot, uint16 tier) -func (_TaikoL1 *TaikoL1Filterer) ParseBlockVerified(log types.Log) (*TaikoL1BlockVerified, error) { - event := new(TaikoL1BlockVerified) - if err := _TaikoL1.contract.UnpackLog(event, "BlockVerified", log); err != nil { +// Solidity: event BondDebited(address indexed user, uint256 amount) +func (_TaikoL1 *TaikoL1Filterer) ParseBondDebited(log types.Log) (*TaikoL1BondDebited, error) { + event := new(TaikoL1BondDebited) + if err := _TaikoL1.contract.UnpackLog(event, "BondDebited", log); err != nil { return nil, err } event.Raw = log return event, nil } -// TaikoL1BlockVerified0Iterator is returned from FilterBlockVerified0 and is used to iterate over the raw logs and unpacked data for BlockVerified0 events raised by the TaikoL1 contract. -type TaikoL1BlockVerified0Iterator struct { - Event *TaikoL1BlockVerified0 // Event containing the contract specifics and raw log +// TaikoL1CalldataTxListIterator is returned from FilterCalldataTxList and is used to iterate over the raw logs and unpacked data for CalldataTxList events raised by the TaikoL1 contract. +type TaikoL1CalldataTxListIterator struct { + Event *TaikoL1CalldataTxList // 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 @@ -1925,7 +2985,7 @@ type TaikoL1BlockVerified0Iterator struct { // 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 *TaikoL1BlockVerified0Iterator) Next() bool { +func (it *TaikoL1CalldataTxListIterator) Next() bool { // If the iterator failed, stop iterating if it.fail != nil { return false @@ -1934,7 +2994,7 @@ func (it *TaikoL1BlockVerified0Iterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(TaikoL1BlockVerified0) + it.Event = new(TaikoL1CalldataTxList) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -1949,7 +3009,7 @@ func (it *TaikoL1BlockVerified0Iterator) Next() bool { // Iterator still in progress, wait for either a data or an error event select { case log := <-it.logs: - it.Event = new(TaikoL1BlockVerified0) + it.Event = new(TaikoL1CalldataTxList) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -1965,63 +3025,52 @@ func (it *TaikoL1BlockVerified0Iterator) Next() bool { } // Error returns any retrieval or parsing error occurred during filtering. -func (it *TaikoL1BlockVerified0Iterator) Error() error { +func (it *TaikoL1CalldataTxListIterator) Error() error { return it.fail } // Close terminates the iteration process, releasing any pending underlying // resources. -func (it *TaikoL1BlockVerified0Iterator) Close() error { +func (it *TaikoL1CalldataTxListIterator) Close() error { it.sub.Unsubscribe() return nil } -// TaikoL1BlockVerified0 represents a BlockVerified0 event raised by the TaikoL1 contract. -type TaikoL1BlockVerified0 struct { - BlockId *big.Int - Prover common.Address - BlockHash [32]byte - StateRoot [32]byte - Tier uint16 - Raw types.Log // Blockchain specific contextual infos +// TaikoL1CalldataTxList represents a CalldataTxList event raised by the TaikoL1 contract. +type TaikoL1CalldataTxList struct { + BlockId *big.Int + TxList []byte + Raw types.Log // Blockchain specific contextual infos } -// FilterBlockVerified0 is a free log retrieval operation binding the contract event 0xdecbd2c61cbda254917d6fd4c980a470701e8f9f1b744f6ad163ca70ca5db289. +// FilterCalldataTxList is a free log retrieval operation binding the contract event 0xa07bc5e8f00f6065c8727821591c519efd2348e4ff0c26560a85592e85b6f418. // -// Solidity: event BlockVerified(uint256 indexed blockId, address indexed prover, bytes32 blockHash, bytes32 stateRoot, uint16 tier) -func (_TaikoL1 *TaikoL1Filterer) FilterBlockVerified0(opts *bind.FilterOpts, blockId []*big.Int, prover []common.Address) (*TaikoL1BlockVerified0Iterator, error) { +// Solidity: event CalldataTxList(uint256 indexed blockId, bytes txList) +func (_TaikoL1 *TaikoL1Filterer) FilterCalldataTxList(opts *bind.FilterOpts, blockId []*big.Int) (*TaikoL1CalldataTxListIterator, error) { var blockIdRule []interface{} for _, blockIdItem := range blockId { blockIdRule = append(blockIdRule, blockIdItem) } - var proverRule []interface{} - for _, proverItem := range prover { - proverRule = append(proverRule, proverItem) - } - logs, sub, err := _TaikoL1.contract.FilterLogs(opts, "BlockVerified0", blockIdRule, proverRule) + logs, sub, err := _TaikoL1.contract.FilterLogs(opts, "CalldataTxList", blockIdRule) if err != nil { return nil, err } - return &TaikoL1BlockVerified0Iterator{contract: _TaikoL1.contract, event: "BlockVerified0", logs: logs, sub: sub}, nil + return &TaikoL1CalldataTxListIterator{contract: _TaikoL1.contract, event: "CalldataTxList", logs: logs, sub: sub}, nil } -// WatchBlockVerified0 is a free log subscription operation binding the contract event 0xdecbd2c61cbda254917d6fd4c980a470701e8f9f1b744f6ad163ca70ca5db289. +// WatchCalldataTxList is a free log subscription operation binding the contract event 0xa07bc5e8f00f6065c8727821591c519efd2348e4ff0c26560a85592e85b6f418. // -// Solidity: event BlockVerified(uint256 indexed blockId, address indexed prover, bytes32 blockHash, bytes32 stateRoot, uint16 tier) -func (_TaikoL1 *TaikoL1Filterer) WatchBlockVerified0(opts *bind.WatchOpts, sink chan<- *TaikoL1BlockVerified0, blockId []*big.Int, prover []common.Address) (event.Subscription, error) { +// Solidity: event CalldataTxList(uint256 indexed blockId, bytes txList) +func (_TaikoL1 *TaikoL1Filterer) WatchCalldataTxList(opts *bind.WatchOpts, sink chan<- *TaikoL1CalldataTxList, blockId []*big.Int) (event.Subscription, error) { var blockIdRule []interface{} for _, blockIdItem := range blockId { blockIdRule = append(blockIdRule, blockIdItem) } - var proverRule []interface{} - for _, proverItem := range prover { - proverRule = append(proverRule, proverItem) - } - logs, sub, err := _TaikoL1.contract.WatchLogs(opts, "BlockVerified0", blockIdRule, proverRule) + logs, sub, err := _TaikoL1.contract.WatchLogs(opts, "CalldataTxList", blockIdRule) if err != nil { return nil, err } @@ -2031,8 +3080,8 @@ func (_TaikoL1 *TaikoL1Filterer) WatchBlockVerified0(opts *bind.WatchOpts, sink select { case log := <-logs: // New log arrived, parse the event and forward to the user - event := new(TaikoL1BlockVerified0) - if err := _TaikoL1.contract.UnpackLog(event, "BlockVerified0", log); err != nil { + event := new(TaikoL1CalldataTxList) + if err := _TaikoL1.contract.UnpackLog(event, "CalldataTxList", log); err != nil { return err } event.Raw = log @@ -2053,12 +3102,12 @@ func (_TaikoL1 *TaikoL1Filterer) WatchBlockVerified0(opts *bind.WatchOpts, sink }), nil } -// ParseBlockVerified0 is a log parse operation binding the contract event 0xdecbd2c61cbda254917d6fd4c980a470701e8f9f1b744f6ad163ca70ca5db289. +// ParseCalldataTxList is a log parse operation binding the contract event 0xa07bc5e8f00f6065c8727821591c519efd2348e4ff0c26560a85592e85b6f418. // -// Solidity: event BlockVerified(uint256 indexed blockId, address indexed prover, bytes32 blockHash, bytes32 stateRoot, uint16 tier) -func (_TaikoL1 *TaikoL1Filterer) ParseBlockVerified0(log types.Log) (*TaikoL1BlockVerified0, error) { - event := new(TaikoL1BlockVerified0) - if err := _TaikoL1.contract.UnpackLog(event, "BlockVerified0", log); err != nil { +// Solidity: event CalldataTxList(uint256 indexed blockId, bytes txList) +func (_TaikoL1 *TaikoL1Filterer) ParseCalldataTxList(log types.Log) (*TaikoL1CalldataTxList, error) { + event := new(TaikoL1CalldataTxList) + if err := _TaikoL1.contract.UnpackLog(event, "CalldataTxList", log); err != nil { return nil, err } event.Raw = log @@ -3041,140 +4090,6 @@ func (_TaikoL1 *TaikoL1Filterer) ParseStateVariablesUpdated(log types.Log) (*Tai return event, nil } -// TaikoL1StateVariablesUpdated0Iterator is returned from FilterStateVariablesUpdated0 and is used to iterate over the raw logs and unpacked data for StateVariablesUpdated0 events raised by the TaikoL1 contract. -type TaikoL1StateVariablesUpdated0Iterator struct { - Event *TaikoL1StateVariablesUpdated0 // 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 *TaikoL1StateVariablesUpdated0Iterator) 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(TaikoL1StateVariablesUpdated0) - 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(TaikoL1StateVariablesUpdated0) - 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 *TaikoL1StateVariablesUpdated0Iterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *TaikoL1StateVariablesUpdated0Iterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// TaikoL1StateVariablesUpdated0 represents a StateVariablesUpdated0 event raised by the TaikoL1 contract. -type TaikoL1StateVariablesUpdated0 struct { - SlotB TaikoDataSlotB - Raw types.Log // Blockchain specific contextual infos -} - -// FilterStateVariablesUpdated0 is a free log retrieval operation binding the contract event 0xdf66aee38ea9fe523cfd238705d455a354305a646748dbb931898b51cee4727b. -// -// Solidity: event StateVariablesUpdated((uint64,uint64,bool,uint8,uint16,uint32,uint64) slotB) -func (_TaikoL1 *TaikoL1Filterer) FilterStateVariablesUpdated0(opts *bind.FilterOpts) (*TaikoL1StateVariablesUpdated0Iterator, error) { - - logs, sub, err := _TaikoL1.contract.FilterLogs(opts, "StateVariablesUpdated0") - if err != nil { - return nil, err - } - return &TaikoL1StateVariablesUpdated0Iterator{contract: _TaikoL1.contract, event: "StateVariablesUpdated0", logs: logs, sub: sub}, nil -} - -// WatchStateVariablesUpdated0 is a free log subscription operation binding the contract event 0xdf66aee38ea9fe523cfd238705d455a354305a646748dbb931898b51cee4727b. -// -// Solidity: event StateVariablesUpdated((uint64,uint64,bool,uint8,uint16,uint32,uint64) slotB) -func (_TaikoL1 *TaikoL1Filterer) WatchStateVariablesUpdated0(opts *bind.WatchOpts, sink chan<- *TaikoL1StateVariablesUpdated0) (event.Subscription, error) { - - logs, sub, err := _TaikoL1.contract.WatchLogs(opts, "StateVariablesUpdated0") - 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(TaikoL1StateVariablesUpdated0) - if err := _TaikoL1.contract.UnpackLog(event, "StateVariablesUpdated0", 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 -} - -// ParseStateVariablesUpdated0 is a log parse operation binding the contract event 0xdf66aee38ea9fe523cfd238705d455a354305a646748dbb931898b51cee4727b. -// -// Solidity: event StateVariablesUpdated((uint64,uint64,bool,uint8,uint16,uint32,uint64) slotB) -func (_TaikoL1 *TaikoL1Filterer) ParseStateVariablesUpdated0(log types.Log) (*TaikoL1StateVariablesUpdated0, error) { - event := new(TaikoL1StateVariablesUpdated0) - if err := _TaikoL1.contract.UnpackLog(event, "StateVariablesUpdated0", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - // TaikoL1TransitionContestedIterator is returned from FilterTransitionContested and is used to iterate over the raw logs and unpacked data for TransitionContested events raised by the TaikoL1 contract. type TaikoL1TransitionContestedIterator struct { Event *TaikoL1TransitionContested // Event containing the contract specifics and raw log @@ -3323,9 +4238,9 @@ func (_TaikoL1 *TaikoL1Filterer) ParseTransitionContested(log types.Log) (*Taiko return event, nil } -// TaikoL1TransitionContested0Iterator is returned from FilterTransitionContested0 and is used to iterate over the raw logs and unpacked data for TransitionContested0 events raised by the TaikoL1 contract. -type TaikoL1TransitionContested0Iterator struct { - Event *TaikoL1TransitionContested0 // Event containing the contract specifics and raw log +// TaikoL1TransitionContestedV2Iterator is returned from FilterTransitionContestedV2 and is used to iterate over the raw logs and unpacked data for TransitionContestedV2 events raised by the TaikoL1 contract. +type TaikoL1TransitionContestedV2Iterator struct { + Event *TaikoL1TransitionContestedV2 // 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 @@ -3339,7 +4254,7 @@ type TaikoL1TransitionContested0Iterator struct { // 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 *TaikoL1TransitionContested0Iterator) Next() bool { +func (it *TaikoL1TransitionContestedV2Iterator) Next() bool { // If the iterator failed, stop iterating if it.fail != nil { return false @@ -3348,7 +4263,7 @@ func (it *TaikoL1TransitionContested0Iterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(TaikoL1TransitionContested0) + it.Event = new(TaikoL1TransitionContestedV2) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -3363,7 +4278,7 @@ func (it *TaikoL1TransitionContested0Iterator) Next() bool { // Iterator still in progress, wait for either a data or an error event select { case log := <-it.logs: - it.Event = new(TaikoL1TransitionContested0) + it.Event = new(TaikoL1TransitionContestedV2) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -3379,55 +4294,56 @@ func (it *TaikoL1TransitionContested0Iterator) Next() bool { } // Error returns any retrieval or parsing error occurred during filtering. -func (it *TaikoL1TransitionContested0Iterator) Error() error { +func (it *TaikoL1TransitionContestedV2Iterator) Error() error { return it.fail } // Close terminates the iteration process, releasing any pending underlying // resources. -func (it *TaikoL1TransitionContested0Iterator) Close() error { +func (it *TaikoL1TransitionContestedV2Iterator) Close() error { it.sub.Unsubscribe() return nil } -// TaikoL1TransitionContested0 represents a TransitionContested0 event raised by the TaikoL1 contract. -type TaikoL1TransitionContested0 struct { +// TaikoL1TransitionContestedV2 represents a TransitionContestedV2 event raised by the TaikoL1 contract. +type TaikoL1TransitionContestedV2 struct { BlockId *big.Int Tran TaikoDataTransition Contester common.Address ContestBond *big.Int Tier uint16 + ProposedIn uint64 Raw types.Log // Blockchain specific contextual infos } -// FilterTransitionContested0 is a free log retrieval operation binding the contract event 0xb4c0a86c1ff239277697775b1e91d3375fd3a5ef6b345aa4e2f6001c890558f6. +// FilterTransitionContestedV2 is a free log retrieval operation binding the contract event 0x53b2379d5e9bcacdfe56b4a51c3fd92ebfff4b1e8e8638f7f7e85163260a6f99. // -// Solidity: event TransitionContested(uint256 indexed blockId, (bytes32,bytes32,bytes32,bytes32) tran, address contester, uint96 contestBond, uint16 tier) -func (_TaikoL1 *TaikoL1Filterer) FilterTransitionContested0(opts *bind.FilterOpts, blockId []*big.Int) (*TaikoL1TransitionContested0Iterator, error) { +// Solidity: event TransitionContestedV2(uint256 indexed blockId, (bytes32,bytes32,bytes32,bytes32) tran, address contester, uint96 contestBond, uint16 tier, uint64 proposedIn) +func (_TaikoL1 *TaikoL1Filterer) FilterTransitionContestedV2(opts *bind.FilterOpts, blockId []*big.Int) (*TaikoL1TransitionContestedV2Iterator, error) { var blockIdRule []interface{} for _, blockIdItem := range blockId { blockIdRule = append(blockIdRule, blockIdItem) } - logs, sub, err := _TaikoL1.contract.FilterLogs(opts, "TransitionContested0", blockIdRule) + logs, sub, err := _TaikoL1.contract.FilterLogs(opts, "TransitionContestedV2", blockIdRule) if err != nil { return nil, err } - return &TaikoL1TransitionContested0Iterator{contract: _TaikoL1.contract, event: "TransitionContested0", logs: logs, sub: sub}, nil + return &TaikoL1TransitionContestedV2Iterator{contract: _TaikoL1.contract, event: "TransitionContestedV2", logs: logs, sub: sub}, nil } -// WatchTransitionContested0 is a free log subscription operation binding the contract event 0xb4c0a86c1ff239277697775b1e91d3375fd3a5ef6b345aa4e2f6001c890558f6. +// WatchTransitionContestedV2 is a free log subscription operation binding the contract event 0x53b2379d5e9bcacdfe56b4a51c3fd92ebfff4b1e8e8638f7f7e85163260a6f99. // -// Solidity: event TransitionContested(uint256 indexed blockId, (bytes32,bytes32,bytes32,bytes32) tran, address contester, uint96 contestBond, uint16 tier) -func (_TaikoL1 *TaikoL1Filterer) WatchTransitionContested0(opts *bind.WatchOpts, sink chan<- *TaikoL1TransitionContested0, blockId []*big.Int) (event.Subscription, error) { +// Solidity: event TransitionContestedV2(uint256 indexed blockId, (bytes32,bytes32,bytes32,bytes32) tran, address contester, uint96 contestBond, uint16 tier, uint64 proposedIn) +func (_TaikoL1 *TaikoL1Filterer) WatchTransitionContestedV2(opts *bind.WatchOpts, sink chan<- *TaikoL1TransitionContestedV2, blockId []*big.Int) (event.Subscription, error) { var blockIdRule []interface{} for _, blockIdItem := range blockId { blockIdRule = append(blockIdRule, blockIdItem) } - logs, sub, err := _TaikoL1.contract.WatchLogs(opts, "TransitionContested0", blockIdRule) + logs, sub, err := _TaikoL1.contract.WatchLogs(opts, "TransitionContestedV2", blockIdRule) if err != nil { return nil, err } @@ -3437,8 +4353,8 @@ func (_TaikoL1 *TaikoL1Filterer) WatchTransitionContested0(opts *bind.WatchOpts, select { case log := <-logs: // New log arrived, parse the event and forward to the user - event := new(TaikoL1TransitionContested0) - if err := _TaikoL1.contract.UnpackLog(event, "TransitionContested0", log); err != nil { + event := new(TaikoL1TransitionContestedV2) + if err := _TaikoL1.contract.UnpackLog(event, "TransitionContestedV2", log); err != nil { return err } event.Raw = log @@ -3459,12 +4375,12 @@ func (_TaikoL1 *TaikoL1Filterer) WatchTransitionContested0(opts *bind.WatchOpts, }), nil } -// ParseTransitionContested0 is a log parse operation binding the contract event 0xb4c0a86c1ff239277697775b1e91d3375fd3a5ef6b345aa4e2f6001c890558f6. +// ParseTransitionContestedV2 is a log parse operation binding the contract event 0x53b2379d5e9bcacdfe56b4a51c3fd92ebfff4b1e8e8638f7f7e85163260a6f99. // -// Solidity: event TransitionContested(uint256 indexed blockId, (bytes32,bytes32,bytes32,bytes32) tran, address contester, uint96 contestBond, uint16 tier) -func (_TaikoL1 *TaikoL1Filterer) ParseTransitionContested0(log types.Log) (*TaikoL1TransitionContested0, error) { - event := new(TaikoL1TransitionContested0) - if err := _TaikoL1.contract.UnpackLog(event, "TransitionContested0", log); err != nil { +// Solidity: event TransitionContestedV2(uint256 indexed blockId, (bytes32,bytes32,bytes32,bytes32) tran, address contester, uint96 contestBond, uint16 tier, uint64 proposedIn) +func (_TaikoL1 *TaikoL1Filterer) ParseTransitionContestedV2(log types.Log) (*TaikoL1TransitionContestedV2, error) { + event := new(TaikoL1TransitionContestedV2) + if err := _TaikoL1.contract.UnpackLog(event, "TransitionContestedV2", log); err != nil { return nil, err } event.Raw = log @@ -3619,9 +4535,9 @@ func (_TaikoL1 *TaikoL1Filterer) ParseTransitionProved(log types.Log) (*TaikoL1T return event, nil } -// TaikoL1TransitionProved0Iterator is returned from FilterTransitionProved0 and is used to iterate over the raw logs and unpacked data for TransitionProved0 events raised by the TaikoL1 contract. -type TaikoL1TransitionProved0Iterator struct { - Event *TaikoL1TransitionProved0 // Event containing the contract specifics and raw log +// TaikoL1TransitionProvedV2Iterator is returned from FilterTransitionProvedV2 and is used to iterate over the raw logs and unpacked data for TransitionProvedV2 events raised by the TaikoL1 contract. +type TaikoL1TransitionProvedV2Iterator struct { + Event *TaikoL1TransitionProvedV2 // 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 @@ -3635,7 +4551,7 @@ type TaikoL1TransitionProved0Iterator struct { // 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 *TaikoL1TransitionProved0Iterator) Next() bool { +func (it *TaikoL1TransitionProvedV2Iterator) Next() bool { // If the iterator failed, stop iterating if it.fail != nil { return false @@ -3644,7 +4560,7 @@ func (it *TaikoL1TransitionProved0Iterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(TaikoL1TransitionProved0) + it.Event = new(TaikoL1TransitionProvedV2) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -3659,7 +4575,7 @@ func (it *TaikoL1TransitionProved0Iterator) Next() bool { // Iterator still in progress, wait for either a data or an error event select { case log := <-it.logs: - it.Event = new(TaikoL1TransitionProved0) + it.Event = new(TaikoL1TransitionProvedV2) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -3675,55 +4591,56 @@ func (it *TaikoL1TransitionProved0Iterator) Next() bool { } // Error returns any retrieval or parsing error occurred during filtering. -func (it *TaikoL1TransitionProved0Iterator) Error() error { +func (it *TaikoL1TransitionProvedV2Iterator) Error() error { return it.fail } // Close terminates the iteration process, releasing any pending underlying // resources. -func (it *TaikoL1TransitionProved0Iterator) Close() error { +func (it *TaikoL1TransitionProvedV2Iterator) Close() error { it.sub.Unsubscribe() return nil } -// TaikoL1TransitionProved0 represents a TransitionProved0 event raised by the TaikoL1 contract. -type TaikoL1TransitionProved0 struct { +// TaikoL1TransitionProvedV2 represents a TransitionProvedV2 event raised by the TaikoL1 contract. +type TaikoL1TransitionProvedV2 struct { BlockId *big.Int Tran TaikoDataTransition Prover common.Address ValidityBond *big.Int Tier uint16 + ProposedIn uint64 Raw types.Log // Blockchain specific contextual infos } -// FilterTransitionProved0 is a free log retrieval operation binding the contract event 0xc195e4be3b936845492b8be4b1cf604db687a4d79ad84d979499c136f8e6701f. +// FilterTransitionProvedV2 is a free log retrieval operation binding the contract event 0x11a9112e5724f21b226e2535a95a264a80c9626ed4c0923faaa9fa6556467488. // -// Solidity: event TransitionProved(uint256 indexed blockId, (bytes32,bytes32,bytes32,bytes32) tran, address prover, uint96 validityBond, uint16 tier) -func (_TaikoL1 *TaikoL1Filterer) FilterTransitionProved0(opts *bind.FilterOpts, blockId []*big.Int) (*TaikoL1TransitionProved0Iterator, error) { +// Solidity: event TransitionProvedV2(uint256 indexed blockId, (bytes32,bytes32,bytes32,bytes32) tran, address prover, uint96 validityBond, uint16 tier, uint64 proposedIn) +func (_TaikoL1 *TaikoL1Filterer) FilterTransitionProvedV2(opts *bind.FilterOpts, blockId []*big.Int) (*TaikoL1TransitionProvedV2Iterator, error) { var blockIdRule []interface{} for _, blockIdItem := range blockId { blockIdRule = append(blockIdRule, blockIdItem) } - logs, sub, err := _TaikoL1.contract.FilterLogs(opts, "TransitionProved0", blockIdRule) + logs, sub, err := _TaikoL1.contract.FilterLogs(opts, "TransitionProvedV2", blockIdRule) if err != nil { return nil, err } - return &TaikoL1TransitionProved0Iterator{contract: _TaikoL1.contract, event: "TransitionProved0", logs: logs, sub: sub}, nil + return &TaikoL1TransitionProvedV2Iterator{contract: _TaikoL1.contract, event: "TransitionProvedV2", logs: logs, sub: sub}, nil } -// WatchTransitionProved0 is a free log subscription operation binding the contract event 0xc195e4be3b936845492b8be4b1cf604db687a4d79ad84d979499c136f8e6701f. +// WatchTransitionProvedV2 is a free log subscription operation binding the contract event 0x11a9112e5724f21b226e2535a95a264a80c9626ed4c0923faaa9fa6556467488. // -// Solidity: event TransitionProved(uint256 indexed blockId, (bytes32,bytes32,bytes32,bytes32) tran, address prover, uint96 validityBond, uint16 tier) -func (_TaikoL1 *TaikoL1Filterer) WatchTransitionProved0(opts *bind.WatchOpts, sink chan<- *TaikoL1TransitionProved0, blockId []*big.Int) (event.Subscription, error) { +// Solidity: event TransitionProvedV2(uint256 indexed blockId, (bytes32,bytes32,bytes32,bytes32) tran, address prover, uint96 validityBond, uint16 tier, uint64 proposedIn) +func (_TaikoL1 *TaikoL1Filterer) WatchTransitionProvedV2(opts *bind.WatchOpts, sink chan<- *TaikoL1TransitionProvedV2, blockId []*big.Int) (event.Subscription, error) { var blockIdRule []interface{} for _, blockIdItem := range blockId { blockIdRule = append(blockIdRule, blockIdItem) } - logs, sub, err := _TaikoL1.contract.WatchLogs(opts, "TransitionProved0", blockIdRule) + logs, sub, err := _TaikoL1.contract.WatchLogs(opts, "TransitionProvedV2", blockIdRule) if err != nil { return nil, err } @@ -3733,8 +4650,8 @@ func (_TaikoL1 *TaikoL1Filterer) WatchTransitionProved0(opts *bind.WatchOpts, si select { case log := <-logs: // New log arrived, parse the event and forward to the user - event := new(TaikoL1TransitionProved0) - if err := _TaikoL1.contract.UnpackLog(event, "TransitionProved0", log); err != nil { + event := new(TaikoL1TransitionProvedV2) + if err := _TaikoL1.contract.UnpackLog(event, "TransitionProvedV2", log); err != nil { return err } event.Raw = log @@ -3755,12 +4672,12 @@ func (_TaikoL1 *TaikoL1Filterer) WatchTransitionProved0(opts *bind.WatchOpts, si }), nil } -// ParseTransitionProved0 is a log parse operation binding the contract event 0xc195e4be3b936845492b8be4b1cf604db687a4d79ad84d979499c136f8e6701f. +// ParseTransitionProvedV2 is a log parse operation binding the contract event 0x11a9112e5724f21b226e2535a95a264a80c9626ed4c0923faaa9fa6556467488. // -// Solidity: event TransitionProved(uint256 indexed blockId, (bytes32,bytes32,bytes32,bytes32) tran, address prover, uint96 validityBond, uint16 tier) -func (_TaikoL1 *TaikoL1Filterer) ParseTransitionProved0(log types.Log) (*TaikoL1TransitionProved0, error) { - event := new(TaikoL1TransitionProved0) - if err := _TaikoL1.contract.UnpackLog(event, "TransitionProved0", log); err != nil { +// Solidity: event TransitionProvedV2(uint256 indexed blockId, (bytes32,bytes32,bytes32,bytes32) tran, address prover, uint96 validityBond, uint16 tier, uint64 proposedIn) +func (_TaikoL1 *TaikoL1Filterer) ParseTransitionProvedV2(log types.Log) (*TaikoL1TransitionProvedV2, error) { + event := new(TaikoL1TransitionProvedV2) + if err := _TaikoL1.contract.UnpackLog(event, "TransitionProvedV2", log); err != nil { return nil, err } event.Raw = log diff --git a/packages/eventindexer/contracts/taikotoken/TaikoToken.go b/packages/eventindexer/contracts/taikotoken/TaikoToken.go index 86ab1292437..cd9c9694c8b 100644 --- a/packages/eventindexer/contracts/taikotoken/TaikoToken.go +++ b/packages/eventindexer/contracts/taikotoken/TaikoToken.go @@ -37,7 +37,7 @@ type ERC20VotesUpgradeableCheckpoint struct { // TaikoTokenMetaData contains all meta data concerning the TaikoToken contract. var TaikoTokenMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"function\",\"name\":\"CLOCK_MODE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"DOMAIN_SEPARATOR\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addressManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"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\":\"checkpoints\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"pos\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structERC20VotesUpgradeable.Checkpoint\",\"components\":[{\"name\":\"fromBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"votes\",\"type\":\"uint224\",\"internalType\":\"uint224\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"clock\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint48\",\"internalType\":\"uint48\"}],\"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\":\"delegate\",\"inputs\":[{\"name\":\"delegatee\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegateBySig\",\"inputs\":[{\"name\":\"delegatee\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"expiry\",\"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\":\"delegates\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"eip712Domain\",\"inputs\":[],\"outputs\":[{\"name\":\"fields\",\"type\":\"bytes1\",\"internalType\":\"bytes1\"},{\"name\":\"name\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"version\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"chainId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"verifyingContract\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"extensions\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPastTotalSupply\",\"inputs\":[{\"name\":\"timepoint\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPastVotes\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"timepoint\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getVotes\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"impl\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"inNonReentrant\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"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\":\"init\",\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_recipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"name\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"nonces\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"numCheckpoints\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"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\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"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\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeTo\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"event\",\"name\":\"AdminChanged\",\"inputs\":[{\"name\":\"previousAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"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\":\"BeaconUpgraded\",\"inputs\":[{\"name\":\"beacon\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegateChanged\",\"inputs\":[{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"fromDelegate\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"toDelegate\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegateVotesChanged\",\"inputs\":[{\"name\":\"delegate\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"previousBalance\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"newBalance\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"EIP712DomainChanged\",\"inputs\":[],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"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},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"FUNC_NOT_IMPLEMENTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"REENTRANT_CALL\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_INVALID_MANAGER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_UNEXPECTED_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_ZERO_ADDR\",\"inputs\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ZERO_ADDRESS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_VALUE\",\"inputs\":[]}]", + ABI: "[{\"type\":\"function\",\"name\":\"CLOCK_MODE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"DOMAIN_SEPARATOR\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addressManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"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\":\"batchTransfer\",\"inputs\":[{\"name\":\"recipients\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"amounts\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"checkpoints\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"pos\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structERC20VotesUpgradeable.Checkpoint\",\"components\":[{\"name\":\"fromBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"votes\",\"type\":\"uint224\",\"internalType\":\"uint224\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"clock\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint48\",\"internalType\":\"uint48\"}],\"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\":\"delegate\",\"inputs\":[{\"name\":\"delegatee\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegateBySig\",\"inputs\":[{\"name\":\"delegatee\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"expiry\",\"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\":\"delegates\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"eip712Domain\",\"inputs\":[],\"outputs\":[{\"name\":\"fields\",\"type\":\"bytes1\",\"internalType\":\"bytes1\"},{\"name\":\"name\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"version\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"chainId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"verifyingContract\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"extensions\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPastTotalSupply\",\"inputs\":[{\"name\":\"timepoint\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPastVotes\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"timepoint\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getVotes\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"impl\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"inNonReentrant\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"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\":\"init\",\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_recipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"name\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"nonces\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"numCheckpoints\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"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\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"symbol\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"pure\"},{\"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\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeTo\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"event\",\"name\":\"AdminChanged\",\"inputs\":[{\"name\":\"previousAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"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\":\"BeaconUpgraded\",\"inputs\":[{\"name\":\"beacon\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegateChanged\",\"inputs\":[{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"fromDelegate\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"toDelegate\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegateVotesChanged\",\"inputs\":[{\"name\":\"delegate\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"previousBalance\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"newBalance\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"EIP712DomainChanged\",\"inputs\":[],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"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},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"FUNC_NOT_IMPLEMENTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"REENTRANT_CALL\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_INVALID_MANAGER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_UNEXPECTED_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_ZERO_ADDR\",\"inputs\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"TT_INVALID_PARAM\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_ADDRESS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_VALUE\",\"inputs\":[]}]", } // TaikoTokenABI is the input ABI used to generate the binding from. @@ -1002,7 +1002,7 @@ func (_TaikoToken *TaikoTokenCallerSession) Resolve0(_name [32]byte, _allowZeroA // Symbol is a free data retrieval call binding the contract method 0x95d89b41. // -// Solidity: function symbol() view returns(string) +// Solidity: function symbol() pure returns(string) func (_TaikoToken *TaikoTokenCaller) Symbol(opts *bind.CallOpts) (string, error) { var out []interface{} err := _TaikoToken.contract.Call(opts, &out, "symbol") @@ -1019,14 +1019,14 @@ func (_TaikoToken *TaikoTokenCaller) Symbol(opts *bind.CallOpts) (string, error) // Symbol is a free data retrieval call binding the contract method 0x95d89b41. // -// Solidity: function symbol() view returns(string) +// Solidity: function symbol() pure returns(string) func (_TaikoToken *TaikoTokenSession) Symbol() (string, error) { return _TaikoToken.Contract.Symbol(&_TaikoToken.CallOpts) } // Symbol is a free data retrieval call binding the contract method 0x95d89b41. // -// Solidity: function symbol() view returns(string) +// Solidity: function symbol() pure returns(string) func (_TaikoToken *TaikoTokenCallerSession) Symbol() (string, error) { return _TaikoToken.Contract.Symbol(&_TaikoToken.CallOpts) } @@ -1104,6 +1104,27 @@ func (_TaikoToken *TaikoTokenTransactorSession) Approve(spender common.Address, return _TaikoToken.Contract.Approve(&_TaikoToken.TransactOpts, spender, amount) } +// BatchTransfer is a paid mutator transaction binding the contract method 0x88d695b2. +// +// Solidity: function batchTransfer(address[] recipients, uint256[] amounts) returns(bool) +func (_TaikoToken *TaikoTokenTransactor) BatchTransfer(opts *bind.TransactOpts, recipients []common.Address, amounts []*big.Int) (*types.Transaction, error) { + return _TaikoToken.contract.Transact(opts, "batchTransfer", recipients, amounts) +} + +// BatchTransfer is a paid mutator transaction binding the contract method 0x88d695b2. +// +// Solidity: function batchTransfer(address[] recipients, uint256[] amounts) returns(bool) +func (_TaikoToken *TaikoTokenSession) BatchTransfer(recipients []common.Address, amounts []*big.Int) (*types.Transaction, error) { + return _TaikoToken.Contract.BatchTransfer(&_TaikoToken.TransactOpts, recipients, amounts) +} + +// BatchTransfer is a paid mutator transaction binding the contract method 0x88d695b2. +// +// Solidity: function batchTransfer(address[] recipients, uint256[] amounts) returns(bool) +func (_TaikoToken *TaikoTokenTransactorSession) BatchTransfer(recipients []common.Address, amounts []*big.Int) (*types.Transaction, error) { + return _TaikoToken.Contract.BatchTransfer(&_TaikoToken.TransactOpts, recipients, amounts) +} + // DecreaseAllowance is a paid mutator transaction binding the contract method 0xa457c2d7. // // Solidity: function decreaseAllowance(address spender, uint256 subtractedValue) returns(bool) diff --git a/packages/eventindexer/db.go b/packages/eventindexer/db.go deleted file mode 100644 index 531c2b6f3ca..00000000000 --- a/packages/eventindexer/db.go +++ /dev/null @@ -1,25 +0,0 @@ -package eventindexer - -import ( - "database/sql" - - "github.com/cyberhorsey/errors" - "gorm.io/gorm" -) - -var ( - ErrNoDB = errors.Validation.NewWithKeyAndDetail("ERR_NO_DB", "DB is required") -) - -type DBConnectionOpts struct { - Name string - Password string - Host string - Database string - OpenFunc func(dsn string) (DB, error) -} - -type DB interface { - DB() (*sql.DB, error) - GormDB() *gorm.DB -} diff --git a/packages/eventindexer/docs/docs.go b/packages/eventindexer/docs/docs.go index 950eaea61ed..abed8494ff4 100644 --- a/packages/eventindexer/docs/docs.go +++ b/packages/eventindexer/docs/docs.go @@ -17,7 +17,7 @@ const docTemplate = `{ }, "license": { "name": "MIT", - "url": "https://github.com/taikoxyz/taiko-mono/blob/main/LICENSE.md" + "url": "https://github.com/taikoxyz/taiko-mono/blob/main/LICENSE" }, "version": "{{.Version}}" }, @@ -53,6 +53,70 @@ const docTemplate = `{ } } }, + "/blockProposedBy": { + "get": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "summary": "Get block proposed by", + "operationId": "get-block-proposed-by", + "parameters": [ + { + "type": "string", + "description": "blockID to query", + "name": "blockID", + "in": "query", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/eventindexer.Event" + } + } + } + } + } + }, + "/blockProvenBy": { + "get": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "summary": "Get block proven by", + "operationId": "get-block-proven-by", + "parameters": [ + { + "type": "string", + "description": "blockID to query", + "name": "blockID", + "in": "query", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/eventindexer.Event" + } + } + } + } + } + }, "/chart/chartByTask": { "get": { "consumes": [ @@ -96,6 +160,42 @@ const docTemplate = `{ } } }, + "/erc20sByAddress": { + "get": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "summary": "Get erc20 balances by address and chain ID", + "operationId": "get-erc20-balances-by-address-and-chain-id", + "parameters": [ + { + "type": "string", + "description": "address to query", + "name": "address", + "in": "query", + "required": true + }, + { + "type": "string", + "description": "chainID to query", + "name": "chainID", + "in": "query", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/paginate.Page" + } + } + } + } + }, "/events": { "get": { "consumes": [ @@ -210,6 +310,17 @@ const docTemplate = `{ } }, "definitions": { + "decimal.NullDecimal": { + "type": "object", + "properties": { + "decimal": { + "type": "number" + }, + "valid": { + "type": "boolean" + } + } + }, "eventindexer.ChartItem": { "type": "object", "properties": { @@ -232,6 +343,65 @@ const docTemplate = `{ } } }, + "eventindexer.Event": { + "type": "object", + "properties": { + "address": { + "type": "string" + }, + "amount": { + "$ref": "#/definitions/decimal.NullDecimal" + }, + "assignedProver": { + "type": "string" + }, + "blockID": { + "type": "integer" + }, + "chainID": { + "type": "integer" + }, + "contractAddress": { + "type": "string" + }, + "data": { + "type": "string" + }, + "emittedBlockID": { + "type": "integer" + }, + "event": { + "type": "string" + }, + "feeTokenAddress": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "proofReward": { + "$ref": "#/definitions/decimal.NullDecimal" + }, + "proposerReward": { + "$ref": "#/definitions/decimal.NullDecimal" + }, + "tier": { + "type": "integer" + }, + "to": { + "type": "string" + }, + "tokenID": { + "type": "integer" + }, + "transactedAt": { + "type": "string" + } + } + }, "eventindexer.UniqueProposersResponse": { "type": "object", "properties": { diff --git a/packages/eventindexer/docs/swagger.json b/packages/eventindexer/docs/swagger.json index 8927b8f6366..4f663dda8c8 100644 --- a/packages/eventindexer/docs/swagger.json +++ b/packages/eventindexer/docs/swagger.json @@ -10,7 +10,7 @@ }, "license": { "name": "MIT", - "url": "https://github.com/taikoxyz/taiko-mono/blob/main/LICENSE.md" + "url": "https://github.com/taikoxyz/taiko-mono/blob/main/LICENSE" }, "version": "1.0" }, @@ -41,6 +41,62 @@ } } }, + "/blockProposedBy": { + "get": { + "consumes": ["application/json"], + "produces": ["application/json"], + "summary": "Get block proposed by", + "operationId": "get-block-proposed-by", + "parameters": [ + { + "type": "string", + "description": "blockID to query", + "name": "blockID", + "in": "query", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/eventindexer.Event" + } + } + } + } + } + }, + "/blockProvenBy": { + "get": { + "consumes": ["application/json"], + "produces": ["application/json"], + "summary": "Get block proven by", + "operationId": "get-block-proven-by", + "parameters": [ + { + "type": "string", + "description": "blockID to query", + "name": "blockID", + "in": "query", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/eventindexer.Event" + } + } + } + } + } + }, "/chart/chartByTask": { "get": { "consumes": ["application/json"], @@ -80,6 +136,38 @@ } } }, + "/erc20sByAddress": { + "get": { + "consumes": ["application/json"], + "produces": ["application/json"], + "summary": "Get erc20 balances by address and chain ID", + "operationId": "get-erc20-balances-by-address-and-chain-id", + "parameters": [ + { + "type": "string", + "description": "address to query", + "name": "address", + "in": "query", + "required": true + }, + { + "type": "string", + "description": "chainID to query", + "name": "chainID", + "in": "query", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/paginate.Page" + } + } + } + } + }, "/events": { "get": { "consumes": ["application/json"], @@ -178,6 +266,17 @@ } }, "definitions": { + "decimal.NullDecimal": { + "type": "object", + "properties": { + "decimal": { + "type": "number" + }, + "valid": { + "type": "boolean" + } + } + }, "eventindexer.ChartItem": { "type": "object", "properties": { @@ -200,6 +299,65 @@ } } }, + "eventindexer.Event": { + "type": "object", + "properties": { + "address": { + "type": "string" + }, + "amount": { + "$ref": "#/definitions/decimal.NullDecimal" + }, + "assignedProver": { + "type": "string" + }, + "blockID": { + "type": "integer" + }, + "chainID": { + "type": "integer" + }, + "contractAddress": { + "type": "string" + }, + "data": { + "type": "string" + }, + "emittedBlockID": { + "type": "integer" + }, + "event": { + "type": "string" + }, + "feeTokenAddress": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "proofReward": { + "$ref": "#/definitions/decimal.NullDecimal" + }, + "proposerReward": { + "$ref": "#/definitions/decimal.NullDecimal" + }, + "tier": { + "type": "integer" + }, + "to": { + "type": "string" + }, + "tokenID": { + "type": "integer" + }, + "transactedAt": { + "type": "string" + } + } + }, "eventindexer.UniqueProposersResponse": { "type": "object", "properties": { diff --git a/packages/eventindexer/docs/swagger.yaml b/packages/eventindexer/docs/swagger.yaml index a595892b8b2..14e7e96df6d 100644 --- a/packages/eventindexer/docs/swagger.yaml +++ b/packages/eventindexer/docs/swagger.yaml @@ -1,4 +1,11 @@ definitions: + decimal.NullDecimal: + properties: + decimal: + type: number + valid: + type: boolean + type: object eventindexer.ChartItem: properties: date: @@ -13,6 +20,45 @@ definitions: $ref: "#/definitions/eventindexer.ChartItem" type: array type: object + eventindexer.Event: + properties: + address: + type: string + amount: + $ref: "#/definitions/decimal.NullDecimal" + assignedProver: + type: string + blockID: + type: integer + chainID: + type: integer + contractAddress: + type: string + data: + type: string + emittedBlockID: + type: integer + event: + type: string + feeTokenAddress: + type: string + id: + type: integer + name: + type: string + proofReward: + $ref: "#/definitions/decimal.NullDecimal" + proposerReward: + $ref: "#/definitions/decimal.NullDecimal" + tier: + type: integer + to: + type: string + tokenID: + type: integer + transactedAt: + type: string + type: object eventindexer.UniqueProposersResponse: properties: address: @@ -77,7 +123,7 @@ info: url: https://community.taiko.xyz/ license: name: MIT - url: https://github.com/taikoxyz/taiko-mono/blob/main/LICENSE.md + url: https://github.com/taikoxyz/taiko-mono/blob/main/LICENSE termsOfService: http://swagger.io/terms/ title: Taiko Event Indexer API version: "1.0" @@ -101,6 +147,48 @@ paths: schema: $ref: "#/definitions/paginate.Page" summary: Get assigned blocks by prover address + /blockProposedBy: + get: + consumes: + - application/json + operationId: get-block-proposed-by + parameters: + - description: blockID to query + in: query + name: blockID + required: true + type: string + produces: + - application/json + responses: + "200": + description: OK + schema: + items: + $ref: "#/definitions/eventindexer.Event" + type: array + summary: Get block proposed by + /blockProvenBy: + get: + consumes: + - application/json + operationId: get-block-proven-by + parameters: + - description: blockID to query + in: query + name: blockID + required: true + type: string + produces: + - application/json + responses: + "200": + description: OK + schema: + items: + $ref: "#/definitions/eventindexer.Event" + type: array + summary: Get block proven by /chart/chartByTask: get: consumes: @@ -130,6 +218,30 @@ paths: schema: $ref: "#/definitions/eventindexer.ChartResponse" summary: Get time series data for displaying charts + /erc20sByAddress: + get: + consumes: + - application/json + operationId: get-erc20-balances-by-address-and-chain-id + parameters: + - description: address to query + in: query + name: address + required: true + type: string + - description: chainID to query + in: query + name: chainID + required: true + type: string + produces: + - application/json + responses: + "200": + description: OK + schema: + $ref: "#/definitions/paginate.Page" + summary: Get erc20 balances by address and chain ID /events: get: consumes: diff --git a/packages/eventindexer/erc20_balance.go b/packages/eventindexer/erc20_balance.go new file mode 100644 index 00000000000..64823464fcc --- /dev/null +++ b/packages/eventindexer/erc20_balance.go @@ -0,0 +1,57 @@ +package eventindexer + +import ( + "context" + "net/http" + + "github.com/morkid/paginate" +) + +type ERC20Metadata struct { + ID int `json:"id"` + ChainID int64 `json:"chainID"` + ContractAddress string `json:"contractAddress"` + Symbol string `json:"symbol"` + Decimals uint8 `json:"decimals"` +} + +// ERC20Balance +type ERC20Balance struct { + ID int `json:"id"` + ERC20MetadataID int64 `json:"erc20MetadataID"` + ChainID int64 `json:"chainID"` + Address string `json:"address"` + Amount string `json:"amount"` + ContractAddress string `json:"contractAddress"` + Metadata *ERC20Metadata `json:"metadata" gorm:"foreignKey:ERC20MetadataID"` +} + +type UpdateERC20BalanceOpts struct { + ERC20MetadataID int64 + ChainID int64 + Address string + ContractAddress string + Amount string +} + +// ERC20BalanceRepository is used to interact with nft balances in the store +type ERC20BalanceRepository interface { + IncreaseAndDecreaseBalancesInTx( + ctx context.Context, + increaseOpts UpdateERC20BalanceOpts, + decreaseOpts UpdateERC20BalanceOpts, + ) (increasedBalance *ERC20Balance, decreasedBalance *ERC20Balance, err error) + FindByAddress(ctx context.Context, + req *http.Request, + address string, + chainID string, + ) (paginate.Page, error) + FindMetadata(ctx context.Context, chainID int64, contractAddress string) (*ERC20Metadata, error) + CreateMetadata( + ctx context.Context, + chainID int64, + contractAddress string, + symbol string, + decimals uint8, + ) (int, error) +} diff --git a/packages/eventindexer/errors.go b/packages/eventindexer/errors.go index 73e8b651300..d85fc6c3d79 100644 --- a/packages/eventindexer/errors.go +++ b/packages/eventindexer/errors.go @@ -23,4 +23,5 @@ var ( ErrNoCORSOrigins = errors.Validation.NewWithKeyAndDetail("ERR_NO_CORS_ORIGINS", "CORS Origins are required") ErrNoRPCClient = errors.Validation.NewWithKeyAndDetail("ERR_NO_RPC_CLIENT", "RPCClient is required") ErrInvalidMode = errors.Validation.NewWithKeyAndDetail("ERR_INVALID_MODE", "Mode not supported") + ErrInvalidURL = errors.Validation.NewWithKeyAndDetail("ERR_INVALID_URL", "The provided URL is invalid or unreachable") ) diff --git a/packages/eventindexer/event.go b/packages/eventindexer/event.go index 27e95b78044..fdda18b7c66 100644 --- a/packages/eventindexer/event.go +++ b/packages/eventindexer/event.go @@ -114,8 +114,11 @@ type EventRepository interface { req *http.Request, address string, ) (paginate.Page, error) - DeleteAllAfterBlockID(blockID uint64, srcChainID uint64) error + DeleteAllAfterBlockID(ctx context.Context, blockID uint64, srcChainID uint64) error FindLatestBlockID( + ctx context.Context, srcChainID uint64, ) (uint64, error) + GetBlockProvenBy(ctx context.Context, blockID int) ([]*Event, error) + GetBlockProposedBy(ctx context.Context, blockID int) (*Event, error) } diff --git a/packages/eventindexer/generator/config.go b/packages/eventindexer/generator/config.go deleted file mode 100644 index 962d266a976..00000000000 --- a/packages/eventindexer/generator/config.go +++ /dev/null @@ -1,75 +0,0 @@ -package generator - -import ( - "database/sql" - "time" - - "github.com/taikoxyz/taiko-mono/packages/eventindexer/cmd/flags" - "github.com/taikoxyz/taiko-mono/packages/eventindexer/pkg/db" - "github.com/urfave/cli/v2" - "gorm.io/driver/mysql" - "gorm.io/gorm" - "gorm.io/gorm/logger" -) - -type DB interface { - DB() (*sql.DB, error) - GormDB() *gorm.DB -} - -type Config struct { - // db configs - DatabaseUsername string - DatabasePassword string - DatabaseName string - DatabaseHost string - DatabaseMaxIdleConns uint64 - DatabaseMaxOpenConns uint64 - DatabaseMaxConnLifetime uint64 - MetricsHTTPPort uint64 - GenesisDate time.Time - Regenerate bool - OpenDBFunc func() (DB, error) -} - -// NewConfigFromCliContext creates a new config instance from command line flags. -func NewConfigFromCliContext(c *cli.Context) (*Config, error) { - date, err := time.Parse("2006-01-02", c.String(flags.GenesisDate.Name)) - if err != nil { - return nil, err - } - - return &Config{ - DatabaseUsername: c.String(flags.DatabaseUsername.Name), - DatabasePassword: c.String(flags.DatabasePassword.Name), - DatabaseName: c.String(flags.DatabaseName.Name), - DatabaseHost: c.String(flags.DatabaseHost.Name), - DatabaseMaxIdleConns: c.Uint64(flags.DatabaseMaxIdleConns.Name), - DatabaseMaxOpenConns: c.Uint64(flags.DatabaseMaxOpenConns.Name), - DatabaseMaxConnLifetime: c.Uint64(flags.DatabaseConnMaxLifetime.Name), - MetricsHTTPPort: c.Uint64(flags.MetricsHTTPPort.Name), - GenesisDate: date, - Regenerate: c.Bool(flags.Regenerate.Name), - OpenDBFunc: func() (DB, error) { - return db.OpenDBConnection(db.DBConnectionOpts{ - Name: c.String(flags.DatabaseUsername.Name), - Password: c.String(flags.DatabasePassword.Name), - Database: c.String(flags.DatabaseName.Name), - Host: c.String(flags.DatabaseHost.Name), - MaxIdleConns: c.Uint64(flags.DatabaseMaxIdleConns.Name), - MaxOpenConns: c.Uint64(flags.DatabaseMaxOpenConns.Name), - MaxConnLifetime: c.Uint64(flags.DatabaseConnMaxLifetime.Name), - OpenFunc: func(dsn string) (*db.DB, error) { - gormDB, err := gorm.Open(mysql.Open(dsn), &gorm.Config{ - Logger: logger.Default.LogMode(logger.Silent), - }) - if err != nil { - return nil, err - } - - return db.New(gormDB), nil - }, - }) - }, - }, nil -} diff --git a/packages/eventindexer/generator/config_test.go b/packages/eventindexer/generator/config_test.go deleted file mode 100644 index 290e03421e0..00000000000 --- a/packages/eventindexer/generator/config_test.go +++ /dev/null @@ -1,58 +0,0 @@ -package generator - -import ( - "context" - "testing" - "time" - - "github.com/stretchr/testify/assert" - "github.com/taikoxyz/taiko-mono/packages/eventindexer/cmd/flags" - "github.com/urfave/cli/v2" -) - -func setupApp() *cli.App { - app := cli.NewApp() - app.Flags = flags.GeneratorFlags - app.Action = func(ctx *cli.Context) error { - _, err := NewConfigFromCliContext(ctx) - return err - } - - return app -} - -func TestNewConfigFromCliContext(t *testing.T) { - app := setupApp() - - app.Action = func(ctx *cli.Context) error { - c, err := NewConfigFromCliContext(ctx) - - assert.Nil(t, err) - assert.Equal(t, "dbuser", c.DatabaseUsername) - assert.Equal(t, "dbpass", c.DatabasePassword) - assert.Equal(t, "dbname", c.DatabaseName) - assert.Equal(t, "dbhost", c.DatabaseHost) - assert.Equal(t, true, c.Regenerate) - - wantTime, _ := time.Parse("2006-01-02", "2023-07-07") - assert.Equal(t, wantTime, c.GenesisDate) - - c.OpenDBFunc = func() (DB, error) { - return nil, nil - } - - assert.Nil(t, InitFromConfig(context.Background(), new(Generator), c)) - - return err - } - - assert.Nil(t, app.Run([]string{ - "TestNewConfigFromCliContext", - "--" + flags.DatabaseUsername.Name, "dbuser", - "--" + flags.DatabasePassword.Name, "dbpass", - "--" + flags.DatabaseHost.Name, "dbhost", - "--" + flags.DatabaseName.Name, "dbname", - "--" + flags.GenesisDate.Name, "2023-07-07", - "--" + flags.Regenerate.Name, "true", - })) -} diff --git a/packages/eventindexer/generator/generator.go b/packages/eventindexer/generator/generator.go deleted file mode 100644 index f5acd51a5c7..00000000000 --- a/packages/eventindexer/generator/generator.go +++ /dev/null @@ -1,652 +0,0 @@ -package generator - -import ( - "context" - "errors" - "log/slog" - "os" - "time" - - "github.com/ethereum/go-ethereum/common" - "github.com/shopspring/decimal" - "github.com/taikoxyz/taiko-mono/packages/eventindexer" - "github.com/taikoxyz/taiko-mono/packages/eventindexer/pkg/tasks" - "github.com/urfave/cli/v2" - "gorm.io/gorm" -) - -var ( - ZeroAddress = common.HexToAddress("0x0000000000000000000000000000000000000000") -) - -// Generator is a subcommand which is intended to be run on an interval, like -// a cronjob, to parse the indexed data from the database, and generate -// time series data that can easily be displayed via charting libraries. -type Generator struct { - db DB - genesisDate time.Time - regenerate bool -} - -func (g *Generator) InitFromCli(ctx context.Context, c *cli.Context) error { - config, err := NewConfigFromCliContext(c) - if err != nil { - return err - } - - return InitFromConfig(ctx, g, config) -} - -func InitFromConfig(ctx context.Context, g *Generator, cfg *Config) error { - db, err := cfg.OpenDBFunc() - if err != nil { - return err - } - - g.db = db - g.genesisDate = cfg.GenesisDate - g.regenerate = cfg.Regenerate - - return nil -} - -func (g *Generator) Name() string { - return "generator" -} - -func (g *Generator) Start() error { - if g.regenerate { - slog.Info("regenerating, deleting existing data") - - if err := g.deleteTimeSeriesData(context.Background()); err != nil { - return err - } - } - - slog.Info("generating time series data") - - if err := g.generateTimeSeriesData(context.Background()); err != nil { - return err - } - - os.Exit(0) - - return nil -} - -func (g *Generator) Close(ctx context.Context) { - sqlDB, err := g.db.DB() - if err != nil { - slog.Error("error getting sqldb when closing generator", "err", err.Error()) - } - - if err := sqlDB.Close(); err != nil { - slog.Error("error closing sqlbd connection", "err", err.Error()) - } -} - -func (g *Generator) deleteTimeSeriesData(ctx context.Context) error { - deleteStmt := "DELETE FROM time_series_data;" - if err := g.db.GormDB().Exec(deleteStmt).Error; err != nil { - return err - } - - return nil -} - -// generateTimeSeriesData iterates over each task and generates time series data. -func (g *Generator) generateTimeSeriesData(ctx context.Context) error { - for _, task := range tasks.Tasks { - if err := g.generateByTask(ctx, task); err != nil { - slog.Error("error generating for task", "task", task, "error", err.Error()) - return err - } - } - - return nil -} - -// generateByTask generates time series data for each day in between the current date -// and the most recently generated time series data, for the given task. -func (g *Generator) generateByTask(ctx context.Context, task string) error { - slog.Info("generating for task", "task", task) - - startingDate, err := g.getStartingDateByTask(ctx, task) - if err != nil { - return err - } - - currentDate := g.getCurrentDate() - if startingDate.Compare(currentDate) == 0 { - slog.Info( - "data already generated up-to-date for task", - "task", task, - "date", startingDate.Format("2006-01-02"), - "currentDate", currentDate.Format("2006-01-02"), - ) - - return nil - } - - // Loop through each date from latestDate to currentDate - for d := startingDate; d.Before(currentDate); d = d.AddDate(0, 0, 1) { - slog.Info("Processing", "task", task, "date", d.Format("2006-01-02"), "currentDate", currentDate.Format("2006-01-02")) - - err := g.queryByTask(task, d) - if err != nil { - slog.Info("Query failed", "task", task, "date", d.Format("2006-01-02"), "error", err.Error()) - return err - } - - slog.Info("Processed", "task", task, "date", d.Format("2006-01-02")) - } - - return nil -} - -// getStartingDateByTask returns first required time series data, one after the latest date entry, -// or the genesis date. -func (g *Generator) getStartingDateByTask(ctx context.Context, task string) (time.Time, error) { - var latestDateString string - - var nextRequiredDate time.Time - - q := `SELECT date FROM time_series_data WHERE task = ? ORDER BY date DESC LIMIT 1;` - - err := g.db.GormDB().Raw(q, task).Scan(&latestDateString).Error - - slog.Info("latestDateString", "task", task, "date", latestDateString) - - if err != nil || latestDateString == "" { - nextRequiredDate = g.genesisDate - } else { - latestDate, err := time.Parse("2006-01-02", latestDateString) - if err != nil { - return time.Time{}, err - } - - nextRequiredDate = latestDate.AddDate(0, 0, 1) - } - - slog.Info("next required date for task", "task", task, "nextRequiredDate", nextRequiredDate.Format("2006-01-02")) - - return nextRequiredDate, nil -} - -// getCurrentDate returns the current date in YYYY-MM-DD format -func (g *Generator) getCurrentDate() time.Time { - // Get current date - currentTime := time.Now().UTC() - currentDate := time.Date(currentTime.Year(), currentTime.Month(), currentTime.Day(), 0, 0, 0, 0, time.UTC) - - return currentDate -} - -// nolint: funlen, gocognit -// queryByTask runs a database query which should return result data based on the -// task -func (g *Generator) queryByTask(task string, date time.Time) error { - dateString := date.Format("2006-01-02") - - var result decimal.Decimal - - var err error - - switch task { - case tasks.TotalTransitionProvedByTier: - var tiers []uint16 = make([]uint16, 0) - - query := "SELECT DISTINCT tier FROM events WHERE event = ? AND tier IS NOT NULL;" - - err = g.db.GormDB(). - Raw(query, eventindexer.EventNameTransitionProved). - Scan(&tiers).Error - if err != nil { - return err - } - - slog.Info("tiers", "tiers", tiers) - - for _, tier := range tiers { - t := tier - - var dailyCountByTier decimal.NullDecimal - - // nolint: lll - query := "SELECT COUNT(*) FROM events WHERE event = ? AND DATE(transacted_at) = ? AND tier = ?" - err = g.db.GormDB(). - Raw(query, eventindexer.EventNameTransitionProved, dateString, t). - Scan(&dailyCountByTier).Error - - if err != nil { - return err - } - - tsdResult, err := g.previousDayTsdResultByTask(task, date, nil, &t) - if err != nil { - return err - } - - result := tsdResult.Decimal.Add(dailyCountByTier.Decimal) - - slog.Info("Query successful", - "task", task, - "date", dateString, - "result", result.String(), - "tier", t, - ) - - insertStmt := ` - INSERT INTO time_series_data(task, value, date, tier) - VALUES (?, ?, ?, ?)` - - err = g.db.GormDB().Exec(insertStmt, task, result, dateString, t).Error - if err != nil { - slog.Info("Insert failed", "task", task, "date", dateString, "error", err.Error()) - return err - } - } - - // return early for array processing data - return nil - case tasks.TransitionProvedByTierPerDay: - var tiers []uint16 = make([]uint16, 0) - - query := "SELECT DISTINCT tier FROM events WHERE event = ? AND tier IS NOT NULL;" - - err = g.db.GormDB(). - Raw(query, eventindexer.EventNameTransitionProved). - Scan(&tiers).Error - if err != nil { - return err - } - - slog.Info("tiers", "tiers", tiers) - - for _, tier := range tiers { - t := tier - - var dailyCountByTier decimal.NullDecimal - - // nolint: lll - query := "SELECT COUNT(*) FROM events WHERE event = ? AND DATE(transacted_at) = ? AND tier = ?" - err = g.db.GormDB(). - Raw(query, eventindexer.EventNameTransitionProved, dateString, t). - Scan(&dailyCountByTier).Error - - if err != nil { - return err - } - - slog.Info("Query successful", - "task", task, - "date", dateString, - "result", dailyCountByTier.Decimal.String(), - "tier", t, - ) - - insertStmt := ` - INSERT INTO time_series_data(task, value, date, tier) - VALUES (?, ?, ?, ?)` - - err = g.db.GormDB().Exec(insertStmt, task, result, dateString, t).Error - if err != nil { - slog.Info("Insert failed", "task", task, "date", dateString, "error", err.Error()) - return err - } - } - - // return early for array processing data - return nil - case tasks.TransitionContestedByTierPerDay: - var tiers []uint16 = make([]uint16, 0) - - query := "SELECT DISTINCT tier FROM events WHERE event = ? AND tier IS NOT NULL;" - - err = g.db.GormDB(). - Raw(query, eventindexer.EventNameTransitionContested). - Scan(&tiers).Error - if err != nil { - return err - } - - slog.Info("tiers", "tiers", tiers) - - for _, tier := range tiers { - t := tier - - var dailyCountByTier decimal.NullDecimal - - // nolint: lll - query := "SELECT COUNT(*) FROM events WHERE event = ? AND DATE(transacted_at) = ? AND tier = ?" - err = g.db.GormDB(). - Raw(query, eventindexer.EventNameTransitionContested, dateString, t). - Scan(&dailyCountByTier).Error - - if err != nil { - return err - } - - slog.Info("Query successful", - "task", task, - "date", dateString, - "result", dailyCountByTier.Decimal.String(), - "tier", t, - ) - - insertStmt := ` - INSERT INTO time_series_data(task, value, date, tier) - VALUES (?, ?, ?, ?)` - - err = g.db.GormDB().Exec(insertStmt, task, result, dateString, t).Error - if err != nil { - slog.Info("Insert failed", "task", task, "date", dateString, "error", err.Error()) - return err - } - } - - // return early for array processing data - return nil - case tasks.TotalTransitionContestedByTier: - var tiers []uint16 = make([]uint16, 0) - - query := "SELECT DISTINCT tier FROM events WHERE event = ? AND tier IS NOT NULL;" - - err = g.db.GormDB(). - Raw(query, eventindexer.EventNameTransitionContested). - Scan(&tiers).Error - if err != nil { - return err - } - - slog.Info("tiers", "tiers", tiers) - - for _, tier := range tiers { - t := tier - - var dailyCountByTier decimal.NullDecimal - - // nolint: lll - query := "SELECT COUNT(*) FROM events WHERE event = ? AND DATE(transacted_at) = ? AND tier = ?" - err = g.db.GormDB(). - Raw(query, eventindexer.EventNameTransitionContested, dateString, t). - Scan(&dailyCountByTier).Error - - if err != nil { - return err - } - - tsdResult, err := g.previousDayTsdResultByTask(task, date, nil, &t) - if err != nil { - return err - } - - result := tsdResult.Decimal.Add(dailyCountByTier.Decimal) - - slog.Info("Query successful", - "task", task, - "date", dateString, - "result", result.String(), - "tier", t, - ) - - insertStmt := ` - INSERT INTO time_series_data(task, value, date, tier) - VALUES (?, ?, ?, ?)` - - err = g.db.GormDB().Exec(insertStmt, task, result, dateString, t).Error - if err != nil { - slog.Info("Insert failed", "task", task, "date", dateString, "error", err.Error()) - return err - } - } - - // return early for array processing data - return nil - case tasks.BridgeMessagesSentPerDay: - err = g.eventCount(task, date, eventindexer.EventNameMessageSent, &result) - case tasks.TotalBridgeMessagesSent: - var dailyMsgSentCount decimal.NullDecimal - - err = g.eventCount(task, date, eventindexer.EventNameMessageSent, &dailyMsgSentCount) - if err != nil { - return err - } - - tsdResult, err := g.previousDayTsdResultByTask(task, date, nil, nil) - if err != nil { - return err - } - - result = tsdResult.Decimal.Add(dailyMsgSentCount.Decimal) - case tasks.ProposeBlockTxPerDay: - err = g.eventCount(task, date, eventindexer.EventNameBlockProposed, &result) - case tasks.TotalProposeBlockTx: - var dailyProposerCount decimal.NullDecimal - - err = g.eventCount(task, date, eventindexer.EventNameBlockProposed, &dailyProposerCount) - if err != nil { - return err - } - - tsdResult, err := g.previousDayTsdResultByTask(task, date, nil, nil) - if err != nil { - return err - } - - result = tsdResult.Decimal.Add(dailyProposerCount.Decimal) - case tasks.UniqueProposersPerDay: - query := "SELECT COUNT(DISTINCT address) FROM events WHERE event = ? AND DATE(transacted_at) = ?" - err = g.db.GormDB(). - Raw(query, eventindexer.EventNameBlockProposed, dateString). - Scan(&result).Error - case tasks.TotalUniqueProposers: - query := `SELECT COUNT(DISTINCT address) FROM events WHERE event = ?` - - err = g.db.GormDB().Raw( - query, - eventindexer.EventNameBlockProposed, - ).Scan(&result).Error - if err != nil { - return err - } - case tasks.UniqueProversPerDay: - query := "SELECT COUNT(DISTINCT address) FROM events WHERE event = ? AND DATE(transacted_at) = ?" - err = g.db.GormDB(). - Raw(query, eventindexer.EventNameTransitionProved, dateString). - Scan(&result).Error - case tasks.TotalUniqueProvers: - query := `SELECT COUNT(DISTINCT address) FROM events WHERE event = ?` - - err = g.db.GormDB().Raw( - query, - eventindexer.EventNameTransitionProved, - ).Scan(&result).Error - if err != nil { - return err - } - case tasks.TransitionProvedTxPerDay: - query := "SELECT COUNT(*) FROM events WHERE event = ? AND DATE(transacted_at) = ?" - err = g.db.GormDB(). - Raw(query, eventindexer.EventNameTransitionProved, dateString). - Scan(&result).Error - case tasks.TotalTransitionProvedTx: - var dailyTransitionProvedCount decimal.NullDecimal - - query := `SELECT COUNT(*) FROM events WHERE event = ? AND DATE(transacted_at) = ?` - - err = g.db.GormDB().Raw( - query, - eventindexer.EventNameTransitionProved, - dateString, - ).Scan(&dailyTransitionProvedCount).Error - if err != nil { - return err - } - - tsdResult, err := g.previousDayTsdResultByTask(task, date, nil, nil) - if err != nil { - return err - } - - result = tsdResult.Decimal.Add(dailyTransitionProvedCount.Decimal) - case tasks.TransitionContestedTxPerDay: - query := "SELECT COUNT(*) FROM events WHERE event = ? AND DATE(transacted_at) = ?" - err = g.db.GormDB(). - Raw(query, eventindexer.EventNameTransitionContested, dateString). - Scan(&result).Error - case tasks.TotalTransitionContestedTx: - var dailyTransitionContestedCount decimal.NullDecimal - - query := `SELECT COUNT(*) FROM events WHERE event = ? AND DATE(transacted_at) = ?` - - err = g.db.GormDB().Raw( - query, - eventindexer.EventNameTransitionContested, - dateString, - ).Scan(&dailyTransitionContestedCount).Error - if err != nil { - return err - } - - tsdResult, err := g.previousDayTsdResultByTask(task, date, nil, nil) - if err != nil { - return err - } - - result = tsdResult.Decimal.Add(dailyTransitionContestedCount.Decimal) - case tasks.AccountsPerDay: - query := `SELECT COUNT(*) FROM accounts WHERE DATE(transacted_at) = ?` - err = g.db.GormDB().Raw(query, dateString).Scan(&result).Error - case tasks.TotalAccounts: - var dailyAccountsCount decimal.NullDecimal - - query := `SELECT COUNT(*) FROM accounts WHERE DATE(transacted_at) = ?` - - err = g.db.GormDB().Raw(query, dateString).Scan(&dailyAccountsCount).Error - if err != nil { - return err - } - - tsdResult, err := g.previousDayTsdResultByTask(task, date, nil, nil) - if err != nil { - return err - } - - result = tsdResult.Decimal.Add(dailyAccountsCount.Decimal) - case tasks.TransactionsPerDay: - query := `SELECT COUNT(*) FROM transactions WHERE DATE(transacted_at) = ?` - err = g.db.GormDB().Raw(query, dateString).Scan(&result).Error - case tasks.TotalTransactions: - var dailyTxCount decimal.NullDecimal - - // get current days txs, get previous entry for the time series data, add them together. - - query := `SELECT COUNT(*) FROM transactions WHERE DATE(transacted_at) = ?` - - err = g.db.GormDB().Raw(query, dateString).Scan(&dailyTxCount).Error - if err != nil { - return err - } - - tsdResult, err := g.previousDayTsdResultByTask(task, date, nil, nil) - if err != nil { - return err - } - - result = tsdResult.Decimal.Add(dailyTxCount.Decimal) - case tasks.ContractDeploymentsPerDay: - query := `SELECT COUNT(*) FROM transactions WHERE DATE(transacted_at) = ? AND contract_address != ?` - err = g.db.GormDB().Raw(query, dateString, ZeroAddress.Hex()).Scan(&result).Error - case tasks.TotalContractDeployments: - var dailyContractCount decimal.NullDecimal - - // get current days txs, get previous entry for the time series data, add them together. - query := `SELECT COUNT(*) FROM transactions WHERE DATE(transacted_at) = ? AND contract_address != ?` - - err = g.db.GormDB().Raw(query, dateString, ZeroAddress.Hex()).Scan(&dailyContractCount).Error - if err != nil { - return err - } - - tsdResult, err := g.previousDayTsdResultByTask(task, date, nil, nil) - if err != nil { - return err - } - - result = tsdResult.Decimal.Add(dailyContractCount.Decimal) - default: - return errors.New("task not supported") - } - - if err != nil { - return err - } - - slog.Info("Query successful", "task", task, "date", dateString, "result", result.String()) - - insertStmt := ` - INSERT INTO time_series_data(task, value, date) - VALUES (?, ?, ?)` - - err = g.db.GormDB().Exec(insertStmt, task, result, dateString).Error - if err != nil { - slog.Info("Insert failed", "task", task, "date", dateString, "error", err.Error()) - return err - } - - return nil -} - -// previousDayTsdResultByTask returns the previous day's time series data, based on -// task and time passed in. -func (g *Generator) previousDayTsdResultByTask( - task string, - date time.Time, - feeTokenAddress *string, - tier *uint16, -) (decimal.NullDecimal, error) { - var tsdResult decimal.NullDecimal - - var tsdQuery string = `SELECT value FROM time_series_data WHERE task = ? AND date = ?` - - var q *gorm.DB = g.db.GormDB(). - Raw(tsdQuery, task, date.AddDate(0, 0, -1).Format("2006-01-02")) - - if feeTokenAddress != nil { - tsdQuery = `SELECT value FROM time_series_data WHERE task = ? AND date = ? AND fee_token_address = ?` - q = g.db.GormDB(). - Raw(tsdQuery, task, date.AddDate(0, 0, -1).Format("2006-01-02"), *feeTokenAddress) - } - - if tier != nil { - tsdQuery = `SELECT value FROM time_series_data WHERE task = ? AND date = ? AND tier = ?` - q = g.db.GormDB(). - Raw(tsdQuery, task, date.AddDate(0, 0, -1).Format("2006-01-02"), *tier) - } - - err := q. - Scan(&tsdResult).Error - if err != nil { - return tsdResult, err - } - - if !tsdResult.Valid { - return decimal.NullDecimal{ - Valid: true, - Decimal: decimal.Zero, - }, nil - } - - return tsdResult, nil -} - -// eventCount is a helper method to query the database for the count of a specific event -// based on the date. -func (g *Generator) eventCount(task string, date time.Time, event string, result interface{}) error { - query := "SELECT COUNT(*) FROM events WHERE event = ? AND DATE(transacted_at) = ?" - - return g.db.GormDB(). - Raw(query, event, date.Format("2006-01-02")). - Scan(result).Error -} diff --git a/packages/eventindexer/indexer/config.go b/packages/eventindexer/indexer/config.go index c5be80d17ae..122c45c59de 100644 --- a/packages/eventindexer/indexer/config.go +++ b/packages/eventindexer/indexer/config.go @@ -1,21 +1,15 @@ package indexer import ( - "database/sql" - "github.com/ethereum/go-ethereum/common" - "github.com/taikoxyz/taiko-mono/packages/eventindexer/cmd/flags" - "github.com/taikoxyz/taiko-mono/packages/eventindexer/pkg/db" "github.com/urfave/cli/v2" "gorm.io/driver/mysql" "gorm.io/gorm" "gorm.io/gorm/logger" -) -type DB interface { - DB() (*sql.DB, error) - GormDB() *gorm.DB -} + "github.com/taikoxyz/taiko-mono/packages/eventindexer/cmd/flags" + "github.com/taikoxyz/taiko-mono/packages/eventindexer/pkg/db" +) type Config struct { // db configs @@ -31,13 +25,14 @@ type Config struct { ETHClientTimeout uint64 L1TaikoAddress common.Address BridgeAddress common.Address - AssignmentHookAddress common.Address BlockBatchSize uint64 SubscriptionBackoff uint64 SyncMode SyncMode IndexNFTs bool + IndexERC20s bool Layer string - OpenDBFunc func() (DB, error) + OntakeForkHeight uint64 + OpenDBFunc func() (db.DB, error) } // NewConfigFromCliContext creates a new config instance from command line flags. @@ -54,14 +49,15 @@ func NewConfigFromCliContext(c *cli.Context) (*Config, error) { ETHClientTimeout: c.Uint64(flags.ETHClientTimeout.Name), L1TaikoAddress: common.HexToAddress(c.String(flags.L1TaikoAddress.Name)), BridgeAddress: common.HexToAddress(c.String(flags.BridgeAddress.Name)), - AssignmentHookAddress: common.HexToAddress(c.String(flags.AssignmentHookAddress.Name)), BlockBatchSize: c.Uint64(flags.BlockBatchSize.Name), SubscriptionBackoff: c.Uint64(flags.SubscriptionBackoff.Name), RPCUrl: c.String(flags.IndexerRPCUrl.Name), SyncMode: SyncMode(c.String(flags.SyncMode.Name)), IndexNFTs: c.Bool(flags.IndexNFTs.Name), + IndexERC20s: c.Bool(flags.IndexERC20s.Name), Layer: c.String(flags.Layer.Name), - OpenDBFunc: func() (DB, error) { + OntakeForkHeight: c.Uint64(flags.OntakeForkHeight.Name), + OpenDBFunc: func() (db.DB, error) { return db.OpenDBConnection(db.DBConnectionOpts{ Name: c.String(flags.DatabaseUsername.Name), Password: c.String(flags.DatabasePassword.Name), @@ -70,7 +66,7 @@ func NewConfigFromCliContext(c *cli.Context) (*Config, error) { MaxIdleConns: c.Uint64(flags.DatabaseMaxIdleConns.Name), MaxOpenConns: c.Uint64(flags.DatabaseMaxOpenConns.Name), MaxConnLifetime: c.Uint64(flags.DatabaseConnMaxLifetime.Name), - OpenFunc: func(dsn string) (*db.DB, error) { + OpenFunc: func(dsn string) (db.DB, error) { gormDB, err := gorm.Open(mysql.Open(dsn), &gorm.Config{ Logger: logger.Default.LogMode(logger.Silent), }) diff --git a/packages/eventindexer/indexer/config_test.go b/packages/eventindexer/indexer/config_test.go index a8e6ade2e30..7f7e41dc90d 100644 --- a/packages/eventindexer/indexer/config_test.go +++ b/packages/eventindexer/indexer/config_test.go @@ -13,7 +13,6 @@ var ( metricsHttpPort = "1001" l1TaikoAddress = "0x63FaC9201494f0bd17B9892B9fae4d52fe3BD377" bridgeAddress = "0x73FaC9201494f0bd17B9892B9fae4d52fe3BD377" - assignmentHookAddress = "0x83FaC9201494f0bd17B9892B9fae4d52fe3BD377" databaseMaxIdleConns = "10" databaseMaxOpenConns = "10" databaseMaxConnLifetime = "30" @@ -51,7 +50,6 @@ func TestNewConfigFromCliContext(t *testing.T) { assert.Equal(t, uint64(1001), c.MetricsHTTPPort) assert.Equal(t, common.HexToAddress(l1TaikoAddress), c.L1TaikoAddress) assert.Equal(t, common.HexToAddress(bridgeAddress), c.BridgeAddress) - assert.Equal(t, common.HexToAddress(assignmentHookAddress), c.AssignmentHookAddress) assert.Equal(t, uint64(10), c.DatabaseMaxIdleConns) assert.Equal(t, uint64(10), c.DatabaseMaxOpenConns) assert.Equal(t, uint64(30), c.DatabaseMaxConnLifetime) @@ -77,7 +75,6 @@ func TestNewConfigFromCliContext(t *testing.T) { "--" + flags.DatabaseName.Name, "dbname", "--" + flags.L1TaikoAddress.Name, l1TaikoAddress, "--" + flags.BridgeAddress.Name, bridgeAddress, - "--" + flags.AssignmentHookAddress.Name, assignmentHookAddress, "--" + flags.MetricsHTTPPort.Name, metricsHttpPort, "--" + flags.DatabaseMaxIdleConns.Name, databaseMaxIdleConns, "--" + flags.DatabaseMaxOpenConns.Name, databaseMaxOpenConns, diff --git a/packages/eventindexer/indexer/filter.go b/packages/eventindexer/indexer/filter.go index 7f57ba342ad..6d457aed17a 100644 --- a/packages/eventindexer/indexer/filter.go +++ b/packages/eventindexer/indexer/filter.go @@ -101,16 +101,104 @@ func filterFunc( }) } - if i.assignmentHook != nil { + wg.Go(func() error { + if err := i.indexRawBlockData(ctx, chainID, filterOpts.Start, *filterOpts.End); err != nil { + return errors.Wrap(err, "i.indexRawBlockData") + } + + return nil + }) + + err := wg.Wait() + + if err != nil { + if errors.Is(err, context.Canceled) { + slog.Error("filter context cancelled") + return err + } + + return err + } + + return nil +} + +func filterFuncOntake( + ctx context.Context, + chainID *big.Int, + i *Indexer, + filterOpts *bind.FilterOpts, +) error { + wg, ctx := errgroup.WithContext(ctx) + + if i.taikol1 != nil { + wg.Go(func() error { + transitionProvedEvents, err := i.taikol1.FilterTransitionProvedV2(filterOpts, nil) + if err != nil { + return errors.Wrap(err, "i.taikol1.FilterTransitionProved") + } + + err = i.saveTransitionProvedEventsV2(ctx, chainID, transitionProvedEvents) + if err != nil { + return errors.Wrap(err, "i.saveTransitionProvedEvents") + } + + return nil + }) + wg.Go(func() error { - blocksAssigned, err := i.assignmentHook.FilterBlockAssigned(filterOpts, nil) + transitionContestedEvents, err := i.taikol1.FilterTransitionContestedV2(filterOpts, nil) if err != nil { - return errors.Wrap(err, "i.assignmentHook.FilterBlockAssigned") + return errors.Wrap(err, "i.taikol1.FilterTransitionContested") } - err = i.saveBlockAssignedEvents(ctx, chainID, blocksAssigned) + err = i.saveTransitionContestedEventsV2(ctx, chainID, transitionContestedEvents) if err != nil { - return errors.Wrap(err, "i.saveBlockAssignedEvents") + return errors.Wrap(err, "i.saveTransitionContestedEvents") + } + + return nil + }) + + wg.Go(func() error { + blockProposedEvents, err := i.taikol1.FilterBlockProposedV2(filterOpts, nil) + if err != nil { + return errors.Wrap(err, "i.taikol1.FilterBlockProposed") + } + + err = i.saveBlockProposedEventsV2(ctx, chainID, blockProposedEvents) + if err != nil { + return errors.Wrap(err, "i.saveBlockProposedEvents") + } + + return nil + }) + + wg.Go(func() error { + blockVerifiedEvents, err := i.taikol1.FilterBlockVerifiedV2(filterOpts, nil, nil) + if err != nil { + return errors.Wrap(err, "i.taikol1.FilterBlockVerified") + } + + err = i.saveBlockVerifiedEventsV2(ctx, chainID, blockVerifiedEvents) + if err != nil { + return errors.Wrap(err, "i.saveBlockVerifiedEvents") + } + + return nil + }) + } + + if i.bridge != nil { + wg.Go(func() error { + messagesSent, err := i.bridge.FilterMessageSent(filterOpts, nil) + if err != nil { + return errors.Wrap(err, "i.bridge.FilterMessageSent") + } + + err = i.saveMessageSentEvents(ctx, chainID, messagesSent) + if err != nil { + return errors.Wrap(err, "i.saveMessageSentEvents") } return nil @@ -141,7 +229,6 @@ func filterFunc( func (i *Indexer) filter( ctx context.Context, - filter FilterFunc, ) error { endBlockID, err := i.ethClient.BlockNumber(ctx) if err != nil { @@ -154,14 +241,35 @@ func (i *Indexer) filter( "batchSize", i.blockBatchSize, ) + if i.latestIndexedBlockNumber >= i.ontakeForkHeight { + i.isPostOntakeForkHeightReached = true + } + for j := i.latestIndexedBlockNumber + 1; j <= endBlockID; j += i.blockBatchSize { - end := i.latestIndexedBlockNumber + i.blockBatchSize + end := j + i.blockBatchSize - 1 + // if the end of the batch is greater than the latest block number, set end // to the latest block number if end > endBlockID { end = endBlockID } + if !i.isPostOntakeForkHeightReached && i.taikol1 != nil && i.ontakeForkHeight > i.latestIndexedBlockNumber && i.ontakeForkHeight < end { + slog.Info("ontake fork height reached", "height", i.ontakeForkHeight) + + i.isPostOntakeForkHeightReached = true + + end = i.ontakeForkHeight - 1 + + slog.Info("setting end block ID to ontakeForkHeight - 1", + "latestIndexedBlockNumber", + i.latestIndexedBlockNumber, + "ontakeForkHeight", i.ontakeForkHeight, + "endBlockID", end, + "isPostOntakeForkHeightReached", i.isPostOntakeForkHeightReached, + ) + } + slog.Info("block batch", "start", j, "end", end) filterOpts := &bind.FilterOpts{ @@ -170,6 +278,14 @@ func (i *Indexer) filter( Context: ctx, } + var filter FilterFunc + + if i.isPostOntakeForkHeightReached { + filter = filterFuncOntake + } else { + filter = filterFunc + } + if err := filter(ctx, new(big.Int).SetUint64(i.srcChainID), i, filterOpts); err != nil { return errors.Wrap(err, "filter") } diff --git a/packages/eventindexer/indexer/index_erc20_transfers.go b/packages/eventindexer/indexer/index_erc20_transfers.go new file mode 100644 index 00000000000..efe091b883c --- /dev/null +++ b/packages/eventindexer/indexer/index_erc20_transfers.go @@ -0,0 +1,263 @@ +package indexer + +import ( + "context" + "fmt" + "math/big" + "strings" + + "log/slog" + + "github.com/ethereum/go-ethereum" + "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/ethclient" + "github.com/pkg/errors" + "github.com/taikoxyz/taiko-mono/packages/eventindexer" + "golang.org/x/sync/errgroup" +) + +// nolint: lll +const erc20ABI = `[{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"}]` + +// nolint: lll +const transferEventABI = `[{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Transfer","type":"event"}]` + +// indexERc20Transfers indexes from a given starting block to a given end block and parses all event logs +// to find ERC20 transfer events and update balances +func (i *Indexer) indexERC20Transfers( + ctx context.Context, + chainID *big.Int, + logs []types.Log, +) error { + wg, ctx := errgroup.WithContext(ctx) + + for _, vLog := range logs { + l := vLog + + wg.Go(func() error { + if !i.isERC20Transfer(ctx, l) { + return nil + } + + if err := i.saveERC20Transfer(ctx, chainID, l); err != nil { + return err + } + + return nil + }) + } + + if err := wg.Wait(); err != nil { + return err + } + + return nil +} + +// isERC20Transfer determines whether a given log is a valid ERC20 transfer event +func (i *Indexer) isERC20Transfer(_ context.Context, vLog types.Log) bool { + // malformed event + if len(vLog.Topics) == 0 { + return false + } + + // the first topic is ALWAYS the hash of the event signature. + // this is how people are expected to look up which event is which. + if vLog.Topics[0].Hex() != logTransferSigHash.Hex() { + return false + } + + // erc20 transfer length will be 3, nft will be 4, only way to + // differentiate them + if len(vLog.Topics) != 3 { + return false + } + + return true +} + +// saveERC20Transfer updates the user's balances on the from and to of a ERC20 transfer event +func (i *Indexer) saveERC20Transfer(ctx context.Context, chainID *big.Int, vLog types.Log) error { + from := fmt.Sprintf("0x%v", common.Bytes2Hex(vLog.Topics[1].Bytes()[12:])) + + to := fmt.Sprintf("0x%v", common.Bytes2Hex(vLog.Topics[2].Bytes()[12:])) + + event := struct { + From common.Address + To common.Address + Value *big.Int + }{} + + // Parse the Transfer event ABI + parsedABI, err := abi.JSON(strings.NewReader(transferEventABI)) + if err != nil { + return errors.Wrap(err, "abi.JSON(strings.NewReader") + } + + err = parsedABI.UnpackIntoInterface(&event, "Transfer", vLog.Data) + if err != nil { + return errors.Wrap(err, "parsedABI.UnpackIntoInterface") + } + + amount := event.Value.String() + + slog.Info( + "erc20 transfer found", + "from", from, + "to", to, + "amount", event.Value.String(), + "contractAddress", vLog.Address.Hex(), + ) + + var pk int = 0 + + i.contractToMetadataMutex.Lock() + + md, ok := i.contractToMetadata[vLog.Address] + + i.contractToMetadataMutex.Unlock() + + if !ok { + md, err = i.erc20BalanceRepo.FindMetadata(ctx, chainID.Int64(), vLog.Address.Hex()) + if err != nil { + return errors.Wrap(err, "i.erc20BalanceRepo") + } + } + + if md != nil { + pk = md.ID + + i.contractToMetadataMutex.Lock() + + i.contractToMetadata[vLog.Address] = md + + i.contractToMetadataMutex.Unlock() + } + + if pk == 0 { + symbol, err := getERC20Symbol(ctx, i.ethClient, vLog.Address.Hex()) + if err != nil { + // some erc20 dont have symbol method properly, + // returns `invalid opcode`. + if strings.Contains(err.Error(), "invalid opcode") { + symbol = "ERC20" + } else { + return errors.Wrap(err, "getERC20Symbol") + } + } + + decimals, err := getERC20Decimals(ctx, i.ethClient, vLog.Address.Hex()) + if err != nil { + return errors.Wrap(err, "getERC20Decimals") + } + + pk, err = i.erc20BalanceRepo.CreateMetadata(ctx, chainID.Int64(), vLog.Address.Hex(), symbol, decimals) + if err != nil { + return errors.Wrap(err, "i.erc20BalanceRepo.CreateMetadata") + } + } + + // increment To address's balance + // decrement From address's balance + increaseOpts := eventindexer.UpdateERC20BalanceOpts{ + ERC20MetadataID: int64(pk), + ChainID: chainID.Int64(), + Address: to, + ContractAddress: vLog.Address.Hex(), + Amount: amount, + } + + decreaseOpts := eventindexer.UpdateERC20BalanceOpts{} + + // ignore zero address since that is usually the "mint" + if from != ZeroAddress.Hex() { + decreaseOpts = eventindexer.UpdateERC20BalanceOpts{ + ERC20MetadataID: int64(pk), + ChainID: chainID.Int64(), + Address: from, + ContractAddress: vLog.Address.Hex(), + Amount: amount, + } + } + + _, _, err = i.erc20BalanceRepo.IncreaseAndDecreaseBalancesInTx(ctx, increaseOpts, decreaseOpts) + if err != nil { + return errors.Wrap(err, "i.erc20BalanceRepo.IncreaseAndDecreaseBalancesInTx") + } + + return nil +} + +func getERC20Symbol(ctx context.Context, client *ethclient.Client, contractAddress string) (string, error) { + // Parse the contract address + address := common.HexToAddress(contractAddress) + + // Parse the ERC20 contract ABI + parsedABI, err := abi.JSON(strings.NewReader(erc20ABI)) + if err != nil { + return "", errors.Wrap(err, "abi.JSON") + } + + // Prepare the call message + callData, err := parsedABI.Pack("symbol") + if err != nil { + return "", errors.Wrap(err, "parsedABI.Pack") + } + + msg := ethereum.CallMsg{ + To: &address, + Data: callData, + } + + result, err := client.CallContract(ctx, msg, nil) + if err != nil { + return "", errors.Wrap(err, "client.CallContract") + } + + var symbol string + + err = parsedABI.UnpackIntoInterface(&symbol, "symbol", result) + if err != nil { + return "", errors.Wrap(err, "parsedABI.UnpackIntoInterface") + } + + return symbol, nil +} + +func getERC20Decimals(ctx context.Context, client *ethclient.Client, contractAddress string) (uint8, error) { + // Parse the contract address + address := common.HexToAddress(contractAddress) + + // Parse the ERC20 contract ABI + parsedABI, err := abi.JSON(strings.NewReader(erc20ABI)) + if err != nil { + return 0, err + } + + // Prepare the call message + callData, err := parsedABI.Pack("decimals") + if err != nil { + return 0, err + } + + msg := ethereum.CallMsg{ + To: &address, + Data: callData, + } + + result, err := client.CallContract(ctx, msg, nil) + if err != nil { + return 0, err + } + + var decimals uint8 + + err = parsedABI.UnpackIntoInterface(&decimals, "decimals", result) + if err != nil { + return 0, err + } + + return decimals, nil +} diff --git a/packages/eventindexer/indexer/index_nft_transfers.go b/packages/eventindexer/indexer/index_nft_transfers.go index f74295f7d7d..721323a2218 100644 --- a/packages/eventindexer/indexer/index_nft_transfers.go +++ b/packages/eventindexer/indexer/index_nft_transfers.go @@ -15,6 +15,7 @@ import ( "github.com/pkg/errors" "github.com/taikoxyz/taiko-mono/packages/eventindexer" "github.com/taikoxyz/taiko-mono/packages/eventindexer/contracts/erc1155" + "golang.org/x/sync/errgroup" ) var ( @@ -33,21 +34,33 @@ func (i *Indexer) indexNFTTransfers( chainID *big.Int, logs []types.Log, ) error { + nftWg, ctx := errgroup.WithContext(ctx) + for _, vLog := range logs { - if !i.isERC721Transfer(ctx, vLog) && !i.isERC1155Transfer(ctx, vLog) { - continue - } + l := vLog - if err := i.saveNFTTransfer(ctx, chainID, vLog); err != nil { - return err - } + nftWg.Go(func() error { + if !i.isERC721Transfer(ctx, l) && !i.isERC1155Transfer(ctx, l) { + return nil + } + + if err := i.saveNFTTransfer(ctx, chainID, l); err != nil { + return errors.Wrap(err, "i.saveNFTTransfer") + } + + return nil + }) + } + + if err := nftWg.Wait(); err != nil { + return err } return nil } // isERC1155Transfer determines whether a given log is a valid ERC1155 transfer event -func (i *Indexer) isERC1155Transfer(ctx context.Context, vLog types.Log) bool { +func (i *Indexer) isERC1155Transfer(_ context.Context, vLog types.Log) bool { // malformed event if len(vLog.Topics) == 0 { return false @@ -64,7 +77,7 @@ func (i *Indexer) isERC1155Transfer(ctx context.Context, vLog types.Log) bool { } // isERC721Transfer determines whether a given log is a valid ERC721 transfer event -func (i *Indexer) isERC721Transfer(ctx context.Context, vLog types.Log) bool { +func (i *Indexer) isERC721Transfer(_ context.Context, vLog types.Log) bool { // malformed event if len(vLog.Topics) == 0 { return false @@ -102,9 +115,7 @@ func (i *Indexer) saveNFTTransfer(ctx context.Context, chainID *big.Int, vLog ty // saveERC721Transfer updates the user's balances on the from and to of a ERC721 transfer event func (i *Indexer) saveERC721Transfer(ctx context.Context, chainID *big.Int, vLog types.Log) error { from := fmt.Sprintf("0x%v", common.Bytes2Hex(vLog.Topics[1].Bytes()[12:])) - to := fmt.Sprintf("0x%v", common.Bytes2Hex(vLog.Topics[2].Bytes()[12:])) - tokenID := vLog.Topics[3].Big().Int64() slog.Info( @@ -151,7 +162,6 @@ func (i *Indexer) saveERC721Transfer(ctx context.Context, chainID *big.Int, vLog // the database and updates the user's balances func (i *Indexer) saveERC1155Transfer(ctx context.Context, chainID *big.Int, vLog types.Log) error { from := fmt.Sprintf("0x%v", common.Bytes2Hex(vLog.Topics[2].Bytes()[12:])) - to := fmt.Sprintf("0x%v", common.Bytes2Hex(vLog.Topics[3].Bytes()[12:])) slog.Info("erc1155 found") @@ -206,8 +216,6 @@ func (i *Indexer) saveERC1155Transfer(ctx context.Context, chainID *big.Int, vLo return err } } else if vLog.Topics[0].Hex() == transferBatchSignatureHash.Hex() { - slog.Info("erc1155 transfer batch") - type TransferBatchEvent struct { Operator common.Address From common.Address diff --git a/packages/eventindexer/indexer/index_raw_block_data.go b/packages/eventindexer/indexer/index_raw_block_data.go index 4438884f071..f37c0defbf7 100644 --- a/packages/eventindexer/indexer/index_raw_block_data.go +++ b/packages/eventindexer/indexer/index_raw_block_data.go @@ -24,7 +24,7 @@ func (i *Indexer) indexRawBlockData( // only index block/transaction data on L2 if i.layer == Layer2 { - for j := start; j < end; j++ { + for j := start; j <= end; j++ { id := j wg.Go(func() error { @@ -38,32 +38,45 @@ func (i *Indexer) indexRawBlockData( txs := block.Transactions() + txWg, ctx := errgroup.WithContext(ctx) + for _, tx := range txs { - slog.Info("transaction found", "hash", tx.Hash()) - receipt, err := i.ethClient.TransactionReceipt(ctx, tx.Hash()) - - if err != nil { - return err - } - - sender, err := i.ethClient.TransactionSender(ctx, tx, block.Hash(), receipt.TransactionIndex) - if err != nil { - return err - } - - if err := i.accountRepo.Save(ctx, sender, time.Unix(int64(block.Time()), 0)); err != nil { - return err - } - - if err := i.txRepo.Save(ctx, - tx, - sender, - block.Number(), - time.Unix(int64(block.Time()), 0), - receipt.ContractAddress, - ); err != nil { - return err - } + t := tx + + txWg.Go(func() error { + slog.Info("transaction found", "hash", t.Hash()) + + receipt, err := i.ethClient.TransactionReceipt(ctx, t.Hash()) + + if err != nil { + return errors.Wrap(err, "i.ethClient.TransactionReceipt") + } + + sender, err := i.ethClient.TransactionSender(ctx, t, block.Hash(), receipt.TransactionIndex) + if err != nil { + return errors.Wrap(err, "i.ethClient.TransactionSender") + } + + if err := i.accountRepo.Save(ctx, sender, time.Unix(int64(block.Time()), 0)); err != nil { + return errors.Wrap(err, "i.accountRepo.Save") + } + + if err := i.txRepo.Save(ctx, + t, + sender, + block.Number(), + time.Unix(int64(block.Time()), 0), + receipt.ContractAddress, + ); err != nil { + return errors.Wrap(err, "i.txRepo.Save") + } + + return nil + }) + } + + if err := txWg.Wait(); err != nil { + return err } return nil @@ -93,6 +106,16 @@ func (i *Indexer) indexRawBlockData( }) } + if i.indexERC20s { + wg.Go(func() error { + if err := i.indexERC20Transfers(ctx, chainID, logs); err != nil { + return errors.Wrap(err, "svc.indexERC20Transfers") + } + + return nil + }) + } + if err := wg.Wait(); err != nil { if errors.Is(err, context.Canceled) { slog.Error("index raw block data context cancelled") diff --git a/packages/eventindexer/indexer/indexer.go b/packages/eventindexer/indexer/indexer.go index 56d8a0cdb36..fe4a9562e26 100644 --- a/packages/eventindexer/indexer/indexer.go +++ b/packages/eventindexer/indexer/indexer.go @@ -9,12 +9,13 @@ import ( "github.com/cyberhorsey/errors" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/ethclient" + "github.com/urfave/cli/v2" + "github.com/taikoxyz/taiko-mono/packages/eventindexer" - "github.com/taikoxyz/taiko-mono/packages/eventindexer/contracts/assignmenthook" "github.com/taikoxyz/taiko-mono/packages/eventindexer/contracts/bridge" "github.com/taikoxyz/taiko-mono/packages/eventindexer/contracts/taikol1" + "github.com/taikoxyz/taiko-mono/packages/eventindexer/pkg/db" "github.com/taikoxyz/taiko-mono/packages/eventindexer/pkg/repo" - "github.com/urfave/cli/v2" ) var ( @@ -35,10 +36,13 @@ var ( ) type Indexer struct { - accountRepo eventindexer.AccountRepository - eventRepo eventindexer.EventRepository - nftBalanceRepo eventindexer.NFTBalanceRepository - txRepo eventindexer.TransactionRepository + db db.DB + + accountRepo eventindexer.AccountRepository + eventRepo eventindexer.EventRepository + nftBalanceRepo eventindexer.NFTBalanceRepository + erc20BalanceRepo eventindexer.ERC20BalanceRepository + txRepo eventindexer.TransactionRepository ethClient *ethclient.Client srcChainID uint64 @@ -48,12 +52,12 @@ type Indexer struct { blockBatchSize uint64 subscriptionBackoff time.Duration - taikol1 *taikol1.TaikoL1 - bridge *bridge.Bridge - assignmentHook *assignmenthook.AssignmentHook + taikol1 *taikol1.TaikoL1 + bridge *bridge.Bridge - indexNfts bool - layer string + indexNfts bool + indexERC20s bool + layer string wg *sync.WaitGroup ctx context.Context @@ -61,6 +65,12 @@ type Indexer struct { syncMode SyncMode blockSaveMutex *sync.Mutex + + contractToMetadata map[common.Address]*eventindexer.ERC20Metadata + contractToMetadataMutex *sync.Mutex + + ontakeForkHeight uint64 + isPostOntakeForkHeightReached bool } func (i *Indexer) Start() error { @@ -90,7 +100,7 @@ func (i *Indexer) eventLoop(ctx context.Context) { slog.Info("event loop context done") return case <-t.C: - if err := i.filter(ctx, filterFunc); err != nil { + if err := i.filter(ctx); err != nil { slog.Error("error filtering", "error", err) } } @@ -132,6 +142,11 @@ func InitFromConfig(ctx context.Context, i *Indexer, cfg *Config) error { return err } + erc20BalanceRepository, err := repo.NewERC20BalanceRepository(db) + if err != nil { + return err + } + txRepository, err := repo.NewTransactionRepository(db) if err != nil { return err @@ -169,21 +184,12 @@ func InitFromConfig(ctx context.Context, i *Indexer, cfg *Config) error { } } - var assignmentHookContract *assignmenthook.AssignmentHook - - if cfg.AssignmentHookAddress.Hex() != ZeroAddress.Hex() { - slog.Info("setting assignmentHookAddress", "addr", cfg.AssignmentHookAddress.Hex()) - - assignmentHookContract, err = assignmenthook.NewAssignmentHook(cfg.AssignmentHookAddress, ethClient) - if err != nil { - return errors.Wrap(err, "contracts.NewAssignmentHook") - } - } - + i.db = db i.blockSaveMutex = &sync.Mutex{} i.accountRepo = accountRepository i.eventRepo = eventRepository i.nftBalanceRepo = nftBalanceRepository + i.erc20BalanceRepo = erc20BalanceRepository i.txRepo = txRepository i.srcChainID = chainID.Uint64() @@ -191,18 +197,26 @@ func InitFromConfig(ctx context.Context, i *Indexer, cfg *Config) error { i.ethClient = ethClient i.taikol1 = taikoL1 i.bridge = bridgeContract - i.assignmentHook = assignmentHookContract i.blockBatchSize = cfg.BlockBatchSize i.subscriptionBackoff = time.Duration(cfg.SubscriptionBackoff) * time.Second i.wg = &sync.WaitGroup{} i.syncMode = cfg.SyncMode i.indexNfts = cfg.IndexNFTs + i.indexERC20s = cfg.IndexERC20s i.layer = cfg.Layer + i.contractToMetadata = make(map[common.Address]*eventindexer.ERC20Metadata, 0) + i.contractToMetadataMutex = &sync.Mutex{} + i.ontakeForkHeight = cfg.OntakeForkHeight return nil } func (i *Indexer) Close(ctx context.Context) { i.wg.Wait() + + // Close db connection. + if err := i.db.Close(); err != nil { + slog.Error("Failed to close db connection", "err", err) + } } diff --git a/packages/eventindexer/indexer/save_block_assigned_event.go b/packages/eventindexer/indexer/save_block_assigned_event.go deleted file mode 100644 index 9303bf9ab2e..00000000000 --- a/packages/eventindexer/indexer/save_block_assigned_event.go +++ /dev/null @@ -1,82 +0,0 @@ -package indexer - -import ( - "context" - "encoding/json" - "math/big" - "time" - - "log/slog" - - "github.com/pkg/errors" - "github.com/taikoxyz/taiko-mono/packages/eventindexer" - "github.com/taikoxyz/taiko-mono/packages/eventindexer/contracts/assignmenthook" -) - -func (i *Indexer) saveBlockAssignedEvents( - ctx context.Context, - chainID *big.Int, - events *assignmenthook.AssignmentHookBlockAssignedIterator, -) error { - if !events.Next() || events.Event == nil { - slog.Info("no blockAssigned events") - return nil - } - - for { - event := events.Event - - if err := i.saveBlockAssignedEvent(ctx, chainID, event); err != nil { - eventindexer.BlockAssignedEventsProcessedError.Inc() - - return errors.Wrap(err, "i.saveBlockAssignedEvent") - } - - if !events.Next() { - return nil - } - } -} - -func (i *Indexer) saveBlockAssignedEvent( - ctx context.Context, - chainID *big.Int, - event *assignmenthook.AssignmentHookBlockAssigned, -) error { - slog.Info("blockAssigned event", "prover", event.AssignedProver.Hex()) - - marshaled, err := json.Marshal(event) - if err != nil { - return errors.Wrap(err, "json.Marshal(event)") - } - - assignedProver := event.AssignedProver.Hex() - - block, err := i.ethClient.BlockByNumber(ctx, new(big.Int).SetUint64(event.Raw.BlockNumber)) - if err != nil { - return errors.Wrap(err, "i.ethClient.BlockByNumber") - } - - feeToken := event.Assignment.FeeToken.Hex() - - _, err = i.eventRepo.Save(ctx, eventindexer.SaveEventOpts{ - Name: eventindexer.EventNameBlockAssigned, - Data: string(marshaled), - ChainID: chainID, - Event: eventindexer.EventNameBlockAssigned, - Address: "", - AssignedProver: &assignedProver, - TransactedAt: time.Unix(int64(block.Time()), 0).UTC(), - Amount: big.NewInt(0), - ProofReward: big.NewInt(0), - FeeTokenAddress: &feeToken, - EmittedBlockID: event.Raw.BlockNumber, - }) - if err != nil { - return errors.Wrap(err, "i.eventRepo.Save") - } - - eventindexer.BlockProposedEventsProcessed.Inc() - - return nil -} diff --git a/packages/eventindexer/indexer/save_block_proposed_event.go b/packages/eventindexer/indexer/save_block_proposed_event.go index 030a01ddc0d..86585a0c963 100644 --- a/packages/eventindexer/indexer/save_block_proposed_event.go +++ b/packages/eventindexer/indexer/save_block_proposed_event.go @@ -12,6 +12,7 @@ import ( "github.com/pkg/errors" "github.com/taikoxyz/taiko-mono/packages/eventindexer" "github.com/taikoxyz/taiko-mono/packages/eventindexer/contracts/taikol1" + "golang.org/x/sync/errgroup" ) func (i *Indexer) saveBlockProposedEvents( @@ -24,29 +25,41 @@ func (i *Indexer) saveBlockProposedEvents( return nil } + wg, ctx := errgroup.WithContext(ctx) + for { event := events.Event - tx, _, err := i.ethClient.TransactionByHash(ctx, event.Raw.TxHash) - if err != nil { - return errors.Wrap(err, "i.ethClient.TransactionByHash") - } + wg.Go(func() error { + tx, _, err := i.ethClient.TransactionByHash(ctx, event.Raw.TxHash) + if err != nil { + return errors.Wrap(err, "i.ethClient.TransactionByHash") + } - sender, err := i.ethClient.TransactionSender(ctx, tx, event.Raw.BlockHash, event.Raw.TxIndex) - if err != nil { - return errors.Wrap(err, "i.ethClient.TransactionSender") - } + sender, err := i.ethClient.TransactionSender(ctx, tx, event.Raw.BlockHash, event.Raw.TxIndex) + if err != nil { + return errors.Wrap(err, "i.ethClient.TransactionSender") + } - if err := i.saveBlockProposedEvent(ctx, chainID, event, sender); err != nil { - eventindexer.BlockProposedEventsProcessedError.Inc() + if err := i.saveBlockProposedEvent(ctx, chainID, event, sender); err != nil { + eventindexer.BlockProposedEventsProcessedError.Inc() - return errors.Wrap(err, "i.saveBlockProposedEvent") - } + return errors.Wrap(err, "i.saveBlockProposedEvent") + } - if !events.Next() { return nil + }) + + if !events.Next() { + break } } + + if err := wg.Wait(); err != nil { + return err + } + + return nil } func (i *Indexer) saveBlockProposedEvent( @@ -90,3 +103,89 @@ func (i *Indexer) saveBlockProposedEvent( return nil } + +func (i *Indexer) saveBlockProposedEventsV2( + ctx context.Context, + chainID *big.Int, + events *taikol1.TaikoL1BlockProposedV2Iterator, +) error { + if !events.Next() || events.Event == nil { + slog.Info("no blockProposedV2 events") + return nil + } + + wg, ctx := errgroup.WithContext(ctx) + + for { + event := events.Event + + wg.Go(func() error { + tx, _, err := i.ethClient.TransactionByHash(ctx, event.Raw.TxHash) + if err != nil { + return errors.Wrap(err, "i.ethClient.TransactionByHash") + } + + sender, err := i.ethClient.TransactionSender(ctx, tx, event.Raw.BlockHash, event.Raw.TxIndex) + if err != nil { + return errors.Wrap(err, "i.ethClient.TransactionSender") + } + + if err := i.saveBlockProposedEventV2(ctx, chainID, event, sender); err != nil { + eventindexer.BlockProposedEventsProcessedError.Inc() + + return errors.Wrap(err, "i.saveBlockProposedEvent") + } + + return nil + }) + + if !events.Next() { + break + } + } + + if err := wg.Wait(); err != nil { + return err + } + + return nil +} + +func (i *Indexer) saveBlockProposedEventV2( + ctx context.Context, + chainID *big.Int, + event *taikol1.TaikoL1BlockProposedV2, + sender common.Address, +) error { + slog.Info("blockProposed", "proposer", sender.Hex()) + + marshaled, err := json.Marshal(event) + if err != nil { + return errors.Wrap(err, "json.Marshal(event)") + } + + blockID := event.BlockId.Int64() + + block, err := i.ethClient.BlockByNumber(ctx, new(big.Int).SetUint64(event.Raw.BlockNumber)) + if err != nil { + return errors.Wrap(err, "i.ethClient.BlockByNumber") + } + + _, err = i.eventRepo.Save(ctx, eventindexer.SaveEventOpts{ + Name: eventindexer.EventNameBlockProposed, + Data: string(marshaled), + ChainID: chainID, + Event: eventindexer.EventNameBlockProposed, + Address: sender.Hex(), + BlockID: &blockID, + TransactedAt: time.Unix(int64(block.Time()), 0).UTC(), + EmittedBlockID: event.Raw.BlockNumber, + }) + if err != nil { + return errors.Wrap(err, "i.eventRepo.Save") + } + + eventindexer.BlockProposedEventsProcessed.Inc() + + return nil +} diff --git a/packages/eventindexer/indexer/save_block_verified_event.go b/packages/eventindexer/indexer/save_block_verified_event.go index 835794f4848..1edcb560c9c 100644 --- a/packages/eventindexer/indexer/save_block_verified_event.go +++ b/packages/eventindexer/indexer/save_block_verified_event.go @@ -11,6 +11,7 @@ import ( "github.com/pkg/errors" "github.com/taikoxyz/taiko-mono/packages/eventindexer" "github.com/taikoxyz/taiko-mono/packages/eventindexer/contracts/taikol1" + "golang.org/x/sync/errgroup" ) func (i *Indexer) saveBlockVerifiedEvents( @@ -23,19 +24,31 @@ func (i *Indexer) saveBlockVerifiedEvents( return nil } + wg, ctx := errgroup.WithContext(ctx) + for { event := events.Event - if err := i.saveBlockVerifiedEvent(ctx, chainID, event); err != nil { - eventindexer.BlockVerifiedEventsProcessedError.Inc() + wg.Go(func() error { + if err := i.saveBlockVerifiedEvent(ctx, chainID, event); err != nil { + eventindexer.BlockVerifiedEventsProcessedError.Inc() - return errors.Wrap(err, "i.saveBlockVerifiedEvent") - } + return errors.Wrap(err, "i.saveBlockVerifiedEvent") + } - if !events.Next() { return nil + }) + + if !events.Next() { + break } } + + if err := wg.Wait(); err != nil { + return err + } + + return nil } func (i *Indexer) saveBlockVerifiedEvent( @@ -75,3 +88,78 @@ func (i *Indexer) saveBlockVerifiedEvent( return nil } + +func (i *Indexer) saveBlockVerifiedEventsV2( + ctx context.Context, + chainID *big.Int, + events *taikol1.TaikoL1BlockVerifiedV2Iterator, +) error { + if !events.Next() || events.Event == nil { + slog.Info("no BlockVerified events") + return nil + } + + wg, ctx := errgroup.WithContext(ctx) + + for { + event := events.Event + + wg.Go(func() error { + if err := i.saveBlockVerifiedEventV2(ctx, chainID, event); err != nil { + eventindexer.BlockVerifiedEventsProcessedError.Inc() + + return errors.Wrap(err, "i.saveBlockVerifiedEvent") + } + + return nil + }) + + if !events.Next() { + break + } + } + + if err := wg.Wait(); err != nil { + return err + } + + return nil +} + +func (i *Indexer) saveBlockVerifiedEventV2( + ctx context.Context, + chainID *big.Int, + event *taikol1.TaikoL1BlockVerifiedV2, +) error { + slog.Info("new blockVerified event", "blockID", event.BlockId.Int64()) + + marshaled, err := json.Marshal(event) + if err != nil { + return errors.Wrap(err, "json.Marshal(event)") + } + + blockID := event.BlockId.Int64() + + block, err := i.ethClient.BlockByNumber(ctx, new(big.Int).SetUint64(event.Raw.BlockNumber)) + if err != nil { + return errors.Wrap(err, "i.ethClient.BlockByNumber") + } + + _, err = i.eventRepo.Save(ctx, eventindexer.SaveEventOpts{ + Name: eventindexer.EventNameBlockVerified, + Data: string(marshaled), + ChainID: chainID, + Event: eventindexer.EventNameBlockVerified, + Address: "", + BlockID: &blockID, + TransactedAt: time.Unix(int64(block.Time()), 0), + EmittedBlockID: event.Raw.BlockNumber, + }) + if err != nil { + return errors.Wrap(err, "i.eventRepo.Save") + } + + eventindexer.BlockVerifiedEventsProcessed.Inc() + + return nil +} diff --git a/packages/eventindexer/indexer/save_message_sent_event.go b/packages/eventindexer/indexer/save_message_sent_event.go index 84fc6f6260b..01d076f99f5 100644 --- a/packages/eventindexer/indexer/save_message_sent_event.go +++ b/packages/eventindexer/indexer/save_message_sent_event.go @@ -11,6 +11,7 @@ import ( "github.com/pkg/errors" "github.com/taikoxyz/taiko-mono/packages/eventindexer" "github.com/taikoxyz/taiko-mono/packages/eventindexer/contracts/bridge" + "golang.org/x/sync/errgroup" ) func (i *Indexer) saveMessageSentEvents( @@ -20,24 +21,37 @@ func (i *Indexer) saveMessageSentEvents( ) error { if !events.Next() || events.Event == nil { slog.Info("no MessageSent events") + return nil } + wg, ctx := errgroup.WithContext(ctx) + for { event := events.Event - slog.Info("new messageSent event", "owner", event.Message.From.Hex()) + wg.Go(func() error { + slog.Info("new messageSent event", "owner", event.Message.From.Hex()) - if err := i.saveMessageSentEvent(ctx, chainID, event); err != nil { - eventindexer.MessageSentEventsProcessedError.Inc() + if err := i.saveMessageSentEvent(ctx, chainID, event); err != nil { + eventindexer.MessageSentEventsProcessedError.Inc() - return errors.Wrap(err, "i.saveMessageSentEvent") - } + return errors.Wrap(err, "i.saveMessageSentEvent") + } - if !events.Next() { return nil + }) + + if !events.Next() { + break } } + + if err := wg.Wait(); err != nil { + return err + } + + return nil } func (i *Indexer) saveMessageSentEvent( diff --git a/packages/eventindexer/indexer/save_transition_contested_event.go b/packages/eventindexer/indexer/save_transition_contested_event.go index fe2499e564e..a36c72c8ffc 100644 --- a/packages/eventindexer/indexer/save_transition_contested_event.go +++ b/packages/eventindexer/indexer/save_transition_contested_event.go @@ -81,3 +81,72 @@ func (i *Indexer) saveTransitionContestedEvent( return nil } + +func (i *Indexer) saveTransitionContestedEventsV2( + ctx context.Context, + chainID *big.Int, + events *taikol1.TaikoL1TransitionContestedV2Iterator, +) error { + if !events.Next() || events.Event == nil { + slog.Info("no transitionContested events") + return nil + } + + for { + event := events.Event + + if err := i.saveTransitionContestedEventV2(ctx, chainID, event); err != nil { + eventindexer.TransitionContestedEventsProcessedError.Inc() + + return errors.Wrap(err, "i.saveBlockProvenEvent") + } + + if !events.Next() { + return nil + } + } +} + +func (i *Indexer) saveTransitionContestedEventV2( + ctx context.Context, + chainID *big.Int, + event *taikol1.TaikoL1TransitionContestedV2, +) error { + slog.Info("transitionContested event found", + "blockID", event.BlockId.Int64(), + "contestBond", event.ContestBond.String(), + "contester", event.Contester.Hex(), + "tier", event.Tier, + ) + + marshaled, err := json.Marshal(event) + if err != nil { + return errors.Wrap(err, "json.Marshal(event)") + } + + blockID := event.BlockId.Int64() + + block, err := i.ethClient.BlockByNumber(ctx, new(big.Int).SetUint64(event.Raw.BlockNumber)) + if err != nil { + return errors.Wrap(err, "i.ethClient.BlockByNumber") + } + + _, err = i.eventRepo.Save(ctx, eventindexer.SaveEventOpts{ + Name: eventindexer.EventNameTransitionContested, + Data: string(marshaled), + ChainID: chainID, + Event: eventindexer.EventNameTransitionContested, + Address: event.Contester.Hex(), + BlockID: &blockID, + TransactedAt: time.Unix(int64(block.Time()), 0), + Tier: &event.Tier, + EmittedBlockID: event.Raw.BlockNumber, + }) + if err != nil { + return errors.Wrap(err, "i.eventRepo.Save") + } + + eventindexer.TransitionContestedEventsProcessed.Inc() + + return nil +} diff --git a/packages/eventindexer/indexer/save_transition_proved_event.go b/packages/eventindexer/indexer/save_transition_proved_event.go index 212e67046d3..54f26caaa35 100644 --- a/packages/eventindexer/indexer/save_transition_proved_event.go +++ b/packages/eventindexer/indexer/save_transition_proved_event.go @@ -11,6 +11,7 @@ import ( "github.com/pkg/errors" "github.com/taikoxyz/taiko-mono/packages/eventindexer" "github.com/taikoxyz/taiko-mono/packages/eventindexer/contracts/taikol1" + "golang.org/x/sync/errgroup" ) func (i *Indexer) saveTransitionProvedEvents( @@ -23,19 +24,31 @@ func (i *Indexer) saveTransitionProvedEvents( return nil } + wg, ctx := errgroup.WithContext(ctx) + for { event := events.Event - if err := i.saveTransitionProvedEvent(ctx, chainID, event); err != nil { - eventindexer.TransitionProvedEventsProcessedError.Inc() + wg.Go(func() error { + if err := i.saveTransitionProvedEvent(ctx, chainID, event); err != nil { + eventindexer.TransitionProvedEventsProcessedError.Inc() - return errors.Wrap(err, "i.saveBlockProvenEvent") - } + return errors.Wrap(err, "i.saveBlockProvenEvent") + } - if !events.Next() { return nil + }) + + if !events.Next() { + break } } + + if err := wg.Wait(); err != nil { + return err + } + + return nil } func (i *Indexer) saveTransitionProvedEvent( @@ -78,3 +91,81 @@ func (i *Indexer) saveTransitionProvedEvent( return nil } + +func (i *Indexer) saveTransitionProvedEventsV2( + ctx context.Context, + chainID *big.Int, + events *taikol1.TaikoL1TransitionProvedV2Iterator, +) error { + if !events.Next() || events.Event == nil { + slog.Info("no transitionProved events") + return nil + } + + wg, ctx := errgroup.WithContext(ctx) + + for { + event := events.Event + + wg.Go(func() error { + if err := i.saveTransitionProvedEventV2(ctx, chainID, event); err != nil { + eventindexer.TransitionProvedEventsProcessedError.Inc() + + return errors.Wrap(err, "i.saveBlockProvenEvent") + } + + return nil + }) + + if !events.Next() { + break + } + } + + if err := wg.Wait(); err != nil { + return err + } + + return nil +} + +func (i *Indexer) saveTransitionProvedEventV2( + ctx context.Context, + chainID *big.Int, + event *taikol1.TaikoL1TransitionProvedV2, +) error { + slog.Info("transitionProved event found", + "blockID", event.BlockId.Int64(), + "prover", event.Prover.Hex()) + + marshaled, err := json.Marshal(event) + if err != nil { + return errors.Wrap(err, "json.Marshal(event)") + } + + blockID := event.BlockId.Int64() + + block, err := i.ethClient.BlockByNumber(ctx, new(big.Int).SetUint64(event.Raw.BlockNumber)) + if err != nil { + return errors.Wrap(err, "i.ethClient.BlockByNumber") + } + + _, err = i.eventRepo.Save(ctx, eventindexer.SaveEventOpts{ + Name: eventindexer.EventNameTransitionProved, + Data: string(marshaled), + ChainID: chainID, + Event: eventindexer.EventNameTransitionProved, + Address: event.Prover.Hex(), + BlockID: &blockID, + TransactedAt: time.Unix(int64(block.Time()), 0), + Tier: &event.Tier, + EmittedBlockID: event.Raw.BlockNumber, + }) + if err != nil { + return errors.Wrap(err, "i.eventRepo.Save") + } + + eventindexer.TransitionProvedEventsProcessed.Inc() + + return nil +} diff --git a/packages/eventindexer/indexer/set_initial_processing_block_height.go b/packages/eventindexer/indexer/set_initial_processing_block_height.go index 619fac1933e..cc8e47830a3 100644 --- a/packages/eventindexer/indexer/set_initial_processing_block_height.go +++ b/packages/eventindexer/indexer/set_initial_processing_block_height.go @@ -2,6 +2,7 @@ package indexer import ( "context" + "log/slog" "github.com/pkg/errors" "github.com/taikoxyz/taiko-mono/packages/eventindexer" @@ -25,7 +26,7 @@ func (i *Indexer) setInitialIndexingBlockByMode( switch mode { case Sync: // get most recently processed block height from the DB - latest, err := i.eventRepo.FindLatestBlockID( + latest, err := i.eventRepo.FindLatestBlockID(ctx, i.srcChainID, ) if err != nil { @@ -41,6 +42,8 @@ func (i *Indexer) setInitialIndexingBlockByMode( return eventindexer.ErrInvalidMode } + slog.Info("startingBlock", "startingBlock", startingBlock) + i.latestIndexedBlockNumber = startingBlock return nil diff --git a/packages/eventindexer/migrations/20270906208840_create_erc20_metadata_table.sql b/packages/eventindexer/migrations/20270906208840_create_erc20_metadata_table.sql new file mode 100644 index 00000000000..a6042b2bc3d --- /dev/null +++ b/packages/eventindexer/migrations/20270906208840_create_erc20_metadata_table.sql @@ -0,0 +1,18 @@ +-- +goose Up +-- +goose StatementBegin +CREATE TABLE IF NOT EXISTS erc20_metadata ( + id int NOT NULL PRIMARY KEY AUTO_INCREMENT, + chain_id int NOT NULL, + symbol varchar(42) NOT NULL, + decimals int NOT NULL, + contract_address varchar(42) not null, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP , + updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + UNIQUE KEY (id, chain_id) +); + +-- +goose StatementEnd +-- +goose Down +-- +goose StatementBegin +DROP TABLE erc20_metadata; +-- +goose StatementEnd diff --git a/packages/eventindexer/migrations/20270906208841_create_erc20_balances_table.sql b/packages/eventindexer/migrations/20270906208841_create_erc20_balances_table.sql new file mode 100644 index 00000000000..fac836073cc --- /dev/null +++ b/packages/eventindexer/migrations/20270906208841_create_erc20_balances_table.sql @@ -0,0 +1,19 @@ +-- +goose Up +-- +goose StatementBegin +CREATE TABLE IF NOT EXISTS erc20_balances ( + id int NOT NULL PRIMARY KEY AUTO_INCREMENT, + erc20_metadata_id int NOT NULL, + chain_id int NOT NULL, + address VARCHAR(42) NOT NULL DEFAULT "", + amount VARCHAR(200) DEFAULT "0", + contract_address VARCHAR(42) NOT NULL DEFAULT "", + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP , + updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + FOREIGN KEY (erc20_metadata_id, chain_id) REFERENCES erc20_metadata(id, chain_id) +); + +-- +goose StatementEnd +-- +goose Down +-- +goose StatementBegin +DROP TABLE erc20_balances; +-- +goose StatementEnd diff --git a/packages/eventindexer/migrations/20270906208842_alter_erc20_balances_table_add_indexes.sql b/packages/eventindexer/migrations/20270906208842_alter_erc20_balances_table_add_indexes.sql new file mode 100644 index 00000000000..5489670cb15 --- /dev/null +++ b/packages/eventindexer/migrations/20270906208842_alter_erc20_balances_table_add_indexes.sql @@ -0,0 +1,10 @@ +-- +goose Up +-- +goose StatementBegin +ALTER TABLE `erc20_balances` ADD INDEX `erc20_balance_chain_id_amount_address_index` (`chain_id`, `amount`, `address`); + +-- +goose StatementEnd +-- +goose Down +-- +goose StatementBegin +ALTER TABLE erc20_balances + DROP INDEX erc20_balance_chain_id_amount_address_index +-- +goose StatementEnd diff --git a/packages/eventindexer/migrations/20270906208843_alter_erc20_metadata_table_add_indexes.sql b/packages/eventindexer/migrations/20270906208843_alter_erc20_metadata_table_add_indexes.sql new file mode 100644 index 00000000000..6071b0edb6d --- /dev/null +++ b/packages/eventindexer/migrations/20270906208843_alter_erc20_metadata_table_add_indexes.sql @@ -0,0 +1,10 @@ +-- +goose Up +-- +goose StatementBegin +ALTER TABLE `erc20_metadata` ADD INDEX `erc20_balance_chain_id_contract_address_index` (`chain_id`, `contract_address`); + +-- +goose StatementEnd +-- +goose Down +-- +goose StatementBegin +ALTER TABLE erc20_metadata + DROP INDEX erc20_balance_chain_id_contract_address_index +-- +goose StatementEnd diff --git a/packages/eventindexer/migrations/20270906208844_alter_events_table_add_block_id_event_index.sql b/packages/eventindexer/migrations/20270906208844_alter_events_table_add_block_id_event_index.sql new file mode 100644 index 00000000000..02903d315a1 --- /dev/null +++ b/packages/eventindexer/migrations/20270906208844_alter_events_table_add_block_id_event_index.sql @@ -0,0 +1,10 @@ +-- +goose Up +-- +goose StatementBegin +ALTER TABLE `events` ADD INDEX `events_block_id_event_index` (`block_id`, `event`); + +-- +goose StatementEnd +-- +goose Down +-- +goose StatementBegin +ALTER TABLE events + DROP INDEX events_block_id_event_index +-- +goose StatementEnd diff --git a/packages/eventindexer/migrations/20270906208852_alter_erc20_balances_addtl_indexes.sql b/packages/eventindexer/migrations/20270906208852_alter_erc20_balances_addtl_indexes.sql new file mode 100644 index 00000000000..b1de320be73 --- /dev/null +++ b/packages/eventindexer/migrations/20270906208852_alter_erc20_balances_addtl_indexes.sql @@ -0,0 +1,10 @@ +-- +goose Up +-- +goose StatementBegin +ALTER TABLE `erc20_balances` ADD INDEX `erc20_balances_contract_address_address_chain_id_index` (`contract_address`, `address`, `chain_id`); + +-- +goose StatementEnd +-- +goose Down +-- +goose StatementBegin +ALTER TABLE erc20_balances DROP INDEX erc20_balances_contract_address_address_chain_id_index, + DROP INDEX erc20_balances_contract_address-- +goose StatementEnd +-- +goose StatementEnd \ No newline at end of file diff --git a/packages/eventindexer/pkg/db/db.go b/packages/eventindexer/pkg/db/db.go index 3b865643fb7..0fd3e6a7500 100644 --- a/packages/eventindexer/pkg/db/db.go +++ b/packages/eventindexer/pkg/db/db.go @@ -3,33 +3,48 @@ package db import ( "database/sql" "fmt" + "github.com/cyberhorsey/errors" "time" - "github.com/cyberhorsey/errors" "gorm.io/gorm" ) -type DB struct { +var ( + ErrNoDB = errors.Validation.NewWithKeyAndDetail("ERR_NO_DB", "DB is required") +) + +type DB interface { + DB() (*sql.DB, error) + GormDB() *gorm.DB + Close() error +} + +type Database struct { gormdb *gorm.DB } -func (db *DB) DB() (*sql.DB, error) { +func (db *Database) DB() (*sql.DB, error) { return db.gormdb.DB() } -func (db *DB) GormDB() *gorm.DB { +func (db *Database) GormDB() *gorm.DB { return db.gormdb } -func New(gormdb *gorm.DB) *DB { - return &DB{ - gormdb: gormdb, +func (db *Database) Close() error { + sqlDB, err := db.DB() + if err != nil { + return err } + + return sqlDB.Close() } -var ( - ErrNoDB = errors.Validation.NewWithKeyAndDetail("ERR_NO_DB", "DB is required") -) +func New(gormdb *gorm.DB) DB { + return &Database{ + gormdb: gormdb, + } +} type DBConnectionOpts struct { Name string @@ -39,10 +54,10 @@ type DBConnectionOpts struct { MaxIdleConns uint64 MaxOpenConns uint64 MaxConnLifetime uint64 - OpenFunc func(dsn string) (*DB, error) + OpenFunc func(dsn string) (DB, error) } -func OpenDBConnection(opts DBConnectionOpts) (*DB, error) { +func OpenDBConnection(opts DBConnectionOpts) (DB, error) { dsn := "" if opts.Password == "" { dsn = fmt.Sprintf( diff --git a/packages/eventindexer/pkg/flags/config.go b/packages/eventindexer/pkg/flags/config.go index e206f701dca..3211077a161 100644 --- a/packages/eventindexer/pkg/flags/config.go +++ b/packages/eventindexer/pkg/flags/config.go @@ -6,8 +6,9 @@ import ( "github.com/ethereum-optimism/optimism/op-service/txmgr" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/crypto" - "github.com/taikoxyz/taiko-mono/packages/eventindexer/cmd/flags" "github.com/urfave/cli/v2" + + "github.com/taikoxyz/taiko-mono/packages/eventindexer/cmd/flags" ) // InitTxmgrConfigsFromCli initializes the transaction manager configs from the command line flags. diff --git a/packages/eventindexer/pkg/http/get_block_proposed_by.go b/packages/eventindexer/pkg/http/get_block_proposed_by.go new file mode 100644 index 00000000000..30a3c44c325 --- /dev/null +++ b/packages/eventindexer/pkg/http/get_block_proposed_by.go @@ -0,0 +1,36 @@ +package http + +import ( + "net/http" + "strconv" + + "github.com/cyberhorsey/webutils" + "github.com/labstack/echo/v4" +) + +// GetBlockProposedBy +// +// returns events by address and name of the event +// +// @Summary Get block proposed by +// @ID get-block-proposed-by +// @Param blockID query string true "blockID to query" +// @Accept json +// @Produce json +// @Success 200 {object} []eventindexer.Event +// @Router /blockProposedBy [get] +func (srv *Server) GetBlockProposedBy(c echo.Context) error { + blockID, err := strconv.Atoi(c.QueryParam("blockID")) + if err != nil { + return webutils.LogAndRenderErrors(c, http.StatusUnprocessableEntity, err) + } + + proposed, err := srv.eventRepo.GetBlockProposedBy(c.Request().Context(), + blockID, + ) + if err != nil { + return webutils.LogAndRenderErrors(c, http.StatusUnprocessableEntity, err) + } + + return c.JSON(http.StatusOK, proposed) +} diff --git a/packages/eventindexer/pkg/http/get_block_proven_by.go b/packages/eventindexer/pkg/http/get_block_proven_by.go new file mode 100644 index 00000000000..3b4609af5c2 --- /dev/null +++ b/packages/eventindexer/pkg/http/get_block_proven_by.go @@ -0,0 +1,48 @@ +package http + +import ( + "net/http" + "strconv" + + "github.com/cyberhorsey/webutils" + "github.com/labstack/echo/v4" +) + +// GetBlockProvenBy +// +// returns events by address and name of the event +// +// @Summary Get block proven by +// @ID get-block-proven-by +// @Param blockID query string true "blockID to query" +// @Accept json +// @Produce json +// @Success 200 {object} []eventindexer.Event +// @Router /blockProvenBy [get] +func (srv *Server) GetBlockProvenBy(c echo.Context) error { + blockID, err := strconv.Atoi(c.QueryParam("blockID")) + if err != nil { + return webutils.LogAndRenderErrors(c, http.StatusUnprocessableEntity, err) + } + + events, err := srv.eventRepo.GetBlockProvenBy( + c.Request().Context(), + blockID, + ) + if err != nil { + return webutils.LogAndRenderErrors(c, http.StatusUnprocessableEntity, err) + } + + proposed, err := srv.eventRepo.GetBlockProposedBy(c.Request().Context(), + blockID, + ) + if err != nil { + return webutils.LogAndRenderErrors(c, http.StatusUnprocessableEntity, err) + } + + for _, event := range events { + event.AssignedProver = proposed.AssignedProver + } + + return c.JSON(http.StatusOK, events) +} diff --git a/packages/eventindexer/pkg/http/get_by_address_and_event_test.go b/packages/eventindexer/pkg/http/get_by_address_and_event_test.go index 8923252bd60..22d9ce8742b 100644 --- a/packages/eventindexer/pkg/http/get_by_address_and_event_test.go +++ b/packages/eventindexer/pkg/http/get_by_address_and_event_test.go @@ -16,7 +16,7 @@ import ( ) func Test_GetByAddressAndEvent(t *testing.T) { - srv := newTestServer("") + srv := newTestServer() _, err := srv.eventRepo.Save(context.Background(), eventindexer.SaveEventOpts{ Name: "name", diff --git a/packages/eventindexer/pkg/http/get_count_by_address_and_event_test.go b/packages/eventindexer/pkg/http/get_count_by_address_and_event_test.go index 6a3d6819c62..23df67f30dc 100644 --- a/packages/eventindexer/pkg/http/get_count_by_address_and_event_test.go +++ b/packages/eventindexer/pkg/http/get_count_by_address_and_event_test.go @@ -16,7 +16,7 @@ import ( ) func Test_GetCountByAddressAndEvent(t *testing.T) { - srv := newTestServer("") + srv := newTestServer() _, err := srv.eventRepo.Save(context.Background(), eventindexer.SaveEventOpts{ Name: "name", diff --git a/packages/eventindexer/pkg/http/get_erc20_balances_by_address_and_chain_id.go b/packages/eventindexer/pkg/http/get_erc20_balances_by_address_and_chain_id.go new file mode 100644 index 00000000000..b8cd8b2a879 --- /dev/null +++ b/packages/eventindexer/pkg/http/get_erc20_balances_by_address_and_chain_id.go @@ -0,0 +1,46 @@ +package http + +import ( + "net/http" + + "github.com/cyberhorsey/webutils" + "github.com/labstack/echo/v4" + "github.com/taikoxyz/taiko-mono/packages/eventindexer" +) + +// GetERC20BalancesByAddressAndChainID +// +// returns erc20 balances by address and chain ID +// +// @Summary Get erc20 balances by address and chain ID +// @ID get-erc20-balances-by-address-and-chain-id +// @Param address query string true "address to query" +// @Param chainID query string true "chainID to query" +// @Accept json +// @Produce json +// @Success 200 {object} paginate.Page +// @Router /erc20sByAddress [get] +func (srv *Server) GetERC20BalancesByAddressAndChainID(c echo.Context) error { + page, err := srv.erc20BalanceRepo.FindByAddress( + c.Request().Context(), + c.Request(), + c.QueryParam("address"), + c.QueryParam("chainID"), + ) + if err != nil { + return webutils.LogAndRenderErrors(c, http.StatusUnprocessableEntity, err) + } + + for i := range *page.Items.(*[]eventindexer.ERC20Balance) { + v := &(*page.Items.(*[]eventindexer.ERC20Balance))[i] + + md, err := srv.erc20BalanceRepo.FindMetadata(c.Request().Context(), v.ChainID, v.ContractAddress) + if err != nil { + return webutils.LogAndRenderErrors(c, http.StatusUnprocessableEntity, err) + } + + v.Metadata = md + } + + return c.JSON(http.StatusOK, page) +} diff --git a/packages/eventindexer/pkg/http/get_unique_proposers_test.go b/packages/eventindexer/pkg/http/get_unique_proposers_test.go index bdfcfcb6dcc..fa2e867ae67 100644 --- a/packages/eventindexer/pkg/http/get_unique_proposers_test.go +++ b/packages/eventindexer/pkg/http/get_unique_proposers_test.go @@ -15,7 +15,7 @@ import ( ) func Test_GetUniqueProposers(t *testing.T) { - srv := newTestServer("") + srv := newTestServer() _, err := srv.eventRepo.Save(context.Background(), eventindexer.SaveEventOpts{ Name: "name", diff --git a/packages/eventindexer/pkg/http/get_unique_provers_test.go b/packages/eventindexer/pkg/http/get_unique_provers_test.go index a8a586fe1a2..72353cc2f86 100644 --- a/packages/eventindexer/pkg/http/get_unique_provers_test.go +++ b/packages/eventindexer/pkg/http/get_unique_provers_test.go @@ -15,7 +15,7 @@ import ( ) func Test_GetUniqueProvers(t *testing.T) { - srv := newTestServer("") + srv := newTestServer() _, err := srv.eventRepo.Save(context.Background(), eventindexer.SaveEventOpts{ Name: "name", diff --git a/packages/eventindexer/pkg/http/routes.go b/packages/eventindexer/pkg/http/routes.go index 090ef4b71e7..feb3b07a7b1 100644 --- a/packages/eventindexer/pkg/http/routes.go +++ b/packages/eventindexer/pkg/http/routes.go @@ -10,6 +10,9 @@ func (srv *Server) configureRoutes() { srv.echo.GET("/events", srv.GetByAddressAndEventName) srv.echo.GET("/assignedBlocks", srv.GetAssignedBlocksByProverAddress) srv.echo.GET("/nftsByAddress", srv.GetNFTBalancesByAddressAndChainID) + srv.echo.GET("/blockProvenBy", srv.GetBlockProvenBy) + srv.echo.GET("/blockProposedBy", srv.GetBlockProposedBy) + srv.echo.GET("/erc20ByAddress", srv.GetERC20BalancesByAddressAndChainID) galaxeAPI := srv.echo.Group("/api") diff --git a/packages/eventindexer/pkg/http/server.go b/packages/eventindexer/pkg/http/server.go index 7a49cc20a7c..707f3a8075d 100644 --- a/packages/eventindexer/pkg/http/server.go +++ b/packages/eventindexer/pkg/http/server.go @@ -23,25 +23,27 @@ import ( // @contact.email info@taiko.xyz // @license.name MIT -// @license.url https://github.com/taikoxyz/taiko-mono/blob/main/LICENSE.md +// @license.url https://github.com/taikoxyz/taiko-mono/blob/main/LICENSE // @host eventindexer.hekla.taiko.xyz // Server represents an eventindexer http server instance. type Server struct { - echo *echo.Echo - eventRepo eventindexer.EventRepository - nftBalanceRepo eventindexer.NFTBalanceRepository - chartRepo eventindexer.ChartRepository - cache *cache.Cache + echo *echo.Echo + eventRepo eventindexer.EventRepository + nftBalanceRepo eventindexer.NFTBalanceRepository + erc20BalanceRepo eventindexer.ERC20BalanceRepository + chartRepo eventindexer.ChartRepository + cache *cache.Cache } type NewServerOpts struct { - Echo *echo.Echo - EventRepo eventindexer.EventRepository - NFTBalanceRepo eventindexer.NFTBalanceRepository - ChartRepo eventindexer.ChartRepository - EthClient *ethclient.Client - CorsOrigins []string + Echo *echo.Echo + EventRepo eventindexer.EventRepository + NFTBalanceRepo eventindexer.NFTBalanceRepository + ERC20BalanceRepo eventindexer.ERC20BalanceRepository + ChartRepo eventindexer.ChartRepository + EthClient *ethclient.Client + CorsOrigins []string } func (opts NewServerOpts) Validate() error { @@ -53,10 +55,6 @@ func (opts NewServerOpts) Validate() error { return eventindexer.ErrNoEventRepository } - if opts.CorsOrigins == nil { - return eventindexer.ErrNoCORSOrigins - } - if opts.NFTBalanceRepo == nil { return eventindexer.ErrNoNFTBalanceRepository } @@ -72,11 +70,12 @@ func NewServer(opts NewServerOpts) (*Server, error) { cache := cache.New(5*time.Minute, 10*time.Minute) srv := &Server{ - echo: opts.Echo, - eventRepo: opts.EventRepo, - nftBalanceRepo: opts.NFTBalanceRepo, - chartRepo: opts.ChartRepo, - cache: cache, + echo: opts.Echo, + eventRepo: opts.EventRepo, + nftBalanceRepo: opts.NFTBalanceRepo, + erc20BalanceRepo: opts.ERC20BalanceRepo, + chartRepo: opts.ChartRepo, + cache: cache, } corsOrigins := opts.CorsOrigins diff --git a/packages/eventindexer/pkg/http/server_test.go b/packages/eventindexer/pkg/http/server_test.go index b62c9df8ffc..ea28c836bd4 100644 --- a/packages/eventindexer/pkg/http/server_test.go +++ b/packages/eventindexer/pkg/http/server_test.go @@ -16,14 +16,15 @@ import ( "github.com/taikoxyz/taiko-mono/packages/eventindexer/pkg/repo" ) -func newTestServer(url string) *Server { +func newTestServer() *Server { _ = godotenv.Load("../.test.env") srv := &Server{ - cache: cache.New(5*time.Second, 6*time.Second), - echo: echo.New(), - eventRepo: mock.NewEventRepository(), - nftBalanceRepo: mock.NewNFTBalanceRepository(), + cache: cache.New(5*time.Second, 6*time.Second), + echo: echo.New(), + eventRepo: mock.NewEventRepository(), + nftBalanceRepo: mock.NewNFTBalanceRepository(), + erc20BalanceRepo: mock.NewERC20BalanceRepository(), } srv.configureMiddleware([]string{"*"}) @@ -41,10 +42,11 @@ func Test_NewServer(t *testing.T) { { "success", NewServerOpts{ - Echo: echo.New(), - EventRepo: &repo.EventRepository{}, - CorsOrigins: make([]string, 0), - NFTBalanceRepo: &repo.NFTBalanceRepository{}, + Echo: echo.New(), + EventRepo: &repo.EventRepository{}, + CorsOrigins: make([]string, 0), + NFTBalanceRepo: &repo.NFTBalanceRepository{}, + ERC20BalanceRepo: &repo.ERC20BalanceRepository{}, }, nil, }, @@ -66,15 +68,6 @@ func Test_NewServer(t *testing.T) { }, eventindexer.ErrNoEventRepository, }, - { - "noCorsOrigins", - NewServerOpts{ - Echo: echo.New(), - EventRepo: &repo.EventRepository{}, - NFTBalanceRepo: &repo.NFTBalanceRepository{}, - }, - eventindexer.ErrNoCORSOrigins, - }, { "noHttpFramework", NewServerOpts{ @@ -93,7 +86,7 @@ func Test_NewServer(t *testing.T) { } func Test_Health(t *testing.T) { - srv := newTestServer("") + srv := newTestServer() req, _ := http.NewRequest(echo.GET, "/healthz", nil) rec := httptest.NewRecorder() @@ -106,7 +99,7 @@ func Test_Health(t *testing.T) { } func Test_Root(t *testing.T) { - srv := newTestServer("") + srv := newTestServer() req, _ := http.NewRequest(echo.GET, "/", nil) rec := httptest.NewRecorder() @@ -119,7 +112,7 @@ func Test_Root(t *testing.T) { } func Test_StartShutdown(t *testing.T) { - srv := newTestServer("") + srv := newTestServer() go func() { _ = srv.Start(":3928") diff --git a/packages/eventindexer/pkg/mock/erc20_balance_repository.go b/packages/eventindexer/pkg/mock/erc20_balance_repository.go new file mode 100644 index 00000000000..51a6e3702be --- /dev/null +++ b/packages/eventindexer/pkg/mock/erc20_balance_repository.go @@ -0,0 +1,61 @@ +package mock + +import ( + "context" + "net/http" + + "github.com/morkid/paginate" + "github.com/taikoxyz/taiko-mono/packages/eventindexer" +) + +type ERC20BalanceRepository struct { + ERC20Balances []*eventindexer.ERC20Balance +} + +func NewERC20BalanceRepository() *ERC20BalanceRepository { + return &ERC20BalanceRepository{} +} + +func (r *ERC20BalanceRepository) IncreaseAndDecreaseBalancesInTx( + ctx context.Context, + increaseOpts eventindexer.UpdateERC20BalanceOpts, + decreaseOpts eventindexer.UpdateERC20BalanceOpts, +) (increasedBalance *eventindexer.ERC20Balance, decreasedBalance *eventindexer.ERC20Balance, err error) { + return nil, nil, nil +} + +func (r *ERC20BalanceRepository) FindByAddress(ctx context.Context, + req *http.Request, + address string, + chainID string, +) (paginate.Page, error) { + var balances []*eventindexer.ERC20Balance + + for _, b := range r.ERC20Balances { + if b.Address == address { + balances = append(balances, b) + } + } + + return paginate.Page{ + Items: balances, + }, nil +} + +func (r *ERC20BalanceRepository) FindMetadata( + ctx context.Context, + chainID int64, + contractAddress string, +) (*eventindexer.ERC20Metadata, error) { + return &eventindexer.ERC20Metadata{}, nil +} + +func (r *ERC20BalanceRepository) CreateMetadata( + ctx context.Context, + chainID int64, + contractAddress string, + symbol string, + decimals uint8, +) (int, error) { + return 1, nil +} diff --git a/packages/eventindexer/pkg/mock/event_repository.go b/packages/eventindexer/pkg/mock/event_repository.go index bd0847f9065..44a83bbbb1c 100644 --- a/packages/eventindexer/pkg/mock/event_repository.go +++ b/packages/eventindexer/pkg/mock/event_repository.go @@ -147,12 +147,13 @@ func (r *EventRepository) GetAssignedBlocksByProverAddress( } // DeleteAllAfterBlockID is used when a reorg is detected -func (r *EventRepository) DeleteAllAfterBlockID(blockID uint64, srcChainID uint64) error { +func (r *EventRepository) DeleteAllAfterBlockID(ctx context.Context, blockID uint64, srcChainID uint64) error { return nil } // GetLatestBlockID get latest block id func (r *EventRepository) FindLatestBlockID( + ctx context.Context, srcChainID uint64, ) (uint64, error) { if srcChainID == MockChainID.Uint64() { @@ -161,3 +162,25 @@ func (r *EventRepository) FindLatestBlockID( return 0, errors.New("invalid") } + +func (r *EventRepository) GetBlockProvenBy(ctx context.Context, blockID int) ([]*eventindexer.Event, error) { + var events []*eventindexer.Event + + for _, e := range r.events { + if int(e.BlockID.Int64) == blockID && e.Event == eventindexer.EventNameTransitionProved { + events = append(events, e) + } + } + + return events, nil +} + +func (r *EventRepository) GetBlockProposedBy(ctx context.Context, blockID int) (*eventindexer.Event, error) { + for _, e := range r.events { + if int(e.BlockID.Int64) == blockID && e.Event == eventindexer.EventNameBlockProposed { + return e, nil + } + } + + return nil, errors.New("not found") +} diff --git a/packages/eventindexer/pkg/repo/account.go b/packages/eventindexer/pkg/repo/account.go index a8cf37a4b78..ad7bcfdd7b8 100644 --- a/packages/eventindexer/pkg/repo/account.go +++ b/packages/eventindexer/pkg/repo/account.go @@ -2,6 +2,7 @@ package repo import ( "context" + "github.com/taikoxyz/taiko-mono/packages/eventindexer/pkg/db" "strings" "time" @@ -12,16 +13,16 @@ import ( ) type AccountRepository struct { - db eventindexer.DB + db db.DB } -func NewAccountRepository(db eventindexer.DB) (*AccountRepository, error) { - if db == nil { - return nil, eventindexer.ErrNoDB +func NewAccountRepository(dbHandler db.DB) (*AccountRepository, error) { + if dbHandler == nil { + return nil, db.ErrNoDB } return &AccountRepository{ - db: db, + db: dbHandler, }, nil } @@ -33,7 +34,7 @@ func (r *AccountRepository) Save( // only insert if address doesn't exist a := &eventindexer.Account{} - if err := r.db.GormDB().Where("address = ?", address.Hex()).First(a).Error; err != nil { + if err := r.db.GormDB().WithContext(ctx).Where("address = ?", address.Hex()).First(a).Error; err != nil { if err != gorm.ErrRecordNotFound { return err } diff --git a/packages/eventindexer/pkg/repo/account_test.go b/packages/eventindexer/pkg/repo/account_test.go index 4f148562b89..c0c76f5f262 100644 --- a/packages/eventindexer/pkg/repo/account_test.go +++ b/packages/eventindexer/pkg/repo/account_test.go @@ -14,18 +14,18 @@ import ( func Test_NewAccountRepository(t *testing.T) { tests := []struct { name string - db eventindexer.DB + db db.DB wantErr error }{ { "success", - &db.DB{}, + &db.Database{}, nil, }, { "noDb", nil, - eventindexer.ErrNoDB, + db.ErrNoDB, }, } diff --git a/packages/eventindexer/pkg/repo/chart.go b/packages/eventindexer/pkg/repo/chart.go index 18b83610561..1dcb765aaa0 100644 --- a/packages/eventindexer/pkg/repo/chart.go +++ b/packages/eventindexer/pkg/repo/chart.go @@ -2,6 +2,7 @@ package repo import ( "context" + "github.com/taikoxyz/taiko-mono/packages/eventindexer/pkg/db" "github.com/taikoxyz/taiko-mono/packages/eventindexer" "golang.org/x/exp/slog" @@ -9,21 +10,21 @@ import ( ) type ChartRepository struct { - db eventindexer.DB + db db.DB } -func NewChartRepository(db eventindexer.DB) (*ChartRepository, error) { - if db == nil { - return nil, eventindexer.ErrNoDB +func NewChartRepository(dbHandler db.DB) (*ChartRepository, error) { + if dbHandler == nil { + return nil, db.ErrNoDB } return &ChartRepository{ - db: db, + db: dbHandler, }, nil } -func (r *ChartRepository) getDB() *gorm.DB { - return r.db.GormDB().Table("time_series_data") +func (r *ChartRepository) getDB(ctx context.Context) *gorm.DB { + return r.db.GormDB().WithContext(ctx).Table("time_series_data") } func (r *ChartRepository) Find( @@ -42,7 +43,7 @@ func (r *ChartRepository) Find( WHERE task = ? AND date BETWEEN ? AND ? ORDER BY date;` - tx = r.getDB().Raw(q, task, start, end) + tx = r.getDB(ctx).Raw(q, task, start, end) if feeTokenAddress != "" { q = `SELECT * FROM time_series_data @@ -50,14 +51,14 @@ func (r *ChartRepository) Find( AND fee_token_address = ? ORDER BY date;` - tx = r.getDB().Raw(q, task, start, end, feeTokenAddress) + tx = r.getDB(ctx).Raw(q, task, start, end, feeTokenAddress) } else if tier != "" { q = `SELECT * FROM time_series_data WHERE task = ? AND date BETWEEN ? AND ? AND tier = ? ORDER BY date;` - tx = r.getDB().Raw(q, task, start, end, tier) + tx = r.getDB(ctx).Raw(q, task, start, end, tier) } var tsd []*eventindexer.TimeSeriesData diff --git a/packages/eventindexer/pkg/repo/chart_test.go b/packages/eventindexer/pkg/repo/chart_test.go index 77b820f0666..e10b29ebb8e 100644 --- a/packages/eventindexer/pkg/repo/chart_test.go +++ b/packages/eventindexer/pkg/repo/chart_test.go @@ -5,25 +5,25 @@ import ( "testing" "github.com/stretchr/testify/assert" - "github.com/taikoxyz/taiko-mono/packages/eventindexer" + "github.com/taikoxyz/taiko-mono/packages/eventindexer/pkg/db" ) func Test_NewChartRepo(t *testing.T) { tests := []struct { name string - db eventindexer.DB + db db.DB wantErr error }{ { "success", - &db.DB{}, + &db.Database{}, nil, }, { "noDb", nil, - eventindexer.ErrNoDB, + db.ErrNoDB, }, } @@ -43,7 +43,7 @@ func Test_GetDB(t *testing.T) { chartRepo, err := NewChartRepository(db) assert.Equal(t, nil, err) - assert.NotNil(t, chartRepo.getDB()) + assert.NotNil(t, chartRepo.getDB(context.Background())) } func Test_Integration_FindChart(t *testing.T) { diff --git a/packages/eventindexer/pkg/repo/containers_test.go b/packages/eventindexer/pkg/repo/containers_test.go index d047a450ba2..7fd28bf6f77 100644 --- a/packages/eventindexer/pkg/repo/containers_test.go +++ b/packages/eventindexer/pkg/repo/containers_test.go @@ -6,13 +6,13 @@ import ( "testing" "github.com/pressly/goose/v3" - "github.com/taikoxyz/taiko-mono/packages/eventindexer" - "github.com/taikoxyz/taiko-mono/packages/eventindexer/pkg/db" "github.com/testcontainers/testcontainers-go" "github.com/testcontainers/testcontainers-go/wait" "gorm.io/driver/mysql" "gorm.io/gorm" "gorm.io/gorm/logger" + + "github.com/taikoxyz/taiko-mono/packages/eventindexer/pkg/db" ) var ( @@ -21,10 +21,10 @@ var ( dbPassword = "password" ) -func testMysql(t *testing.T) (eventindexer.DB, func(), error) { +func testMysql(t *testing.T) (db.DB, func(), error) { req := testcontainers.ContainerRequest{ - Image: "mysql:8.0.33", - ExposedPorts: []string{"3306/tcp", "33060/tcp"}, + Image: "mysql:latest", + ExposedPorts: []string{"3306/tcp"}, Env: map[string]string{ "MYSQL_ROOT_PASSWORD": dbPassword, "MYSQL_DATABASE": dbName, @@ -51,11 +51,10 @@ func testMysql(t *testing.T) (eventindexer.DB, func(), error) { } host, _ := mysqlC.Host(ctx) - p, _ := mysqlC.MappedPort(ctx, "3306/tcp") - port := p.Int() + port, _ := mysqlC.MappedPort(ctx, "3306/tcp") dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?tls=skip-verify&parseTime=true&multiStatements=true", - dbUsername, dbPassword, host, port, dbName) + dbUsername, dbPassword, host, port.Int(), dbName) gormDB, err := gorm.Open(mysql.Open(dsn), &gorm.Config{ Logger: logger.Default.LogMode(logger.Silent), diff --git a/packages/eventindexer/pkg/repo/erc20_balance.go b/packages/eventindexer/pkg/repo/erc20_balance.go new file mode 100644 index 00000000000..7dae67175c1 --- /dev/null +++ b/packages/eventindexer/pkg/repo/erc20_balance.go @@ -0,0 +1,234 @@ +package repo + +import ( + "context" + "github.com/taikoxyz/taiko-mono/packages/eventindexer/pkg/db" + "math/big" + "net/http" + "strings" + "time" + + "github.com/morkid/paginate" + "github.com/pkg/errors" + "github.com/taikoxyz/taiko-mono/packages/eventindexer" + "gorm.io/gorm" +) + +type ERC20BalanceRepository struct { + db db.DB +} + +func NewERC20BalanceRepository(dbHandler db.DB) (*ERC20BalanceRepository, error) { + if dbHandler == nil { + return nil, db.ErrNoDB + } + + return &ERC20BalanceRepository{ + db: dbHandler, + }, nil +} + +func (r *ERC20BalanceRepository) increaseBalanceInDB( + db *gorm.DB, + opts eventindexer.UpdateERC20BalanceOpts, +) (*eventindexer.ERC20Balance, error) { + b := &eventindexer.ERC20Balance{ + ContractAddress: opts.ContractAddress, + Address: opts.Address, + ChainID: opts.ChainID, + ERC20MetadataID: opts.ERC20MetadataID, + Amount: "0", + } + + err := db. + Where("contract_address = ?", opts.ContractAddress). + Where("address = ?", opts.Address). + Where("chain_id = ?", opts.ChainID). + First(b). + Error + if err != nil { + // allow to be not found, it may be first time this user has this token + if err != gorm.ErrRecordNotFound { + return nil, errors.Wrap(err, "r.db.gormDB.First") + } + } + + amt, _ := new(big.Int).SetString(b.Amount, 10) + + optsAmt, _ := new(big.Int).SetString(opts.Amount, 10) + + b.Amount = new(big.Int).Add(amt, optsAmt).String() + + // update the row to reflect new balance + if err := db.Save(b).Error; err != nil { + return nil, errors.Wrap(err, "r.db.Save") + } + + return b, nil +} + +func (r *ERC20BalanceRepository) decreaseBalanceInDB( + db *gorm.DB, + opts eventindexer.UpdateERC20BalanceOpts, +) (*eventindexer.ERC20Balance, error) { + b := &eventindexer.ERC20Balance{ + ContractAddress: opts.ContractAddress, + Address: opts.Address, + ChainID: opts.ChainID, + ERC20MetadataID: opts.ERC20MetadataID, + } + + err := db. + Where("contract_address = ?", opts.ContractAddress). + Where("address = ?", opts.Address). + Where("chain_id = ?", opts.ChainID). + First(b). + Error + if err != nil { + if err != gorm.ErrRecordNotFound { + return nil, errors.Wrap(err, "r.db.gormDB.First") + } else { + // cant decrease a balance if user never had this balance, indexing issue + return nil, nil + } + } + + amt, _ := new(big.Int).SetString(b.Amount, 10) + + optsAmt, _ := new(big.Int).SetString(opts.Amount, 10) + + b.Amount = new(big.Int).Sub(amt, optsAmt).String() + + // we can just delete the row, this user has no more of this token + if b.Amount == "0" { + if err := db.Delete(b).Error; err != nil { + return nil, errors.Wrap(err, "r.db.Delete") + } + } else { + // update the row instead to reflect new balance + if err := db.Save(b).Error; err != nil { + return nil, errors.Wrap(err, "r.db.Save") + } + } + + return b, nil +} + +func (r *ERC20BalanceRepository) IncreaseAndDecreaseBalancesInTx( + ctx context.Context, + increaseOpts eventindexer.UpdateERC20BalanceOpts, + decreaseOpts eventindexer.UpdateERC20BalanceOpts, +) (increasedBalance *eventindexer.ERC20Balance, decreasedBalance *eventindexer.ERC20Balance, err error) { + retries := 10 + for retries > 0 { + err = r.db.GormDB().Transaction(func(tx *gorm.DB) (err error) { + increasedBalance, err = r.increaseBalanceInDB(tx.WithContext(ctx), increaseOpts) + if err != nil { + return err + } + + if decreaseOpts.Amount != "0" && decreaseOpts.Amount != "" { + decreasedBalance, err = r.decreaseBalanceInDB(tx.WithContext(ctx), decreaseOpts) + } + + return err + }) + + if err == nil { + break + } + + if strings.Contains(err.Error(), "Deadlock") { + retries-- + + time.Sleep(100 * time.Millisecond) // backoff before retrying + + continue + } + + return nil, nil, errors.Wrap(err, "r.db.Transaction") + } + + if err != nil { + return nil, nil, err + } + + return increasedBalance, decreasedBalance, nil +} + +func (r *ERC20BalanceRepository) FindByAddress(ctx context.Context, + req *http.Request, + address string, + chainID string, +) (paginate.Page, error) { + pg := paginate.New(&paginate.Config{ + DefaultSize: 100, + }) + + q := r.db.GormDB(). + Raw("SELECT * FROM erc20_balances WHERE address = ? AND chain_id = ? AND amount > 0", address, chainID) + + reqCtx := pg.With(q) + + page := reqCtx.Request(req).Response(&[]eventindexer.ERC20Balance{}) + + return page, nil +} + +func (r *ERC20BalanceRepository) FindMetadata( + ctx context.Context, + chainID int64, + contractAddress string, +) (*eventindexer.ERC20Metadata, error) { + md := eventindexer.ERC20Metadata{} + + result := r.db.GormDB().WithContext(ctx).Raw( + "SELECT * FROM erc20_metadata WHERE contract_address = ? AND chain_id = ?", + contractAddress, chainID, + ).Scan(&md) + + if result.Error != nil { + return nil, result.Error + } + + if result.RowsAffected == 0 { + return nil, nil + } + + return &md, nil +} + +func (r *ERC20BalanceRepository) CreateMetadata( + ctx context.Context, + chainID int64, + contractAddress string, + symbol string, + decimals uint8, +) (int, error) { + var id int + + // Start a transaction + tx := r.db.GormDB().WithContext(ctx).Begin() + + // Insert the new entry + result := tx.Exec( + "INSERT INTO erc20_metadata (chain_id, contract_address, symbol, decimals, created_at, updated_at) VALUES (?, ?, ?, ?, NOW(), NOW())", + chainID, contractAddress, symbol, decimals, + ) + + if result.Error != nil { + tx.Rollback() + return 0, result.Error + } + + // Retrieve the ID of the newly inserted entry + err := tx.Raw("SELECT LAST_INSERT_ID()").Scan(&id).Error + if err != nil { + tx.Rollback() + return 0, err + } + + tx.Commit() + + return id, nil +} diff --git a/packages/eventindexer/pkg/repo/erc20_balance_test.go b/packages/eventindexer/pkg/repo/erc20_balance_test.go new file mode 100644 index 00000000000..4a41f291dea --- /dev/null +++ b/packages/eventindexer/pkg/repo/erc20_balance_test.go @@ -0,0 +1,165 @@ +package repo + +import ( + "context" + "errors" + "net/http" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/taikoxyz/taiko-mono/packages/eventindexer" + "github.com/taikoxyz/taiko-mono/packages/eventindexer/pkg/db" +) + +func Test_NewERC20BalanceRepo(t *testing.T) { + tests := []struct { + name string + db db.DB + wantErr error + }{ + { + "success", + &db.Database{}, + nil, + }, + { + "noDb", + nil, + db.ErrNoDB, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + _, err := NewERC20BalanceRepository(tt.db) + if !errors.Is(err, tt.wantErr) { + t.Errorf("NewERC20BalanceRepository() error = %v, wantErr %v", err, tt.wantErr) + return + } + }) + } +} + +func TestIntegration_ERC20Balance_Increase_And_Decrease(t *testing.T) { + db, close, err := testMysql(t) + assert.Equal(t, nil, err) + + defer close() + + ERC20BalanceRepo, err := NewERC20BalanceRepository(db) + assert.Equal(t, nil, err) + + pk, _ := ERC20BalanceRepo.CreateMetadata(context.Background(), 1, "0x123", "SYMBOL", 18) + + bal1, _, err := ERC20BalanceRepo.IncreaseAndDecreaseBalancesInTx(context.Background(), + eventindexer.UpdateERC20BalanceOpts{ + ERC20MetadataID: int64(pk), + ChainID: 1, + Address: "0x123", + ContractAddress: "0x123", + Amount: "1", + }, eventindexer.UpdateERC20BalanceOpts{}) + assert.Equal(t, nil, err) + assert.NotNil(t, bal1) + + bal2, _, err := ERC20BalanceRepo.IncreaseAndDecreaseBalancesInTx(context.Background(), + eventindexer.UpdateERC20BalanceOpts{ + ERC20MetadataID: int64(pk), + ChainID: 1, + Address: "0x123", + ContractAddress: "0x123456", + Amount: "2", + }, eventindexer.UpdateERC20BalanceOpts{}) + assert.Equal(t, nil, err) + assert.NotNil(t, bal2) + + tests := []struct { + name string + increaseOpts eventindexer.UpdateERC20BalanceOpts + decreaseOpts eventindexer.UpdateERC20BalanceOpts + wantErr error + }{ + { + "success", + eventindexer.UpdateERC20BalanceOpts{ + ERC20MetadataID: int64(pk), + ChainID: 1, + Address: "0x123", + ContractAddress: "0x123456789", + Amount: "1", + }, + eventindexer.UpdateERC20BalanceOpts{ + ERC20MetadataID: int64(pk), + ChainID: 1, + Address: "0x123", + ContractAddress: "0x123", + Amount: "1", + }, + nil, + }, + { + "one left", + eventindexer.UpdateERC20BalanceOpts{ + ERC20MetadataID: int64(pk), + ChainID: 1, + Address: "0x123", + ContractAddress: "0x123456789", + Amount: "1", + }, + eventindexer.UpdateERC20BalanceOpts{ + ERC20MetadataID: int64(pk), + ChainID: 1, + Address: "0x123", + ContractAddress: "0x123456", + Amount: "1", + }, + nil, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + _, _, err := ERC20BalanceRepo.IncreaseAndDecreaseBalancesInTx(context.Background(), tt.increaseOpts, tt.decreaseOpts) + assert.Equal(t, tt.wantErr, err) + }) + } +} + +// TODO: fix this test +func TestIntegration_ERC20Balance_FindByAddress(t *testing.T) { + db, close, err := testMysql(t) + assert.Equal(t, nil, err) + + defer close() + + ERC20BalanceRepo, err := NewERC20BalanceRepository(db) + assert.Equal(t, nil, err) + + tests := []struct { + name string + address string + chainID string + wantErr error + }{ + { + "success", + "0x123", + "1", + nil, + }, + } + + get, err := http.NewRequest("GET", "", nil) + assert.Equal(t, nil, err) + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + _, err := ERC20BalanceRepo.FindByAddress( + context.Background(), + get, + tt.address, + tt.chainID) + assert.Equal(t, tt.wantErr, err) + }) + } +} diff --git a/packages/eventindexer/pkg/repo/event.go b/packages/eventindexer/pkg/repo/event.go index c547a39806e..13f37b82d4b 100644 --- a/packages/eventindexer/pkg/repo/event.go +++ b/packages/eventindexer/pkg/repo/event.go @@ -8,22 +8,24 @@ import ( "github.com/morkid/paginate" "github.com/pkg/errors" "github.com/shopspring/decimal" - "github.com/taikoxyz/taiko-mono/packages/eventindexer" "gorm.io/datatypes" "gorm.io/gorm" + + "github.com/taikoxyz/taiko-mono/packages/eventindexer" + "github.com/taikoxyz/taiko-mono/packages/eventindexer/pkg/db" ) type EventRepository struct { - db eventindexer.DB + db db.DB } -func NewEventRepository(db eventindexer.DB) (*EventRepository, error) { - if db == nil { - return nil, eventindexer.ErrNoDB +func NewEventRepository(dbHandler db.DB) (*EventRepository, error) { + if dbHandler == nil { + return nil, db.ErrNoDB } return &EventRepository{ - db: db, + db: dbHandler, }, nil } @@ -111,7 +113,7 @@ func (r *EventRepository) Save(ctx context.Context, opts eventindexer.SaveEventO e.FeeTokenAddress = *opts.FeeTokenAddress } - if err := r.db.GormDB().Create(e).Error; err != nil { + if err := r.db.GormDB().WithContext(ctx).Create(e).Error; err != nil { return nil, errors.Wrap(err, "r.db.Create") } @@ -124,7 +126,7 @@ func (r *EventRepository) FindByEventTypeAndBlockID( blockID int64) (*eventindexer.Event, error) { e := &eventindexer.Event{} - if err := r.db.GormDB(). + if err := r.db.GormDB().WithContext(ctx). Where("event = ?", eventType). Where("block_id = ?", blockID).First(e).Error; err != nil { if err == gorm.ErrRecordNotFound { @@ -143,7 +145,7 @@ func (r *EventRepository) Delete( ) error { e := &eventindexer.Event{} - return r.db.GormDB().Delete(e, id).Error + return r.db.GormDB().WithContext(ctx).Delete(e, id).Error } func (r *EventRepository) FindUniqueProvers( @@ -151,7 +153,7 @@ func (r *EventRepository) FindUniqueProvers( ) ([]eventindexer.UniqueProversResponse, error) { addrs := make([]eventindexer.UniqueProversResponse, 0) - if err := r.db.GormDB(). + if err := r.db.GormDB().WithContext(ctx). Raw("SELECT address, count(*) AS count FROM events WHERE event = ? GROUP BY address", eventindexer.EventNameTransitionProved). FirstOrInit(&addrs).Error; err != nil { @@ -166,7 +168,7 @@ func (r *EventRepository) FindUniqueProposers( ) ([]eventindexer.UniqueProposersResponse, error) { addrs := make([]eventindexer.UniqueProposersResponse, 0) - if err := r.db.GormDB(). + if err := r.db.GormDB().WithContext(ctx). Raw("SELECT address, count(*) AS count FROM events WHERE event = ? GROUP BY address", eventindexer.EventNameBlockProposed). FirstOrInit(&addrs).Error; err != nil { @@ -183,7 +185,7 @@ func (r *EventRepository) GetCountByAddressAndEventName( ) (int, error) { var count int - if err := r.db.GormDB(). + if err := r.db.GormDB().WithContext(ctx). Raw("SELECT count(*) AS count FROM events WHERE event = ? AND address = ?", event, address). FirstOrInit(&count).Error; err != nil { return 0, errors.Wrap(err, "r.db.FirstOrInit") @@ -202,7 +204,7 @@ func (r *EventRepository) GetByAddressAndEventName( DefaultSize: 100, }) - q := r.db.GormDB(). + q := r.db.GormDB().WithContext(ctx). Raw("SELECT * FROM events WHERE event = ? AND address = ?", event, address) reqCtx := pg.With(q) @@ -219,7 +221,7 @@ func (r *EventRepository) FirstByAddressAndEventName( ) (*eventindexer.Event, error) { e := &eventindexer.Event{} - if err := r.db.GormDB(). + if err := r.db.GormDB().WithContext(ctx). Where("address = ?", address). Where("event = ?", event). First(e).Error; err != nil { @@ -242,7 +244,7 @@ func (r *EventRepository) GetAssignedBlocksByProverAddress( DefaultSize: 100, }) - q := r.db.GormDB(). + q := r.db.GormDB().WithContext(ctx). Raw("SELECT * FROM events WHERE event = ? AND assigned_prover = ?", eventindexer.EventNameBlockProposed, address) reqCtx := pg.With(q) @@ -253,26 +255,53 @@ func (r *EventRepository) GetAssignedBlocksByProverAddress( } // DeleteAllAfterBlockID is used when a reorg is detected -func (r *EventRepository) DeleteAllAfterBlockID(blockID uint64, srcChainID uint64) error { +func (r *EventRepository) DeleteAllAfterBlockID(ctx context.Context, blockID uint64, srcChainID uint64) error { query := ` DELETE FROM events WHERE block_id >= ? AND chain_id = ?` - return r.db.GormDB().Table("events").Exec(query, blockID, srcChainID).Error + return r.db.GormDB().WithContext(ctx).Table("events").Exec(query, blockID, srcChainID).Error } // GetLatestBlockID get latest block id func (r *EventRepository) FindLatestBlockID( + ctx context.Context, srcChainID uint64, ) (uint64, error) { - q := `SELECT COALESCE(MAX(emitted_block_id), 0) + q := `SELECT COALESCE(MAX(emitted_block_id), 0) FROM events WHERE chain_id = ?` var b uint64 - if err := r.db.GormDB().Table("events").Raw(q, srcChainID).Scan(&b).Error; err != nil { + if err := r.db.GormDB().WithContext(ctx).Table("events").Raw(q, srcChainID).Scan(&b).Error; err != nil { return 0, err } return b, nil } + +func (r *EventRepository) GetBlockProvenBy(ctx context.Context, blockID int) ([]*eventindexer.Event, error) { + e := []*eventindexer.Event{} + + if err := r.db.GormDB().WithContext(ctx). + Where("block_id = ?", blockID). + Where("event = ?", eventindexer.EventNameTransitionProved). + Find(&e).Error; err != nil { + return nil, err + } + + return e, nil +} + +func (r *EventRepository) GetBlockProposedBy(ctx context.Context, blockID int) (*eventindexer.Event, error) { + e := &eventindexer.Event{} + + if err := r.db.GormDB().WithContext(ctx). + Where("block_id = ?", blockID). + Where("event = ?", eventindexer.EventNameBlockProposed). + First(&e).Error; err != nil { + return nil, err + } + + return e, nil +} diff --git a/packages/eventindexer/pkg/repo/interface.go b/packages/eventindexer/pkg/repo/interface.go new file mode 100644 index 00000000000..e0281bfd25d --- /dev/null +++ b/packages/eventindexer/pkg/repo/interface.go @@ -0,0 +1 @@ +package repo diff --git a/packages/eventindexer/pkg/repo/nft_balance.go b/packages/eventindexer/pkg/repo/nft_balance.go index ccd6df691b8..3c83174035c 100644 --- a/packages/eventindexer/pkg/repo/nft_balance.go +++ b/packages/eventindexer/pkg/repo/nft_balance.go @@ -3,6 +3,11 @@ package repo import ( "context" "net/http" + "strings" + "time" + + "github.com/taikoxyz/taiko-mono/packages/eventindexer/pkg/db" + "golang.org/x/exp/slog" "github.com/morkid/paginate" "github.com/pkg/errors" @@ -11,16 +16,16 @@ import ( ) type NFTBalanceRepository struct { - db eventindexer.DB + db db.DB } -func NewNFTBalanceRepository(db eventindexer.DB) (*NFTBalanceRepository, error) { - if db == nil { - return nil, eventindexer.ErrNoDB +func NewNFTBalanceRepository(dbHandler db.DB) (*NFTBalanceRepository, error) { + if dbHandler == nil { + return nil, db.ErrNoDB } return &NFTBalanceRepository{ - db: db, + db: dbHandler, }, nil } @@ -37,7 +42,7 @@ func (r *NFTBalanceRepository) increaseBalanceInDB( ChainID: opts.ChainID, } - err := db. + err := db.WithContext(ctx). Where("contract_address = ?", opts.ContractAddress). Where("token_id = ?", opts.TokenID). Where("address = ?", opts.Address). @@ -74,7 +79,7 @@ func (r *NFTBalanceRepository) decreaseBalanceInDB( ChainID: opts.ChainID, } - err := db. + err := db.WithContext(ctx). Where("contract_address = ?", opts.ContractAddress). Where("token_id = ?", opts.TokenID). Where("address = ?", opts.Address). @@ -112,22 +117,42 @@ func (r *NFTBalanceRepository) IncreaseAndDecreaseBalancesInTx( increaseOpts eventindexer.UpdateNFTBalanceOpts, decreaseOpts eventindexer.UpdateNFTBalanceOpts, ) (increasedBalance *eventindexer.NFTBalance, decreasedBalance *eventindexer.NFTBalance, err error) { - err = r.db.GormDB().Transaction(func(tx *gorm.DB) (err error) { - increasedBalance, err = r.increaseBalanceInDB(ctx, tx, increaseOpts) - if err != nil { + retries := 10 + for retries > 0 { + err = r.db.GormDB().Transaction(func(tx *gorm.DB) (err error) { + increasedBalance, err = r.increaseBalanceInDB(ctx, tx, increaseOpts) + if err != nil { + return err + } + + if decreaseOpts.Amount != 0 { + decreasedBalance, err = r.decreaseBalanceInDB(ctx, tx, decreaseOpts) + } + return err + }) + + if err == nil { + break } - if decreaseOpts.Amount != 0 { - decreasedBalance, err = r.decreaseBalanceInDB(ctx, tx, decreaseOpts) + if strings.Contains(err.Error(), "Deadlock") { + slog.Warn("database deadlock") + + retries-- + + time.Sleep(100 * time.Millisecond) // backoff before retrying + + continue } - return err - }) - if err != nil { return nil, nil, errors.Wrap(err, "r.db.Transaction") } + if err != nil { + return nil, nil, err + } + return increasedBalance, decreasedBalance, nil } diff --git a/packages/eventindexer/pkg/repo/nft_balance_test.go b/packages/eventindexer/pkg/repo/nft_balance_test.go index 86d04be8602..89d994a7cbd 100644 --- a/packages/eventindexer/pkg/repo/nft_balance_test.go +++ b/packages/eventindexer/pkg/repo/nft_balance_test.go @@ -6,6 +6,7 @@ import ( "testing" "github.com/stretchr/testify/assert" + "github.com/taikoxyz/taiko-mono/packages/eventindexer" "github.com/taikoxyz/taiko-mono/packages/eventindexer/pkg/db" ) @@ -13,18 +14,18 @@ import ( func Test_NewNFTBalanceRepo(t *testing.T) { tests := []struct { name string - db eventindexer.DB + db db.DB wantErr error }{ { "success", - &db.DB{}, + &db.Database{}, nil, }, { "noDb", nil, - eventindexer.ErrNoDB, + db.ErrNoDB, }, } diff --git a/packages/eventindexer/pkg/repo/transaction.go b/packages/eventindexer/pkg/repo/transaction.go index 6e8f919ffca..edf0af8ce6f 100644 --- a/packages/eventindexer/pkg/repo/transaction.go +++ b/packages/eventindexer/pkg/repo/transaction.go @@ -10,7 +10,9 @@ import ( "github.com/ethereum/go-ethereum/core/types" "github.com/pkg/errors" "github.com/shopspring/decimal" + "github.com/taikoxyz/taiko-mono/packages/eventindexer" + "github.com/taikoxyz/taiko-mono/packages/eventindexer/pkg/db" ) var ( @@ -18,16 +20,16 @@ var ( ) type TransactionRepository struct { - db eventindexer.DB + db db.DB } -func NewTransactionRepository(db eventindexer.DB) (*TransactionRepository, error) { - if db == nil { - return nil, eventindexer.ErrNoDB +func NewTransactionRepository(dbHandler db.DB) (*TransactionRepository, error) { + if dbHandler == nil { + return nil, db.ErrNoDB } return &TransactionRepository{ - db: db, + db: dbHandler, }, nil } diff --git a/packages/eventindexer/pkg/repo/transaction_test.go b/packages/eventindexer/pkg/repo/transaction_test.go index 8f761c5e60b..ff79909c5a0 100644 --- a/packages/eventindexer/pkg/repo/transaction_test.go +++ b/packages/eventindexer/pkg/repo/transaction_test.go @@ -9,25 +9,25 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" "github.com/stretchr/testify/assert" - "github.com/taikoxyz/taiko-mono/packages/eventindexer" + "github.com/taikoxyz/taiko-mono/packages/eventindexer/pkg/db" ) func Test_NewTransactionRepo(t *testing.T) { tests := []struct { name string - db eventindexer.DB + db db.DB wantErr error }{ { "success", - &db.DB{}, + &db.Database{}, nil, }, { "noDb", nil, - eventindexer.ErrNoDB, + db.ErrNoDB, }, } diff --git a/packages/eventindexer/pkg/tasks/tasks.go b/packages/eventindexer/pkg/tasks/tasks.go deleted file mode 100644 index 674d9e4aaf9..00000000000 --- a/packages/eventindexer/pkg/tasks/tasks.go +++ /dev/null @@ -1,51 +0,0 @@ -package tasks - -var ( - TotalTransactions = "total-transactions" - TransactionsPerDay = "transactions-per-day" - TotalAccounts = "total-accounts" - AccountsPerDay = "accounts-per-day" - UniqueProposersPerDay = "unique-proposers-per-day" - TotalUniqueProposers = "total-proposers" - UniqueProversPerDay = "unique-provers-per-day" - TotalUniqueProvers = "total-provers" - TotalContractDeployments = "total-contract-deployments" - ContractDeploymentsPerDay = "contract-deployments-per-day" - TransitionProvedTxPerDay = "transition-proved-tx-per-day" - TotalTransitionProvedTx = "total-transition-proved-tx" - TransitionContestedTxPerDay = "transition-contested-tx-per-day" - TotalTransitionContestedTx = "total-transition-contested-tx" - ProposeBlockTxPerDay = "propose-block-tx-per-day" - TotalProposeBlockTx = "total-propose-block-tx" - BridgeMessagesSentPerDay = "bridge-messages-sent-per-day" - TotalBridgeMessagesSent = "total-bridge-messages-sent" - TransitionProvedByTierPerDay = "transition-proved-by-tier-per-day" - TransitionContestedByTierPerDay = "transition-contested-by-tier-per-day" - TotalTransitionProvedByTier = "total-transition-proved-by-tier" - TotalTransitionContestedByTier = "total-transition-contested-by-tier" -) - -var Tasks = []string{ - TotalTransactions, - TransactionsPerDay, - TotalAccounts, - AccountsPerDay, - UniqueProposersPerDay, - TotalUniqueProposers, - UniqueProversPerDay, - TotalUniqueProvers, - TotalContractDeployments, - ContractDeploymentsPerDay, - TransitionProvedTxPerDay, - TotalTransitionProvedTx, - TransitionContestedTxPerDay, - TotalTransitionContestedTx, - ProposeBlockTxPerDay, - TotalProposeBlockTx, - BridgeMessagesSentPerDay, - TotalBridgeMessagesSent, - TotalTransitionProvedByTier, - TotalTransitionContestedByTier, - TransitionProvedByTierPerDay, - TransitionContestedByTierPerDay, -} diff --git a/packages/eventindexer/abigen.sh b/packages/eventindexer/scripts/abigen.sh similarity index 54% rename from packages/eventindexer/abigen.sh rename to packages/eventindexer/scripts/abigen.sh index 0f83c65c1e4..5addfeb0427 100755 --- a/packages/eventindexer/abigen.sh +++ b/packages/eventindexer/scripts/abigen.sh @@ -1,20 +1,20 @@ -#/bin/sh +#!/bin/bash if [ ! -d "../protocol/out" ]; then echo "ABI not generated in protocol package yet. Please run npm install && pnpm run compile in ../protocol" exit 1 fi -paths=("TaikoL1.sol" "Bridge.sol" "AssignmentHook.sol" "SgxVerifier.sol" "TaikoToken.sol") +paths=("layer1/TaikoL1.sol" "layer1/Bridge.sol" "layer1/SgxVerifier.sol" "layer1/TaikoToken.sol") -names=("TaikoL1" "Bridge" "AssignmentHook" "SgxVerifier" "TaikoToken") +names=("TaikoL1" "Bridge" "SgxVerifier" "TaikoToken") for (( i = 0; i < ${#paths[@]}; ++i )); do - jq .abi ../protocol/out/${paths[i]}/${names[i]}.json > ${names[i]}.json lower=$(echo "${names[i]}" | tr '[:upper:]' '[:lower:]') - abigen --abi ${names[i]}.json \ + jq .abi ../protocol/out/${paths[i]}/${names[i]}.json > contracts/$lower/${names[i]}.json + abigen --abi contracts/$lower/${names[i]}.json \ --pkg $lower \ --type ${names[i]} \ --out contracts/$lower/${names[i]}.go diff --git a/packages/eventindexer/scripts/swagger.sh b/packages/eventindexer/scripts/swagger.sh index 2ba0cac2c3a..079ca9dce5f 100755 --- a/packages/eventindexer/scripts/swagger.sh +++ b/packages/eventindexer/scripts/swagger.sh @@ -1,3 +1,3 @@ #/bin/sh -swag init -g server.go -d pkg/http --parseDependency \ No newline at end of file +swag init -g server.go -d pkg/http --parseDependency \ No newline at end of file diff --git a/packages/fork-diff/CHANGELOG.md b/packages/fork-diff/CHANGELOG.md index 90ea31bbcaa..8fa70caf30d 100644 --- a/packages/fork-diff/CHANGELOG.md +++ b/packages/fork-diff/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [0.6.1](https://github.com/taikoxyz/taiko-mono/compare/fork-diff-v0.6.0...fork-diff-v0.6.1) (2024-10-04) + + +### Documentation + +* **fork-diff:** update geth fork diff for upstream merge ([#18206](https://github.com/taikoxyz/taiko-mono/issues/18206)) ([cf303b6](https://github.com/taikoxyz/taiko-mono/commit/cf303b6ae2ab3588721fee2bc9d98ba2c20ecff9)) + ## [0.6.0](https://github.com/taikoxyz/taiko-mono/compare/fork-diff-v0.5.0...fork-diff-v0.6.0) (2024-06-06) diff --git a/packages/fork-diff/README.md b/packages/fork-diff/README.md index 184fe759e2e..28395f2a994 100644 --- a/packages/fork-diff/README.md +++ b/packages/fork-diff/README.md @@ -29,4 +29,4 @@ There is a workflow dispatch you can use to manually trigger a preview or produc > It is possible that state expiry might be unnecessary in a world where Verkle Tries succeed at their goals. -can anyone explain this like im 5. i dont even know what a verkle trie is outside of ppl saying merkle tries r annoying and these r better. +Can anyone explain this like I'm 5? I don't even know what a Verkle Trie is outside of people saying Merkle Tries are annoying and these are better. diff --git a/packages/fork-diff/package.json b/packages/fork-diff/package.json index d7b61745406..aa9d38bca23 100644 --- a/packages/fork-diff/package.json +++ b/packages/fork-diff/package.json @@ -1,4 +1,4 @@ { "name": "@taiko/fork-diff", - "version": "0.6.0" + "version": "0.6.1" } diff --git a/packages/fork-diff/version_config.json b/packages/fork-diff/version_config.json index a139e6be5af..226f60c33e6 100644 --- a/packages/fork-diff/version_config.json +++ b/packages/fork-diff/version_config.json @@ -1,3 +1,3 @@ { - "tagVersion": "v1.13.15" + "tagVersion": "v1.14.11" } diff --git a/packages/geth-rpc-gateway/.gitignore b/packages/geth-rpc-gateway/.gitignore new file mode 100644 index 00000000000..bea9f5fa1f3 --- /dev/null +++ b/packages/geth-rpc-gateway/.gitignore @@ -0,0 +1 @@ +geth-rpc-gateway \ No newline at end of file diff --git a/packages/geth-rpc-gateway/README.md b/packages/geth-rpc-gateway/README.md new file mode 100644 index 00000000000..2ae0fdc9bb1 --- /dev/null +++ b/packages/geth-rpc-gateway/README.md @@ -0,0 +1,73 @@ +# geth-rpc-gateway + +```sh +go build -o geth-rpc-gateway . +``` + +Build for Linux + +```sh +GOOS=linux GOARCH=amd64 go build -o geth-rpc-gateway . +``` + +## How to test + +### Example code + +``` +curl --location --request POST 'https://rpc.internal.taiko.xyz/' \ +--header 'Content-Type: application/json' \ +--data-raw '{ + "jsonrpc": "2.0", + "id": 4, + "method": "eth_blockNumber", + "params": [ + ] +}' +``` + +``` +'use strict' +const { ethers } = require('ethers'); + +// const provider = new ethers.providers.JsonRpcProvider("https://l1rpc.mainnet.taiko.xyz"); + +const provider = new ethers.providers.WebSocketProvider("wss://ws.internal.taiko.xyz"); + +async function main() { + console.log(await provider.getBlock("latest")); + process.exit(0); +} + +main().catch(console.error); +``` + +``` +curl -i -X POST \ + -H "Content-Type:application/json" \ + -d \ +'[ + {"id":92471,"jsonrpc":"2.0","method":"eth_getTransactionReceipt","params":["0x832ef3260c46288e9596d0ddb61c4c9d5965f7da8d076483d08ac2d4265a69b8"]}, + {"id":91112,"jsonrpc":"2.0","method":"eth_getTransactionReceipt","params":["0xbaac413b4cbf6a2f19ef3da2f103f8298042cbba2820fba020a322f9602f8e58"]}, + {"id":48734,"jsonrpc":"2.0","method":"eth_getTransactionReceipt","params":["0x7c649da4df9bea4552c05d4710a1ffb16fed5be81c11912aceb568a8212213d6"]}, + {"id":45180,"jsonrpc":"2.0","method":"eth_getTransactionReceipt","params":["0xb23f58cb6b5155f792fa96c63962c44efba5280a4eed76400eca477e04c7456c"]}, + {"id":95408,"jsonrpc":"2.0","method":"eth_getTransactionReceipt","params":["0xab7e06e9666ba0c270fe06e45fe604316049232c4479f975db0a0ec16b4f9b38"]}, + {"id":193,"jsonrpc":"2.0","method":"eth_getTransactionReceipt","params":["0xd453488f5e14cfb3ac1057e42c1e3eb74420759fe0331894c59f3108e1c813b0"]} +]' \ + 'https://rpc.hekla.taiko.xyz/' +``` + +``` +curl -i -X POST \ + -H "Content-Type:application/json" \ + -d \ +'[ + {"id":92471,"jsonrpc":"2.0","method":"eth_getTransactionReceipt","params":["0x832ef3260c46288e9596d0ddb61c4c9d5965f7da8d076483d08ac2d4265a69b8"]}, + {"id":91112,"jsonrpc":"2.0","method":"eth_getTransactionReceipt","params":["0xbaac413b4cbf6a2f19ef3da2f103f8298042cbba2820fba020a322f9602f8e58"]}, + {"id":48734,"jsonrpc":"2.0","method":"eth_getTransactionReceipt","params":["0x7c649da4df9bea4552c05d4710a1ffb16fed5be81c11912aceb568a8212213d6"]}, + {"id":45180,"jsonrpc":"2.0","method":"eth_getTransactionReceipt","params":["0xb23f58cb6b5155f792fa96c63962c44efba5280a4eed76400eca477e04c7456c"]}, + {"id":95408,"jsonrpc":"2.0","method":"eth_getTransactionReceipt","params":["0xab7e06e9666ba0c270fe06e45fe604316049232c4479f975db0a0ec16b4f9b38"]}, + {"id":193,"jsonrpc":"2.0","method":"eth_getTransactionReceipt","params":["0xd453488f5e14cfb3ac1057e42c1e3eb74420759fe0331894c59f3108e1c813b0"]} +]' \ + 'http://localhost:8080' +``` diff --git a/packages/geth-rpc-gateway/main.go b/packages/geth-rpc-gateway/main.go new file mode 100644 index 00000000000..3915d9ec7b9 --- /dev/null +++ b/packages/geth-rpc-gateway/main.go @@ -0,0 +1,314 @@ +package main + +import ( + "bytes" + "encoding/json" + "io" + "io/ioutil" + "log" + "net/http" + "net/url" + "os" + "strings" + + "github.com/gorilla/websocket" +) + +type JSONRPCRequest struct { + Method string `json:"method"` +} + +var ( + upgrader = websocket.Upgrader{CheckOrigin: func(r *http.Request) bool { return true }} + methodsUsingPrimary map[string]bool + primaryURL *url.URL + secondaryURL *url.URL + webSocketURL *url.URL + enableDebugEndpoints bool +) + +func main() { + // Load the target URLs from environment variables + var err error + primaryURL, err = url.Parse(os.Getenv("TARGET_URL_PRIMARY")) + if err != nil || primaryURL == nil { + log.Fatalf("Failed to parse primary target URL: %v", err) + } + secondaryURL, err = url.Parse(os.Getenv("TARGET_URL_SECONDARY")) + if err != nil || secondaryURL == nil { + log.Fatalf("Failed to parse secondary target URL: %v", err) + } + webSocketURL, err = url.Parse(os.Getenv("WEBSOCKET_TARGET_URL")) + if err != nil || webSocketURL == nil { + log.Fatalf("Failed to parse WebSocket target URL: %v", err) + } + + methodsUsingPrimary = parsePrimaryMethods(os.Getenv("PRIMARY_METHODS")) + enableDebugEndpoints = os.Getenv("ENABLE_DEBUG_ENDPOINTS") == "true" + + http.HandleFunc("/healthz", func(w http.ResponseWriter, r *http.Request) { + log.Printf("/healthz Received request: Method=%s, Path=%s", r.Method, r.URL.Path) + w.WriteHeader(http.StatusOK) + w.Write([]byte("OK")) + }) + + // Determine if server should handle WebSocket or RPC based on environment variable + if os.Getenv("IS_WEBSOCKET") == "true" { + log.Println("Starting in WebSocket mode") + http.HandleFunc("/", rootWebSocketHandler) // WebSocket handler without CORS + } else { + log.Println("Starting in RPC mode") + http.Handle("/", enableCORS(http.HandlerFunc(rootHandler))) // HTTP handler with CORS middleware + } + + log.Fatal(http.ListenAndServe(":8080", nil)) +} + +// WebSocket handler for `/` path when in WebSocket mode +func rootWebSocketHandler(w http.ResponseWriter, r *http.Request) { + // Check for WebSocket Upgrade + if strings.ToLower(r.Header.Get("Upgrade")) == "websocket" { + log.Printf("WebSocket connection initiated...") + handleWebSocket(w, r, webSocketURL) + return + } + + w.WriteHeader(http.StatusOK) + w.Write([]byte("OK")) +} + +// CORS middleware to enable CORS headers +func enableCORS(next http.Handler) http.Handler { + log.Printf("enableCORS") + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + log.Printf("CORS middleware invoked for %s %s", r.Method, r.URL.Path) + + // Get the Origin header from the request + origin := r.Header.Get("Origin") + + // Set Access-Control-Allow-Origin only if the request has an Origin header + if origin != "" { + log.Printf("CORS middleware invoked for origin %s", origin) + w.Header().Del("Access-Control-Allow-Origin") // Clear any existing header + w.Header().Set("Access-Control-Allow-Origin", origin) + w.Header().Set("Vary", "Origin") // Ensure caching based on origin + } + + w.Header().Set("Access-Control-Allow-Methods", r.Method) + w.Header().Set("Access-Control-Allow-Headers", "Content-Type, Authorization") + + w.WriteHeader(http.StatusOK) + + next.ServeHTTP(w, r) + }) +} + +func rootHandler(w http.ResponseWriter, r *http.Request) { + log.Printf("rootHandler...") + + // Check for WebSocket Upgrade + if strings.ToLower(r.Header.Get("Upgrade")) == "websocket" { + handleWebSocket(w, r, webSocketURL) + return + } + + // Handle HTTP requests + + bodyBytes, err := ioutil.ReadAll(r.Body) + + log.Printf("Handle HTTP requests...") + if err != nil { + log.Printf("Error") + + http.Error(w, "Failed to read request body", http.StatusBadRequest) + return + } + defer r.Body.Close() + + if len(bodyBytes) == 0 { + w.Write([]byte("OK")) + return + } + + // Determine the target URL and extract methods + usePrimaryURL, methods := shouldUsePrimaryURL(bodyBytes) + var targetURL *url.URL + if usePrimaryURL { + targetURL = primaryURL + log.Printf("HTTP request hitting TARGET_URL_PRIMARY") + } else { + targetURL = secondaryURL + log.Printf("HTTP request hitting TARGET_URL_SECONDARY") + } + + // Check each method for debug restrictions + for _, method := range methods { + if enableDebugEndpoints && isDebugMethod(method) && method != "debug_traceBlock" && method != "debug_traceBlockByNumber" { + http.Error(w, "Unsupported method", http.StatusBadRequest) + return + } + } + + // Forward the original JSON payload as-is to the target URL + forwardRequest(w, r, targetURL, bodyBytes) +} + +// Function to forward the request to the target URL +func forwardRequest(w http.ResponseWriter, r *http.Request, targetURL *url.URL, bodyBytes []byte) { + + proxyReq, err := http.NewRequest(r.Method, targetURL.String()+r.RequestURI, ioutil.NopCloser(bytes.NewReader(bodyBytes))) + if err != nil { + http.Error(w, "Failed to create request", http.StatusInternalServerError) + return + } + + // Copy headers from the original request, excluding Accept-Encoding + for name, values := range r.Header { + log.Printf("proxy req name %s", name) + if name == "Accept-Encoding" { + continue + } + for _, value := range values { + proxyReq.Header.Add(name, value) + } + } + + // Send the request to the target URL + resp, err := http.DefaultClient.Do(proxyReq) + if err != nil { + http.Error(w, "Failed to reach target server", http.StatusInternalServerError) + return + } + defer resp.Body.Close() + + // Log headers before setting them to diagnose any discrepancies + log.Printf("Received Content-Type from upstream: %s", resp.Header.Get("Content-Type")) + + // Prepare to copy headers from the response + for name, values := range resp.Header { + log.Printf("response name %s, value %s", name, values) + switch name { + case "Content-Length", "Transfer-Encoding", "Connection": + // Skip these headers + continue + default: + for _, value := range values { + w.Header().Add(name, value) + } + } + } + + // Explicitly set Content-Type if it's present in the response + if contentType := resp.Header.Get("Content-Type"); contentType != "" { + w.Header().Set("Content-Type", contentType) + } else { + w.Header().Set("Content-Type", "application/json") // default if not provided + } + log.Printf("Set Content-Type header: %s", w.Header().Get("Content-Type")) + + // Read the response body into a buffer to set Content-Type explicitly + var buf bytes.Buffer + if _, err := io.Copy(&buf, resp.Body); err != nil { + log.Printf("Error reading response body into buffer: %v", err) + http.Error(w, "Failed to read response body", http.StatusInternalServerError) + return + } + + // Write status code and ensure Content-Type is set + w.WriteHeader(resp.StatusCode) + log.Printf("Response status code: %d", resp.StatusCode) + log.Printf("Final Content-Type header: %s", w.Header().Get("Content-Type")) + + // Write the buffered body to the response + if _, err := io.Copy(w, &buf); err != nil { + log.Printf("Error copying buffer to response: %v", err) + } +} + +func isDebugMethod(method string) bool { + return len(method) >= 6 && method[:6] == "debug_" && method != "debug_traceBlock" +} + +// Parses the PRIMARY_METHODS environment variable and returns a map of methods using the primary URL +func parsePrimaryMethods(methods string) map[string]bool { + methodMap := make(map[string]bool) + for _, method := range strings.Split(methods, ",") { + method = strings.TrimSpace(method) + if method != "" { + methodMap[method] = true + } + } + return methodMap +} + +// Checks if any method should use the primary URL and returns all methods +func shouldUsePrimaryURL(bodyBytes []byte) (bool, []string) { + var singleRequest JSONRPCRequest + var multipleRequests []JSONRPCRequest + methods := []string{} + + // Try unmarshalling as a single request + if err := json.Unmarshal(bodyBytes, &singleRequest); err == nil { + methods = append(methods, singleRequest.Method) + return methodsUsingPrimary[singleRequest.Method], methods + } + + // Try unmarshalling as an array of requests + if err := json.Unmarshal(bodyBytes, &multipleRequests); err == nil { + usePrimary := false + for _, req := range multipleRequests { + methods = append(methods, req.Method) + if methodsUsingPrimary[req.Method] { + usePrimary = true + } + } + return usePrimary, methods + } + + log.Printf("Invalid JSON in request body: unable to parse as single or multiple requests") + return false, methods // Default to secondary URL if JSON is invalid +} + +func handleWebSocket(w http.ResponseWriter, r *http.Request, targetURL *url.URL) { + clientConn, err := upgrader.Upgrade(w, r, nil) + if err != nil { + log.Printf("Failed to upgrade connection: %v", err) + http.Error(w, "Failed to upgrade to WebSocket", http.StatusInternalServerError) + return + } + defer clientConn.Close() + + targetConn, _, err := websocket.DefaultDialer.Dial(targetURL.String(), nil) + if err != nil { + log.Printf("Failed to connect to target WebSocket server: %v", err) + http.Error(w, "Failed to connect to target WebSocket server", http.StatusInternalServerError) + return + } + defer targetConn.Close() + + go func() { + for { + messageType, message, err := clientConn.ReadMessage() + if err != nil { + log.Printf("Error reading message from client: %v", err) + return + } + if err := targetConn.WriteMessage(messageType, message); err != nil { + log.Printf("Error writing message to target server: %v", err) + return + } + } + }() + + for { + messageType, message, err := targetConn.ReadMessage() + if err != nil { + log.Printf("Error reading message from target server: %v", err) + return + } + if err := clientConn.WriteMessage(messageType, message); err != nil { + log.Printf("Error writing message to client: %v", err) + return + } + } +} diff --git a/packages/guardian-prover-health-check-ui/CHANGELOG.md b/packages/guardian-prover-health-check-ui/CHANGELOG.md index 5dc43b18c29..2a0e078f45f 100644 --- a/packages/guardian-prover-health-check-ui/CHANGELOG.md +++ b/packages/guardian-prover-health-check-ui/CHANGELOG.md @@ -1,5 +1,30 @@ # Changelog +## [0.2.0](https://github.com/taikoxyz/taiko-mono/compare/guardian-prover-health-check-ui-v0.1.0...guardian-prover-health-check-ui-v0.2.0) (2024-07-28) + + +### Features + +* **guardian-prover-health-check-ui:** better pseudonym handling ([#17177](https://github.com/taikoxyz/taiko-mono/issues/17177)) ([bc19b67](https://github.com/taikoxyz/taiko-mono/commit/bc19b677e0d8fb9816489fe3bd2a57ca2adbd1ee)) + + +### Chores + +* **guardian-prover-health-check-ui:** add new hekla guardian address ([#17767](https://github.com/taikoxyz/taiko-mono/issues/17767)) ([98a98ba](https://github.com/taikoxyz/taiko-mono/commit/98a98ba105fa7d29185d7bf35bbcfefd7b17d581)) +* **guardian-prover-health-check-ui:** update guardian addresses ([#17656](https://github.com/taikoxyz/taiko-mono/issues/17656)) ([e3a2862](https://github.com/taikoxyz/taiko-mono/commit/e3a28628c14a188aa44781f0b9919f365d5835cc)) +* **repo:** add lefthook rule for guardian ui ([#17178](https://github.com/taikoxyz/taiko-mono/issues/17178)) ([5878c29](https://github.com/taikoxyz/taiko-mono/commit/5878c291a30bf32a288628f6bdff8d7b592f3149)) + + +### Documentation + +* **guardian-prover-health-check-ui:** update README.md for Guardian prover health check UI ([#17053](https://github.com/taikoxyz/taiko-mono/issues/17053)) ([c7f3143](https://github.com/taikoxyz/taiko-mono/commit/c7f3143c763792806de2dffb09d35e756f4cb1e9)) + + +### Workflow + +* **guardian-prover-health-check-ui:** fix failing lint job ([#17122](https://github.com/taikoxyz/taiko-mono/issues/17122)) ([eb8fda3](https://github.com/taikoxyz/taiko-mono/commit/eb8fda30e9cd84097d51e4d88137eff11b102e7d)) +* **guardian-prover-health-check-ui:** fix lint ([#17143](https://github.com/taikoxyz/taiko-mono/issues/17143)) ([01fb4c2](https://github.com/taikoxyz/taiko-mono/commit/01fb4c2e4955c7a0389556c2f239e8d11c024c1d)) + ## [0.1.0](https://github.com/taikoxyz/taiko-mono/compare/guardian-prover-health-check-ui-v0.1.0...guardian-prover-health-check-ui-v0.1.0) (2024-02-20) ### Features diff --git a/packages/guardian-prover-health-check-ui/package.json b/packages/guardian-prover-health-check-ui/package.json index 6b478ad1741..538a9bd6246 100644 --- a/packages/guardian-prover-health-check-ui/package.json +++ b/packages/guardian-prover-health-check-ui/package.json @@ -1,6 +1,6 @@ { "name": "guardian-prover-health-check-ui", - "version": "0.1.0", + "version": "0.2.0", "private": true, "scripts": { "dev": "vite dev", @@ -18,7 +18,7 @@ "devDependencies": { "@playwright/test": "^1.43.1", "@sveltejs/adapter-auto": "^3.2.0", - "@sveltejs/kit": "^2.5.5", + "@sveltejs/kit": "^2.5.21", "@sveltejs/vite-plugin-svelte": "^3.1.0", "@tailwindcss/nesting": "0.0.0-insiders.565cd3e", "@typescript-eslint/eslint-plugin": "^7.4.0", diff --git a/packages/guardian-prover-health-check-ui/src/lib/dataFetcher.ts b/packages/guardian-prover-health-check-ui/src/lib/dataFetcher.ts index 563293a92bd..de575594dc7 100644 --- a/packages/guardian-prover-health-check-ui/src/lib/dataFetcher.ts +++ b/packages/guardian-prover-health-check-ui/src/lib/dataFetcher.ts @@ -144,6 +144,9 @@ async function fetchGuardians() { }; guardian.name = await getPseudonym(guardian.address); + if (!guardian.name) { + guardian.name = guardian.address; + } const [status, uptime, balance] = await Promise.all([ fetchLatestGuardianProverHealthCheckFromApi( diff --git a/packages/guardian-prover-health-check-ui/static/config/hekla/guardians.json b/packages/guardian-prover-health-check-ui/static/config/hekla/guardians.json index 048a779775b..2e684aa69f0 100644 --- a/packages/guardian-prover-health-check-ui/static/config/hekla/guardians.json +++ b/packages/guardian-prover-health-check-ui/static/config/hekla/guardians.json @@ -1,6 +1,7 @@ { "0x00000e8e432cA71aFac949095d421a63B742b735": "zephyr", "0x1833A8b4d40F0F5f8e9Be244A3dD4eD55c46d28B": "PokerPlayer1", + "0x0cAC6E2Fd10e92Bf798341Ad0A57b5Cb39DA8D0D": "goyangi", "0x93F2b140c0bB188f6585534240344A90f43f74bF": "wage slave", "0x52BF8B2574b324140a052130126f39dB2507C5DF": "Groot", "0xaeBb6E8A857C86Fc45dBc51551b8E8B7a5791ab3": "Lock", @@ -10,5 +11,6 @@ "0x0EFADbE8328a1a07bB3dDEC22F69F88aDB61B8b4": "Gooner", "0x55792e1F0a41D3af8B6d41DFdcf24651AA80fA1e": "Swift", "0xD32b63e3bc54403d5363525b99E51E628c7c195e": "Casper", - "0xBba27Bd59eFe4F169afBa7b80a641a4675AD1Ff7": "Crash" + "0xBba27Bd59eFe4F169afBa7b80a641a4675AD1Ff7": "Crash", + "0x1509F09637A1fB8C3e47e099d50514b9D9Af8157": "kimchi" } diff --git a/packages/guardian-prover-health-check-ui/static/config/mainnet/guardians.json b/packages/guardian-prover-health-check-ui/static/config/mainnet/guardians.json index a828adbffd5..981b9747c81 100644 --- a/packages/guardian-prover-health-check-ui/static/config/mainnet/guardians.json +++ b/packages/guardian-prover-health-check-ui/static/config/mainnet/guardians.json @@ -6,5 +6,6 @@ "0xC384B679c028787166b9B3725aC14A60da205861": "Casper", "0x1602958A85494cd9C3e0D6672BA0eE42b95B4200": "Swift", "0x5CfEb9a72256B1b49dc2C98b1b7b99d172D50B68": "Frost", - "0x1DB8Ac9f19AbdD60A6418383BfA56A4450aa80C6": "Lock" + "0x1DB8Ac9f19AbdD60A6418383BfA56A4450aa80C6": "Lock", + "0x31AA0BF5dC8A5843E6F7C6Df3eEc916731572c84": "Groot" } diff --git a/packages/guardian-prover-health-check/.default.env b/packages/guardian-prover-health-check/.default.env index c8b2ee5a5db..2109f29fa18 100644 --- a/packages/guardian-prover-health-check/.default.env +++ b/packages/guardian-prover-health-check/.default.env @@ -10,4 +10,4 @@ DATABASE_CONN_MAX_LIFETIME_IN_MS=100000 GUARDIAN_PROVER_CONTRACT_ADDRESS=0xDf8038e9f4535040D7421A89ead398b3A38366EC L1_RPC_URL=wss://l1ws.internal.taiko.xyz L2_RPC_URL=wss://ws.internal.taiko.xyz -INTERVAL=12s \ No newline at end of file +INTERVAL=12s diff --git a/packages/guardian-prover-health-check/.gitignore b/packages/guardian-prover-health-check/.gitignore index e3b802550a1..03615148338 100644 --- a/packages/guardian-prover-health-check/.gitignore +++ b/packages/guardian-prover-health-check/.gitignore @@ -40,6 +40,5 @@ terraform.rc .idea -Bridge.json -TaikoL2.json -IHeaderSync.json \ No newline at end of file +# Ignore abi files +bindings/**/*.json diff --git a/packages/guardian-prover-health-check/README.md b/packages/guardian-prover-health-check/README.md index 9bbbcf78c60..d0d4f0fb240 100644 --- a/packages/guardian-prover-health-check/README.md +++ b/packages/guardian-prover-health-check/README.md @@ -1,4 +1,3 @@ -[![Golang](https://github.com/taikoxyz/taiko-mono/actions/workflows/golang.yml/badge.svg)](https://github.com/taikoxyz/taiko-mono/actions/workflows/golang.yml) [![GuardianProverHealthCheck](https://codecov.io/gh/taikoxyz/taiko-mono/branch/main/graph/badge.svg?token=E468X2PTJC&flag=guardianproverhealthcheck)](https://codecov.io/gh/taikoxyz/taiko-mono) # Guardian Prover Health Check Service diff --git a/packages/guardian-prover-health-check/db.go b/packages/guardian-prover-health-check/db.go deleted file mode 100644 index 75263f6edaa..00000000000 --- a/packages/guardian-prover-health-check/db.go +++ /dev/null @@ -1,28 +0,0 @@ -package guardianproverhealthcheck - -import ( - "database/sql" - - "github.com/cyberhorsey/errors" - "gorm.io/gorm" -) - -var ( - ErrNoDB = errors.Validation.NewWithKeyAndDetail("ERR_NO_DB", "DB is required") -) - -type DBConnectionOpts struct { - Name string - Password string - Host string - Database string - MaxIdleConns uint64 - MaxOpenConns uint64 - MaxConnLifetime uint64 - OpenFunc func(dsn string) (DB, error) -} - -type DB interface { - DB() (*sql.DB, error) - GormDB() *gorm.DB -} diff --git a/packages/guardian-prover-health-check/db/db.go b/packages/guardian-prover-health-check/db/db.go index e2d19c61ca0..a4c258c431f 100644 --- a/packages/guardian-prover-health-check/db/db.go +++ b/packages/guardian-prover-health-check/db/db.go @@ -9,27 +9,42 @@ import ( "gorm.io/gorm" ) -type DB struct { +var ( + ErrNoDB = errors.Validation.NewWithKeyAndDetail("ERR_NO_DB", "no db") +) + +type DB interface { + DB() (*sql.DB, error) + GormDB() *gorm.DB + Close() error +} + +type Database struct { gormdb *gorm.DB } -func (db *DB) DB() (*sql.DB, error) { +func (db *Database) DB() (*sql.DB, error) { return db.gormdb.DB() } -func (db *DB) GormDB() *gorm.DB { +func (db *Database) GormDB() *gorm.DB { return db.gormdb } -func New(gormdb *gorm.DB) *DB { - return &DB{ - gormdb: gormdb, +func (db *Database) Close() error { + sqldb, err := db.gormdb.DB() + if err != nil { + return err } + + return sqldb.Close() } -var ( - ErrNoDB = errors.Validation.NewWithKeyAndDetail("ERR_NO_DB", "DB is required") -) +func New(gormdb *gorm.DB) *Database { + return &Database{ + gormdb: gormdb, + } +} type DBConnectionOpts struct { Name string @@ -39,10 +54,10 @@ type DBConnectionOpts struct { MaxIdleConns uint64 MaxOpenConns uint64 MaxConnLifetime uint64 - OpenFunc func(dsn string) (*DB, error) + OpenFunc func(dsn string) (*Database, error) } -func OpenDBConnection(opts DBConnectionOpts) (*DB, error) { +func OpenDBConnection(opts DBConnectionOpts) (*Database, error) { dsn := "" if opts.Password == "" { dsn = fmt.Sprintf( diff --git a/packages/guardian-prover-health-check/healthcheck.go b/packages/guardian-prover-health-check/healthcheck.go index 913a0f3c66b..fb40633d936 100644 --- a/packages/guardian-prover-health-check/healthcheck.go +++ b/packages/guardian-prover-health-check/healthcheck.go @@ -45,6 +45,6 @@ type HealthCheckRepository interface { req *http.Request, address string, ) (*HealthCheck, error) - Save(opts SaveHealthCheckOpts) error + Save(ctx context.Context, opts *SaveHealthCheckOpts) error GetUptimeByGuardianProverAddress(ctx context.Context, address string) (float64, int, error) } diff --git a/packages/guardian-prover-health-check/healthchecker/config.go b/packages/guardian-prover-health-check/healthchecker/config.go index c16c2bbbdbf..30d80f85870 100644 --- a/packages/guardian-prover-health-check/healthchecker/config.go +++ b/packages/guardian-prover-health-check/healthchecker/config.go @@ -1,21 +1,16 @@ package healthchecker import ( - "database/sql" "strings" - "github.com/taikoxyz/taiko-mono/packages/guardian-prover-health-check/cmd/flags" - "github.com/taikoxyz/taiko-mono/packages/guardian-prover-health-check/db" "github.com/urfave/cli/v2" "gorm.io/driver/mysql" "gorm.io/gorm" "gorm.io/gorm/logger" -) -type DB interface { - DB() (*sql.DB, error) - GormDB() *gorm.DB -} + "github.com/taikoxyz/taiko-mono/packages/guardian-prover-health-check/cmd/flags" + "github.com/taikoxyz/taiko-mono/packages/guardian-prover-health-check/db" +) type Config struct { // db configs @@ -32,7 +27,7 @@ type Config struct { GuardianProverContractAddress string L1RPCUrl string L2RPCUrl string - OpenDBFunc func() (DB, error) + OpenDBFunc func() (db.DB, error) } // NewConfigFromCliContext creates a new config instance from command line flags. @@ -50,7 +45,7 @@ func NewConfigFromCliContext(c *cli.Context) (*Config, error) { L1RPCUrl: c.String(flags.L1RPCUrl.Name), L2RPCUrl: c.String(flags.L2RPCUrl.Name), HTTPPort: c.Uint64(flags.HTTPPort.Name), - OpenDBFunc: func() (DB, error) { + OpenDBFunc: func() (db.DB, error) { return db.OpenDBConnection(db.DBConnectionOpts{ Name: c.String(flags.DatabaseUsername.Name), Password: c.String(flags.DatabasePassword.Name), @@ -59,7 +54,7 @@ func NewConfigFromCliContext(c *cli.Context) (*Config, error) { MaxIdleConns: c.Uint64(flags.DatabaseMaxIdleConns.Name), MaxOpenConns: c.Uint64(flags.DatabaseMaxOpenConns.Name), MaxConnLifetime: c.Uint64(flags.DatabaseConnMaxLifetime.Name), - OpenFunc: func(dsn string) (*db.DB, error) { + OpenFunc: func(dsn string) (*db.Database, error) { gormDB, err := gorm.Open(mysql.Open(dsn), &gorm.Config{ Logger: logger.Default.LogMode(logger.Silent), }) diff --git a/packages/guardian-prover-health-check/healthchecker/config_test.go b/packages/guardian-prover-health-check/healthchecker/config_test.go index b7455dcfd4e..faef03712ae 100644 --- a/packages/guardian-prover-health-check/healthchecker/config_test.go +++ b/packages/guardian-prover-health-check/healthchecker/config_test.go @@ -1,6 +1,7 @@ package healthchecker import ( + "github.com/taikoxyz/taiko-mono/packages/guardian-prover-health-check/db" "testing" "github.com/stretchr/testify/assert" @@ -47,7 +48,7 @@ func TestNewConfigFromCliContext(t *testing.T) { assert.Equal(t, uint64(30), c.DatabaseMaxConnLifetime) assert.Equal(t, uint64(1000), c.HTTPPort) - c.OpenDBFunc = func() (DB, error) { + c.OpenDBFunc = func() (db.DB, error) { return &mock.DB{}, nil } diff --git a/packages/guardian-prover-health-check/healthchecker/healthchecker.go b/packages/guardian-prover-health-check/healthchecker/healthchecker.go index 7c96144db0f..8f3f5827065 100644 --- a/packages/guardian-prover-health-check/healthchecker/healthchecker.go +++ b/packages/guardian-prover-health-check/healthchecker/healthchecker.go @@ -14,14 +14,18 @@ import ( "github.com/labstack/echo/v4" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promauto" + "github.com/urfave/cli/v2" + guardianproverhealthcheck "github.com/taikoxyz/taiko-mono/packages/guardian-prover-health-check" "github.com/taikoxyz/taiko-mono/packages/guardian-prover-health-check/bindings/guardianprover" + "github.com/taikoxyz/taiko-mono/packages/guardian-prover-health-check/db" hchttp "github.com/taikoxyz/taiko-mono/packages/guardian-prover-health-check/http" "github.com/taikoxyz/taiko-mono/packages/guardian-prover-health-check/repo" - "github.com/urfave/cli/v2" ) type HealthChecker struct { + db db.DB + ctx context.Context cancelCtx context.CancelFunc healthCheckRepo guardianproverhealthcheck.HealthCheckRepository @@ -42,6 +46,11 @@ func (h *HealthChecker) Close(ctx context.Context) { if err := h.httpSrv.Shutdown(ctx); err != nil { slog.Error("error encountered shutting down http server", "error", err) } + + // close db + if err := h.db.Close(); err != nil { + slog.Error("error encountered closing db", "error", err) + } } func (h *HealthChecker) InitFromCli(ctx context.Context, c *cli.Context) error { @@ -143,6 +152,7 @@ func InitFromConfig(ctx context.Context, h *HealthChecker, cfg *Config) (err err return err } + h.db = db h.guardianProvers = guardianProvers h.numGuardians = numGuardians.Uint64() h.healthCheckRepo = healthCheckRepo diff --git a/packages/guardian-prover-health-check/http/get_health_checks_by_guardian_prover_address_test.go b/packages/guardian-prover-health-check/http/get_health_checks_by_guardian_prover_address_test.go index 4ef5151700e..4822be86b01 100644 --- a/packages/guardian-prover-health-check/http/get_health_checks_by_guardian_prover_address_test.go +++ b/packages/guardian-prover-health-check/http/get_health_checks_by_guardian_prover_address_test.go @@ -1,6 +1,7 @@ package http import ( + "context" "fmt" "net/http" "net/http/httptest" @@ -9,13 +10,14 @@ import ( "github.com/cyberhorsey/webutils/testutils" "github.com/labstack/echo/v4" "github.com/stretchr/testify/assert" + guardianproverhealthcheck "github.com/taikoxyz/taiko-mono/packages/guardian-prover-health-check" ) func Test_GetHealthChecksByGuardianProverID(t *testing.T) { srv := newTestServer("") - err := srv.healthCheckRepo.Save(guardianproverhealthcheck.SaveHealthCheckOpts{ + err := srv.healthCheckRepo.Save(context.Background(), &guardianproverhealthcheck.SaveHealthCheckOpts{ GuardianProverID: 1, Alive: true, ExpectedAddress: "0x123", diff --git a/packages/guardian-prover-health-check/http/get_health_checks_test.go b/packages/guardian-prover-health-check/http/get_health_checks_test.go index 0fdf5ea3a4b..39e377a8dbe 100644 --- a/packages/guardian-prover-health-check/http/get_health_checks_test.go +++ b/packages/guardian-prover-health-check/http/get_health_checks_test.go @@ -1,6 +1,7 @@ package http import ( + "context" "net/http" "net/http/httptest" "testing" @@ -8,13 +9,14 @@ import ( "github.com/cyberhorsey/webutils/testutils" "github.com/labstack/echo/v4" "github.com/stretchr/testify/assert" + guardianproverhealthcheck "github.com/taikoxyz/taiko-mono/packages/guardian-prover-health-check" ) func Test_GetHealthChecks(t *testing.T) { srv := newTestServer("") - err := srv.healthCheckRepo.Save(guardianproverhealthcheck.SaveHealthCheckOpts{ + err := srv.healthCheckRepo.Save(context.Background(), &guardianproverhealthcheck.SaveHealthCheckOpts{ GuardianProverID: 1, Alive: true, ExpectedAddress: "0x123", diff --git a/packages/guardian-prover-health-check/http/get_most_recent_signed_block_by_guardian_prover_address.go b/packages/guardian-prover-health-check/http/get_most_recent_signed_block_by_guardian_prover_address.go index f6a0373c946..0f2a3a4de55 100644 --- a/packages/guardian-prover-health-check/http/get_most_recent_signed_block_by_guardian_prover_address.go +++ b/packages/guardian-prover-health-check/http/get_most_recent_signed_block_by_guardian_prover_address.go @@ -26,6 +26,7 @@ func (srv *Server) GetMostRecentSignedBlockByGuardianProverAddress(c echo.Contex } signedBlock, err := srv.signedBlockRepo.GetMostRecentByGuardianProverAddress( + c.Request().Context(), address, ) diff --git a/packages/guardian-prover-health-check/http/get_most_recent_signed_block_by_guardian_prover_address_test.go b/packages/guardian-prover-health-check/http/get_most_recent_signed_block_by_guardian_prover_address_test.go index 779b959b862..f793c7ba0ee 100644 --- a/packages/guardian-prover-health-check/http/get_most_recent_signed_block_by_guardian_prover_address_test.go +++ b/packages/guardian-prover-health-check/http/get_most_recent_signed_block_by_guardian_prover_address_test.go @@ -1,6 +1,7 @@ package http import ( + "context" "fmt" "net/http" "net/http/httptest" @@ -16,13 +17,15 @@ func Test_GetMostRecentSignedBlockByGuardianProverAddress(t *testing.T) { srv := newTestServer("") for i := 0; i < 10; i++ { - err := srv.signedBlockRepo.Save(guardianproverhealthcheck.SaveSignedBlockOpts{ - GuardianProverID: 1, - RecoveredAddress: "0x123", - BlockID: uint64(i), - BlockHash: "0x123", - Signature: "0x123", - }) + err := srv.signedBlockRepo.Save( + context.Background(), + &guardianproverhealthcheck.SaveSignedBlockOpts{ + GuardianProverID: 1, + RecoveredAddress: "0x123", + BlockID: uint64(i), + BlockHash: "0x123", + Signature: "0x123", + }) assert.Nil(t, err) } diff --git a/packages/guardian-prover-health-check/http/get_most_recent_startup_by_guardian_prover_address_test.go b/packages/guardian-prover-health-check/http/get_most_recent_startup_by_guardian_prover_address_test.go index a3a48b793b1..e2556c27fce 100644 --- a/packages/guardian-prover-health-check/http/get_most_recent_startup_by_guardian_prover_address_test.go +++ b/packages/guardian-prover-health-check/http/get_most_recent_startup_by_guardian_prover_address_test.go @@ -1,6 +1,7 @@ package http import ( + "context" "fmt" "net/http" "net/http/httptest" @@ -16,7 +17,7 @@ func Test_GetMostRecentStartupByGuardianProverAddress(t *testing.T) { srv := newTestServer("") for i := 0; i < 5; i++ { - err := srv.startupRepo.Save(guardianproverhealthcheck.SaveStartupOpts{ + err := srv.startupRepo.Save(context.Background(), &guardianproverhealthcheck.SaveStartupOpts{ GuardianProverID: 1, GuardianProverAddress: "0x123", Revision: "asdf", diff --git a/packages/guardian-prover-health-check/http/get_signed_blocks.go b/packages/guardian-prover-health-check/http/get_signed_blocks.go index 64112f6234b..be0c6ac0950 100644 --- a/packages/guardian-prover-health-check/http/get_signed_blocks.go +++ b/packages/guardian-prover-health-check/http/get_signed_blocks.go @@ -82,6 +82,7 @@ func (srv *Server) GetSignedBlocks(c echo.Context) error { } signedBlocks, err := srv.signedBlockRepo.GetByStartingBlockID( + c.Request().Context(), guardianproverhealthcheck.GetSignedBlocksByStartingBlockIDOpts{ StartingBlockID: start, }, diff --git a/packages/guardian-prover-health-check/http/get_startups_by_guardian_prover_address_test.go b/packages/guardian-prover-health-check/http/get_startups_by_guardian_prover_address_test.go index cdb86b4c230..a483ad94a7e 100644 --- a/packages/guardian-prover-health-check/http/get_startups_by_guardian_prover_address_test.go +++ b/packages/guardian-prover-health-check/http/get_startups_by_guardian_prover_address_test.go @@ -1,6 +1,7 @@ package http import ( + "context" "fmt" "net/http" "net/http/httptest" @@ -15,7 +16,7 @@ import ( func Test_GetStartupsByGuardianProverAddress(t *testing.T) { srv := newTestServer("") - err := srv.startupRepo.Save(guardianproverhealthcheck.SaveStartupOpts{ + err := srv.startupRepo.Save(context.Background(), &guardianproverhealthcheck.SaveStartupOpts{ GuardianProverID: 1, GuardianProverAddress: "0x123", Revision: "asdf", diff --git a/packages/guardian-prover-health-check/http/get_uptime_by_guardian_prover_address.go b/packages/guardian-prover-health-check/http/get_uptime_by_guardian_prover_address.go index 14ef653fcd7..037ce367117 100644 --- a/packages/guardian-prover-health-check/http/get_uptime_by_guardian_prover_address.go +++ b/packages/guardian-prover-health-check/http/get_uptime_by_guardian_prover_address.go @@ -16,8 +16,8 @@ type uptimeResponse struct { // // returns the stats // -// @Summary Get updatime by guardian prover address -// @ID get-updatime-by-guardian-prover-address +// @Summary Get uptime by guardian prover address +// @ID get-uptime-by-guardian-prover-address // @Accept json // @Produce json // @Success 200 {object} uptimeResponse diff --git a/packages/guardian-prover-health-check/http/post_health_check.go b/packages/guardian-prover-health-check/http/post_health_check.go index 860428007df..a89f7614c43 100644 --- a/packages/guardian-prover-health-check/http/post_health_check.go +++ b/packages/guardian-prover-health-check/http/post_health_check.go @@ -1,6 +1,7 @@ package http import ( + "context" "log/slog" "net/http" @@ -62,7 +63,7 @@ func (srv *Server) PostHealthCheck(c echo.Context) error { // expected address and recovered address will be the same until we have an auth // mechanism which will allow us to store health checks that ecrecover to an unexpected // address. - if err := srv.healthCheckRepo.Save(guardianproverhealthcheck.SaveHealthCheckOpts{ + if err := srv.healthCheckRepo.Save(context.Background(), &guardianproverhealthcheck.SaveHealthCheckOpts{ GuardianProverID: recoveredGuardianProver.ID.Uint64(), Alive: true, ExpectedAddress: recoveredGuardianProver.Address.Hex(), diff --git a/packages/guardian-prover-health-check/http/post_signed_block.go b/packages/guardian-prover-health-check/http/post_signed_block.go index a7898d6eb28..e39adc331cf 100644 --- a/packages/guardian-prover-health-check/http/post_signed_block.go +++ b/packages/guardian-prover-health-check/http/post_signed_block.go @@ -52,13 +52,15 @@ func (srv *Server) PostSignedBlock(c echo.Context) error { } // otherwise, we can store it in the database. - if err := srv.signedBlockRepo.Save(guardianproverhealthcheck.SaveSignedBlockOpts{ - GuardianProverID: recoveredGuardianProver.ID.Uint64(), - BlockID: req.BlockID, - BlockHash: req.BlockHash, - Signature: req.Signature, - RecoveredAddress: recoveredGuardianProver.Address.Hex(), - }); err != nil { + if err := srv.signedBlockRepo.Save( + c.Request().Context(), + &guardianproverhealthcheck.SaveSignedBlockOpts{ + GuardianProverID: recoveredGuardianProver.ID.Uint64(), + BlockID: req.BlockID, + BlockHash: req.BlockHash, + Signature: req.Signature, + RecoveredAddress: recoveredGuardianProver.Address.Hex(), + }); err != nil { // if its a duplicate entry, we just return empty response with // status 200 instead of an error. if strings.Contains(err.Error(), "Duplicate entry") { diff --git a/packages/guardian-prover-health-check/http/post_startup.go b/packages/guardian-prover-health-check/http/post_startup.go index c08785144c4..9c9a0d72de5 100644 --- a/packages/guardian-prover-health-check/http/post_startup.go +++ b/packages/guardian-prover-health-check/http/post_startup.go @@ -1,6 +1,7 @@ package http import ( + "context" "log/slog" "net/http" @@ -61,7 +62,7 @@ func (srv *Server) PostStartup(c echo.Context) error { // expected address and recovered address will be the same until we have an auth // mechanism which will allow us to store health checks that ecrecover to an unexpected // address. - if err := srv.startupRepo.Save(guardianproverhealthcheck.SaveStartupOpts{ + if err := srv.startupRepo.Save(context.Background(), &guardianproverhealthcheck.SaveStartupOpts{ GuardianProverID: recoveredGuardianProver.ID.Uint64(), GuardianVersion: req.GuardianVersion, L1NodeVersion: req.L1NodeVersion, diff --git a/packages/guardian-prover-health-check/http/server.go b/packages/guardian-prover-health-check/http/server.go index 36c6bbb455b..7f8947149d6 100644 --- a/packages/guardian-prover-health-check/http/server.go +++ b/packages/guardian-prover-health-check/http/server.go @@ -23,7 +23,7 @@ import ( // @license.name MIT // @host healthcheck.internal.taiko.xyz -// Server represents an guardian prover health check http server instance. +// Server represents a guardian prover health check http server instance. type Server struct { echo *echo.Echo ethClient *ethclient.Client diff --git a/packages/guardian-prover-health-check/mock/db.go b/packages/guardian-prover-health-check/mock/db.go index 00d2111641a..32a3477a5dd 100644 --- a/packages/guardian-prover-health-check/mock/db.go +++ b/packages/guardian-prover-health-check/mock/db.go @@ -16,3 +16,5 @@ func (db *DB) DB() (*sql.DB, error) { func (db *DB) GormDB() *gorm.DB { return &gorm.DB{} } + +func (db *DB) Close() error { return nil } diff --git a/packages/guardian-prover-health-check/mock/health_check_repo.go b/packages/guardian-prover-health-check/mock/health_check_repo.go index 3bd51186260..f6aca3aa853 100644 --- a/packages/guardian-prover-health-check/mock/health_check_repo.go +++ b/packages/guardian-prover-health-check/mock/health_check_repo.go @@ -44,7 +44,7 @@ func (h *HealthCheckRepo) Get( }, nil } -func (h *HealthCheckRepo) Save(opts guardianproverhealthcheck.SaveHealthCheckOpts) error { +func (h *HealthCheckRepo) Save(ctx context.Context, opts *guardianproverhealthcheck.SaveHealthCheckOpts) error { h.healthChecks = append(h.healthChecks, &guardianproverhealthcheck.HealthCheck{ GuardianProverID: opts.GuardianProverID, Alive: opts.Alive, diff --git a/packages/guardian-prover-health-check/mock/signed_block_repo.go b/packages/guardian-prover-health-check/mock/signed_block_repo.go index 1733db41a8c..f89d800ad62 100644 --- a/packages/guardian-prover-health-check/mock/signed_block_repo.go +++ b/packages/guardian-prover-health-check/mock/signed_block_repo.go @@ -1,6 +1,7 @@ package mock import ( + "context" "errors" guardianproverhealthcheck "github.com/taikoxyz/taiko-mono/packages/guardian-prover-health-check" @@ -16,7 +17,7 @@ func NewSignedBlockRepository() *SignedBlockRepo { } } -func (r *SignedBlockRepo) Save(opts guardianproverhealthcheck.SaveSignedBlockOpts) error { +func (r *SignedBlockRepo) Save(ctx context.Context, opts *guardianproverhealthcheck.SaveSignedBlockOpts) error { r.signedBlocks = append(r.signedBlocks, &guardianproverhealthcheck.SignedBlock{ GuardianProverID: opts.GuardianProverID, BlockID: opts.BlockID, @@ -30,6 +31,7 @@ func (r *SignedBlockRepo) Save(opts guardianproverhealthcheck.SaveSignedBlockOpt } func (r *SignedBlockRepo) GetByStartingBlockID( + ctx context.Context, opts guardianproverhealthcheck.GetSignedBlocksByStartingBlockIDOpts, ) ([]*guardianproverhealthcheck.SignedBlock, error) { sb := make([]*guardianproverhealthcheck.SignedBlock, 0) @@ -44,6 +46,7 @@ func (r *SignedBlockRepo) GetByStartingBlockID( } func (r *SignedBlockRepo) GetMostRecentByGuardianProverAddress( + ctx context.Context, address string, ) (*guardianproverhealthcheck.SignedBlock, error) { var b *guardianproverhealthcheck.SignedBlock diff --git a/packages/guardian-prover-health-check/mock/startup_repo.go b/packages/guardian-prover-health-check/mock/startup_repo.go index 98115b77c20..8091779772d 100644 --- a/packages/guardian-prover-health-check/mock/startup_repo.go +++ b/packages/guardian-prover-health-check/mock/startup_repo.go @@ -51,7 +51,7 @@ func (r *StartupRepo) GetMostRecentByGuardianProverAddress( return s, nil } -func (h *StartupRepo) Save(opts guardianproverhealthcheck.SaveStartupOpts) error { +func (h *StartupRepo) Save(ctx context.Context, opts *guardianproverhealthcheck.SaveStartupOpts) error { h.startups = append(h.startups, &guardianproverhealthcheck.Startup{ GuardianProverID: opts.GuardianProverID, GuardianProverAddress: opts.GuardianProverAddress, diff --git a/packages/guardian-prover-health-check/repo/containers_test.go b/packages/guardian-prover-health-check/repo/containers_test.go index 935d18fa92c..4e86abe17a4 100644 --- a/packages/guardian-prover-health-check/repo/containers_test.go +++ b/packages/guardian-prover-health-check/repo/containers_test.go @@ -20,7 +20,7 @@ var ( dbPassword = "password" ) -func testMysql(t *testing.T) (DB, func(), error) { +func testMysql(t *testing.T) (db.DB, func(), error) { req := testcontainers.ContainerRequest{ Image: "mysql:latest", ExposedPorts: []string{"3306/tcp", "33060/tcp"}, diff --git a/packages/guardian-prover-health-check/repo/db.go b/packages/guardian-prover-health-check/repo/db.go deleted file mode 100644 index 1c8a35dbca3..00000000000 --- a/packages/guardian-prover-health-check/repo/db.go +++ /dev/null @@ -1,17 +0,0 @@ -package repo - -import ( - "database/sql" - - "github.com/cyberhorsey/errors" - "gorm.io/gorm" -) - -var ( - ErrNoDB = errors.Validation.NewWithKeyAndDetail("ERR_NO_DB", "no db") -) - -type DB interface { - DB() (*sql.DB, error) - GormDB() *gorm.DB -} diff --git a/packages/guardian-prover-health-check/repo/healthcheck.go b/packages/guardian-prover-health-check/repo/healthcheck.go index c8bb184a4d4..a4cdab5bc85 100644 --- a/packages/guardian-prover-health-check/repo/healthcheck.go +++ b/packages/guardian-prover-health-check/repo/healthcheck.go @@ -5,8 +5,10 @@ import ( "net/http" "github.com/morkid/paginate" - guardianproverhealthcheck "github.com/taikoxyz/taiko-mono/packages/guardian-prover-health-check" "gorm.io/gorm" + + guardianproverhealthcheck "github.com/taikoxyz/taiko-mono/packages/guardian-prover-health-check" + "github.com/taikoxyz/taiko-mono/packages/guardian-prover-health-check/db" ) var ( @@ -14,21 +16,21 @@ var ( ) type HealthCheckRepository struct { - db DB + db db.DB } -func NewHealthCheckRepository(db DB) (*HealthCheckRepository, error) { - if db == nil { - return nil, ErrNoDB +func NewHealthCheckRepository(dbHandler db.DB) (*HealthCheckRepository, error) { + if dbHandler == nil { + return nil, db.ErrNoDB } return &HealthCheckRepository{ - db: db, + db: dbHandler, }, nil } -func (r *HealthCheckRepository) startQuery() *gorm.DB { - return r.db.GormDB().Table("health_checks") +func (r *HealthCheckRepository) startQuery(ctx context.Context) *gorm.DB { + return r.db.GormDB().WithContext(ctx).Table("health_checks") } func (r *HealthCheckRepository) Get( @@ -39,7 +41,7 @@ func (r *HealthCheckRepository) Get( DefaultSize: 100, }) - reqCtx := pg.With(r.startQuery()) + reqCtx := pg.With(r.startQuery(ctx)) page := reqCtx.Request(req).Response(&[]guardianproverhealthcheck.HealthCheck{}) @@ -55,7 +57,7 @@ func (r *HealthCheckRepository) GetByGuardianProverAddress( DefaultSize: 100, }) - reqCtx := pg.With(r.startQuery().Order("created_at desc"). + reqCtx := pg.With(r.startQuery(ctx).Order("created_at desc"). Where("recovered_address = ?", address)) page := reqCtx.Request(req).Response(&[]guardianproverhealthcheck.HealthCheck{}) @@ -70,7 +72,7 @@ func (r *HealthCheckRepository) GetMostRecentByGuardianProverAddress( ) (*guardianproverhealthcheck.HealthCheck, error) { hc := &guardianproverhealthcheck.HealthCheck{} - if err := r.startQuery().Order("created_at desc"). + if err := r.startQuery(ctx).Order("created_at desc"). Where("recovered_address = ?", address).Limit(1). Scan(hc).Error; err != nil { return nil, err @@ -79,7 +81,7 @@ func (r *HealthCheckRepository) GetMostRecentByGuardianProverAddress( return hc, nil } -func (r *HealthCheckRepository) Save(opts guardianproverhealthcheck.SaveHealthCheckOpts) error { +func (r *HealthCheckRepository) Save(ctx context.Context, opts *guardianproverhealthcheck.SaveHealthCheckOpts) error { b := &guardianproverhealthcheck.HealthCheck{ Alive: opts.Alive, ExpectedAddress: opts.ExpectedAddress, @@ -89,7 +91,7 @@ func (r *HealthCheckRepository) Save(opts guardianproverhealthcheck.SaveHealthCh LatestL1Block: opts.LatestL1Block, LatestL2Block: opts.LatestL2Block, } - if err := r.startQuery().Create(b).Error; err != nil { + if err := r.startQuery(ctx).Create(b).Error; err != nil { return err } @@ -102,12 +104,12 @@ func (r *HealthCheckRepository) GetUptimeByGuardianProverAddress( ) (float64, int, error) { var count int64 - var query string = `SELECT COUNT(*) - FROM health_checks + var query string = `SELECT COUNT(*) + FROM health_checks WHERE recovered_address = ? AND created_at > NOW() - INTERVAL 1 DAY` - if err := r.db.GormDB().Raw(query, address).Scan(&count).Error; err != nil { + if err := r.db.GormDB().WithContext(ctx).Raw(query, address).Scan(&count).Error; err != nil { return 0, 0, err } diff --git a/packages/guardian-prover-health-check/repo/healthcheck_test.go b/packages/guardian-prover-health-check/repo/healthcheck_test.go index 6b84e2a2663..fff747e3217 100644 --- a/packages/guardian-prover-health-check/repo/healthcheck_test.go +++ b/packages/guardian-prover-health-check/repo/healthcheck_test.go @@ -5,26 +5,27 @@ import ( "net/http" "testing" + "gopkg.in/go-playground/assert.v1" + guardianproverhealthcheck "github.com/taikoxyz/taiko-mono/packages/guardian-prover-health-check" "github.com/taikoxyz/taiko-mono/packages/guardian-prover-health-check/db" - "gopkg.in/go-playground/assert.v1" ) func Test_NewHealthCheckRepo(t *testing.T) { tests := []struct { name string - db DB + db db.DB wantErr error }{ { "success", - &db.DB{}, + &db.Database{}, nil, }, { "noDb", nil, - ErrNoDB, + db.ErrNoDB, }, } @@ -66,7 +67,7 @@ func TestIntegration_HealthCheck_Save(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - err = healthCheckRepo.Save(tt.opts) + err = healthCheckRepo.Save(context.Background(), &tt.opts) assert.Equal(t, tt.wantErr, err) req, err := http.NewRequest(http.MethodGet, "/healtcheck", nil) @@ -90,7 +91,7 @@ func TestIntegration_HealthCheck_UptimeByGuardianProverId(t *testing.T) { assert.Equal(t, nil, err) - err = healthCheckRepo.Save(guardianproverhealthcheck.SaveHealthCheckOpts{ + err = healthCheckRepo.Save(context.Background(), &guardianproverhealthcheck.SaveHealthCheckOpts{ GuardianProverID: 1, Alive: true, ExpectedAddress: "0x123", @@ -102,7 +103,7 @@ func TestIntegration_HealthCheck_UptimeByGuardianProverId(t *testing.T) { assert.Equal(t, err, nil) - err = healthCheckRepo.Save(guardianproverhealthcheck.SaveHealthCheckOpts{ + err = healthCheckRepo.Save(context.Background(), &guardianproverhealthcheck.SaveHealthCheckOpts{ GuardianProverID: 1, Alive: true, ExpectedAddress: "0x123", diff --git a/packages/guardian-prover-health-check/repo/signed_block.go b/packages/guardian-prover-health-check/repo/signed_block.go index c5be413ee72..97e0b4ebaf6 100644 --- a/packages/guardian-prover-health-check/repo/signed_block.go +++ b/packages/guardian-prover-health-check/repo/signed_block.go @@ -1,29 +1,32 @@ package repo import ( - guardianproverhealthcheck "github.com/taikoxyz/taiko-mono/packages/guardian-prover-health-check" + "context" "gorm.io/gorm" + + guardianproverhealthcheck "github.com/taikoxyz/taiko-mono/packages/guardian-prover-health-check" + "github.com/taikoxyz/taiko-mono/packages/guardian-prover-health-check/db" ) type SignedBlockRepository struct { - db DB + db db.DB } -func NewSignedBlockRepository(db DB) (*SignedBlockRepository, error) { - if db == nil { - return nil, ErrNoDB +func NewSignedBlockRepository(dbHandler db.DB) (*SignedBlockRepository, error) { + if dbHandler == nil { + return nil, db.ErrNoDB } return &SignedBlockRepository{ - db: db, + db: dbHandler, }, nil } -func (r *SignedBlockRepository) startQuery() *gorm.DB { - return r.db.GormDB().Table("signed_blocks") +func (r *SignedBlockRepository) startQuery(ctx context.Context) *gorm.DB { + return r.db.GormDB().WithContext(ctx).Table("signed_blocks") } -func (r *SignedBlockRepository) Save(opts guardianproverhealthcheck.SaveSignedBlockOpts) error { +func (r *SignedBlockRepository) Save(ctx context.Context, opts *guardianproverhealthcheck.SaveSignedBlockOpts) error { b := &guardianproverhealthcheck.SignedBlock{ GuardianProverID: opts.GuardianProverID, BlockID: opts.BlockID, @@ -31,7 +34,7 @@ func (r *SignedBlockRepository) Save(opts guardianproverhealthcheck.SaveSignedBl RecoveredAddress: opts.RecoveredAddress, Signature: opts.Signature, } - if err := r.startQuery().Create(b).Error; err != nil { + if err := r.startQuery(ctx).Create(b).Error; err != nil { return err } @@ -39,31 +42,32 @@ func (r *SignedBlockRepository) Save(opts guardianproverhealthcheck.SaveSignedBl } func (r *SignedBlockRepository) GetByStartingBlockID( + ctx context.Context, opts guardianproverhealthcheck.GetSignedBlocksByStartingBlockIDOpts, ) ([]*guardianproverhealthcheck.SignedBlock, error) { var sb []*guardianproverhealthcheck.SignedBlock - if err := r.startQuery().Where("block_id >= ?", opts.StartingBlockID).Find(&sb).Error; err != nil { + if err := r.startQuery(ctx).Where("block_id >= ?", opts.StartingBlockID).Find(&sb).Error; err != nil { return nil, err } return sb, nil } -func (r *SignedBlockRepository) GetMostRecentByGuardianProverAddress(address string) ( +func (r *SignedBlockRepository) GetMostRecentByGuardianProverAddress(ctx context.Context, address string) ( *guardianproverhealthcheck.SignedBlock, error) { q := `SELECT * FROM signed_blocks WHERE block_id = ( - SELECT MAX(block_id) - FROM signed_blocks + SELECT MAX(block_id) + FROM signed_blocks WHERE recovered_address = ? ) AND recovered_address = ?;` var b *guardianproverhealthcheck.SignedBlock - if err := r.startQuery().Raw(q, address, address).Scan(&b).Error; err != nil { + if err := r.startQuery(ctx).Raw(q, address, address).Scan(&b).Error; err != nil { return nil, err } diff --git a/packages/guardian-prover-health-check/repo/signed_block_test.go b/packages/guardian-prover-health-check/repo/signed_block_test.go index 2c94c50adc4..781699dda5c 100644 --- a/packages/guardian-prover-health-check/repo/signed_block_test.go +++ b/packages/guardian-prover-health-check/repo/signed_block_test.go @@ -1,28 +1,30 @@ package repo import ( + "context" "testing" + "gopkg.in/go-playground/assert.v1" + guardianproverhealthcheck "github.com/taikoxyz/taiko-mono/packages/guardian-prover-health-check" "github.com/taikoxyz/taiko-mono/packages/guardian-prover-health-check/db" - "gopkg.in/go-playground/assert.v1" ) func Test_NewSignedBlockRepo(t *testing.T) { tests := []struct { name string - db DB + db db.DB wantErr error }{ { "success", - &db.DB{}, + &db.Database{}, nil, }, { "noDb", nil, - ErrNoDB, + db.ErrNoDB, }, } @@ -62,7 +64,7 @@ func TestIntegration_SignedBlock_Save(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - err = SignedBlockRepo.Save(tt.opts) + err = SignedBlockRepo.Save(context.Background(), &tt.opts) assert.Equal(t, tt.wantErr, err) }) } diff --git a/packages/guardian-prover-health-check/repo/startup.go b/packages/guardian-prover-health-check/repo/startup.go index 576a2ca3842..b7560761a93 100644 --- a/packages/guardian-prover-health-check/repo/startup.go +++ b/packages/guardian-prover-health-check/repo/startup.go @@ -5,26 +5,28 @@ import ( "net/http" "github.com/morkid/paginate" - guardianproverhealthcheck "github.com/taikoxyz/taiko-mono/packages/guardian-prover-health-check" "gorm.io/gorm" + + guardianproverhealthcheck "github.com/taikoxyz/taiko-mono/packages/guardian-prover-health-check" + "github.com/taikoxyz/taiko-mono/packages/guardian-prover-health-check/db" ) type StartupRepository struct { - db DB + db db.DB } -func NewStartupRepository(db DB) (*StartupRepository, error) { - if db == nil { - return nil, ErrNoDB +func NewStartupRepository(dbHandler db.DB) (*StartupRepository, error) { + if dbHandler == nil { + return nil, db.ErrNoDB } return &StartupRepository{ - db: db, + db: dbHandler, }, nil } -func (r *StartupRepository) startQuery() *gorm.DB { - return r.db.GormDB().Table("startups") +func (r *StartupRepository) startQuery(ctx context.Context) *gorm.DB { + return r.db.GormDB().WithContext(ctx).Table("startups") } func (r *StartupRepository) GetByGuardianProverAddress( @@ -36,7 +38,7 @@ func (r *StartupRepository) GetByGuardianProverAddress( DefaultSize: 100, }) - reqCtx := pg.With(r.startQuery().Order("created_at desc"). + reqCtx := pg.With(r.startQuery(ctx).Order("created_at desc"). Where("guardian_prover_address = ?", address)) page := reqCtx.Request(req).Response(&[]guardianproverhealthcheck.Startup{}) @@ -50,7 +52,7 @@ func (r *StartupRepository) GetMostRecentByGuardianProverAddress( ) (*guardianproverhealthcheck.Startup, error) { s := &guardianproverhealthcheck.Startup{} - if err := r.startQuery().Order("created_at desc"). + if err := r.startQuery(ctx).Order("created_at desc"). Where("guardian_prover_address = ?", address).Limit(1). Scan(s).Error; err != nil { return nil, err @@ -59,7 +61,7 @@ func (r *StartupRepository) GetMostRecentByGuardianProverAddress( return s, nil } -func (r *StartupRepository) Save(opts guardianproverhealthcheck.SaveStartupOpts) error { +func (r *StartupRepository) Save(ctx context.Context, opts *guardianproverhealthcheck.SaveStartupOpts) error { b := &guardianproverhealthcheck.Startup{ GuardianProverAddress: opts.GuardianProverAddress, GuardianProverID: opts.GuardianProverID, @@ -68,7 +70,7 @@ func (r *StartupRepository) Save(opts guardianproverhealthcheck.SaveStartupOpts) L1NodeVersion: opts.L1NodeVersion, L2NodeVersion: opts.L2NodeVersion, } - if err := r.startQuery().Create(b).Error; err != nil { + if err := r.startQuery(ctx).Create(b).Error; err != nil { return err } diff --git a/packages/guardian-prover-health-check/repo/startup_test.go b/packages/guardian-prover-health-check/repo/startup_test.go index 7b83a842bbe..4c4bfae33bb 100644 --- a/packages/guardian-prover-health-check/repo/startup_test.go +++ b/packages/guardian-prover-health-check/repo/startup_test.go @@ -5,26 +5,27 @@ import ( "net/http" "testing" + "gopkg.in/go-playground/assert.v1" + guardianproverhealthcheck "github.com/taikoxyz/taiko-mono/packages/guardian-prover-health-check" "github.com/taikoxyz/taiko-mono/packages/guardian-prover-health-check/db" - "gopkg.in/go-playground/assert.v1" ) func Test_NewStartupRepo(t *testing.T) { tests := []struct { name string - db DB + db db.DB wantErr error }{ { "success", - &db.DB{}, + &db.Database{}, nil, }, { "noDb", nil, - ErrNoDB, + db.ErrNoDB, }, } @@ -63,7 +64,7 @@ func TestIntegration_Startup_Save(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - err = startupRepo.Save(tt.opts) + err = startupRepo.Save(context.Background(), &tt.opts) assert.Equal(t, tt.wantErr, err) }) } @@ -78,7 +79,7 @@ func TestIntegration_Startup_GetByGuardianProverID(t *testing.T) { startupRepo, err := NewStartupRepository(db) assert.Equal(t, nil, err) - err = startupRepo.Save(guardianproverhealthcheck.SaveStartupOpts{ + err = startupRepo.Save(context.Background(), &guardianproverhealthcheck.SaveStartupOpts{ GuardianProverID: 1, GuardianProverAddress: "0x123", Revision: "asdf", @@ -89,7 +90,7 @@ func TestIntegration_Startup_GetByGuardianProverID(t *testing.T) { assert.Equal(t, nil, err) - err = startupRepo.Save(guardianproverhealthcheck.SaveStartupOpts{ + err = startupRepo.Save(context.Background(), &guardianproverhealthcheck.SaveStartupOpts{ GuardianProverID: 1, GuardianProverAddress: "0x123", Revision: "zxxc", diff --git a/packages/guardian-prover-health-check/scripts/abigen.sh b/packages/guardian-prover-health-check/scripts/abigen.sh index 206fba1c653..cbccd406812 100755 --- a/packages/guardian-prover-health-check/scripts/abigen.sh +++ b/packages/guardian-prover-health-check/scripts/abigen.sh @@ -1,4 +1,4 @@ -#/bin/sh +#!/bin/sh if [ ! -d "../protocol/out" ]; then echo "ABI not generated in protocol package yet. Please run npm install && npx hardhat compile in ../protocol" @@ -11,12 +11,12 @@ names=("GuardianProver") for (( i = 0; i < ${#paths[@]}; ++i )); do - jq .abi ../protocol/out/${paths[i]}/${names[i]}.json > ${names[i]}.json lower=$(echo "${names[i]}" | tr '[:upper:]' '[:lower:]') - abigen --abi ${names[i]}.json \ + jq .abi ../protocol/out/${paths[i]}/${names[i]}.json > bindings/$lower/${names[i]}.json + abigen --abi bindings/$lower/${names[i]}.json \ --pkg $lower \ --type ${names[i]} \ --out bindings/$lower/${names[i]}.go done -exit 0 \ No newline at end of file +exit 0 diff --git a/packages/guardian-prover-health-check/scripts/swagger.sh b/packages/guardian-prover-health-check/scripts/swagger.sh index b0b8dbb55e2..92cda8598af 100755 --- a/packages/guardian-prover-health-check/scripts/swagger.sh +++ b/packages/guardian-prover-health-check/scripts/swagger.sh @@ -1,3 +1,3 @@ -#/bin/sh +#!/bin/sh -swag init -g http/server.go --parseDependency \ No newline at end of file +swag init -g http/server.go --parseDependency diff --git a/packages/guardian-prover-health-check/signed_block.go b/packages/guardian-prover-health-check/signed_block.go index 3f040e74114..95eded73c1d 100644 --- a/packages/guardian-prover-health-check/signed_block.go +++ b/packages/guardian-prover-health-check/signed_block.go @@ -1,6 +1,7 @@ package guardianproverhealthcheck import ( + "context" "time" ) @@ -28,7 +29,7 @@ type GetSignedBlocksByStartingBlockIDOpts struct { // SignedBlockRepository defines database interaction methods to create and get // signed blocks submitted by guardian provers. type SignedBlockRepository interface { - Save(opts SaveSignedBlockOpts) error - GetByStartingBlockID(opts GetSignedBlocksByStartingBlockIDOpts) ([]*SignedBlock, error) - GetMostRecentByGuardianProverAddress(address string) (*SignedBlock, error) + Save(ctx context.Context, opts *SaveSignedBlockOpts) error + GetByStartingBlockID(ctx context.Context, opts GetSignedBlocksByStartingBlockIDOpts) ([]*SignedBlock, error) + GetMostRecentByGuardianProverAddress(ctx context.Context, address string) (*SignedBlock, error) } diff --git a/packages/guardian-prover-health-check/startup.go b/packages/guardian-prover-health-check/startup.go index 30e7db03377..831398421e1 100644 --- a/packages/guardian-prover-health-check/startup.go +++ b/packages/guardian-prover-health-check/startup.go @@ -45,5 +45,5 @@ type StartupRepository interface { ctx context.Context, address string, ) (*Startup, error) - Save(opts SaveStartupOpts) error + Save(ctx context.Context, opts *SaveStartupOpts) error } diff --git a/packages/monitors/.gitignore b/packages/monitors/.gitignore new file mode 100644 index 00000000000..86092cef1cb --- /dev/null +++ b/packages/monitors/.gitignore @@ -0,0 +1 @@ +.defender diff --git a/packages/monitors/README.md b/packages/monitors/README.md new file mode 100644 index 00000000000..43f6628df45 --- /dev/null +++ b/packages/monitors/README.md @@ -0,0 +1,3 @@ +# Monitors + +This package contains monitoring and alerting services for the Taiko protocol. It uses OpenZeppelin Defender for monitoring smart contracts and setting up automated alerts. diff --git a/packages/monitors/defender/mainnet/.defender/deployment-log.mystack.json b/packages/monitors/defender/mainnet/.defender/deployment-log.mystack.json new file mode 100644 index 00000000000..cf6a9a2b953 --- /dev/null +++ b/packages/monitors/defender/mainnet/.defender/deployment-log.mystack.json @@ -0,0 +1,9 @@ +{"stack":"mystack","timestamp":"2024-09-18T21:39:53.367Z","monitors":{"removed":[],"created":[],"updated":[{"skipABIValidation":true,"alertThreshold":null,"notifyConfig":{"severityLevel":"MEDIUM","messageBody":"**Defender Monitor {{ sentinel.name }} Triggered**\n\n**Network**\n\n{{ sentinel.network }}\n\n**Block Hash**\n\n{{ blockHash }}\n\n**Transaction Hash**\n\n{{ transaction.transactionHash }}\n\n**Explorer Link**\n\n{{ transaction.link }}\n\n**Match Reasons**\n\n{{ matchReasonsFormatted }}\n\n**Metadata**\n\n{{ metadataFormatted }}","messageSubject":"Defender Monitor: TaikoL1: Pause/Unpause triggered","notifications":[{"type":"discord","sendCount":0,"notificationId":"93e8dbf2-4f87-4793-b3c3-6ff0dd6cf827"}],"timeoutMs":60000},"tenantId":"0691b59e-8b53-4ae2-b874-959de8a9f2ee","addressRules":[{"conditions":[{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"Paused(address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"Unpaused(address)","expression":null}]}],"abi":"[{\"type\":\"error\",\"name\":\"AM_ADDRESS_ALREADY_SET\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"AddressSet\",\"inputs\":[{\"type\":\"uint64\",\"name\":\"chainId\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"name\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newAddress\",\"indexed\":false},{\"type\":\"address\",\"name\":\"oldAddress\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"AdminChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousAdmin\",\"indexed\":false},{\"type\":\"address\",\"name\":\"newAdmin\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Approval\",\"inputs\":[{\"type\":\"address\",\"name\":\"owner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"spender\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"value\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Approval\",\"inputs\":[{\"type\":\"address\",\"name\":\"owner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"approved\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"tokenId\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"ApprovalForAll\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":true},{\"type\":\"address\",\"name\":\"operator\",\"indexed\":true},{\"type\":\"bool\",\"name\":\"approved\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Approved\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"operationId\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"approvalBits\",\"indexed\":false},{\"type\":\"bool\",\"name\":\"minGuardiansReached\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Authorized\",\"inputs\":[{\"type\":\"address\",\"name\":\"addr\",\"indexed\":true},{\"type\":\"bool\",\"name\":\"authorized\",\"indexed\":false}]},{\"type\":\"error\",\"name\":\"BB_INVALID_PARAMS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BB_MINT_DISALLOWED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BB_PERMISSION_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BTOKEN_CANNOT_RECEIVE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BTOKEN_INVALID_BURN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BTOKEN_INVALID_PARAMS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INSUFFICIENT_GAS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_CONTEXT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_FEE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_GAS_LIMIT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_VALUE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_MESSAGE_NOT_SENT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_OUT_OF_ETH_QUOTA\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_PERMISSION_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_PROOF_TOO_LARGE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_RETRY_FAILED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_SIGNAL_NOT_RECEIVED\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BeaconUpgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"beacon\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BlockProposed\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"address\",\"name\":\"assignedProver\",\"indexed\":true},{\"type\":\"uint96\",\"name\":\"livenessBond\",\"indexed\":false},{\"type\":\"tuple\",\"name\":\"meta\",\"indexed\":false,\"components\":[{\"type\":\"bytes32\",\"name\":\"l1Hash\"},{\"type\":\"bytes32\",\"name\":\"difficulty\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"bytes32\",\"name\":\"extraData\"},{\"type\":\"bytes32\",\"name\":\"depositsHash\"},{\"type\":\"address\",\"name\":\"coinbase\"},{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"uint64\",\"name\":\"timestamp\"},{\"type\":\"uint64\",\"name\":\"l1Height\"},{\"type\":\"uint16\",\"name\":\"minTier\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"bytes32\",\"name\":\"parentMetaHash\"},{\"type\":\"address\",\"name\":\"sender\"}]},{\"type\":\"tuple[]\",\"name\":\"depositsProcessed\",\"indexed\":false,\"components\":[{\"type\":\"address\",\"name\":\"recipient\"},{\"type\":\"uint96\",\"name\":\"amount\"},{\"type\":\"uint64\",\"name\":\"id\"}]}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BlockVerified\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"address\",\"name\":\"prover\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"blockHash\",\"indexed\":false},{\"type\":\"bytes32\",\"name\":\"stateRoot\",\"indexed\":false},{\"type\":\"uint16\",\"name\":\"tier\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BondCredited\",\"inputs\":[{\"type\":\"address\",\"name\":\"user\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"amount\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BondDebited\",\"inputs\":[{\"type\":\"address\",\"name\":\"user\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"amount\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BridgedTokenChanged\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"srcChainId\",\"indexed\":true},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":true},{\"type\":\"address\",\"name\":\"btokenOld\",\"indexed\":false},{\"type\":\"address\",\"name\":\"btokenNew\",\"indexed\":false},{\"type\":\"string\",\"name\":\"ctokenSymbol\",\"indexed\":false},{\"type\":\"string\",\"name\":\"ctokenName\",\"indexed\":false},{\"type\":\"uint8\",\"name\":\"ctokenDecimal\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BridgedTokenDeployed\",\"inputs\":[{\"type\":\"uint64\",\"name\":\"chainId\",\"indexed\":true},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":true},{\"type\":\"address\",\"name\":\"btoken\",\"indexed\":true},{\"type\":\"string\",\"name\":\"ctokenSymbol\",\"indexed\":false},{\"type\":\"string\",\"name\":\"ctokenName\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BridgedTokenDeployed\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"srcChainId\",\"indexed\":true},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":true},{\"type\":\"address\",\"name\":\"btoken\",\"indexed\":true},{\"type\":\"string\",\"name\":\"ctokenSymbol\",\"indexed\":false},{\"type\":\"string\",\"name\":\"ctokenName\",\"indexed\":false},{\"type\":\"uint8\",\"name\":\"ctokenDecimal\",\"indexed\":false}]},{\"type\":\"function\",\"name\":\"CLOCK_MODE\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"string\"}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"CalldataTxList\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"bytes\",\"name\":\"txList\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"ChainDataSynced\",\"inputs\":[{\"type\":\"uint64\",\"name\":\"chainId\",\"indexed\":true},{\"type\":\"uint64\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"kind\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"data\",\"indexed\":false},{\"type\":\"bytes32\",\"name\":\"signal\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"ConflictingProofs\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"address\",\"name\":\"guardian\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"currentProofHash\",\"indexed\":false},{\"type\":\"bytes32\",\"name\":\"newProofHash\",\"indexed\":false},{\"type\":\"bool\",\"name\":\"provingPaused\",\"indexed\":false}]},{\"type\":\"function\",\"name\":\"DOMAIN_SEPARATOR\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"DelegateChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"delegator\",\"indexed\":true},{\"type\":\"address\",\"name\":\"fromDelegate\",\"indexed\":true},{\"type\":\"address\",\"name\":\"toDelegate\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"DelegateVotesChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"delegate\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"previousBalance\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"newBalance\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"EIP712DomainChanged\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ETH_TRANSFER_FAILED\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"EtherPaymentFailed\",\"inputs\":[{\"type\":\"address\",\"name\":\"to\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"maxGas\",\"indexed\":false}]},{\"type\":\"error\",\"name\":\"FUNC_NOT_IMPLEMENTED\",\"inputs\":[]},{\"type\":\"function\",\"name\":\"GAS_OVERHEAD\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint32\"}]},{\"type\":\"function\",\"name\":\"GAS_RESERVE\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"GP_INVALID_GUARDIAN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GP_INVALID_GUARDIAN_SET\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GP_INVALID_MIN_GUARDIANS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GP_INVALID_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GV_PERMISSION_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GV_ZERO_ADDRESS\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"GuardianApproval\",\"inputs\":[{\"type\":\"address\",\"name\":\"addr\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"blockHash\",\"indexed\":true},{\"type\":\"bool\",\"name\":\"approved\",\"indexed\":false},{\"type\":\"bytes\",\"name\":\"proofData\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"GuardiansUpdated\",\"inputs\":[{\"type\":\"uint32\",\"name\":\"version\",\"indexed\":false},{\"type\":\"address[]\",\"name\":\"guardians\",\"indexed\":false}]},{\"type\":\"error\",\"name\":\"HOOK_ASSIGNMENT_EXPIRED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"HOOK_ASSIGNMENT_INVALID_SIG\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"HOOK_TIER_NOT_FOUND\",\"inputs\":[]},{\"type\":\"function\",\"name\":\"INSTANCE_EXPIRY\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"INSTANCE_VALIDITY_DELAY\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Initialized\",\"inputs\":[{\"type\":\"uint8\",\"name\":\"version\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"InstanceAdded\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"id\",\"indexed\":true},{\"type\":\"address\",\"name\":\"instance\",\"indexed\":true},{\"type\":\"address\",\"name\":\"replaced\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"validSince\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"InstanceDeleted\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"id\",\"indexed\":true},{\"type\":\"address\",\"name\":\"instance\",\"indexed\":true}]},{\"type\":\"error\",\"name\":\"L1_ALREADY_CONTESTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_ALREADY_PROVED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOB_NOT_AVAILABLE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOB_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOCK_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_CANNOT_CONTEST\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_BLOCK_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_GENESIS_HASH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_SIG\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_TIER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_TRANSITION\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_NOT_ASSIGNED_PROVER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_PROVING_PAUSED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_RECEIVE_DISABLED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TOO_MANY_BLOCKS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TRANSITION_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNEXPECTED_PARENT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNEXPECTED_TRANSITION_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"LTP_INVALID_ACCOUNT_PROOF\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"LTP_INVALID_INCLUSION_PROOF\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"LocalReportCheckToggled\",\"inputs\":[{\"type\":\"bool\",\"name\":\"checkLocalEnclaveReport\",\"indexed\":false}]},{\"type\":\"function\",\"name\":\"MAX_GAS_PAYING_PROVER\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"MIN_MIGRATION_DELAY\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MessageProcessed\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"tuple\",\"name\":\"message\",\"indexed\":false,\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"tuple\",\"name\":\"stats\",\"indexed\":false,\"components\":[{\"type\":\"uint32\",\"name\":\"gasUsedInFeeCalc\"},{\"type\":\"uint32\",\"name\":\"proofSize\"},{\"type\":\"uint32\",\"name\":\"numCacheOps\"},{\"type\":\"bool\",\"name\":\"processedByRelayer\"}]}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MessageSent\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"tuple\",\"name\":\"message\",\"indexed\":false,\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MessageStatusChanged\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"uint8\",\"name\":\"status\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MigratedTo\",\"inputs\":[{\"type\":\"address\",\"name\":\"fromToken\",\"indexed\":true},{\"type\":\"address\",\"name\":\"account\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"amount\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MigrationStatusChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"addr\",\"indexed\":false},{\"type\":\"bool\",\"name\":\"inbound\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MrEnclaveUpdated\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"mrEnclave\",\"indexed\":true},{\"type\":\"bool\",\"name\":\"trusted\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MrSignerUpdated\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"mrSigner\",\"indexed\":true},{\"type\":\"bool\",\"name\":\"trusted\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferred\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Paused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"ProvingAutoPauseEnabled\",\"inputs\":[{\"type\":\"bool\",\"name\":\"enabled\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"ProvingPaused\",\"inputs\":[{\"type\":\"bool\",\"name\":\"paused\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"QeIdentityConfigured\",\"inputs\":[{\"type\":\"tuple\",\"name\":\"qeIdentityInput\",\"indexed\":false,\"components\":[{\"type\":\"bytes4\",\"name\":\"miscselect\"},{\"type\":\"bytes4\",\"name\":\"miscselectMask\"},{\"type\":\"uint16\",\"name\":\"isvprodid\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes16\",\"name\":\"attributesMask\"},{\"type\":\"bytes32\",\"name\":\"mrsigner\"},{\"type\":\"tuple[]\",\"name\":\"tcbLevels\",\"components\":[{\"type\":\"tuple\",\"name\":\"tcb\",\"components\":[{\"type\":\"uint16\",\"name\":\"isvsvn\"}]},{\"type\":\"uint8\",\"name\":\"tcbStatus\"}]}]}]},{\"type\":\"error\",\"name\":\"REENTRANT_CALL\",\"inputs\":[]},{\"type\":\"function\",\"name\":\"RELAYER_MAX_PROOF_BYTES\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"RESOLVER_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_INVALID_MANAGER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_UNEXPECTED_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_ZERO_ADDR\",\"inputs\":[{\"type\":\"uint64\",\"name\":\"chainId\"},{\"type\":\"bytes32\",\"name\":\"name\"}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"RevokedCertSerialNumAdded\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"index\",\"indexed\":true},{\"type\":\"bytes\",\"name\":\"serialNum\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"RevokedCertSerialNumRemoved\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"index\",\"indexed\":true},{\"type\":\"bytes\",\"name\":\"serialNum\",\"indexed\":false}]},{\"type\":\"error\",\"name\":\"SGX_ALREADY_ATTESTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SGX_INVALID_ATTESTATION\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SGX_INVALID_INSTANCE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SGX_INVALID_PROOF\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SGX_RA_NOT_SUPPORTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_EMPTY_PROOF\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_INVALID_HOPS_WITH_LOOP\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_INVALID_LAST_HOP_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_INVALID_MID_HOP_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_INVALID_STATE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_SIGNAL_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_UNAUTHORIZED\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"SignalSent\",\"inputs\":[{\"type\":\"address\",\"name\":\"app\",\"indexed\":false},{\"type\":\"bytes32\",\"name\":\"signal\",\"indexed\":false},{\"type\":\"bytes32\",\"name\":\"slot\",\"indexed\":false},{\"type\":\"bytes32\",\"name\":\"value\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"StateVariablesUpdated\",\"inputs\":[{\"type\":\"tuple\",\"name\":\"slotB\",\"indexed\":false,\"components\":[{\"type\":\"uint64\",\"name\":\"numBlocks\"},{\"type\":\"uint64\",\"name\":\"lastVerifiedBlockId\"},{\"type\":\"bool\",\"name\":\"provingPaused\"},{\"type\":\"uint8\",\"name\":\"__reservedB1\"},{\"type\":\"uint16\",\"name\":\"__reservedB2\"},{\"type\":\"uint32\",\"name\":\"__reservedB3\"},{\"type\":\"uint64\",\"name\":\"lastUnpausedAt\"}]}]},{\"type\":\"error\",\"name\":\"TIER_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"TT_INVALID_PARAM\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TcbInfoJsonConfigured\",\"inputs\":[{\"type\":\"string\",\"name\":\"fmspc\",\"indexed\":true},{\"type\":\"tuple\",\"name\":\"tcbInfoInput\",\"indexed\":false,\"components\":[{\"type\":\"string\",\"name\":\"pceid\"},{\"type\":\"string\",\"name\":\"fmspc\"},{\"type\":\"tuple[]\",\"name\":\"tcbLevels\",\"components\":[{\"type\":\"uint256\",\"name\":\"pcesvn\"},{\"type\":\"uint8[]\",\"name\":\"sgxTcbCompSvnArr\"},{\"type\":\"uint8\",\"name\":\"status\"}]}]}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TokenReceived\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint64\",\"name\":\"srcChainId\",\"indexed\":false},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":false},{\"type\":\"address\",\"name\":\"token\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"tokenIds\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"amounts\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TokenReceived\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint64\",\"name\":\"srcChainId\",\"indexed\":false},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":false},{\"type\":\"address\",\"name\":\"token\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"amount\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TokenReleased\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":false},{\"type\":\"address\",\"name\":\"token\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"tokenIds\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"amounts\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TokenReleased\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":false},{\"type\":\"address\",\"name\":\"token\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"amount\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TokenSent\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint64\",\"name\":\"destChainId\",\"indexed\":false},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":false},{\"type\":\"address\",\"name\":\"token\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"tokenIds\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"amounts\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TokenSent\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint64\",\"name\":\"canonicalChainId\",\"indexed\":false},{\"type\":\"uint64\",\"name\":\"destChainId\",\"indexed\":false},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":false},{\"type\":\"address\",\"name\":\"token\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"amount\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Transfer\",\"inputs\":[{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"value\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Transfer\",\"inputs\":[{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"tokenId\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TransferBatch\",\"inputs\":[{\"type\":\"address\",\"name\":\"operator\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint256[]\",\"name\":\"ids\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"values\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TransferSingle\",\"inputs\":[{\"type\":\"address\",\"name\":\"operator\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"id\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"value\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TransitionContested\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"tuple\",\"name\":\"tran\",\"indexed\":false,\"components\":[{\"type\":\"bytes32\",\"name\":\"parentHash\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"bytes32\",\"name\":\"graffiti\"}]},{\"type\":\"address\",\"name\":\"contester\",\"indexed\":false},{\"type\":\"uint96\",\"name\":\"contestBond\",\"indexed\":false},{\"type\":\"uint16\",\"name\":\"tier\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TransitionProved\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"tuple\",\"name\":\"tran\",\"indexed\":false,\"components\":[{\"type\":\"bytes32\",\"name\":\"parentHash\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"bytes32\",\"name\":\"graffiti\"}]},{\"type\":\"address\",\"name\":\"prover\",\"indexed\":false},{\"type\":\"uint96\",\"name\":\"validityBond\",\"indexed\":false},{\"type\":\"uint16\",\"name\":\"tier\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"URI\",\"inputs\":[{\"type\":\"string\",\"name\":\"value\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"id\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Unpaused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Upgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"implementation\",\"indexed\":true}]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_CERTIFICATION_CHAIN_DATA\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_CERTIFICATION_CHAIN_SIZE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_ECDSA_SIGNATURE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_QEAUTHDATA_SIZE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_QEREPORT_LENGTN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_QUOTE_LENGTN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_QUOTE_MEMBER_LENGTN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_UNSUPPORT_CERTIFICATION_TYPE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_BTOKEN_BLACKLISTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_CTOKEN_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INSUFFICIENT_FEE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INTERFACE_NOT_SUPPORTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_AMOUNT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_CTOKEN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_NEW_BTOKEN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_TOKEN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_TO_ADDR\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_LAST_MIGRATION_TOO_CLOSE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_PERMISSION_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_TOKEN_ARRAY_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_ADDRESS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_ADDR_MANAGER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_VALUE\",\"inputs\":[]},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"addInstances\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address[]\",\"name\":\"_instances\"}],\"outputs\":[{\"type\":\"uint256[]\"}]},{\"type\":\"function\",\"name\":\"addRevokedCertSerialNum\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"index\"},{\"type\":\"bytes[]\",\"name\":\"serialNumBatch\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"addressManager\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"addressRegistered\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"instanceAddress\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"alreadyAttested\"}]},{\"type\":\"function\",\"name\":\"allowance\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"owner\"},{\"type\":\"address\",\"name\":\"spender\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"approvals\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"version\"},{\"type\":\"bytes32\",\"name\":\"proofHash\"}],\"outputs\":[{\"type\":\"uint256\",\"name\":\"approvalBits\"}]},{\"type\":\"function\",\"name\":\"approve\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"spender\"},{\"type\":\"uint256\",\"name\":\"amount\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"approve\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_meta\",\"components\":[{\"type\":\"bytes32\",\"name\":\"l1Hash\"},{\"type\":\"bytes32\",\"name\":\"difficulty\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"bytes32\",\"name\":\"extraData\"},{\"type\":\"bytes32\",\"name\":\"depositsHash\"},{\"type\":\"address\",\"name\":\"coinbase\"},{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"uint64\",\"name\":\"timestamp\"},{\"type\":\"uint64\",\"name\":\"l1Height\"},{\"type\":\"uint16\",\"name\":\"minTier\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"bytes32\",\"name\":\"parentMetaHash\"},{\"type\":\"address\",\"name\":\"sender\"}]},{\"type\":\"tuple\",\"name\":\"_tran\",\"components\":[{\"type\":\"bytes32\",\"name\":\"parentHash\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"bytes32\",\"name\":\"graffiti\"}]},{\"type\":\"tuple\",\"name\":\"_proof\",\"components\":[{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[{\"type\":\"bool\",\"name\":\"approved_\"}]},{\"type\":\"function\",\"name\":\"approve\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"tokenId\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"authorize\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_addr\"},{\"type\":\"bool\",\"name\":\"_authorize\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"balanceOf\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"balanceOf\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"},{\"type\":\"uint256\",\"name\":\"id\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"balanceOfBatch\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address[]\",\"name\":\"accounts\"},{\"type\":\"uint256[]\",\"name\":\"ids\"}],\"outputs\":[{\"type\":\"uint256[]\"}]},{\"type\":\"function\",\"name\":\"batchTransfer\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address[]\",\"name\":\"recipients\"},{\"type\":\"uint256[]\",\"name\":\"amounts\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"bondBalanceOf\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_user\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"bridgedToCanonical\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"btoken\"}],\"outputs\":[{\"type\":\"uint64\",\"name\":\"chainId\"},{\"type\":\"address\",\"name\":\"addr\"},{\"type\":\"string\",\"name\":\"symbol\"},{\"type\":\"string\",\"name\":\"name\"}]},{\"type\":\"function\",\"name\":\"bridgedToCanonical\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"btoken\"}],\"outputs\":[{\"type\":\"uint64\",\"name\":\"chainId\"},{\"type\":\"address\",\"name\":\"addr\"},{\"type\":\"uint8\",\"name\":\"decimals\"},{\"type\":\"string\",\"name\":\"symbol\"},{\"type\":\"string\",\"name\":\"name\"}]},{\"type\":\"function\",\"name\":\"btokenDenylist\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"btoken\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"denied\"}]},{\"type\":\"function\",\"name\":\"burn\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_account\"},{\"type\":\"uint256\",\"name\":\"_tokenId\"},{\"type\":\"uint256\",\"name\":\"_amount\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"burn\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_account\"},{\"type\":\"uint256\",\"name\":\"_tokenId\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"burn\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"_amount\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"canonical\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"},{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"canonicalToBridged\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"chainId\"},{\"type\":\"address\",\"name\":\"ctoken\"}],\"outputs\":[{\"type\":\"address\",\"name\":\"btoken\"}]},{\"type\":\"function\",\"name\":\"changeBridgedToken\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_ctoken\",\"components\":[{\"type\":\"uint64\",\"name\":\"chainId\"},{\"type\":\"address\",\"name\":\"addr\"},{\"type\":\"uint8\",\"name\":\"decimals\"},{\"type\":\"string\",\"name\":\"symbol\"},{\"type\":\"string\",\"name\":\"name\"}]},{\"type\":\"address\",\"name\":\"_btokenNew\"}],\"outputs\":[{\"type\":\"address\",\"name\":\"btokenOld_\"}]},{\"type\":\"function\",\"name\":\"changeMigrationStatus\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_migratingAddress\"},{\"type\":\"bool\",\"name\":\"_migratingInbound\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"checkLocalEnclaveReport\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"checkpoints\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"},{\"type\":\"uint32\",\"name\":\"pos\"}],\"outputs\":[{\"type\":\"tuple\",\"components\":[{\"type\":\"uint32\",\"name\":\"fromBlock\"},{\"type\":\"uint224\",\"name\":\"votes\"}]}]},{\"type\":\"function\",\"name\":\"clock\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint48\"}]},{\"type\":\"function\",\"name\":\"configureQeIdentityJson\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"qeIdentityInput\",\"components\":[{\"type\":\"bytes4\",\"name\":\"miscselect\"},{\"type\":\"bytes4\",\"name\":\"miscselectMask\"},{\"type\":\"uint16\",\"name\":\"isvprodid\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes16\",\"name\":\"attributesMask\"},{\"type\":\"bytes32\",\"name\":\"mrsigner\"},{\"type\":\"tuple[]\",\"name\":\"tcbLevels\",\"components\":[{\"type\":\"tuple\",\"name\":\"tcb\",\"components\":[{\"type\":\"uint16\",\"name\":\"isvsvn\"}]},{\"type\":\"uint8\",\"name\":\"tcbStatus\"}]}]}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"configureTcbInfoJson\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"string\",\"name\":\"fmspc\"},{\"type\":\"tuple\",\"name\":\"tcbInfoInput\",\"components\":[{\"type\":\"string\",\"name\":\"pceid\"},{\"type\":\"string\",\"name\":\"fmspc\"},{\"type\":\"tuple[]\",\"name\":\"tcbLevels\",\"components\":[{\"type\":\"uint256\",\"name\":\"pcesvn\"},{\"type\":\"uint8[]\",\"name\":\"sgxTcbCompSvnArr\"},{\"type\":\"uint8\",\"name\":\"status\"}]}]}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"context\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"tuple\",\"name\":\"ctx_\",\"components\":[{\"type\":\"bytes32\",\"name\":\"msgHash\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"}]}]},{\"type\":\"function\",\"name\":\"decimals\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint8\"}]},{\"type\":\"function\",\"name\":\"decodeCert\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"bytes\",\"name\":\"der\"},{\"type\":\"bool\",\"name\":\"isPckCert\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"success\"},{\"type\":\"tuple\",\"name\":\"cert\",\"components\":[{\"type\":\"uint256\",\"name\":\"notBefore\"},{\"type\":\"uint256\",\"name\":\"notAfter\"},{\"type\":\"bytes\",\"name\":\"serialNumber\"},{\"type\":\"bytes\",\"name\":\"tbsCertificate\"},{\"type\":\"bytes\",\"name\":\"pubKey\"},{\"type\":\"bytes\",\"name\":\"signature\"},{\"type\":\"bool\",\"name\":\"isPck\"},{\"type\":\"tuple\",\"name\":\"pck\",\"components\":[{\"type\":\"string\",\"name\":\"commonName\"},{\"type\":\"string\",\"name\":\"issuerName\"},{\"type\":\"tuple\",\"name\":\"sgxExtension\",\"components\":[{\"type\":\"string\",\"name\":\"pceid\"},{\"type\":\"string\",\"name\":\"fmspc\"},{\"type\":\"uint256\",\"name\":\"pcesvn\"},{\"type\":\"uint256[]\",\"name\":\"sgxTcbCompSvnArr\"}]}]}]}]},{\"type\":\"function\",\"name\":\"decreaseAllowance\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"spender\"},{\"type\":\"uint256\",\"name\":\"subtractedValue\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"delegate\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"delegatee\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"delegateBySig\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"delegatee\"},{\"type\":\"uint256\",\"name\":\"nonce\"},{\"type\":\"uint256\",\"name\":\"expiry\"},{\"type\":\"uint8\",\"name\":\"v\"},{\"type\":\"bytes32\",\"name\":\"r\"},{\"type\":\"bytes32\",\"name\":\"s\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"delegates\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"deleteInstances\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256[]\",\"name\":\"_ids\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"depositBond\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"_amount\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"eip712Domain\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes1\",\"name\":\"fields\"},{\"type\":\"string\",\"name\":\"name\"},{\"type\":\"string\",\"name\":\"version\"},{\"type\":\"uint256\",\"name\":\"chainId\"},{\"type\":\"address\",\"name\":\"verifyingContract\"},{\"type\":\"bytes32\",\"name\":\"salt\"},{\"type\":\"uint256[]\",\"name\":\"extensions\"}]},{\"type\":\"function\",\"name\":\"enableProvingAutoPause\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"bool\",\"name\":\"_enable\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"enableTaikoTokenAllowance\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"bool\",\"name\":\"_enable\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"failMessage\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"getAddress\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"getApproved\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"tokenId\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"getBlock\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_blockId\"}],\"outputs\":[{\"type\":\"tuple\",\"name\":\"blk_\",\"components\":[{\"type\":\"bytes32\",\"name\":\"metaHash\"},{\"type\":\"address\",\"name\":\"assignedProver\"},{\"type\":\"uint96\",\"name\":\"livenessBond\"},{\"type\":\"uint64\",\"name\":\"blockId\"},{\"type\":\"uint64\",\"name\":\"proposedAt\"},{\"type\":\"uint64\",\"name\":\"proposedIn\"},{\"type\":\"uint32\",\"name\":\"nextTransitionId\"},{\"type\":\"uint32\",\"name\":\"verifiedTransitionId\"}]}]},{\"type\":\"function\",\"name\":\"getConfig\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"tuple\",\"components\":[{\"type\":\"uint64\",\"name\":\"chainId\"},{\"type\":\"uint64\",\"name\":\"blockMaxProposals\"},{\"type\":\"uint64\",\"name\":\"blockRingBufferSize\"},{\"type\":\"uint64\",\"name\":\"maxBlocksToVerify\"},{\"type\":\"uint32\",\"name\":\"blockMaxGasLimit\"},{\"type\":\"uint96\",\"name\":\"livenessBond\"},{\"type\":\"uint8\",\"name\":\"stateRootSyncInternal\"},{\"type\":\"bool\",\"name\":\"checkEOAForCalldataDA\"}]}]},{\"type\":\"function\",\"name\":\"getLastSyncedBlock\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\",\"name\":\"blockId_\"},{\"type\":\"bytes32\",\"name\":\"blockHash_\"},{\"type\":\"bytes32\",\"name\":\"stateRoot_\"}]},{\"type\":\"function\",\"name\":\"getLastVerifiedBlock\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\",\"name\":\"blockId_\"},{\"type\":\"bytes32\",\"name\":\"blockHash_\"},{\"type\":\"bytes32\",\"name\":\"stateRoot_\"}]},{\"type\":\"function\",\"name\":\"getMessageMinGasLimit\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"dataLength\"}],\"outputs\":[{\"type\":\"uint32\"}]},{\"type\":\"function\",\"name\":\"getMinTier\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\"}],\"outputs\":[{\"type\":\"uint16\"}]},{\"type\":\"function\",\"name\":\"getPastTotalSupply\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"timepoint\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"getPastVotes\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"},{\"type\":\"uint256\",\"name\":\"timepoint\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"getSignalSlot\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"address\",\"name\":\"_app\"},{\"type\":\"bytes32\",\"name\":\"_signal\"}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"getStateVariables\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"tuple\",\"components\":[{\"type\":\"uint64\",\"name\":\"genesisHeight\"},{\"type\":\"uint64\",\"name\":\"genesisTimestamp\"},{\"type\":\"uint64\",\"name\":\"lastSyncedBlockId\"},{\"type\":\"uint64\",\"name\":\"lastSynecdAt\"}]},{\"type\":\"tuple\",\"components\":[{\"type\":\"uint64\",\"name\":\"numBlocks\"},{\"type\":\"uint64\",\"name\":\"lastVerifiedBlockId\"},{\"type\":\"bool\",\"name\":\"provingPaused\"},{\"type\":\"uint8\",\"name\":\"__reservedB1\"},{\"type\":\"uint16\",\"name\":\"__reservedB2\"},{\"type\":\"uint32\",\"name\":\"__reservedB3\"},{\"type\":\"uint64\",\"name\":\"lastUnpausedAt\"}]}]},{\"type\":\"function\",\"name\":\"getSyncedChainData\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_kind\"},{\"type\":\"uint64\",\"name\":\"_blockId\"}],\"outputs\":[{\"type\":\"uint64\",\"name\":\"blockId_\"},{\"type\":\"bytes32\",\"name\":\"chainData_\"}]},{\"type\":\"function\",\"name\":\"getTier\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"uint16\",\"name\":\"_tierId\"}],\"outputs\":[{\"type\":\"tuple\",\"components\":[{\"type\":\"bytes32\",\"name\":\"verifierName\"},{\"type\":\"uint96\",\"name\":\"validityBond\"},{\"type\":\"uint96\",\"name\":\"contestBond\"},{\"type\":\"uint24\",\"name\":\"cooldownWindow\"},{\"type\":\"uint16\",\"name\":\"provingWindow\"},{\"type\":\"uint8\",\"name\":\"maxBlocksToVerifyPerProof\"}]}]},{\"type\":\"function\",\"name\":\"getTierIds\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint16[]\",\"name\":\"tiers_\"}]},{\"type\":\"function\",\"name\":\"getTransition\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_blockId\"},{\"type\":\"uint32\",\"name\":\"_tid\"}],\"outputs\":[{\"type\":\"tuple\",\"components\":[{\"type\":\"bytes32\",\"name\":\"key\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"address\",\"name\":\"prover\"},{\"type\":\"uint96\",\"name\":\"validityBond\"},{\"type\":\"address\",\"name\":\"contester\"},{\"type\":\"uint96\",\"name\":\"contestBond\"},{\"type\":\"uint64\",\"name\":\"timestamp\"},{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"uint8\",\"name\":\"__reserved1\"}]}]},{\"type\":\"function\",\"name\":\"getTransition\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_blockId\"},{\"type\":\"bytes32\",\"name\":\"_parentHash\"}],\"outputs\":[{\"type\":\"tuple\",\"components\":[{\"type\":\"bytes32\",\"name\":\"key\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"address\",\"name\":\"prover\"},{\"type\":\"uint96\",\"name\":\"validityBond\"},{\"type\":\"address\",\"name\":\"contester\"},{\"type\":\"uint96\",\"name\":\"contestBond\"},{\"type\":\"uint64\",\"name\":\"timestamp\"},{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"uint8\",\"name\":\"__reserved1\"}]}]},{\"type\":\"function\",\"name\":\"getVerifiedBlockProver\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_blockId\"}],\"outputs\":[{\"type\":\"address\",\"name\":\"prover_\"}]},{\"type\":\"function\",\"name\":\"getVotes\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"guardianIds\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"guardian\"}],\"outputs\":[{\"type\":\"uint256\",\"name\":\"id\"}]},{\"type\":\"function\",\"name\":\"guardians\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"hashAssignment\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_assignment\",\"components\":[{\"type\":\"address\",\"name\":\"feeToken\"},{\"type\":\"uint64\",\"name\":\"expiry\"},{\"type\":\"uint64\",\"name\":\"maxBlockId\"},{\"type\":\"uint64\",\"name\":\"maxProposedIn\"},{\"type\":\"bytes32\",\"name\":\"metaHash\"},{\"type\":\"bytes32\",\"name\":\"parentMetaHash\"},{\"type\":\"tuple[]\",\"name\":\"tierFees\",\"components\":[{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"uint128\",\"name\":\"fee\"}]},{\"type\":\"bytes\",\"name\":\"signature\"}]},{\"type\":\"address\",\"name\":\"_taikoL1Address\"},{\"type\":\"address\",\"name\":\"_blockProposer\"},{\"type\":\"address\",\"name\":\"_assignedProver\"},{\"type\":\"bytes32\",\"name\":\"_blobHash\"}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"hashMessage\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"impl\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"inNonReentrant\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"increaseAllowance\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"spender\"},{\"type\":\"uint256\",\"name\":\"addedValue\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"},{\"type\":\"address\",\"name\":\"_addressManager\"},{\"type\":\"bytes32\",\"name\":\"_genesisBlockHash\"},{\"type\":\"bool\",\"name\":\"_toPause\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"},{\"type\":\"address\",\"name\":\"_addressManager\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"},{\"type\":\"address\",\"name\":\"_addressManager\"},{\"type\":\"address\",\"name\":\"_srcToken\"},{\"type\":\"uint256\",\"name\":\"_srcChainId\"},{\"type\":\"string\",\"name\":\"_symbol\"},{\"type\":\"string\",\"name\":\"_name\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"owner\"},{\"type\":\"address\",\"name\":\"sigVerifyLibAddr\"},{\"type\":\"address\",\"name\":\"pemCertLibAddr\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"},{\"type\":\"address\",\"name\":\"_addressManager\"},{\"type\":\"address\",\"name\":\"_srcToken\"},{\"type\":\"uint256\",\"name\":\"_srcChainId\"},{\"type\":\"uint8\",\"name\":\"_decimals\"},{\"type\":\"string\",\"name\":\"_symbol\"},{\"type\":\"string\",\"name\":\"_name\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init2\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"instances\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"instanceId\"}],\"outputs\":[{\"type\":\"address\",\"name\":\"addr\"},{\"type\":\"uint64\",\"name\":\"validSince\"}]},{\"type\":\"function\",\"name\":\"isApprovedForAll\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"},{\"type\":\"address\",\"name\":\"operator\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"isAuthorized\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"addr\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"authorized\"}]},{\"type\":\"function\",\"name\":\"isChainDataSynced\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_kind\"},{\"type\":\"uint64\",\"name\":\"_blockId\"},{\"type\":\"bytes32\",\"name\":\"_chainData\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"isDestChainEnabled\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"enabled_\"},{\"type\":\"address\",\"name\":\"destBridge_\"}]},{\"type\":\"function\",\"name\":\"isMessageFailed\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"bytes\",\"name\":\"_proof\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"isMessageReceived\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"bytes\",\"name\":\"_proof\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"isMessageSent\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"isSignalSent\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_app\"},{\"type\":\"bytes32\",\"name\":\"_signal\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"lastMigrationStart\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"chainId\"},{\"type\":\"address\",\"name\":\"ctoken\"}],\"outputs\":[{\"type\":\"uint256\",\"name\":\"timestamp\"}]},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"latestProofHash\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"version\"},{\"type\":\"uint256\",\"name\":\"blockId\"}],\"outputs\":[{\"type\":\"bytes32\",\"name\":\"hash\"}]},{\"type\":\"function\",\"name\":\"messageStatus\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\"}],\"outputs\":[{\"type\":\"uint8\",\"name\":\"status\"}]},{\"type\":\"function\",\"name\":\"migratingAddress\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"migratingInbound\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"minGuardians\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint32\"}]},{\"type\":\"function\",\"name\":\"mint\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_to\"},{\"type\":\"uint256\",\"name\":\"_tokenId\"},{\"type\":\"uint256\",\"name\":\"_amount\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"mint\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_account\"},{\"type\":\"uint256\",\"name\":\"_tokenId\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"mintBatch\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_to\"},{\"type\":\"uint256[]\",\"name\":\"_tokenIds\"},{\"type\":\"uint256[]\",\"name\":\"_amounts\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"name\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"name\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"string\"}]},{\"type\":\"function\",\"name\":\"nextInstanceId\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"nextMessageId\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"nonces\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"owner\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"numCheckpoints\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"}],\"outputs\":[{\"type\":\"uint32\"}]},{\"type\":\"function\",\"name\":\"numGuardians\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"onBlockProposed\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_blk\",\"components\":[{\"type\":\"bytes32\",\"name\":\"metaHash\"},{\"type\":\"address\",\"name\":\"assignedProver\"},{\"type\":\"uint96\",\"name\":\"livenessBond\"},{\"type\":\"uint64\",\"name\":\"blockId\"},{\"type\":\"uint64\",\"name\":\"proposedAt\"},{\"type\":\"uint64\",\"name\":\"proposedIn\"},{\"type\":\"uint32\",\"name\":\"nextTransitionId\"},{\"type\":\"uint32\",\"name\":\"verifiedTransitionId\"}]},{\"type\":\"tuple\",\"name\":\"_meta\",\"components\":[{\"type\":\"bytes32\",\"name\":\"l1Hash\"},{\"type\":\"bytes32\",\"name\":\"difficulty\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"bytes32\",\"name\":\"extraData\"},{\"type\":\"bytes32\",\"name\":\"depositsHash\"},{\"type\":\"address\",\"name\":\"coinbase\"},{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"uint64\",\"name\":\"timestamp\"},{\"type\":\"uint64\",\"name\":\"l1Height\"},{\"type\":\"uint16\",\"name\":\"minTier\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"bytes32\",\"name\":\"parentMetaHash\"},{\"type\":\"address\",\"name\":\"sender\"}]},{\"type\":\"bytes\",\"name\":\"_data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"onERC1155BatchReceived\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"address\"},{\"type\":\"address\"},{\"type\":\"uint256[]\"},{\"type\":\"uint256[]\"},{\"type\":\"bytes\"}],\"outputs\":[{\"type\":\"bytes4\"}]},{\"type\":\"function\",\"name\":\"onERC1155Received\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"address\"},{\"type\":\"address\"},{\"type\":\"uint256\"},{\"type\":\"uint256\"},{\"type\":\"bytes\"}],\"outputs\":[{\"type\":\"bytes4\"}]},{\"type\":\"function\",\"name\":\"onERC721Received\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"address\"},{\"type\":\"address\"},{\"type\":\"uint256\"},{\"type\":\"bytes\"}],\"outputs\":[{\"type\":\"bytes4\"}]},{\"type\":\"function\",\"name\":\"onMessageInvocation\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"bytes\",\"name\":\"_data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"onMessageRecalled\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"bytes32\",\"name\":\"_msgHash\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"owner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"ownerOf\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"tokenId\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"pause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"pauseProving\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"bool\",\"name\":\"_pause\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"pauseTaikoProving\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"paused\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"pemCertLib\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"pendingOwner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"permit\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"owner\"},{\"type\":\"address\",\"name\":\"spender\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"uint256\",\"name\":\"deadline\"},{\"type\":\"uint8\",\"name\":\"v\"},{\"type\":\"bytes32\",\"name\":\"r\"},{\"type\":\"bytes32\",\"name\":\"s\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"processMessage\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"bytes\",\"name\":\"_proof\"}],\"outputs\":[{\"type\":\"uint8\",\"name\":\"status_\"},{\"type\":\"uint8\",\"name\":\"reason_\"}]},{\"type\":\"function\",\"name\":\"proposeBlock\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"bytes\",\"name\":\"_params\"},{\"type\":\"bytes\",\"name\":\"_txList\"}],\"outputs\":[{\"type\":\"tuple\",\"name\":\"meta_\",\"components\":[{\"type\":\"bytes32\",\"name\":\"l1Hash\"},{\"type\":\"bytes32\",\"name\":\"difficulty\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"bytes32\",\"name\":\"extraData\"},{\"type\":\"bytes32\",\"name\":\"depositsHash\"},{\"type\":\"address\",\"name\":\"coinbase\"},{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"uint64\",\"name\":\"timestamp\"},{\"type\":\"uint64\",\"name\":\"l1Height\"},{\"type\":\"uint16\",\"name\":\"minTier\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"bytes32\",\"name\":\"parentMetaHash\"},{\"type\":\"address\",\"name\":\"sender\"}]},{\"type\":\"tuple[]\",\"name\":\"deposits_\",\"components\":[{\"type\":\"address\",\"name\":\"recipient\"},{\"type\":\"uint96\",\"name\":\"amount\"},{\"type\":\"uint64\",\"name\":\"id\"}]}]},{\"type\":\"function\",\"name\":\"proveBlock\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_blockId\"},{\"type\":\"bytes\",\"name\":\"_input\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"proveSignalReceived\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"address\",\"name\":\"_app\"},{\"type\":\"bytes32\",\"name\":\"_signal\"},{\"type\":\"bytes\",\"name\":\"_proof\"}],\"outputs\":[{\"type\":\"uint256\",\"name\":\"numCacheOps_\"}]},{\"type\":\"function\",\"name\":\"provingAutoPauseEnabled\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"qeIdentity\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes4\",\"name\":\"miscselect\"},{\"type\":\"bytes4\",\"name\":\"miscselectMask\"},{\"type\":\"uint16\",\"name\":\"isvprodid\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes16\",\"name\":\"attributesMask\"},{\"type\":\"bytes32\",\"name\":\"mrsigner\"}]},{\"type\":\"function\",\"name\":\"recallMessage\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"bytes\",\"name\":\"_proof\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"registerInstance\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_attestation\",\"components\":[{\"type\":\"tuple\",\"name\":\"header\",\"components\":[{\"type\":\"bytes2\",\"name\":\"version\"},{\"type\":\"bytes2\",\"name\":\"attestationKeyType\"},{\"type\":\"bytes4\",\"name\":\"teeType\"},{\"type\":\"bytes2\",\"name\":\"qeSvn\"},{\"type\":\"bytes2\",\"name\":\"pceSvn\"},{\"type\":\"bytes16\",\"name\":\"qeVendorId\"},{\"type\":\"bytes20\",\"name\":\"userData\"}]},{\"type\":\"tuple\",\"name\":\"localEnclaveReport\",\"components\":[{\"type\":\"bytes16\",\"name\":\"cpuSvn\"},{\"type\":\"bytes4\",\"name\":\"miscSelect\"},{\"type\":\"bytes28\",\"name\":\"reserved1\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes32\",\"name\":\"mrEnclave\"},{\"type\":\"bytes32\",\"name\":\"reserved2\"},{\"type\":\"bytes32\",\"name\":\"mrSigner\"},{\"type\":\"bytes\",\"name\":\"reserved3\"},{\"type\":\"uint16\",\"name\":\"isvProdId\"},{\"type\":\"uint16\",\"name\":\"isvSvn\"},{\"type\":\"bytes\",\"name\":\"reserved4\"},{\"type\":\"bytes\",\"name\":\"reportData\"}]},{\"type\":\"tuple\",\"name\":\"v3AuthData\",\"components\":[{\"type\":\"bytes\",\"name\":\"ecdsa256BitSignature\"},{\"type\":\"bytes\",\"name\":\"ecdsaAttestationKey\"},{\"type\":\"tuple\",\"name\":\"pckSignedQeReport\",\"components\":[{\"type\":\"bytes16\",\"name\":\"cpuSvn\"},{\"type\":\"bytes4\",\"name\":\"miscSelect\"},{\"type\":\"bytes28\",\"name\":\"reserved1\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes32\",\"name\":\"mrEnclave\"},{\"type\":\"bytes32\",\"name\":\"reserved2\"},{\"type\":\"bytes32\",\"name\":\"mrSigner\"},{\"type\":\"bytes\",\"name\":\"reserved3\"},{\"type\":\"uint16\",\"name\":\"isvProdId\"},{\"type\":\"uint16\",\"name\":\"isvSvn\"},{\"type\":\"bytes\",\"name\":\"reserved4\"},{\"type\":\"bytes\",\"name\":\"reportData\"}]},{\"type\":\"bytes\",\"name\":\"qeReportSignature\"},{\"type\":\"tuple\",\"name\":\"qeAuthData\",\"components\":[{\"type\":\"uint16\",\"name\":\"parsedDataSize\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"tuple\",\"name\":\"certification\",\"components\":[{\"type\":\"uint16\",\"name\":\"certType\"},{\"type\":\"uint32\",\"name\":\"certDataSize\"},{\"type\":\"bytes[3]\",\"name\":\"decodedCertDataArray\"}]}]}]}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"removeRevokedCertSerialNum\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"index\"},{\"type\":\"bytes[]\",\"name\":\"serialNumBatch\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"resolve\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"bool\",\"name\":\"_allowZeroAddress\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"resolve\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"bool\",\"name\":\"_allowZeroAddress\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"retryMessage\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"bool\",\"name\":\"_isLastAttempt\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"safeBatchTransferFrom\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256[]\",\"name\":\"ids\"},{\"type\":\"uint256[]\",\"name\":\"amounts\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"safeTransferFrom\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"id\"},{\"type\":\"uint256\",\"name\":\"amount\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"safeTransferFrom\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"tokenId\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"safeTransferFrom\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"tokenId\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"selfDelegate\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_anyToken\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"sendMessage\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash_\"},{\"type\":\"tuple\",\"name\":\"message_\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}]},{\"type\":\"function\",\"name\":\"sendSignal\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"_signal\"}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"sendToken\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_op\",\"components\":[{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"address\",\"name\":\"token\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"uint256[]\",\"name\":\"tokenIds\"},{\"type\":\"uint256[]\",\"name\":\"amounts\"}]}],\"outputs\":[{\"type\":\"tuple\",\"name\":\"message_\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}]},{\"type\":\"function\",\"name\":\"sendToken\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_op\",\"components\":[{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"address\",\"name\":\"token\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"uint256\",\"name\":\"amount\"}]}],\"outputs\":[{\"type\":\"tuple\",\"name\":\"message_\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}]},{\"type\":\"function\",\"name\":\"serialNumIsRevoked\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"idx\"},{\"type\":\"bytes\",\"name\":\"serialNum\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"revoked\"}]},{\"type\":\"function\",\"name\":\"setAddress\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"address\",\"name\":\"_newAddress\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"setApprovalForAll\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"operator\"},{\"type\":\"bool\",\"name\":\"approved\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"setGuardians\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address[]\",\"name\":\"_newGuardians\"},{\"type\":\"uint8\",\"name\":\"_minGuardians\"},{\"type\":\"bool\",\"name\":\"_clearData\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"setMrEnclave\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"_mrEnclave\"},{\"type\":\"bool\",\"name\":\"_trusted\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"setMrSigner\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"_mrSigner\"},{\"type\":\"bool\",\"name\":\"_trusted\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"sigVerifyLib\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"signalForChainData\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_kind\"},{\"type\":\"uint64\",\"name\":\"_blockId\"}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"signalForFailedMessage\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"_msgHash\"}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"source\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"},{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"splitCertificateChain\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"bytes\",\"name\":\"pemChain\"},{\"type\":\"uint256\",\"name\":\"size\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"success\"},{\"type\":\"bytes[]\",\"name\":\"certs\"}]},{\"type\":\"function\",\"name\":\"srcChainId\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"srcToken\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"state\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\",\"name\":\"__reserve1\"},{\"type\":\"tuple\",\"name\":\"slotA\",\"components\":[{\"type\":\"uint64\",\"name\":\"genesisHeight\"},{\"type\":\"uint64\",\"name\":\"genesisTimestamp\"},{\"type\":\"uint64\",\"name\":\"lastSyncedBlockId\"},{\"type\":\"uint64\",\"name\":\"lastSynecdAt\"}]},{\"type\":\"tuple\",\"name\":\"slotB\",\"components\":[{\"type\":\"uint64\",\"name\":\"numBlocks\"},{\"type\":\"uint64\",\"name\":\"lastVerifiedBlockId\"},{\"type\":\"bool\",\"name\":\"provingPaused\"},{\"type\":\"uint8\",\"name\":\"__reservedB1\"},{\"type\":\"uint16\",\"name\":\"__reservedB2\"},{\"type\":\"uint32\",\"name\":\"__reservedB3\"},{\"type\":\"uint64\",\"name\":\"lastUnpausedAt\"}]}]},{\"type\":\"function\",\"name\":\"supportsInterface\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes4\",\"name\":\"_interfaceId\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"symbol\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"string\"}]},{\"type\":\"function\",\"name\":\"symbol\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"string\"}]},{\"type\":\"function\",\"name\":\"syncChainData\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_kind\"},{\"type\":\"uint64\",\"name\":\"_blockId\"},{\"type\":\"bytes32\",\"name\":\"_chainData\"}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"tcbInfo\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"string\",\"name\":\"fmspc\"}],\"outputs\":[{\"type\":\"string\",\"name\":\"pceid\"},{\"type\":\"string\",\"name\":\"fmspc\"}]},{\"type\":\"function\",\"name\":\"toggleLocalReportCheck\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"tokenURI\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"_tokenId\"}],\"outputs\":[{\"type\":\"string\"}]},{\"type\":\"function\",\"name\":\"topBlockId\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"chainId\"},{\"type\":\"bytes32\",\"name\":\"kind\"}],\"outputs\":[{\"type\":\"uint64\",\"name\":\"blockId\"}]},{\"type\":\"function\",\"name\":\"totalSupply\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"transfer\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"amount\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"transferFrom\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"amount\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"transferFrom\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"tokenId\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"transferOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newOwner\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"trustedUserMrEnclave\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"enclave\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"trusted\"}]},{\"type\":\"function\",\"name\":\"trustedUserMrSigner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"signer\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"trusted\"}]},{\"type\":\"function\",\"name\":\"unpause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeTo\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"uri\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\"}],\"outputs\":[{\"type\":\"string\"}]},{\"type\":\"function\",\"name\":\"verifyAttestation\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"success\"}]},{\"type\":\"function\",\"name\":\"verifyBlocks\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_maxBlocksToVerify\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"verifyES256Signature\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes\",\"name\":\"tbs\"},{\"type\":\"bytes\",\"name\":\"signature\"},{\"type\":\"bytes\",\"name\":\"publicKey\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"sigValid\"}]},{\"type\":\"function\",\"name\":\"verifyParsedQuote\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"v3quote\",\"components\":[{\"type\":\"tuple\",\"name\":\"header\",\"components\":[{\"type\":\"bytes2\",\"name\":\"version\"},{\"type\":\"bytes2\",\"name\":\"attestationKeyType\"},{\"type\":\"bytes4\",\"name\":\"teeType\"},{\"type\":\"bytes2\",\"name\":\"qeSvn\"},{\"type\":\"bytes2\",\"name\":\"pceSvn\"},{\"type\":\"bytes16\",\"name\":\"qeVendorId\"},{\"type\":\"bytes20\",\"name\":\"userData\"}]},{\"type\":\"tuple\",\"name\":\"localEnclaveReport\",\"components\":[{\"type\":\"bytes16\",\"name\":\"cpuSvn\"},{\"type\":\"bytes4\",\"name\":\"miscSelect\"},{\"type\":\"bytes28\",\"name\":\"reserved1\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes32\",\"name\":\"mrEnclave\"},{\"type\":\"bytes32\",\"name\":\"reserved2\"},{\"type\":\"bytes32\",\"name\":\"mrSigner\"},{\"type\":\"bytes\",\"name\":\"reserved3\"},{\"type\":\"uint16\",\"name\":\"isvProdId\"},{\"type\":\"uint16\",\"name\":\"isvSvn\"},{\"type\":\"bytes\",\"name\":\"reserved4\"},{\"type\":\"bytes\",\"name\":\"reportData\"}]},{\"type\":\"tuple\",\"name\":\"v3AuthData\",\"components\":[{\"type\":\"bytes\",\"name\":\"ecdsa256BitSignature\"},{\"type\":\"bytes\",\"name\":\"ecdsaAttestationKey\"},{\"type\":\"tuple\",\"name\":\"pckSignedQeReport\",\"components\":[{\"type\":\"bytes16\",\"name\":\"cpuSvn\"},{\"type\":\"bytes4\",\"name\":\"miscSelect\"},{\"type\":\"bytes28\",\"name\":\"reserved1\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes32\",\"name\":\"mrEnclave\"},{\"type\":\"bytes32\",\"name\":\"reserved2\"},{\"type\":\"bytes32\",\"name\":\"mrSigner\"},{\"type\":\"bytes\",\"name\":\"reserved3\"},{\"type\":\"uint16\",\"name\":\"isvProdId\"},{\"type\":\"uint16\",\"name\":\"isvSvn\"},{\"type\":\"bytes\",\"name\":\"reserved4\"},{\"type\":\"bytes\",\"name\":\"reportData\"}]},{\"type\":\"bytes\",\"name\":\"qeReportSignature\"},{\"type\":\"tuple\",\"name\":\"qeAuthData\",\"components\":[{\"type\":\"uint16\",\"name\":\"parsedDataSize\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"tuple\",\"name\":\"certification\",\"components\":[{\"type\":\"uint16\",\"name\":\"certType\"},{\"type\":\"uint32\",\"name\":\"certDataSize\"},{\"type\":\"bytes[3]\",\"name\":\"decodedCertDataArray\"}]}]}]}],\"outputs\":[{\"type\":\"bool\"},{\"type\":\"bytes\"}]},{\"type\":\"function\",\"name\":\"verifyProof\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_ctx\",\"components\":[{\"type\":\"bytes32\",\"name\":\"metaHash\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"address\",\"name\":\"prover\"},{\"type\":\"uint64\",\"name\":\"blockId\"},{\"type\":\"bool\",\"name\":\"isContesting\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"address\",\"name\":\"msgSender\"}]},{\"type\":\"tuple\",\"components\":[{\"type\":\"bytes32\",\"name\":\"parentHash\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"bytes32\",\"name\":\"graffiti\"}]},{\"type\":\"tuple\",\"components\":[{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"verifyProof\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_ctx\",\"components\":[{\"type\":\"bytes32\",\"name\":\"metaHash\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"address\",\"name\":\"prover\"},{\"type\":\"uint64\",\"name\":\"blockId\"},{\"type\":\"bool\",\"name\":\"isContesting\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"address\",\"name\":\"msgSender\"}]},{\"type\":\"tuple\",\"name\":\"_tran\",\"components\":[{\"type\":\"bytes32\",\"name\":\"parentHash\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"bytes32\",\"name\":\"graffiti\"}]},{\"type\":\"tuple\",\"name\":\"_proof\",\"components\":[{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"verifySignalReceived\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"address\",\"name\":\"_app\"},{\"type\":\"bytes32\",\"name\":\"_signal\"},{\"type\":\"bytes\",\"name\":\"_proof\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"version\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint32\"}]},{\"type\":\"function\",\"name\":\"withdrawBond\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"_amount\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"withdrawTaikoToken\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_to\"},{\"type\":\"uint256\",\"name\":\"_amount\"}],\"outputs\":[]},{\"type\":\"constructor\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"es256Verifier\"}]}]","addresses":["0x02772b7B3a5Bea0141C993Dbb8D0733C19F46169","0x06a9Ab27c7e2255df1815E6CC0168d7755Feb19a","0x0b470dd3A0e1C41228856Fb319649E7c08f419Aa","0x10dea67478c5F8C5E2D90e5E9B26dBe60c54d800","0x11A9ebA17EbF92b40fcf9a640Ebbc47Db6fBeab0","0x33879cDF01121dc7bCe011b461e64d791aE931F2","0x39E4C1214e733639d059979079A151911e42791d","0x47bB416ee947fE4a4b655011aF7d6E3A1B80E6e9","0x537a2f0D3a5879b41BCb5A2afE2EA5c4961796F6","0x579A8d63a2Db646284CBFE31FE5082c9989E985c","0x579f40D0BE111b823962043702cabe6Aaa290780","0x67281b15aee4d6b805bc755e439abd524dd8da8d","0x8d7C954960a36a7596d7eA4945dDf891967ca8A3","0x996282cA11E5DEb6B5D122CC3B9A1FcAAD4415Ab","0x9e0a24964e5397B566c1ed39258e21aB5E35C77C","0xE3D777143Ea25A6E031d1e921F396750885f43aC","0xEf9EaA1dd30a9AA1df01c36411b5F082aA65fBaa","0xa25e645ff9897b0282e5f17d36de5bca4ec21d6e","0xaf145913EA4a56BE22E120ED9C24589659881702","0xb0f3186FC1963f774f52ff455DC86aEdD0b31F81","0xc4096E9ff1526Bd1840B65e9f45695135aC12De7","0xcc5d488073FA918cBbd73B9A523F3858C4de7372","0xd60247c6848B7Ca29eDdF63AA924E53dB6Ddd8EC"]}],"createdAt":"2024-08-27T09:44:01.744Z","subscriberId":"d1b49dd5-72bd-480e-b5d7-649ce0aadd09","name":"TaikoL1: Pause/Unpause","network":"mainnet","riskCategory":"ACCESS-CONTROL","monitorId":"d1b49dd5-72bd-480e-b5d7-649ce0aadd09","blockWatcherId":"mainnet-6","paused":false,"stackResourceId":"mystack.taiko-l-1-pause-unpause","type":"BLOCK"},{"skipABIValidation":false,"alertThreshold":null,"notifyConfig":{"severityLevel":"LOW","messageBody":"**Defender Monitor {{ sentinel.name }} Triggered**\n\n**Network**\n\n{{ sentinel.network }}\n\n**Block Hash**\n\n{{ blockHash }}\n\n**Transaction Hash**\n\n{{ transaction.transactionHash }}\n\n**Explorer Link**\n\n{{ transaction.link }}\n\n{{ matchReasonsFormatted }}","messageSubject":"Defender Monitor: Taiko Mainnet SGX Prover triggered","notifications":[{"type":"discord","sendCount":0,"notificationId":"93e8dbf2-4f87-4793-b3c3-6ff0dd6cf827"}],"timeoutMs":0},"tenantId":"0691b59e-8b53-4ae2-b874-959de8a9f2ee","addressRules":[{"conditions":[{"txConditions":[{"status":"any","expression":"status == \"failed\""}],"functionConditions":[],"eventConditions":[{"eventSignature":"InstanceAdded(uint256,address,address,uint256)","expression":null}]},{"txConditions":[{"status":"any","expression":"status == \"failed\""}],"functionConditions":[],"eventConditions":[{"eventSignature":"InstanceDeleted(uint256,address)","expression":null}]},{"txConditions":[{"status":"any","expression":"status == \"failed\""}],"functionConditions":[{"functionSignature":"verifyProof((bytes32,bytes32,address,uint64,bool,bool,address),(bytes32,bytes32,bytes32,bytes32),(uint16,bytes))","expression":null}],"eventConditions":[]}],"abi":"[{\"type\":\"event\",\"anonymous\":false,\"name\":\"AdminChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousAdmin\",\"indexed\":false},{\"type\":\"address\",\"name\":\"newAdmin\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BeaconUpgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"beacon\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Initialized\",\"inputs\":[{\"type\":\"uint8\",\"name\":\"version\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"InstanceAdded\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"id\",\"indexed\":true},{\"type\":\"address\",\"name\":\"instance\",\"indexed\":true},{\"type\":\"address\",\"name\":\"replaced\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"validSince\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"InstanceDeleted\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"id\",\"indexed\":true},{\"type\":\"address\",\"name\":\"instance\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferred\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Paused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Unpaused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Upgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"implementation\",\"indexed\":true}]},{\"type\":\"function\",\"name\":\"INSTANCE_EXPIRY\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"INSTANCE_VALIDITY_DELAY\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"addInstances\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address[]\",\"name\":\"_instances\"}],\"outputs\":[{\"type\":\"uint256[]\"}]},{\"type\":\"function\",\"name\":\"addressManager\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"addressRegistered\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"instanceAddress\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"alreadyAttested\"}]},{\"type\":\"function\",\"name\":\"deleteInstances\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256[]\",\"name\":\"_ids\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"},{\"type\":\"address\",\"name\":\"_addressManager\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"instances\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"instanceId\"}],\"outputs\":[{\"type\":\"address\",\"name\":\"addr\"},{\"type\":\"uint64\",\"name\":\"validSince\"}]},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"nextInstanceId\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"owner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"pause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"paused\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"pendingOwner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"registerInstance\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_attestation\",\"components\":[{\"type\":\"tuple\",\"name\":\"header\",\"components\":[{\"type\":\"bytes2\",\"name\":\"version\"},{\"type\":\"bytes2\",\"name\":\"attestationKeyType\"},{\"type\":\"bytes4\",\"name\":\"teeType\"},{\"type\":\"bytes2\",\"name\":\"qeSvn\"},{\"type\":\"bytes2\",\"name\":\"pceSvn\"},{\"type\":\"bytes16\",\"name\":\"qeVendorId\"},{\"type\":\"bytes20\",\"name\":\"userData\"}]},{\"type\":\"tuple\",\"name\":\"localEnclaveReport\",\"components\":[{\"type\":\"bytes16\",\"name\":\"cpuSvn\"},{\"type\":\"bytes4\",\"name\":\"miscSelect\"},{\"type\":\"bytes28\",\"name\":\"reserved1\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes32\",\"name\":\"mrEnclave\"},{\"type\":\"bytes32\",\"name\":\"reserved2\"},{\"type\":\"bytes32\",\"name\":\"mrSigner\"},{\"type\":\"bytes\",\"name\":\"reserved3\"},{\"type\":\"uint16\",\"name\":\"isvProdId\"},{\"type\":\"uint16\",\"name\":\"isvSvn\"},{\"type\":\"bytes\",\"name\":\"reserved4\"},{\"type\":\"bytes\",\"name\":\"reportData\"}]},{\"type\":\"tuple\",\"name\":\"v3AuthData\",\"components\":[{\"type\":\"bytes\",\"name\":\"ecdsa256BitSignature\"},{\"type\":\"bytes\",\"name\":\"ecdsaAttestationKey\"},{\"type\":\"tuple\",\"name\":\"pckSignedQeReport\",\"components\":[{\"type\":\"bytes16\",\"name\":\"cpuSvn\"},{\"type\":\"bytes4\",\"name\":\"miscSelect\"},{\"type\":\"bytes28\",\"name\":\"reserved1\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes32\",\"name\":\"mrEnclave\"},{\"type\":\"bytes32\",\"name\":\"reserved2\"},{\"type\":\"bytes32\",\"name\":\"mrSigner\"},{\"type\":\"bytes\",\"name\":\"reserved3\"},{\"type\":\"uint16\",\"name\":\"isvProdId\"},{\"type\":\"uint16\",\"name\":\"isvSvn\"},{\"type\":\"bytes\",\"name\":\"reserved4\"},{\"type\":\"bytes\",\"name\":\"reportData\"}]},{\"type\":\"bytes\",\"name\":\"qeReportSignature\"},{\"type\":\"tuple\",\"name\":\"qeAuthData\",\"components\":[{\"type\":\"uint16\",\"name\":\"parsedDataSize\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"tuple\",\"name\":\"certification\",\"components\":[{\"type\":\"uint16\",\"name\":\"certType\"},{\"type\":\"uint32\",\"name\":\"certDataSize\"},{\"type\":\"bytes[3]\",\"name\":\"decodedCertDataArray\"}]}]}]}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"resolve\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"bool\",\"name\":\"_allowZeroAddress\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"transferOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newOwner\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"unpause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeTo\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"verifyProof\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_ctx\",\"components\":[{\"type\":\"bytes32\",\"name\":\"metaHash\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"address\",\"name\":\"prover\"},{\"type\":\"uint64\",\"name\":\"blockId\"},{\"type\":\"bool\",\"name\":\"isContesting\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"address\",\"name\":\"msgSender\"}]},{\"type\":\"tuple\",\"name\":\"_tran\",\"components\":[{\"type\":\"bytes32\",\"name\":\"parentHash\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"bytes32\",\"name\":\"graffiti\"}]},{\"type\":\"tuple\",\"name\":\"_proof\",\"components\":[{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[]}]","addresses":["0xb0f3186FC1963f774f52ff455DC86aEdD0b31F81"]}],"createdAt":"2024-05-02T14:09:42.804Z","subscriberId":"d49a2a9b-268d-4d30-9553-ec55ed952d87","name":"Taiko Mainnet SGX Prover","network":"mainnet","riskCategory":"TECHNICAL","monitorId":"d49a2a9b-268d-4d30-9553-ec55ed952d87","blockWatcherId":"mainnet-1","paused":false,"stackResourceId":"mystack.taiko-mainnet-sgx-prover","type":"BLOCK"},{"skipABIValidation":false,"alertThreshold":null,"notifyConfig":{"severityLevel":"HIGH","messageBody":"**Defender Monitor {{ sentinel.name }} Triggered**\n\n**Network**\n\n{{ sentinel.network }}\n\n**Block Hash**\n\n{{ blockHash }}\n\n**Transaction Hash**\n\n{{ transaction.transactionHash }}\n\n**Explorer Link**\n\n{{ transaction.link }}\n\n{{ matchReasonsFormatted }}","messageSubject":"Defender Monitor: Taiko Mainnet Address Managers triggered","notifications":[{"type":"discord","sendCount":0,"notificationId":"93e8dbf2-4f87-4793-b3c3-6ff0dd6cf827"}],"timeoutMs":0},"tenantId":"0691b59e-8b53-4ae2-b874-959de8a9f2ee","addressRules":[{"conditions":[{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"AddressSet(uint64,bytes32,address,address)","expression":null}]}],"abi":"[{\"type\":\"event\",\"anonymous\":false,\"name\":\"AddressSet\",\"inputs\":[{\"type\":\"uint64\",\"name\":\"chainId\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"name\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newAddress\",\"indexed\":false},{\"type\":\"address\",\"name\":\"oldAddress\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"AdminChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousAdmin\",\"indexed\":false},{\"type\":\"address\",\"name\":\"newAdmin\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BeaconUpgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"beacon\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Initialized\",\"inputs\":[{\"type\":\"uint8\",\"name\":\"version\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferred\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Paused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Unpaused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Upgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"implementation\",\"indexed\":true}]},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"addressManager\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"getAddress\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"owner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"pause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"paused\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"pendingOwner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"resolve\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"bool\",\"name\":\"_allowZeroAddress\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"setAddress\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"address\",\"name\":\"_newAddress\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"transferOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newOwner\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"unpause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeTo\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]}]","addresses":["0xEf9EaA1dd30a9AA1df01c36411b5F082aA65fBaa","0x579f40D0BE111b823962043702cabe6Aaa290780"]}],"createdAt":"2024-05-02T14:00:18.874Z","subscriberId":"3919cb83-487f-4432-88fa-33bbe4361fce","name":"Taiko Mainnet Address Managers","network":"mainnet","riskCategory":"ACCESS-CONTROL","monitorId":"3919cb83-487f-4432-88fa-33bbe4361fce","blockWatcherId":"mainnet-1","paused":false,"stackResourceId":"mystack.taiko-mainnet-address-managers","type":"BLOCK"},{"skipABIValidation":false,"alertThreshold":null,"notifyConfig":{"severityLevel":"HIGH","messageBody":"**Defender Monitor {{ sentinel.name }} Triggered**\n\n**Network**\n\n{{ sentinel.network }}\n\n**Block Hash**\n\n{{ blockHash }}\n\n**Transaction Hash**\n\n{{ transaction.transactionHash }}\n\n**Explorer Link**\n\n{{ transaction.link }}\n\n{{ matchReasonsFormatted }}","messageSubject":"Defender Monitor: Taiko Mainnet Essential Contracts triggered","notifications":[{"type":"discord","sendCount":0,"notificationId":"93e8dbf2-4f87-4793-b3c3-6ff0dd6cf827"}],"timeoutMs":0},"tenantId":"0691b59e-8b53-4ae2-b874-959de8a9f2ee","addressRules":[{"conditions":[{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"AdminChanged(address,address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"BeaconUpgraded(address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"Initialized(uint8)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"OwnershipTransferStarted(address,address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"OwnershipTransferred(address,address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"Paused(address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"Unpaused(address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"Upgraded(address)","expression":null}]}],"abi":"[{\"type\":\"event\",\"anonymous\":false,\"name\":\"AdminChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousAdmin\",\"indexed\":false},{\"type\":\"address\",\"name\":\"newAdmin\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BeaconUpgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"beacon\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Initialized\",\"inputs\":[{\"type\":\"uint8\",\"name\":\"version\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferred\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Paused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Unpaused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Upgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"implementation\",\"indexed\":true}]},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"addressManager\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"owner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"pause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"paused\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"pendingOwner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"resolve\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"bool\",\"name\":\"_allowZeroAddress\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"transferOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newOwner\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"unpause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeTo\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]}]","addresses":["0xEf9EaA1dd30a9AA1df01c36411b5F082aA65fBaa","0x10dea67478c5F8C5E2D90e5E9B26dBe60c54d800","0x9e0a24964e5397B566c1ed39258e21aB5E35C77C","0xd60247c6848B7Ca29eDdF63AA924E53dB6Ddd8EC","0x996282cA11E5DEb6B5D122CC3B9A1FcAAD4415Ab","0x0b470dd3A0e1C41228856Fb319649E7c08f419Aa","0x0b470dd3A0e1C41228856Fb319649E7c08f419Aa","0xaf145913EA4a56BE22E120ED9C24589659881702","0x579f40D0BE111b823962043702cabe6Aaa290780","0x06a9Ab27c7e2255df1815E6CC0168d7755Feb19a","0x537a2f0D3a5879b41BCb5A2afE2EA5c4961796F6","0x33879cDF01121dc7bCe011b461e64d791aE931F2","0xb0f3186FC1963f774f52ff455DC86aEdD0b31F81","0x579A8d63a2Db646284CBFE31FE5082c9989E985c","0xE3D777143Ea25A6E031d1e921F396750885f43aC","0x8d7C954960a36a7596d7eA4945dDf891967ca8A3"]}],"createdAt":"2024-05-02T13:49:54.192Z","subscriberId":"67a53521-3d4a-4de4-92ab-ede82cc45644","name":"Taiko Mainnet Essential Contracts","network":"mainnet","riskCategory":"ACCESS-CONTROL","monitorId":"67a53521-3d4a-4de4-92ab-ede82cc45644","blockWatcherId":"mainnet-1","paused":false,"stackResourceId":"mystack.taiko-mainnet-essential-contracts","type":"BLOCK"}]},"actions":{"removed":[],"created":[],"updated":[{"autotaskId":"9fc30210-b551-49df-9836-b50fb6d2aaed","actionId":"9fc30210-b551-49df-9836-b50fb6d2aaed","name":"SGXVerifier: VerifyProof failure Alert","paused":false,"trigger":{"cron":null,"frequencyMinutes":5,"type":"schedule"},"codeDigest":"pRCwGRE9kcevXfVaEyCq9VP+R/9tEZp4EwZEM8/9B4Y=","stackResourceId":"mystack.sgx-verifier-verify-proof-failure-alert","runtime":"nodejs20.x","dependenciesVersion":"v2024-08-21","encodedZippedCode":"UEsDBAoAAAAAAAAAQVAKQDUd+QsAAPkLAAAIAAAAaW5kZXguanNjb25zdCB7IGV0aGVycyB9ID0gcmVxdWlyZSgiZXRoZXJzIik7CmNvbnN0IHsgRGVmZW5kZXIgfSA9IHJlcXVpcmUoIkBvcGVuemVwcGVsaW4vZGVmZW5kZXItc2RrIik7Cgpjb25zdCB2ZXJpZnlQcm9vZlNpZ25hdHVyZSA9ICJ2ZXJpZnlQcm9vZihhZGRyZXNzLGJ5dGVzMzIsYnl0ZXMzMikiOwpjb25zdCB2ZXJpZnlQcm9vZlNlbGVjdG9yID0gZXRoZXJzLnV0aWxzCiAgLmtlY2NhazI1NihldGhlcnMudXRpbHMudG9VdGY4Qnl0ZXModmVyaWZ5UHJvb2ZTaWduYXR1cmUpKQogIC5zdWJzdHJpbmcoMCwgMTApOwoKZnVuY3Rpb24gYWxlcnRPcmcobm90aWZpY2F0aW9uQ2xpZW50LCBtZXNzYWdlKSB7CiAgbm90aWZpY2F0aW9uQ2xpZW50LnNlbmQoewogICAgY2hhbm5lbEFsaWFzOiAiZGlzY29yZF9ibG9ja3MiLAogICAgc3ViamVjdDogIuKaoO+4jyBTR1hWZXJpZmllcjogdmVyaWZ5UHJvb2YgRmFpbHVyZSBBbGVydCIsCiAgICBtZXNzYWdlLAogIH0pOwp9CgpmdW5jdGlvbiBjcmVhdGVQcm92aWRlcihhcGlLZXksIGFwaVNlY3JldCwgcmVsYXllckFwaUtleSwgcmVsYXllckFwaVNlY3JldCkgewogIGNvbnN0IGNsaWVudCA9IG5ldyBEZWZlbmRlcih7CiAgICBhcGlLZXksCiAgICBhcGlTZWNyZXQsCiAgICByZWxheWVyQXBpS2V5LAogICAgcmVsYXllckFwaVNlY3JldCwKICB9KTsKICByZXR1cm4gY2xpZW50LnJlbGF5U2lnbmVyLmdldFByb3ZpZGVyKCk7Cn0KCmFzeW5jIGZ1bmN0aW9uIGdldExhdGVzdEJsb2NrTnVtYmVyKHByb3ZpZGVyKSB7CiAgY29uc3QgY3VycmVudEJsb2NrID0gYXdhaXQgcHJvdmlkZXIuZ2V0QmxvY2soImxhdGVzdCIpOwogIHJldHVybiBjdXJyZW50QmxvY2subnVtYmVyOwp9Cgphc3luYyBmdW5jdGlvbiBjYWxjdWxhdGVCbG9ja1RpbWUocHJvdmlkZXIpIHsKICBjb25zdCBsYXRlc3RCbG9jayA9IGF3YWl0IHByb3ZpZGVyLmdldEJsb2NrKCJsYXRlc3QiKTsKICBjb25zdCBwcmV2aW91c0Jsb2NrID0gYXdhaXQgcHJvdmlkZXIuZ2V0QmxvY2sobGF0ZXN0QmxvY2subnVtYmVyIC0gMTAwKTsKCiAgY29uc3QgdGltZURpZmYgPSBsYXRlc3RCbG9jay50aW1lc3RhbXAgLSBwcmV2aW91c0Jsb2NrLnRpbWVzdGFtcDsKICBjb25zdCBibG9ja0RpZmYgPSBsYXRlc3RCbG9jay5udW1iZXIgLSBwcmV2aW91c0Jsb2NrLm51bWJlcjsKCiAgY29uc3QgYmxvY2tUaW1lID0gdGltZURpZmYgLyBibG9ja0RpZmY7CiAgcmV0dXJuIGJsb2NrVGltZTsKfQoKYXN5bmMgZnVuY3Rpb24gY2FsY3VsYXRlQmxvY2tSYW5nZShwcm92aWRlciwgaG91cnMgPSAyNCkgewogIGNvbnN0IGN1cnJlbnRCbG9ja051bWJlciA9IGF3YWl0IGdldExhdGVzdEJsb2NrTnVtYmVyKHByb3ZpZGVyKTsKICBjb25zdCBibG9ja1RpbWVJblNlY29uZHMgPSBhd2FpdCBjYWxjdWxhdGVCbG9ja1RpbWUocHJvdmlkZXIpOwogIGNvbnN0IGJsb2Nrc0luVGltZUZyYW1lID0gTWF0aC5mbG9vcigoaG91cnMgKiA2MCAqIDYwKSAvIGJsb2NrVGltZUluU2Vjb25kcyk7CgogIGNvbnN0IGZyb21CbG9jayA9IGN1cnJlbnRCbG9ja051bWJlciAtIGJsb2Nrc0luVGltZUZyYW1lOwogIGNvbnN0IHRvQmxvY2sgPSBjdXJyZW50QmxvY2tOdW1iZXI7CgogIGNvbnNvbGUubG9nKGBDYWxjdWxhdGVkIGJsb2NrIHJhbmdlOiBmcm9tICR7ZnJvbUJsb2NrfSB0byAke3RvQmxvY2t9YCk7CgogIHJldHVybiB7IGZyb21CbG9jaywgdG9CbG9jayB9Owp9Cgphc3luYyBmdW5jdGlvbiBtb25pdG9yVHJhbnNhY3Rpb25zKAogIHByb3ZpZGVyLAogIGNvbnRyYWN0QWRkcmVzcywKICBub3RpZmljYXRpb25DbGllbnQsCiAgaG91cnMsCikgewogIGNvbnN0IHsgZnJvbUJsb2NrLCB0b0Jsb2NrIH0gPSBhd2FpdCBjYWxjdWxhdGVCbG9ja1JhbmdlKHByb3ZpZGVyLCBob3Vycyk7CgogIGNvbnN0IGxvZ3MgPSBhd2FpdCBwcm92aWRlci5nZXRMb2dzKHsKICAgIGZyb21CbG9jaywKICAgIHRvQmxvY2ssCiAgICBhZGRyZXNzOiBjb250cmFjdEFkZHJlc3MsCiAgfSk7CgogIGZvciAoY29uc3QgbG9nIG9mIGxvZ3MpIHsKICAgIGNvbnN0IHR4ID0gYXdhaXQgcHJvdmlkZXIuZ2V0VHJhbnNhY3Rpb24obG9nLnRyYW5zYWN0aW9uSGFzaCk7CgogICAgaWYgKHR4LmRhdGEuc3RhcnRzV2l0aCh2ZXJpZnlQcm9vZlNlbGVjdG9yKSkgewogICAgICBjb25zdCB0eFJlY2VpcHQgPSBhd2FpdCBwcm92aWRlci5nZXRUcmFuc2FjdGlvblJlY2VpcHQoCiAgICAgICAgbG9nLnRyYW5zYWN0aW9uSGFzaCwKICAgICAgKTsKCiAgICAgIGlmICh0eFJlY2VpcHQgJiYgdHhSZWNlaXB0LnN0YXR1cyA9PT0gMCkgewogICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBgCiAgICAgICAgICBBIGZhaWxlZCB2ZXJpZnlQcm9vZiB0cmFuc2FjdGlvbiB3YXMgZGV0ZWN0ZWQuCiAgICAgICAgICAtIENvbnRyYWN0IEFkZHJlc3M6ICR7bG9nLmFkZHJlc3N9CiAgICAgICAgICAtIFRyYW5zYWN0aW9uIEhhc2g6ICR7bG9nLnRyYW5zYWN0aW9uSGFzaH0KICAgICAgICAgIC0gQmxvY2sgTnVtYmVyOiAke3R4UmVjZWlwdC5ibG9ja051bWJlcn0KICAgICAgICBgOwogICAgICAgIGFsZXJ0T3JnKG5vdGlmaWNhdGlvbkNsaWVudCwgbWVzc2FnZSk7CiAgICAgIH0KICAgIH0KICB9Cn0KCmV4cG9ydHMuaGFuZGxlciA9IGFzeW5jIGZ1bmN0aW9uIChldmVudCwgY29udGV4dCkgewogIGNvbnN0IHsgbm90aWZpY2F0aW9uQ2xpZW50IH0gPSBjb250ZXh0OwogIGNvbnN0IHsgYXBpS2V5LCBhcGlTZWNyZXQsIHRhaWtvTDFBcGlLZXksIHRhaWtvTDFBcGlTZWNyZXQgfSA9IGV2ZW50LnNlY3JldHM7CgogIGNvbnN0IGNvbnRyYWN0QWRkcmVzcyA9ICIweGIwZjMxODZGQzE5NjNmNzc0ZjUyZmY0NTVEQzg2YUVkRDBiMzFGODEiOwoKICBjb25zdCBwcm92aWRlciA9IGNyZWF0ZVByb3ZpZGVyKAogICAgYXBpS2V5LAogICAgYXBpU2VjcmV0LAogICAgdGFpa29MMUFwaUtleSwKICAgIHRhaWtvTDFBcGlTZWNyZXQsCiAgKTsKCiAgYXdhaXQgbW9uaXRvclRyYW5zYWN0aW9ucyhwcm92aWRlciwgY29udHJhY3RBZGRyZXNzLCBub3RpZmljYXRpb25DbGllbnQsIDI0KTsKCiAgcmV0dXJuIHRydWU7Cn07ClBLAQIUAAoAAAAAAAAAQVAKQDUd+QsAAPkLAAAIAAAAAAAAAAAAAAAAAAAAAABpbmRleC5qc1BLBQYAAAAAAQABADYAAAAfDAAAAAA="},{"autotaskId":"f3e4b61d-acb1-4735-9600-4f78dc407fac","actionId":"f3e4b61d-acb1-4735-9600-4f78dc407fac","name":"TaikoL1: CalldataTxList Count","paused":false,"trigger":{"cron":null,"frequencyMinutes":1440,"type":"schedule"},"codeDigest":"YFe2ZhQm4yRXmMxU51MdCbiCEMWnSNqZJyNxQE6d6BY=","stackResourceId":"mystack.taiko-l-1-calldata-tx-list-count","runtime":"nodejs20.x","dependenciesVersion":"v2024-08-21","encodedZippedCode":"UEsDBAoAAAAAAAAAQVC8yOSKFQ0AABUNAAAIAAAAaW5kZXguanNjb25zdCB7IGV0aGVycyB9ID0gcmVxdWlyZSgiZXRoZXJzIik7CmNvbnN0IHsgRGVmZW5kZXIgfSA9IHJlcXVpcmUoIkBvcGVuemVwcGVsaW4vZGVmZW5kZXItc2RrIik7Cgpjb25zdCBBQkkgPSBbCiAgewogICAgYW5vbnltb3VzOiBmYWxzZSwKICAgIGlucHV0czogWwogICAgICB7CiAgICAgICAgaW5kZXhlZDogdHJ1ZSwKICAgICAgICBpbnRlcm5hbFR5cGU6ICJ1aW50MjU2IiwKICAgICAgICBuYW1lOiAiYmxvY2tJZCIsCiAgICAgICAgdHlwZTogInVpbnQyNTYiLAogICAgICB9LAogICAgICB7CiAgICAgICAgaW5kZXhlZDogZmFsc2UsCiAgICAgICAgaW50ZXJuYWxUeXBlOiAiYnl0ZXMiLAogICAgICAgIG5hbWU6ICJ0eExpc3QiLAogICAgICAgIHR5cGU6ICJieXRlcyIsCiAgICAgIH0sCiAgICBdLAogICAgbmFtZTogIkNhbGxkYXRhVHhMaXN0IiwKICAgIHR5cGU6ICJldmVudCIsCiAgfSwKXTsKCmZ1bmN0aW9uIGFsZXJ0T3JnKG5vdGlmaWNhdGlvbkNsaWVudCwgbWVzc2FnZSkgewogIG5vdGlmaWNhdGlvbkNsaWVudC5zZW5kKHsKICAgIGNoYW5uZWxBbGlhczogImRpc2NvcmRfYmxvY2tzIiwKICAgIHN1YmplY3Q6ICLihLnvuI8gVGFpa29MMTogQ2FsbGRhdGFUeExpc3QgQ291bnQiLAogICAgbWVzc2FnZSwKICB9KTsKfQoKYXN5bmMgZnVuY3Rpb24gZ2V0TGF0ZXN0QmxvY2tOdW1iZXIocHJvdmlkZXIpIHsKICBjb25zdCBjdXJyZW50QmxvY2sgPSBhd2FpdCBwcm92aWRlci5nZXRCbG9jaygibGF0ZXN0Iik7CiAgcmV0dXJuIGN1cnJlbnRCbG9jay5udW1iZXI7Cn0KCmFzeW5jIGZ1bmN0aW9uIGNhbGN1bGF0ZUJsb2NrVGltZShwcm92aWRlcikgewogIGNvbnN0IGxhdGVzdEJsb2NrID0gYXdhaXQgcHJvdmlkZXIuZ2V0QmxvY2soImxhdGVzdCIpOwogIGNvbnN0IHByZXZpb3VzQmxvY2sgPSBhd2FpdCBwcm92aWRlci5nZXRCbG9jayhsYXRlc3RCbG9jay5udW1iZXIgLSAxMDApOwoKICBjb25zdCB0aW1lRGlmZiA9IGxhdGVzdEJsb2NrLnRpbWVzdGFtcCAtIHByZXZpb3VzQmxvY2sudGltZXN0YW1wOwogIGNvbnN0IGJsb2NrRGlmZiA9IGxhdGVzdEJsb2NrLm51bWJlciAtIHByZXZpb3VzQmxvY2subnVtYmVyOwoKICBjb25zdCBibG9ja1RpbWUgPSB0aW1lRGlmZiAvIGJsb2NrRGlmZjsKICByZXR1cm4gYmxvY2tUaW1lOwp9Cgphc3luYyBmdW5jdGlvbiBjYWxjdWxhdGVCbG9ja1JhbmdlKHByb3ZpZGVyKSB7CiAgY29uc3QgY3VycmVudEJsb2NrTnVtYmVyID0gYXdhaXQgZ2V0TGF0ZXN0QmxvY2tOdW1iZXIocHJvdmlkZXIpOwogIGNvbnN0IGJsb2NrVGltZUluU2Vjb25kcyA9IGF3YWl0IGNhbGN1bGF0ZUJsb2NrVGltZShwcm92aWRlcik7CiAgY29uc3QgYmxvY2tzSW4yNEhvdXJzID0gTWF0aC5mbG9vcigoMjQgKiA2MCAqIDYwKSAvIGJsb2NrVGltZUluU2Vjb25kcyk7IC8vIDI0IGhvdXJzIGluIHNlY29uZHMKCiAgY29uc3QgZnJvbUJsb2NrID0gY3VycmVudEJsb2NrTnVtYmVyIC0gYmxvY2tzSW4yNEhvdXJzOwogIGNvbnN0IHRvQmxvY2sgPSBjdXJyZW50QmxvY2tOdW1iZXI7CgogIGNvbnNvbGUubG9nKGBDYWxjdWxhdGVkIGJsb2NrIHJhbmdlOiBmcm9tICR7ZnJvbUJsb2NrfSB0byAke3RvQmxvY2t9YCk7CgogIHJldHVybiB7IGZyb21CbG9jaywgdG9CbG9jayB9Owp9Cgphc3luYyBmdW5jdGlvbiBmZXRjaExvZ3NGcm9tTDEoCiAgZXZlbnROYW1lcywKICBmcm9tQmxvY2ssCiAgdG9CbG9jaywKICBhZGRyZXNzLAogIGFiaSwKICBwcm92aWRlciwKKSB7CiAgY29uc3QgaWZhY2UgPSBuZXcgZXRoZXJzLnV0aWxzLkludGVyZmFjZShhYmkpOwogIGNvbnN0IGV2ZW50VG9waWNzID0gZXZlbnROYW1lcy5tYXAoKGV2ZW50TmFtZSkgPT4KICAgIGlmYWNlLmdldEV2ZW50VG9waWMoZXZlbnROYW1lKSwKICApOwoKICBjb25zb2xlLmxvZyhgZXZlbnRUb3BpY3M6ICR7ZXZlbnRUb3BpY3N9YCk7CgogIHRyeSB7CiAgICBjb25zdCBsb2dzID0gYXdhaXQgcHJvdmlkZXIuZ2V0TG9ncyh7CiAgICAgIGFkZHJlc3MsCiAgICAgIGZyb21CbG9jaywKICAgICAgdG9CbG9jaywKICAgICAgdG9waWNzOiBbZXZlbnRUb3BpY3NdLAogICAgfSk7CiAgICBjb25zb2xlLmxvZyhgRmV0Y2hlZCBsb2dzOiAke2xvZ3MubGVuZ3RofWApOwogICAgcmV0dXJuIGxvZ3MubWFwKChsb2cpID0+IHsKICAgICAgY29uc3QgcGFyc2VkTG9nID0gaWZhY2UucGFyc2VMb2cobG9nKTsKICAgICAgY29uc29sZS5sb2coYFBhcnNlZCBsb2c6ICR7SlNPTi5zdHJpbmdpZnkocGFyc2VkTG9nKX1gKTsKICAgICAgcmV0dXJuIHBhcnNlZExvZzsKICAgIH0pOwogIH0gY2F0Y2ggKGVycm9yKSB7CiAgICBjb25zb2xlLmVycm9yKCJFcnJvciBmZXRjaGluZyBMMSBsb2dzOiIsIGVycm9yKTsKICAgIHJldHVybiBbXTsKICB9Cn0KCmZ1bmN0aW9uIGNyZWF0ZVByb3ZpZGVyKGFwaUtleSwgYXBpU2VjcmV0LCByZWxheWVyQXBpS2V5LCByZWxheWVyQXBpU2VjcmV0KSB7CiAgY29uc3QgY2xpZW50ID0gbmV3IERlZmVuZGVyKHsKICAgIGFwaUtleSwKICAgIGFwaVNlY3JldCwKICAgIHJlbGF5ZXJBcGlLZXksCiAgICByZWxheWVyQXBpU2VjcmV0LAogIH0pOwoKICByZXR1cm4gY2xpZW50LnJlbGF5U2lnbmVyLmdldFByb3ZpZGVyKCk7Cn0KCmV4cG9ydHMuaGFuZGxlciA9IGFzeW5jIGZ1bmN0aW9uIChldmVudCwgY29udGV4dCkgewogIGNvbnN0IHsgbm90aWZpY2F0aW9uQ2xpZW50IH0gPSBjb250ZXh0OwogIGNvbnN0IHsgYXBpS2V5LCBhcGlTZWNyZXQsIHRhaWtvTDFBcGlLZXksIHRhaWtvTDFBcGlTZWNyZXQgfSA9IGV2ZW50LnNlY3JldHM7CgogIGNvbnN0IHRhaWtvTDFQcm92aWRlciA9IGNyZWF0ZVByb3ZpZGVyKAogICAgYXBpS2V5LAogICAgYXBpU2VjcmV0LAogICAgdGFpa29MMUFwaUtleSwKICAgIHRhaWtvTDFBcGlTZWNyZXQsCiAgKTsKCiAgY29uc3QgeyBmcm9tQmxvY2ssIHRvQmxvY2sgfSA9IGF3YWl0IGNhbGN1bGF0ZUJsb2NrUmFuZ2UodGFpa29MMVByb3ZpZGVyKTsKCiAgY29uc3QgbG9ncyA9IGF3YWl0IGZldGNoTG9nc0Zyb21MMSgKICAgIFsiQ2FsbGRhdGFUeExpc3QiXSwKICAgIGZyb21CbG9jaywKICAgIHRvQmxvY2ssCiAgICAiMHgwNmE5QWIyN2M3ZTIyNTVkZjE4MTVFNkNDMDE2OGQ3NzU1RmViMTlhIiwKICAgIEFCSSwKICAgIHRhaWtvTDFQcm92aWRlciwKICApOwoKICBpZiAobG9ncy5sZW5ndGggPiAwKSB7CiAgICBhbGVydE9yZygKICAgICAgbm90aWZpY2F0aW9uQ2xpZW50LAogICAgICBgRGV0ZWN0ZWQgJHtsb2dzLmxlbmd0aH0gQ2FsbGRhdGFUeExpc3QgZXZlbnRzIGluIHRoZSBsYXN0IDI0IGhvdXJzIG9uIFRhaWtvTDEhYCwKICAgICk7CiAgfQoKICByZXR1cm4gdHJ1ZTsKfTsKUEsBAhQACgAAAAAAAABBULzI5IoVDQAAFQ0AAAgAAAAAAAAAAAAAAAAAAAAAAGluZGV4LmpzUEsFBgAAAAABAAEANgAAADsNAAAAAA=="},{"autotaskId":"4dba76e1-18d4-4757-b8d3-4d3a8e866625","actionId":"4dba76e1-18d4-4757-b8d3-4d3a8e866625","name":"GuardianProver: ProvingAutoPauseEnabled Alert","paused":false,"trigger":{"cron":null,"frequencyMinutes":4,"type":"schedule"},"codeDigest":"lTr+Hs0WWoe7JBOzEADRpJuTIzc2cvRze6fHvaX5zxE=","stackResourceId":"mystack.guardian-prover-proving-auto-pause-enabled-alert","runtime":"nodejs20.x","dependenciesVersion":"v2024-08-21","encodedZippedCode":"UEsDBAoAAAAAAAAAQVCluHKrdgwAAHYMAAAIAAAAaW5kZXguanNjb25zdCB7IGV0aGVycyB9ID0gcmVxdWlyZSgiZXRoZXJzIik7CmNvbnN0IHsgRGVmZW5kZXIgfSA9IHJlcXVpcmUoIkBvcGVuemVwcGVsaW4vZGVmZW5kZXItc2RrIik7Cgpjb25zdCBBQkkgPSBbCiAgewogICAgYW5vbnltb3VzOiBmYWxzZSwKICAgIGlucHV0czogWwogICAgICB7CiAgICAgICAgaW5kZXhlZDogdHJ1ZSwKICAgICAgICBpbnRlcm5hbFR5cGU6ICJib29sIiwKICAgICAgICBuYW1lOiAiZW5hYmxlZCIsCiAgICAgICAgdHlwZTogImJvb2wiLAogICAgICB9LAogICAgXSwKICAgIG5hbWU6ICJQcm92aW5nQXV0b1BhdXNlRW5hYmxlZCIsCiAgICB0eXBlOiAiZXZlbnQiLAogIH0sCl07CgpmdW5jdGlvbiBhbGVydE9yZyhub3RpZmljYXRpb25DbGllbnQsIG1lc3NhZ2UpIHsKICBub3RpZmljYXRpb25DbGllbnQuc2VuZCh7CiAgICBjaGFubmVsQWxpYXM6ICJkaXNjb3JkX2NvbmZpZ3MiLAogICAgc3ViamVjdDogIuKaoO+4jyBHdWFyZGlhblByb3ZlcjogUHJvdmluZ0F1dG9QYXVzZUVuYWJsZWQgQWxlcnQiLAogICAgbWVzc2FnZSwKICB9KTsKICBub3RpZmljYXRpb25DbGllbnQuc2VuZCh7CiAgICBjaGFubmVsQWxpYXM6ICJ0Z190YWlrb19ndWFyZGlhbnMiLAogICAgc3ViamVjdDogIuKaoO+4jyBHdWFyZGlhblByb3ZlcjogUHJvdmluZ0F1dG9QYXVzZUVuYWJsZWQgQWxlcnQiLAogICAgbWVzc2FnZSwKICB9KTsKfQoKYXN5bmMgZnVuY3Rpb24gZ2V0TGF0ZXN0QmxvY2tOdW1iZXIocHJvdmlkZXIpIHsKICBjb25zdCBjdXJyZW50QmxvY2sgPSBhd2FpdCBwcm92aWRlci5nZXRCbG9jaygibGF0ZXN0Iik7CiAgcmV0dXJuIGN1cnJlbnRCbG9jay5udW1iZXI7Cn0KCmFzeW5jIGZ1bmN0aW9uIGZldGNoTG9nc0Zyb21MMSgKICBldmVudE5hbWUsCiAgZnJvbUJsb2NrLAogIHRvQmxvY2ssCiAgYWRkcmVzcywKICBhYmksCiAgcHJvdmlkZXIsCikgewogIGNvbnN0IGlmYWNlID0gbmV3IGV0aGVycy51dGlscy5JbnRlcmZhY2UoYWJpKTsKICBjb25zdCBldmVudFRvcGljID0gaWZhY2UuZ2V0RXZlbnRUb3BpYyhldmVudE5hbWUpOwoKICB0cnkgewogICAgY29uc3QgbG9ncyA9IGF3YWl0IHByb3ZpZGVyLmdldExvZ3MoewogICAgICBhZGRyZXNzLAogICAgICBmcm9tQmxvY2ssCiAgICAgIHRvQmxvY2ssCiAgICAgIHRvcGljczogW2V2ZW50VG9waWNdLAogICAgfSk7CgogICAgcmV0dXJuIGxvZ3MubWFwKChsb2cpID0+CiAgICAgIGlmYWNlLmRlY29kZUV2ZW50TG9nKGV2ZW50TmFtZSwgbG9nLmRhdGEsIGxvZy50b3BpY3MpLAogICAgKTsKICB9IGNhdGNoIChlcnJvcikgewogICAgY29uc29sZS5lcnJvcihgRXJyb3IgZmV0Y2hpbmcgbG9ncyBmb3IgJHtldmVudE5hbWV9OmAsIGVycm9yKTsKICAgIHJldHVybiBbXTsKICB9Cn0KCmZ1bmN0aW9uIGNyZWF0ZVByb3ZpZGVyKGFwaUtleSwgYXBpU2VjcmV0LCByZWxheWVyQXBpS2V5LCByZWxheWVyQXBpU2VjcmV0KSB7CiAgY29uc3QgY2xpZW50ID0gbmV3IERlZmVuZGVyKHsKICAgIGFwaUtleSwKICAgIGFwaVNlY3JldCwKICAgIHJlbGF5ZXJBcGlLZXksCiAgICByZWxheWVyQXBpU2VjcmV0LAogIH0pOwoKICByZXR1cm4gY2xpZW50LnJlbGF5U2lnbmVyLmdldFByb3ZpZGVyKCk7Cn0KCmFzeW5jIGZ1bmN0aW9uIGNhbGN1bGF0ZUJsb2NrVGltZShwcm92aWRlcikgewogIGNvbnN0IGxhdGVzdEJsb2NrID0gYXdhaXQgcHJvdmlkZXIuZ2V0QmxvY2soImxhdGVzdCIpOwogIGNvbnN0IHByZXZpb3VzQmxvY2sgPSBhd2FpdCBwcm92aWRlci5nZXRCbG9jayhsYXRlc3RCbG9jay5udW1iZXIgLSAxMDApOwoKICBjb25zdCB0aW1lRGlmZiA9IGxhdGVzdEJsb2NrLnRpbWVzdGFtcCAtIHByZXZpb3VzQmxvY2sudGltZXN0YW1wOwogIGNvbnN0IGJsb2NrRGlmZiA9IGxhdGVzdEJsb2NrLm51bWJlciAtIHByZXZpb3VzQmxvY2subnVtYmVyOwoKICBjb25zdCBibG9ja1RpbWUgPSB0aW1lRGlmZiAvIGJsb2NrRGlmZjsKICByZXR1cm4gYmxvY2tUaW1lOwp9CgpleHBvcnRzLmhhbmRsZXIgPSBhc3luYyBmdW5jdGlvbiAoZXZlbnQsIGNvbnRleHQpIHsKICBjb25zdCB7IG5vdGlmaWNhdGlvbkNsaWVudCB9ID0gY29udGV4dDsKICBjb25zdCB7IGFwaUtleSwgYXBpU2VjcmV0LCB0YWlrb0wxQXBpS2V5LCB0YWlrb0wxQXBpU2VjcmV0IH0gPSBldmVudC5zZWNyZXRzOwoKICBjb25zdCB0YWlrb0wxUHJvdmlkZXIgPSBjcmVhdGVQcm92aWRlcigKICAgIGFwaUtleSwKICAgIGFwaVNlY3JldCwKICAgIHRhaWtvTDFBcGlLZXksCiAgICB0YWlrb0wxQXBpU2VjcmV0LAogICk7CgogIGNvbnN0IGN1cnJlbnRCbG9ja051bWJlciA9IGF3YWl0IGdldExhdGVzdEJsb2NrTnVtYmVyKHRhaWtvTDFQcm92aWRlcik7CiAgY29uc3QgYmxvY2tUaW1lSW5TZWNvbmRzID0gYXdhaXQgY2FsY3VsYXRlQmxvY2tUaW1lKHRhaWtvTDFQcm92aWRlcik7CiAgY29uc3QgYmxvY2tzSW5GaXZlTWludXRlcyA9IE1hdGguZmxvb3IoKDUgKiA2MCkgLyBibG9ja1RpbWVJblNlY29uZHMpOwoKICBjb25zdCBmcm9tQmxvY2sgPSBjdXJyZW50QmxvY2tOdW1iZXIgLSBibG9ja3NJbkZpdmVNaW51dGVzOwogIGNvbnN0IHRvQmxvY2sgPSBjdXJyZW50QmxvY2tOdW1iZXI7CgogIGNvbnN0IGxvZ3MgPSBhd2FpdCBmZXRjaExvZ3NGcm9tTDEoCiAgICAiUHJvdmluZ0F1dG9QYXVzZUVuYWJsZWQiLAogICAgZnJvbUJsb2NrLAogICAgdG9CbG9jaywKICAgICIweEUzRDc3NzE0M0VhMjVBNkUwMzFkMWU5MjFGMzk2NzUwODg1ZjQzYUMiLAogICAgQUJJLAogICAgdGFpa29MMVByb3ZpZGVyLAogICk7CgogIGNvbnNvbGUubG9nKGBMb2dzIGZvdW5kOiAke2xvZ3MubGVuZ3RofWApOwoKICBpZiAobG9ncy5sZW5ndGggPiAwKSB7CiAgICBsb2dzLmZvckVhY2goKGxvZykgPT4gewogICAgICBjb25zdCBlbmFibGVkID0gbG9nLmVuYWJsZWQ7CiAgICAgIGNvbnN0IHN0YXR1cyA9IGVuYWJsZWQgPyAiRU5BQkxFRCIgOiAiRElTQUJMRUQiOwogICAgICBjb25zdCBtZXNzYWdlID0gYFByb3ZpbmcgQXV0by1QYXVzZSBoYXMgYmVlbiAke3N0YXR1c30uXG5cbkRldGFpbHM6XG4tIEVuYWJsZWQ6ICR7ZW5hYmxlZH1cbi0gQmxvY2sgTnVtYmVyOiAke2xvZy5ibG9ja051bWJlcn1gOwogICAgICBhbGVydE9yZyhub3RpZmljYXRpb25DbGllbnQsIG1lc3NhZ2UpOwogICAgfSk7CiAgfQoKICByZXR1cm4gdHJ1ZTsKfTsKUEsBAhQACgAAAAAAAABBUKW4cqt2DAAAdgwAAAgAAAAAAAAAAAAAAAAAAAAAAGluZGV4LmpzUEsFBgAAAAABAAEANgAAAJwMAAAAAA=="},{"autotaskId":"a91ec566-0083-40bc-9caf-9f006bb4ec12","actionId":"a91ec566-0083-40bc-9caf-9f006bb4ec12","name":"GuardianProver: ConflictingProofs Alert","paused":false,"trigger":{"cron":null,"frequencyMinutes":4,"type":"schedule"},"codeDigest":"L3HJRJGQ2LLkEO+6zCIg5yh4GpFNvfNl/ZR4bft2EDU=","stackResourceId":"mystack.guardian-prover-conflicting-proofs-alert","runtime":"nodejs20.x","dependenciesVersion":"v2024-08-21","encodedZippedCode":"UEsDBAoAAAAAAAAAQVDcZineqA0AAKgNAAAIAAAAaW5kZXguanNjb25zdCB7IGV0aGVycyB9ID0gcmVxdWlyZSgiZXRoZXJzIik7CmNvbnN0IHsgRGVmZW5kZXIgfSA9IHJlcXVpcmUoIkBvcGVuemVwcGVsaW4vZGVmZW5kZXItc2RrIik7Cgpjb25zdCBBQkkgPSBbCiAgewogICAgYW5vbnltb3VzOiBmYWxzZSwKICAgIGlucHV0czogWwogICAgICB7CiAgICAgICAgaW5kZXhlZDogdHJ1ZSwKICAgICAgICBpbnRlcm5hbFR5cGU6ICJ1aW50MjU2IiwKICAgICAgICBuYW1lOiAiYmxvY2tJZCIsCiAgICAgICAgdHlwZTogInVpbnQyNTYiLAogICAgICB9LAogICAgICB7CiAgICAgICAgaW5kZXhlZDogdHJ1ZSwKICAgICAgICBpbnRlcm5hbFR5cGU6ICJhZGRyZXNzIiwKICAgICAgICBuYW1lOiAiZ3VhcmRpYW4iLAogICAgICAgIHR5cGU6ICJhZGRyZXNzIiwKICAgICAgfSwKICAgICAgewogICAgICAgIGluZGV4ZWQ6IGZhbHNlLAogICAgICAgIGludGVybmFsVHlwZTogImJ5dGVzMzIiLAogICAgICAgIG5hbWU6ICJjdXJyZW50UHJvb2ZIYXNoIiwKICAgICAgICB0eXBlOiAiYnl0ZXMzMiIsCiAgICAgIH0sCiAgICAgIHsKICAgICAgICBpbmRleGVkOiBmYWxzZSwKICAgICAgICBpbnRlcm5hbFR5cGU6ICJieXRlczMyIiwKICAgICAgICBuYW1lOiAibmV3UHJvb2ZIYXNoIiwKICAgICAgICB0eXBlOiAiYnl0ZXMzMiIsCiAgICAgIH0sCiAgICAgIHsKICAgICAgICBpbmRleGVkOiBmYWxzZSwKICAgICAgICBpbnRlcm5hbFR5cGU6ICJib29sIiwKICAgICAgICBuYW1lOiAicHJvdmluZ1BhdXNlZCIsCiAgICAgICAgdHlwZTogImJvb2wiLAogICAgICB9LAogICAgXSwKICAgIG5hbWU6ICJDb25mbGljdGluZ1Byb29mcyIsCiAgICB0eXBlOiAiZXZlbnQiLAogIH0sCl07CgpmdW5jdGlvbiBhbGVydE9yZyhub3RpZmljYXRpb25DbGllbnQsIG1lc3NhZ2UpIHsKICBub3RpZmljYXRpb25DbGllbnQuc2VuZCh7CiAgICBjaGFubmVsQWxpYXM6ICJkaXNjb3JkX2NvbmZpZ3MiLAogICAgc3ViamVjdDogIvCfmqggR3VhcmRpYW5Qcm92ZXI6IENvbmZsaWN0aW5nUHJvb2ZzIEFsZXJ0IiwKICAgIG1lc3NhZ2UsCiAgfSk7CgogIG5vdGlmaWNhdGlvbkNsaWVudC5zZW5kKHsKICAgIGNoYW5uZWxBbGlhczogInRnX3RhaWtvX2d1YXJkaWFucyIsCiAgICBzdWJqZWN0OiAi8J+aqCBHdWFyZGlhblByb3ZlcjogQ29uZmxpY3RpbmdQcm9vZnMgQWxlcnQiLAogICAgbWVzc2FnZSwKICB9KTsKfQoKYXN5bmMgZnVuY3Rpb24gZ2V0TGF0ZXN0QmxvY2tOdW1iZXIocHJvdmlkZXIpIHsKICBjb25zdCBjdXJyZW50QmxvY2sgPSBhd2FpdCBwcm92aWRlci5nZXRCbG9jaygibGF0ZXN0Iik7CiAgcmV0dXJuIGN1cnJlbnRCbG9jay5udW1iZXI7Cn0KCmFzeW5jIGZ1bmN0aW9uIGZldGNoTG9nc0Zyb21MMSgKICBldmVudE5hbWUsCiAgZnJvbUJsb2NrLAogIHRvQmxvY2ssCiAgYWRkcmVzcywKICBhYmksCiAgcHJvdmlkZXIsCikgewogIGNvbnN0IGlmYWNlID0gbmV3IGV0aGVycy51dGlscy5JbnRlcmZhY2UoYWJpKTsKICBjb25zdCBldmVudFRvcGljID0gaWZhY2UuZ2V0RXZlbnRUb3BpYyhldmVudE5hbWUpOwoKICB0cnkgewogICAgY29uc3QgbG9ncyA9IGF3YWl0IHByb3ZpZGVyLmdldExvZ3MoewogICAgICBhZGRyZXNzLAogICAgICBmcm9tQmxvY2ssCiAgICAgIHRvQmxvY2ssCiAgICAgIHRvcGljczogW2V2ZW50VG9waWNdLAogICAgfSk7CgogICAgcmV0dXJuIGxvZ3MubWFwKChsb2cpID0+CiAgICAgIGlmYWNlLmRlY29kZUV2ZW50TG9nKGV2ZW50TmFtZSwgbG9nLmRhdGEsIGxvZy50b3BpY3MpLAogICAgKTsKICB9IGNhdGNoIChlcnJvcikgewogICAgY29uc29sZS5lcnJvcihgRXJyb3IgZmV0Y2hpbmcgbG9ncyBmb3IgJHtldmVudE5hbWV9OmAsIGVycm9yKTsKICAgIHJldHVybiBbXTsKICB9Cn0KCmZ1bmN0aW9uIGNyZWF0ZVByb3ZpZGVyKGFwaUtleSwgYXBpU2VjcmV0LCByZWxheWVyQXBpS2V5LCByZWxheWVyQXBpU2VjcmV0KSB7CiAgY29uc3QgY2xpZW50ID0gbmV3IERlZmVuZGVyKHsKICAgIGFwaUtleSwKICAgIGFwaVNlY3JldCwKICAgIHJlbGF5ZXJBcGlLZXksCiAgICByZWxheWVyQXBpU2VjcmV0LAogIH0pOwoKICByZXR1cm4gY2xpZW50LnJlbGF5U2lnbmVyLmdldFByb3ZpZGVyKCk7Cn0KCmFzeW5jIGZ1bmN0aW9uIGNhbGN1bGF0ZUJsb2NrVGltZShwcm92aWRlcikgewogIGNvbnN0IGxhdGVzdEJsb2NrID0gYXdhaXQgcHJvdmlkZXIuZ2V0QmxvY2soImxhdGVzdCIpOwogIGNvbnN0IHByZXZpb3VzQmxvY2sgPSBhd2FpdCBwcm92aWRlci5nZXRCbG9jayhsYXRlc3RCbG9jay5udW1iZXIgLSAxMDApOwoKICBjb25zdCB0aW1lRGlmZiA9IGxhdGVzdEJsb2NrLnRpbWVzdGFtcCAtIHByZXZpb3VzQmxvY2sudGltZXN0YW1wOwogIGNvbnN0IGJsb2NrRGlmZiA9IGxhdGVzdEJsb2NrLm51bWJlciAtIHByZXZpb3VzQmxvY2subnVtYmVyOwoKICBjb25zdCBibG9ja1RpbWUgPSB0aW1lRGlmZiAvIGJsb2NrRGlmZjsKICByZXR1cm4gYmxvY2tUaW1lOwp9CgpleHBvcnRzLmhhbmRsZXIgPSBhc3luYyBmdW5jdGlvbiAoZXZlbnQsIGNvbnRleHQpIHsKICBjb25zdCB7IG5vdGlmaWNhdGlvbkNsaWVudCB9ID0gY29udGV4dDsKICBjb25zdCB7IGFwaUtleSwgYXBpU2VjcmV0LCB0YWlrb0wxQXBpS2V5LCB0YWlrb0wxQXBpU2VjcmV0IH0gPSBldmVudC5zZWNyZXRzOwoKICBjb25zdCB0YWlrb0wxUHJvdmlkZXIgPSBjcmVhdGVQcm92aWRlcigKICAgIGFwaUtleSwKICAgIGFwaVNlY3JldCwKICAgIHRhaWtvTDFBcGlLZXksCiAgICB0YWlrb0wxQXBpU2VjcmV0LAogICk7CgogIGNvbnN0IGN1cnJlbnRCbG9ja051bWJlciA9IGF3YWl0IGdldExhdGVzdEJsb2NrTnVtYmVyKHRhaWtvTDFQcm92aWRlcik7CiAgY29uc3QgYmxvY2tUaW1lSW5TZWNvbmRzID0gYXdhaXQgY2FsY3VsYXRlQmxvY2tUaW1lKHRhaWtvTDFQcm92aWRlcik7CiAgY29uc3QgYmxvY2tzSW5GaXZlTWludXRlcyA9IE1hdGguZmxvb3IoKDUgKiA2MCkgLyBibG9ja1RpbWVJblNlY29uZHMpOwoKICBjb25zdCBmcm9tQmxvY2sgPSBjdXJyZW50QmxvY2tOdW1iZXIgLSBibG9ja3NJbkZpdmVNaW51dGVzOwogIGNvbnN0IHRvQmxvY2sgPSBjdXJyZW50QmxvY2tOdW1iZXI7CgogIGNvbnN0IGxvZ3MgPSBhd2FpdCBmZXRjaExvZ3NGcm9tTDEoCiAgICAiQ29uZmxpY3RpbmdQcm9vZnMiLAogICAgZnJvbUJsb2NrLAogICAgdG9CbG9jaywKICAgICIweEUzRDc3NzE0M0VhMjVBNkUwMzFkMWU5MjFGMzk2NzUwODg1ZjQzYUMiLAogICAgQUJJLAogICAgdGFpa29MMVByb3ZpZGVyLAogICk7CgogIGNvbnNvbGUubG9nKGBMb2dzIGZvdW5kOiAke2xvZ3MubGVuZ3RofWApOwoKICBpZiAobG9ncy5sZW5ndGggPiAwKSB7CiAgICBhbGVydE9yZygKICAgICAgbm90aWZpY2F0aW9uQ2xpZW50LAogICAgICBgQ29uZmxpY3RpbmdQcm9vZnMgZXZlbnQgZGV0ZWN0ZWQhIERldGFpbHM6ICR7SlNPTi5zdHJpbmdpZnkobG9ncyl9YCwKICAgICk7CiAgfQoKICByZXR1cm4gdHJ1ZTsKfTsKUEsBAhQACgAAAAAAAABBUNxmKd6oDQAAqA0AAAgAAAAAAAAAAAAAAAAAAAAAAGluZGV4LmpzUEsFBgAAAAABAAEANgAAAM4NAAAAAA=="},{"autotaskId":"9c132973-b8dc-4406-895c-a4ba343455cf","actionId":"9c132973-b8dc-4406-895c-a4ba343455cf","name":"GuardianProver: Approved Count","paused":false,"trigger":{"cron":null,"frequencyMinutes":15,"type":"schedule"},"codeDigest":"IgyqIUQKGTxW+magdh/AJeYpV0Z95FCzB2cNsfhTCvU=","stackResourceId":"mystack.guardian-prover-approved-count","runtime":"nodejs20.x","dependenciesVersion":"v2024-08-21","encodedZippedCode":"UEsDBAoAAAAAAAAAQVAnSx6hWg0AAFoNAAAIAAAAaW5kZXguanNjb25zdCB7IGV0aGVycyB9ID0gcmVxdWlyZSgiZXRoZXJzIik7CmNvbnN0IHsgRGVmZW5kZXIgfSA9IHJlcXVpcmUoIkBvcGVuemVwcGVsaW4vZGVmZW5kZXItc2RrIik7Cgpjb25zdCBBQkkgPSBbCiAgewogICAgYW5vbnltb3VzOiBmYWxzZSwKICAgIGlucHV0czogWwogICAgICB7CiAgICAgICAgaW5kZXhlZDogdHJ1ZSwKICAgICAgICBpbnRlcm5hbFR5cGU6ICJ1aW50MjU2IiwKICAgICAgICBuYW1lOiAib3BlcmF0aW9uSWQiLAogICAgICAgIHR5cGU6ICJ1aW50MjU2IiwKICAgICAgfSwKICAgICAgewogICAgICAgIGluZGV4ZWQ6IGZhbHNlLAogICAgICAgIGludGVybmFsVHlwZTogInVpbnQyNTYiLAogICAgICAgIG5hbWU6ICJhcHByb3ZhbEJpdHMiLAogICAgICAgIHR5cGU6ICJ1aW50MjU2IiwKICAgICAgfSwKICAgICAgewogICAgICAgIGluZGV4ZWQ6IGZhbHNlLAogICAgICAgIGludGVybmFsVHlwZTogImJvb2wiLAogICAgICAgIG5hbWU6ICJtaW5HdWFyZGlhbnNSZWFjaGVkIiwKICAgICAgICB0eXBlOiAiYm9vbCIsCiAgICAgIH0sCiAgICBdLAogICAgbmFtZTogIkFwcHJvdmVkIiwKICAgIHR5cGU6ICJldmVudCIsCiAgfSwKXTsKCmZ1bmN0aW9uIGFsZXJ0T3JnKG5vdGlmaWNhdGlvbkNsaWVudCwgbWVzc2FnZSkgewogIG5vdGlmaWNhdGlvbkNsaWVudC5zZW5kKHsKICAgIGNoYW5uZWxBbGlhczogImRpc2NvcmRfY29uZmlncyIsCiAgICBzdWJqZWN0OiAi4pqg77iPIEd1YXJkaWFuUHJvdmVyOiBBcHByb3ZlZCBDb3VudCIsCiAgICBtZXNzYWdlLAogIH0pOwp9Cgphc3luYyBmdW5jdGlvbiBnZXRMYXRlc3RCbG9ja051bWJlcihwcm92aWRlcikgewogIGNvbnN0IGN1cnJlbnRCbG9jayA9IGF3YWl0IHByb3ZpZGVyLmdldEJsb2NrKCJsYXRlc3QiKTsKICByZXR1cm4gY3VycmVudEJsb2NrLm51bWJlcjsKfQoKYXN5bmMgZnVuY3Rpb24gY2FsY3VsYXRlQmxvY2tUaW1lKHByb3ZpZGVyKSB7CiAgY29uc3QgbGF0ZXN0QmxvY2sgPSBhd2FpdCBwcm92aWRlci5nZXRCbG9jaygibGF0ZXN0Iik7CiAgY29uc3QgcHJldmlvdXNCbG9jayA9IGF3YWl0IHByb3ZpZGVyLmdldEJsb2NrKGxhdGVzdEJsb2NrLm51bWJlciAtIDEwMCk7CgogIGNvbnN0IHRpbWVEaWZmID0gbGF0ZXN0QmxvY2sudGltZXN0YW1wIC0gcHJldmlvdXNCbG9jay50aW1lc3RhbXA7CiAgY29uc3QgYmxvY2tEaWZmID0gbGF0ZXN0QmxvY2subnVtYmVyIC0gcHJldmlvdXNCbG9jay5udW1iZXI7CgogIGNvbnN0IGJsb2NrVGltZSA9IHRpbWVEaWZmIC8gYmxvY2tEaWZmOwogIHJldHVybiBibG9ja1RpbWU7Cn0KCmFzeW5jIGZ1bmN0aW9uIGNhbGN1bGF0ZUJsb2NrUmFuZ2UocHJvdmlkZXIpIHsKICBjb25zdCBjdXJyZW50QmxvY2tOdW1iZXIgPSBhd2FpdCBnZXRMYXRlc3RCbG9ja051bWJlcihwcm92aWRlcik7CiAgY29uc3QgYmxvY2tUaW1lSW5TZWNvbmRzID0gYXdhaXQgY2FsY3VsYXRlQmxvY2tUaW1lKHByb3ZpZGVyKTsKICBjb25zdCBibG9ja3NJbk9uZUhvdXIgPSBNYXRoLmZsb29yKCgxNiAqIDYwKSAvIGJsb2NrVGltZUluU2Vjb25kcyk7CgogIGNvbnN0IGZyb21CbG9jayA9IGN1cnJlbnRCbG9ja051bWJlciAtIGJsb2Nrc0luT25lSG91cjsKICBjb25zdCB0b0Jsb2NrID0gY3VycmVudEJsb2NrTnVtYmVyOwoKICBjb25zb2xlLmxvZyhgQ2FsY3VsYXRlZCBibG9jayByYW5nZTogZnJvbSAke2Zyb21CbG9ja30gdG8gJHt0b0Jsb2NrfWApOwoKICByZXR1cm4geyBmcm9tQmxvY2ssIHRvQmxvY2sgfTsKfQoKYXN5bmMgZnVuY3Rpb24gZmV0Y2hMb2dzRnJvbUwxKAogIGV2ZW50TmFtZSwKICBmcm9tQmxvY2ssCiAgdG9CbG9jaywKICBhZGRyZXNzLAogIGFiaSwKICBwcm92aWRlciwKKSB7CiAgY29uc3QgaWZhY2UgPSBuZXcgZXRoZXJzLnV0aWxzLkludGVyZmFjZShhYmkpOwogIGNvbnN0IGV2ZW50VG9waWMgPSBpZmFjZS5nZXRFdmVudFRvcGljKGV2ZW50TmFtZSk7CiAgY29uc29sZS5sb2coYGV2ZW50VG9waWM6ICR7ZXZlbnRUb3BpY31gKTsKICB0cnkgewogICAgY29uc3QgbG9ncyA9IGF3YWl0IHByb3ZpZGVyLmdldExvZ3MoewogICAgICBhZGRyZXNzLAogICAgICBmcm9tQmxvY2ssCiAgICAgIHRvQmxvY2ssCiAgICAgIHRvcGljczogW2V2ZW50VG9waWNdLAogICAgfSk7CiAgICBjb25zb2xlLmxvZyhgRmV0Y2hlZCBsb2dzOiAke2xvZ3MubGVuZ3RofWApOwogICAgcmV0dXJuIGxvZ3MubWFwKChsb2cpID0+IHsKICAgICAgY29uc3QgcGFyc2VkTG9nID0gaWZhY2UucGFyc2VMb2cobG9nKTsKICAgICAgY29uc29sZS5sb2coYFBhcnNlZCBsb2c6ICR7SlNPTi5zdHJpbmdpZnkocGFyc2VkTG9nKX1gKTsKICAgICAgcmV0dXJuIHBhcnNlZExvZzsKICAgIH0pOwogIH0gY2F0Y2ggKGVycm9yKSB7CiAgICBjb25zb2xlLmVycm9yKCJFcnJvciBmZXRjaGluZyBMMSBsb2dzOiIsIGVycm9yKTsKICAgIHJldHVybiBbXTsKICB9Cn0KCmZ1bmN0aW9uIGNyZWF0ZVByb3ZpZGVyKGFwaUtleSwgYXBpU2VjcmV0LCByZWxheWVyQXBpS2V5LCByZWxheWVyQXBpU2VjcmV0KSB7CiAgY29uc3QgY2xpZW50ID0gbmV3IERlZmVuZGVyKHsKICAgIGFwaUtleSwKICAgIGFwaVNlY3JldCwKICAgIHJlbGF5ZXJBcGlLZXksCiAgICByZWxheWVyQXBpU2VjcmV0LAogIH0pOwoKICByZXR1cm4gY2xpZW50LnJlbGF5U2lnbmVyLmdldFByb3ZpZGVyKCk7Cn0KCmV4cG9ydHMuaGFuZGxlciA9IGFzeW5jIGZ1bmN0aW9uIChldmVudCwgY29udGV4dCkgewogIGNvbnN0IHsgbm90aWZpY2F0aW9uQ2xpZW50IH0gPSBjb250ZXh0OwogIGNvbnN0IHsgYXBpS2V5LCBhcGlTZWNyZXQsIHRhaWtvTDFBcGlLZXksIHRhaWtvTDFBcGlTZWNyZXQgfSA9IGV2ZW50LnNlY3JldHM7CgogIGNvbnN0IHRhaWtvTDFQcm92aWRlciA9IGNyZWF0ZVByb3ZpZGVyKAogICAgYXBpS2V5LAogICAgYXBpU2VjcmV0LAogICAgdGFpa29MMUFwaUtleSwKICAgIHRhaWtvTDFBcGlTZWNyZXQsCiAgKTsKCiAgY29uc3QgeyBmcm9tQmxvY2ssIHRvQmxvY2sgfSA9IGF3YWl0IGNhbGN1bGF0ZUJsb2NrUmFuZ2UodGFpa29MMVByb3ZpZGVyKTsKCiAgY29uc3QgbG9ncyA9IGF3YWl0IGZldGNoTG9nc0Zyb21MMSgKICAgICJBcHByb3ZlZCIsCiAgICBmcm9tQmxvY2ssCiAgICB0b0Jsb2NrLAogICAgIjB4RTNENzc3MTQzRWEyNUE2RTAzMWQxZTkyMUYzOTY3NTA4ODVmNDNhQyIsCiAgICBBQkksCiAgICB0YWlrb0wxUHJvdmlkZXIsCiAgKTsKCiAgaWYgKGxvZ3MubGVuZ3RoID4gMCkgewogICAgYWxlcnRPcmcoCiAgICAgIG5vdGlmaWNhdGlvbkNsaWVudCwKICAgICAgYEB0YWlrb3xndWFyZGlhbnMgRGV0ZWN0ZWQgJHtsb2dzLmxlbmd0aH0gQXBwcm92ZWQgZXZlbnRzIGluIHRoZSBsYXN0IDE1IG1pbnMgb24gR3VhcmRpYW4hYCwKICAgICk7CiAgfQoKICByZXR1cm4gdHJ1ZTsKfTsKUEsBAhQACgAAAAAAAABBUCdLHqFaDQAAWg0AAAgAAAAAAAAAAAAAAAAAAAAAAGluZGV4LmpzUEsFBgAAAAABAAEANgAAAIANAAAAAA=="},{"autotaskId":"5b216422-4a62-4c2c-8242-330fa74d6ef1","actionId":"5b216422-4a62-4c2c-8242-330fa74d6ef1","name":"GuardianProver: GuardiansUpdated Alert","paused":false,"trigger":{"cron":null,"frequencyMinutes":4,"type":"schedule"},"codeDigest":"QDrbaB7HNvmMz0Yuifimr0hi+RP7kKbQKyOST8c2FZg=","stackResourceId":"mystack.guardian-prover-guardians-updated-alert","runtime":"nodejs20.x","dependenciesVersion":"v2024-08-21","encodedZippedCode":"UEsDBAoAAAAAAAAAQVCTA5CyKgwAACoMAAAIAAAAaW5kZXguanNjb25zdCB7IGV0aGVycyB9ID0gcmVxdWlyZSgiZXRoZXJzIik7CmNvbnN0IHsgRGVmZW5kZXIgfSA9IHJlcXVpcmUoIkBvcGVuemVwcGVsaW4vZGVmZW5kZXItc2RrIik7Cgpjb25zdCBBQkkgPSBbCiAgewogICAgYW5vbnltb3VzOiBmYWxzZSwKICAgIGlucHV0czogWwogICAgICB7CiAgICAgICAgaW5kZXhlZDogZmFsc2UsCiAgICAgICAgaW50ZXJuYWxUeXBlOiAidWludDMyIiwKICAgICAgICBuYW1lOiAidmVyc2lvbiIsCiAgICAgICAgdHlwZTogInVpbnQzMiIsCiAgICAgIH0sCiAgICAgIHsKICAgICAgICBpbmRleGVkOiBmYWxzZSwKICAgICAgICBpbnRlcm5hbFR5cGU6ICJhZGRyZXNzW10iLAogICAgICAgIG5hbWU6ICJndWFyZGlhbnMiLAogICAgICAgIHR5cGU6ICJhZGRyZXNzW10iLAogICAgICB9LAogICAgXSwKICAgIG5hbWU6ICJHdWFyZGlhbnNVcGRhdGVkIiwKICAgIHR5cGU6ICJldmVudCIsCiAgfSwKXTsKCmZ1bmN0aW9uIGFsZXJ0T3JnKG5vdGlmaWNhdGlvbkNsaWVudCwgbWVzc2FnZSkgewogIG5vdGlmaWNhdGlvbkNsaWVudC5zZW5kKHsKICAgIGNoYW5uZWxBbGlhczogImRpc2NvcmRfY29uZmlncyIsCiAgICBzdWJqZWN0OiAi4pqg77iPIEd1YXJkaWFuUHJvdmVyOiBHdWFyZGlhbnNVcGRhdGVkIEFsZXJ0IiwKICAgIG1lc3NhZ2UsCiAgfSk7CgogIG5vdGlmaWNhdGlvbkNsaWVudC5zZW5kKHsKICAgIGNoYW5uZWxBbGlhczogInRnX3RhaWtvX2d1YXJkaWFucyIsCiAgICBzdWJqZWN0OiAi4pqg77iPIEd1YXJkaWFuUHJvdmVyOiBHdWFyZGlhbnNVcGRhdGVkIEFsZXJ0IiwKICAgIG1lc3NhZ2UsCiAgfSk7Cn0KCmFzeW5jIGZ1bmN0aW9uIGdldExhdGVzdEJsb2NrTnVtYmVyKHByb3ZpZGVyKSB7CiAgY29uc3QgY3VycmVudEJsb2NrID0gYXdhaXQgcHJvdmlkZXIuZ2V0QmxvY2soImxhdGVzdCIpOwogIHJldHVybiBjdXJyZW50QmxvY2subnVtYmVyOwp9Cgphc3luYyBmdW5jdGlvbiBmZXRjaExvZ3NGcm9tTDEoCiAgZXZlbnROYW1lLAogIGZyb21CbG9jaywKICB0b0Jsb2NrLAogIGFkZHJlc3MsCiAgYWJpLAogIHByb3ZpZGVyLAopIHsKICBjb25zdCBpZmFjZSA9IG5ldyBldGhlcnMudXRpbHMuSW50ZXJmYWNlKGFiaSk7CiAgY29uc3QgZXZlbnRUb3BpYyA9IGlmYWNlLmdldEV2ZW50VG9waWMoZXZlbnROYW1lKTsKCiAgdHJ5IHsKICAgIGNvbnN0IGxvZ3MgPSBhd2FpdCBwcm92aWRlci5nZXRMb2dzKHsKICAgICAgYWRkcmVzcywKICAgICAgZnJvbUJsb2NrLAogICAgICB0b0Jsb2NrLAogICAgICB0b3BpY3M6IFtldmVudFRvcGljXSwKICAgIH0pOwoKICAgIHJldHVybiBsb2dzLm1hcCgobG9nKSA9PgogICAgICBpZmFjZS5kZWNvZGVFdmVudExvZyhldmVudE5hbWUsIGxvZy5kYXRhLCBsb2cudG9waWNzKSwKICAgICk7CiAgfSBjYXRjaCAoZXJyb3IpIHsKICAgIGNvbnNvbGUuZXJyb3IoYEVycm9yIGZldGNoaW5nIGxvZ3MgZm9yICR7ZXZlbnROYW1lfTpgLCBlcnJvcik7CiAgICByZXR1cm4gW107CiAgfQp9CgpmdW5jdGlvbiBjcmVhdGVQcm92aWRlcihhcGlLZXksIGFwaVNlY3JldCwgcmVsYXllckFwaUtleSwgcmVsYXllckFwaVNlY3JldCkgewogIGNvbnN0IGNsaWVudCA9IG5ldyBEZWZlbmRlcih7CiAgICBhcGlLZXksCiAgICBhcGlTZWNyZXQsCiAgICByZWxheWVyQXBpS2V5LAogICAgcmVsYXllckFwaVNlY3JldCwKICB9KTsKCiAgcmV0dXJuIGNsaWVudC5yZWxheVNpZ25lci5nZXRQcm92aWRlcigpOwp9Cgphc3luYyBmdW5jdGlvbiBjYWxjdWxhdGVCbG9ja1RpbWUocHJvdmlkZXIpIHsKICBjb25zdCBsYXRlc3RCbG9jayA9IGF3YWl0IHByb3ZpZGVyLmdldEJsb2NrKCJsYXRlc3QiKTsKICBjb25zdCBwcmV2aW91c0Jsb2NrID0gYXdhaXQgcHJvdmlkZXIuZ2V0QmxvY2sobGF0ZXN0QmxvY2subnVtYmVyIC0gMTAwKTsKCiAgY29uc3QgdGltZURpZmYgPSBsYXRlc3RCbG9jay50aW1lc3RhbXAgLSBwcmV2aW91c0Jsb2NrLnRpbWVzdGFtcDsKICBjb25zdCBibG9ja0RpZmYgPSBsYXRlc3RCbG9jay5udW1iZXIgLSBwcmV2aW91c0Jsb2NrLm51bWJlcjsKCiAgY29uc3QgYmxvY2tUaW1lID0gdGltZURpZmYgLyBibG9ja0RpZmY7CiAgcmV0dXJuIGJsb2NrVGltZTsKfQoKZXhwb3J0cy5oYW5kbGVyID0gYXN5bmMgZnVuY3Rpb24gKGV2ZW50LCBjb250ZXh0KSB7CiAgY29uc3QgeyBub3RpZmljYXRpb25DbGllbnQgfSA9IGNvbnRleHQ7CiAgY29uc3QgeyBhcGlLZXksIGFwaVNlY3JldCwgdGFpa29MMUFwaUtleSwgdGFpa29MMUFwaVNlY3JldCB9ID0gZXZlbnQuc2VjcmV0czsKCiAgY29uc3QgdGFpa29MMVByb3ZpZGVyID0gY3JlYXRlUHJvdmlkZXIoCiAgICBhcGlLZXksCiAgICBhcGlTZWNyZXQsCiAgICB0YWlrb0wxQXBpS2V5LAogICAgdGFpa29MMUFwaVNlY3JldCwKICApOwoKICBjb25zdCBjdXJyZW50QmxvY2tOdW1iZXIgPSBhd2FpdCBnZXRMYXRlc3RCbG9ja051bWJlcih0YWlrb0wxUHJvdmlkZXIpOwogIGNvbnN0IGJsb2NrVGltZUluU2Vjb25kcyA9IGF3YWl0IGNhbGN1bGF0ZUJsb2NrVGltZSh0YWlrb0wxUHJvdmlkZXIpOwogIGNvbnN0IGJsb2Nrc0luRml2ZU1pbnV0ZXMgPSBNYXRoLmZsb29yKCg1ICogNjApIC8gYmxvY2tUaW1lSW5TZWNvbmRzKTsKCiAgY29uc3QgZnJvbUJsb2NrID0gY3VycmVudEJsb2NrTnVtYmVyIC0gYmxvY2tzSW5GaXZlTWludXRlczsKICBjb25zdCB0b0Jsb2NrID0gY3VycmVudEJsb2NrTnVtYmVyOwoKICBjb25zdCBsb2dzID0gYXdhaXQgZmV0Y2hMb2dzRnJvbUwxKAogICAgIkd1YXJkaWFuc1VwZGF0ZWQiLAogICAgZnJvbUJsb2NrLAogICAgdG9CbG9jaywKICAgICIweEUzRDc3NzE0M0VhMjVBNkUwMzFkMWU5MjFGMzk2NzUwODg1ZjQzYUMiLAogICAgQUJJLAogICAgdGFpa29MMVByb3ZpZGVyLAogICk7CgogIGNvbnNvbGUubG9nKGBMb2dzIGZvdW5kOiAke2xvZ3MubGVuZ3RofWApOwoKICBpZiAobG9ncy5sZW5ndGggPiAwKSB7CiAgICBhbGVydE9yZygKICAgICAgbm90aWZpY2F0aW9uQ2xpZW50LAogICAgICBgR3VhcmRpYW5zVXBkYXRlZCBldmVudCBkZXRlY3RlZCEgRGV0YWlsczogJHtKU09OLnN0cmluZ2lmeShsb2dzKX1gLAogICAgKTsKICB9CgogIHJldHVybiB0cnVlOwp9OwpQSwECFAAKAAAAAAAAAEFQkwOQsioMAAAqDAAACAAAAAAAAAAAAAAAAAAAAAAAaW5kZXguanNQSwUGAAAAAAEAAQA2AAAAUAwAAAAA"},{"autotaskId":"f219a32c-98db-4c46-bbb4-dc279e65d128","actionId":"f219a32c-98db-4c46-bbb4-dc279e65d128","name":"TaikoL1: ProvingPaused Alert","paused":false,"trigger":{"cron":null,"frequencyMinutes":4,"type":"schedule"},"codeDigest":"YNbpcd3g7dWyoKmrpCa8jkF3st/mY1uhaVd8RNpjwn0=","stackResourceId":"mystack.taiko-l-1-proving-paused-alert","runtime":"nodejs20.x","dependenciesVersion":"v2024-08-21","encodedZippedCode":"UEsDBAoAAAAAAAAAQVAU+JyO+goAAPoKAAAIAAAAaW5kZXguanNjb25zdCB7IGV0aGVycyB9ID0gcmVxdWlyZSgiZXRoZXJzIik7CmNvbnN0IHsgRGVmZW5kZXIgfSA9IHJlcXVpcmUoIkBvcGVuemVwcGVsaW4vZGVmZW5kZXItc2RrIik7Cgpjb25zdCBBQkkgPSBbCiAgewogICAgYW5vbnltb3VzOiBmYWxzZSwKICAgIGlucHV0czogWwogICAgICB7CiAgICAgICAgaW5kZXhlZDogZmFsc2UsCiAgICAgICAgaW50ZXJuYWxUeXBlOiAiYm9vbCIsCiAgICAgICAgbmFtZTogInBhdXNlZCIsCiAgICAgICAgdHlwZTogImJvb2wiLAogICAgICB9LAogICAgXSwKICAgIG5hbWU6ICJQcm92aW5nUGF1c2VkIiwKICAgIHR5cGU6ICJldmVudCIsCiAgfSwKXTsKCmZ1bmN0aW9uIGFsZXJ0T3JnKG5vdGlmaWNhdGlvbkNsaWVudCwgbWVzc2FnZSkgewogIG5vdGlmaWNhdGlvbkNsaWVudC5zZW5kKHsKICAgIGNoYW5uZWxBbGlhczogImRpc2NvcmRfY29uZmlncyIsCiAgICBzdWJqZWN0OiAi4pqg77iPIFRhaWtvTDE6IFByb3ZpbmdQYXVzZWQgQWxlcnQiLAogICAgbWVzc2FnZSwKICB9KTsKfQoKYXN5bmMgZnVuY3Rpb24gZ2V0TGF0ZXN0QmxvY2tOdW1iZXIocHJvdmlkZXIpIHsKICBjb25zdCBjdXJyZW50QmxvY2sgPSBhd2FpdCBwcm92aWRlci5nZXRCbG9jaygibGF0ZXN0Iik7CiAgcmV0dXJuIGN1cnJlbnRCbG9jay5udW1iZXI7Cn0KCmFzeW5jIGZ1bmN0aW9uIGZldGNoTG9nc0Zyb21MMSgKICBldmVudE5hbWUsCiAgZnJvbUJsb2NrLAogIHRvQmxvY2ssCiAgYWRkcmVzcywKICBhYmksCiAgcHJvdmlkZXIsCikgewogIGNvbnN0IGlmYWNlID0gbmV3IGV0aGVycy51dGlscy5JbnRlcmZhY2UoYWJpKTsKICBjb25zdCBldmVudFRvcGljID0gaWZhY2UuZ2V0RXZlbnRUb3BpYyhldmVudE5hbWUpOwoKICB0cnkgewogICAgY29uc3QgbG9ncyA9IGF3YWl0IHByb3ZpZGVyLmdldExvZ3MoewogICAgICBhZGRyZXNzLAogICAgICBmcm9tQmxvY2ssCiAgICAgIHRvQmxvY2ssCiAgICAgIHRvcGljczogW2V2ZW50VG9waWNdLAogICAgfSk7CgogICAgcmV0dXJuIGxvZ3MubWFwKChsb2cpID0+CiAgICAgIGlmYWNlLmRlY29kZUV2ZW50TG9nKGV2ZW50TmFtZSwgbG9nLmRhdGEsIGxvZy50b3BpY3MpLAogICAgKTsKICB9IGNhdGNoIChlcnJvcikgewogICAgY29uc29sZS5lcnJvcihgRXJyb3IgZmV0Y2hpbmcgbG9ncyBmb3IgJHtldmVudE5hbWV9OmAsIGVycm9yKTsKICAgIHJldHVybiBbXTsKICB9Cn0KCmZ1bmN0aW9uIGNyZWF0ZVByb3ZpZGVyKGFwaUtleSwgYXBpU2VjcmV0LCByZWxheWVyQXBpS2V5LCByZWxheWVyQXBpU2VjcmV0KSB7CiAgY29uc3QgY2xpZW50ID0gbmV3IERlZmVuZGVyKHsKICAgIGFwaUtleSwKICAgIGFwaVNlY3JldCwKICAgIHJlbGF5ZXJBcGlLZXksCiAgICByZWxheWVyQXBpU2VjcmV0LAogIH0pOwoKICByZXR1cm4gY2xpZW50LnJlbGF5U2lnbmVyLmdldFByb3ZpZGVyKCk7Cn0KCmFzeW5jIGZ1bmN0aW9uIGNhbGN1bGF0ZUJsb2NrVGltZShwcm92aWRlcikgewogIGNvbnN0IGxhdGVzdEJsb2NrID0gYXdhaXQgcHJvdmlkZXIuZ2V0QmxvY2soImxhdGVzdCIpOwogIGNvbnN0IHByZXZpb3VzQmxvY2sgPSBhd2FpdCBwcm92aWRlci5nZXRCbG9jayhsYXRlc3RCbG9jay5udW1iZXIgLSAxMDApOwoKICBjb25zdCB0aW1lRGlmZiA9IGxhdGVzdEJsb2NrLnRpbWVzdGFtcCAtIHByZXZpb3VzQmxvY2sudGltZXN0YW1wOwogIGNvbnN0IGJsb2NrRGlmZiA9IGxhdGVzdEJsb2NrLm51bWJlciAtIHByZXZpb3VzQmxvY2subnVtYmVyOwoKICBjb25zdCBibG9ja1RpbWUgPSB0aW1lRGlmZiAvIGJsb2NrRGlmZjsKICByZXR1cm4gYmxvY2tUaW1lOwp9CgpleHBvcnRzLmhhbmRsZXIgPSBhc3luYyBmdW5jdGlvbiAoZXZlbnQsIGNvbnRleHQpIHsKICBjb25zdCB7IG5vdGlmaWNhdGlvbkNsaWVudCB9ID0gY29udGV4dDsKICBjb25zdCB7IGFwaUtleSwgYXBpU2VjcmV0LCB0YWlrb0wxQXBpS2V5LCB0YWlrb0wxQXBpU2VjcmV0IH0gPSBldmVudC5zZWNyZXRzOwoKICBjb25zdCB0YWlrb0wxUHJvdmlkZXIgPSBjcmVhdGVQcm92aWRlcigKICAgIGFwaUtleSwKICAgIGFwaVNlY3JldCwKICAgIHRhaWtvTDFBcGlLZXksCiAgICB0YWlrb0wxQXBpU2VjcmV0LAogICk7CgogIGNvbnN0IGN1cnJlbnRCbG9ja051bWJlciA9IGF3YWl0IGdldExhdGVzdEJsb2NrTnVtYmVyKHRhaWtvTDFQcm92aWRlcik7CiAgY29uc3QgYmxvY2tUaW1lSW5TZWNvbmRzID0gYXdhaXQgY2FsY3VsYXRlQmxvY2tUaW1lKHRhaWtvTDFQcm92aWRlcik7CiAgY29uc3QgYmxvY2tzSW5GaXZlTWludXRlcyA9IE1hdGguZmxvb3IoKDUgKiA2MCkgLyBibG9ja1RpbWVJblNlY29uZHMpOwoKICBjb25zdCBmcm9tQmxvY2sgPSBjdXJyZW50QmxvY2tOdW1iZXIgLSBibG9ja3NJbkZpdmVNaW51dGVzOwogIGNvbnN0IHRvQmxvY2sgPSBjdXJyZW50QmxvY2tOdW1iZXI7CgogIGNvbnN0IGxvZ3MgPSBhd2FpdCBmZXRjaExvZ3NGcm9tTDEoCiAgICAiUHJvdmluZ1BhdXNlZCIsCiAgICBmcm9tQmxvY2ssCiAgICB0b0Jsb2NrLAogICAgIjB4MDZhOUFiMjdjN2UyMjU1ZGYxODE1RTZDQzAxNjhkNzc1NUZlYjE5YSIsCiAgICBBQkksCiAgICB0YWlrb0wxUHJvdmlkZXIsCiAgKTsKCiAgY29uc29sZS5sb2coYExvZ3MgZm91bmQ6ICR7bG9ncy5sZW5ndGh9YCk7CgogIGlmIChsb2dzLmxlbmd0aCA+IDApIHsKICAgIGFsZXJ0T3JnKAogICAgICBub3RpZmljYXRpb25DbGllbnQsCiAgICAgIGBQcm92aW5nUGF1c2VkIGV2ZW50IGRldGVjdGVkISBEZXRhaWxzOiAke0pTT04uc3RyaW5naWZ5KGxvZ3MpfWAsCiAgICApOwogIH0KCiAgcmV0dXJuIHRydWU7Cn07ClBLAQIUAAoAAAAAAAAAQVAU+JyO+goAAPoKAAAIAAAAAAAAAAAAAAAAAAAAAABpbmRleC5qc1BLBQYAAAAAAQABADYAAAAgCwAAAAA="},{"autotaskId":"c79df8d7-deb4-45ea-ad3d-b808bf371405","actionId":"c79df8d7-deb4-45ea-ad3d-b808bf371405","name":"TaikoL1: TransitionContested Count","paused":false,"trigger":{"cron":null,"frequencyMinutes":60,"type":"schedule"},"codeDigest":"mp4o1olYw/ttX2O4d2ALDBqJeYOTaUFo67hiPxmMcmo=","stackResourceId":"mystack.taiko-l-1-transition-contested-count","runtime":"nodejs20.x","dependenciesVersion":"v2024-08-05","encodedZippedCode":"UEsDBAoAAAAAAAAAQVA/+iecuBUAALgVAAAIAAAAaW5kZXguanNjb25zdCB7IGV0aGVycyB9ID0gcmVxdWlyZSgiZXRoZXJzIik7CmNvbnN0IHsgRGVmZW5kZXIgfSA9IHJlcXVpcmUoIkBvcGVuemVwcGVsaW4vZGVmZW5kZXItc2RrIik7Cgpjb25zdCBBQkkgPSBbCiAgewogICAgYW5vbnltb3VzOiBmYWxzZSwKICAgIGlucHV0czogWwogICAgICB7CiAgICAgICAgaW5kZXhlZDogdHJ1ZSwKICAgICAgICBpbnRlcm5hbFR5cGU6ICJ1aW50MjU2IiwKICAgICAgICBuYW1lOiAiYmxvY2tJZCIsCiAgICAgICAgdHlwZTogInVpbnQyNTYiLAogICAgICB9LAogICAgICB7CiAgICAgICAgY29tcG9uZW50czogWwogICAgICAgICAgewogICAgICAgICAgICBpbnRlcm5hbFR5cGU6ICJieXRlczMyIiwKICAgICAgICAgICAgbmFtZTogInBhcmVudEhhc2giLAogICAgICAgICAgICB0eXBlOiAiYnl0ZXMzMiIsCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICBpbnRlcm5hbFR5cGU6ICJieXRlczMyIiwKICAgICAgICAgICAgbmFtZTogImJsb2NrSGFzaCIsCiAgICAgICAgICAgIHR5cGU6ICJieXRlczMyIiwKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgIGludGVybmFsVHlwZTogImJ5dGVzMzIiLAogICAgICAgICAgICBuYW1lOiAic3RhdGVSb290IiwKICAgICAgICAgICAgdHlwZTogImJ5dGVzMzIiLAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgaW50ZXJuYWxUeXBlOiAiYnl0ZXMzMiIsCiAgICAgICAgICAgIG5hbWU6ICJncmFmZml0aSIsCiAgICAgICAgICAgIHR5cGU6ICJieXRlczMyIiwKICAgICAgICAgIH0sCiAgICAgICAgXSwKICAgICAgICBpbmRleGVkOiBmYWxzZSwKICAgICAgICBpbnRlcm5hbFR5cGU6ICJzdHJ1Y3QgVGFpa29EYXRhLlRyYW5zaXRpb24iLAogICAgICAgIG5hbWU6ICJ0cmFuIiwKICAgICAgICB0eXBlOiAidHVwbGUiLAogICAgICB9LAogICAgICB7CiAgICAgICAgaW5kZXhlZDogZmFsc2UsCiAgICAgICAgaW50ZXJuYWxUeXBlOiAiYWRkcmVzcyIsCiAgICAgICAgbmFtZTogImNvbnRlc3RlciIsCiAgICAgICAgdHlwZTogImFkZHJlc3MiLAogICAgICB9LAogICAgICB7CiAgICAgICAgaW5kZXhlZDogZmFsc2UsCiAgICAgICAgaW50ZXJuYWxUeXBlOiAidWludDk2IiwKICAgICAgICBuYW1lOiAiY29udGVzdEJvbmQiLAogICAgICAgIHR5cGU6ICJ1aW50OTYiLAogICAgICB9LAogICAgICB7CiAgICAgICAgaW5kZXhlZDogZmFsc2UsCiAgICAgICAgaW50ZXJuYWxUeXBlOiAidWludDE2IiwKICAgICAgICBuYW1lOiAidGllciIsCiAgICAgICAgdHlwZTogInVpbnQxNiIsCiAgICAgIH0sCiAgICBdLAogICAgbmFtZTogIlRyYW5zaXRpb25Db250ZXN0ZWQiLAogICAgdHlwZTogImV2ZW50IiwKICB9LAogIHsKICAgIGFub255bW91czogZmFsc2UsCiAgICBpbnB1dHM6IFsKICAgICAgewogICAgICAgIGluZGV4ZWQ6IHRydWUsCiAgICAgICAgaW50ZXJuYWxUeXBlOiAidWludDI1NiIsCiAgICAgICAgbmFtZTogImJsb2NrSWQiLAogICAgICAgIHR5cGU6ICJ1aW50MjU2IiwKICAgICAgfSwKICAgICAgewogICAgICAgIGNvbXBvbmVudHM6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgaW50ZXJuYWxUeXBlOiAiYnl0ZXMzMiIsCiAgICAgICAgICAgIG5hbWU6ICJwYXJlbnRIYXNoIiwKICAgICAgICAgICAgdHlwZTogImJ5dGVzMzIiLAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgaW50ZXJuYWxUeXBlOiAiYnl0ZXMzMiIsCiAgICAgICAgICAgIG5hbWU6ICJibG9ja0hhc2giLAogICAgICAgICAgICB0eXBlOiAiYnl0ZXMzMiIsCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICBpbnRlcm5hbFR5cGU6ICJieXRlczMyIiwKICAgICAgICAgICAgbmFtZTogInN0YXRlUm9vdCIsCiAgICAgICAgICAgIHR5cGU6ICJieXRlczMyIiwKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgIGludGVybmFsVHlwZTogImJ5dGVzMzIiLAogICAgICAgICAgICBuYW1lOiAiZ3JhZmZpdGkiLAogICAgICAgICAgICB0eXBlOiAiYnl0ZXMzMiIsCiAgICAgICAgICB9LAogICAgICAgIF0sCiAgICAgICAgaW5kZXhlZDogZmFsc2UsCiAgICAgICAgaW50ZXJuYWxUeXBlOiAic3RydWN0IFRhaWtvRGF0YS5UcmFuc2l0aW9uIiwKICAgICAgICBuYW1lOiAidHJhbiIsCiAgICAgICAgdHlwZTogInR1cGxlIiwKICAgICAgfSwKICAgICAgewogICAgICAgIGluZGV4ZWQ6IGZhbHNlLAogICAgICAgIGludGVybmFsVHlwZTogImFkZHJlc3MiLAogICAgICAgIG5hbWU6ICJjb250ZXN0ZXIiLAogICAgICAgIHR5cGU6ICJhZGRyZXNzIiwKICAgICAgfSwKICAgICAgewogICAgICAgIGluZGV4ZWQ6IGZhbHNlLAogICAgICAgIGludGVybmFsVHlwZTogInVpbnQ5NiIsCiAgICAgICAgbmFtZTogImNvbnRlc3RCb25kIiwKICAgICAgICB0eXBlOiAidWludDk2IiwKICAgICAgfSwKICAgICAgewogICAgICAgIGluZGV4ZWQ6IGZhbHNlLAogICAgICAgIGludGVybmFsVHlwZTogInVpbnQxNiIsCiAgICAgICAgbmFtZTogInRpZXIiLAogICAgICAgIHR5cGU6ICJ1aW50MTYiLAogICAgICB9LAogICAgXSwKICAgIG5hbWU6ICJUcmFuc2l0aW9uQ29udGVzdGVkVjIiLAogICAgdHlwZTogImV2ZW50IiwKICB9LApdOwoKZnVuY3Rpb24gYWxlcnRPcmcobm90aWZpY2F0aW9uQ2xpZW50LCBtZXNzYWdlKSB7CiAgbm90aWZpY2F0aW9uQ2xpZW50LnNlbmQoewogICAgY2hhbm5lbEFsaWFzOiAiZGlzY29yZF9ibG9ja3MiLAogICAgc3ViamVjdDogIuKEue+4jyBUYWlrb0wxOiBUcmFuc2l0aW9uQ29udGVzdGVkIENvdW50IiwKICAgIG1lc3NhZ2UsCiAgfSk7Cn0KCmFzeW5jIGZ1bmN0aW9uIGdldExhdGVzdEJsb2NrTnVtYmVyKHByb3ZpZGVyKSB7CiAgY29uc3QgY3VycmVudEJsb2NrID0gYXdhaXQgcHJvdmlkZXIuZ2V0QmxvY2soImxhdGVzdCIpOwogIHJldHVybiBjdXJyZW50QmxvY2subnVtYmVyOwp9Cgphc3luYyBmdW5jdGlvbiBjYWxjdWxhdGVCbG9ja1RpbWUocHJvdmlkZXIpIHsKICBjb25zdCBsYXRlc3RCbG9jayA9IGF3YWl0IHByb3ZpZGVyLmdldEJsb2NrKCJsYXRlc3QiKTsKICBjb25zdCBwcmV2aW91c0Jsb2NrID0gYXdhaXQgcHJvdmlkZXIuZ2V0QmxvY2sobGF0ZXN0QmxvY2subnVtYmVyIC0gMTAwKTsKCiAgY29uc3QgdGltZURpZmYgPSBsYXRlc3RCbG9jay50aW1lc3RhbXAgLSBwcmV2aW91c0Jsb2NrLnRpbWVzdGFtcDsKICBjb25zdCBibG9ja0RpZmYgPSBsYXRlc3RCbG9jay5udW1iZXIgLSBwcmV2aW91c0Jsb2NrLm51bWJlcjsKCiAgY29uc3QgYmxvY2tUaW1lID0gdGltZURpZmYgLyBibG9ja0RpZmY7CiAgcmV0dXJuIGJsb2NrVGltZTsKfQoKYXN5bmMgZnVuY3Rpb24gY2FsY3VsYXRlQmxvY2tSYW5nZShwcm92aWRlcikgewogIGNvbnN0IGN1cnJlbnRCbG9ja051bWJlciA9IGF3YWl0IGdldExhdGVzdEJsb2NrTnVtYmVyKHByb3ZpZGVyKTsKICBjb25zdCBibG9ja1RpbWVJblNlY29uZHMgPSBhd2FpdCBjYWxjdWxhdGVCbG9ja1RpbWUocHJvdmlkZXIpOwogIGNvbnN0IGJsb2Nrc0luT25lSG91ciA9IE1hdGguZmxvb3IoKDYwICogNjApIC8gYmxvY2tUaW1lSW5TZWNvbmRzKTsKCiAgY29uc3QgZnJvbUJsb2NrID0gY3VycmVudEJsb2NrTnVtYmVyIC0gYmxvY2tzSW5PbmVIb3VyOwogIGNvbnN0IHRvQmxvY2sgPSBjdXJyZW50QmxvY2tOdW1iZXI7CgogIGNvbnNvbGUubG9nKGBDYWxjdWxhdGVkIGJsb2NrIHJhbmdlOiBmcm9tICR7ZnJvbUJsb2NrfSB0byAke3RvQmxvY2t9YCk7CgogIHJldHVybiB7IGZyb21CbG9jaywgdG9CbG9jayB9Owp9Cgphc3luYyBmdW5jdGlvbiBmZXRjaExvZ3NGcm9tTDEoCiAgZXZlbnROYW1lcywKICBmcm9tQmxvY2ssCiAgdG9CbG9jaywKICBhZGRyZXNzLAogIGFiaSwKICBwcm92aWRlciwKKSB7CiAgY29uc3QgaWZhY2UgPSBuZXcgZXRoZXJzLnV0aWxzLkludGVyZmFjZShhYmkpOwogIGNvbnN0IGV2ZW50VG9waWNzID0gZXZlbnROYW1lcy5tYXAoKGV2ZW50TmFtZSkgPT4KICAgIGlmYWNlLmdldEV2ZW50VG9waWMoZXZlbnROYW1lKSwKICApOwoKICBjb25zb2xlLmxvZyhgZXZlbnRUb3BpY3M6ICR7ZXZlbnRUb3BpY3N9YCk7CgogIHRyeSB7CiAgICBjb25zdCBsb2dzID0gYXdhaXQgcHJvdmlkZXIuZ2V0TG9ncyh7CiAgICAgIGFkZHJlc3MsCiAgICAgIGZyb21CbG9jaywKICAgICAgdG9CbG9jaywKICAgICAgdG9waWNzOiBbZXZlbnRUb3BpY3NdLAogICAgfSk7CiAgICBjb25zb2xlLmxvZyhgRmV0Y2hlZCBsb2dzOiAke2xvZ3MubGVuZ3RofWApOwogICAgcmV0dXJuIGxvZ3MubWFwKChsb2cpID0+IHsKICAgICAgY29uc3QgcGFyc2VkTG9nID0gaWZhY2UucGFyc2VMb2cobG9nKTsKICAgICAgY29uc29sZS5sb2coYFBhcnNlZCBsb2c6ICR7SlNPTi5zdHJpbmdpZnkocGFyc2VkTG9nKX1gKTsKICAgICAgcmV0dXJuIHBhcnNlZExvZzsKICAgIH0pOwogIH0gY2F0Y2ggKGVycm9yKSB7CiAgICBjb25zb2xlLmVycm9yKCJFcnJvciBmZXRjaGluZyBMMSBsb2dzOiIsIGVycm9yKTsKICAgIHJldHVybiBbXTsKICB9Cn0KCmZ1bmN0aW9uIGNyZWF0ZVByb3ZpZGVyKGFwaUtleSwgYXBpU2VjcmV0LCByZWxheWVyQXBpS2V5LCByZWxheWVyQXBpU2VjcmV0KSB7CiAgY29uc3QgY2xpZW50ID0gbmV3IERlZmVuZGVyKHsKICAgIGFwaUtleSwKICAgIGFwaVNlY3JldCwKICAgIHJlbGF5ZXJBcGlLZXksCiAgICByZWxheWVyQXBpU2VjcmV0LAogIH0pOwoKICByZXR1cm4gY2xpZW50LnJlbGF5U2lnbmVyLmdldFByb3ZpZGVyKCk7Cn0KCmV4cG9ydHMuaGFuZGxlciA9IGFzeW5jIGZ1bmN0aW9uIChldmVudCwgY29udGV4dCkgewogIGNvbnN0IHsgbm90aWZpY2F0aW9uQ2xpZW50IH0gPSBjb250ZXh0OwogIGNvbnN0IHsgYXBpS2V5LCBhcGlTZWNyZXQsIHRhaWtvTDFBcGlLZXksIHRhaWtvTDFBcGlTZWNyZXQgfSA9IGV2ZW50LnNlY3JldHM7CgogIGNvbnN0IHRhaWtvTDFQcm92aWRlciA9IGNyZWF0ZVByb3ZpZGVyKAogICAgYXBpS2V5LAogICAgYXBpU2VjcmV0LAogICAgdGFpa29MMUFwaUtleSwKICAgIHRhaWtvTDFBcGlTZWNyZXQsCiAgKTsKCiAgY29uc3QgeyBmcm9tQmxvY2ssIHRvQmxvY2sgfSA9IGF3YWl0IGNhbGN1bGF0ZUJsb2NrUmFuZ2UodGFpa29MMVByb3ZpZGVyKTsKCiAgY29uc3QgbG9ncyA9IGF3YWl0IGZldGNoTG9nc0Zyb21MMSgKICAgIFsiVHJhbnNpdGlvbkNvbnRlc3RlZCIsICJUcmFuc2l0aW9uQ29udGVzdGVkVjIiXSwKICAgIGZyb21CbG9jaywKICAgIHRvQmxvY2ssCiAgICAiMHgwNmE5QWIyN2M3ZTIyNTVkZjE4MTVFNkNDMDE2OGQ3NzU1RmViMTlhIiwKICAgIEFCSSwKICAgIHRhaWtvTDFQcm92aWRlciwKICApOwoKICBpZiAobG9ncy5sZW5ndGggPiAwKSB7CiAgICBhbGVydE9yZygKICAgICAgbm90aWZpY2F0aW9uQ2xpZW50LAogICAgICBgRGV0ZWN0ZWQgJHtsb2dzLmxlbmd0aH0gVHJhbnNpdGlvbkNvbnRlc3RlZCBhbmQgVHJhbnNpdGlvbkNvbnRlc3RlZFYyIGV2ZW50cyBpbiB0aGUgbGFzdCBob3VyIG9uIFRhaWtvTDEhYCwKICAgICk7CiAgfQoKICByZXR1cm4gdHJ1ZTsKfTsKUEsBAhQACgAAAAAAAABBUD/6J5y4FQAAuBUAAAgAAAAAAAAAAAAAAAAAAAAAAGluZGV4LmpzUEsFBgAAAAABAAEANgAAAN4VAAAAAA=="},{"autotaskId":"06200461-ef64-409c-b027-0a0b54986791","actionId":"06200461-ef64-409c-b027-0a0b54986791","name":"TaikoL1: TransitionProved Alert","paused":false,"trigger":{"cron":null,"frequencyMinutes":4,"type":"schedule"},"codeDigest":"0SM/4ykVO5o7umE96EUaGaOXy2AmZAOOcdjG1e46RUw=","stackResourceId":"mystack.taiko-l-1-transition-proved-alert","runtime":"nodejs20.x","dependenciesVersion":"v2024-08-05","encodedZippedCode":"UEsDBAoAAAAAAAAAQVCdRYy1ABQAAAAUAAAIAAAAaW5kZXguanNjb25zdCB7IGV0aGVycyB9ID0gcmVxdWlyZSgiZXRoZXJzIik7CmNvbnN0IHsgRGVmZW5kZXIgfSA9IHJlcXVpcmUoIkBvcGVuemVwcGVsaW4vZGVmZW5kZXItc2RrIik7Cgpjb25zdCBBQkkgPSBbCiAgewogICAgYW5vbnltb3VzOiBmYWxzZSwKICAgIGlucHV0czogWwogICAgICB7CiAgICAgICAgaW5kZXhlZDogdHJ1ZSwKICAgICAgICBpbnRlcm5hbFR5cGU6ICJ1aW50MjU2IiwKICAgICAgICBuYW1lOiAiYmxvY2tJZCIsCiAgICAgICAgdHlwZTogInVpbnQyNTYiLAogICAgICB9LAogICAgICB7CiAgICAgICAgY29tcG9uZW50czogWwogICAgICAgICAgewogICAgICAgICAgICBpbnRlcm5hbFR5cGU6ICJieXRlczMyIiwKICAgICAgICAgICAgbmFtZTogInBhcmVudEhhc2giLAogICAgICAgICAgICB0eXBlOiAiYnl0ZXMzMiIsCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICBpbnRlcm5hbFR5cGU6ICJieXRlczMyIiwKICAgICAgICAgICAgbmFtZTogImJsb2NrSGFzaCIsCiAgICAgICAgICAgIHR5cGU6ICJieXRlczMyIiwKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgIGludGVybmFsVHlwZTogImJ5dGVzMzIiLAogICAgICAgICAgICBuYW1lOiAic3RhdGVSb290IiwKICAgICAgICAgICAgdHlwZTogImJ5dGVzMzIiLAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgaW50ZXJuYWxUeXBlOiAiYnl0ZXMzMiIsCiAgICAgICAgICAgIG5hbWU6ICJncmFmZml0aSIsCiAgICAgICAgICAgIHR5cGU6ICJieXRlczMyIiwKICAgICAgICAgIH0sCiAgICAgICAgXSwKICAgICAgICBpbmRleGVkOiBmYWxzZSwKICAgICAgICBpbnRlcm5hbFR5cGU6ICJzdHJ1Y3QgVGFpa29EYXRhLlRyYW5zaXRpb24iLAogICAgICAgIG5hbWU6ICJ0cmFuIiwKICAgICAgICB0eXBlOiAidHVwbGUiLAogICAgICB9LAogICAgICB7CiAgICAgICAgaW5kZXhlZDogZmFsc2UsCiAgICAgICAgaW50ZXJuYWxUeXBlOiAiYWRkcmVzcyIsCiAgICAgICAgbmFtZTogInByb3ZlciIsCiAgICAgICAgdHlwZTogImFkZHJlc3MiLAogICAgICB9LAogICAgICB7CiAgICAgICAgaW5kZXhlZDogZmFsc2UsCiAgICAgICAgaW50ZXJuYWxUeXBlOiAidWludDk2IiwKICAgICAgICBuYW1lOiAidmFsaWRpdHlCb25kIiwKICAgICAgICB0eXBlOiAidWludDk2IiwKICAgICAgfSwKICAgICAgewogICAgICAgIGluZGV4ZWQ6IGZhbHNlLAogICAgICAgIGludGVybmFsVHlwZTogInVpbnQxNiIsCiAgICAgICAgbmFtZTogInRpZXIiLAogICAgICAgIHR5cGU6ICJ1aW50MTYiLAogICAgICB9LAogICAgXSwKICAgIG5hbWU6ICJUcmFuc2l0aW9uUHJvdmVkIiwKICAgIHR5cGU6ICJldmVudCIsCiAgfSwKICB7CiAgICBhbm9ueW1vdXM6IGZhbHNlLAogICAgaW5wdXRzOiBbCiAgICAgIHsKICAgICAgICBpbmRleGVkOiB0cnVlLAogICAgICAgIGludGVybmFsVHlwZTogInVpbnQyNTYiLAogICAgICAgIG5hbWU6ICJibG9ja0lkIiwKICAgICAgICB0eXBlOiAidWludDI1NiIsCiAgICAgIH0sCiAgICAgIHsKICAgICAgICBjb21wb25lbnRzOiBbCiAgICAgICAgICB7CiAgICAgICAgICAgIGludGVybmFsVHlwZTogImJ5dGVzMzIiLAogICAgICAgICAgICBuYW1lOiAicGFyZW50SGFzaCIsCiAgICAgICAgICAgIHR5cGU6ICJieXRlczMyIiwKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgIGludGVybmFsVHlwZTogImJ5dGVzMzIiLAogICAgICAgICAgICBuYW1lOiAiYmxvY2tIYXNoIiwKICAgICAgICAgICAgdHlwZTogImJ5dGVzMzIiLAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgaW50ZXJuYWxUeXBlOiAiYnl0ZXMzMiIsCiAgICAgICAgICAgIG5hbWU6ICJzdGF0ZVJvb3QiLAogICAgICAgICAgICB0eXBlOiAiYnl0ZXMzMiIsCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICBpbnRlcm5hbFR5cGU6ICJieXRlczMyIiwKICAgICAgICAgICAgbmFtZTogImdyYWZmaXRpIiwKICAgICAgICAgICAgdHlwZTogImJ5dGVzMzIiLAogICAgICAgICAgfSwKICAgICAgICBdLAogICAgICAgIGluZGV4ZWQ6IGZhbHNlLAogICAgICAgIGludGVybmFsVHlwZTogInN0cnVjdCBUYWlrb0RhdGEuVHJhbnNpdGlvbiIsCiAgICAgICAgbmFtZTogInRyYW4iLAogICAgICAgIHR5cGU6ICJ0dXBsZSIsCiAgICAgIH0sCiAgICAgIHsKICAgICAgICBpbmRleGVkOiBmYWxzZSwKICAgICAgICBpbnRlcm5hbFR5cGU6ICJhZGRyZXNzIiwKICAgICAgICBuYW1lOiAicHJvdmVyIiwKICAgICAgICB0eXBlOiAiYWRkcmVzcyIsCiAgICAgIH0sCiAgICAgIHsKICAgICAgICBpbmRleGVkOiBmYWxzZSwKICAgICAgICBpbnRlcm5hbFR5cGU6ICJ1aW50OTYiLAogICAgICAgIG5hbWU6ICJ2YWxpZGl0eUJvbmQiLAogICAgICAgIHR5cGU6ICJ1aW50OTYiLAogICAgICB9LAogICAgICB7CiAgICAgICAgaW5kZXhlZDogZmFsc2UsCiAgICAgICAgaW50ZXJuYWxUeXBlOiAidWludDE2IiwKICAgICAgICBuYW1lOiAidGllciIsCiAgICAgICAgdHlwZTogInVpbnQxNiIsCiAgICAgIH0sCiAgICBdLAogICAgbmFtZTogIlRyYW5zaXRpb25Qcm92ZWRWMiIsCiAgICB0eXBlOiAiZXZlbnQiLAogIH0sCl07CgpmdW5jdGlvbiBhbGVydE9yZyhub3RpZmljYXRpb25DbGllbnQsIG1lc3NhZ2UpIHsKICBub3RpZmljYXRpb25DbGllbnQuc2VuZCh7CiAgICBjaGFubmVsQWxpYXM6ICJkaXNjb3JkX2Jsb2NrcyIsCiAgICBzdWJqZWN0OiAi8J+aqCBUYWlrb0wxOiBUcmFuc2l0aW9uUHJvdmVkIEFsZXJ0IiwKICAgIG1lc3NhZ2UsCiAgfSk7Cn0KCmFzeW5jIGZ1bmN0aW9uIGdldExhdGVzdEJsb2NrTnVtYmVyKHByb3ZpZGVyKSB7CiAgY29uc3QgY3VycmVudEJsb2NrID0gYXdhaXQgcHJvdmlkZXIuZ2V0QmxvY2soImxhdGVzdCIpOwogIHJldHVybiBjdXJyZW50QmxvY2subnVtYmVyOwp9Cgphc3luYyBmdW5jdGlvbiBmZXRjaExvZ3NGcm9tTDEoCiAgZXZlbnROYW1lcywKICBmcm9tQmxvY2ssCiAgdG9CbG9jaywKICBhZGRyZXNzLAogIGFiaSwKICBwcm92aWRlciwKKSB7CiAgY29uc3QgaWZhY2UgPSBuZXcgZXRoZXJzLnV0aWxzLkludGVyZmFjZShhYmkpOwogIGNvbnN0IGV2ZW50VG9waWNzID0gZXZlbnROYW1lcy5tYXAoKGV2ZW50TmFtZSkgPT4KICAgIGlmYWNlLmdldEV2ZW50VG9waWMoZXZlbnROYW1lKSwKICApOwoKICB0cnkgewogICAgY29uc3QgbG9ncyA9IGF3YWl0IHByb3ZpZGVyLmdldExvZ3MoewogICAgICBhZGRyZXNzLAogICAgICBmcm9tQmxvY2ssCiAgICAgIHRvQmxvY2ssCiAgICAgIHRvcGljczogW2V2ZW50VG9waWNzXSwKICAgIH0pOwogICAgY29uc29sZS5sb2coIlJhdyBsb2dzIGZldGNoZWQ6IiwgbG9ncyk7CiAgICByZXR1cm4gbG9ncy5tYXAoKGxvZykgPT4gaWZhY2UucGFyc2VMb2cobG9nKSk7CiAgfSBjYXRjaCAoZXJyb3IpIHsKICAgIGNvbnNvbGUuZXJyb3IoIkVycm9yIGZldGNoaW5nIEwxIGxvZ3M6IiwgZXJyb3IpOwogICAgcmV0dXJuIFtdOwogIH0KfQoKZnVuY3Rpb24gY3JlYXRlUHJvdmlkZXIoYXBpS2V5LCBhcGlTZWNyZXQsIHJlbGF5ZXJBcGlLZXksIHJlbGF5ZXJBcGlTZWNyZXQpIHsKICBjb25zdCBjbGllbnQgPSBuZXcgRGVmZW5kZXIoewogICAgYXBpS2V5LAogICAgYXBpU2VjcmV0LAogICAgcmVsYXllckFwaUtleSwKICAgIHJlbGF5ZXJBcGlTZWNyZXQsCiAgfSk7CgogIHJldHVybiBjbGllbnQucmVsYXlTaWduZXIuZ2V0UHJvdmlkZXIoKTsKfQoKYXN5bmMgZnVuY3Rpb24gY2FsY3VsYXRlQmxvY2tUaW1lKHByb3ZpZGVyKSB7CiAgY29uc3QgbGF0ZXN0QmxvY2sgPSBhd2FpdCBwcm92aWRlci5nZXRCbG9jaygibGF0ZXN0Iik7CiAgY29uc3QgcHJldmlvdXNCbG9jayA9IGF3YWl0IHByb3ZpZGVyLmdldEJsb2NrKGxhdGVzdEJsb2NrLm51bWJlciAtIDEwMCk7CgogIGNvbnN0IHRpbWVEaWZmID0gbGF0ZXN0QmxvY2sudGltZXN0YW1wIC0gcHJldmlvdXNCbG9jay50aW1lc3RhbXA7CiAgY29uc3QgYmxvY2tEaWZmID0gbGF0ZXN0QmxvY2subnVtYmVyIC0gcHJldmlvdXNCbG9jay5udW1iZXI7CgogIGNvbnN0IGJsb2NrVGltZSA9IHRpbWVEaWZmIC8gYmxvY2tEaWZmOwogIHJldHVybiBibG9ja1RpbWU7Cn0KCmV4cG9ydHMuaGFuZGxlciA9IGFzeW5jIGZ1bmN0aW9uIChldmVudCwgY29udGV4dCkgewogIGNvbnN0IHsgbm90aWZpY2F0aW9uQ2xpZW50IH0gPSBjb250ZXh0OwogIGNvbnN0IHsgYXBpS2V5LCBhcGlTZWNyZXQsIHRhaWtvTDFBcGlLZXksIHRhaWtvTDFBcGlTZWNyZXQgfSA9IGV2ZW50LnNlY3JldHM7CgogIGNvbnN0IHRhaWtvTDFQcm92aWRlciA9IGNyZWF0ZVByb3ZpZGVyKAogICAgYXBpS2V5LAogICAgYXBpU2VjcmV0LAogICAgdGFpa29MMUFwaUtleSwKICAgIHRhaWtvTDFBcGlTZWNyZXQsCiAgKTsKCiAgY29uc3QgY3VycmVudEJsb2NrTnVtYmVyID0gYXdhaXQgZ2V0TGF0ZXN0QmxvY2tOdW1iZXIodGFpa29MMVByb3ZpZGVyKTsKICBjb25zdCBibG9ja1RpbWVJblNlY29uZHMgPSBhd2FpdCBjYWxjdWxhdGVCbG9ja1RpbWUodGFpa29MMVByb3ZpZGVyKTsKICBjb25zdCBibG9ja3NJblRoaXJ0eU1pbnV0ZXMgPSBNYXRoLmZsb29yKCgzMCAqIDYwKSAvIGJsb2NrVGltZUluU2Vjb25kcyk7CgogIGNvbnN0IGZyb21CbG9jayA9IGN1cnJlbnRCbG9ja051bWJlciAtIGJsb2Nrc0luVGhpcnR5TWludXRlczsKICBjb25zdCB0b0Jsb2NrID0gY3VycmVudEJsb2NrTnVtYmVyOwoKICBjb25zdCBsb2dzID0gYXdhaXQgZmV0Y2hMb2dzRnJvbUwxKAogICAgWyJUcmFuc2l0aW9uUHJvdmVkIiwgIlRyYW5zaXRpb25Qcm92ZWRWMiJdLAogICAgZnJvbUJsb2NrLAogICAgdG9CbG9jaywKICAgICIweDA2YTlBYjI3YzdlMjI1NWRmMTgxNUU2Q0MwMTY4ZDc3NTVGZWIxOWEiLAogICAgQUJJLAogICAgdGFpa29MMVByb3ZpZGVyLAogICk7CgogIGlmIChsb2dzLmxlbmd0aCA9PT0gMCkgewogICAgYWxlcnRPcmcoCiAgICAgIG5vdGlmaWNhdGlvbkNsaWVudCwKICAgICAgYE5vIFRyYW5zaXRpb25Qcm92ZWQgZXZlbnQgZGV0ZWN0ZWQgaW4gdGhlIGxhc3QgMzAgbWlucyBvbiBUYWlrb0wxIWAsCiAgICApOwogIH0KCiAgcmV0dXJuIHRydWU7Cn07ClBLAQIUAAoAAAAAAAAAQVCdRYy1ABQAAAAUAAAIAAAAAAAAAAAAAAAAAAAAAABpbmRleC5qc1BLBQYAAAAAAQABADYAAAAmFAAAAAA="},{"autotaskId":"4390573f-1796-4c27-8933-7f157e77c2b4","actionId":"4390573f-1796-4c27-8933-7f157e77c2b4","name":"TaikoL1: BlockVerified Alert","paused":false,"trigger":{"cron":null,"frequencyMinutes":4,"type":"schedule"},"codeDigest":"mqXqyfZDeb1WGdy+nxXiMlsgOop/LSMOh3pARcgugAc=","stackResourceId":"mystack.taiko-l-1-block-verified-alert","runtime":"nodejs20.x","dependenciesVersion":"v2024-08-05","encodedZippedCode":"UEsDBAoAAAAAAAAAQVBa57hUWxAAAFsQAAAIAAAAaW5kZXguanNjb25zdCB7IGV0aGVycyB9ID0gcmVxdWlyZSgiZXRoZXJzIik7CmNvbnN0IHsgRGVmZW5kZXIgfSA9IHJlcXVpcmUoIkBvcGVuemVwcGVsaW4vZGVmZW5kZXItc2RrIik7Cgpjb25zdCBBQkkgPSBbCiAgewogICAgYW5vbnltb3VzOiBmYWxzZSwKICAgIGlucHV0czogWwogICAgICB7CiAgICAgICAgaW5kZXhlZDogdHJ1ZSwKICAgICAgICBpbnRlcm5hbFR5cGU6ICJ1aW50MjU2IiwKICAgICAgICBuYW1lOiAiYmxvY2tJZCIsCiAgICAgICAgdHlwZTogInVpbnQyNTYiLAogICAgICB9LAogICAgICB7CiAgICAgICAgaW5kZXhlZDogdHJ1ZSwKICAgICAgICBpbnRlcm5hbFR5cGU6ICJhZGRyZXNzIiwKICAgICAgICBuYW1lOiAicHJvdmVyIiwKICAgICAgICB0eXBlOiAiYWRkcmVzcyIsCiAgICAgIH0sCiAgICAgIHsKICAgICAgICBpbmRleGVkOiBmYWxzZSwKICAgICAgICBpbnRlcm5hbFR5cGU6ICJieXRlczMyIiwKICAgICAgICBuYW1lOiAiYmxvY2tIYXNoIiwKICAgICAgICB0eXBlOiAiYnl0ZXMzMiIsCiAgICAgIH0sCiAgICAgIHsKICAgICAgICBpbmRleGVkOiBmYWxzZSwKICAgICAgICBpbnRlcm5hbFR5cGU6ICJieXRlczMyIiwKICAgICAgICBuYW1lOiAic3RhdGVSb290IiwKICAgICAgICB0eXBlOiAiYnl0ZXMzMiIsCiAgICAgIH0sCiAgICAgIHsKICAgICAgICBpbmRleGVkOiBmYWxzZSwKICAgICAgICBpbnRlcm5hbFR5cGU6ICJ1aW50MTYiLAogICAgICAgIG5hbWU6ICJ0aWVyIiwKICAgICAgICB0eXBlOiAidWludDE2IiwKICAgICAgfSwKICAgIF0sCiAgICBuYW1lOiAiQmxvY2tWZXJpZmllZCIsCiAgICB0eXBlOiAiZXZlbnQiLAogIH0sCiAgewogICAgYW5vbnltb3VzOiBmYWxzZSwKICAgIGlucHV0czogWwogICAgICB7CiAgICAgICAgaW5kZXhlZDogdHJ1ZSwKICAgICAgICBpbnRlcm5hbFR5cGU6ICJ1aW50MjU2IiwKICAgICAgICBuYW1lOiAiYmxvY2tJZCIsCiAgICAgICAgdHlwZTogInVpbnQyNTYiLAogICAgICB9LAogICAgICB7CiAgICAgICAgaW5kZXhlZDogdHJ1ZSwKICAgICAgICBpbnRlcm5hbFR5cGU6ICJhZGRyZXNzIiwKICAgICAgICBuYW1lOiAicHJvdmVyIiwKICAgICAgICB0eXBlOiAiYWRkcmVzcyIsCiAgICAgIH0sCiAgICAgIHsKICAgICAgICBpbmRleGVkOiBmYWxzZSwKICAgICAgICBpbnRlcm5hbFR5cGU6ICJieXRlczMyIiwKICAgICAgICBuYW1lOiAiYmxvY2tIYXNoIiwKICAgICAgICB0eXBlOiAiYnl0ZXMzMiIsCiAgICAgIH0sCiAgICAgIHsKICAgICAgICBpbmRleGVkOiBmYWxzZSwKICAgICAgICBpbnRlcm5hbFR5cGU6ICJieXRlczMyIiwKICAgICAgICBuYW1lOiAic3RhdGVSb290IiwKICAgICAgICB0eXBlOiAiYnl0ZXMzMiIsCiAgICAgIH0sCiAgICAgIHsKICAgICAgICBpbmRleGVkOiBmYWxzZSwKICAgICAgICBpbnRlcm5hbFR5cGU6ICJ1aW50MTYiLAogICAgICAgIG5hbWU6ICJ0aWVyIiwKICAgICAgICB0eXBlOiAidWludDE2IiwKICAgICAgfSwKICAgIF0sCiAgICBuYW1lOiAiQmxvY2tWZXJpZmllZFYyIiwKICAgIHR5cGU6ICJldmVudCIsCiAgfSwKXTsKCmZ1bmN0aW9uIGFsZXJ0T3JnKG5vdGlmaWNhdGlvbkNsaWVudCwgbWVzc2FnZSkgewogIG5vdGlmaWNhdGlvbkNsaWVudC5zZW5kKHsKICAgIGNoYW5uZWxBbGlhczogImRpc2NvcmRfYmxvY2tzIiwKICAgIHN1YmplY3Q6ICLwn5qoIFRhaWtvTDE6IEJsb2NrVmVyaWZpZWQgQWxlcnQiLAogICAgbWVzc2FnZSwKICB9KTsKCiAgbm90aWZpY2F0aW9uQ2xpZW50LnNlbmQoewogICAgY2hhbm5lbEFsaWFzOiAidGdfdGFpa29fZ3VhcmRpYW5zIiwKICAgIHN1YmplY3Q6ICLwn5qoIFRhaWtvTDE6IEJsb2NrVmVyaWZpZWQgQWxlcnQiLAogICAgbWVzc2FnZSwKICB9KTsKfQoKYXN5bmMgZnVuY3Rpb24gZ2V0TGF0ZXN0QmxvY2tOdW1iZXIocHJvdmlkZXIpIHsKICBjb25zdCBjdXJyZW50QmxvY2sgPSBhd2FpdCBwcm92aWRlci5nZXRCbG9jaygibGF0ZXN0Iik7CiAgcmV0dXJuIGN1cnJlbnRCbG9jay5udW1iZXI7Cn0KCmFzeW5jIGZ1bmN0aW9uIGZldGNoTG9nc0Zyb21MMSgKICBldmVudE5hbWVzLAogIGZyb21CbG9jaywKICB0b0Jsb2NrLAogIGFkZHJlc3MsCiAgYWJpLAogIHByb3ZpZGVyLAopIHsKICBjb25zdCBpZmFjZSA9IG5ldyBldGhlcnMudXRpbHMuSW50ZXJmYWNlKGFiaSk7CiAgY29uc3QgZXZlbnRUb3BpY3MgPSBldmVudE5hbWVzLm1hcCgoZXZlbnROYW1lKSA9PgogICAgaWZhY2UuZ2V0RXZlbnRUb3BpYyhldmVudE5hbWUpLAogICk7CgogIGNvbnNvbGUubG9nKGBldmVudFRvcGljczogJHtldmVudFRvcGljc31gKTsKCiAgdHJ5IHsKICAgIGNvbnN0IGxvZ3MgPSBhd2FpdCBwcm92aWRlci5nZXRMb2dzKHsKICAgICAgYWRkcmVzcywKICAgICAgZnJvbUJsb2NrLAogICAgICB0b0Jsb2NrLAogICAgICB0b3BpY3M6IFtldmVudFRvcGljc10sCiAgICB9KTsKCiAgICByZXR1cm4gbG9ncy5tYXAoKGxvZykgPT4gaWZhY2UucGFyc2VMb2cobG9nKSk7CiAgfSBjYXRjaCAoZXJyb3IpIHsKICAgIGNvbnNvbGUuZXJyb3IoIkVycm9yIGZldGNoaW5nIEwxIGxvZ3M6IiwgZXJyb3IpOwogICAgcmV0dXJuIFtdOwogIH0KfQoKZnVuY3Rpb24gY3JlYXRlUHJvdmlkZXIoYXBpS2V5LCBhcGlTZWNyZXQsIHJlbGF5ZXJBcGlLZXksIHJlbGF5ZXJBcGlTZWNyZXQpIHsKICBjb25zdCBjbGllbnQgPSBuZXcgRGVmZW5kZXIoewogICAgYXBpS2V5LAogICAgYXBpU2VjcmV0LAogICAgcmVsYXllckFwaUtleSwKICAgIHJlbGF5ZXJBcGlTZWNyZXQsCiAgfSk7CgogIHJldHVybiBjbGllbnQucmVsYXlTaWduZXIuZ2V0UHJvdmlkZXIoKTsKfQoKYXN5bmMgZnVuY3Rpb24gY2FsY3VsYXRlQmxvY2tUaW1lKHByb3ZpZGVyKSB7CiAgY29uc3QgbGF0ZXN0QmxvY2sgPSBhd2FpdCBwcm92aWRlci5nZXRCbG9jaygibGF0ZXN0Iik7CiAgY29uc3QgcHJldmlvdXNCbG9jayA9IGF3YWl0IHByb3ZpZGVyLmdldEJsb2NrKGxhdGVzdEJsb2NrLm51bWJlciAtIDEwMCk7CgogIGNvbnN0IHRpbWVEaWZmID0gbGF0ZXN0QmxvY2sudGltZXN0YW1wIC0gcHJldmlvdXNCbG9jay50aW1lc3RhbXA7CiAgY29uc3QgYmxvY2tEaWZmID0gbGF0ZXN0QmxvY2subnVtYmVyIC0gcHJldmlvdXNCbG9jay5udW1iZXI7CgogIGNvbnN0IGJsb2NrVGltZSA9IHRpbWVEaWZmIC8gYmxvY2tEaWZmOwogIHJldHVybiBibG9ja1RpbWU7Cn0KCmV4cG9ydHMuaGFuZGxlciA9IGFzeW5jIGZ1bmN0aW9uIChldmVudCwgY29udGV4dCkgewogIGNvbnN0IHsgbm90aWZpY2F0aW9uQ2xpZW50IH0gPSBjb250ZXh0OwogIGNvbnN0IHsgYXBpS2V5LCBhcGlTZWNyZXQsIHRhaWtvTDFBcGlLZXksIHRhaWtvTDFBcGlTZWNyZXQgfSA9IGV2ZW50LnNlY3JldHM7CgogIGNvbnN0IHRhaWtvTDFQcm92aWRlciA9IGNyZWF0ZVByb3ZpZGVyKAogICAgYXBpS2V5LAogICAgYXBpU2VjcmV0LAogICAgdGFpa29MMUFwaUtleSwKICAgIHRhaWtvTDFBcGlTZWNyZXQsCiAgKTsKCiAgY29uc3QgY3VycmVudEJsb2NrTnVtYmVyID0gYXdhaXQgZ2V0TGF0ZXN0QmxvY2tOdW1iZXIodGFpa29MMVByb3ZpZGVyKTsKICBjb25zdCBibG9ja1RpbWVJblNlY29uZHMgPSBhd2FpdCBjYWxjdWxhdGVCbG9ja1RpbWUodGFpa29MMVByb3ZpZGVyKTsKICBjb25zdCBibG9ja3NJbkZpdmVNaW51dGVzID0gTWF0aC5mbG9vcigoNSAqIDYwKSAvIGJsb2NrVGltZUluU2Vjb25kcyk7CgogIGNvbnN0IGZyb21CbG9jayA9IGN1cnJlbnRCbG9ja051bWJlciAtIGJsb2Nrc0luRml2ZU1pbnV0ZXM7CiAgY29uc3QgdG9CbG9jayA9IGN1cnJlbnRCbG9ja051bWJlcjsKCiAgY29uc3QgbG9ncyA9IGF3YWl0IGZldGNoTG9nc0Zyb21MMSgKICAgIFsiQmxvY2tWZXJpZmllZCIsICJCbG9ja1ZlcmlmaWVkVjIiXSwKICAgIGZyb21CbG9jaywKICAgIHRvQmxvY2ssCiAgICAiMHgwNmE5QWIyN2M3ZTIyNTVkZjE4MTVFNkNDMDE2OGQ3NzU1RmViMTlhIiwKICAgIEFCSSwKICAgIHRhaWtvTDFQcm92aWRlciwKICApOwoKICBpZiAobG9ncy5sZW5ndGggPT09IDApIHsKICAgIGFsZXJ0T3JnKAogICAgICBub3RpZmljYXRpb25DbGllbnQsCiAgICAgIGBAZGF2aWRjYWkgQHl1ZWE3NTgzIE5vIEJsb2NrVmVyaWZpZWQgZXZlbnQgZGV0ZWN0ZWQgaW4gdGhlIGxhc3QgMzAgbWlucyBpbiBUYWlrb0wxIWAsCiAgICApOwogIH0KCiAgcmV0dXJuIHRydWU7Cn07ClBLAQIUAAoAAAAAAAAAQVBa57hUWxAAAFsQAAAIAAAAAAAAAAAAAAAAAAAAAABpbmRleC5qc1BLBQYAAAAAAQABADYAAACBEAAAAAA="},{"autotaskId":"3cabb163-79fb-432c-a90a-c111b346a209","actionId":"3cabb163-79fb-432c-a90a-c111b346a209","name":"TaikoL1: BlockProposed Alert","paused":false,"trigger":{"cron":null,"frequencyMinutes":4,"type":"schedule"},"codeDigest":"gJSTtL74IDa0ri990g/XL8plt4cMekIIJhdeceam+MY=","stackResourceId":"mystack.taiko-l-1-block-proposed-alert","runtime":"nodejs20.x","dependenciesVersion":"v2024-08-05","encodedZippedCode":"UEsDBAoAAAAAAAAAQVAcjdf6viEAAL4hAAAIAAAAaW5kZXguanNjb25zdCB7IGV0aGVycyB9ID0gcmVxdWlyZSgiZXRoZXJzIik7CmNvbnN0IHsgRGVmZW5kZXIgfSA9IHJlcXVpcmUoIkBvcGVuemVwcGVsaW4vZGVmZW5kZXItc2RrIik7Cgpjb25zdCBBQkkgPSBbCiAgewogICAgYW5vbnltb3VzOiBmYWxzZSwKICAgIGlucHV0czogWwogICAgICB7CiAgICAgICAgaW5kZXhlZDogdHJ1ZSwKICAgICAgICBpbnRlcm5hbFR5cGU6ICJ1aW50MjU2IiwKICAgICAgICBuYW1lOiAiYmxvY2tJZCIsCiAgICAgICAgdHlwZTogInVpbnQyNTYiLAogICAgICB9LAogICAgICB7CiAgICAgICAgaW5kZXhlZDogdHJ1ZSwKICAgICAgICBpbnRlcm5hbFR5cGU6ICJhZGRyZXNzIiwKICAgICAgICBuYW1lOiAiYXNzaWduZWRQcm92ZXIiLAogICAgICAgIHR5cGU6ICJhZGRyZXNzIiwKICAgICAgfSwKICAgICAgewogICAgICAgIGluZGV4ZWQ6IGZhbHNlLAogICAgICAgIGludGVybmFsVHlwZTogInVpbnQ5NiIsCiAgICAgICAgbmFtZTogImxpdmVuZXNzQm9uZCIsCiAgICAgICAgdHlwZTogInVpbnQ5NiIsCiAgICAgIH0sCiAgICAgIHsKICAgICAgICBjb21wb25lbnRzOiBbCiAgICAgICAgICB7CiAgICAgICAgICAgIGludGVybmFsVHlwZTogImJ5dGVzMzIiLAogICAgICAgICAgICBuYW1lOiAibDFIYXNoIiwKICAgICAgICAgICAgdHlwZTogImJ5dGVzMzIiLAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgaW50ZXJuYWxUeXBlOiAiYnl0ZXMzMiIsCiAgICAgICAgICAgIG5hbWU6ICJkaWZmaWN1bHR5IiwKICAgICAgICAgICAgdHlwZTogImJ5dGVzMzIiLAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgaW50ZXJuYWxUeXBlOiAiYnl0ZXMzMiIsCiAgICAgICAgICAgIG5hbWU6ICJibG9iSGFzaCIsCiAgICAgICAgICAgIHR5cGU6ICJieXRlczMyIiwKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgIGludGVybmFsVHlwZTogImJ5dGVzMzIiLAogICAgICAgICAgICBuYW1lOiAiZXh0cmFEYXRhIiwKICAgICAgICAgICAgdHlwZTogImJ5dGVzMzIiLAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgaW50ZXJuYWxUeXBlOiAiYnl0ZXMzMiIsCiAgICAgICAgICAgIG5hbWU6ICJkZXBvc2l0c0hhc2giLAogICAgICAgICAgICB0eXBlOiAiYnl0ZXMzMiIsCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICBpbnRlcm5hbFR5cGU6ICJhZGRyZXNzIiwKICAgICAgICAgICAgbmFtZTogImNvaW5iYXNlIiwKICAgICAgICAgICAgdHlwZTogImFkZHJlc3MiLAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgaW50ZXJuYWxUeXBlOiAidWludDY0IiwKICAgICAgICAgICAgbmFtZTogImlkIiwKICAgICAgICAgICAgdHlwZTogInVpbnQ2NCIsCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICBpbnRlcm5hbFR5cGU6ICJ1aW50MzIiLAogICAgICAgICAgICBuYW1lOiAiZ2FzTGltaXQiLAogICAgICAgICAgICB0eXBlOiAidWludDMyIiwKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgIGludGVybmFsVHlwZTogInVpbnQ2NCIsCiAgICAgICAgICAgIG5hbWU6ICJ0aW1lc3RhbXAiLAogICAgICAgICAgICB0eXBlOiAidWludDY0IiwKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgIGludGVybmFsVHlwZTogInVpbnQ2NCIsCiAgICAgICAgICAgIG5hbWU6ICJsMUhlaWdodCIsCiAgICAgICAgICAgIHR5cGU6ICJ1aW50NjQiLAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgaW50ZXJuYWxUeXBlOiAidWludDE2IiwKICAgICAgICAgICAgbmFtZTogIm1pblRpZXIiLAogICAgICAgICAgICB0eXBlOiAidWludDE2IiwKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgIGludGVybmFsVHlwZTogImJvb2wiLAogICAgICAgICAgICBuYW1lOiAiYmxvYlVzZWQiLAogICAgICAgICAgICB0eXBlOiAiYm9vbCIsCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICBpbnRlcm5hbFR5cGU6ICJieXRlczMyIiwKICAgICAgICAgICAgbmFtZTogInBhcmVudE1ldGFIYXNoIiwKICAgICAgICAgICAgdHlwZTogImJ5dGVzMzIiLAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgaW50ZXJuYWxUeXBlOiAiYWRkcmVzcyIsCiAgICAgICAgICAgIG5hbWU6ICJzZW5kZXIiLAogICAgICAgICAgICB0eXBlOiAiYWRkcmVzcyIsCiAgICAgICAgICB9LAogICAgICAgIF0sCiAgICAgICAgaW5kZXhlZDogZmFsc2UsCiAgICAgICAgaW50ZXJuYWxUeXBlOiAic3RydWN0IFRhaWtvRGF0YS5CbG9ja01ldGFkYXRhIiwKICAgICAgICBuYW1lOiAibWV0YSIsCiAgICAgICAgdHlwZTogInR1cGxlIiwKICAgICAgfSwKICAgICAgewogICAgICAgIGNvbXBvbmVudHM6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgaW50ZXJuYWxUeXBlOiAiYWRkcmVzcyIsCiAgICAgICAgICAgIG5hbWU6ICJyZWNpcGllbnQiLAogICAgICAgICAgICB0eXBlOiAiYWRkcmVzcyIsCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICBpbnRlcm5hbFR5cGU6ICJ1aW50OTYiLAogICAgICAgICAgICBuYW1lOiAiYW1vdW50IiwKICAgICAgICAgICAgdHlwZTogInVpbnQ5NiIsCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICBpbnRlcm5hbFR5cGU6ICJ1aW50NjQiLAogICAgICAgICAgICBuYW1lOiAiaWQiLAogICAgICAgICAgICB0eXBlOiAidWludDY0IiwKICAgICAgICAgIH0sCiAgICAgICAgXSwKICAgICAgICBpbmRleGVkOiBmYWxzZSwKICAgICAgICBpbnRlcm5hbFR5cGU6ICJzdHJ1Y3QgVGFpa29EYXRhLkV0aERlcG9zaXRbXSIsCiAgICAgICAgbmFtZTogImRlcG9zaXRzUHJvY2Vzc2VkIiwKICAgICAgICB0eXBlOiAidHVwbGVbXSIsCiAgICAgIH0sCiAgICBdLAogICAgbmFtZTogIkJsb2NrUHJvcG9zZWQiLAogICAgdHlwZTogImV2ZW50IiwKICB9LAogIHsKICAgIGFub255bW91czogZmFsc2UsCiAgICBpbnB1dHM6IFsKICAgICAgewogICAgICAgIGluZGV4ZWQ6IHRydWUsCiAgICAgICAgaW50ZXJuYWxUeXBlOiAidWludDI1NiIsCiAgICAgICAgbmFtZTogImJsb2NrSWQiLAogICAgICAgIHR5cGU6ICJ1aW50MjU2IiwKICAgICAgfSwKICAgICAgewogICAgICAgIGluZGV4ZWQ6IHRydWUsCiAgICAgICAgaW50ZXJuYWxUeXBlOiAiYWRkcmVzcyIsCiAgICAgICAgbmFtZTogImFzc2lnbmVkUHJvdmVyIiwKICAgICAgICB0eXBlOiAiYWRkcmVzcyIsCiAgICAgIH0sCiAgICAgIHsKICAgICAgICBpbmRleGVkOiBmYWxzZSwKICAgICAgICBpbnRlcm5hbFR5cGU6ICJ1aW50OTYiLAogICAgICAgIG5hbWU6ICJsaXZlbmVzc0JvbmQiLAogICAgICAgIHR5cGU6ICJ1aW50OTYiLAogICAgICB9LAogICAgICB7CiAgICAgICAgY29tcG9uZW50czogWwogICAgICAgICAgewogICAgICAgICAgICBpbnRlcm5hbFR5cGU6ICJieXRlczMyIiwKICAgICAgICAgICAgbmFtZTogImwxSGFzaCIsCiAgICAgICAgICAgIHR5cGU6ICJieXRlczMyIiwKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgIGludGVybmFsVHlwZTogImJ5dGVzMzIiLAogICAgICAgICAgICBuYW1lOiAiZGlmZmljdWx0eSIsCiAgICAgICAgICAgIHR5cGU6ICJieXRlczMyIiwKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgIGludGVybmFsVHlwZTogImJ5dGVzMzIiLAogICAgICAgICAgICBuYW1lOiAiYmxvYkhhc2giLAogICAgICAgICAgICB0eXBlOiAiYnl0ZXMzMiIsCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICBpbnRlcm5hbFR5cGU6ICJieXRlczMyIiwKICAgICAgICAgICAgbmFtZTogImV4dHJhRGF0YSIsCiAgICAgICAgICAgIHR5cGU6ICJieXRlczMyIiwKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgIGludGVybmFsVHlwZTogImJ5dGVzMzIiLAogICAgICAgICAgICBuYW1lOiAiZGVwb3NpdHNIYXNoIiwKICAgICAgICAgICAgdHlwZTogImJ5dGVzMzIiLAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgaW50ZXJuYWxUeXBlOiAiYWRkcmVzcyIsCiAgICAgICAgICAgIG5hbWU6ICJjb2luYmFzZSIsCiAgICAgICAgICAgIHR5cGU6ICJhZGRyZXNzIiwKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgIGludGVybmFsVHlwZTogInVpbnQ2NCIsCiAgICAgICAgICAgIG5hbWU6ICJpZCIsCiAgICAgICAgICAgIHR5cGU6ICJ1aW50NjQiLAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgaW50ZXJuYWxUeXBlOiAidWludDMyIiwKICAgICAgICAgICAgbmFtZTogImdhc0xpbWl0IiwKICAgICAgICAgICAgdHlwZTogInVpbnQzMiIsCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICBpbnRlcm5hbFR5cGU6ICJ1aW50NjQiLAogICAgICAgICAgICBuYW1lOiAidGltZXN0YW1wIiwKICAgICAgICAgICAgdHlwZTogInVpbnQ2NCIsCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICBpbnRlcm5hbFR5cGU6ICJ1aW50NjQiLAogICAgICAgICAgICBuYW1lOiAibDFIZWlnaHQiLAogICAgICAgICAgICB0eXBlOiAidWludDY0IiwKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgIGludGVybmFsVHlwZTogInVpbnQxNiIsCiAgICAgICAgICAgIG5hbWU6ICJtaW5UaWVyIiwKICAgICAgICAgICAgdHlwZTogInVpbnQxNiIsCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICBpbnRlcm5hbFR5cGU6ICJib29sIiwKICAgICAgICAgICAgbmFtZTogImJsb2JVc2VkIiwKICAgICAgICAgICAgdHlwZTogImJvb2wiLAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgaW50ZXJuYWxUeXBlOiAiYnl0ZXMzMiIsCiAgICAgICAgICAgIG5hbWU6ICJwYXJlbnRNZXRhSGFzaCIsCiAgICAgICAgICAgIHR5cGU6ICJieXRlczMyIiwKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgIGludGVybmFsVHlwZTogImFkZHJlc3MiLAogICAgICAgICAgICBuYW1lOiAic2VuZGVyIiwKICAgICAgICAgICAgdHlwZTogImFkZHJlc3MiLAogICAgICAgICAgfSwKICAgICAgICBdLAogICAgICAgIGluZGV4ZWQ6IGZhbHNlLAogICAgICAgIGludGVybmFsVHlwZTogInN0cnVjdCBUYWlrb0RhdGEuQmxvY2tNZXRhZGF0YSIsCiAgICAgICAgbmFtZTogIm1ldGEiLAogICAgICAgIHR5cGU6ICJ0dXBsZSIsCiAgICAgIH0sCiAgICAgIHsKICAgICAgICBjb21wb25lbnRzOiBbCiAgICAgICAgICB7CiAgICAgICAgICAgIGludGVybmFsVHlwZTogImFkZHJlc3MiLAogICAgICAgICAgICBuYW1lOiAicmVjaXBpZW50IiwKICAgICAgICAgICAgdHlwZTogImFkZHJlc3MiLAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgaW50ZXJuYWxUeXBlOiAidWludDk2IiwKICAgICAgICAgICAgbmFtZTogImFtb3VudCIsCiAgICAgICAgICAgIHR5cGU6ICJ1aW50OTYiLAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgaW50ZXJuYWxUeXBlOiAidWludDY0IiwKICAgICAgICAgICAgbmFtZTogImlkIiwKICAgICAgICAgICAgdHlwZTogInVpbnQ2NCIsCiAgICAgICAgICB9LAogICAgICAgIF0sCiAgICAgICAgaW5kZXhlZDogZmFsc2UsCiAgICAgICAgaW50ZXJuYWxUeXBlOiAic3RydWN0IFRhaWtvRGF0YS5FdGhEZXBvc2l0W10iLAogICAgICAgIG5hbWU6ICJkZXBvc2l0c1Byb2Nlc3NlZCIsCiAgICAgICAgdHlwZTogInR1cGxlW10iLAogICAgICB9LAogICAgXSwKICAgIG5hbWU6ICJCbG9ja1Byb3Bvc2VkVjIiLAogICAgdHlwZTogImV2ZW50IiwKICB9LApdOwoKZnVuY3Rpb24gYWxlcnRPcmcobm90aWZpY2F0aW9uQ2xpZW50LCBtZXNzYWdlKSB7CiAgbm90aWZpY2F0aW9uQ2xpZW50LnNlbmQoewogICAgY2hhbm5lbEFsaWFzOiAiZGlzY29yZF9ibG9ja3MiLAogICAgc3ViamVjdDogIvCfmqggVGFpa29MMTogQmxvY2tQcm9wb3NlZCBBbGVydCIsCiAgICBtZXNzYWdlLAogIH0pOwoKICBub3RpZmljYXRpb25DbGllbnQuc2VuZCh7CiAgICBjaGFubmVsQWxpYXM6ICJ0Z190YWlrb19ndWFyZGlhbnMiLAogICAgc3ViamVjdDogIvCfmqggVGFpa29MMTogQmxvY2tQcm9wb3NlZCBBbGVydCIsCiAgICBtZXNzYWdlLAogIH0pOwp9Cgphc3luYyBmdW5jdGlvbiBnZXRMYXRlc3RCbG9ja051bWJlcihwcm92aWRlcikgewogIGNvbnN0IGN1cnJlbnRCbG9jayA9IGF3YWl0IHByb3ZpZGVyLmdldEJsb2NrKCJsYXRlc3QiKTsKICByZXR1cm4gY3VycmVudEJsb2NrLm51bWJlcjsKfQoKYXN5bmMgZnVuY3Rpb24gZmV0Y2hMb2dzRnJvbUwxKAogIGV2ZW50TmFtZXMsCiAgZnJvbUJsb2NrLAogIHRvQmxvY2ssCiAgYWRkcmVzcywKICBhYmksCiAgcHJvdmlkZXIsCikgewogIGNvbnN0IGlmYWNlID0gbmV3IGV0aGVycy51dGlscy5JbnRlcmZhY2UoYWJpKTsKCiAgY29uc3QgYWxsTG9ncyA9IFtdOwoKICBmb3IgKGNvbnN0IGV2ZW50TmFtZSBvZiBldmVudE5hbWVzKSB7CiAgICBjb25zdCBldmVudFRvcGljID0gaWZhY2UuZ2V0RXZlbnRUb3BpYyhldmVudE5hbWUpOwoKICAgIHRyeSB7CiAgICAgIGNvbnN0IGxvZ3MgPSBhd2FpdCBwcm92aWRlci5nZXRMb2dzKHsKICAgICAgICBhZGRyZXNzLAogICAgICAgIGZyb21CbG9jaywKICAgICAgICB0b0Jsb2NrLAogICAgICAgIHRvcGljczogW2V2ZW50VG9waWNdLAogICAgICB9KTsKCiAgICAgIGFsbExvZ3MucHVzaCgKICAgICAgICAuLi5sb2dzLm1hcCgobG9nKSA9PgogICAgICAgICAgaWZhY2UuZGVjb2RlRXZlbnRMb2coZXZlbnROYW1lLCBsb2cuZGF0YSwgbG9nLnRvcGljcyksCiAgICAgICAgKSwKICAgICAgKTsKICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgIGNvbnNvbGUuZXJyb3IoYEVycm9yIGZldGNoaW5nIGxvZ3MgZm9yICR7ZXZlbnROYW1lfTpgLCBlcnJvcik7CiAgICB9CiAgfQoKICByZXR1cm4gYWxsTG9nczsKfQoKZnVuY3Rpb24gY3JlYXRlUHJvdmlkZXIoYXBpS2V5LCBhcGlTZWNyZXQsIHJlbGF5ZXJBcGlLZXksIHJlbGF5ZXJBcGlTZWNyZXQpIHsKICBjb25zdCBjbGllbnQgPSBuZXcgRGVmZW5kZXIoewogICAgYXBpS2V5LAogICAgYXBpU2VjcmV0LAogICAgcmVsYXllckFwaUtleSwKICAgIHJlbGF5ZXJBcGlTZWNyZXQsCiAgfSk7CgogIHJldHVybiBjbGllbnQucmVsYXlTaWduZXIuZ2V0UHJvdmlkZXIoKTsKfQoKYXN5bmMgZnVuY3Rpb24gY2FsY3VsYXRlQmxvY2tUaW1lKHByb3ZpZGVyKSB7CiAgY29uc3QgbGF0ZXN0QmxvY2sgPSBhd2FpdCBwcm92aWRlci5nZXRCbG9jaygibGF0ZXN0Iik7CiAgY29uc3QgcHJldmlvdXNCbG9jayA9IGF3YWl0IHByb3ZpZGVyLmdldEJsb2NrKGxhdGVzdEJsb2NrLm51bWJlciAtIDEwMCk7CgogIGNvbnN0IHRpbWVEaWZmID0gbGF0ZXN0QmxvY2sudGltZXN0YW1wIC0gcHJldmlvdXNCbG9jay50aW1lc3RhbXA7CiAgY29uc3QgYmxvY2tEaWZmID0gbGF0ZXN0QmxvY2subnVtYmVyIC0gcHJldmlvdXNCbG9jay5udW1iZXI7CgogIGNvbnN0IGJsb2NrVGltZSA9IHRpbWVEaWZmIC8gYmxvY2tEaWZmOwogIHJldHVybiBibG9ja1RpbWU7Cn0KCmV4cG9ydHMuaGFuZGxlciA9IGFzeW5jIGZ1bmN0aW9uIChldmVudCwgY29udGV4dCkgewogIGNvbnN0IHsgbm90aWZpY2F0aW9uQ2xpZW50IH0gPSBjb250ZXh0OwogIGNvbnN0IHsgYXBpS2V5LCBhcGlTZWNyZXQsIHRhaWtvTDFBcGlLZXksIHRhaWtvTDFBcGlTZWNyZXQgfSA9IGV2ZW50LnNlY3JldHM7CgogIGNvbnN0IHRhaWtvTDFQcm92aWRlciA9IGNyZWF0ZVByb3ZpZGVyKAogICAgYXBpS2V5LAogICAgYXBpU2VjcmV0LAogICAgdGFpa29MMUFwaUtleSwKICAgIHRhaWtvTDFBcGlTZWNyZXQsCiAgKTsKCiAgY29uc3QgY3VycmVudEJsb2NrTnVtYmVyID0gYXdhaXQgZ2V0TGF0ZXN0QmxvY2tOdW1iZXIodGFpa29MMVByb3ZpZGVyKTsKICBjb25zdCBibG9ja1RpbWVJblNlY29uZHMgPSBhd2FpdCBjYWxjdWxhdGVCbG9ja1RpbWUodGFpa29MMVByb3ZpZGVyKTsKICBjb25zdCBibG9ja3NJbkZpdmVNaW51dGVzID0gTWF0aC5mbG9vcigoNSAqIDYwKSAvIGJsb2NrVGltZUluU2Vjb25kcyk7CgogIGNvbnN0IGZyb21CbG9jayA9IGN1cnJlbnRCbG9ja051bWJlciAtIGJsb2Nrc0luRml2ZU1pbnV0ZXM7CiAgY29uc3QgdG9CbG9jayA9IGN1cnJlbnRCbG9ja051bWJlcjsKCiAgY29uc3QgbG9ncyA9IGF3YWl0IGZldGNoTG9nc0Zyb21MMSgKICAgIFsiQmxvY2tQcm9wb3NlZCIsICJCbG9ja1Byb3Bvc2VkVjIiXSwKICAgIGZyb21CbG9jaywKICAgIHRvQmxvY2ssCiAgICAiMHgwNmE5QWIyN2M3ZTIyNTVkZjE4MTVFNkNDMDE2OGQ3NzU1RmViMTlhIiwKICAgIEFCSSwKICAgIHRhaWtvTDFQcm92aWRlciwKICApOwoKICBjb25zb2xlLmxvZyhgTG9ncyBmb3VuZDogJHtsb2dzLmxlbmd0aH1gKTsKCiAgaWYgKGxvZ3MubGVuZ3RoID09PSAwKSB7CiAgICBhbGVydE9yZygKICAgICAgbm90aWZpY2F0aW9uQ2xpZW50LAogICAgICBgTm8gQmxvY2tQcm9wb3NlZCBldmVudCBkZXRlY3RlZCBpbiB0aGUgbGFzdCAxNSBtaW5zIG9uIFRhaWtvTDEhYCwKICAgICk7CiAgfQoKICByZXR1cm4gdHJ1ZTsKfTsKUEsBAhQACgAAAAAAAABBUByN1/q+IQAAviEAAAgAAAAAAAAAAAAAAAAAAAAAAGluZGV4LmpzUEsFBgAAAAABAAEANgAAAOQhAAAAAA=="}]},"contracts":{"removed":[],"created":[],"updated":[]},"relayers":{"removed":[],"created":[],"updated":[],"relayerKeys":{"removed":[],"created":[],"updated":[]}},"notifications":{"removed":[],"created":[],"updated":[]},"secrets":{"removed":[],"created":[],"updated":[]},"blockExplorerApiKeys":{"removed":[],"created":[],"updated":[]},"forkedNetworks":{"removed":[],"created":[],"updated":[]},"privateNetworks":{"removed":[],"created":[],"updated":[]}} +{"stack":"mystack","timestamp":"2024-09-18T21:48:09.627Z","monitors":{"removed":[],"created":[],"updated":[{"skipABIValidation":true,"alertThreshold":null,"notifyConfig":{"severityLevel":"MEDIUM","messageBody":"**Defender Monitor {{ sentinel.name }} Triggered**\n\n**Network**\n\n{{ sentinel.network }}\n\n**Block Hash**\n\n{{ blockHash }}\n\n**Transaction Hash**\n\n{{ transaction.transactionHash }}\n\n**Explorer Link**\n\n{{ transaction.link }}\n\n**Match Reasons**\n\n{{ matchReasonsFormatted }}\n\n**Metadata**\n\n{{ metadataFormatted }}","messageSubject":"Defender Monitor: TaikoL1: Pause/Unpause triggered","notifications":[{"type":"discord","sendCount":0,"notificationId":"93e8dbf2-4f87-4793-b3c3-6ff0dd6cf827"}],"timeoutMs":60000},"tenantId":"0691b59e-8b53-4ae2-b874-959de8a9f2ee","addressRules":[{"conditions":[{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"Paused(address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"Unpaused(address)","expression":null}]}],"abi":"[{\"type\":\"error\",\"name\":\"AM_ADDRESS_ALREADY_SET\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"AddressSet\",\"inputs\":[{\"type\":\"uint64\",\"name\":\"chainId\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"name\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newAddress\",\"indexed\":false},{\"type\":\"address\",\"name\":\"oldAddress\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"AdminChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousAdmin\",\"indexed\":false},{\"type\":\"address\",\"name\":\"newAdmin\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Approval\",\"inputs\":[{\"type\":\"address\",\"name\":\"owner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"spender\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"value\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Approval\",\"inputs\":[{\"type\":\"address\",\"name\":\"owner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"approved\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"tokenId\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"ApprovalForAll\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":true},{\"type\":\"address\",\"name\":\"operator\",\"indexed\":true},{\"type\":\"bool\",\"name\":\"approved\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Approved\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"operationId\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"approvalBits\",\"indexed\":false},{\"type\":\"bool\",\"name\":\"minGuardiansReached\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Authorized\",\"inputs\":[{\"type\":\"address\",\"name\":\"addr\",\"indexed\":true},{\"type\":\"bool\",\"name\":\"authorized\",\"indexed\":false}]},{\"type\":\"error\",\"name\":\"BB_INVALID_PARAMS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BB_MINT_DISALLOWED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BB_PERMISSION_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BTOKEN_CANNOT_RECEIVE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BTOKEN_INVALID_BURN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BTOKEN_INVALID_PARAMS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INSUFFICIENT_GAS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_CONTEXT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_FEE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_GAS_LIMIT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_VALUE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_MESSAGE_NOT_SENT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_OUT_OF_ETH_QUOTA\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_PERMISSION_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_PROOF_TOO_LARGE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_RETRY_FAILED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_SIGNAL_NOT_RECEIVED\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BeaconUpgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"beacon\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BlockProposed\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"address\",\"name\":\"assignedProver\",\"indexed\":true},{\"type\":\"uint96\",\"name\":\"livenessBond\",\"indexed\":false},{\"type\":\"tuple\",\"name\":\"meta\",\"indexed\":false,\"components\":[{\"type\":\"bytes32\",\"name\":\"l1Hash\"},{\"type\":\"bytes32\",\"name\":\"difficulty\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"bytes32\",\"name\":\"extraData\"},{\"type\":\"bytes32\",\"name\":\"depositsHash\"},{\"type\":\"address\",\"name\":\"coinbase\"},{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"uint64\",\"name\":\"timestamp\"},{\"type\":\"uint64\",\"name\":\"l1Height\"},{\"type\":\"uint16\",\"name\":\"minTier\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"bytes32\",\"name\":\"parentMetaHash\"},{\"type\":\"address\",\"name\":\"sender\"}]},{\"type\":\"tuple[]\",\"name\":\"depositsProcessed\",\"indexed\":false,\"components\":[{\"type\":\"address\",\"name\":\"recipient\"},{\"type\":\"uint96\",\"name\":\"amount\"},{\"type\":\"uint64\",\"name\":\"id\"}]}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BlockVerified\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"address\",\"name\":\"prover\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"blockHash\",\"indexed\":false},{\"type\":\"bytes32\",\"name\":\"stateRoot\",\"indexed\":false},{\"type\":\"uint16\",\"name\":\"tier\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BondCredited\",\"inputs\":[{\"type\":\"address\",\"name\":\"user\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"amount\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BondDebited\",\"inputs\":[{\"type\":\"address\",\"name\":\"user\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"amount\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BridgedTokenChanged\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"srcChainId\",\"indexed\":true},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":true},{\"type\":\"address\",\"name\":\"btokenOld\",\"indexed\":false},{\"type\":\"address\",\"name\":\"btokenNew\",\"indexed\":false},{\"type\":\"string\",\"name\":\"ctokenSymbol\",\"indexed\":false},{\"type\":\"string\",\"name\":\"ctokenName\",\"indexed\":false},{\"type\":\"uint8\",\"name\":\"ctokenDecimal\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BridgedTokenDeployed\",\"inputs\":[{\"type\":\"uint64\",\"name\":\"chainId\",\"indexed\":true},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":true},{\"type\":\"address\",\"name\":\"btoken\",\"indexed\":true},{\"type\":\"string\",\"name\":\"ctokenSymbol\",\"indexed\":false},{\"type\":\"string\",\"name\":\"ctokenName\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BridgedTokenDeployed\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"srcChainId\",\"indexed\":true},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":true},{\"type\":\"address\",\"name\":\"btoken\",\"indexed\":true},{\"type\":\"string\",\"name\":\"ctokenSymbol\",\"indexed\":false},{\"type\":\"string\",\"name\":\"ctokenName\",\"indexed\":false},{\"type\":\"uint8\",\"name\":\"ctokenDecimal\",\"indexed\":false}]},{\"type\":\"function\",\"name\":\"CLOCK_MODE\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"string\"}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"CalldataTxList\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"bytes\",\"name\":\"txList\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"ChainDataSynced\",\"inputs\":[{\"type\":\"uint64\",\"name\":\"chainId\",\"indexed\":true},{\"type\":\"uint64\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"kind\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"data\",\"indexed\":false},{\"type\":\"bytes32\",\"name\":\"signal\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"ConflictingProofs\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"address\",\"name\":\"guardian\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"currentProofHash\",\"indexed\":false},{\"type\":\"bytes32\",\"name\":\"newProofHash\",\"indexed\":false},{\"type\":\"bool\",\"name\":\"provingPaused\",\"indexed\":false}]},{\"type\":\"function\",\"name\":\"DOMAIN_SEPARATOR\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"DelegateChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"delegator\",\"indexed\":true},{\"type\":\"address\",\"name\":\"fromDelegate\",\"indexed\":true},{\"type\":\"address\",\"name\":\"toDelegate\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"DelegateVotesChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"delegate\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"previousBalance\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"newBalance\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"EIP712DomainChanged\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ETH_TRANSFER_FAILED\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"EtherPaymentFailed\",\"inputs\":[{\"type\":\"address\",\"name\":\"to\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"maxGas\",\"indexed\":false}]},{\"type\":\"error\",\"name\":\"FUNC_NOT_IMPLEMENTED\",\"inputs\":[]},{\"type\":\"function\",\"name\":\"GAS_OVERHEAD\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint32\"}]},{\"type\":\"function\",\"name\":\"GAS_RESERVE\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"GP_INVALID_GUARDIAN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GP_INVALID_GUARDIAN_SET\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GP_INVALID_MIN_GUARDIANS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GP_INVALID_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GV_PERMISSION_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GV_ZERO_ADDRESS\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"GuardianApproval\",\"inputs\":[{\"type\":\"address\",\"name\":\"addr\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"blockHash\",\"indexed\":true},{\"type\":\"bool\",\"name\":\"approved\",\"indexed\":false},{\"type\":\"bytes\",\"name\":\"proofData\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"GuardiansUpdated\",\"inputs\":[{\"type\":\"uint32\",\"name\":\"version\",\"indexed\":false},{\"type\":\"address[]\",\"name\":\"guardians\",\"indexed\":false}]},{\"type\":\"error\",\"name\":\"HOOK_ASSIGNMENT_EXPIRED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"HOOK_ASSIGNMENT_INVALID_SIG\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"HOOK_TIER_NOT_FOUND\",\"inputs\":[]},{\"type\":\"function\",\"name\":\"INSTANCE_EXPIRY\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"INSTANCE_VALIDITY_DELAY\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Initialized\",\"inputs\":[{\"type\":\"uint8\",\"name\":\"version\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"InstanceAdded\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"id\",\"indexed\":true},{\"type\":\"address\",\"name\":\"instance\",\"indexed\":true},{\"type\":\"address\",\"name\":\"replaced\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"validSince\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"InstanceDeleted\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"id\",\"indexed\":true},{\"type\":\"address\",\"name\":\"instance\",\"indexed\":true}]},{\"type\":\"error\",\"name\":\"L1_ALREADY_CONTESTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_ALREADY_PROVED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOB_NOT_AVAILABLE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOB_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOCK_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_CANNOT_CONTEST\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_BLOCK_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_GENESIS_HASH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_SIG\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_TIER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_TRANSITION\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_NOT_ASSIGNED_PROVER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_PROVING_PAUSED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_RECEIVE_DISABLED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TOO_MANY_BLOCKS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TRANSITION_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNEXPECTED_PARENT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNEXPECTED_TRANSITION_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"LTP_INVALID_ACCOUNT_PROOF\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"LTP_INVALID_INCLUSION_PROOF\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"LocalReportCheckToggled\",\"inputs\":[{\"type\":\"bool\",\"name\":\"checkLocalEnclaveReport\",\"indexed\":false}]},{\"type\":\"function\",\"name\":\"MAX_GAS_PAYING_PROVER\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"MIN_MIGRATION_DELAY\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MessageProcessed\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"tuple\",\"name\":\"message\",\"indexed\":false,\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"tuple\",\"name\":\"stats\",\"indexed\":false,\"components\":[{\"type\":\"uint32\",\"name\":\"gasUsedInFeeCalc\"},{\"type\":\"uint32\",\"name\":\"proofSize\"},{\"type\":\"uint32\",\"name\":\"numCacheOps\"},{\"type\":\"bool\",\"name\":\"processedByRelayer\"}]}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MessageSent\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"tuple\",\"name\":\"message\",\"indexed\":false,\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MessageStatusChanged\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"uint8\",\"name\":\"status\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MigratedTo\",\"inputs\":[{\"type\":\"address\",\"name\":\"fromToken\",\"indexed\":true},{\"type\":\"address\",\"name\":\"account\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"amount\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MigrationStatusChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"addr\",\"indexed\":false},{\"type\":\"bool\",\"name\":\"inbound\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MrEnclaveUpdated\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"mrEnclave\",\"indexed\":true},{\"type\":\"bool\",\"name\":\"trusted\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MrSignerUpdated\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"mrSigner\",\"indexed\":true},{\"type\":\"bool\",\"name\":\"trusted\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferred\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Paused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"ProvingAutoPauseEnabled\",\"inputs\":[{\"type\":\"bool\",\"name\":\"enabled\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"ProvingPaused\",\"inputs\":[{\"type\":\"bool\",\"name\":\"paused\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"QeIdentityConfigured\",\"inputs\":[{\"type\":\"tuple\",\"name\":\"qeIdentityInput\",\"indexed\":false,\"components\":[{\"type\":\"bytes4\",\"name\":\"miscselect\"},{\"type\":\"bytes4\",\"name\":\"miscselectMask\"},{\"type\":\"uint16\",\"name\":\"isvprodid\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes16\",\"name\":\"attributesMask\"},{\"type\":\"bytes32\",\"name\":\"mrsigner\"},{\"type\":\"tuple[]\",\"name\":\"tcbLevels\",\"components\":[{\"type\":\"tuple\",\"name\":\"tcb\",\"components\":[{\"type\":\"uint16\",\"name\":\"isvsvn\"}]},{\"type\":\"uint8\",\"name\":\"tcbStatus\"}]}]}]},{\"type\":\"error\",\"name\":\"REENTRANT_CALL\",\"inputs\":[]},{\"type\":\"function\",\"name\":\"RELAYER_MAX_PROOF_BYTES\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"RESOLVER_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_INVALID_MANAGER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_UNEXPECTED_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_ZERO_ADDR\",\"inputs\":[{\"type\":\"uint64\",\"name\":\"chainId\"},{\"type\":\"bytes32\",\"name\":\"name\"}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"RevokedCertSerialNumAdded\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"index\",\"indexed\":true},{\"type\":\"bytes\",\"name\":\"serialNum\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"RevokedCertSerialNumRemoved\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"index\",\"indexed\":true},{\"type\":\"bytes\",\"name\":\"serialNum\",\"indexed\":false}]},{\"type\":\"error\",\"name\":\"SGX_ALREADY_ATTESTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SGX_INVALID_ATTESTATION\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SGX_INVALID_INSTANCE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SGX_INVALID_PROOF\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SGX_RA_NOT_SUPPORTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_EMPTY_PROOF\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_INVALID_HOPS_WITH_LOOP\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_INVALID_LAST_HOP_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_INVALID_MID_HOP_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_INVALID_STATE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_SIGNAL_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_UNAUTHORIZED\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"SignalSent\",\"inputs\":[{\"type\":\"address\",\"name\":\"app\",\"indexed\":false},{\"type\":\"bytes32\",\"name\":\"signal\",\"indexed\":false},{\"type\":\"bytes32\",\"name\":\"slot\",\"indexed\":false},{\"type\":\"bytes32\",\"name\":\"value\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"StateVariablesUpdated\",\"inputs\":[{\"type\":\"tuple\",\"name\":\"slotB\",\"indexed\":false,\"components\":[{\"type\":\"uint64\",\"name\":\"numBlocks\"},{\"type\":\"uint64\",\"name\":\"lastVerifiedBlockId\"},{\"type\":\"bool\",\"name\":\"provingPaused\"},{\"type\":\"uint8\",\"name\":\"__reservedB1\"},{\"type\":\"uint16\",\"name\":\"__reservedB2\"},{\"type\":\"uint32\",\"name\":\"__reservedB3\"},{\"type\":\"uint64\",\"name\":\"lastUnpausedAt\"}]}]},{\"type\":\"error\",\"name\":\"TIER_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"TT_INVALID_PARAM\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TcbInfoJsonConfigured\",\"inputs\":[{\"type\":\"string\",\"name\":\"fmspc\",\"indexed\":true},{\"type\":\"tuple\",\"name\":\"tcbInfoInput\",\"indexed\":false,\"components\":[{\"type\":\"string\",\"name\":\"pceid\"},{\"type\":\"string\",\"name\":\"fmspc\"},{\"type\":\"tuple[]\",\"name\":\"tcbLevels\",\"components\":[{\"type\":\"uint256\",\"name\":\"pcesvn\"},{\"type\":\"uint8[]\",\"name\":\"sgxTcbCompSvnArr\"},{\"type\":\"uint8\",\"name\":\"status\"}]}]}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TokenReceived\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint64\",\"name\":\"srcChainId\",\"indexed\":false},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":false},{\"type\":\"address\",\"name\":\"token\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"tokenIds\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"amounts\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TokenReceived\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint64\",\"name\":\"srcChainId\",\"indexed\":false},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":false},{\"type\":\"address\",\"name\":\"token\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"amount\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TokenReleased\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":false},{\"type\":\"address\",\"name\":\"token\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"tokenIds\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"amounts\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TokenReleased\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":false},{\"type\":\"address\",\"name\":\"token\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"amount\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TokenSent\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint64\",\"name\":\"destChainId\",\"indexed\":false},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":false},{\"type\":\"address\",\"name\":\"token\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"tokenIds\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"amounts\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TokenSent\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint64\",\"name\":\"canonicalChainId\",\"indexed\":false},{\"type\":\"uint64\",\"name\":\"destChainId\",\"indexed\":false},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":false},{\"type\":\"address\",\"name\":\"token\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"amount\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Transfer\",\"inputs\":[{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"value\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Transfer\",\"inputs\":[{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"tokenId\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TransferBatch\",\"inputs\":[{\"type\":\"address\",\"name\":\"operator\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint256[]\",\"name\":\"ids\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"values\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TransferSingle\",\"inputs\":[{\"type\":\"address\",\"name\":\"operator\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"id\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"value\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TransitionContested\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"tuple\",\"name\":\"tran\",\"indexed\":false,\"components\":[{\"type\":\"bytes32\",\"name\":\"parentHash\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"bytes32\",\"name\":\"graffiti\"}]},{\"type\":\"address\",\"name\":\"contester\",\"indexed\":false},{\"type\":\"uint96\",\"name\":\"contestBond\",\"indexed\":false},{\"type\":\"uint16\",\"name\":\"tier\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TransitionProved\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"tuple\",\"name\":\"tran\",\"indexed\":false,\"components\":[{\"type\":\"bytes32\",\"name\":\"parentHash\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"bytes32\",\"name\":\"graffiti\"}]},{\"type\":\"address\",\"name\":\"prover\",\"indexed\":false},{\"type\":\"uint96\",\"name\":\"validityBond\",\"indexed\":false},{\"type\":\"uint16\",\"name\":\"tier\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"URI\",\"inputs\":[{\"type\":\"string\",\"name\":\"value\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"id\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Unpaused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Upgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"implementation\",\"indexed\":true}]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_CERTIFICATION_CHAIN_DATA\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_CERTIFICATION_CHAIN_SIZE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_ECDSA_SIGNATURE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_QEAUTHDATA_SIZE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_QEREPORT_LENGTN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_QUOTE_LENGTN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_QUOTE_MEMBER_LENGTN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_UNSUPPORT_CERTIFICATION_TYPE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_BTOKEN_BLACKLISTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_CTOKEN_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INSUFFICIENT_FEE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INTERFACE_NOT_SUPPORTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_AMOUNT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_CTOKEN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_NEW_BTOKEN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_TOKEN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_TO_ADDR\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_LAST_MIGRATION_TOO_CLOSE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_PERMISSION_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_TOKEN_ARRAY_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_ADDRESS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_ADDR_MANAGER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_VALUE\",\"inputs\":[]},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"addInstances\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address[]\",\"name\":\"_instances\"}],\"outputs\":[{\"type\":\"uint256[]\"}]},{\"type\":\"function\",\"name\":\"addRevokedCertSerialNum\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"index\"},{\"type\":\"bytes[]\",\"name\":\"serialNumBatch\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"addressManager\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"addressRegistered\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"instanceAddress\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"alreadyAttested\"}]},{\"type\":\"function\",\"name\":\"allowance\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"owner\"},{\"type\":\"address\",\"name\":\"spender\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"approvals\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"version\"},{\"type\":\"bytes32\",\"name\":\"proofHash\"}],\"outputs\":[{\"type\":\"uint256\",\"name\":\"approvalBits\"}]},{\"type\":\"function\",\"name\":\"approve\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"spender\"},{\"type\":\"uint256\",\"name\":\"amount\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"approve\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_meta\",\"components\":[{\"type\":\"bytes32\",\"name\":\"l1Hash\"},{\"type\":\"bytes32\",\"name\":\"difficulty\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"bytes32\",\"name\":\"extraData\"},{\"type\":\"bytes32\",\"name\":\"depositsHash\"},{\"type\":\"address\",\"name\":\"coinbase\"},{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"uint64\",\"name\":\"timestamp\"},{\"type\":\"uint64\",\"name\":\"l1Height\"},{\"type\":\"uint16\",\"name\":\"minTier\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"bytes32\",\"name\":\"parentMetaHash\"},{\"type\":\"address\",\"name\":\"sender\"}]},{\"type\":\"tuple\",\"name\":\"_tran\",\"components\":[{\"type\":\"bytes32\",\"name\":\"parentHash\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"bytes32\",\"name\":\"graffiti\"}]},{\"type\":\"tuple\",\"name\":\"_proof\",\"components\":[{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[{\"type\":\"bool\",\"name\":\"approved_\"}]},{\"type\":\"function\",\"name\":\"approve\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"tokenId\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"authorize\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_addr\"},{\"type\":\"bool\",\"name\":\"_authorize\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"balanceOf\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"balanceOf\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"},{\"type\":\"uint256\",\"name\":\"id\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"balanceOfBatch\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address[]\",\"name\":\"accounts\"},{\"type\":\"uint256[]\",\"name\":\"ids\"}],\"outputs\":[{\"type\":\"uint256[]\"}]},{\"type\":\"function\",\"name\":\"batchTransfer\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address[]\",\"name\":\"recipients\"},{\"type\":\"uint256[]\",\"name\":\"amounts\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"bondBalanceOf\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_user\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"bridgedToCanonical\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"btoken\"}],\"outputs\":[{\"type\":\"uint64\",\"name\":\"chainId\"},{\"type\":\"address\",\"name\":\"addr\"},{\"type\":\"string\",\"name\":\"symbol\"},{\"type\":\"string\",\"name\":\"name\"}]},{\"type\":\"function\",\"name\":\"bridgedToCanonical\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"btoken\"}],\"outputs\":[{\"type\":\"uint64\",\"name\":\"chainId\"},{\"type\":\"address\",\"name\":\"addr\"},{\"type\":\"uint8\",\"name\":\"decimals\"},{\"type\":\"string\",\"name\":\"symbol\"},{\"type\":\"string\",\"name\":\"name\"}]},{\"type\":\"function\",\"name\":\"btokenDenylist\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"btoken\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"denied\"}]},{\"type\":\"function\",\"name\":\"burn\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_account\"},{\"type\":\"uint256\",\"name\":\"_tokenId\"},{\"type\":\"uint256\",\"name\":\"_amount\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"burn\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_account\"},{\"type\":\"uint256\",\"name\":\"_tokenId\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"burn\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"_amount\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"canonical\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"},{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"canonicalToBridged\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"chainId\"},{\"type\":\"address\",\"name\":\"ctoken\"}],\"outputs\":[{\"type\":\"address\",\"name\":\"btoken\"}]},{\"type\":\"function\",\"name\":\"changeBridgedToken\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_ctoken\",\"components\":[{\"type\":\"uint64\",\"name\":\"chainId\"},{\"type\":\"address\",\"name\":\"addr\"},{\"type\":\"uint8\",\"name\":\"decimals\"},{\"type\":\"string\",\"name\":\"symbol\"},{\"type\":\"string\",\"name\":\"name\"}]},{\"type\":\"address\",\"name\":\"_btokenNew\"}],\"outputs\":[{\"type\":\"address\",\"name\":\"btokenOld_\"}]},{\"type\":\"function\",\"name\":\"changeMigrationStatus\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_migratingAddress\"},{\"type\":\"bool\",\"name\":\"_migratingInbound\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"checkLocalEnclaveReport\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"checkpoints\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"},{\"type\":\"uint32\",\"name\":\"pos\"}],\"outputs\":[{\"type\":\"tuple\",\"components\":[{\"type\":\"uint32\",\"name\":\"fromBlock\"},{\"type\":\"uint224\",\"name\":\"votes\"}]}]},{\"type\":\"function\",\"name\":\"clock\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint48\"}]},{\"type\":\"function\",\"name\":\"configureQeIdentityJson\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"qeIdentityInput\",\"components\":[{\"type\":\"bytes4\",\"name\":\"miscselect\"},{\"type\":\"bytes4\",\"name\":\"miscselectMask\"},{\"type\":\"uint16\",\"name\":\"isvprodid\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes16\",\"name\":\"attributesMask\"},{\"type\":\"bytes32\",\"name\":\"mrsigner\"},{\"type\":\"tuple[]\",\"name\":\"tcbLevels\",\"components\":[{\"type\":\"tuple\",\"name\":\"tcb\",\"components\":[{\"type\":\"uint16\",\"name\":\"isvsvn\"}]},{\"type\":\"uint8\",\"name\":\"tcbStatus\"}]}]}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"configureTcbInfoJson\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"string\",\"name\":\"fmspc\"},{\"type\":\"tuple\",\"name\":\"tcbInfoInput\",\"components\":[{\"type\":\"string\",\"name\":\"pceid\"},{\"type\":\"string\",\"name\":\"fmspc\"},{\"type\":\"tuple[]\",\"name\":\"tcbLevels\",\"components\":[{\"type\":\"uint256\",\"name\":\"pcesvn\"},{\"type\":\"uint8[]\",\"name\":\"sgxTcbCompSvnArr\"},{\"type\":\"uint8\",\"name\":\"status\"}]}]}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"context\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"tuple\",\"name\":\"ctx_\",\"components\":[{\"type\":\"bytes32\",\"name\":\"msgHash\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"}]}]},{\"type\":\"function\",\"name\":\"decimals\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint8\"}]},{\"type\":\"function\",\"name\":\"decodeCert\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"bytes\",\"name\":\"der\"},{\"type\":\"bool\",\"name\":\"isPckCert\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"success\"},{\"type\":\"tuple\",\"name\":\"cert\",\"components\":[{\"type\":\"uint256\",\"name\":\"notBefore\"},{\"type\":\"uint256\",\"name\":\"notAfter\"},{\"type\":\"bytes\",\"name\":\"serialNumber\"},{\"type\":\"bytes\",\"name\":\"tbsCertificate\"},{\"type\":\"bytes\",\"name\":\"pubKey\"},{\"type\":\"bytes\",\"name\":\"signature\"},{\"type\":\"bool\",\"name\":\"isPck\"},{\"type\":\"tuple\",\"name\":\"pck\",\"components\":[{\"type\":\"string\",\"name\":\"commonName\"},{\"type\":\"string\",\"name\":\"issuerName\"},{\"type\":\"tuple\",\"name\":\"sgxExtension\",\"components\":[{\"type\":\"string\",\"name\":\"pceid\"},{\"type\":\"string\",\"name\":\"fmspc\"},{\"type\":\"uint256\",\"name\":\"pcesvn\"},{\"type\":\"uint256[]\",\"name\":\"sgxTcbCompSvnArr\"}]}]}]}]},{\"type\":\"function\",\"name\":\"decreaseAllowance\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"spender\"},{\"type\":\"uint256\",\"name\":\"subtractedValue\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"delegate\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"delegatee\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"delegateBySig\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"delegatee\"},{\"type\":\"uint256\",\"name\":\"nonce\"},{\"type\":\"uint256\",\"name\":\"expiry\"},{\"type\":\"uint8\",\"name\":\"v\"},{\"type\":\"bytes32\",\"name\":\"r\"},{\"type\":\"bytes32\",\"name\":\"s\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"delegates\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"deleteInstances\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256[]\",\"name\":\"_ids\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"depositBond\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"_amount\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"eip712Domain\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes1\",\"name\":\"fields\"},{\"type\":\"string\",\"name\":\"name\"},{\"type\":\"string\",\"name\":\"version\"},{\"type\":\"uint256\",\"name\":\"chainId\"},{\"type\":\"address\",\"name\":\"verifyingContract\"},{\"type\":\"bytes32\",\"name\":\"salt\"},{\"type\":\"uint256[]\",\"name\":\"extensions\"}]},{\"type\":\"function\",\"name\":\"enableProvingAutoPause\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"bool\",\"name\":\"_enable\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"enableTaikoTokenAllowance\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"bool\",\"name\":\"_enable\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"failMessage\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"getAddress\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"getApproved\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"tokenId\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"getBlock\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_blockId\"}],\"outputs\":[{\"type\":\"tuple\",\"name\":\"blk_\",\"components\":[{\"type\":\"bytes32\",\"name\":\"metaHash\"},{\"type\":\"address\",\"name\":\"assignedProver\"},{\"type\":\"uint96\",\"name\":\"livenessBond\"},{\"type\":\"uint64\",\"name\":\"blockId\"},{\"type\":\"uint64\",\"name\":\"proposedAt\"},{\"type\":\"uint64\",\"name\":\"proposedIn\"},{\"type\":\"uint32\",\"name\":\"nextTransitionId\"},{\"type\":\"uint32\",\"name\":\"verifiedTransitionId\"}]}]},{\"type\":\"function\",\"name\":\"getConfig\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"tuple\",\"components\":[{\"type\":\"uint64\",\"name\":\"chainId\"},{\"type\":\"uint64\",\"name\":\"blockMaxProposals\"},{\"type\":\"uint64\",\"name\":\"blockRingBufferSize\"},{\"type\":\"uint64\",\"name\":\"maxBlocksToVerify\"},{\"type\":\"uint32\",\"name\":\"blockMaxGasLimit\"},{\"type\":\"uint96\",\"name\":\"livenessBond\"},{\"type\":\"uint8\",\"name\":\"stateRootSyncInternal\"},{\"type\":\"bool\",\"name\":\"checkEOAForCalldataDA\"}]}]},{\"type\":\"function\",\"name\":\"getLastSyncedBlock\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\",\"name\":\"blockId_\"},{\"type\":\"bytes32\",\"name\":\"blockHash_\"},{\"type\":\"bytes32\",\"name\":\"stateRoot_\"}]},{\"type\":\"function\",\"name\":\"getLastVerifiedBlock\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\",\"name\":\"blockId_\"},{\"type\":\"bytes32\",\"name\":\"blockHash_\"},{\"type\":\"bytes32\",\"name\":\"stateRoot_\"}]},{\"type\":\"function\",\"name\":\"getMessageMinGasLimit\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"dataLength\"}],\"outputs\":[{\"type\":\"uint32\"}]},{\"type\":\"function\",\"name\":\"getMinTier\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\"}],\"outputs\":[{\"type\":\"uint16\"}]},{\"type\":\"function\",\"name\":\"getPastTotalSupply\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"timepoint\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"getPastVotes\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"},{\"type\":\"uint256\",\"name\":\"timepoint\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"getSignalSlot\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"address\",\"name\":\"_app\"},{\"type\":\"bytes32\",\"name\":\"_signal\"}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"getStateVariables\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"tuple\",\"components\":[{\"type\":\"uint64\",\"name\":\"genesisHeight\"},{\"type\":\"uint64\",\"name\":\"genesisTimestamp\"},{\"type\":\"uint64\",\"name\":\"lastSyncedBlockId\"},{\"type\":\"uint64\",\"name\":\"lastSynecdAt\"}]},{\"type\":\"tuple\",\"components\":[{\"type\":\"uint64\",\"name\":\"numBlocks\"},{\"type\":\"uint64\",\"name\":\"lastVerifiedBlockId\"},{\"type\":\"bool\",\"name\":\"provingPaused\"},{\"type\":\"uint8\",\"name\":\"__reservedB1\"},{\"type\":\"uint16\",\"name\":\"__reservedB2\"},{\"type\":\"uint32\",\"name\":\"__reservedB3\"},{\"type\":\"uint64\",\"name\":\"lastUnpausedAt\"}]}]},{\"type\":\"function\",\"name\":\"getSyncedChainData\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_kind\"},{\"type\":\"uint64\",\"name\":\"_blockId\"}],\"outputs\":[{\"type\":\"uint64\",\"name\":\"blockId_\"},{\"type\":\"bytes32\",\"name\":\"chainData_\"}]},{\"type\":\"function\",\"name\":\"getTier\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"uint16\",\"name\":\"_tierId\"}],\"outputs\":[{\"type\":\"tuple\",\"components\":[{\"type\":\"bytes32\",\"name\":\"verifierName\"},{\"type\":\"uint96\",\"name\":\"validityBond\"},{\"type\":\"uint96\",\"name\":\"contestBond\"},{\"type\":\"uint24\",\"name\":\"cooldownWindow\"},{\"type\":\"uint16\",\"name\":\"provingWindow\"},{\"type\":\"uint8\",\"name\":\"maxBlocksToVerifyPerProof\"}]}]},{\"type\":\"function\",\"name\":\"getTierIds\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint16[]\",\"name\":\"tiers_\"}]},{\"type\":\"function\",\"name\":\"getTransition\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_blockId\"},{\"type\":\"uint32\",\"name\":\"_tid\"}],\"outputs\":[{\"type\":\"tuple\",\"components\":[{\"type\":\"bytes32\",\"name\":\"key\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"address\",\"name\":\"prover\"},{\"type\":\"uint96\",\"name\":\"validityBond\"},{\"type\":\"address\",\"name\":\"contester\"},{\"type\":\"uint96\",\"name\":\"contestBond\"},{\"type\":\"uint64\",\"name\":\"timestamp\"},{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"uint8\",\"name\":\"__reserved1\"}]}]},{\"type\":\"function\",\"name\":\"getTransition\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_blockId\"},{\"type\":\"bytes32\",\"name\":\"_parentHash\"}],\"outputs\":[{\"type\":\"tuple\",\"components\":[{\"type\":\"bytes32\",\"name\":\"key\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"address\",\"name\":\"prover\"},{\"type\":\"uint96\",\"name\":\"validityBond\"},{\"type\":\"address\",\"name\":\"contester\"},{\"type\":\"uint96\",\"name\":\"contestBond\"},{\"type\":\"uint64\",\"name\":\"timestamp\"},{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"uint8\",\"name\":\"__reserved1\"}]}]},{\"type\":\"function\",\"name\":\"getVerifiedBlockProver\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_blockId\"}],\"outputs\":[{\"type\":\"address\",\"name\":\"prover_\"}]},{\"type\":\"function\",\"name\":\"getVotes\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"guardianIds\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"guardian\"}],\"outputs\":[{\"type\":\"uint256\",\"name\":\"id\"}]},{\"type\":\"function\",\"name\":\"guardians\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"hashAssignment\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_assignment\",\"components\":[{\"type\":\"address\",\"name\":\"feeToken\"},{\"type\":\"uint64\",\"name\":\"expiry\"},{\"type\":\"uint64\",\"name\":\"maxBlockId\"},{\"type\":\"uint64\",\"name\":\"maxProposedIn\"},{\"type\":\"bytes32\",\"name\":\"metaHash\"},{\"type\":\"bytes32\",\"name\":\"parentMetaHash\"},{\"type\":\"tuple[]\",\"name\":\"tierFees\",\"components\":[{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"uint128\",\"name\":\"fee\"}]},{\"type\":\"bytes\",\"name\":\"signature\"}]},{\"type\":\"address\",\"name\":\"_taikoL1Address\"},{\"type\":\"address\",\"name\":\"_blockProposer\"},{\"type\":\"address\",\"name\":\"_assignedProver\"},{\"type\":\"bytes32\",\"name\":\"_blobHash\"}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"hashMessage\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"impl\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"inNonReentrant\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"increaseAllowance\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"spender\"},{\"type\":\"uint256\",\"name\":\"addedValue\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"},{\"type\":\"address\",\"name\":\"_addressManager\"},{\"type\":\"bytes32\",\"name\":\"_genesisBlockHash\"},{\"type\":\"bool\",\"name\":\"_toPause\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"},{\"type\":\"address\",\"name\":\"_addressManager\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"},{\"type\":\"address\",\"name\":\"_addressManager\"},{\"type\":\"address\",\"name\":\"_srcToken\"},{\"type\":\"uint256\",\"name\":\"_srcChainId\"},{\"type\":\"string\",\"name\":\"_symbol\"},{\"type\":\"string\",\"name\":\"_name\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"owner\"},{\"type\":\"address\",\"name\":\"sigVerifyLibAddr\"},{\"type\":\"address\",\"name\":\"pemCertLibAddr\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"},{\"type\":\"address\",\"name\":\"_addressManager\"},{\"type\":\"address\",\"name\":\"_srcToken\"},{\"type\":\"uint256\",\"name\":\"_srcChainId\"},{\"type\":\"uint8\",\"name\":\"_decimals\"},{\"type\":\"string\",\"name\":\"_symbol\"},{\"type\":\"string\",\"name\":\"_name\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init2\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"instances\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"instanceId\"}],\"outputs\":[{\"type\":\"address\",\"name\":\"addr\"},{\"type\":\"uint64\",\"name\":\"validSince\"}]},{\"type\":\"function\",\"name\":\"isApprovedForAll\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"},{\"type\":\"address\",\"name\":\"operator\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"isAuthorized\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"addr\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"authorized\"}]},{\"type\":\"function\",\"name\":\"isChainDataSynced\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_kind\"},{\"type\":\"uint64\",\"name\":\"_blockId\"},{\"type\":\"bytes32\",\"name\":\"_chainData\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"isDestChainEnabled\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"enabled_\"},{\"type\":\"address\",\"name\":\"destBridge_\"}]},{\"type\":\"function\",\"name\":\"isMessageFailed\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"bytes\",\"name\":\"_proof\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"isMessageReceived\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"bytes\",\"name\":\"_proof\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"isMessageSent\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"isSignalSent\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_app\"},{\"type\":\"bytes32\",\"name\":\"_signal\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"lastMigrationStart\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"chainId\"},{\"type\":\"address\",\"name\":\"ctoken\"}],\"outputs\":[{\"type\":\"uint256\",\"name\":\"timestamp\"}]},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"latestProofHash\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"version\"},{\"type\":\"uint256\",\"name\":\"blockId\"}],\"outputs\":[{\"type\":\"bytes32\",\"name\":\"hash\"}]},{\"type\":\"function\",\"name\":\"messageStatus\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\"}],\"outputs\":[{\"type\":\"uint8\",\"name\":\"status\"}]},{\"type\":\"function\",\"name\":\"migratingAddress\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"migratingInbound\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"minGuardians\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint32\"}]},{\"type\":\"function\",\"name\":\"mint\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_to\"},{\"type\":\"uint256\",\"name\":\"_tokenId\"},{\"type\":\"uint256\",\"name\":\"_amount\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"mint\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_account\"},{\"type\":\"uint256\",\"name\":\"_tokenId\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"mintBatch\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_to\"},{\"type\":\"uint256[]\",\"name\":\"_tokenIds\"},{\"type\":\"uint256[]\",\"name\":\"_amounts\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"name\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"name\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"string\"}]},{\"type\":\"function\",\"name\":\"nextInstanceId\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"nextMessageId\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"nonces\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"owner\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"numCheckpoints\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"}],\"outputs\":[{\"type\":\"uint32\"}]},{\"type\":\"function\",\"name\":\"numGuardians\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"onBlockProposed\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_blk\",\"components\":[{\"type\":\"bytes32\",\"name\":\"metaHash\"},{\"type\":\"address\",\"name\":\"assignedProver\"},{\"type\":\"uint96\",\"name\":\"livenessBond\"},{\"type\":\"uint64\",\"name\":\"blockId\"},{\"type\":\"uint64\",\"name\":\"proposedAt\"},{\"type\":\"uint64\",\"name\":\"proposedIn\"},{\"type\":\"uint32\",\"name\":\"nextTransitionId\"},{\"type\":\"uint32\",\"name\":\"verifiedTransitionId\"}]},{\"type\":\"tuple\",\"name\":\"_meta\",\"components\":[{\"type\":\"bytes32\",\"name\":\"l1Hash\"},{\"type\":\"bytes32\",\"name\":\"difficulty\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"bytes32\",\"name\":\"extraData\"},{\"type\":\"bytes32\",\"name\":\"depositsHash\"},{\"type\":\"address\",\"name\":\"coinbase\"},{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"uint64\",\"name\":\"timestamp\"},{\"type\":\"uint64\",\"name\":\"l1Height\"},{\"type\":\"uint16\",\"name\":\"minTier\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"bytes32\",\"name\":\"parentMetaHash\"},{\"type\":\"address\",\"name\":\"sender\"}]},{\"type\":\"bytes\",\"name\":\"_data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"onERC1155BatchReceived\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"address\"},{\"type\":\"address\"},{\"type\":\"uint256[]\"},{\"type\":\"uint256[]\"},{\"type\":\"bytes\"}],\"outputs\":[{\"type\":\"bytes4\"}]},{\"type\":\"function\",\"name\":\"onERC1155Received\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"address\"},{\"type\":\"address\"},{\"type\":\"uint256\"},{\"type\":\"uint256\"},{\"type\":\"bytes\"}],\"outputs\":[{\"type\":\"bytes4\"}]},{\"type\":\"function\",\"name\":\"onERC721Received\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"address\"},{\"type\":\"address\"},{\"type\":\"uint256\"},{\"type\":\"bytes\"}],\"outputs\":[{\"type\":\"bytes4\"}]},{\"type\":\"function\",\"name\":\"onMessageInvocation\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"bytes\",\"name\":\"_data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"onMessageRecalled\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"bytes32\",\"name\":\"_msgHash\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"owner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"ownerOf\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"tokenId\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"pause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"pauseProving\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"bool\",\"name\":\"_pause\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"pauseTaikoProving\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"paused\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"pemCertLib\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"pendingOwner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"permit\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"owner\"},{\"type\":\"address\",\"name\":\"spender\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"uint256\",\"name\":\"deadline\"},{\"type\":\"uint8\",\"name\":\"v\"},{\"type\":\"bytes32\",\"name\":\"r\"},{\"type\":\"bytes32\",\"name\":\"s\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"processMessage\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"bytes\",\"name\":\"_proof\"}],\"outputs\":[{\"type\":\"uint8\",\"name\":\"status_\"},{\"type\":\"uint8\",\"name\":\"reason_\"}]},{\"type\":\"function\",\"name\":\"proposeBlock\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"bytes\",\"name\":\"_params\"},{\"type\":\"bytes\",\"name\":\"_txList\"}],\"outputs\":[{\"type\":\"tuple\",\"name\":\"meta_\",\"components\":[{\"type\":\"bytes32\",\"name\":\"l1Hash\"},{\"type\":\"bytes32\",\"name\":\"difficulty\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"bytes32\",\"name\":\"extraData\"},{\"type\":\"bytes32\",\"name\":\"depositsHash\"},{\"type\":\"address\",\"name\":\"coinbase\"},{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"uint64\",\"name\":\"timestamp\"},{\"type\":\"uint64\",\"name\":\"l1Height\"},{\"type\":\"uint16\",\"name\":\"minTier\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"bytes32\",\"name\":\"parentMetaHash\"},{\"type\":\"address\",\"name\":\"sender\"}]},{\"type\":\"tuple[]\",\"name\":\"deposits_\",\"components\":[{\"type\":\"address\",\"name\":\"recipient\"},{\"type\":\"uint96\",\"name\":\"amount\"},{\"type\":\"uint64\",\"name\":\"id\"}]}]},{\"type\":\"function\",\"name\":\"proveBlock\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_blockId\"},{\"type\":\"bytes\",\"name\":\"_input\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"proveSignalReceived\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"address\",\"name\":\"_app\"},{\"type\":\"bytes32\",\"name\":\"_signal\"},{\"type\":\"bytes\",\"name\":\"_proof\"}],\"outputs\":[{\"type\":\"uint256\",\"name\":\"numCacheOps_\"}]},{\"type\":\"function\",\"name\":\"provingAutoPauseEnabled\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"qeIdentity\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes4\",\"name\":\"miscselect\"},{\"type\":\"bytes4\",\"name\":\"miscselectMask\"},{\"type\":\"uint16\",\"name\":\"isvprodid\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes16\",\"name\":\"attributesMask\"},{\"type\":\"bytes32\",\"name\":\"mrsigner\"}]},{\"type\":\"function\",\"name\":\"recallMessage\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"bytes\",\"name\":\"_proof\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"registerInstance\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_attestation\",\"components\":[{\"type\":\"tuple\",\"name\":\"header\",\"components\":[{\"type\":\"bytes2\",\"name\":\"version\"},{\"type\":\"bytes2\",\"name\":\"attestationKeyType\"},{\"type\":\"bytes4\",\"name\":\"teeType\"},{\"type\":\"bytes2\",\"name\":\"qeSvn\"},{\"type\":\"bytes2\",\"name\":\"pceSvn\"},{\"type\":\"bytes16\",\"name\":\"qeVendorId\"},{\"type\":\"bytes20\",\"name\":\"userData\"}]},{\"type\":\"tuple\",\"name\":\"localEnclaveReport\",\"components\":[{\"type\":\"bytes16\",\"name\":\"cpuSvn\"},{\"type\":\"bytes4\",\"name\":\"miscSelect\"},{\"type\":\"bytes28\",\"name\":\"reserved1\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes32\",\"name\":\"mrEnclave\"},{\"type\":\"bytes32\",\"name\":\"reserved2\"},{\"type\":\"bytes32\",\"name\":\"mrSigner\"},{\"type\":\"bytes\",\"name\":\"reserved3\"},{\"type\":\"uint16\",\"name\":\"isvProdId\"},{\"type\":\"uint16\",\"name\":\"isvSvn\"},{\"type\":\"bytes\",\"name\":\"reserved4\"},{\"type\":\"bytes\",\"name\":\"reportData\"}]},{\"type\":\"tuple\",\"name\":\"v3AuthData\",\"components\":[{\"type\":\"bytes\",\"name\":\"ecdsa256BitSignature\"},{\"type\":\"bytes\",\"name\":\"ecdsaAttestationKey\"},{\"type\":\"tuple\",\"name\":\"pckSignedQeReport\",\"components\":[{\"type\":\"bytes16\",\"name\":\"cpuSvn\"},{\"type\":\"bytes4\",\"name\":\"miscSelect\"},{\"type\":\"bytes28\",\"name\":\"reserved1\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes32\",\"name\":\"mrEnclave\"},{\"type\":\"bytes32\",\"name\":\"reserved2\"},{\"type\":\"bytes32\",\"name\":\"mrSigner\"},{\"type\":\"bytes\",\"name\":\"reserved3\"},{\"type\":\"uint16\",\"name\":\"isvProdId\"},{\"type\":\"uint16\",\"name\":\"isvSvn\"},{\"type\":\"bytes\",\"name\":\"reserved4\"},{\"type\":\"bytes\",\"name\":\"reportData\"}]},{\"type\":\"bytes\",\"name\":\"qeReportSignature\"},{\"type\":\"tuple\",\"name\":\"qeAuthData\",\"components\":[{\"type\":\"uint16\",\"name\":\"parsedDataSize\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"tuple\",\"name\":\"certification\",\"components\":[{\"type\":\"uint16\",\"name\":\"certType\"},{\"type\":\"uint32\",\"name\":\"certDataSize\"},{\"type\":\"bytes[3]\",\"name\":\"decodedCertDataArray\"}]}]}]}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"removeRevokedCertSerialNum\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"index\"},{\"type\":\"bytes[]\",\"name\":\"serialNumBatch\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"resolve\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"bool\",\"name\":\"_allowZeroAddress\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"resolve\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"bool\",\"name\":\"_allowZeroAddress\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"retryMessage\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"bool\",\"name\":\"_isLastAttempt\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"safeBatchTransferFrom\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256[]\",\"name\":\"ids\"},{\"type\":\"uint256[]\",\"name\":\"amounts\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"safeTransferFrom\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"id\"},{\"type\":\"uint256\",\"name\":\"amount\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"safeTransferFrom\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"tokenId\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"safeTransferFrom\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"tokenId\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"selfDelegate\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_anyToken\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"sendMessage\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash_\"},{\"type\":\"tuple\",\"name\":\"message_\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}]},{\"type\":\"function\",\"name\":\"sendSignal\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"_signal\"}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"sendToken\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_op\",\"components\":[{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"address\",\"name\":\"token\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"uint256[]\",\"name\":\"tokenIds\"},{\"type\":\"uint256[]\",\"name\":\"amounts\"}]}],\"outputs\":[{\"type\":\"tuple\",\"name\":\"message_\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}]},{\"type\":\"function\",\"name\":\"sendToken\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_op\",\"components\":[{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"address\",\"name\":\"token\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"uint256\",\"name\":\"amount\"}]}],\"outputs\":[{\"type\":\"tuple\",\"name\":\"message_\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}]},{\"type\":\"function\",\"name\":\"serialNumIsRevoked\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"idx\"},{\"type\":\"bytes\",\"name\":\"serialNum\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"revoked\"}]},{\"type\":\"function\",\"name\":\"setAddress\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"address\",\"name\":\"_newAddress\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"setApprovalForAll\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"operator\"},{\"type\":\"bool\",\"name\":\"approved\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"setGuardians\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address[]\",\"name\":\"_newGuardians\"},{\"type\":\"uint8\",\"name\":\"_minGuardians\"},{\"type\":\"bool\",\"name\":\"_clearData\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"setMrEnclave\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"_mrEnclave\"},{\"type\":\"bool\",\"name\":\"_trusted\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"setMrSigner\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"_mrSigner\"},{\"type\":\"bool\",\"name\":\"_trusted\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"sigVerifyLib\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"signalForChainData\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_kind\"},{\"type\":\"uint64\",\"name\":\"_blockId\"}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"signalForFailedMessage\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"_msgHash\"}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"source\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"},{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"splitCertificateChain\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"bytes\",\"name\":\"pemChain\"},{\"type\":\"uint256\",\"name\":\"size\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"success\"},{\"type\":\"bytes[]\",\"name\":\"certs\"}]},{\"type\":\"function\",\"name\":\"srcChainId\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"srcToken\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"state\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\",\"name\":\"__reserve1\"},{\"type\":\"tuple\",\"name\":\"slotA\",\"components\":[{\"type\":\"uint64\",\"name\":\"genesisHeight\"},{\"type\":\"uint64\",\"name\":\"genesisTimestamp\"},{\"type\":\"uint64\",\"name\":\"lastSyncedBlockId\"},{\"type\":\"uint64\",\"name\":\"lastSynecdAt\"}]},{\"type\":\"tuple\",\"name\":\"slotB\",\"components\":[{\"type\":\"uint64\",\"name\":\"numBlocks\"},{\"type\":\"uint64\",\"name\":\"lastVerifiedBlockId\"},{\"type\":\"bool\",\"name\":\"provingPaused\"},{\"type\":\"uint8\",\"name\":\"__reservedB1\"},{\"type\":\"uint16\",\"name\":\"__reservedB2\"},{\"type\":\"uint32\",\"name\":\"__reservedB3\"},{\"type\":\"uint64\",\"name\":\"lastUnpausedAt\"}]}]},{\"type\":\"function\",\"name\":\"supportsInterface\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes4\",\"name\":\"_interfaceId\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"symbol\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"string\"}]},{\"type\":\"function\",\"name\":\"symbol\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"string\"}]},{\"type\":\"function\",\"name\":\"syncChainData\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_kind\"},{\"type\":\"uint64\",\"name\":\"_blockId\"},{\"type\":\"bytes32\",\"name\":\"_chainData\"}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"tcbInfo\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"string\",\"name\":\"fmspc\"}],\"outputs\":[{\"type\":\"string\",\"name\":\"pceid\"},{\"type\":\"string\",\"name\":\"fmspc\"}]},{\"type\":\"function\",\"name\":\"toggleLocalReportCheck\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"tokenURI\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"_tokenId\"}],\"outputs\":[{\"type\":\"string\"}]},{\"type\":\"function\",\"name\":\"topBlockId\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"chainId\"},{\"type\":\"bytes32\",\"name\":\"kind\"}],\"outputs\":[{\"type\":\"uint64\",\"name\":\"blockId\"}]},{\"type\":\"function\",\"name\":\"totalSupply\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"transfer\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"amount\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"transferFrom\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"amount\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"transferFrom\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"tokenId\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"transferOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newOwner\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"trustedUserMrEnclave\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"enclave\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"trusted\"}]},{\"type\":\"function\",\"name\":\"trustedUserMrSigner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"signer\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"trusted\"}]},{\"type\":\"function\",\"name\":\"unpause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeTo\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"uri\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\"}],\"outputs\":[{\"type\":\"string\"}]},{\"type\":\"function\",\"name\":\"verifyAttestation\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"success\"}]},{\"type\":\"function\",\"name\":\"verifyBlocks\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_maxBlocksToVerify\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"verifyES256Signature\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes\",\"name\":\"tbs\"},{\"type\":\"bytes\",\"name\":\"signature\"},{\"type\":\"bytes\",\"name\":\"publicKey\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"sigValid\"}]},{\"type\":\"function\",\"name\":\"verifyParsedQuote\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"v3quote\",\"components\":[{\"type\":\"tuple\",\"name\":\"header\",\"components\":[{\"type\":\"bytes2\",\"name\":\"version\"},{\"type\":\"bytes2\",\"name\":\"attestationKeyType\"},{\"type\":\"bytes4\",\"name\":\"teeType\"},{\"type\":\"bytes2\",\"name\":\"qeSvn\"},{\"type\":\"bytes2\",\"name\":\"pceSvn\"},{\"type\":\"bytes16\",\"name\":\"qeVendorId\"},{\"type\":\"bytes20\",\"name\":\"userData\"}]},{\"type\":\"tuple\",\"name\":\"localEnclaveReport\",\"components\":[{\"type\":\"bytes16\",\"name\":\"cpuSvn\"},{\"type\":\"bytes4\",\"name\":\"miscSelect\"},{\"type\":\"bytes28\",\"name\":\"reserved1\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes32\",\"name\":\"mrEnclave\"},{\"type\":\"bytes32\",\"name\":\"reserved2\"},{\"type\":\"bytes32\",\"name\":\"mrSigner\"},{\"type\":\"bytes\",\"name\":\"reserved3\"},{\"type\":\"uint16\",\"name\":\"isvProdId\"},{\"type\":\"uint16\",\"name\":\"isvSvn\"},{\"type\":\"bytes\",\"name\":\"reserved4\"},{\"type\":\"bytes\",\"name\":\"reportData\"}]},{\"type\":\"tuple\",\"name\":\"v3AuthData\",\"components\":[{\"type\":\"bytes\",\"name\":\"ecdsa256BitSignature\"},{\"type\":\"bytes\",\"name\":\"ecdsaAttestationKey\"},{\"type\":\"tuple\",\"name\":\"pckSignedQeReport\",\"components\":[{\"type\":\"bytes16\",\"name\":\"cpuSvn\"},{\"type\":\"bytes4\",\"name\":\"miscSelect\"},{\"type\":\"bytes28\",\"name\":\"reserved1\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes32\",\"name\":\"mrEnclave\"},{\"type\":\"bytes32\",\"name\":\"reserved2\"},{\"type\":\"bytes32\",\"name\":\"mrSigner\"},{\"type\":\"bytes\",\"name\":\"reserved3\"},{\"type\":\"uint16\",\"name\":\"isvProdId\"},{\"type\":\"uint16\",\"name\":\"isvSvn\"},{\"type\":\"bytes\",\"name\":\"reserved4\"},{\"type\":\"bytes\",\"name\":\"reportData\"}]},{\"type\":\"bytes\",\"name\":\"qeReportSignature\"},{\"type\":\"tuple\",\"name\":\"qeAuthData\",\"components\":[{\"type\":\"uint16\",\"name\":\"parsedDataSize\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"tuple\",\"name\":\"certification\",\"components\":[{\"type\":\"uint16\",\"name\":\"certType\"},{\"type\":\"uint32\",\"name\":\"certDataSize\"},{\"type\":\"bytes[3]\",\"name\":\"decodedCertDataArray\"}]}]}]}],\"outputs\":[{\"type\":\"bool\"},{\"type\":\"bytes\"}]},{\"type\":\"function\",\"name\":\"verifyProof\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_ctx\",\"components\":[{\"type\":\"bytes32\",\"name\":\"metaHash\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"address\",\"name\":\"prover\"},{\"type\":\"uint64\",\"name\":\"blockId\"},{\"type\":\"bool\",\"name\":\"isContesting\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"address\",\"name\":\"msgSender\"}]},{\"type\":\"tuple\",\"components\":[{\"type\":\"bytes32\",\"name\":\"parentHash\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"bytes32\",\"name\":\"graffiti\"}]},{\"type\":\"tuple\",\"components\":[{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"verifyProof\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_ctx\",\"components\":[{\"type\":\"bytes32\",\"name\":\"metaHash\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"address\",\"name\":\"prover\"},{\"type\":\"uint64\",\"name\":\"blockId\"},{\"type\":\"bool\",\"name\":\"isContesting\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"address\",\"name\":\"msgSender\"}]},{\"type\":\"tuple\",\"name\":\"_tran\",\"components\":[{\"type\":\"bytes32\",\"name\":\"parentHash\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"bytes32\",\"name\":\"graffiti\"}]},{\"type\":\"tuple\",\"name\":\"_proof\",\"components\":[{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"verifySignalReceived\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"address\",\"name\":\"_app\"},{\"type\":\"bytes32\",\"name\":\"_signal\"},{\"type\":\"bytes\",\"name\":\"_proof\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"version\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint32\"}]},{\"type\":\"function\",\"name\":\"withdrawBond\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"_amount\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"withdrawTaikoToken\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_to\"},{\"type\":\"uint256\",\"name\":\"_amount\"}],\"outputs\":[]},{\"type\":\"constructor\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"es256Verifier\"}]}]","addresses":["0x02772b7B3a5Bea0141C993Dbb8D0733C19F46169","0x06a9Ab27c7e2255df1815E6CC0168d7755Feb19a","0x0b470dd3A0e1C41228856Fb319649E7c08f419Aa","0x10dea67478c5F8C5E2D90e5E9B26dBe60c54d800","0x11A9ebA17EbF92b40fcf9a640Ebbc47Db6fBeab0","0x33879cDF01121dc7bCe011b461e64d791aE931F2","0x39E4C1214e733639d059979079A151911e42791d","0x47bB416ee947fE4a4b655011aF7d6E3A1B80E6e9","0x537a2f0D3a5879b41BCb5A2afE2EA5c4961796F6","0x579A8d63a2Db646284CBFE31FE5082c9989E985c","0x579f40D0BE111b823962043702cabe6Aaa290780","0x67281b15aee4d6b805bc755e439abd524dd8da8d","0x8d7C954960a36a7596d7eA4945dDf891967ca8A3","0x996282cA11E5DEb6B5D122CC3B9A1FcAAD4415Ab","0x9e0a24964e5397B566c1ed39258e21aB5E35C77C","0xE3D777143Ea25A6E031d1e921F396750885f43aC","0xEf9EaA1dd30a9AA1df01c36411b5F082aA65fBaa","0xa25e645ff9897b0282e5f17d36de5bca4ec21d6e","0xaf145913EA4a56BE22E120ED9C24589659881702","0xb0f3186FC1963f774f52ff455DC86aEdD0b31F81","0xc4096E9ff1526Bd1840B65e9f45695135aC12De7","0xcc5d488073FA918cBbd73B9A523F3858C4de7372","0xd60247c6848B7Ca29eDdF63AA924E53dB6Ddd8EC"]}],"createdAt":"2024-08-27T09:44:01.744Z","subscriberId":"d1b49dd5-72bd-480e-b5d7-649ce0aadd09","name":"TaikoL1: Pause/Unpause","network":"mainnet","riskCategory":"ACCESS-CONTROL","monitorId":"d1b49dd5-72bd-480e-b5d7-649ce0aadd09","blockWatcherId":"mainnet-6","paused":false,"stackResourceId":"mystack.taiko-l-1-pause-unpause","type":"BLOCK"},{"skipABIValidation":false,"alertThreshold":null,"notifyConfig":{"severityLevel":"LOW","messageBody":"**Defender Monitor {{ sentinel.name }} Triggered**\n\n**Network**\n\n{{ sentinel.network }}\n\n**Block Hash**\n\n{{ blockHash }}\n\n**Transaction Hash**\n\n{{ transaction.transactionHash }}\n\n**Explorer Link**\n\n{{ transaction.link }}\n\n{{ matchReasonsFormatted }}","messageSubject":"Defender Monitor: Taiko Mainnet SGX Prover triggered","notifications":[{"type":"discord","sendCount":0,"notificationId":"93e8dbf2-4f87-4793-b3c3-6ff0dd6cf827"}],"timeoutMs":0},"tenantId":"0691b59e-8b53-4ae2-b874-959de8a9f2ee","addressRules":[{"conditions":[{"txConditions":[{"status":"any","expression":"status == \"failed\""}],"functionConditions":[],"eventConditions":[{"eventSignature":"InstanceAdded(uint256,address,address,uint256)","expression":null}]},{"txConditions":[{"status":"any","expression":"status == \"failed\""}],"functionConditions":[],"eventConditions":[{"eventSignature":"InstanceDeleted(uint256,address)","expression":null}]},{"txConditions":[{"status":"any","expression":"status == \"failed\""}],"functionConditions":[{"functionSignature":"verifyProof((bytes32,bytes32,address,uint64,bool,bool,address),(bytes32,bytes32,bytes32,bytes32),(uint16,bytes))","expression":null}],"eventConditions":[]}],"abi":"[{\"type\":\"event\",\"anonymous\":false,\"name\":\"AdminChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousAdmin\",\"indexed\":false},{\"type\":\"address\",\"name\":\"newAdmin\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BeaconUpgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"beacon\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Initialized\",\"inputs\":[{\"type\":\"uint8\",\"name\":\"version\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"InstanceAdded\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"id\",\"indexed\":true},{\"type\":\"address\",\"name\":\"instance\",\"indexed\":true},{\"type\":\"address\",\"name\":\"replaced\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"validSince\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"InstanceDeleted\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"id\",\"indexed\":true},{\"type\":\"address\",\"name\":\"instance\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferred\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Paused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Unpaused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Upgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"implementation\",\"indexed\":true}]},{\"type\":\"function\",\"name\":\"INSTANCE_EXPIRY\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"INSTANCE_VALIDITY_DELAY\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"addInstances\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address[]\",\"name\":\"_instances\"}],\"outputs\":[{\"type\":\"uint256[]\"}]},{\"type\":\"function\",\"name\":\"addressManager\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"addressRegistered\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"instanceAddress\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"alreadyAttested\"}]},{\"type\":\"function\",\"name\":\"deleteInstances\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256[]\",\"name\":\"_ids\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"},{\"type\":\"address\",\"name\":\"_addressManager\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"instances\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"instanceId\"}],\"outputs\":[{\"type\":\"address\",\"name\":\"addr\"},{\"type\":\"uint64\",\"name\":\"validSince\"}]},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"nextInstanceId\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"owner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"pause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"paused\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"pendingOwner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"registerInstance\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_attestation\",\"components\":[{\"type\":\"tuple\",\"name\":\"header\",\"components\":[{\"type\":\"bytes2\",\"name\":\"version\"},{\"type\":\"bytes2\",\"name\":\"attestationKeyType\"},{\"type\":\"bytes4\",\"name\":\"teeType\"},{\"type\":\"bytes2\",\"name\":\"qeSvn\"},{\"type\":\"bytes2\",\"name\":\"pceSvn\"},{\"type\":\"bytes16\",\"name\":\"qeVendorId\"},{\"type\":\"bytes20\",\"name\":\"userData\"}]},{\"type\":\"tuple\",\"name\":\"localEnclaveReport\",\"components\":[{\"type\":\"bytes16\",\"name\":\"cpuSvn\"},{\"type\":\"bytes4\",\"name\":\"miscSelect\"},{\"type\":\"bytes28\",\"name\":\"reserved1\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes32\",\"name\":\"mrEnclave\"},{\"type\":\"bytes32\",\"name\":\"reserved2\"},{\"type\":\"bytes32\",\"name\":\"mrSigner\"},{\"type\":\"bytes\",\"name\":\"reserved3\"},{\"type\":\"uint16\",\"name\":\"isvProdId\"},{\"type\":\"uint16\",\"name\":\"isvSvn\"},{\"type\":\"bytes\",\"name\":\"reserved4\"},{\"type\":\"bytes\",\"name\":\"reportData\"}]},{\"type\":\"tuple\",\"name\":\"v3AuthData\",\"components\":[{\"type\":\"bytes\",\"name\":\"ecdsa256BitSignature\"},{\"type\":\"bytes\",\"name\":\"ecdsaAttestationKey\"},{\"type\":\"tuple\",\"name\":\"pckSignedQeReport\",\"components\":[{\"type\":\"bytes16\",\"name\":\"cpuSvn\"},{\"type\":\"bytes4\",\"name\":\"miscSelect\"},{\"type\":\"bytes28\",\"name\":\"reserved1\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes32\",\"name\":\"mrEnclave\"},{\"type\":\"bytes32\",\"name\":\"reserved2\"},{\"type\":\"bytes32\",\"name\":\"mrSigner\"},{\"type\":\"bytes\",\"name\":\"reserved3\"},{\"type\":\"uint16\",\"name\":\"isvProdId\"},{\"type\":\"uint16\",\"name\":\"isvSvn\"},{\"type\":\"bytes\",\"name\":\"reserved4\"},{\"type\":\"bytes\",\"name\":\"reportData\"}]},{\"type\":\"bytes\",\"name\":\"qeReportSignature\"},{\"type\":\"tuple\",\"name\":\"qeAuthData\",\"components\":[{\"type\":\"uint16\",\"name\":\"parsedDataSize\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"tuple\",\"name\":\"certification\",\"components\":[{\"type\":\"uint16\",\"name\":\"certType\"},{\"type\":\"uint32\",\"name\":\"certDataSize\"},{\"type\":\"bytes[3]\",\"name\":\"decodedCertDataArray\"}]}]}]}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"resolve\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"bool\",\"name\":\"_allowZeroAddress\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"transferOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newOwner\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"unpause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeTo\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"verifyProof\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_ctx\",\"components\":[{\"type\":\"bytes32\",\"name\":\"metaHash\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"address\",\"name\":\"prover\"},{\"type\":\"uint64\",\"name\":\"blockId\"},{\"type\":\"bool\",\"name\":\"isContesting\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"address\",\"name\":\"msgSender\"}]},{\"type\":\"tuple\",\"name\":\"_tran\",\"components\":[{\"type\":\"bytes32\",\"name\":\"parentHash\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"bytes32\",\"name\":\"graffiti\"}]},{\"type\":\"tuple\",\"name\":\"_proof\",\"components\":[{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[]}]","addresses":["0xb0f3186FC1963f774f52ff455DC86aEdD0b31F81"]}],"createdAt":"2024-05-02T14:09:42.804Z","subscriberId":"d49a2a9b-268d-4d30-9553-ec55ed952d87","name":"Taiko Mainnet SGX Prover","network":"mainnet","riskCategory":"TECHNICAL","monitorId":"d49a2a9b-268d-4d30-9553-ec55ed952d87","blockWatcherId":"mainnet-1","paused":false,"stackResourceId":"mystack.taiko-mainnet-sgx-prover","type":"BLOCK"},{"skipABIValidation":false,"alertThreshold":null,"notifyConfig":{"severityLevel":"HIGH","messageBody":"**Defender Monitor {{ sentinel.name }} Triggered**\n\n**Network**\n\n{{ sentinel.network }}\n\n**Block Hash**\n\n{{ blockHash }}\n\n**Transaction Hash**\n\n{{ transaction.transactionHash }}\n\n**Explorer Link**\n\n{{ transaction.link }}\n\n{{ matchReasonsFormatted }}","messageSubject":"Defender Monitor: Taiko Mainnet Address Managers triggered","notifications":[{"type":"discord","sendCount":0,"notificationId":"93e8dbf2-4f87-4793-b3c3-6ff0dd6cf827"}],"timeoutMs":0},"tenantId":"0691b59e-8b53-4ae2-b874-959de8a9f2ee","addressRules":[{"conditions":[{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"AddressSet(uint64,bytes32,address,address)","expression":null}]}],"abi":"[{\"type\":\"event\",\"anonymous\":false,\"name\":\"AddressSet\",\"inputs\":[{\"type\":\"uint64\",\"name\":\"chainId\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"name\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newAddress\",\"indexed\":false},{\"type\":\"address\",\"name\":\"oldAddress\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"AdminChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousAdmin\",\"indexed\":false},{\"type\":\"address\",\"name\":\"newAdmin\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BeaconUpgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"beacon\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Initialized\",\"inputs\":[{\"type\":\"uint8\",\"name\":\"version\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferred\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Paused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Unpaused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Upgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"implementation\",\"indexed\":true}]},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"addressManager\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"getAddress\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"owner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"pause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"paused\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"pendingOwner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"resolve\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"bool\",\"name\":\"_allowZeroAddress\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"setAddress\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"address\",\"name\":\"_newAddress\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"transferOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newOwner\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"unpause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeTo\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]}]","addresses":["0xEf9EaA1dd30a9AA1df01c36411b5F082aA65fBaa","0x579f40D0BE111b823962043702cabe6Aaa290780"]}],"createdAt":"2024-05-02T14:00:18.874Z","subscriberId":"3919cb83-487f-4432-88fa-33bbe4361fce","name":"Taiko Mainnet Address Managers","network":"mainnet","riskCategory":"ACCESS-CONTROL","monitorId":"3919cb83-487f-4432-88fa-33bbe4361fce","blockWatcherId":"mainnet-1","paused":false,"stackResourceId":"mystack.taiko-mainnet-address-managers","type":"BLOCK"},{"skipABIValidation":false,"alertThreshold":null,"notifyConfig":{"severityLevel":"HIGH","messageBody":"**Defender Monitor {{ sentinel.name }} Triggered**\n\n**Network**\n\n{{ sentinel.network }}\n\n**Block Hash**\n\n{{ blockHash }}\n\n**Transaction Hash**\n\n{{ transaction.transactionHash }}\n\n**Explorer Link**\n\n{{ transaction.link }}\n\n{{ matchReasonsFormatted }}","messageSubject":"Defender Monitor: Taiko Mainnet Essential Contracts triggered","notifications":[{"type":"discord","sendCount":0,"notificationId":"93e8dbf2-4f87-4793-b3c3-6ff0dd6cf827"}],"timeoutMs":0},"tenantId":"0691b59e-8b53-4ae2-b874-959de8a9f2ee","addressRules":[{"conditions":[{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"AdminChanged(address,address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"BeaconUpgraded(address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"Initialized(uint8)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"OwnershipTransferStarted(address,address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"OwnershipTransferred(address,address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"Paused(address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"Unpaused(address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"Upgraded(address)","expression":null}]}],"abi":"[{\"type\":\"event\",\"anonymous\":false,\"name\":\"AdminChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousAdmin\",\"indexed\":false},{\"type\":\"address\",\"name\":\"newAdmin\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BeaconUpgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"beacon\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Initialized\",\"inputs\":[{\"type\":\"uint8\",\"name\":\"version\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferred\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Paused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Unpaused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Upgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"implementation\",\"indexed\":true}]},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"addressManager\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"owner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"pause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"paused\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"pendingOwner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"resolve\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"bool\",\"name\":\"_allowZeroAddress\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"transferOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newOwner\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"unpause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeTo\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]}]","addresses":["0xEf9EaA1dd30a9AA1df01c36411b5F082aA65fBaa","0x10dea67478c5F8C5E2D90e5E9B26dBe60c54d800","0x9e0a24964e5397B566c1ed39258e21aB5E35C77C","0xd60247c6848B7Ca29eDdF63AA924E53dB6Ddd8EC","0x996282cA11E5DEb6B5D122CC3B9A1FcAAD4415Ab","0x0b470dd3A0e1C41228856Fb319649E7c08f419Aa","0x0b470dd3A0e1C41228856Fb319649E7c08f419Aa","0xaf145913EA4a56BE22E120ED9C24589659881702","0x579f40D0BE111b823962043702cabe6Aaa290780","0x06a9Ab27c7e2255df1815E6CC0168d7755Feb19a","0x537a2f0D3a5879b41BCb5A2afE2EA5c4961796F6","0x33879cDF01121dc7bCe011b461e64d791aE931F2","0xb0f3186FC1963f774f52ff455DC86aEdD0b31F81","0x579A8d63a2Db646284CBFE31FE5082c9989E985c","0xE3D777143Ea25A6E031d1e921F396750885f43aC","0x8d7C954960a36a7596d7eA4945dDf891967ca8A3"]}],"createdAt":"2024-05-02T13:49:54.192Z","subscriberId":"67a53521-3d4a-4de4-92ab-ede82cc45644","name":"Taiko Mainnet Essential Contracts","network":"mainnet","riskCategory":"ACCESS-CONTROL","monitorId":"67a53521-3d4a-4de4-92ab-ede82cc45644","blockWatcherId":"mainnet-1","paused":false,"stackResourceId":"mystack.taiko-mainnet-essential-contracts","type":"BLOCK"}]},"actions":{"removed":[],"created":[],"updated":[]},"contracts":{"removed":[],"created":[],"updated":[]},"relayers":{"removed":[],"created":[],"updated":[],"relayerKeys":{"removed":[],"created":[],"updated":[]}},"notifications":{"removed":[],"created":[],"updated":[]},"secrets":{"removed":[],"created":[],"updated":[]},"blockExplorerApiKeys":{"removed":[],"created":[],"updated":[]},"forkedNetworks":{"removed":[],"created":[],"updated":[]},"privateNetworks":{"removed":[],"created":[],"updated":[]}} +{"stack":"mystack","timestamp":"2024-09-18T21:51:21.150Z","monitors":{"removed":[],"created":[],"updated":[{"skipABIValidation":true,"alertThreshold":null,"notifyConfig":{"severityLevel":"MEDIUM","messageBody":"**Defender Monitor {{ sentinel.name }} Triggered**\n\n**Network**\n\n{{ sentinel.network }}\n\n**Block Hash**\n\n{{ blockHash }}\n\n**Transaction Hash**\n\n{{ transaction.transactionHash }}\n\n**Explorer Link**\n\n{{ transaction.link }}\n\n**Match Reasons**\n\n{{ matchReasonsFormatted }}\n\n**Metadata**\n\n{{ metadataFormatted }}","messageSubject":"Defender Monitor: TaikoL1: Pause/Unpause triggered","notifications":[{"type":"discord","sendCount":0,"notificationId":"93e8dbf2-4f87-4793-b3c3-6ff0dd6cf827"}],"timeoutMs":60000},"tenantId":"0691b59e-8b53-4ae2-b874-959de8a9f2ee","addressRules":[{"conditions":[{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"Paused(address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"Unpaused(address)","expression":null}]}],"abi":"[{\"type\":\"error\",\"name\":\"AM_ADDRESS_ALREADY_SET\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"AddressSet\",\"inputs\":[{\"type\":\"uint64\",\"name\":\"chainId\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"name\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newAddress\",\"indexed\":false},{\"type\":\"address\",\"name\":\"oldAddress\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"AdminChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousAdmin\",\"indexed\":false},{\"type\":\"address\",\"name\":\"newAdmin\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Approval\",\"inputs\":[{\"type\":\"address\",\"name\":\"owner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"spender\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"value\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Approval\",\"inputs\":[{\"type\":\"address\",\"name\":\"owner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"approved\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"tokenId\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"ApprovalForAll\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":true},{\"type\":\"address\",\"name\":\"operator\",\"indexed\":true},{\"type\":\"bool\",\"name\":\"approved\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Approved\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"operationId\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"approvalBits\",\"indexed\":false},{\"type\":\"bool\",\"name\":\"minGuardiansReached\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Authorized\",\"inputs\":[{\"type\":\"address\",\"name\":\"addr\",\"indexed\":true},{\"type\":\"bool\",\"name\":\"authorized\",\"indexed\":false}]},{\"type\":\"error\",\"name\":\"BB_INVALID_PARAMS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BB_MINT_DISALLOWED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BB_PERMISSION_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BTOKEN_CANNOT_RECEIVE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BTOKEN_INVALID_BURN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BTOKEN_INVALID_PARAMS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INSUFFICIENT_GAS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_CONTEXT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_FEE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_GAS_LIMIT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_VALUE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_MESSAGE_NOT_SENT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_OUT_OF_ETH_QUOTA\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_PERMISSION_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_PROOF_TOO_LARGE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_RETRY_FAILED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_SIGNAL_NOT_RECEIVED\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BeaconUpgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"beacon\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BlockProposed\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"address\",\"name\":\"assignedProver\",\"indexed\":true},{\"type\":\"uint96\",\"name\":\"livenessBond\",\"indexed\":false},{\"type\":\"tuple\",\"name\":\"meta\",\"indexed\":false,\"components\":[{\"type\":\"bytes32\",\"name\":\"l1Hash\"},{\"type\":\"bytes32\",\"name\":\"difficulty\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"bytes32\",\"name\":\"extraData\"},{\"type\":\"bytes32\",\"name\":\"depositsHash\"},{\"type\":\"address\",\"name\":\"coinbase\"},{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"uint64\",\"name\":\"timestamp\"},{\"type\":\"uint64\",\"name\":\"l1Height\"},{\"type\":\"uint16\",\"name\":\"minTier\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"bytes32\",\"name\":\"parentMetaHash\"},{\"type\":\"address\",\"name\":\"sender\"}]},{\"type\":\"tuple[]\",\"name\":\"depositsProcessed\",\"indexed\":false,\"components\":[{\"type\":\"address\",\"name\":\"recipient\"},{\"type\":\"uint96\",\"name\":\"amount\"},{\"type\":\"uint64\",\"name\":\"id\"}]}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BlockVerified\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"address\",\"name\":\"prover\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"blockHash\",\"indexed\":false},{\"type\":\"bytes32\",\"name\":\"stateRoot\",\"indexed\":false},{\"type\":\"uint16\",\"name\":\"tier\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BondCredited\",\"inputs\":[{\"type\":\"address\",\"name\":\"user\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"amount\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BondDebited\",\"inputs\":[{\"type\":\"address\",\"name\":\"user\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"amount\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BridgedTokenChanged\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"srcChainId\",\"indexed\":true},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":true},{\"type\":\"address\",\"name\":\"btokenOld\",\"indexed\":false},{\"type\":\"address\",\"name\":\"btokenNew\",\"indexed\":false},{\"type\":\"string\",\"name\":\"ctokenSymbol\",\"indexed\":false},{\"type\":\"string\",\"name\":\"ctokenName\",\"indexed\":false},{\"type\":\"uint8\",\"name\":\"ctokenDecimal\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BridgedTokenDeployed\",\"inputs\":[{\"type\":\"uint64\",\"name\":\"chainId\",\"indexed\":true},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":true},{\"type\":\"address\",\"name\":\"btoken\",\"indexed\":true},{\"type\":\"string\",\"name\":\"ctokenSymbol\",\"indexed\":false},{\"type\":\"string\",\"name\":\"ctokenName\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BridgedTokenDeployed\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"srcChainId\",\"indexed\":true},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":true},{\"type\":\"address\",\"name\":\"btoken\",\"indexed\":true},{\"type\":\"string\",\"name\":\"ctokenSymbol\",\"indexed\":false},{\"type\":\"string\",\"name\":\"ctokenName\",\"indexed\":false},{\"type\":\"uint8\",\"name\":\"ctokenDecimal\",\"indexed\":false}]},{\"type\":\"function\",\"name\":\"CLOCK_MODE\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"string\"}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"CalldataTxList\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"bytes\",\"name\":\"txList\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"ChainDataSynced\",\"inputs\":[{\"type\":\"uint64\",\"name\":\"chainId\",\"indexed\":true},{\"type\":\"uint64\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"kind\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"data\",\"indexed\":false},{\"type\":\"bytes32\",\"name\":\"signal\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"ConflictingProofs\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"address\",\"name\":\"guardian\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"currentProofHash\",\"indexed\":false},{\"type\":\"bytes32\",\"name\":\"newProofHash\",\"indexed\":false},{\"type\":\"bool\",\"name\":\"provingPaused\",\"indexed\":false}]},{\"type\":\"function\",\"name\":\"DOMAIN_SEPARATOR\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"DelegateChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"delegator\",\"indexed\":true},{\"type\":\"address\",\"name\":\"fromDelegate\",\"indexed\":true},{\"type\":\"address\",\"name\":\"toDelegate\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"DelegateVotesChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"delegate\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"previousBalance\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"newBalance\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"EIP712DomainChanged\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ETH_TRANSFER_FAILED\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"EtherPaymentFailed\",\"inputs\":[{\"type\":\"address\",\"name\":\"to\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"maxGas\",\"indexed\":false}]},{\"type\":\"error\",\"name\":\"FUNC_NOT_IMPLEMENTED\",\"inputs\":[]},{\"type\":\"function\",\"name\":\"GAS_OVERHEAD\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint32\"}]},{\"type\":\"function\",\"name\":\"GAS_RESERVE\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"GP_INVALID_GUARDIAN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GP_INVALID_GUARDIAN_SET\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GP_INVALID_MIN_GUARDIANS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GP_INVALID_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GV_PERMISSION_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GV_ZERO_ADDRESS\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"GuardianApproval\",\"inputs\":[{\"type\":\"address\",\"name\":\"addr\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"blockHash\",\"indexed\":true},{\"type\":\"bool\",\"name\":\"approved\",\"indexed\":false},{\"type\":\"bytes\",\"name\":\"proofData\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"GuardiansUpdated\",\"inputs\":[{\"type\":\"uint32\",\"name\":\"version\",\"indexed\":false},{\"type\":\"address[]\",\"name\":\"guardians\",\"indexed\":false}]},{\"type\":\"error\",\"name\":\"HOOK_ASSIGNMENT_EXPIRED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"HOOK_ASSIGNMENT_INVALID_SIG\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"HOOK_TIER_NOT_FOUND\",\"inputs\":[]},{\"type\":\"function\",\"name\":\"INSTANCE_EXPIRY\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"INSTANCE_VALIDITY_DELAY\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Initialized\",\"inputs\":[{\"type\":\"uint8\",\"name\":\"version\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"InstanceAdded\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"id\",\"indexed\":true},{\"type\":\"address\",\"name\":\"instance\",\"indexed\":true},{\"type\":\"address\",\"name\":\"replaced\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"validSince\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"InstanceDeleted\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"id\",\"indexed\":true},{\"type\":\"address\",\"name\":\"instance\",\"indexed\":true}]},{\"type\":\"error\",\"name\":\"L1_ALREADY_CONTESTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_ALREADY_PROVED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOB_NOT_AVAILABLE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOB_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOCK_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_CANNOT_CONTEST\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_BLOCK_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_GENESIS_HASH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_SIG\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_TIER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_TRANSITION\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_NOT_ASSIGNED_PROVER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_PROVING_PAUSED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_RECEIVE_DISABLED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TOO_MANY_BLOCKS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TRANSITION_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNEXPECTED_PARENT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNEXPECTED_TRANSITION_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"LTP_INVALID_ACCOUNT_PROOF\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"LTP_INVALID_INCLUSION_PROOF\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"LocalReportCheckToggled\",\"inputs\":[{\"type\":\"bool\",\"name\":\"checkLocalEnclaveReport\",\"indexed\":false}]},{\"type\":\"function\",\"name\":\"MAX_GAS_PAYING_PROVER\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"MIN_MIGRATION_DELAY\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MessageProcessed\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"tuple\",\"name\":\"message\",\"indexed\":false,\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"tuple\",\"name\":\"stats\",\"indexed\":false,\"components\":[{\"type\":\"uint32\",\"name\":\"gasUsedInFeeCalc\"},{\"type\":\"uint32\",\"name\":\"proofSize\"},{\"type\":\"uint32\",\"name\":\"numCacheOps\"},{\"type\":\"bool\",\"name\":\"processedByRelayer\"}]}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MessageSent\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"tuple\",\"name\":\"message\",\"indexed\":false,\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MessageStatusChanged\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"uint8\",\"name\":\"status\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MigratedTo\",\"inputs\":[{\"type\":\"address\",\"name\":\"fromToken\",\"indexed\":true},{\"type\":\"address\",\"name\":\"account\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"amount\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MigrationStatusChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"addr\",\"indexed\":false},{\"type\":\"bool\",\"name\":\"inbound\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MrEnclaveUpdated\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"mrEnclave\",\"indexed\":true},{\"type\":\"bool\",\"name\":\"trusted\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MrSignerUpdated\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"mrSigner\",\"indexed\":true},{\"type\":\"bool\",\"name\":\"trusted\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferred\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Paused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"ProvingAutoPauseEnabled\",\"inputs\":[{\"type\":\"bool\",\"name\":\"enabled\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"ProvingPaused\",\"inputs\":[{\"type\":\"bool\",\"name\":\"paused\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"QeIdentityConfigured\",\"inputs\":[{\"type\":\"tuple\",\"name\":\"qeIdentityInput\",\"indexed\":false,\"components\":[{\"type\":\"bytes4\",\"name\":\"miscselect\"},{\"type\":\"bytes4\",\"name\":\"miscselectMask\"},{\"type\":\"uint16\",\"name\":\"isvprodid\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes16\",\"name\":\"attributesMask\"},{\"type\":\"bytes32\",\"name\":\"mrsigner\"},{\"type\":\"tuple[]\",\"name\":\"tcbLevels\",\"components\":[{\"type\":\"tuple\",\"name\":\"tcb\",\"components\":[{\"type\":\"uint16\",\"name\":\"isvsvn\"}]},{\"type\":\"uint8\",\"name\":\"tcbStatus\"}]}]}]},{\"type\":\"error\",\"name\":\"REENTRANT_CALL\",\"inputs\":[]},{\"type\":\"function\",\"name\":\"RELAYER_MAX_PROOF_BYTES\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"RESOLVER_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_INVALID_MANAGER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_UNEXPECTED_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_ZERO_ADDR\",\"inputs\":[{\"type\":\"uint64\",\"name\":\"chainId\"},{\"type\":\"bytes32\",\"name\":\"name\"}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"RevokedCertSerialNumAdded\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"index\",\"indexed\":true},{\"type\":\"bytes\",\"name\":\"serialNum\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"RevokedCertSerialNumRemoved\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"index\",\"indexed\":true},{\"type\":\"bytes\",\"name\":\"serialNum\",\"indexed\":false}]},{\"type\":\"error\",\"name\":\"SGX_ALREADY_ATTESTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SGX_INVALID_ATTESTATION\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SGX_INVALID_INSTANCE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SGX_INVALID_PROOF\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SGX_RA_NOT_SUPPORTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_EMPTY_PROOF\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_INVALID_HOPS_WITH_LOOP\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_INVALID_LAST_HOP_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_INVALID_MID_HOP_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_INVALID_STATE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_SIGNAL_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_UNAUTHORIZED\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"SignalSent\",\"inputs\":[{\"type\":\"address\",\"name\":\"app\",\"indexed\":false},{\"type\":\"bytes32\",\"name\":\"signal\",\"indexed\":false},{\"type\":\"bytes32\",\"name\":\"slot\",\"indexed\":false},{\"type\":\"bytes32\",\"name\":\"value\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"StateVariablesUpdated\",\"inputs\":[{\"type\":\"tuple\",\"name\":\"slotB\",\"indexed\":false,\"components\":[{\"type\":\"uint64\",\"name\":\"numBlocks\"},{\"type\":\"uint64\",\"name\":\"lastVerifiedBlockId\"},{\"type\":\"bool\",\"name\":\"provingPaused\"},{\"type\":\"uint8\",\"name\":\"__reservedB1\"},{\"type\":\"uint16\",\"name\":\"__reservedB2\"},{\"type\":\"uint32\",\"name\":\"__reservedB3\"},{\"type\":\"uint64\",\"name\":\"lastUnpausedAt\"}]}]},{\"type\":\"error\",\"name\":\"TIER_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"TT_INVALID_PARAM\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TcbInfoJsonConfigured\",\"inputs\":[{\"type\":\"string\",\"name\":\"fmspc\",\"indexed\":true},{\"type\":\"tuple\",\"name\":\"tcbInfoInput\",\"indexed\":false,\"components\":[{\"type\":\"string\",\"name\":\"pceid\"},{\"type\":\"string\",\"name\":\"fmspc\"},{\"type\":\"tuple[]\",\"name\":\"tcbLevels\",\"components\":[{\"type\":\"uint256\",\"name\":\"pcesvn\"},{\"type\":\"uint8[]\",\"name\":\"sgxTcbCompSvnArr\"},{\"type\":\"uint8\",\"name\":\"status\"}]}]}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TokenReceived\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint64\",\"name\":\"srcChainId\",\"indexed\":false},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":false},{\"type\":\"address\",\"name\":\"token\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"tokenIds\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"amounts\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TokenReceived\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint64\",\"name\":\"srcChainId\",\"indexed\":false},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":false},{\"type\":\"address\",\"name\":\"token\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"amount\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TokenReleased\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":false},{\"type\":\"address\",\"name\":\"token\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"tokenIds\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"amounts\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TokenReleased\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":false},{\"type\":\"address\",\"name\":\"token\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"amount\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TokenSent\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint64\",\"name\":\"destChainId\",\"indexed\":false},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":false},{\"type\":\"address\",\"name\":\"token\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"tokenIds\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"amounts\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TokenSent\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint64\",\"name\":\"canonicalChainId\",\"indexed\":false},{\"type\":\"uint64\",\"name\":\"destChainId\",\"indexed\":false},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":false},{\"type\":\"address\",\"name\":\"token\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"amount\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Transfer\",\"inputs\":[{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"value\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Transfer\",\"inputs\":[{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"tokenId\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TransferBatch\",\"inputs\":[{\"type\":\"address\",\"name\":\"operator\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint256[]\",\"name\":\"ids\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"values\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TransferSingle\",\"inputs\":[{\"type\":\"address\",\"name\":\"operator\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"id\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"value\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TransitionContested\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"tuple\",\"name\":\"tran\",\"indexed\":false,\"components\":[{\"type\":\"bytes32\",\"name\":\"parentHash\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"bytes32\",\"name\":\"graffiti\"}]},{\"type\":\"address\",\"name\":\"contester\",\"indexed\":false},{\"type\":\"uint96\",\"name\":\"contestBond\",\"indexed\":false},{\"type\":\"uint16\",\"name\":\"tier\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TransitionProved\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"tuple\",\"name\":\"tran\",\"indexed\":false,\"components\":[{\"type\":\"bytes32\",\"name\":\"parentHash\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"bytes32\",\"name\":\"graffiti\"}]},{\"type\":\"address\",\"name\":\"prover\",\"indexed\":false},{\"type\":\"uint96\",\"name\":\"validityBond\",\"indexed\":false},{\"type\":\"uint16\",\"name\":\"tier\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"URI\",\"inputs\":[{\"type\":\"string\",\"name\":\"value\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"id\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Unpaused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Upgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"implementation\",\"indexed\":true}]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_CERTIFICATION_CHAIN_DATA\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_CERTIFICATION_CHAIN_SIZE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_ECDSA_SIGNATURE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_QEAUTHDATA_SIZE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_QEREPORT_LENGTN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_QUOTE_LENGTN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_QUOTE_MEMBER_LENGTN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_UNSUPPORT_CERTIFICATION_TYPE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_BTOKEN_BLACKLISTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_CTOKEN_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INSUFFICIENT_FEE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INTERFACE_NOT_SUPPORTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_AMOUNT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_CTOKEN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_NEW_BTOKEN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_TOKEN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_TO_ADDR\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_LAST_MIGRATION_TOO_CLOSE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_PERMISSION_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_TOKEN_ARRAY_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_ADDRESS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_ADDR_MANAGER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_VALUE\",\"inputs\":[]},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"addInstances\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address[]\",\"name\":\"_instances\"}],\"outputs\":[{\"type\":\"uint256[]\"}]},{\"type\":\"function\",\"name\":\"addRevokedCertSerialNum\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"index\"},{\"type\":\"bytes[]\",\"name\":\"serialNumBatch\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"addressManager\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"addressRegistered\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"instanceAddress\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"alreadyAttested\"}]},{\"type\":\"function\",\"name\":\"allowance\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"owner\"},{\"type\":\"address\",\"name\":\"spender\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"approvals\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"version\"},{\"type\":\"bytes32\",\"name\":\"proofHash\"}],\"outputs\":[{\"type\":\"uint256\",\"name\":\"approvalBits\"}]},{\"type\":\"function\",\"name\":\"approve\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"spender\"},{\"type\":\"uint256\",\"name\":\"amount\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"approve\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_meta\",\"components\":[{\"type\":\"bytes32\",\"name\":\"l1Hash\"},{\"type\":\"bytes32\",\"name\":\"difficulty\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"bytes32\",\"name\":\"extraData\"},{\"type\":\"bytes32\",\"name\":\"depositsHash\"},{\"type\":\"address\",\"name\":\"coinbase\"},{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"uint64\",\"name\":\"timestamp\"},{\"type\":\"uint64\",\"name\":\"l1Height\"},{\"type\":\"uint16\",\"name\":\"minTier\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"bytes32\",\"name\":\"parentMetaHash\"},{\"type\":\"address\",\"name\":\"sender\"}]},{\"type\":\"tuple\",\"name\":\"_tran\",\"components\":[{\"type\":\"bytes32\",\"name\":\"parentHash\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"bytes32\",\"name\":\"graffiti\"}]},{\"type\":\"tuple\",\"name\":\"_proof\",\"components\":[{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[{\"type\":\"bool\",\"name\":\"approved_\"}]},{\"type\":\"function\",\"name\":\"approve\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"tokenId\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"authorize\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_addr\"},{\"type\":\"bool\",\"name\":\"_authorize\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"balanceOf\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"balanceOf\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"},{\"type\":\"uint256\",\"name\":\"id\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"balanceOfBatch\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address[]\",\"name\":\"accounts\"},{\"type\":\"uint256[]\",\"name\":\"ids\"}],\"outputs\":[{\"type\":\"uint256[]\"}]},{\"type\":\"function\",\"name\":\"batchTransfer\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address[]\",\"name\":\"recipients\"},{\"type\":\"uint256[]\",\"name\":\"amounts\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"bondBalanceOf\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_user\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"bridgedToCanonical\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"btoken\"}],\"outputs\":[{\"type\":\"uint64\",\"name\":\"chainId\"},{\"type\":\"address\",\"name\":\"addr\"},{\"type\":\"string\",\"name\":\"symbol\"},{\"type\":\"string\",\"name\":\"name\"}]},{\"type\":\"function\",\"name\":\"bridgedToCanonical\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"btoken\"}],\"outputs\":[{\"type\":\"uint64\",\"name\":\"chainId\"},{\"type\":\"address\",\"name\":\"addr\"},{\"type\":\"uint8\",\"name\":\"decimals\"},{\"type\":\"string\",\"name\":\"symbol\"},{\"type\":\"string\",\"name\":\"name\"}]},{\"type\":\"function\",\"name\":\"btokenDenylist\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"btoken\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"denied\"}]},{\"type\":\"function\",\"name\":\"burn\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_account\"},{\"type\":\"uint256\",\"name\":\"_tokenId\"},{\"type\":\"uint256\",\"name\":\"_amount\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"burn\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_account\"},{\"type\":\"uint256\",\"name\":\"_tokenId\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"burn\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"_amount\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"canonical\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"},{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"canonicalToBridged\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"chainId\"},{\"type\":\"address\",\"name\":\"ctoken\"}],\"outputs\":[{\"type\":\"address\",\"name\":\"btoken\"}]},{\"type\":\"function\",\"name\":\"changeBridgedToken\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_ctoken\",\"components\":[{\"type\":\"uint64\",\"name\":\"chainId\"},{\"type\":\"address\",\"name\":\"addr\"},{\"type\":\"uint8\",\"name\":\"decimals\"},{\"type\":\"string\",\"name\":\"symbol\"},{\"type\":\"string\",\"name\":\"name\"}]},{\"type\":\"address\",\"name\":\"_btokenNew\"}],\"outputs\":[{\"type\":\"address\",\"name\":\"btokenOld_\"}]},{\"type\":\"function\",\"name\":\"changeMigrationStatus\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_migratingAddress\"},{\"type\":\"bool\",\"name\":\"_migratingInbound\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"checkLocalEnclaveReport\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"checkpoints\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"},{\"type\":\"uint32\",\"name\":\"pos\"}],\"outputs\":[{\"type\":\"tuple\",\"components\":[{\"type\":\"uint32\",\"name\":\"fromBlock\"},{\"type\":\"uint224\",\"name\":\"votes\"}]}]},{\"type\":\"function\",\"name\":\"clock\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint48\"}]},{\"type\":\"function\",\"name\":\"configureQeIdentityJson\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"qeIdentityInput\",\"components\":[{\"type\":\"bytes4\",\"name\":\"miscselect\"},{\"type\":\"bytes4\",\"name\":\"miscselectMask\"},{\"type\":\"uint16\",\"name\":\"isvprodid\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes16\",\"name\":\"attributesMask\"},{\"type\":\"bytes32\",\"name\":\"mrsigner\"},{\"type\":\"tuple[]\",\"name\":\"tcbLevels\",\"components\":[{\"type\":\"tuple\",\"name\":\"tcb\",\"components\":[{\"type\":\"uint16\",\"name\":\"isvsvn\"}]},{\"type\":\"uint8\",\"name\":\"tcbStatus\"}]}]}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"configureTcbInfoJson\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"string\",\"name\":\"fmspc\"},{\"type\":\"tuple\",\"name\":\"tcbInfoInput\",\"components\":[{\"type\":\"string\",\"name\":\"pceid\"},{\"type\":\"string\",\"name\":\"fmspc\"},{\"type\":\"tuple[]\",\"name\":\"tcbLevels\",\"components\":[{\"type\":\"uint256\",\"name\":\"pcesvn\"},{\"type\":\"uint8[]\",\"name\":\"sgxTcbCompSvnArr\"},{\"type\":\"uint8\",\"name\":\"status\"}]}]}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"context\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"tuple\",\"name\":\"ctx_\",\"components\":[{\"type\":\"bytes32\",\"name\":\"msgHash\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"}]}]},{\"type\":\"function\",\"name\":\"decimals\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint8\"}]},{\"type\":\"function\",\"name\":\"decodeCert\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"bytes\",\"name\":\"der\"},{\"type\":\"bool\",\"name\":\"isPckCert\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"success\"},{\"type\":\"tuple\",\"name\":\"cert\",\"components\":[{\"type\":\"uint256\",\"name\":\"notBefore\"},{\"type\":\"uint256\",\"name\":\"notAfter\"},{\"type\":\"bytes\",\"name\":\"serialNumber\"},{\"type\":\"bytes\",\"name\":\"tbsCertificate\"},{\"type\":\"bytes\",\"name\":\"pubKey\"},{\"type\":\"bytes\",\"name\":\"signature\"},{\"type\":\"bool\",\"name\":\"isPck\"},{\"type\":\"tuple\",\"name\":\"pck\",\"components\":[{\"type\":\"string\",\"name\":\"commonName\"},{\"type\":\"string\",\"name\":\"issuerName\"},{\"type\":\"tuple\",\"name\":\"sgxExtension\",\"components\":[{\"type\":\"string\",\"name\":\"pceid\"},{\"type\":\"string\",\"name\":\"fmspc\"},{\"type\":\"uint256\",\"name\":\"pcesvn\"},{\"type\":\"uint256[]\",\"name\":\"sgxTcbCompSvnArr\"}]}]}]}]},{\"type\":\"function\",\"name\":\"decreaseAllowance\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"spender\"},{\"type\":\"uint256\",\"name\":\"subtractedValue\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"delegate\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"delegatee\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"delegateBySig\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"delegatee\"},{\"type\":\"uint256\",\"name\":\"nonce\"},{\"type\":\"uint256\",\"name\":\"expiry\"},{\"type\":\"uint8\",\"name\":\"v\"},{\"type\":\"bytes32\",\"name\":\"r\"},{\"type\":\"bytes32\",\"name\":\"s\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"delegates\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"deleteInstances\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256[]\",\"name\":\"_ids\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"depositBond\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"_amount\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"eip712Domain\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes1\",\"name\":\"fields\"},{\"type\":\"string\",\"name\":\"name\"},{\"type\":\"string\",\"name\":\"version\"},{\"type\":\"uint256\",\"name\":\"chainId\"},{\"type\":\"address\",\"name\":\"verifyingContract\"},{\"type\":\"bytes32\",\"name\":\"salt\"},{\"type\":\"uint256[]\",\"name\":\"extensions\"}]},{\"type\":\"function\",\"name\":\"enableProvingAutoPause\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"bool\",\"name\":\"_enable\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"enableTaikoTokenAllowance\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"bool\",\"name\":\"_enable\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"failMessage\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"getAddress\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"getApproved\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"tokenId\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"getBlock\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_blockId\"}],\"outputs\":[{\"type\":\"tuple\",\"name\":\"blk_\",\"components\":[{\"type\":\"bytes32\",\"name\":\"metaHash\"},{\"type\":\"address\",\"name\":\"assignedProver\"},{\"type\":\"uint96\",\"name\":\"livenessBond\"},{\"type\":\"uint64\",\"name\":\"blockId\"},{\"type\":\"uint64\",\"name\":\"proposedAt\"},{\"type\":\"uint64\",\"name\":\"proposedIn\"},{\"type\":\"uint32\",\"name\":\"nextTransitionId\"},{\"type\":\"uint32\",\"name\":\"verifiedTransitionId\"}]}]},{\"type\":\"function\",\"name\":\"getConfig\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"tuple\",\"components\":[{\"type\":\"uint64\",\"name\":\"chainId\"},{\"type\":\"uint64\",\"name\":\"blockMaxProposals\"},{\"type\":\"uint64\",\"name\":\"blockRingBufferSize\"},{\"type\":\"uint64\",\"name\":\"maxBlocksToVerify\"},{\"type\":\"uint32\",\"name\":\"blockMaxGasLimit\"},{\"type\":\"uint96\",\"name\":\"livenessBond\"},{\"type\":\"uint8\",\"name\":\"stateRootSyncInternal\"},{\"type\":\"bool\",\"name\":\"checkEOAForCalldataDA\"}]}]},{\"type\":\"function\",\"name\":\"getLastSyncedBlock\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\",\"name\":\"blockId_\"},{\"type\":\"bytes32\",\"name\":\"blockHash_\"},{\"type\":\"bytes32\",\"name\":\"stateRoot_\"}]},{\"type\":\"function\",\"name\":\"getLastVerifiedBlock\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\",\"name\":\"blockId_\"},{\"type\":\"bytes32\",\"name\":\"blockHash_\"},{\"type\":\"bytes32\",\"name\":\"stateRoot_\"}]},{\"type\":\"function\",\"name\":\"getMessageMinGasLimit\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"dataLength\"}],\"outputs\":[{\"type\":\"uint32\"}]},{\"type\":\"function\",\"name\":\"getMinTier\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\"}],\"outputs\":[{\"type\":\"uint16\"}]},{\"type\":\"function\",\"name\":\"getPastTotalSupply\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"timepoint\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"getPastVotes\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"},{\"type\":\"uint256\",\"name\":\"timepoint\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"getSignalSlot\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"address\",\"name\":\"_app\"},{\"type\":\"bytes32\",\"name\":\"_signal\"}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"getStateVariables\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"tuple\",\"components\":[{\"type\":\"uint64\",\"name\":\"genesisHeight\"},{\"type\":\"uint64\",\"name\":\"genesisTimestamp\"},{\"type\":\"uint64\",\"name\":\"lastSyncedBlockId\"},{\"type\":\"uint64\",\"name\":\"lastSynecdAt\"}]},{\"type\":\"tuple\",\"components\":[{\"type\":\"uint64\",\"name\":\"numBlocks\"},{\"type\":\"uint64\",\"name\":\"lastVerifiedBlockId\"},{\"type\":\"bool\",\"name\":\"provingPaused\"},{\"type\":\"uint8\",\"name\":\"__reservedB1\"},{\"type\":\"uint16\",\"name\":\"__reservedB2\"},{\"type\":\"uint32\",\"name\":\"__reservedB3\"},{\"type\":\"uint64\",\"name\":\"lastUnpausedAt\"}]}]},{\"type\":\"function\",\"name\":\"getSyncedChainData\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_kind\"},{\"type\":\"uint64\",\"name\":\"_blockId\"}],\"outputs\":[{\"type\":\"uint64\",\"name\":\"blockId_\"},{\"type\":\"bytes32\",\"name\":\"chainData_\"}]},{\"type\":\"function\",\"name\":\"getTier\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"uint16\",\"name\":\"_tierId\"}],\"outputs\":[{\"type\":\"tuple\",\"components\":[{\"type\":\"bytes32\",\"name\":\"verifierName\"},{\"type\":\"uint96\",\"name\":\"validityBond\"},{\"type\":\"uint96\",\"name\":\"contestBond\"},{\"type\":\"uint24\",\"name\":\"cooldownWindow\"},{\"type\":\"uint16\",\"name\":\"provingWindow\"},{\"type\":\"uint8\",\"name\":\"maxBlocksToVerifyPerProof\"}]}]},{\"type\":\"function\",\"name\":\"getTierIds\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint16[]\",\"name\":\"tiers_\"}]},{\"type\":\"function\",\"name\":\"getTransition\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_blockId\"},{\"type\":\"uint32\",\"name\":\"_tid\"}],\"outputs\":[{\"type\":\"tuple\",\"components\":[{\"type\":\"bytes32\",\"name\":\"key\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"address\",\"name\":\"prover\"},{\"type\":\"uint96\",\"name\":\"validityBond\"},{\"type\":\"address\",\"name\":\"contester\"},{\"type\":\"uint96\",\"name\":\"contestBond\"},{\"type\":\"uint64\",\"name\":\"timestamp\"},{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"uint8\",\"name\":\"__reserved1\"}]}]},{\"type\":\"function\",\"name\":\"getTransition\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_blockId\"},{\"type\":\"bytes32\",\"name\":\"_parentHash\"}],\"outputs\":[{\"type\":\"tuple\",\"components\":[{\"type\":\"bytes32\",\"name\":\"key\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"address\",\"name\":\"prover\"},{\"type\":\"uint96\",\"name\":\"validityBond\"},{\"type\":\"address\",\"name\":\"contester\"},{\"type\":\"uint96\",\"name\":\"contestBond\"},{\"type\":\"uint64\",\"name\":\"timestamp\"},{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"uint8\",\"name\":\"__reserved1\"}]}]},{\"type\":\"function\",\"name\":\"getVerifiedBlockProver\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_blockId\"}],\"outputs\":[{\"type\":\"address\",\"name\":\"prover_\"}]},{\"type\":\"function\",\"name\":\"getVotes\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"guardianIds\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"guardian\"}],\"outputs\":[{\"type\":\"uint256\",\"name\":\"id\"}]},{\"type\":\"function\",\"name\":\"guardians\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"hashAssignment\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_assignment\",\"components\":[{\"type\":\"address\",\"name\":\"feeToken\"},{\"type\":\"uint64\",\"name\":\"expiry\"},{\"type\":\"uint64\",\"name\":\"maxBlockId\"},{\"type\":\"uint64\",\"name\":\"maxProposedIn\"},{\"type\":\"bytes32\",\"name\":\"metaHash\"},{\"type\":\"bytes32\",\"name\":\"parentMetaHash\"},{\"type\":\"tuple[]\",\"name\":\"tierFees\",\"components\":[{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"uint128\",\"name\":\"fee\"}]},{\"type\":\"bytes\",\"name\":\"signature\"}]},{\"type\":\"address\",\"name\":\"_taikoL1Address\"},{\"type\":\"address\",\"name\":\"_blockProposer\"},{\"type\":\"address\",\"name\":\"_assignedProver\"},{\"type\":\"bytes32\",\"name\":\"_blobHash\"}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"hashMessage\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"impl\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"inNonReentrant\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"increaseAllowance\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"spender\"},{\"type\":\"uint256\",\"name\":\"addedValue\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"},{\"type\":\"address\",\"name\":\"_addressManager\"},{\"type\":\"bytes32\",\"name\":\"_genesisBlockHash\"},{\"type\":\"bool\",\"name\":\"_toPause\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"},{\"type\":\"address\",\"name\":\"_addressManager\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"},{\"type\":\"address\",\"name\":\"_addressManager\"},{\"type\":\"address\",\"name\":\"_srcToken\"},{\"type\":\"uint256\",\"name\":\"_srcChainId\"},{\"type\":\"string\",\"name\":\"_symbol\"},{\"type\":\"string\",\"name\":\"_name\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"owner\"},{\"type\":\"address\",\"name\":\"sigVerifyLibAddr\"},{\"type\":\"address\",\"name\":\"pemCertLibAddr\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"},{\"type\":\"address\",\"name\":\"_addressManager\"},{\"type\":\"address\",\"name\":\"_srcToken\"},{\"type\":\"uint256\",\"name\":\"_srcChainId\"},{\"type\":\"uint8\",\"name\":\"_decimals\"},{\"type\":\"string\",\"name\":\"_symbol\"},{\"type\":\"string\",\"name\":\"_name\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init2\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"instances\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"instanceId\"}],\"outputs\":[{\"type\":\"address\",\"name\":\"addr\"},{\"type\":\"uint64\",\"name\":\"validSince\"}]},{\"type\":\"function\",\"name\":\"isApprovedForAll\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"},{\"type\":\"address\",\"name\":\"operator\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"isAuthorized\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"addr\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"authorized\"}]},{\"type\":\"function\",\"name\":\"isChainDataSynced\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_kind\"},{\"type\":\"uint64\",\"name\":\"_blockId\"},{\"type\":\"bytes32\",\"name\":\"_chainData\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"isDestChainEnabled\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"enabled_\"},{\"type\":\"address\",\"name\":\"destBridge_\"}]},{\"type\":\"function\",\"name\":\"isMessageFailed\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"bytes\",\"name\":\"_proof\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"isMessageReceived\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"bytes\",\"name\":\"_proof\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"isMessageSent\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"isSignalSent\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_app\"},{\"type\":\"bytes32\",\"name\":\"_signal\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"lastMigrationStart\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"chainId\"},{\"type\":\"address\",\"name\":\"ctoken\"}],\"outputs\":[{\"type\":\"uint256\",\"name\":\"timestamp\"}]},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"latestProofHash\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"version\"},{\"type\":\"uint256\",\"name\":\"blockId\"}],\"outputs\":[{\"type\":\"bytes32\",\"name\":\"hash\"}]},{\"type\":\"function\",\"name\":\"messageStatus\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\"}],\"outputs\":[{\"type\":\"uint8\",\"name\":\"status\"}]},{\"type\":\"function\",\"name\":\"migratingAddress\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"migratingInbound\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"minGuardians\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint32\"}]},{\"type\":\"function\",\"name\":\"mint\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_to\"},{\"type\":\"uint256\",\"name\":\"_tokenId\"},{\"type\":\"uint256\",\"name\":\"_amount\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"mint\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_account\"},{\"type\":\"uint256\",\"name\":\"_tokenId\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"mintBatch\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_to\"},{\"type\":\"uint256[]\",\"name\":\"_tokenIds\"},{\"type\":\"uint256[]\",\"name\":\"_amounts\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"name\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"name\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"string\"}]},{\"type\":\"function\",\"name\":\"nextInstanceId\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"nextMessageId\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"nonces\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"owner\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"numCheckpoints\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"}],\"outputs\":[{\"type\":\"uint32\"}]},{\"type\":\"function\",\"name\":\"numGuardians\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"onBlockProposed\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_blk\",\"components\":[{\"type\":\"bytes32\",\"name\":\"metaHash\"},{\"type\":\"address\",\"name\":\"assignedProver\"},{\"type\":\"uint96\",\"name\":\"livenessBond\"},{\"type\":\"uint64\",\"name\":\"blockId\"},{\"type\":\"uint64\",\"name\":\"proposedAt\"},{\"type\":\"uint64\",\"name\":\"proposedIn\"},{\"type\":\"uint32\",\"name\":\"nextTransitionId\"},{\"type\":\"uint32\",\"name\":\"verifiedTransitionId\"}]},{\"type\":\"tuple\",\"name\":\"_meta\",\"components\":[{\"type\":\"bytes32\",\"name\":\"l1Hash\"},{\"type\":\"bytes32\",\"name\":\"difficulty\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"bytes32\",\"name\":\"extraData\"},{\"type\":\"bytes32\",\"name\":\"depositsHash\"},{\"type\":\"address\",\"name\":\"coinbase\"},{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"uint64\",\"name\":\"timestamp\"},{\"type\":\"uint64\",\"name\":\"l1Height\"},{\"type\":\"uint16\",\"name\":\"minTier\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"bytes32\",\"name\":\"parentMetaHash\"},{\"type\":\"address\",\"name\":\"sender\"}]},{\"type\":\"bytes\",\"name\":\"_data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"onERC1155BatchReceived\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"address\"},{\"type\":\"address\"},{\"type\":\"uint256[]\"},{\"type\":\"uint256[]\"},{\"type\":\"bytes\"}],\"outputs\":[{\"type\":\"bytes4\"}]},{\"type\":\"function\",\"name\":\"onERC1155Received\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"address\"},{\"type\":\"address\"},{\"type\":\"uint256\"},{\"type\":\"uint256\"},{\"type\":\"bytes\"}],\"outputs\":[{\"type\":\"bytes4\"}]},{\"type\":\"function\",\"name\":\"onERC721Received\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"address\"},{\"type\":\"address\"},{\"type\":\"uint256\"},{\"type\":\"bytes\"}],\"outputs\":[{\"type\":\"bytes4\"}]},{\"type\":\"function\",\"name\":\"onMessageInvocation\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"bytes\",\"name\":\"_data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"onMessageRecalled\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"bytes32\",\"name\":\"_msgHash\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"owner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"ownerOf\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"tokenId\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"pause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"pauseProving\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"bool\",\"name\":\"_pause\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"pauseTaikoProving\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"paused\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"pemCertLib\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"pendingOwner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"permit\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"owner\"},{\"type\":\"address\",\"name\":\"spender\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"uint256\",\"name\":\"deadline\"},{\"type\":\"uint8\",\"name\":\"v\"},{\"type\":\"bytes32\",\"name\":\"r\"},{\"type\":\"bytes32\",\"name\":\"s\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"processMessage\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"bytes\",\"name\":\"_proof\"}],\"outputs\":[{\"type\":\"uint8\",\"name\":\"status_\"},{\"type\":\"uint8\",\"name\":\"reason_\"}]},{\"type\":\"function\",\"name\":\"proposeBlock\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"bytes\",\"name\":\"_params\"},{\"type\":\"bytes\",\"name\":\"_txList\"}],\"outputs\":[{\"type\":\"tuple\",\"name\":\"meta_\",\"components\":[{\"type\":\"bytes32\",\"name\":\"l1Hash\"},{\"type\":\"bytes32\",\"name\":\"difficulty\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"bytes32\",\"name\":\"extraData\"},{\"type\":\"bytes32\",\"name\":\"depositsHash\"},{\"type\":\"address\",\"name\":\"coinbase\"},{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"uint64\",\"name\":\"timestamp\"},{\"type\":\"uint64\",\"name\":\"l1Height\"},{\"type\":\"uint16\",\"name\":\"minTier\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"bytes32\",\"name\":\"parentMetaHash\"},{\"type\":\"address\",\"name\":\"sender\"}]},{\"type\":\"tuple[]\",\"name\":\"deposits_\",\"components\":[{\"type\":\"address\",\"name\":\"recipient\"},{\"type\":\"uint96\",\"name\":\"amount\"},{\"type\":\"uint64\",\"name\":\"id\"}]}]},{\"type\":\"function\",\"name\":\"proveBlock\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_blockId\"},{\"type\":\"bytes\",\"name\":\"_input\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"proveSignalReceived\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"address\",\"name\":\"_app\"},{\"type\":\"bytes32\",\"name\":\"_signal\"},{\"type\":\"bytes\",\"name\":\"_proof\"}],\"outputs\":[{\"type\":\"uint256\",\"name\":\"numCacheOps_\"}]},{\"type\":\"function\",\"name\":\"provingAutoPauseEnabled\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"qeIdentity\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes4\",\"name\":\"miscselect\"},{\"type\":\"bytes4\",\"name\":\"miscselectMask\"},{\"type\":\"uint16\",\"name\":\"isvprodid\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes16\",\"name\":\"attributesMask\"},{\"type\":\"bytes32\",\"name\":\"mrsigner\"}]},{\"type\":\"function\",\"name\":\"recallMessage\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"bytes\",\"name\":\"_proof\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"registerInstance\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_attestation\",\"components\":[{\"type\":\"tuple\",\"name\":\"header\",\"components\":[{\"type\":\"bytes2\",\"name\":\"version\"},{\"type\":\"bytes2\",\"name\":\"attestationKeyType\"},{\"type\":\"bytes4\",\"name\":\"teeType\"},{\"type\":\"bytes2\",\"name\":\"qeSvn\"},{\"type\":\"bytes2\",\"name\":\"pceSvn\"},{\"type\":\"bytes16\",\"name\":\"qeVendorId\"},{\"type\":\"bytes20\",\"name\":\"userData\"}]},{\"type\":\"tuple\",\"name\":\"localEnclaveReport\",\"components\":[{\"type\":\"bytes16\",\"name\":\"cpuSvn\"},{\"type\":\"bytes4\",\"name\":\"miscSelect\"},{\"type\":\"bytes28\",\"name\":\"reserved1\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes32\",\"name\":\"mrEnclave\"},{\"type\":\"bytes32\",\"name\":\"reserved2\"},{\"type\":\"bytes32\",\"name\":\"mrSigner\"},{\"type\":\"bytes\",\"name\":\"reserved3\"},{\"type\":\"uint16\",\"name\":\"isvProdId\"},{\"type\":\"uint16\",\"name\":\"isvSvn\"},{\"type\":\"bytes\",\"name\":\"reserved4\"},{\"type\":\"bytes\",\"name\":\"reportData\"}]},{\"type\":\"tuple\",\"name\":\"v3AuthData\",\"components\":[{\"type\":\"bytes\",\"name\":\"ecdsa256BitSignature\"},{\"type\":\"bytes\",\"name\":\"ecdsaAttestationKey\"},{\"type\":\"tuple\",\"name\":\"pckSignedQeReport\",\"components\":[{\"type\":\"bytes16\",\"name\":\"cpuSvn\"},{\"type\":\"bytes4\",\"name\":\"miscSelect\"},{\"type\":\"bytes28\",\"name\":\"reserved1\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes32\",\"name\":\"mrEnclave\"},{\"type\":\"bytes32\",\"name\":\"reserved2\"},{\"type\":\"bytes32\",\"name\":\"mrSigner\"},{\"type\":\"bytes\",\"name\":\"reserved3\"},{\"type\":\"uint16\",\"name\":\"isvProdId\"},{\"type\":\"uint16\",\"name\":\"isvSvn\"},{\"type\":\"bytes\",\"name\":\"reserved4\"},{\"type\":\"bytes\",\"name\":\"reportData\"}]},{\"type\":\"bytes\",\"name\":\"qeReportSignature\"},{\"type\":\"tuple\",\"name\":\"qeAuthData\",\"components\":[{\"type\":\"uint16\",\"name\":\"parsedDataSize\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"tuple\",\"name\":\"certification\",\"components\":[{\"type\":\"uint16\",\"name\":\"certType\"},{\"type\":\"uint32\",\"name\":\"certDataSize\"},{\"type\":\"bytes[3]\",\"name\":\"decodedCertDataArray\"}]}]}]}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"removeRevokedCertSerialNum\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"index\"},{\"type\":\"bytes[]\",\"name\":\"serialNumBatch\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"resolve\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"bool\",\"name\":\"_allowZeroAddress\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"resolve\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"bool\",\"name\":\"_allowZeroAddress\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"retryMessage\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"bool\",\"name\":\"_isLastAttempt\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"safeBatchTransferFrom\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256[]\",\"name\":\"ids\"},{\"type\":\"uint256[]\",\"name\":\"amounts\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"safeTransferFrom\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"id\"},{\"type\":\"uint256\",\"name\":\"amount\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"safeTransferFrom\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"tokenId\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"safeTransferFrom\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"tokenId\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"selfDelegate\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_anyToken\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"sendMessage\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash_\"},{\"type\":\"tuple\",\"name\":\"message_\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}]},{\"type\":\"function\",\"name\":\"sendSignal\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"_signal\"}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"sendToken\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_op\",\"components\":[{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"address\",\"name\":\"token\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"uint256[]\",\"name\":\"tokenIds\"},{\"type\":\"uint256[]\",\"name\":\"amounts\"}]}],\"outputs\":[{\"type\":\"tuple\",\"name\":\"message_\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}]},{\"type\":\"function\",\"name\":\"sendToken\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_op\",\"components\":[{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"address\",\"name\":\"token\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"uint256\",\"name\":\"amount\"}]}],\"outputs\":[{\"type\":\"tuple\",\"name\":\"message_\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}]},{\"type\":\"function\",\"name\":\"serialNumIsRevoked\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"idx\"},{\"type\":\"bytes\",\"name\":\"serialNum\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"revoked\"}]},{\"type\":\"function\",\"name\":\"setAddress\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"address\",\"name\":\"_newAddress\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"setApprovalForAll\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"operator\"},{\"type\":\"bool\",\"name\":\"approved\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"setGuardians\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address[]\",\"name\":\"_newGuardians\"},{\"type\":\"uint8\",\"name\":\"_minGuardians\"},{\"type\":\"bool\",\"name\":\"_clearData\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"setMrEnclave\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"_mrEnclave\"},{\"type\":\"bool\",\"name\":\"_trusted\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"setMrSigner\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"_mrSigner\"},{\"type\":\"bool\",\"name\":\"_trusted\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"sigVerifyLib\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"signalForChainData\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_kind\"},{\"type\":\"uint64\",\"name\":\"_blockId\"}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"signalForFailedMessage\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"_msgHash\"}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"source\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"},{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"splitCertificateChain\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"bytes\",\"name\":\"pemChain\"},{\"type\":\"uint256\",\"name\":\"size\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"success\"},{\"type\":\"bytes[]\",\"name\":\"certs\"}]},{\"type\":\"function\",\"name\":\"srcChainId\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"srcToken\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"state\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\",\"name\":\"__reserve1\"},{\"type\":\"tuple\",\"name\":\"slotA\",\"components\":[{\"type\":\"uint64\",\"name\":\"genesisHeight\"},{\"type\":\"uint64\",\"name\":\"genesisTimestamp\"},{\"type\":\"uint64\",\"name\":\"lastSyncedBlockId\"},{\"type\":\"uint64\",\"name\":\"lastSynecdAt\"}]},{\"type\":\"tuple\",\"name\":\"slotB\",\"components\":[{\"type\":\"uint64\",\"name\":\"numBlocks\"},{\"type\":\"uint64\",\"name\":\"lastVerifiedBlockId\"},{\"type\":\"bool\",\"name\":\"provingPaused\"},{\"type\":\"uint8\",\"name\":\"__reservedB1\"},{\"type\":\"uint16\",\"name\":\"__reservedB2\"},{\"type\":\"uint32\",\"name\":\"__reservedB3\"},{\"type\":\"uint64\",\"name\":\"lastUnpausedAt\"}]}]},{\"type\":\"function\",\"name\":\"supportsInterface\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes4\",\"name\":\"_interfaceId\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"symbol\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"string\"}]},{\"type\":\"function\",\"name\":\"symbol\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"string\"}]},{\"type\":\"function\",\"name\":\"syncChainData\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_kind\"},{\"type\":\"uint64\",\"name\":\"_blockId\"},{\"type\":\"bytes32\",\"name\":\"_chainData\"}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"tcbInfo\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"string\",\"name\":\"fmspc\"}],\"outputs\":[{\"type\":\"string\",\"name\":\"pceid\"},{\"type\":\"string\",\"name\":\"fmspc\"}]},{\"type\":\"function\",\"name\":\"toggleLocalReportCheck\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"tokenURI\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"_tokenId\"}],\"outputs\":[{\"type\":\"string\"}]},{\"type\":\"function\",\"name\":\"topBlockId\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"chainId\"},{\"type\":\"bytes32\",\"name\":\"kind\"}],\"outputs\":[{\"type\":\"uint64\",\"name\":\"blockId\"}]},{\"type\":\"function\",\"name\":\"totalSupply\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"transfer\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"amount\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"transferFrom\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"amount\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"transferFrom\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"tokenId\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"transferOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newOwner\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"trustedUserMrEnclave\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"enclave\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"trusted\"}]},{\"type\":\"function\",\"name\":\"trustedUserMrSigner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"signer\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"trusted\"}]},{\"type\":\"function\",\"name\":\"unpause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeTo\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"uri\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\"}],\"outputs\":[{\"type\":\"string\"}]},{\"type\":\"function\",\"name\":\"verifyAttestation\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"success\"}]},{\"type\":\"function\",\"name\":\"verifyBlocks\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_maxBlocksToVerify\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"verifyES256Signature\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes\",\"name\":\"tbs\"},{\"type\":\"bytes\",\"name\":\"signature\"},{\"type\":\"bytes\",\"name\":\"publicKey\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"sigValid\"}]},{\"type\":\"function\",\"name\":\"verifyParsedQuote\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"v3quote\",\"components\":[{\"type\":\"tuple\",\"name\":\"header\",\"components\":[{\"type\":\"bytes2\",\"name\":\"version\"},{\"type\":\"bytes2\",\"name\":\"attestationKeyType\"},{\"type\":\"bytes4\",\"name\":\"teeType\"},{\"type\":\"bytes2\",\"name\":\"qeSvn\"},{\"type\":\"bytes2\",\"name\":\"pceSvn\"},{\"type\":\"bytes16\",\"name\":\"qeVendorId\"},{\"type\":\"bytes20\",\"name\":\"userData\"}]},{\"type\":\"tuple\",\"name\":\"localEnclaveReport\",\"components\":[{\"type\":\"bytes16\",\"name\":\"cpuSvn\"},{\"type\":\"bytes4\",\"name\":\"miscSelect\"},{\"type\":\"bytes28\",\"name\":\"reserved1\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes32\",\"name\":\"mrEnclave\"},{\"type\":\"bytes32\",\"name\":\"reserved2\"},{\"type\":\"bytes32\",\"name\":\"mrSigner\"},{\"type\":\"bytes\",\"name\":\"reserved3\"},{\"type\":\"uint16\",\"name\":\"isvProdId\"},{\"type\":\"uint16\",\"name\":\"isvSvn\"},{\"type\":\"bytes\",\"name\":\"reserved4\"},{\"type\":\"bytes\",\"name\":\"reportData\"}]},{\"type\":\"tuple\",\"name\":\"v3AuthData\",\"components\":[{\"type\":\"bytes\",\"name\":\"ecdsa256BitSignature\"},{\"type\":\"bytes\",\"name\":\"ecdsaAttestationKey\"},{\"type\":\"tuple\",\"name\":\"pckSignedQeReport\",\"components\":[{\"type\":\"bytes16\",\"name\":\"cpuSvn\"},{\"type\":\"bytes4\",\"name\":\"miscSelect\"},{\"type\":\"bytes28\",\"name\":\"reserved1\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes32\",\"name\":\"mrEnclave\"},{\"type\":\"bytes32\",\"name\":\"reserved2\"},{\"type\":\"bytes32\",\"name\":\"mrSigner\"},{\"type\":\"bytes\",\"name\":\"reserved3\"},{\"type\":\"uint16\",\"name\":\"isvProdId\"},{\"type\":\"uint16\",\"name\":\"isvSvn\"},{\"type\":\"bytes\",\"name\":\"reserved4\"},{\"type\":\"bytes\",\"name\":\"reportData\"}]},{\"type\":\"bytes\",\"name\":\"qeReportSignature\"},{\"type\":\"tuple\",\"name\":\"qeAuthData\",\"components\":[{\"type\":\"uint16\",\"name\":\"parsedDataSize\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"tuple\",\"name\":\"certification\",\"components\":[{\"type\":\"uint16\",\"name\":\"certType\"},{\"type\":\"uint32\",\"name\":\"certDataSize\"},{\"type\":\"bytes[3]\",\"name\":\"decodedCertDataArray\"}]}]}]}],\"outputs\":[{\"type\":\"bool\"},{\"type\":\"bytes\"}]},{\"type\":\"function\",\"name\":\"verifyProof\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_ctx\",\"components\":[{\"type\":\"bytes32\",\"name\":\"metaHash\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"address\",\"name\":\"prover\"},{\"type\":\"uint64\",\"name\":\"blockId\"},{\"type\":\"bool\",\"name\":\"isContesting\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"address\",\"name\":\"msgSender\"}]},{\"type\":\"tuple\",\"components\":[{\"type\":\"bytes32\",\"name\":\"parentHash\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"bytes32\",\"name\":\"graffiti\"}]},{\"type\":\"tuple\",\"components\":[{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"verifyProof\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_ctx\",\"components\":[{\"type\":\"bytes32\",\"name\":\"metaHash\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"address\",\"name\":\"prover\"},{\"type\":\"uint64\",\"name\":\"blockId\"},{\"type\":\"bool\",\"name\":\"isContesting\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"address\",\"name\":\"msgSender\"}]},{\"type\":\"tuple\",\"name\":\"_tran\",\"components\":[{\"type\":\"bytes32\",\"name\":\"parentHash\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"bytes32\",\"name\":\"graffiti\"}]},{\"type\":\"tuple\",\"name\":\"_proof\",\"components\":[{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"verifySignalReceived\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"address\",\"name\":\"_app\"},{\"type\":\"bytes32\",\"name\":\"_signal\"},{\"type\":\"bytes\",\"name\":\"_proof\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"version\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint32\"}]},{\"type\":\"function\",\"name\":\"withdrawBond\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"_amount\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"withdrawTaikoToken\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_to\"},{\"type\":\"uint256\",\"name\":\"_amount\"}],\"outputs\":[]},{\"type\":\"constructor\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"es256Verifier\"}]}]","addresses":["0x02772b7B3a5Bea0141C993Dbb8D0733C19F46169","0x06a9Ab27c7e2255df1815E6CC0168d7755Feb19a","0x0b470dd3A0e1C41228856Fb319649E7c08f419Aa","0x10dea67478c5F8C5E2D90e5E9B26dBe60c54d800","0x11A9ebA17EbF92b40fcf9a640Ebbc47Db6fBeab0","0x33879cDF01121dc7bCe011b461e64d791aE931F2","0x39E4C1214e733639d059979079A151911e42791d","0x47bB416ee947fE4a4b655011aF7d6E3A1B80E6e9","0x537a2f0D3a5879b41BCb5A2afE2EA5c4961796F6","0x579A8d63a2Db646284CBFE31FE5082c9989E985c","0x579f40D0BE111b823962043702cabe6Aaa290780","0x67281b15aee4d6b805bc755e439abd524dd8da8d","0x8d7C954960a36a7596d7eA4945dDf891967ca8A3","0x996282cA11E5DEb6B5D122CC3B9A1FcAAD4415Ab","0x9e0a24964e5397B566c1ed39258e21aB5E35C77C","0xE3D777143Ea25A6E031d1e921F396750885f43aC","0xEf9EaA1dd30a9AA1df01c36411b5F082aA65fBaa","0xa25e645ff9897b0282e5f17d36de5bca4ec21d6e","0xaf145913EA4a56BE22E120ED9C24589659881702","0xb0f3186FC1963f774f52ff455DC86aEdD0b31F81","0xc4096E9ff1526Bd1840B65e9f45695135aC12De7","0xcc5d488073FA918cBbd73B9A523F3858C4de7372","0xd60247c6848B7Ca29eDdF63AA924E53dB6Ddd8EC"]}],"createdAt":"2024-08-27T09:44:01.744Z","subscriberId":"d1b49dd5-72bd-480e-b5d7-649ce0aadd09","name":"TaikoL1: Pause/Unpause","network":"mainnet","riskCategory":"ACCESS-CONTROL","monitorId":"d1b49dd5-72bd-480e-b5d7-649ce0aadd09","blockWatcherId":"mainnet-6","paused":false,"stackResourceId":"mystack.taiko-l-1-pause-unpause","type":"BLOCK"},{"skipABIValidation":false,"alertThreshold":null,"notifyConfig":{"severityLevel":"LOW","messageBody":"**Defender Monitor {{ sentinel.name }} Triggered**\n\n**Network**\n\n{{ sentinel.network }}\n\n**Block Hash**\n\n{{ blockHash }}\n\n**Transaction Hash**\n\n{{ transaction.transactionHash }}\n\n**Explorer Link**\n\n{{ transaction.link }}\n\n{{ matchReasonsFormatted }}","messageSubject":"Defender Monitor: Taiko Mainnet SGX Prover triggered","notifications":[{"type":"discord","sendCount":0,"notificationId":"93e8dbf2-4f87-4793-b3c3-6ff0dd6cf827"}],"timeoutMs":0},"tenantId":"0691b59e-8b53-4ae2-b874-959de8a9f2ee","addressRules":[{"conditions":[{"txConditions":[{"status":"any","expression":"status == \"failed\""}],"functionConditions":[],"eventConditions":[{"eventSignature":"InstanceAdded(uint256,address,address,uint256)","expression":null}]},{"txConditions":[{"status":"any","expression":"status == \"failed\""}],"functionConditions":[],"eventConditions":[{"eventSignature":"InstanceDeleted(uint256,address)","expression":null}]},{"txConditions":[{"status":"any","expression":"status == \"failed\""}],"functionConditions":[{"functionSignature":"verifyProof((bytes32,bytes32,address,uint64,bool,bool,address),(bytes32,bytes32,bytes32,bytes32),(uint16,bytes))","expression":null}],"eventConditions":[]}],"abi":"[{\"type\":\"event\",\"anonymous\":false,\"name\":\"AdminChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousAdmin\",\"indexed\":false},{\"type\":\"address\",\"name\":\"newAdmin\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BeaconUpgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"beacon\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Initialized\",\"inputs\":[{\"type\":\"uint8\",\"name\":\"version\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"InstanceAdded\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"id\",\"indexed\":true},{\"type\":\"address\",\"name\":\"instance\",\"indexed\":true},{\"type\":\"address\",\"name\":\"replaced\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"validSince\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"InstanceDeleted\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"id\",\"indexed\":true},{\"type\":\"address\",\"name\":\"instance\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferred\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Paused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Unpaused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Upgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"implementation\",\"indexed\":true}]},{\"type\":\"function\",\"name\":\"INSTANCE_EXPIRY\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"INSTANCE_VALIDITY_DELAY\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"addInstances\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address[]\",\"name\":\"_instances\"}],\"outputs\":[{\"type\":\"uint256[]\"}]},{\"type\":\"function\",\"name\":\"addressManager\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"addressRegistered\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"instanceAddress\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"alreadyAttested\"}]},{\"type\":\"function\",\"name\":\"deleteInstances\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256[]\",\"name\":\"_ids\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"},{\"type\":\"address\",\"name\":\"_addressManager\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"instances\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"instanceId\"}],\"outputs\":[{\"type\":\"address\",\"name\":\"addr\"},{\"type\":\"uint64\",\"name\":\"validSince\"}]},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"nextInstanceId\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"owner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"pause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"paused\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"pendingOwner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"registerInstance\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_attestation\",\"components\":[{\"type\":\"tuple\",\"name\":\"header\",\"components\":[{\"type\":\"bytes2\",\"name\":\"version\"},{\"type\":\"bytes2\",\"name\":\"attestationKeyType\"},{\"type\":\"bytes4\",\"name\":\"teeType\"},{\"type\":\"bytes2\",\"name\":\"qeSvn\"},{\"type\":\"bytes2\",\"name\":\"pceSvn\"},{\"type\":\"bytes16\",\"name\":\"qeVendorId\"},{\"type\":\"bytes20\",\"name\":\"userData\"}]},{\"type\":\"tuple\",\"name\":\"localEnclaveReport\",\"components\":[{\"type\":\"bytes16\",\"name\":\"cpuSvn\"},{\"type\":\"bytes4\",\"name\":\"miscSelect\"},{\"type\":\"bytes28\",\"name\":\"reserved1\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes32\",\"name\":\"mrEnclave\"},{\"type\":\"bytes32\",\"name\":\"reserved2\"},{\"type\":\"bytes32\",\"name\":\"mrSigner\"},{\"type\":\"bytes\",\"name\":\"reserved3\"},{\"type\":\"uint16\",\"name\":\"isvProdId\"},{\"type\":\"uint16\",\"name\":\"isvSvn\"},{\"type\":\"bytes\",\"name\":\"reserved4\"},{\"type\":\"bytes\",\"name\":\"reportData\"}]},{\"type\":\"tuple\",\"name\":\"v3AuthData\",\"components\":[{\"type\":\"bytes\",\"name\":\"ecdsa256BitSignature\"},{\"type\":\"bytes\",\"name\":\"ecdsaAttestationKey\"},{\"type\":\"tuple\",\"name\":\"pckSignedQeReport\",\"components\":[{\"type\":\"bytes16\",\"name\":\"cpuSvn\"},{\"type\":\"bytes4\",\"name\":\"miscSelect\"},{\"type\":\"bytes28\",\"name\":\"reserved1\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes32\",\"name\":\"mrEnclave\"},{\"type\":\"bytes32\",\"name\":\"reserved2\"},{\"type\":\"bytes32\",\"name\":\"mrSigner\"},{\"type\":\"bytes\",\"name\":\"reserved3\"},{\"type\":\"uint16\",\"name\":\"isvProdId\"},{\"type\":\"uint16\",\"name\":\"isvSvn\"},{\"type\":\"bytes\",\"name\":\"reserved4\"},{\"type\":\"bytes\",\"name\":\"reportData\"}]},{\"type\":\"bytes\",\"name\":\"qeReportSignature\"},{\"type\":\"tuple\",\"name\":\"qeAuthData\",\"components\":[{\"type\":\"uint16\",\"name\":\"parsedDataSize\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"tuple\",\"name\":\"certification\",\"components\":[{\"type\":\"uint16\",\"name\":\"certType\"},{\"type\":\"uint32\",\"name\":\"certDataSize\"},{\"type\":\"bytes[3]\",\"name\":\"decodedCertDataArray\"}]}]}]}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"resolve\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"bool\",\"name\":\"_allowZeroAddress\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"transferOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newOwner\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"unpause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeTo\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"verifyProof\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_ctx\",\"components\":[{\"type\":\"bytes32\",\"name\":\"metaHash\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"address\",\"name\":\"prover\"},{\"type\":\"uint64\",\"name\":\"blockId\"},{\"type\":\"bool\",\"name\":\"isContesting\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"address\",\"name\":\"msgSender\"}]},{\"type\":\"tuple\",\"name\":\"_tran\",\"components\":[{\"type\":\"bytes32\",\"name\":\"parentHash\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"bytes32\",\"name\":\"graffiti\"}]},{\"type\":\"tuple\",\"name\":\"_proof\",\"components\":[{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[]}]","addresses":["0xb0f3186FC1963f774f52ff455DC86aEdD0b31F81"]}],"createdAt":"2024-05-02T14:09:42.804Z","subscriberId":"d49a2a9b-268d-4d30-9553-ec55ed952d87","name":"Taiko Mainnet SGX Prover","network":"mainnet","riskCategory":"TECHNICAL","monitorId":"d49a2a9b-268d-4d30-9553-ec55ed952d87","blockWatcherId":"mainnet-1","paused":false,"stackResourceId":"mystack.taiko-mainnet-sgx-prover","type":"BLOCK"},{"skipABIValidation":false,"alertThreshold":null,"notifyConfig":{"severityLevel":"HIGH","messageBody":"**Defender Monitor {{ sentinel.name }} Triggered**\n\n**Network**\n\n{{ sentinel.network }}\n\n**Block Hash**\n\n{{ blockHash }}\n\n**Transaction Hash**\n\n{{ transaction.transactionHash }}\n\n**Explorer Link**\n\n{{ transaction.link }}\n\n{{ matchReasonsFormatted }}","messageSubject":"Defender Monitor: Taiko Mainnet Address Managers triggered","notifications":[{"type":"discord","sendCount":0,"notificationId":"93e8dbf2-4f87-4793-b3c3-6ff0dd6cf827"}],"timeoutMs":0},"tenantId":"0691b59e-8b53-4ae2-b874-959de8a9f2ee","addressRules":[{"conditions":[{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"AddressSet(uint64,bytes32,address,address)","expression":null}]}],"abi":"[{\"type\":\"event\",\"anonymous\":false,\"name\":\"AddressSet\",\"inputs\":[{\"type\":\"uint64\",\"name\":\"chainId\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"name\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newAddress\",\"indexed\":false},{\"type\":\"address\",\"name\":\"oldAddress\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"AdminChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousAdmin\",\"indexed\":false},{\"type\":\"address\",\"name\":\"newAdmin\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BeaconUpgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"beacon\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Initialized\",\"inputs\":[{\"type\":\"uint8\",\"name\":\"version\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferred\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Paused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Unpaused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Upgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"implementation\",\"indexed\":true}]},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"addressManager\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"getAddress\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"owner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"pause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"paused\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"pendingOwner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"resolve\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"bool\",\"name\":\"_allowZeroAddress\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"setAddress\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"address\",\"name\":\"_newAddress\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"transferOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newOwner\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"unpause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeTo\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]}]","addresses":["0xEf9EaA1dd30a9AA1df01c36411b5F082aA65fBaa","0x579f40D0BE111b823962043702cabe6Aaa290780"]}],"createdAt":"2024-05-02T14:00:18.874Z","subscriberId":"3919cb83-487f-4432-88fa-33bbe4361fce","name":"Taiko Mainnet Address Managers","network":"mainnet","riskCategory":"ACCESS-CONTROL","monitorId":"3919cb83-487f-4432-88fa-33bbe4361fce","blockWatcherId":"mainnet-1","paused":false,"stackResourceId":"mystack.taiko-mainnet-address-managers","type":"BLOCK"},{"skipABIValidation":false,"alertThreshold":null,"notifyConfig":{"severityLevel":"HIGH","messageBody":"**Defender Monitor {{ sentinel.name }} Triggered**\n\n**Network**\n\n{{ sentinel.network }}\n\n**Block Hash**\n\n{{ blockHash }}\n\n**Transaction Hash**\n\n{{ transaction.transactionHash }}\n\n**Explorer Link**\n\n{{ transaction.link }}\n\n{{ matchReasonsFormatted }}","messageSubject":"Defender Monitor: Taiko Mainnet Essential Contracts triggered","notifications":[{"type":"discord","sendCount":0,"notificationId":"93e8dbf2-4f87-4793-b3c3-6ff0dd6cf827"}],"timeoutMs":0},"tenantId":"0691b59e-8b53-4ae2-b874-959de8a9f2ee","addressRules":[{"conditions":[{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"AdminChanged(address,address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"BeaconUpgraded(address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"Initialized(uint8)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"OwnershipTransferStarted(address,address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"OwnershipTransferred(address,address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"Paused(address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"Unpaused(address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"Upgraded(address)","expression":null}]}],"abi":"[{\"type\":\"event\",\"anonymous\":false,\"name\":\"AdminChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousAdmin\",\"indexed\":false},{\"type\":\"address\",\"name\":\"newAdmin\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BeaconUpgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"beacon\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Initialized\",\"inputs\":[{\"type\":\"uint8\",\"name\":\"version\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferred\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Paused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Unpaused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Upgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"implementation\",\"indexed\":true}]},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"addressManager\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"owner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"pause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"paused\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"pendingOwner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"resolve\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"bool\",\"name\":\"_allowZeroAddress\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"transferOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newOwner\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"unpause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeTo\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]}]","addresses":["0xEf9EaA1dd30a9AA1df01c36411b5F082aA65fBaa","0x10dea67478c5F8C5E2D90e5E9B26dBe60c54d800","0x9e0a24964e5397B566c1ed39258e21aB5E35C77C","0xd60247c6848B7Ca29eDdF63AA924E53dB6Ddd8EC","0x996282cA11E5DEb6B5D122CC3B9A1FcAAD4415Ab","0x0b470dd3A0e1C41228856Fb319649E7c08f419Aa","0x0b470dd3A0e1C41228856Fb319649E7c08f419Aa","0xaf145913EA4a56BE22E120ED9C24589659881702","0x579f40D0BE111b823962043702cabe6Aaa290780","0x06a9Ab27c7e2255df1815E6CC0168d7755Feb19a","0x537a2f0D3a5879b41BCb5A2afE2EA5c4961796F6","0x33879cDF01121dc7bCe011b461e64d791aE931F2","0xb0f3186FC1963f774f52ff455DC86aEdD0b31F81","0x579A8d63a2Db646284CBFE31FE5082c9989E985c","0xE3D777143Ea25A6E031d1e921F396750885f43aC","0x8d7C954960a36a7596d7eA4945dDf891967ca8A3"]}],"createdAt":"2024-05-02T13:49:54.192Z","subscriberId":"67a53521-3d4a-4de4-92ab-ede82cc45644","name":"Taiko Mainnet Essential Contracts","network":"mainnet","riskCategory":"ACCESS-CONTROL","monitorId":"67a53521-3d4a-4de4-92ab-ede82cc45644","blockWatcherId":"mainnet-1","paused":false,"stackResourceId":"mystack.taiko-mainnet-essential-contracts","type":"BLOCK"}]},"actions":{"removed":[],"created":[],"updated":[{"autotaskId":"86964fd3-3da8-4501-a572-cbf51045f861","actionId":"86964fd3-3da8-4501-a572-cbf51045f861","name":"ERC20Vault: Balance Drop Test","paused":false,"trigger":{"cron":null,"frequencyMinutes":15,"type":"schedule"},"codeDigest":"+Y75bpyOzEuCm0y95ZczKkySm4PgLyQQt6ASpaB08Lk=","stackResourceId":"mystack.erc-20-vault-balance-drop","runtime":"nodejs20.x","dependenciesVersion":"v2024-08-21","encodedZippedCode":"UEsDBAoAAAAAAAAAQVASVlLscBMAAHATAAAIAAAAaW5kZXguanNjb25zdCB7IGV0aGVycyB9ID0gcmVxdWlyZSgiZXRoZXJzIik7CmNvbnN0IHsgRGVmZW5kZXIgfSA9IHJlcXVpcmUoIkBvcGVuemVwcGVsaW4vZGVmZW5kZXItc2RrIik7Cgpjb25zdCBFUkMyMF9BQkkgPSBbCiAgewogICAgY29uc3RhbnQ6IHRydWUsCiAgICBpbnB1dHM6IFt7IG5hbWU6ICJfb3duZXIiLCB0eXBlOiAiYWRkcmVzcyIgfV0sCiAgICBuYW1lOiAiYmFsYW5jZU9mIiwKICAgIG91dHB1dHM6IFt7IG5hbWU6ICJiYWxhbmNlIiwgdHlwZTogInVpbnQyNTYiIH1dLAogICAgcGF5YWJsZTogZmFsc2UsCiAgICBzdGF0ZU11dGFiaWxpdHk6ICJ2aWV3IiwKICAgIHR5cGU6ICJmdW5jdGlvbiIsCiAgfSwKXTsKCmFzeW5jIGZ1bmN0aW9uIGdldEVSQzIwQmFsYW5jZShwcm92aWRlciwgdG9rZW5BZGRyZXNzLCB2YXVsdEFkZHJlc3MpIHsKICBjb25zdCBjb250cmFjdCA9IG5ldyBldGhlcnMuQ29udHJhY3QodG9rZW5BZGRyZXNzLCBFUkMyMF9BQkksIHByb3ZpZGVyKTsKICByZXR1cm4gYXdhaXQgY29udHJhY3QuYmFsYW5jZU9mKHZhdWx0QWRkcmVzcyk7Cn0KCmFzeW5jIGZ1bmN0aW9uIGdldE5hdGl2ZVRva2VuQmFsYW5jZShwcm92aWRlciwgdmF1bHRBZGRyZXNzKSB7CiAgcmV0dXJuIGF3YWl0IHByb3ZpZGVyLmdldEJhbGFuY2UodmF1bHRBZGRyZXNzKTsKfQoKYXN5bmMgZnVuY3Rpb24gbW9uaXRvclRva2VuQmFsYW5jZSgKICBwcm92aWRlciwKICB0b2tlbkFkZHJlc3MsCiAgdmF1bHRBZGRyZXNzLAogIHByZXZpb3VzQmFsYW5jZUtleSwKICBub3RpZmljYXRpb25DbGllbnQsCiAgc2VjcmV0cywKICBjbGllbnQsCiAgdG9rZW5OYW1lLAogIG5ldHdvcmtOYW1lLAopIHsKICBjb25zb2xlLmxvZyhgTW9uaXRvcmluZyAke3Rva2VuTmFtZX0gYmFsYW5jZSBvbiAke25ldHdvcmtOYW1lfWApOwogIGNvbnN0IHByZXZpb3VzQmFsYW5jZSA9IGV0aGVycy5CaWdOdW1iZXIuZnJvbSgKICAgIHNlY3JldHNbcHJldmlvdXNCYWxhbmNlS2V5XSB8fCAiMCIsCiAgKTsKICBjb25zb2xlLmxvZygKICAgIGBQcmV2aW91cyAke3Rva2VuTmFtZX0gQmFsYW5jZTogJHtldGhlcnMudXRpbHMuZm9ybWF0VW5pdHMoCiAgICAgIHByZXZpb3VzQmFsYW5jZSwKICAgICAgMTgsCiAgICApfWAsCiAgKTsKCiAgbGV0IGN1cnJlbnRCYWxhbmNlOwogIGlmICh0b2tlbk5hbWUgPT09ICJFVEgiKSB7CiAgICBjdXJyZW50QmFsYW5jZSA9IGF3YWl0IGdldE5hdGl2ZVRva2VuQmFsYW5jZShwcm92aWRlciwgdmF1bHRBZGRyZXNzKTsKICB9IGVsc2UgewogICAgY3VycmVudEJhbGFuY2UgPSBhd2FpdCBnZXRFUkMyMEJhbGFuY2UoCiAgICAgIHByb3ZpZGVyLAogICAgICB0b2tlbkFkZHJlc3MsCiAgICAgIHZhdWx0QWRkcmVzcywKICAgICk7CiAgfQogIGNvbnNvbGUubG9nKAogICAgYEN1cnJlbnQgJHt0b2tlbk5hbWV9IEJhbGFuY2U6ICR7ZXRoZXJzLnV0aWxzLmZvcm1hdFVuaXRzKAogICAgICBjdXJyZW50QmFsYW5jZSwKICAgICAgMTgsCiAgICApfWAsCiAgKTsKCiAgaWYgKCFwcmV2aW91c0JhbGFuY2UuaXNaZXJvKCkpIHsKICAgIGNvbnN0IGRyb3BQZXJjZW50YWdlID0gcHJldmlvdXNCYWxhbmNlCiAgICAgIC5zdWIoY3VycmVudEJhbGFuY2UpCiAgICAgIC5tdWwoMTAwKQogICAgICAuZGl2KHByZXZpb3VzQmFsYW5jZSkKICAgICAgLnRvTnVtYmVyKCk7CiAgICBjb25zb2xlLmxvZygKICAgICAgYENhbGN1bGF0ZWQgZHJvcCBwZXJjZW50YWdlIGZvciAke3Rva2VuTmFtZX06ICR7ZHJvcFBlcmNlbnRhZ2V9JWAsCiAgICApOwoKICAgIGlmIChkcm9wUGVyY2VudGFnZSA+PSA1KSB7CiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBgQWxlcnQ6ICR7dG9rZW5OYW1lfSBiYWxhbmNlIGhhcyBkcm9wcGVkIGJ5ICR7ZHJvcFBlcmNlbnRhZ2V9JSBvbiAke25ldHdvcmtOYW1lfS5cblByZXZpb3VzIEJhbGFuY2U6ICR7ZXRoZXJzLnV0aWxzLmZvcm1hdFVuaXRzKAogICAgICAgIHByZXZpb3VzQmFsYW5jZSwKICAgICAgICAxOCwKICAgICAgKX1cbkN1cnJlbnQgQmFsYW5jZTogJHtldGhlcnMudXRpbHMuZm9ybWF0VW5pdHMoY3VycmVudEJhbGFuY2UsIDE4KX1gOwogICAgICBhbGVydE9yZygKICAgICAgICBub3RpZmljYXRpb25DbGllbnQsCiAgICAgICAgYOKaoO+4jyAke25ldHdvcmtOYW1lfTogJHt0b2tlbk5hbWV9IEJhbGFuY2UgRHJvcCBBbGVydGAsCiAgICAgICAgbWVzc2FnZSwKICAgICAgKTsKICAgIH0gZWxzZSB7CiAgICAgIGNvbnNvbGUubG9nKAogICAgICAgIGBObyBzaWduaWZpY2FudCAke3Rva2VuTmFtZX0gYmFsYW5jZSBkcm9wIGRldGVjdGVkIG9uICR7bmV0d29ya05hbWV9YCwKICAgICAgKTsKICAgIH0KICB9IGVsc2UgewogICAgY29uc29sZS5sb2coCiAgICAgIGBObyBwcmV2aW91cyAke3Rva2VuTmFtZX0gYmFsYW5jZSB0byBjb21wYXJlIG9uICR7bmV0d29ya05hbWV9YCwKICAgICk7CiAgfQoKICBhd2FpdCBzdG9yZVByZXZpb3VzQmFsYW5jZShjbGllbnQsIHByZXZpb3VzQmFsYW5jZUtleSwgY3VycmVudEJhbGFuY2UpOwp9CgpmdW5jdGlvbiBhbGVydE9yZyhub3RpZmljYXRpb25DbGllbnQsIHN1YmplY3QsIG1lc3NhZ2UpIHsKICBub3RpZmljYXRpb25DbGllbnQuc2VuZCh7CiAgICBjaGFubmVsQWxpYXM6ICJkaXNjb3JkX2JyaWRnaW5nIiwKICAgIHN1YmplY3QsCiAgICBtZXNzYWdlLAogIH0pOwp9Cgphc3luYyBmdW5jdGlvbiBzdG9yZVByZXZpb3VzQmFsYW5jZShjbGllbnQsIGtleSwgbmV3QmFsYW5jZSkgewogIGNvbnNvbGUubG9nKAogICAgYFN0b3JpbmcgcHJldmlvdXMgYmFsYW5jZSB1bmRlciBrZXk6ICR7a2V5fSwgdmFsdWU6ICR7bmV3QmFsYW5jZS50b1N0cmluZygpfWAsCiAgKTsKICBjb25zdCBib2R5ID0gewogICAgZGVsZXRlczogW10sCiAgICBzZWNyZXRzOiB7CiAgICAgIFtrZXldOiBuZXdCYWxhbmNlLnRvU3RyaW5nKCksCiAgICB9LAogIH07CiAgYXdhaXQgY2xpZW50LmFjdGlvbi5jcmVhdGVTZWNyZXRzKGJvZHkpOwp9CgpmdW5jdGlvbiBjcmVhdGVQcm92aWRlcihhcGlLZXksIGFwaVNlY3JldCwgcmVsYXllckFwaUtleSwgcmVsYXllckFwaVNlY3JldCkgewogIGNvbnNvbGUubG9nKGBDcmVhdGluZyBwcm92aWRlciB3aXRoIEFQSSBrZXlzYCk7CiAgY29uc3QgY2xpZW50ID0gbmV3IERlZmVuZGVyKHsKICAgIGFwaUtleSwKICAgIGFwaVNlY3JldCwKICAgIHJlbGF5ZXJBcGlLZXksCiAgICByZWxheWVyQXBpU2VjcmV0LAogIH0pOwoKICByZXR1cm4gY2xpZW50LnJlbGF5U2lnbmVyLmdldFByb3ZpZGVyKCk7Cn0KCmV4cG9ydHMuaGFuZGxlciA9IGFzeW5jIGZ1bmN0aW9uIChldmVudCwgY29udGV4dCkgewogIGNvbnN0IHsgbm90aWZpY2F0aW9uQ2xpZW50IH0gPSBjb250ZXh0OwogIGNvbnN0IHsgYXBpS2V5LCBhcGlTZWNyZXQsIHRhaWtvTDFBcGlLZXksIHRhaWtvTDFBcGlTZWNyZXQgfSA9IGV2ZW50LnNlY3JldHM7CgogIGNvbnNvbGUubG9nKGBTdGFydGluZyBiYWxhbmNlIG1vbml0b3JpbmcgZm9yIEwxYCk7CgogIGNvbnN0IGwxUHJvdmlkZXIgPSBjcmVhdGVQcm92aWRlcigKICAgIGFwaUtleSwKICAgIGFwaVNlY3JldCwKICAgIHRhaWtvTDFBcGlLZXksCiAgICB0YWlrb0wxQXBpU2VjcmV0LAogICk7CgogIGNvbnN0IGwxVmF1bHRBZGRyZXNzID0gIjB4OTk2MjgyY0ExMUU1REViNkI1RDEyMkNDM0I5QTFGY0FBRDQ0MTVBYiI7CgogIGNvbnN0IGwxVG9rZW5BZGRyZXNzZXMgPSB7CiAgICBFVEg6IG51bGwsCiAgICBUQUlLTzogZXRoZXJzLnV0aWxzLmdldEFkZHJlc3MoCiAgICAgICIweDEwZGVhNjc0NzhjNUY4QzVFMkQ5MGU1RTlCMjZkQmU2MGM1NGQ4MDAiLAogICAgKSwKICAgIFVTREM6IGV0aGVycy51dGlscy5nZXRBZGRyZXNzKCIweEEwYjg2OTkxYzYyMThiMzZjMWQxOUQ0YTJlOUViMGNFMzYwNmVCNDgiKSwKICAgIFVTRFQ6IGV0aGVycy51dGlscy5nZXRBZGRyZXNzKCIweGRBQzE3Rjk1OEQyZWU1MjNhMjIwNjIwNjk5NDU5N0MxM0Q4MzFlYzciKSwKICB9OwoKICBjb25zdCBjbGllbnQgPSBuZXcgRGVmZW5kZXIoewogICAgYXBpS2V5LAogICAgYXBpU2VjcmV0LAogICAgdGFpa29MMUFwaUtleSwKICAgIHRhaWtvTDFBcGlTZWNyZXQsCiAgfSk7CgogIGF3YWl0IG1vbml0b3JUb2tlbkJhbGFuY2UoCiAgICBsMVByb3ZpZGVyLAogICAgbDFUb2tlbkFkZHJlc3Nlcy5FVEgsCiAgICBsMVZhdWx0QWRkcmVzcywKICAgICJwcmV2aW91c0JhbGFuY2VfTDFfRVRIIiwKICAgIG5vdGlmaWNhdGlvbkNsaWVudCwKICAgIGV2ZW50LnNlY3JldHMsCiAgICBjbGllbnQsCiAgICAiRVRIIiwKICAgICJMMSIsCiAgKTsKICBhd2FpdCBtb25pdG9yVG9rZW5CYWxhbmNlKAogICAgbDFQcm92aWRlciwKICAgIGwxVG9rZW5BZGRyZXNzZXMuVEFJS08sCiAgICBsMVZhdWx0QWRkcmVzcywKICAgICJwcmV2aW91c0JhbGFuY2VfTDFfVEFJS08iLAogICAgbm90aWZpY2F0aW9uQ2xpZW50LAogICAgZXZlbnQuc2VjcmV0cywKICAgIGNsaWVudCwKICAgICJUQUlLTyIsCiAgICAiTDEiLAogICk7CiAgYXdhaXQgbW9uaXRvclRva2VuQmFsYW5jZSgKICAgIGwxUHJvdmlkZXIsCiAgICBsMVRva2VuQWRkcmVzc2VzLlVTREMsCiAgICBsMVZhdWx0QWRkcmVzcywKICAgICJwcmV2aW91c0JhbGFuY2VfTDFfVVNEQyIsCiAgICBub3RpZmljYXRpb25DbGllbnQsCiAgICBldmVudC5zZWNyZXRzLAogICAgY2xpZW50LAogICAgIlVTREMiLAogICAgIkwxIiwKICApOwogIGF3YWl0IG1vbml0b3JUb2tlbkJhbGFuY2UoCiAgICBsMVByb3ZpZGVyLAogICAgbDFUb2tlbkFkZHJlc3Nlcy5VU0RULAogICAgbDFWYXVsdEFkZHJlc3MsCiAgICAicHJldmlvdXNCYWxhbmNlX0wxX1VTRFQiLAogICAgbm90aWZpY2F0aW9uQ2xpZW50LAogICAgZXZlbnQuc2VjcmV0cywKICAgIGNsaWVudCwKICAgICJVU0RUIiwKICAgICJMMSIsCiAgKTsKCiAgY29uc29sZS5sb2coYEJhbGFuY2UgbW9uaXRvcmluZyBjb21wbGV0ZWRgKTsKCiAgcmV0dXJuIHRydWU7Cn07ClBLAQIUAAoAAAAAAAAAQVASVlLscBMAAHATAAAIAAAAAAAAAAAAAAAAAAAAAABpbmRleC5qc1BLBQYAAAAAAQABADYAAACWEwAAAAA="}]},"contracts":{"removed":[],"created":[],"updated":[]},"relayers":{"removed":[],"created":[],"updated":[],"relayerKeys":{"removed":[],"created":[],"updated":[]}},"notifications":{"removed":[],"created":[],"updated":[]},"secrets":{"removed":[],"created":[],"updated":[]},"blockExplorerApiKeys":{"removed":[],"created":[],"updated":[]},"forkedNetworks":{"removed":[],"created":[],"updated":[]},"privateNetworks":{"removed":[],"created":[],"updated":[]}} +{"stack":"mystack","timestamp":"2024-09-18T21:53:56.270Z","monitors":{"removed":[],"created":[],"updated":[{"skipABIValidation":true,"alertThreshold":null,"notifyConfig":{"severityLevel":"MEDIUM","messageBody":"**Defender Monitor {{ sentinel.name }} Triggered**\n\n**Network**\n\n{{ sentinel.network }}\n\n**Block Hash**\n\n{{ blockHash }}\n\n**Transaction Hash**\n\n{{ transaction.transactionHash }}\n\n**Explorer Link**\n\n{{ transaction.link }}\n\n**Match Reasons**\n\n{{ matchReasonsFormatted }}\n\n**Metadata**\n\n{{ metadataFormatted }}","messageSubject":"Defender Monitor: TaikoL1: Pause/Unpause triggered","notifications":[{"type":"discord","sendCount":0,"notificationId":"93e8dbf2-4f87-4793-b3c3-6ff0dd6cf827"}],"timeoutMs":60000},"tenantId":"0691b59e-8b53-4ae2-b874-959de8a9f2ee","addressRules":[{"conditions":[{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"Paused(address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"Unpaused(address)","expression":null}]}],"abi":"[{\"type\":\"error\",\"name\":\"AM_ADDRESS_ALREADY_SET\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"AddressSet\",\"inputs\":[{\"type\":\"uint64\",\"name\":\"chainId\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"name\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newAddress\",\"indexed\":false},{\"type\":\"address\",\"name\":\"oldAddress\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"AdminChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousAdmin\",\"indexed\":false},{\"type\":\"address\",\"name\":\"newAdmin\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Approval\",\"inputs\":[{\"type\":\"address\",\"name\":\"owner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"spender\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"value\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Approval\",\"inputs\":[{\"type\":\"address\",\"name\":\"owner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"approved\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"tokenId\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"ApprovalForAll\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":true},{\"type\":\"address\",\"name\":\"operator\",\"indexed\":true},{\"type\":\"bool\",\"name\":\"approved\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Approved\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"operationId\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"approvalBits\",\"indexed\":false},{\"type\":\"bool\",\"name\":\"minGuardiansReached\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Authorized\",\"inputs\":[{\"type\":\"address\",\"name\":\"addr\",\"indexed\":true},{\"type\":\"bool\",\"name\":\"authorized\",\"indexed\":false}]},{\"type\":\"error\",\"name\":\"BB_INVALID_PARAMS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BB_MINT_DISALLOWED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BB_PERMISSION_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BTOKEN_CANNOT_RECEIVE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BTOKEN_INVALID_BURN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BTOKEN_INVALID_PARAMS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INSUFFICIENT_GAS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_CONTEXT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_FEE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_GAS_LIMIT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_VALUE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_MESSAGE_NOT_SENT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_OUT_OF_ETH_QUOTA\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_PERMISSION_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_PROOF_TOO_LARGE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_RETRY_FAILED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_SIGNAL_NOT_RECEIVED\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BeaconUpgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"beacon\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BlockProposed\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"address\",\"name\":\"assignedProver\",\"indexed\":true},{\"type\":\"uint96\",\"name\":\"livenessBond\",\"indexed\":false},{\"type\":\"tuple\",\"name\":\"meta\",\"indexed\":false,\"components\":[{\"type\":\"bytes32\",\"name\":\"l1Hash\"},{\"type\":\"bytes32\",\"name\":\"difficulty\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"bytes32\",\"name\":\"extraData\"},{\"type\":\"bytes32\",\"name\":\"depositsHash\"},{\"type\":\"address\",\"name\":\"coinbase\"},{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"uint64\",\"name\":\"timestamp\"},{\"type\":\"uint64\",\"name\":\"l1Height\"},{\"type\":\"uint16\",\"name\":\"minTier\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"bytes32\",\"name\":\"parentMetaHash\"},{\"type\":\"address\",\"name\":\"sender\"}]},{\"type\":\"tuple[]\",\"name\":\"depositsProcessed\",\"indexed\":false,\"components\":[{\"type\":\"address\",\"name\":\"recipient\"},{\"type\":\"uint96\",\"name\":\"amount\"},{\"type\":\"uint64\",\"name\":\"id\"}]}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BlockVerified\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"address\",\"name\":\"prover\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"blockHash\",\"indexed\":false},{\"type\":\"bytes32\",\"name\":\"stateRoot\",\"indexed\":false},{\"type\":\"uint16\",\"name\":\"tier\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BondCredited\",\"inputs\":[{\"type\":\"address\",\"name\":\"user\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"amount\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BondDebited\",\"inputs\":[{\"type\":\"address\",\"name\":\"user\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"amount\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BridgedTokenChanged\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"srcChainId\",\"indexed\":true},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":true},{\"type\":\"address\",\"name\":\"btokenOld\",\"indexed\":false},{\"type\":\"address\",\"name\":\"btokenNew\",\"indexed\":false},{\"type\":\"string\",\"name\":\"ctokenSymbol\",\"indexed\":false},{\"type\":\"string\",\"name\":\"ctokenName\",\"indexed\":false},{\"type\":\"uint8\",\"name\":\"ctokenDecimal\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BridgedTokenDeployed\",\"inputs\":[{\"type\":\"uint64\",\"name\":\"chainId\",\"indexed\":true},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":true},{\"type\":\"address\",\"name\":\"btoken\",\"indexed\":true},{\"type\":\"string\",\"name\":\"ctokenSymbol\",\"indexed\":false},{\"type\":\"string\",\"name\":\"ctokenName\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BridgedTokenDeployed\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"srcChainId\",\"indexed\":true},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":true},{\"type\":\"address\",\"name\":\"btoken\",\"indexed\":true},{\"type\":\"string\",\"name\":\"ctokenSymbol\",\"indexed\":false},{\"type\":\"string\",\"name\":\"ctokenName\",\"indexed\":false},{\"type\":\"uint8\",\"name\":\"ctokenDecimal\",\"indexed\":false}]},{\"type\":\"function\",\"name\":\"CLOCK_MODE\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"string\"}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"CalldataTxList\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"bytes\",\"name\":\"txList\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"ChainDataSynced\",\"inputs\":[{\"type\":\"uint64\",\"name\":\"chainId\",\"indexed\":true},{\"type\":\"uint64\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"kind\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"data\",\"indexed\":false},{\"type\":\"bytes32\",\"name\":\"signal\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"ConflictingProofs\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"address\",\"name\":\"guardian\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"currentProofHash\",\"indexed\":false},{\"type\":\"bytes32\",\"name\":\"newProofHash\",\"indexed\":false},{\"type\":\"bool\",\"name\":\"provingPaused\",\"indexed\":false}]},{\"type\":\"function\",\"name\":\"DOMAIN_SEPARATOR\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"DelegateChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"delegator\",\"indexed\":true},{\"type\":\"address\",\"name\":\"fromDelegate\",\"indexed\":true},{\"type\":\"address\",\"name\":\"toDelegate\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"DelegateVotesChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"delegate\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"previousBalance\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"newBalance\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"EIP712DomainChanged\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ETH_TRANSFER_FAILED\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"EtherPaymentFailed\",\"inputs\":[{\"type\":\"address\",\"name\":\"to\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"maxGas\",\"indexed\":false}]},{\"type\":\"error\",\"name\":\"FUNC_NOT_IMPLEMENTED\",\"inputs\":[]},{\"type\":\"function\",\"name\":\"GAS_OVERHEAD\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint32\"}]},{\"type\":\"function\",\"name\":\"GAS_RESERVE\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"GP_INVALID_GUARDIAN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GP_INVALID_GUARDIAN_SET\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GP_INVALID_MIN_GUARDIANS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GP_INVALID_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GV_PERMISSION_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GV_ZERO_ADDRESS\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"GuardianApproval\",\"inputs\":[{\"type\":\"address\",\"name\":\"addr\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"blockHash\",\"indexed\":true},{\"type\":\"bool\",\"name\":\"approved\",\"indexed\":false},{\"type\":\"bytes\",\"name\":\"proofData\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"GuardiansUpdated\",\"inputs\":[{\"type\":\"uint32\",\"name\":\"version\",\"indexed\":false},{\"type\":\"address[]\",\"name\":\"guardians\",\"indexed\":false}]},{\"type\":\"error\",\"name\":\"HOOK_ASSIGNMENT_EXPIRED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"HOOK_ASSIGNMENT_INVALID_SIG\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"HOOK_TIER_NOT_FOUND\",\"inputs\":[]},{\"type\":\"function\",\"name\":\"INSTANCE_EXPIRY\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"INSTANCE_VALIDITY_DELAY\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Initialized\",\"inputs\":[{\"type\":\"uint8\",\"name\":\"version\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"InstanceAdded\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"id\",\"indexed\":true},{\"type\":\"address\",\"name\":\"instance\",\"indexed\":true},{\"type\":\"address\",\"name\":\"replaced\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"validSince\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"InstanceDeleted\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"id\",\"indexed\":true},{\"type\":\"address\",\"name\":\"instance\",\"indexed\":true}]},{\"type\":\"error\",\"name\":\"L1_ALREADY_CONTESTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_ALREADY_PROVED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOB_NOT_AVAILABLE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOB_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOCK_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_CANNOT_CONTEST\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_BLOCK_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_GENESIS_HASH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_SIG\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_TIER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_TRANSITION\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_NOT_ASSIGNED_PROVER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_PROVING_PAUSED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_RECEIVE_DISABLED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TOO_MANY_BLOCKS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TRANSITION_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNEXPECTED_PARENT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNEXPECTED_TRANSITION_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"LTP_INVALID_ACCOUNT_PROOF\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"LTP_INVALID_INCLUSION_PROOF\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"LocalReportCheckToggled\",\"inputs\":[{\"type\":\"bool\",\"name\":\"checkLocalEnclaveReport\",\"indexed\":false}]},{\"type\":\"function\",\"name\":\"MAX_GAS_PAYING_PROVER\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"MIN_MIGRATION_DELAY\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MessageProcessed\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"tuple\",\"name\":\"message\",\"indexed\":false,\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"tuple\",\"name\":\"stats\",\"indexed\":false,\"components\":[{\"type\":\"uint32\",\"name\":\"gasUsedInFeeCalc\"},{\"type\":\"uint32\",\"name\":\"proofSize\"},{\"type\":\"uint32\",\"name\":\"numCacheOps\"},{\"type\":\"bool\",\"name\":\"processedByRelayer\"}]}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MessageSent\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"tuple\",\"name\":\"message\",\"indexed\":false,\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MessageStatusChanged\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"uint8\",\"name\":\"status\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MigratedTo\",\"inputs\":[{\"type\":\"address\",\"name\":\"fromToken\",\"indexed\":true},{\"type\":\"address\",\"name\":\"account\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"amount\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MigrationStatusChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"addr\",\"indexed\":false},{\"type\":\"bool\",\"name\":\"inbound\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MrEnclaveUpdated\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"mrEnclave\",\"indexed\":true},{\"type\":\"bool\",\"name\":\"trusted\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MrSignerUpdated\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"mrSigner\",\"indexed\":true},{\"type\":\"bool\",\"name\":\"trusted\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferred\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Paused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"ProvingAutoPauseEnabled\",\"inputs\":[{\"type\":\"bool\",\"name\":\"enabled\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"ProvingPaused\",\"inputs\":[{\"type\":\"bool\",\"name\":\"paused\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"QeIdentityConfigured\",\"inputs\":[{\"type\":\"tuple\",\"name\":\"qeIdentityInput\",\"indexed\":false,\"components\":[{\"type\":\"bytes4\",\"name\":\"miscselect\"},{\"type\":\"bytes4\",\"name\":\"miscselectMask\"},{\"type\":\"uint16\",\"name\":\"isvprodid\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes16\",\"name\":\"attributesMask\"},{\"type\":\"bytes32\",\"name\":\"mrsigner\"},{\"type\":\"tuple[]\",\"name\":\"tcbLevels\",\"components\":[{\"type\":\"tuple\",\"name\":\"tcb\",\"components\":[{\"type\":\"uint16\",\"name\":\"isvsvn\"}]},{\"type\":\"uint8\",\"name\":\"tcbStatus\"}]}]}]},{\"type\":\"error\",\"name\":\"REENTRANT_CALL\",\"inputs\":[]},{\"type\":\"function\",\"name\":\"RELAYER_MAX_PROOF_BYTES\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"RESOLVER_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_INVALID_MANAGER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_UNEXPECTED_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_ZERO_ADDR\",\"inputs\":[{\"type\":\"uint64\",\"name\":\"chainId\"},{\"type\":\"bytes32\",\"name\":\"name\"}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"RevokedCertSerialNumAdded\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"index\",\"indexed\":true},{\"type\":\"bytes\",\"name\":\"serialNum\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"RevokedCertSerialNumRemoved\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"index\",\"indexed\":true},{\"type\":\"bytes\",\"name\":\"serialNum\",\"indexed\":false}]},{\"type\":\"error\",\"name\":\"SGX_ALREADY_ATTESTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SGX_INVALID_ATTESTATION\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SGX_INVALID_INSTANCE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SGX_INVALID_PROOF\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SGX_RA_NOT_SUPPORTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_EMPTY_PROOF\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_INVALID_HOPS_WITH_LOOP\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_INVALID_LAST_HOP_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_INVALID_MID_HOP_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_INVALID_STATE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_SIGNAL_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_UNAUTHORIZED\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"SignalSent\",\"inputs\":[{\"type\":\"address\",\"name\":\"app\",\"indexed\":false},{\"type\":\"bytes32\",\"name\":\"signal\",\"indexed\":false},{\"type\":\"bytes32\",\"name\":\"slot\",\"indexed\":false},{\"type\":\"bytes32\",\"name\":\"value\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"StateVariablesUpdated\",\"inputs\":[{\"type\":\"tuple\",\"name\":\"slotB\",\"indexed\":false,\"components\":[{\"type\":\"uint64\",\"name\":\"numBlocks\"},{\"type\":\"uint64\",\"name\":\"lastVerifiedBlockId\"},{\"type\":\"bool\",\"name\":\"provingPaused\"},{\"type\":\"uint8\",\"name\":\"__reservedB1\"},{\"type\":\"uint16\",\"name\":\"__reservedB2\"},{\"type\":\"uint32\",\"name\":\"__reservedB3\"},{\"type\":\"uint64\",\"name\":\"lastUnpausedAt\"}]}]},{\"type\":\"error\",\"name\":\"TIER_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"TT_INVALID_PARAM\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TcbInfoJsonConfigured\",\"inputs\":[{\"type\":\"string\",\"name\":\"fmspc\",\"indexed\":true},{\"type\":\"tuple\",\"name\":\"tcbInfoInput\",\"indexed\":false,\"components\":[{\"type\":\"string\",\"name\":\"pceid\"},{\"type\":\"string\",\"name\":\"fmspc\"},{\"type\":\"tuple[]\",\"name\":\"tcbLevels\",\"components\":[{\"type\":\"uint256\",\"name\":\"pcesvn\"},{\"type\":\"uint8[]\",\"name\":\"sgxTcbCompSvnArr\"},{\"type\":\"uint8\",\"name\":\"status\"}]}]}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TokenReceived\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint64\",\"name\":\"srcChainId\",\"indexed\":false},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":false},{\"type\":\"address\",\"name\":\"token\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"tokenIds\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"amounts\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TokenReceived\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint64\",\"name\":\"srcChainId\",\"indexed\":false},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":false},{\"type\":\"address\",\"name\":\"token\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"amount\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TokenReleased\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":false},{\"type\":\"address\",\"name\":\"token\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"tokenIds\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"amounts\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TokenReleased\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":false},{\"type\":\"address\",\"name\":\"token\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"amount\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TokenSent\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint64\",\"name\":\"destChainId\",\"indexed\":false},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":false},{\"type\":\"address\",\"name\":\"token\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"tokenIds\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"amounts\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TokenSent\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint64\",\"name\":\"canonicalChainId\",\"indexed\":false},{\"type\":\"uint64\",\"name\":\"destChainId\",\"indexed\":false},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":false},{\"type\":\"address\",\"name\":\"token\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"amount\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Transfer\",\"inputs\":[{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"value\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Transfer\",\"inputs\":[{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"tokenId\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TransferBatch\",\"inputs\":[{\"type\":\"address\",\"name\":\"operator\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint256[]\",\"name\":\"ids\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"values\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TransferSingle\",\"inputs\":[{\"type\":\"address\",\"name\":\"operator\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"id\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"value\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TransitionContested\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"tuple\",\"name\":\"tran\",\"indexed\":false,\"components\":[{\"type\":\"bytes32\",\"name\":\"parentHash\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"bytes32\",\"name\":\"graffiti\"}]},{\"type\":\"address\",\"name\":\"contester\",\"indexed\":false},{\"type\":\"uint96\",\"name\":\"contestBond\",\"indexed\":false},{\"type\":\"uint16\",\"name\":\"tier\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TransitionProved\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"tuple\",\"name\":\"tran\",\"indexed\":false,\"components\":[{\"type\":\"bytes32\",\"name\":\"parentHash\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"bytes32\",\"name\":\"graffiti\"}]},{\"type\":\"address\",\"name\":\"prover\",\"indexed\":false},{\"type\":\"uint96\",\"name\":\"validityBond\",\"indexed\":false},{\"type\":\"uint16\",\"name\":\"tier\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"URI\",\"inputs\":[{\"type\":\"string\",\"name\":\"value\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"id\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Unpaused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Upgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"implementation\",\"indexed\":true}]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_CERTIFICATION_CHAIN_DATA\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_CERTIFICATION_CHAIN_SIZE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_ECDSA_SIGNATURE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_QEAUTHDATA_SIZE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_QEREPORT_LENGTN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_QUOTE_LENGTN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_QUOTE_MEMBER_LENGTN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_UNSUPPORT_CERTIFICATION_TYPE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_BTOKEN_BLACKLISTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_CTOKEN_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INSUFFICIENT_FEE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INTERFACE_NOT_SUPPORTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_AMOUNT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_CTOKEN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_NEW_BTOKEN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_TOKEN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_TO_ADDR\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_LAST_MIGRATION_TOO_CLOSE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_PERMISSION_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_TOKEN_ARRAY_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_ADDRESS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_ADDR_MANAGER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_VALUE\",\"inputs\":[]},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"addInstances\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address[]\",\"name\":\"_instances\"}],\"outputs\":[{\"type\":\"uint256[]\"}]},{\"type\":\"function\",\"name\":\"addRevokedCertSerialNum\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"index\"},{\"type\":\"bytes[]\",\"name\":\"serialNumBatch\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"addressManager\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"addressRegistered\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"instanceAddress\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"alreadyAttested\"}]},{\"type\":\"function\",\"name\":\"allowance\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"owner\"},{\"type\":\"address\",\"name\":\"spender\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"approvals\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"version\"},{\"type\":\"bytes32\",\"name\":\"proofHash\"}],\"outputs\":[{\"type\":\"uint256\",\"name\":\"approvalBits\"}]},{\"type\":\"function\",\"name\":\"approve\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"spender\"},{\"type\":\"uint256\",\"name\":\"amount\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"approve\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_meta\",\"components\":[{\"type\":\"bytes32\",\"name\":\"l1Hash\"},{\"type\":\"bytes32\",\"name\":\"difficulty\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"bytes32\",\"name\":\"extraData\"},{\"type\":\"bytes32\",\"name\":\"depositsHash\"},{\"type\":\"address\",\"name\":\"coinbase\"},{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"uint64\",\"name\":\"timestamp\"},{\"type\":\"uint64\",\"name\":\"l1Height\"},{\"type\":\"uint16\",\"name\":\"minTier\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"bytes32\",\"name\":\"parentMetaHash\"},{\"type\":\"address\",\"name\":\"sender\"}]},{\"type\":\"tuple\",\"name\":\"_tran\",\"components\":[{\"type\":\"bytes32\",\"name\":\"parentHash\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"bytes32\",\"name\":\"graffiti\"}]},{\"type\":\"tuple\",\"name\":\"_proof\",\"components\":[{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[{\"type\":\"bool\",\"name\":\"approved_\"}]},{\"type\":\"function\",\"name\":\"approve\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"tokenId\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"authorize\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_addr\"},{\"type\":\"bool\",\"name\":\"_authorize\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"balanceOf\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"balanceOf\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"},{\"type\":\"uint256\",\"name\":\"id\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"balanceOfBatch\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address[]\",\"name\":\"accounts\"},{\"type\":\"uint256[]\",\"name\":\"ids\"}],\"outputs\":[{\"type\":\"uint256[]\"}]},{\"type\":\"function\",\"name\":\"batchTransfer\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address[]\",\"name\":\"recipients\"},{\"type\":\"uint256[]\",\"name\":\"amounts\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"bondBalanceOf\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_user\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"bridgedToCanonical\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"btoken\"}],\"outputs\":[{\"type\":\"uint64\",\"name\":\"chainId\"},{\"type\":\"address\",\"name\":\"addr\"},{\"type\":\"string\",\"name\":\"symbol\"},{\"type\":\"string\",\"name\":\"name\"}]},{\"type\":\"function\",\"name\":\"bridgedToCanonical\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"btoken\"}],\"outputs\":[{\"type\":\"uint64\",\"name\":\"chainId\"},{\"type\":\"address\",\"name\":\"addr\"},{\"type\":\"uint8\",\"name\":\"decimals\"},{\"type\":\"string\",\"name\":\"symbol\"},{\"type\":\"string\",\"name\":\"name\"}]},{\"type\":\"function\",\"name\":\"btokenDenylist\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"btoken\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"denied\"}]},{\"type\":\"function\",\"name\":\"burn\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_account\"},{\"type\":\"uint256\",\"name\":\"_tokenId\"},{\"type\":\"uint256\",\"name\":\"_amount\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"burn\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_account\"},{\"type\":\"uint256\",\"name\":\"_tokenId\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"burn\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"_amount\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"canonical\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"},{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"canonicalToBridged\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"chainId\"},{\"type\":\"address\",\"name\":\"ctoken\"}],\"outputs\":[{\"type\":\"address\",\"name\":\"btoken\"}]},{\"type\":\"function\",\"name\":\"changeBridgedToken\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_ctoken\",\"components\":[{\"type\":\"uint64\",\"name\":\"chainId\"},{\"type\":\"address\",\"name\":\"addr\"},{\"type\":\"uint8\",\"name\":\"decimals\"},{\"type\":\"string\",\"name\":\"symbol\"},{\"type\":\"string\",\"name\":\"name\"}]},{\"type\":\"address\",\"name\":\"_btokenNew\"}],\"outputs\":[{\"type\":\"address\",\"name\":\"btokenOld_\"}]},{\"type\":\"function\",\"name\":\"changeMigrationStatus\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_migratingAddress\"},{\"type\":\"bool\",\"name\":\"_migratingInbound\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"checkLocalEnclaveReport\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"checkpoints\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"},{\"type\":\"uint32\",\"name\":\"pos\"}],\"outputs\":[{\"type\":\"tuple\",\"components\":[{\"type\":\"uint32\",\"name\":\"fromBlock\"},{\"type\":\"uint224\",\"name\":\"votes\"}]}]},{\"type\":\"function\",\"name\":\"clock\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint48\"}]},{\"type\":\"function\",\"name\":\"configureQeIdentityJson\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"qeIdentityInput\",\"components\":[{\"type\":\"bytes4\",\"name\":\"miscselect\"},{\"type\":\"bytes4\",\"name\":\"miscselectMask\"},{\"type\":\"uint16\",\"name\":\"isvprodid\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes16\",\"name\":\"attributesMask\"},{\"type\":\"bytes32\",\"name\":\"mrsigner\"},{\"type\":\"tuple[]\",\"name\":\"tcbLevels\",\"components\":[{\"type\":\"tuple\",\"name\":\"tcb\",\"components\":[{\"type\":\"uint16\",\"name\":\"isvsvn\"}]},{\"type\":\"uint8\",\"name\":\"tcbStatus\"}]}]}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"configureTcbInfoJson\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"string\",\"name\":\"fmspc\"},{\"type\":\"tuple\",\"name\":\"tcbInfoInput\",\"components\":[{\"type\":\"string\",\"name\":\"pceid\"},{\"type\":\"string\",\"name\":\"fmspc\"},{\"type\":\"tuple[]\",\"name\":\"tcbLevels\",\"components\":[{\"type\":\"uint256\",\"name\":\"pcesvn\"},{\"type\":\"uint8[]\",\"name\":\"sgxTcbCompSvnArr\"},{\"type\":\"uint8\",\"name\":\"status\"}]}]}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"context\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"tuple\",\"name\":\"ctx_\",\"components\":[{\"type\":\"bytes32\",\"name\":\"msgHash\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"}]}]},{\"type\":\"function\",\"name\":\"decimals\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint8\"}]},{\"type\":\"function\",\"name\":\"decodeCert\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"bytes\",\"name\":\"der\"},{\"type\":\"bool\",\"name\":\"isPckCert\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"success\"},{\"type\":\"tuple\",\"name\":\"cert\",\"components\":[{\"type\":\"uint256\",\"name\":\"notBefore\"},{\"type\":\"uint256\",\"name\":\"notAfter\"},{\"type\":\"bytes\",\"name\":\"serialNumber\"},{\"type\":\"bytes\",\"name\":\"tbsCertificate\"},{\"type\":\"bytes\",\"name\":\"pubKey\"},{\"type\":\"bytes\",\"name\":\"signature\"},{\"type\":\"bool\",\"name\":\"isPck\"},{\"type\":\"tuple\",\"name\":\"pck\",\"components\":[{\"type\":\"string\",\"name\":\"commonName\"},{\"type\":\"string\",\"name\":\"issuerName\"},{\"type\":\"tuple\",\"name\":\"sgxExtension\",\"components\":[{\"type\":\"string\",\"name\":\"pceid\"},{\"type\":\"string\",\"name\":\"fmspc\"},{\"type\":\"uint256\",\"name\":\"pcesvn\"},{\"type\":\"uint256[]\",\"name\":\"sgxTcbCompSvnArr\"}]}]}]}]},{\"type\":\"function\",\"name\":\"decreaseAllowance\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"spender\"},{\"type\":\"uint256\",\"name\":\"subtractedValue\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"delegate\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"delegatee\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"delegateBySig\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"delegatee\"},{\"type\":\"uint256\",\"name\":\"nonce\"},{\"type\":\"uint256\",\"name\":\"expiry\"},{\"type\":\"uint8\",\"name\":\"v\"},{\"type\":\"bytes32\",\"name\":\"r\"},{\"type\":\"bytes32\",\"name\":\"s\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"delegates\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"deleteInstances\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256[]\",\"name\":\"_ids\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"depositBond\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"_amount\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"eip712Domain\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes1\",\"name\":\"fields\"},{\"type\":\"string\",\"name\":\"name\"},{\"type\":\"string\",\"name\":\"version\"},{\"type\":\"uint256\",\"name\":\"chainId\"},{\"type\":\"address\",\"name\":\"verifyingContract\"},{\"type\":\"bytes32\",\"name\":\"salt\"},{\"type\":\"uint256[]\",\"name\":\"extensions\"}]},{\"type\":\"function\",\"name\":\"enableProvingAutoPause\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"bool\",\"name\":\"_enable\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"enableTaikoTokenAllowance\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"bool\",\"name\":\"_enable\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"failMessage\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"getAddress\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"getApproved\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"tokenId\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"getBlock\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_blockId\"}],\"outputs\":[{\"type\":\"tuple\",\"name\":\"blk_\",\"components\":[{\"type\":\"bytes32\",\"name\":\"metaHash\"},{\"type\":\"address\",\"name\":\"assignedProver\"},{\"type\":\"uint96\",\"name\":\"livenessBond\"},{\"type\":\"uint64\",\"name\":\"blockId\"},{\"type\":\"uint64\",\"name\":\"proposedAt\"},{\"type\":\"uint64\",\"name\":\"proposedIn\"},{\"type\":\"uint32\",\"name\":\"nextTransitionId\"},{\"type\":\"uint32\",\"name\":\"verifiedTransitionId\"}]}]},{\"type\":\"function\",\"name\":\"getConfig\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"tuple\",\"components\":[{\"type\":\"uint64\",\"name\":\"chainId\"},{\"type\":\"uint64\",\"name\":\"blockMaxProposals\"},{\"type\":\"uint64\",\"name\":\"blockRingBufferSize\"},{\"type\":\"uint64\",\"name\":\"maxBlocksToVerify\"},{\"type\":\"uint32\",\"name\":\"blockMaxGasLimit\"},{\"type\":\"uint96\",\"name\":\"livenessBond\"},{\"type\":\"uint8\",\"name\":\"stateRootSyncInternal\"},{\"type\":\"bool\",\"name\":\"checkEOAForCalldataDA\"}]}]},{\"type\":\"function\",\"name\":\"getLastSyncedBlock\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\",\"name\":\"blockId_\"},{\"type\":\"bytes32\",\"name\":\"blockHash_\"},{\"type\":\"bytes32\",\"name\":\"stateRoot_\"}]},{\"type\":\"function\",\"name\":\"getLastVerifiedBlock\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\",\"name\":\"blockId_\"},{\"type\":\"bytes32\",\"name\":\"blockHash_\"},{\"type\":\"bytes32\",\"name\":\"stateRoot_\"}]},{\"type\":\"function\",\"name\":\"getMessageMinGasLimit\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"dataLength\"}],\"outputs\":[{\"type\":\"uint32\"}]},{\"type\":\"function\",\"name\":\"getMinTier\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\"}],\"outputs\":[{\"type\":\"uint16\"}]},{\"type\":\"function\",\"name\":\"getPastTotalSupply\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"timepoint\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"getPastVotes\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"},{\"type\":\"uint256\",\"name\":\"timepoint\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"getSignalSlot\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"address\",\"name\":\"_app\"},{\"type\":\"bytes32\",\"name\":\"_signal\"}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"getStateVariables\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"tuple\",\"components\":[{\"type\":\"uint64\",\"name\":\"genesisHeight\"},{\"type\":\"uint64\",\"name\":\"genesisTimestamp\"},{\"type\":\"uint64\",\"name\":\"lastSyncedBlockId\"},{\"type\":\"uint64\",\"name\":\"lastSynecdAt\"}]},{\"type\":\"tuple\",\"components\":[{\"type\":\"uint64\",\"name\":\"numBlocks\"},{\"type\":\"uint64\",\"name\":\"lastVerifiedBlockId\"},{\"type\":\"bool\",\"name\":\"provingPaused\"},{\"type\":\"uint8\",\"name\":\"__reservedB1\"},{\"type\":\"uint16\",\"name\":\"__reservedB2\"},{\"type\":\"uint32\",\"name\":\"__reservedB3\"},{\"type\":\"uint64\",\"name\":\"lastUnpausedAt\"}]}]},{\"type\":\"function\",\"name\":\"getSyncedChainData\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_kind\"},{\"type\":\"uint64\",\"name\":\"_blockId\"}],\"outputs\":[{\"type\":\"uint64\",\"name\":\"blockId_\"},{\"type\":\"bytes32\",\"name\":\"chainData_\"}]},{\"type\":\"function\",\"name\":\"getTier\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"uint16\",\"name\":\"_tierId\"}],\"outputs\":[{\"type\":\"tuple\",\"components\":[{\"type\":\"bytes32\",\"name\":\"verifierName\"},{\"type\":\"uint96\",\"name\":\"validityBond\"},{\"type\":\"uint96\",\"name\":\"contestBond\"},{\"type\":\"uint24\",\"name\":\"cooldownWindow\"},{\"type\":\"uint16\",\"name\":\"provingWindow\"},{\"type\":\"uint8\",\"name\":\"maxBlocksToVerifyPerProof\"}]}]},{\"type\":\"function\",\"name\":\"getTierIds\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint16[]\",\"name\":\"tiers_\"}]},{\"type\":\"function\",\"name\":\"getTransition\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_blockId\"},{\"type\":\"uint32\",\"name\":\"_tid\"}],\"outputs\":[{\"type\":\"tuple\",\"components\":[{\"type\":\"bytes32\",\"name\":\"key\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"address\",\"name\":\"prover\"},{\"type\":\"uint96\",\"name\":\"validityBond\"},{\"type\":\"address\",\"name\":\"contester\"},{\"type\":\"uint96\",\"name\":\"contestBond\"},{\"type\":\"uint64\",\"name\":\"timestamp\"},{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"uint8\",\"name\":\"__reserved1\"}]}]},{\"type\":\"function\",\"name\":\"getTransition\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_blockId\"},{\"type\":\"bytes32\",\"name\":\"_parentHash\"}],\"outputs\":[{\"type\":\"tuple\",\"components\":[{\"type\":\"bytes32\",\"name\":\"key\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"address\",\"name\":\"prover\"},{\"type\":\"uint96\",\"name\":\"validityBond\"},{\"type\":\"address\",\"name\":\"contester\"},{\"type\":\"uint96\",\"name\":\"contestBond\"},{\"type\":\"uint64\",\"name\":\"timestamp\"},{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"uint8\",\"name\":\"__reserved1\"}]}]},{\"type\":\"function\",\"name\":\"getVerifiedBlockProver\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_blockId\"}],\"outputs\":[{\"type\":\"address\",\"name\":\"prover_\"}]},{\"type\":\"function\",\"name\":\"getVotes\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"guardianIds\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"guardian\"}],\"outputs\":[{\"type\":\"uint256\",\"name\":\"id\"}]},{\"type\":\"function\",\"name\":\"guardians\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"hashAssignment\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_assignment\",\"components\":[{\"type\":\"address\",\"name\":\"feeToken\"},{\"type\":\"uint64\",\"name\":\"expiry\"},{\"type\":\"uint64\",\"name\":\"maxBlockId\"},{\"type\":\"uint64\",\"name\":\"maxProposedIn\"},{\"type\":\"bytes32\",\"name\":\"metaHash\"},{\"type\":\"bytes32\",\"name\":\"parentMetaHash\"},{\"type\":\"tuple[]\",\"name\":\"tierFees\",\"components\":[{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"uint128\",\"name\":\"fee\"}]},{\"type\":\"bytes\",\"name\":\"signature\"}]},{\"type\":\"address\",\"name\":\"_taikoL1Address\"},{\"type\":\"address\",\"name\":\"_blockProposer\"},{\"type\":\"address\",\"name\":\"_assignedProver\"},{\"type\":\"bytes32\",\"name\":\"_blobHash\"}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"hashMessage\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"impl\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"inNonReentrant\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"increaseAllowance\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"spender\"},{\"type\":\"uint256\",\"name\":\"addedValue\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"},{\"type\":\"address\",\"name\":\"_addressManager\"},{\"type\":\"bytes32\",\"name\":\"_genesisBlockHash\"},{\"type\":\"bool\",\"name\":\"_toPause\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"},{\"type\":\"address\",\"name\":\"_addressManager\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"},{\"type\":\"address\",\"name\":\"_addressManager\"},{\"type\":\"address\",\"name\":\"_srcToken\"},{\"type\":\"uint256\",\"name\":\"_srcChainId\"},{\"type\":\"string\",\"name\":\"_symbol\"},{\"type\":\"string\",\"name\":\"_name\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"owner\"},{\"type\":\"address\",\"name\":\"sigVerifyLibAddr\"},{\"type\":\"address\",\"name\":\"pemCertLibAddr\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"},{\"type\":\"address\",\"name\":\"_addressManager\"},{\"type\":\"address\",\"name\":\"_srcToken\"},{\"type\":\"uint256\",\"name\":\"_srcChainId\"},{\"type\":\"uint8\",\"name\":\"_decimals\"},{\"type\":\"string\",\"name\":\"_symbol\"},{\"type\":\"string\",\"name\":\"_name\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init2\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"instances\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"instanceId\"}],\"outputs\":[{\"type\":\"address\",\"name\":\"addr\"},{\"type\":\"uint64\",\"name\":\"validSince\"}]},{\"type\":\"function\",\"name\":\"isApprovedForAll\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"},{\"type\":\"address\",\"name\":\"operator\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"isAuthorized\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"addr\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"authorized\"}]},{\"type\":\"function\",\"name\":\"isChainDataSynced\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_kind\"},{\"type\":\"uint64\",\"name\":\"_blockId\"},{\"type\":\"bytes32\",\"name\":\"_chainData\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"isDestChainEnabled\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"enabled_\"},{\"type\":\"address\",\"name\":\"destBridge_\"}]},{\"type\":\"function\",\"name\":\"isMessageFailed\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"bytes\",\"name\":\"_proof\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"isMessageReceived\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"bytes\",\"name\":\"_proof\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"isMessageSent\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"isSignalSent\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_app\"},{\"type\":\"bytes32\",\"name\":\"_signal\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"lastMigrationStart\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"chainId\"},{\"type\":\"address\",\"name\":\"ctoken\"}],\"outputs\":[{\"type\":\"uint256\",\"name\":\"timestamp\"}]},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"latestProofHash\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"version\"},{\"type\":\"uint256\",\"name\":\"blockId\"}],\"outputs\":[{\"type\":\"bytes32\",\"name\":\"hash\"}]},{\"type\":\"function\",\"name\":\"messageStatus\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\"}],\"outputs\":[{\"type\":\"uint8\",\"name\":\"status\"}]},{\"type\":\"function\",\"name\":\"migratingAddress\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"migratingInbound\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"minGuardians\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint32\"}]},{\"type\":\"function\",\"name\":\"mint\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_to\"},{\"type\":\"uint256\",\"name\":\"_tokenId\"},{\"type\":\"uint256\",\"name\":\"_amount\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"mint\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_account\"},{\"type\":\"uint256\",\"name\":\"_tokenId\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"mintBatch\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_to\"},{\"type\":\"uint256[]\",\"name\":\"_tokenIds\"},{\"type\":\"uint256[]\",\"name\":\"_amounts\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"name\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"name\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"string\"}]},{\"type\":\"function\",\"name\":\"nextInstanceId\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"nextMessageId\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"nonces\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"owner\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"numCheckpoints\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"}],\"outputs\":[{\"type\":\"uint32\"}]},{\"type\":\"function\",\"name\":\"numGuardians\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"onBlockProposed\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_blk\",\"components\":[{\"type\":\"bytes32\",\"name\":\"metaHash\"},{\"type\":\"address\",\"name\":\"assignedProver\"},{\"type\":\"uint96\",\"name\":\"livenessBond\"},{\"type\":\"uint64\",\"name\":\"blockId\"},{\"type\":\"uint64\",\"name\":\"proposedAt\"},{\"type\":\"uint64\",\"name\":\"proposedIn\"},{\"type\":\"uint32\",\"name\":\"nextTransitionId\"},{\"type\":\"uint32\",\"name\":\"verifiedTransitionId\"}]},{\"type\":\"tuple\",\"name\":\"_meta\",\"components\":[{\"type\":\"bytes32\",\"name\":\"l1Hash\"},{\"type\":\"bytes32\",\"name\":\"difficulty\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"bytes32\",\"name\":\"extraData\"},{\"type\":\"bytes32\",\"name\":\"depositsHash\"},{\"type\":\"address\",\"name\":\"coinbase\"},{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"uint64\",\"name\":\"timestamp\"},{\"type\":\"uint64\",\"name\":\"l1Height\"},{\"type\":\"uint16\",\"name\":\"minTier\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"bytes32\",\"name\":\"parentMetaHash\"},{\"type\":\"address\",\"name\":\"sender\"}]},{\"type\":\"bytes\",\"name\":\"_data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"onERC1155BatchReceived\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"address\"},{\"type\":\"address\"},{\"type\":\"uint256[]\"},{\"type\":\"uint256[]\"},{\"type\":\"bytes\"}],\"outputs\":[{\"type\":\"bytes4\"}]},{\"type\":\"function\",\"name\":\"onERC1155Received\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"address\"},{\"type\":\"address\"},{\"type\":\"uint256\"},{\"type\":\"uint256\"},{\"type\":\"bytes\"}],\"outputs\":[{\"type\":\"bytes4\"}]},{\"type\":\"function\",\"name\":\"onERC721Received\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"address\"},{\"type\":\"address\"},{\"type\":\"uint256\"},{\"type\":\"bytes\"}],\"outputs\":[{\"type\":\"bytes4\"}]},{\"type\":\"function\",\"name\":\"onMessageInvocation\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"bytes\",\"name\":\"_data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"onMessageRecalled\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"bytes32\",\"name\":\"_msgHash\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"owner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"ownerOf\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"tokenId\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"pause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"pauseProving\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"bool\",\"name\":\"_pause\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"pauseTaikoProving\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"paused\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"pemCertLib\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"pendingOwner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"permit\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"owner\"},{\"type\":\"address\",\"name\":\"spender\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"uint256\",\"name\":\"deadline\"},{\"type\":\"uint8\",\"name\":\"v\"},{\"type\":\"bytes32\",\"name\":\"r\"},{\"type\":\"bytes32\",\"name\":\"s\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"processMessage\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"bytes\",\"name\":\"_proof\"}],\"outputs\":[{\"type\":\"uint8\",\"name\":\"status_\"},{\"type\":\"uint8\",\"name\":\"reason_\"}]},{\"type\":\"function\",\"name\":\"proposeBlock\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"bytes\",\"name\":\"_params\"},{\"type\":\"bytes\",\"name\":\"_txList\"}],\"outputs\":[{\"type\":\"tuple\",\"name\":\"meta_\",\"components\":[{\"type\":\"bytes32\",\"name\":\"l1Hash\"},{\"type\":\"bytes32\",\"name\":\"difficulty\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"bytes32\",\"name\":\"extraData\"},{\"type\":\"bytes32\",\"name\":\"depositsHash\"},{\"type\":\"address\",\"name\":\"coinbase\"},{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"uint64\",\"name\":\"timestamp\"},{\"type\":\"uint64\",\"name\":\"l1Height\"},{\"type\":\"uint16\",\"name\":\"minTier\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"bytes32\",\"name\":\"parentMetaHash\"},{\"type\":\"address\",\"name\":\"sender\"}]},{\"type\":\"tuple[]\",\"name\":\"deposits_\",\"components\":[{\"type\":\"address\",\"name\":\"recipient\"},{\"type\":\"uint96\",\"name\":\"amount\"},{\"type\":\"uint64\",\"name\":\"id\"}]}]},{\"type\":\"function\",\"name\":\"proveBlock\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_blockId\"},{\"type\":\"bytes\",\"name\":\"_input\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"proveSignalReceived\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"address\",\"name\":\"_app\"},{\"type\":\"bytes32\",\"name\":\"_signal\"},{\"type\":\"bytes\",\"name\":\"_proof\"}],\"outputs\":[{\"type\":\"uint256\",\"name\":\"numCacheOps_\"}]},{\"type\":\"function\",\"name\":\"provingAutoPauseEnabled\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"qeIdentity\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes4\",\"name\":\"miscselect\"},{\"type\":\"bytes4\",\"name\":\"miscselectMask\"},{\"type\":\"uint16\",\"name\":\"isvprodid\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes16\",\"name\":\"attributesMask\"},{\"type\":\"bytes32\",\"name\":\"mrsigner\"}]},{\"type\":\"function\",\"name\":\"recallMessage\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"bytes\",\"name\":\"_proof\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"registerInstance\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_attestation\",\"components\":[{\"type\":\"tuple\",\"name\":\"header\",\"components\":[{\"type\":\"bytes2\",\"name\":\"version\"},{\"type\":\"bytes2\",\"name\":\"attestationKeyType\"},{\"type\":\"bytes4\",\"name\":\"teeType\"},{\"type\":\"bytes2\",\"name\":\"qeSvn\"},{\"type\":\"bytes2\",\"name\":\"pceSvn\"},{\"type\":\"bytes16\",\"name\":\"qeVendorId\"},{\"type\":\"bytes20\",\"name\":\"userData\"}]},{\"type\":\"tuple\",\"name\":\"localEnclaveReport\",\"components\":[{\"type\":\"bytes16\",\"name\":\"cpuSvn\"},{\"type\":\"bytes4\",\"name\":\"miscSelect\"},{\"type\":\"bytes28\",\"name\":\"reserved1\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes32\",\"name\":\"mrEnclave\"},{\"type\":\"bytes32\",\"name\":\"reserved2\"},{\"type\":\"bytes32\",\"name\":\"mrSigner\"},{\"type\":\"bytes\",\"name\":\"reserved3\"},{\"type\":\"uint16\",\"name\":\"isvProdId\"},{\"type\":\"uint16\",\"name\":\"isvSvn\"},{\"type\":\"bytes\",\"name\":\"reserved4\"},{\"type\":\"bytes\",\"name\":\"reportData\"}]},{\"type\":\"tuple\",\"name\":\"v3AuthData\",\"components\":[{\"type\":\"bytes\",\"name\":\"ecdsa256BitSignature\"},{\"type\":\"bytes\",\"name\":\"ecdsaAttestationKey\"},{\"type\":\"tuple\",\"name\":\"pckSignedQeReport\",\"components\":[{\"type\":\"bytes16\",\"name\":\"cpuSvn\"},{\"type\":\"bytes4\",\"name\":\"miscSelect\"},{\"type\":\"bytes28\",\"name\":\"reserved1\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes32\",\"name\":\"mrEnclave\"},{\"type\":\"bytes32\",\"name\":\"reserved2\"},{\"type\":\"bytes32\",\"name\":\"mrSigner\"},{\"type\":\"bytes\",\"name\":\"reserved3\"},{\"type\":\"uint16\",\"name\":\"isvProdId\"},{\"type\":\"uint16\",\"name\":\"isvSvn\"},{\"type\":\"bytes\",\"name\":\"reserved4\"},{\"type\":\"bytes\",\"name\":\"reportData\"}]},{\"type\":\"bytes\",\"name\":\"qeReportSignature\"},{\"type\":\"tuple\",\"name\":\"qeAuthData\",\"components\":[{\"type\":\"uint16\",\"name\":\"parsedDataSize\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"tuple\",\"name\":\"certification\",\"components\":[{\"type\":\"uint16\",\"name\":\"certType\"},{\"type\":\"uint32\",\"name\":\"certDataSize\"},{\"type\":\"bytes[3]\",\"name\":\"decodedCertDataArray\"}]}]}]}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"removeRevokedCertSerialNum\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"index\"},{\"type\":\"bytes[]\",\"name\":\"serialNumBatch\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"resolve\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"bool\",\"name\":\"_allowZeroAddress\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"resolve\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"bool\",\"name\":\"_allowZeroAddress\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"retryMessage\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"bool\",\"name\":\"_isLastAttempt\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"safeBatchTransferFrom\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256[]\",\"name\":\"ids\"},{\"type\":\"uint256[]\",\"name\":\"amounts\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"safeTransferFrom\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"id\"},{\"type\":\"uint256\",\"name\":\"amount\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"safeTransferFrom\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"tokenId\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"safeTransferFrom\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"tokenId\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"selfDelegate\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_anyToken\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"sendMessage\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash_\"},{\"type\":\"tuple\",\"name\":\"message_\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}]},{\"type\":\"function\",\"name\":\"sendSignal\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"_signal\"}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"sendToken\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_op\",\"components\":[{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"address\",\"name\":\"token\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"uint256[]\",\"name\":\"tokenIds\"},{\"type\":\"uint256[]\",\"name\":\"amounts\"}]}],\"outputs\":[{\"type\":\"tuple\",\"name\":\"message_\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}]},{\"type\":\"function\",\"name\":\"sendToken\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_op\",\"components\":[{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"address\",\"name\":\"token\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"uint256\",\"name\":\"amount\"}]}],\"outputs\":[{\"type\":\"tuple\",\"name\":\"message_\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}]},{\"type\":\"function\",\"name\":\"serialNumIsRevoked\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"idx\"},{\"type\":\"bytes\",\"name\":\"serialNum\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"revoked\"}]},{\"type\":\"function\",\"name\":\"setAddress\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"address\",\"name\":\"_newAddress\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"setApprovalForAll\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"operator\"},{\"type\":\"bool\",\"name\":\"approved\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"setGuardians\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address[]\",\"name\":\"_newGuardians\"},{\"type\":\"uint8\",\"name\":\"_minGuardians\"},{\"type\":\"bool\",\"name\":\"_clearData\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"setMrEnclave\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"_mrEnclave\"},{\"type\":\"bool\",\"name\":\"_trusted\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"setMrSigner\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"_mrSigner\"},{\"type\":\"bool\",\"name\":\"_trusted\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"sigVerifyLib\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"signalForChainData\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_kind\"},{\"type\":\"uint64\",\"name\":\"_blockId\"}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"signalForFailedMessage\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"_msgHash\"}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"source\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"},{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"splitCertificateChain\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"bytes\",\"name\":\"pemChain\"},{\"type\":\"uint256\",\"name\":\"size\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"success\"},{\"type\":\"bytes[]\",\"name\":\"certs\"}]},{\"type\":\"function\",\"name\":\"srcChainId\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"srcToken\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"state\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\",\"name\":\"__reserve1\"},{\"type\":\"tuple\",\"name\":\"slotA\",\"components\":[{\"type\":\"uint64\",\"name\":\"genesisHeight\"},{\"type\":\"uint64\",\"name\":\"genesisTimestamp\"},{\"type\":\"uint64\",\"name\":\"lastSyncedBlockId\"},{\"type\":\"uint64\",\"name\":\"lastSynecdAt\"}]},{\"type\":\"tuple\",\"name\":\"slotB\",\"components\":[{\"type\":\"uint64\",\"name\":\"numBlocks\"},{\"type\":\"uint64\",\"name\":\"lastVerifiedBlockId\"},{\"type\":\"bool\",\"name\":\"provingPaused\"},{\"type\":\"uint8\",\"name\":\"__reservedB1\"},{\"type\":\"uint16\",\"name\":\"__reservedB2\"},{\"type\":\"uint32\",\"name\":\"__reservedB3\"},{\"type\":\"uint64\",\"name\":\"lastUnpausedAt\"}]}]},{\"type\":\"function\",\"name\":\"supportsInterface\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes4\",\"name\":\"_interfaceId\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"symbol\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"string\"}]},{\"type\":\"function\",\"name\":\"symbol\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"string\"}]},{\"type\":\"function\",\"name\":\"syncChainData\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_kind\"},{\"type\":\"uint64\",\"name\":\"_blockId\"},{\"type\":\"bytes32\",\"name\":\"_chainData\"}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"tcbInfo\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"string\",\"name\":\"fmspc\"}],\"outputs\":[{\"type\":\"string\",\"name\":\"pceid\"},{\"type\":\"string\",\"name\":\"fmspc\"}]},{\"type\":\"function\",\"name\":\"toggleLocalReportCheck\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"tokenURI\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"_tokenId\"}],\"outputs\":[{\"type\":\"string\"}]},{\"type\":\"function\",\"name\":\"topBlockId\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"chainId\"},{\"type\":\"bytes32\",\"name\":\"kind\"}],\"outputs\":[{\"type\":\"uint64\",\"name\":\"blockId\"}]},{\"type\":\"function\",\"name\":\"totalSupply\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"transfer\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"amount\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"transferFrom\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"amount\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"transferFrom\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"tokenId\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"transferOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newOwner\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"trustedUserMrEnclave\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"enclave\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"trusted\"}]},{\"type\":\"function\",\"name\":\"trustedUserMrSigner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"signer\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"trusted\"}]},{\"type\":\"function\",\"name\":\"unpause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeTo\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"uri\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\"}],\"outputs\":[{\"type\":\"string\"}]},{\"type\":\"function\",\"name\":\"verifyAttestation\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"success\"}]},{\"type\":\"function\",\"name\":\"verifyBlocks\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_maxBlocksToVerify\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"verifyES256Signature\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes\",\"name\":\"tbs\"},{\"type\":\"bytes\",\"name\":\"signature\"},{\"type\":\"bytes\",\"name\":\"publicKey\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"sigValid\"}]},{\"type\":\"function\",\"name\":\"verifyParsedQuote\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"v3quote\",\"components\":[{\"type\":\"tuple\",\"name\":\"header\",\"components\":[{\"type\":\"bytes2\",\"name\":\"version\"},{\"type\":\"bytes2\",\"name\":\"attestationKeyType\"},{\"type\":\"bytes4\",\"name\":\"teeType\"},{\"type\":\"bytes2\",\"name\":\"qeSvn\"},{\"type\":\"bytes2\",\"name\":\"pceSvn\"},{\"type\":\"bytes16\",\"name\":\"qeVendorId\"},{\"type\":\"bytes20\",\"name\":\"userData\"}]},{\"type\":\"tuple\",\"name\":\"localEnclaveReport\",\"components\":[{\"type\":\"bytes16\",\"name\":\"cpuSvn\"},{\"type\":\"bytes4\",\"name\":\"miscSelect\"},{\"type\":\"bytes28\",\"name\":\"reserved1\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes32\",\"name\":\"mrEnclave\"},{\"type\":\"bytes32\",\"name\":\"reserved2\"},{\"type\":\"bytes32\",\"name\":\"mrSigner\"},{\"type\":\"bytes\",\"name\":\"reserved3\"},{\"type\":\"uint16\",\"name\":\"isvProdId\"},{\"type\":\"uint16\",\"name\":\"isvSvn\"},{\"type\":\"bytes\",\"name\":\"reserved4\"},{\"type\":\"bytes\",\"name\":\"reportData\"}]},{\"type\":\"tuple\",\"name\":\"v3AuthData\",\"components\":[{\"type\":\"bytes\",\"name\":\"ecdsa256BitSignature\"},{\"type\":\"bytes\",\"name\":\"ecdsaAttestationKey\"},{\"type\":\"tuple\",\"name\":\"pckSignedQeReport\",\"components\":[{\"type\":\"bytes16\",\"name\":\"cpuSvn\"},{\"type\":\"bytes4\",\"name\":\"miscSelect\"},{\"type\":\"bytes28\",\"name\":\"reserved1\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes32\",\"name\":\"mrEnclave\"},{\"type\":\"bytes32\",\"name\":\"reserved2\"},{\"type\":\"bytes32\",\"name\":\"mrSigner\"},{\"type\":\"bytes\",\"name\":\"reserved3\"},{\"type\":\"uint16\",\"name\":\"isvProdId\"},{\"type\":\"uint16\",\"name\":\"isvSvn\"},{\"type\":\"bytes\",\"name\":\"reserved4\"},{\"type\":\"bytes\",\"name\":\"reportData\"}]},{\"type\":\"bytes\",\"name\":\"qeReportSignature\"},{\"type\":\"tuple\",\"name\":\"qeAuthData\",\"components\":[{\"type\":\"uint16\",\"name\":\"parsedDataSize\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"tuple\",\"name\":\"certification\",\"components\":[{\"type\":\"uint16\",\"name\":\"certType\"},{\"type\":\"uint32\",\"name\":\"certDataSize\"},{\"type\":\"bytes[3]\",\"name\":\"decodedCertDataArray\"}]}]}]}],\"outputs\":[{\"type\":\"bool\"},{\"type\":\"bytes\"}]},{\"type\":\"function\",\"name\":\"verifyProof\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_ctx\",\"components\":[{\"type\":\"bytes32\",\"name\":\"metaHash\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"address\",\"name\":\"prover\"},{\"type\":\"uint64\",\"name\":\"blockId\"},{\"type\":\"bool\",\"name\":\"isContesting\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"address\",\"name\":\"msgSender\"}]},{\"type\":\"tuple\",\"components\":[{\"type\":\"bytes32\",\"name\":\"parentHash\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"bytes32\",\"name\":\"graffiti\"}]},{\"type\":\"tuple\",\"components\":[{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"verifyProof\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_ctx\",\"components\":[{\"type\":\"bytes32\",\"name\":\"metaHash\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"address\",\"name\":\"prover\"},{\"type\":\"uint64\",\"name\":\"blockId\"},{\"type\":\"bool\",\"name\":\"isContesting\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"address\",\"name\":\"msgSender\"}]},{\"type\":\"tuple\",\"name\":\"_tran\",\"components\":[{\"type\":\"bytes32\",\"name\":\"parentHash\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"bytes32\",\"name\":\"graffiti\"}]},{\"type\":\"tuple\",\"name\":\"_proof\",\"components\":[{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"verifySignalReceived\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"address\",\"name\":\"_app\"},{\"type\":\"bytes32\",\"name\":\"_signal\"},{\"type\":\"bytes\",\"name\":\"_proof\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"version\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint32\"}]},{\"type\":\"function\",\"name\":\"withdrawBond\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"_amount\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"withdrawTaikoToken\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_to\"},{\"type\":\"uint256\",\"name\":\"_amount\"}],\"outputs\":[]},{\"type\":\"constructor\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"es256Verifier\"}]}]","addresses":["0x02772b7B3a5Bea0141C993Dbb8D0733C19F46169","0x06a9Ab27c7e2255df1815E6CC0168d7755Feb19a","0x0b470dd3A0e1C41228856Fb319649E7c08f419Aa","0x10dea67478c5F8C5E2D90e5E9B26dBe60c54d800","0x11A9ebA17EbF92b40fcf9a640Ebbc47Db6fBeab0","0x33879cDF01121dc7bCe011b461e64d791aE931F2","0x39E4C1214e733639d059979079A151911e42791d","0x47bB416ee947fE4a4b655011aF7d6E3A1B80E6e9","0x537a2f0D3a5879b41BCb5A2afE2EA5c4961796F6","0x579A8d63a2Db646284CBFE31FE5082c9989E985c","0x579f40D0BE111b823962043702cabe6Aaa290780","0x67281b15aee4d6b805bc755e439abd524dd8da8d","0x8d7C954960a36a7596d7eA4945dDf891967ca8A3","0x996282cA11E5DEb6B5D122CC3B9A1FcAAD4415Ab","0x9e0a24964e5397B566c1ed39258e21aB5E35C77C","0xE3D777143Ea25A6E031d1e921F396750885f43aC","0xEf9EaA1dd30a9AA1df01c36411b5F082aA65fBaa","0xa25e645ff9897b0282e5f17d36de5bca4ec21d6e","0xaf145913EA4a56BE22E120ED9C24589659881702","0xb0f3186FC1963f774f52ff455DC86aEdD0b31F81","0xc4096E9ff1526Bd1840B65e9f45695135aC12De7","0xcc5d488073FA918cBbd73B9A523F3858C4de7372","0xd60247c6848B7Ca29eDdF63AA924E53dB6Ddd8EC"]}],"createdAt":"2024-08-27T09:44:01.744Z","subscriberId":"d1b49dd5-72bd-480e-b5d7-649ce0aadd09","name":"TaikoL1: Pause/Unpause","network":"mainnet","riskCategory":"ACCESS-CONTROL","monitorId":"d1b49dd5-72bd-480e-b5d7-649ce0aadd09","blockWatcherId":"mainnet-6","paused":false,"stackResourceId":"mystack.taiko-l-1-pause-unpause","type":"BLOCK"},{"skipABIValidation":false,"alertThreshold":null,"notifyConfig":{"severityLevel":"LOW","messageBody":"**Defender Monitor {{ sentinel.name }} Triggered**\n\n**Network**\n\n{{ sentinel.network }}\n\n**Block Hash**\n\n{{ blockHash }}\n\n**Transaction Hash**\n\n{{ transaction.transactionHash }}\n\n**Explorer Link**\n\n{{ transaction.link }}\n\n{{ matchReasonsFormatted }}","messageSubject":"Defender Monitor: Taiko Mainnet SGX Prover triggered","notifications":[{"type":"discord","sendCount":0,"notificationId":"93e8dbf2-4f87-4793-b3c3-6ff0dd6cf827"}],"timeoutMs":0},"tenantId":"0691b59e-8b53-4ae2-b874-959de8a9f2ee","addressRules":[{"conditions":[{"txConditions":[{"status":"any","expression":"status == \"failed\""}],"functionConditions":[],"eventConditions":[{"eventSignature":"InstanceAdded(uint256,address,address,uint256)","expression":null}]},{"txConditions":[{"status":"any","expression":"status == \"failed\""}],"functionConditions":[],"eventConditions":[{"eventSignature":"InstanceDeleted(uint256,address)","expression":null}]},{"txConditions":[{"status":"any","expression":"status == \"failed\""}],"functionConditions":[{"functionSignature":"verifyProof((bytes32,bytes32,address,uint64,bool,bool,address),(bytes32,bytes32,bytes32,bytes32),(uint16,bytes))","expression":null}],"eventConditions":[]}],"abi":"[{\"type\":\"event\",\"anonymous\":false,\"name\":\"AdminChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousAdmin\",\"indexed\":false},{\"type\":\"address\",\"name\":\"newAdmin\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BeaconUpgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"beacon\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Initialized\",\"inputs\":[{\"type\":\"uint8\",\"name\":\"version\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"InstanceAdded\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"id\",\"indexed\":true},{\"type\":\"address\",\"name\":\"instance\",\"indexed\":true},{\"type\":\"address\",\"name\":\"replaced\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"validSince\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"InstanceDeleted\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"id\",\"indexed\":true},{\"type\":\"address\",\"name\":\"instance\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferred\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Paused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Unpaused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Upgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"implementation\",\"indexed\":true}]},{\"type\":\"function\",\"name\":\"INSTANCE_EXPIRY\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"INSTANCE_VALIDITY_DELAY\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"addInstances\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address[]\",\"name\":\"_instances\"}],\"outputs\":[{\"type\":\"uint256[]\"}]},{\"type\":\"function\",\"name\":\"addressManager\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"addressRegistered\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"instanceAddress\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"alreadyAttested\"}]},{\"type\":\"function\",\"name\":\"deleteInstances\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256[]\",\"name\":\"_ids\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"},{\"type\":\"address\",\"name\":\"_addressManager\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"instances\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"instanceId\"}],\"outputs\":[{\"type\":\"address\",\"name\":\"addr\"},{\"type\":\"uint64\",\"name\":\"validSince\"}]},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"nextInstanceId\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"owner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"pause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"paused\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"pendingOwner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"registerInstance\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_attestation\",\"components\":[{\"type\":\"tuple\",\"name\":\"header\",\"components\":[{\"type\":\"bytes2\",\"name\":\"version\"},{\"type\":\"bytes2\",\"name\":\"attestationKeyType\"},{\"type\":\"bytes4\",\"name\":\"teeType\"},{\"type\":\"bytes2\",\"name\":\"qeSvn\"},{\"type\":\"bytes2\",\"name\":\"pceSvn\"},{\"type\":\"bytes16\",\"name\":\"qeVendorId\"},{\"type\":\"bytes20\",\"name\":\"userData\"}]},{\"type\":\"tuple\",\"name\":\"localEnclaveReport\",\"components\":[{\"type\":\"bytes16\",\"name\":\"cpuSvn\"},{\"type\":\"bytes4\",\"name\":\"miscSelect\"},{\"type\":\"bytes28\",\"name\":\"reserved1\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes32\",\"name\":\"mrEnclave\"},{\"type\":\"bytes32\",\"name\":\"reserved2\"},{\"type\":\"bytes32\",\"name\":\"mrSigner\"},{\"type\":\"bytes\",\"name\":\"reserved3\"},{\"type\":\"uint16\",\"name\":\"isvProdId\"},{\"type\":\"uint16\",\"name\":\"isvSvn\"},{\"type\":\"bytes\",\"name\":\"reserved4\"},{\"type\":\"bytes\",\"name\":\"reportData\"}]},{\"type\":\"tuple\",\"name\":\"v3AuthData\",\"components\":[{\"type\":\"bytes\",\"name\":\"ecdsa256BitSignature\"},{\"type\":\"bytes\",\"name\":\"ecdsaAttestationKey\"},{\"type\":\"tuple\",\"name\":\"pckSignedQeReport\",\"components\":[{\"type\":\"bytes16\",\"name\":\"cpuSvn\"},{\"type\":\"bytes4\",\"name\":\"miscSelect\"},{\"type\":\"bytes28\",\"name\":\"reserved1\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes32\",\"name\":\"mrEnclave\"},{\"type\":\"bytes32\",\"name\":\"reserved2\"},{\"type\":\"bytes32\",\"name\":\"mrSigner\"},{\"type\":\"bytes\",\"name\":\"reserved3\"},{\"type\":\"uint16\",\"name\":\"isvProdId\"},{\"type\":\"uint16\",\"name\":\"isvSvn\"},{\"type\":\"bytes\",\"name\":\"reserved4\"},{\"type\":\"bytes\",\"name\":\"reportData\"}]},{\"type\":\"bytes\",\"name\":\"qeReportSignature\"},{\"type\":\"tuple\",\"name\":\"qeAuthData\",\"components\":[{\"type\":\"uint16\",\"name\":\"parsedDataSize\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"tuple\",\"name\":\"certification\",\"components\":[{\"type\":\"uint16\",\"name\":\"certType\"},{\"type\":\"uint32\",\"name\":\"certDataSize\"},{\"type\":\"bytes[3]\",\"name\":\"decodedCertDataArray\"}]}]}]}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"resolve\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"bool\",\"name\":\"_allowZeroAddress\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"transferOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newOwner\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"unpause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeTo\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"verifyProof\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_ctx\",\"components\":[{\"type\":\"bytes32\",\"name\":\"metaHash\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"address\",\"name\":\"prover\"},{\"type\":\"uint64\",\"name\":\"blockId\"},{\"type\":\"bool\",\"name\":\"isContesting\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"address\",\"name\":\"msgSender\"}]},{\"type\":\"tuple\",\"name\":\"_tran\",\"components\":[{\"type\":\"bytes32\",\"name\":\"parentHash\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"bytes32\",\"name\":\"graffiti\"}]},{\"type\":\"tuple\",\"name\":\"_proof\",\"components\":[{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[]}]","addresses":["0xb0f3186FC1963f774f52ff455DC86aEdD0b31F81"]}],"createdAt":"2024-05-02T14:09:42.804Z","subscriberId":"d49a2a9b-268d-4d30-9553-ec55ed952d87","name":"Taiko Mainnet SGX Prover","network":"mainnet","riskCategory":"TECHNICAL","monitorId":"d49a2a9b-268d-4d30-9553-ec55ed952d87","blockWatcherId":"mainnet-1","paused":false,"stackResourceId":"mystack.taiko-mainnet-sgx-prover","type":"BLOCK"},{"skipABIValidation":false,"alertThreshold":null,"notifyConfig":{"severityLevel":"HIGH","messageBody":"**Defender Monitor {{ sentinel.name }} Triggered**\n\n**Network**\n\n{{ sentinel.network }}\n\n**Block Hash**\n\n{{ blockHash }}\n\n**Transaction Hash**\n\n{{ transaction.transactionHash }}\n\n**Explorer Link**\n\n{{ transaction.link }}\n\n{{ matchReasonsFormatted }}","messageSubject":"Defender Monitor: Taiko Mainnet Address Managers triggered","notifications":[{"type":"discord","sendCount":0,"notificationId":"93e8dbf2-4f87-4793-b3c3-6ff0dd6cf827"}],"timeoutMs":0},"tenantId":"0691b59e-8b53-4ae2-b874-959de8a9f2ee","addressRules":[{"conditions":[{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"AddressSet(uint64,bytes32,address,address)","expression":null}]}],"abi":"[{\"type\":\"event\",\"anonymous\":false,\"name\":\"AddressSet\",\"inputs\":[{\"type\":\"uint64\",\"name\":\"chainId\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"name\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newAddress\",\"indexed\":false},{\"type\":\"address\",\"name\":\"oldAddress\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"AdminChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousAdmin\",\"indexed\":false},{\"type\":\"address\",\"name\":\"newAdmin\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BeaconUpgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"beacon\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Initialized\",\"inputs\":[{\"type\":\"uint8\",\"name\":\"version\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferred\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Paused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Unpaused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Upgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"implementation\",\"indexed\":true}]},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"addressManager\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"getAddress\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"owner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"pause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"paused\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"pendingOwner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"resolve\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"bool\",\"name\":\"_allowZeroAddress\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"setAddress\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"address\",\"name\":\"_newAddress\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"transferOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newOwner\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"unpause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeTo\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]}]","addresses":["0xEf9EaA1dd30a9AA1df01c36411b5F082aA65fBaa","0x579f40D0BE111b823962043702cabe6Aaa290780"]}],"createdAt":"2024-05-02T14:00:18.874Z","subscriberId":"3919cb83-487f-4432-88fa-33bbe4361fce","name":"Taiko Mainnet Address Managers","network":"mainnet","riskCategory":"ACCESS-CONTROL","monitorId":"3919cb83-487f-4432-88fa-33bbe4361fce","blockWatcherId":"mainnet-1","paused":false,"stackResourceId":"mystack.taiko-mainnet-address-managers","type":"BLOCK"},{"skipABIValidation":false,"alertThreshold":null,"notifyConfig":{"severityLevel":"HIGH","messageBody":"**Defender Monitor {{ sentinel.name }} Triggered**\n\n**Network**\n\n{{ sentinel.network }}\n\n**Block Hash**\n\n{{ blockHash }}\n\n**Transaction Hash**\n\n{{ transaction.transactionHash }}\n\n**Explorer Link**\n\n{{ transaction.link }}\n\n{{ matchReasonsFormatted }}","messageSubject":"Defender Monitor: Taiko Mainnet Essential Contracts triggered","notifications":[{"type":"discord","sendCount":0,"notificationId":"93e8dbf2-4f87-4793-b3c3-6ff0dd6cf827"}],"timeoutMs":0},"tenantId":"0691b59e-8b53-4ae2-b874-959de8a9f2ee","addressRules":[{"conditions":[{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"AdminChanged(address,address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"BeaconUpgraded(address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"Initialized(uint8)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"OwnershipTransferStarted(address,address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"OwnershipTransferred(address,address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"Paused(address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"Unpaused(address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"Upgraded(address)","expression":null}]}],"abi":"[{\"type\":\"event\",\"anonymous\":false,\"name\":\"AdminChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousAdmin\",\"indexed\":false},{\"type\":\"address\",\"name\":\"newAdmin\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BeaconUpgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"beacon\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Initialized\",\"inputs\":[{\"type\":\"uint8\",\"name\":\"version\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferred\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Paused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Unpaused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Upgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"implementation\",\"indexed\":true}]},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"addressManager\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"owner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"pause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"paused\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"pendingOwner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"resolve\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"bool\",\"name\":\"_allowZeroAddress\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"transferOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newOwner\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"unpause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeTo\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]}]","addresses":["0xEf9EaA1dd30a9AA1df01c36411b5F082aA65fBaa","0x10dea67478c5F8C5E2D90e5E9B26dBe60c54d800","0x9e0a24964e5397B566c1ed39258e21aB5E35C77C","0xd60247c6848B7Ca29eDdF63AA924E53dB6Ddd8EC","0x996282cA11E5DEb6B5D122CC3B9A1FcAAD4415Ab","0x0b470dd3A0e1C41228856Fb319649E7c08f419Aa","0x0b470dd3A0e1C41228856Fb319649E7c08f419Aa","0xaf145913EA4a56BE22E120ED9C24589659881702","0x579f40D0BE111b823962043702cabe6Aaa290780","0x06a9Ab27c7e2255df1815E6CC0168d7755Feb19a","0x537a2f0D3a5879b41BCb5A2afE2EA5c4961796F6","0x33879cDF01121dc7bCe011b461e64d791aE931F2","0xb0f3186FC1963f774f52ff455DC86aEdD0b31F81","0x579A8d63a2Db646284CBFE31FE5082c9989E985c","0xE3D777143Ea25A6E031d1e921F396750885f43aC","0x8d7C954960a36a7596d7eA4945dDf891967ca8A3"]}],"createdAt":"2024-05-02T13:49:54.192Z","subscriberId":"67a53521-3d4a-4de4-92ab-ede82cc45644","name":"Taiko Mainnet Essential Contracts","network":"mainnet","riskCategory":"ACCESS-CONTROL","monitorId":"67a53521-3d4a-4de4-92ab-ede82cc45644","blockWatcherId":"mainnet-1","paused":false,"stackResourceId":"mystack.taiko-mainnet-essential-contracts","type":"BLOCK"}]},"actions":{"removed":[],"created":[],"updated":[{"autotaskId":"86964fd3-3da8-4501-a572-cbf51045f861","actionId":"86964fd3-3da8-4501-a572-cbf51045f861","name":"ERC20Vault: Balance Drop","paused":false,"trigger":{"cron":null,"frequencyMinutes":15,"type":"schedule"},"codeDigest":"+Y75bpyOzEuCm0y95ZczKkySm4PgLyQQt6ASpaB08Lk=","stackResourceId":"mystack.erc-20-vault-balance-drop","runtime":"nodejs20.x","dependenciesVersion":"v2024-08-21","encodedZippedCode":"UEsDBAoAAAAAAAAAQVASVlLscBMAAHATAAAIAAAAaW5kZXguanNjb25zdCB7IGV0aGVycyB9ID0gcmVxdWlyZSgiZXRoZXJzIik7CmNvbnN0IHsgRGVmZW5kZXIgfSA9IHJlcXVpcmUoIkBvcGVuemVwcGVsaW4vZGVmZW5kZXItc2RrIik7Cgpjb25zdCBFUkMyMF9BQkkgPSBbCiAgewogICAgY29uc3RhbnQ6IHRydWUsCiAgICBpbnB1dHM6IFt7IG5hbWU6ICJfb3duZXIiLCB0eXBlOiAiYWRkcmVzcyIgfV0sCiAgICBuYW1lOiAiYmFsYW5jZU9mIiwKICAgIG91dHB1dHM6IFt7IG5hbWU6ICJiYWxhbmNlIiwgdHlwZTogInVpbnQyNTYiIH1dLAogICAgcGF5YWJsZTogZmFsc2UsCiAgICBzdGF0ZU11dGFiaWxpdHk6ICJ2aWV3IiwKICAgIHR5cGU6ICJmdW5jdGlvbiIsCiAgfSwKXTsKCmFzeW5jIGZ1bmN0aW9uIGdldEVSQzIwQmFsYW5jZShwcm92aWRlciwgdG9rZW5BZGRyZXNzLCB2YXVsdEFkZHJlc3MpIHsKICBjb25zdCBjb250cmFjdCA9IG5ldyBldGhlcnMuQ29udHJhY3QodG9rZW5BZGRyZXNzLCBFUkMyMF9BQkksIHByb3ZpZGVyKTsKICByZXR1cm4gYXdhaXQgY29udHJhY3QuYmFsYW5jZU9mKHZhdWx0QWRkcmVzcyk7Cn0KCmFzeW5jIGZ1bmN0aW9uIGdldE5hdGl2ZVRva2VuQmFsYW5jZShwcm92aWRlciwgdmF1bHRBZGRyZXNzKSB7CiAgcmV0dXJuIGF3YWl0IHByb3ZpZGVyLmdldEJhbGFuY2UodmF1bHRBZGRyZXNzKTsKfQoKYXN5bmMgZnVuY3Rpb24gbW9uaXRvclRva2VuQmFsYW5jZSgKICBwcm92aWRlciwKICB0b2tlbkFkZHJlc3MsCiAgdmF1bHRBZGRyZXNzLAogIHByZXZpb3VzQmFsYW5jZUtleSwKICBub3RpZmljYXRpb25DbGllbnQsCiAgc2VjcmV0cywKICBjbGllbnQsCiAgdG9rZW5OYW1lLAogIG5ldHdvcmtOYW1lLAopIHsKICBjb25zb2xlLmxvZyhgTW9uaXRvcmluZyAke3Rva2VuTmFtZX0gYmFsYW5jZSBvbiAke25ldHdvcmtOYW1lfWApOwogIGNvbnN0IHByZXZpb3VzQmFsYW5jZSA9IGV0aGVycy5CaWdOdW1iZXIuZnJvbSgKICAgIHNlY3JldHNbcHJldmlvdXNCYWxhbmNlS2V5XSB8fCAiMCIsCiAgKTsKICBjb25zb2xlLmxvZygKICAgIGBQcmV2aW91cyAke3Rva2VuTmFtZX0gQmFsYW5jZTogJHtldGhlcnMudXRpbHMuZm9ybWF0VW5pdHMoCiAgICAgIHByZXZpb3VzQmFsYW5jZSwKICAgICAgMTgsCiAgICApfWAsCiAgKTsKCiAgbGV0IGN1cnJlbnRCYWxhbmNlOwogIGlmICh0b2tlbk5hbWUgPT09ICJFVEgiKSB7CiAgICBjdXJyZW50QmFsYW5jZSA9IGF3YWl0IGdldE5hdGl2ZVRva2VuQmFsYW5jZShwcm92aWRlciwgdmF1bHRBZGRyZXNzKTsKICB9IGVsc2UgewogICAgY3VycmVudEJhbGFuY2UgPSBhd2FpdCBnZXRFUkMyMEJhbGFuY2UoCiAgICAgIHByb3ZpZGVyLAogICAgICB0b2tlbkFkZHJlc3MsCiAgICAgIHZhdWx0QWRkcmVzcywKICAgICk7CiAgfQogIGNvbnNvbGUubG9nKAogICAgYEN1cnJlbnQgJHt0b2tlbk5hbWV9IEJhbGFuY2U6ICR7ZXRoZXJzLnV0aWxzLmZvcm1hdFVuaXRzKAogICAgICBjdXJyZW50QmFsYW5jZSwKICAgICAgMTgsCiAgICApfWAsCiAgKTsKCiAgaWYgKCFwcmV2aW91c0JhbGFuY2UuaXNaZXJvKCkpIHsKICAgIGNvbnN0IGRyb3BQZXJjZW50YWdlID0gcHJldmlvdXNCYWxhbmNlCiAgICAgIC5zdWIoY3VycmVudEJhbGFuY2UpCiAgICAgIC5tdWwoMTAwKQogICAgICAuZGl2KHByZXZpb3VzQmFsYW5jZSkKICAgICAgLnRvTnVtYmVyKCk7CiAgICBjb25zb2xlLmxvZygKICAgICAgYENhbGN1bGF0ZWQgZHJvcCBwZXJjZW50YWdlIGZvciAke3Rva2VuTmFtZX06ICR7ZHJvcFBlcmNlbnRhZ2V9JWAsCiAgICApOwoKICAgIGlmIChkcm9wUGVyY2VudGFnZSA+PSA1KSB7CiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBgQWxlcnQ6ICR7dG9rZW5OYW1lfSBiYWxhbmNlIGhhcyBkcm9wcGVkIGJ5ICR7ZHJvcFBlcmNlbnRhZ2V9JSBvbiAke25ldHdvcmtOYW1lfS5cblByZXZpb3VzIEJhbGFuY2U6ICR7ZXRoZXJzLnV0aWxzLmZvcm1hdFVuaXRzKAogICAgICAgIHByZXZpb3VzQmFsYW5jZSwKICAgICAgICAxOCwKICAgICAgKX1cbkN1cnJlbnQgQmFsYW5jZTogJHtldGhlcnMudXRpbHMuZm9ybWF0VW5pdHMoY3VycmVudEJhbGFuY2UsIDE4KX1gOwogICAgICBhbGVydE9yZygKICAgICAgICBub3RpZmljYXRpb25DbGllbnQsCiAgICAgICAgYOKaoO+4jyAke25ldHdvcmtOYW1lfTogJHt0b2tlbk5hbWV9IEJhbGFuY2UgRHJvcCBBbGVydGAsCiAgICAgICAgbWVzc2FnZSwKICAgICAgKTsKICAgIH0gZWxzZSB7CiAgICAgIGNvbnNvbGUubG9nKAogICAgICAgIGBObyBzaWduaWZpY2FudCAke3Rva2VuTmFtZX0gYmFsYW5jZSBkcm9wIGRldGVjdGVkIG9uICR7bmV0d29ya05hbWV9YCwKICAgICAgKTsKICAgIH0KICB9IGVsc2UgewogICAgY29uc29sZS5sb2coCiAgICAgIGBObyBwcmV2aW91cyAke3Rva2VuTmFtZX0gYmFsYW5jZSB0byBjb21wYXJlIG9uICR7bmV0d29ya05hbWV9YCwKICAgICk7CiAgfQoKICBhd2FpdCBzdG9yZVByZXZpb3VzQmFsYW5jZShjbGllbnQsIHByZXZpb3VzQmFsYW5jZUtleSwgY3VycmVudEJhbGFuY2UpOwp9CgpmdW5jdGlvbiBhbGVydE9yZyhub3RpZmljYXRpb25DbGllbnQsIHN1YmplY3QsIG1lc3NhZ2UpIHsKICBub3RpZmljYXRpb25DbGllbnQuc2VuZCh7CiAgICBjaGFubmVsQWxpYXM6ICJkaXNjb3JkX2JyaWRnaW5nIiwKICAgIHN1YmplY3QsCiAgICBtZXNzYWdlLAogIH0pOwp9Cgphc3luYyBmdW5jdGlvbiBzdG9yZVByZXZpb3VzQmFsYW5jZShjbGllbnQsIGtleSwgbmV3QmFsYW5jZSkgewogIGNvbnNvbGUubG9nKAogICAgYFN0b3JpbmcgcHJldmlvdXMgYmFsYW5jZSB1bmRlciBrZXk6ICR7a2V5fSwgdmFsdWU6ICR7bmV3QmFsYW5jZS50b1N0cmluZygpfWAsCiAgKTsKICBjb25zdCBib2R5ID0gewogICAgZGVsZXRlczogW10sCiAgICBzZWNyZXRzOiB7CiAgICAgIFtrZXldOiBuZXdCYWxhbmNlLnRvU3RyaW5nKCksCiAgICB9LAogIH07CiAgYXdhaXQgY2xpZW50LmFjdGlvbi5jcmVhdGVTZWNyZXRzKGJvZHkpOwp9CgpmdW5jdGlvbiBjcmVhdGVQcm92aWRlcihhcGlLZXksIGFwaVNlY3JldCwgcmVsYXllckFwaUtleSwgcmVsYXllckFwaVNlY3JldCkgewogIGNvbnNvbGUubG9nKGBDcmVhdGluZyBwcm92aWRlciB3aXRoIEFQSSBrZXlzYCk7CiAgY29uc3QgY2xpZW50ID0gbmV3IERlZmVuZGVyKHsKICAgIGFwaUtleSwKICAgIGFwaVNlY3JldCwKICAgIHJlbGF5ZXJBcGlLZXksCiAgICByZWxheWVyQXBpU2VjcmV0LAogIH0pOwoKICByZXR1cm4gY2xpZW50LnJlbGF5U2lnbmVyLmdldFByb3ZpZGVyKCk7Cn0KCmV4cG9ydHMuaGFuZGxlciA9IGFzeW5jIGZ1bmN0aW9uIChldmVudCwgY29udGV4dCkgewogIGNvbnN0IHsgbm90aWZpY2F0aW9uQ2xpZW50IH0gPSBjb250ZXh0OwogIGNvbnN0IHsgYXBpS2V5LCBhcGlTZWNyZXQsIHRhaWtvTDFBcGlLZXksIHRhaWtvTDFBcGlTZWNyZXQgfSA9IGV2ZW50LnNlY3JldHM7CgogIGNvbnNvbGUubG9nKGBTdGFydGluZyBiYWxhbmNlIG1vbml0b3JpbmcgZm9yIEwxYCk7CgogIGNvbnN0IGwxUHJvdmlkZXIgPSBjcmVhdGVQcm92aWRlcigKICAgIGFwaUtleSwKICAgIGFwaVNlY3JldCwKICAgIHRhaWtvTDFBcGlLZXksCiAgICB0YWlrb0wxQXBpU2VjcmV0LAogICk7CgogIGNvbnN0IGwxVmF1bHRBZGRyZXNzID0gIjB4OTk2MjgyY0ExMUU1REViNkI1RDEyMkNDM0I5QTFGY0FBRDQ0MTVBYiI7CgogIGNvbnN0IGwxVG9rZW5BZGRyZXNzZXMgPSB7CiAgICBFVEg6IG51bGwsCiAgICBUQUlLTzogZXRoZXJzLnV0aWxzLmdldEFkZHJlc3MoCiAgICAgICIweDEwZGVhNjc0NzhjNUY4QzVFMkQ5MGU1RTlCMjZkQmU2MGM1NGQ4MDAiLAogICAgKSwKICAgIFVTREM6IGV0aGVycy51dGlscy5nZXRBZGRyZXNzKCIweEEwYjg2OTkxYzYyMThiMzZjMWQxOUQ0YTJlOUViMGNFMzYwNmVCNDgiKSwKICAgIFVTRFQ6IGV0aGVycy51dGlscy5nZXRBZGRyZXNzKCIweGRBQzE3Rjk1OEQyZWU1MjNhMjIwNjIwNjk5NDU5N0MxM0Q4MzFlYzciKSwKICB9OwoKICBjb25zdCBjbGllbnQgPSBuZXcgRGVmZW5kZXIoewogICAgYXBpS2V5LAogICAgYXBpU2VjcmV0LAogICAgdGFpa29MMUFwaUtleSwKICAgIHRhaWtvTDFBcGlTZWNyZXQsCiAgfSk7CgogIGF3YWl0IG1vbml0b3JUb2tlbkJhbGFuY2UoCiAgICBsMVByb3ZpZGVyLAogICAgbDFUb2tlbkFkZHJlc3Nlcy5FVEgsCiAgICBsMVZhdWx0QWRkcmVzcywKICAgICJwcmV2aW91c0JhbGFuY2VfTDFfRVRIIiwKICAgIG5vdGlmaWNhdGlvbkNsaWVudCwKICAgIGV2ZW50LnNlY3JldHMsCiAgICBjbGllbnQsCiAgICAiRVRIIiwKICAgICJMMSIsCiAgKTsKICBhd2FpdCBtb25pdG9yVG9rZW5CYWxhbmNlKAogICAgbDFQcm92aWRlciwKICAgIGwxVG9rZW5BZGRyZXNzZXMuVEFJS08sCiAgICBsMVZhdWx0QWRkcmVzcywKICAgICJwcmV2aW91c0JhbGFuY2VfTDFfVEFJS08iLAogICAgbm90aWZpY2F0aW9uQ2xpZW50LAogICAgZXZlbnQuc2VjcmV0cywKICAgIGNsaWVudCwKICAgICJUQUlLTyIsCiAgICAiTDEiLAogICk7CiAgYXdhaXQgbW9uaXRvclRva2VuQmFsYW5jZSgKICAgIGwxUHJvdmlkZXIsCiAgICBsMVRva2VuQWRkcmVzc2VzLlVTREMsCiAgICBsMVZhdWx0QWRkcmVzcywKICAgICJwcmV2aW91c0JhbGFuY2VfTDFfVVNEQyIsCiAgICBub3RpZmljYXRpb25DbGllbnQsCiAgICBldmVudC5zZWNyZXRzLAogICAgY2xpZW50LAogICAgIlVTREMiLAogICAgIkwxIiwKICApOwogIGF3YWl0IG1vbml0b3JUb2tlbkJhbGFuY2UoCiAgICBsMVByb3ZpZGVyLAogICAgbDFUb2tlbkFkZHJlc3Nlcy5VU0RULAogICAgbDFWYXVsdEFkZHJlc3MsCiAgICAicHJldmlvdXNCYWxhbmNlX0wxX1VTRFQiLAogICAgbm90aWZpY2F0aW9uQ2xpZW50LAogICAgZXZlbnQuc2VjcmV0cywKICAgIGNsaWVudCwKICAgICJVU0RUIiwKICAgICJMMSIsCiAgKTsKCiAgY29uc29sZS5sb2coYEJhbGFuY2UgbW9uaXRvcmluZyBjb21wbGV0ZWRgKTsKCiAgcmV0dXJuIHRydWU7Cn07ClBLAQIUAAoAAAAAAAAAQVASVlLscBMAAHATAAAIAAAAAAAAAAAAAAAAAAAAAABpbmRleC5qc1BLBQYAAAAAAQABADYAAACWEwAAAAA="}]},"contracts":{"removed":[],"created":[],"updated":[]},"relayers":{"removed":[],"created":[],"updated":[],"relayerKeys":{"removed":[],"created":[],"updated":[]}},"notifications":{"removed":[],"created":[],"updated":[]},"secrets":{"removed":[],"created":[],"updated":[]},"blockExplorerApiKeys":{"removed":[],"created":[],"updated":[]},"forkedNetworks":{"removed":[],"created":[],"updated":[]},"privateNetworks":{"removed":[],"created":[],"updated":[]}} +{"stack":"mystack","timestamp":"2024-09-19T10:45:56.109Z","monitors":{"removed":[],"created":[],"updated":[{"skipABIValidation":true,"alertThreshold":null,"notifyConfig":{"severityLevel":"MEDIUM","messageBody":"**Defender Monitor {{ sentinel.name }} Triggered**\n\n**Network**\n\n{{ sentinel.network }}\n\n**Block Hash**\n\n{{ blockHash }}\n\n**Transaction Hash**\n\n{{ transaction.transactionHash }}\n\n**Explorer Link**\n\n{{ transaction.link }}\n\n**Match Reasons**\n\n{{ matchReasonsFormatted }}\n\n**Metadata**\n\n{{ metadataFormatted }}","messageSubject":"Defender Monitor: TaikoL1: Pause/Unpause triggered","notifications":[{"type":"discord","sendCount":0,"notificationId":"93e8dbf2-4f87-4793-b3c3-6ff0dd6cf827"}],"timeoutMs":60000},"tenantId":"0691b59e-8b53-4ae2-b874-959de8a9f2ee","addressRules":[{"conditions":[{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"Paused(address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"Unpaused(address)","expression":null}]}],"abi":"[{\"type\":\"error\",\"name\":\"AM_ADDRESS_ALREADY_SET\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"AddressSet\",\"inputs\":[{\"type\":\"uint64\",\"name\":\"chainId\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"name\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newAddress\",\"indexed\":false},{\"type\":\"address\",\"name\":\"oldAddress\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"AdminChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousAdmin\",\"indexed\":false},{\"type\":\"address\",\"name\":\"newAdmin\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Approval\",\"inputs\":[{\"type\":\"address\",\"name\":\"owner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"spender\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"value\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Approval\",\"inputs\":[{\"type\":\"address\",\"name\":\"owner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"approved\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"tokenId\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"ApprovalForAll\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":true},{\"type\":\"address\",\"name\":\"operator\",\"indexed\":true},{\"type\":\"bool\",\"name\":\"approved\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Approved\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"operationId\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"approvalBits\",\"indexed\":false},{\"type\":\"bool\",\"name\":\"minGuardiansReached\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Authorized\",\"inputs\":[{\"type\":\"address\",\"name\":\"addr\",\"indexed\":true},{\"type\":\"bool\",\"name\":\"authorized\",\"indexed\":false}]},{\"type\":\"error\",\"name\":\"BB_INVALID_PARAMS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BB_MINT_DISALLOWED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BB_PERMISSION_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BTOKEN_CANNOT_RECEIVE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BTOKEN_INVALID_BURN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BTOKEN_INVALID_PARAMS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INSUFFICIENT_GAS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_CONTEXT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_FEE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_GAS_LIMIT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_VALUE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_MESSAGE_NOT_SENT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_OUT_OF_ETH_QUOTA\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_PERMISSION_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_PROOF_TOO_LARGE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_RETRY_FAILED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_SIGNAL_NOT_RECEIVED\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BeaconUpgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"beacon\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BlockProposed\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"address\",\"name\":\"assignedProver\",\"indexed\":true},{\"type\":\"uint96\",\"name\":\"livenessBond\",\"indexed\":false},{\"type\":\"tuple\",\"name\":\"meta\",\"indexed\":false,\"components\":[{\"type\":\"bytes32\",\"name\":\"l1Hash\"},{\"type\":\"bytes32\",\"name\":\"difficulty\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"bytes32\",\"name\":\"extraData\"},{\"type\":\"bytes32\",\"name\":\"depositsHash\"},{\"type\":\"address\",\"name\":\"coinbase\"},{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"uint64\",\"name\":\"timestamp\"},{\"type\":\"uint64\",\"name\":\"l1Height\"},{\"type\":\"uint16\",\"name\":\"minTier\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"bytes32\",\"name\":\"parentMetaHash\"},{\"type\":\"address\",\"name\":\"sender\"}]},{\"type\":\"tuple[]\",\"name\":\"depositsProcessed\",\"indexed\":false,\"components\":[{\"type\":\"address\",\"name\":\"recipient\"},{\"type\":\"uint96\",\"name\":\"amount\"},{\"type\":\"uint64\",\"name\":\"id\"}]}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BlockVerified\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"address\",\"name\":\"prover\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"blockHash\",\"indexed\":false},{\"type\":\"bytes32\",\"name\":\"stateRoot\",\"indexed\":false},{\"type\":\"uint16\",\"name\":\"tier\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BondCredited\",\"inputs\":[{\"type\":\"address\",\"name\":\"user\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"amount\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BondDebited\",\"inputs\":[{\"type\":\"address\",\"name\":\"user\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"amount\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BridgedTokenChanged\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"srcChainId\",\"indexed\":true},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":true},{\"type\":\"address\",\"name\":\"btokenOld\",\"indexed\":false},{\"type\":\"address\",\"name\":\"btokenNew\",\"indexed\":false},{\"type\":\"string\",\"name\":\"ctokenSymbol\",\"indexed\":false},{\"type\":\"string\",\"name\":\"ctokenName\",\"indexed\":false},{\"type\":\"uint8\",\"name\":\"ctokenDecimal\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BridgedTokenDeployed\",\"inputs\":[{\"type\":\"uint64\",\"name\":\"chainId\",\"indexed\":true},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":true},{\"type\":\"address\",\"name\":\"btoken\",\"indexed\":true},{\"type\":\"string\",\"name\":\"ctokenSymbol\",\"indexed\":false},{\"type\":\"string\",\"name\":\"ctokenName\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BridgedTokenDeployed\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"srcChainId\",\"indexed\":true},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":true},{\"type\":\"address\",\"name\":\"btoken\",\"indexed\":true},{\"type\":\"string\",\"name\":\"ctokenSymbol\",\"indexed\":false},{\"type\":\"string\",\"name\":\"ctokenName\",\"indexed\":false},{\"type\":\"uint8\",\"name\":\"ctokenDecimal\",\"indexed\":false}]},{\"type\":\"function\",\"name\":\"CLOCK_MODE\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"string\"}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"CalldataTxList\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"bytes\",\"name\":\"txList\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"ChainDataSynced\",\"inputs\":[{\"type\":\"uint64\",\"name\":\"chainId\",\"indexed\":true},{\"type\":\"uint64\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"kind\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"data\",\"indexed\":false},{\"type\":\"bytes32\",\"name\":\"signal\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"ConflictingProofs\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"address\",\"name\":\"guardian\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"currentProofHash\",\"indexed\":false},{\"type\":\"bytes32\",\"name\":\"newProofHash\",\"indexed\":false},{\"type\":\"bool\",\"name\":\"provingPaused\",\"indexed\":false}]},{\"type\":\"function\",\"name\":\"DOMAIN_SEPARATOR\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"DelegateChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"delegator\",\"indexed\":true},{\"type\":\"address\",\"name\":\"fromDelegate\",\"indexed\":true},{\"type\":\"address\",\"name\":\"toDelegate\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"DelegateVotesChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"delegate\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"previousBalance\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"newBalance\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"EIP712DomainChanged\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ETH_TRANSFER_FAILED\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"EtherPaymentFailed\",\"inputs\":[{\"type\":\"address\",\"name\":\"to\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"maxGas\",\"indexed\":false}]},{\"type\":\"error\",\"name\":\"FUNC_NOT_IMPLEMENTED\",\"inputs\":[]},{\"type\":\"function\",\"name\":\"GAS_OVERHEAD\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint32\"}]},{\"type\":\"function\",\"name\":\"GAS_RESERVE\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"GP_INVALID_GUARDIAN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GP_INVALID_GUARDIAN_SET\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GP_INVALID_MIN_GUARDIANS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GP_INVALID_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GV_PERMISSION_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GV_ZERO_ADDRESS\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"GuardianApproval\",\"inputs\":[{\"type\":\"address\",\"name\":\"addr\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"blockHash\",\"indexed\":true},{\"type\":\"bool\",\"name\":\"approved\",\"indexed\":false},{\"type\":\"bytes\",\"name\":\"proofData\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"GuardiansUpdated\",\"inputs\":[{\"type\":\"uint32\",\"name\":\"version\",\"indexed\":false},{\"type\":\"address[]\",\"name\":\"guardians\",\"indexed\":false}]},{\"type\":\"error\",\"name\":\"HOOK_ASSIGNMENT_EXPIRED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"HOOK_ASSIGNMENT_INVALID_SIG\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"HOOK_TIER_NOT_FOUND\",\"inputs\":[]},{\"type\":\"function\",\"name\":\"INSTANCE_EXPIRY\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"INSTANCE_VALIDITY_DELAY\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Initialized\",\"inputs\":[{\"type\":\"uint8\",\"name\":\"version\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"InstanceAdded\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"id\",\"indexed\":true},{\"type\":\"address\",\"name\":\"instance\",\"indexed\":true},{\"type\":\"address\",\"name\":\"replaced\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"validSince\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"InstanceDeleted\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"id\",\"indexed\":true},{\"type\":\"address\",\"name\":\"instance\",\"indexed\":true}]},{\"type\":\"error\",\"name\":\"L1_ALREADY_CONTESTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_ALREADY_PROVED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOB_NOT_AVAILABLE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOB_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOCK_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_CANNOT_CONTEST\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_BLOCK_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_GENESIS_HASH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_SIG\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_TIER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_TRANSITION\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_NOT_ASSIGNED_PROVER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_PROVING_PAUSED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_RECEIVE_DISABLED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TOO_MANY_BLOCKS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TRANSITION_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNEXPECTED_PARENT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNEXPECTED_TRANSITION_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"LTP_INVALID_ACCOUNT_PROOF\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"LTP_INVALID_INCLUSION_PROOF\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"LocalReportCheckToggled\",\"inputs\":[{\"type\":\"bool\",\"name\":\"checkLocalEnclaveReport\",\"indexed\":false}]},{\"type\":\"function\",\"name\":\"MAX_GAS_PAYING_PROVER\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"MIN_MIGRATION_DELAY\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MessageProcessed\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"tuple\",\"name\":\"message\",\"indexed\":false,\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"tuple\",\"name\":\"stats\",\"indexed\":false,\"components\":[{\"type\":\"uint32\",\"name\":\"gasUsedInFeeCalc\"},{\"type\":\"uint32\",\"name\":\"proofSize\"},{\"type\":\"uint32\",\"name\":\"numCacheOps\"},{\"type\":\"bool\",\"name\":\"processedByRelayer\"}]}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MessageSent\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"tuple\",\"name\":\"message\",\"indexed\":false,\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MessageStatusChanged\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"uint8\",\"name\":\"status\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MigratedTo\",\"inputs\":[{\"type\":\"address\",\"name\":\"fromToken\",\"indexed\":true},{\"type\":\"address\",\"name\":\"account\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"amount\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MigrationStatusChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"addr\",\"indexed\":false},{\"type\":\"bool\",\"name\":\"inbound\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MrEnclaveUpdated\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"mrEnclave\",\"indexed\":true},{\"type\":\"bool\",\"name\":\"trusted\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MrSignerUpdated\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"mrSigner\",\"indexed\":true},{\"type\":\"bool\",\"name\":\"trusted\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferred\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Paused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"ProvingAutoPauseEnabled\",\"inputs\":[{\"type\":\"bool\",\"name\":\"enabled\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"ProvingPaused\",\"inputs\":[{\"type\":\"bool\",\"name\":\"paused\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"QeIdentityConfigured\",\"inputs\":[{\"type\":\"tuple\",\"name\":\"qeIdentityInput\",\"indexed\":false,\"components\":[{\"type\":\"bytes4\",\"name\":\"miscselect\"},{\"type\":\"bytes4\",\"name\":\"miscselectMask\"},{\"type\":\"uint16\",\"name\":\"isvprodid\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes16\",\"name\":\"attributesMask\"},{\"type\":\"bytes32\",\"name\":\"mrsigner\"},{\"type\":\"tuple[]\",\"name\":\"tcbLevels\",\"components\":[{\"type\":\"tuple\",\"name\":\"tcb\",\"components\":[{\"type\":\"uint16\",\"name\":\"isvsvn\"}]},{\"type\":\"uint8\",\"name\":\"tcbStatus\"}]}]}]},{\"type\":\"error\",\"name\":\"REENTRANT_CALL\",\"inputs\":[]},{\"type\":\"function\",\"name\":\"RELAYER_MAX_PROOF_BYTES\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"RESOLVER_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_INVALID_MANAGER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_UNEXPECTED_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_ZERO_ADDR\",\"inputs\":[{\"type\":\"uint64\",\"name\":\"chainId\"},{\"type\":\"bytes32\",\"name\":\"name\"}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"RevokedCertSerialNumAdded\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"index\",\"indexed\":true},{\"type\":\"bytes\",\"name\":\"serialNum\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"RevokedCertSerialNumRemoved\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"index\",\"indexed\":true},{\"type\":\"bytes\",\"name\":\"serialNum\",\"indexed\":false}]},{\"type\":\"error\",\"name\":\"SGX_ALREADY_ATTESTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SGX_INVALID_ATTESTATION\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SGX_INVALID_INSTANCE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SGX_INVALID_PROOF\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SGX_RA_NOT_SUPPORTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_EMPTY_PROOF\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_INVALID_HOPS_WITH_LOOP\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_INVALID_LAST_HOP_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_INVALID_MID_HOP_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_INVALID_STATE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_SIGNAL_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_UNAUTHORIZED\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"SignalSent\",\"inputs\":[{\"type\":\"address\",\"name\":\"app\",\"indexed\":false},{\"type\":\"bytes32\",\"name\":\"signal\",\"indexed\":false},{\"type\":\"bytes32\",\"name\":\"slot\",\"indexed\":false},{\"type\":\"bytes32\",\"name\":\"value\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"StateVariablesUpdated\",\"inputs\":[{\"type\":\"tuple\",\"name\":\"slotB\",\"indexed\":false,\"components\":[{\"type\":\"uint64\",\"name\":\"numBlocks\"},{\"type\":\"uint64\",\"name\":\"lastVerifiedBlockId\"},{\"type\":\"bool\",\"name\":\"provingPaused\"},{\"type\":\"uint8\",\"name\":\"__reservedB1\"},{\"type\":\"uint16\",\"name\":\"__reservedB2\"},{\"type\":\"uint32\",\"name\":\"__reservedB3\"},{\"type\":\"uint64\",\"name\":\"lastUnpausedAt\"}]}]},{\"type\":\"error\",\"name\":\"TIER_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"TT_INVALID_PARAM\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TcbInfoJsonConfigured\",\"inputs\":[{\"type\":\"string\",\"name\":\"fmspc\",\"indexed\":true},{\"type\":\"tuple\",\"name\":\"tcbInfoInput\",\"indexed\":false,\"components\":[{\"type\":\"string\",\"name\":\"pceid\"},{\"type\":\"string\",\"name\":\"fmspc\"},{\"type\":\"tuple[]\",\"name\":\"tcbLevels\",\"components\":[{\"type\":\"uint256\",\"name\":\"pcesvn\"},{\"type\":\"uint8[]\",\"name\":\"sgxTcbCompSvnArr\"},{\"type\":\"uint8\",\"name\":\"status\"}]}]}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TokenReceived\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint64\",\"name\":\"srcChainId\",\"indexed\":false},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":false},{\"type\":\"address\",\"name\":\"token\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"tokenIds\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"amounts\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TokenReceived\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint64\",\"name\":\"srcChainId\",\"indexed\":false},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":false},{\"type\":\"address\",\"name\":\"token\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"amount\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TokenReleased\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":false},{\"type\":\"address\",\"name\":\"token\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"tokenIds\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"amounts\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TokenReleased\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":false},{\"type\":\"address\",\"name\":\"token\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"amount\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TokenSent\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint64\",\"name\":\"destChainId\",\"indexed\":false},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":false},{\"type\":\"address\",\"name\":\"token\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"tokenIds\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"amounts\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TokenSent\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint64\",\"name\":\"canonicalChainId\",\"indexed\":false},{\"type\":\"uint64\",\"name\":\"destChainId\",\"indexed\":false},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":false},{\"type\":\"address\",\"name\":\"token\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"amount\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Transfer\",\"inputs\":[{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"value\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Transfer\",\"inputs\":[{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"tokenId\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TransferBatch\",\"inputs\":[{\"type\":\"address\",\"name\":\"operator\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint256[]\",\"name\":\"ids\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"values\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TransferSingle\",\"inputs\":[{\"type\":\"address\",\"name\":\"operator\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"id\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"value\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TransitionContested\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"tuple\",\"name\":\"tran\",\"indexed\":false,\"components\":[{\"type\":\"bytes32\",\"name\":\"parentHash\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"bytes32\",\"name\":\"graffiti\"}]},{\"type\":\"address\",\"name\":\"contester\",\"indexed\":false},{\"type\":\"uint96\",\"name\":\"contestBond\",\"indexed\":false},{\"type\":\"uint16\",\"name\":\"tier\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TransitionProved\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"tuple\",\"name\":\"tran\",\"indexed\":false,\"components\":[{\"type\":\"bytes32\",\"name\":\"parentHash\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"bytes32\",\"name\":\"graffiti\"}]},{\"type\":\"address\",\"name\":\"prover\",\"indexed\":false},{\"type\":\"uint96\",\"name\":\"validityBond\",\"indexed\":false},{\"type\":\"uint16\",\"name\":\"tier\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"URI\",\"inputs\":[{\"type\":\"string\",\"name\":\"value\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"id\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Unpaused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Upgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"implementation\",\"indexed\":true}]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_CERTIFICATION_CHAIN_DATA\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_CERTIFICATION_CHAIN_SIZE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_ECDSA_SIGNATURE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_QEAUTHDATA_SIZE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_QEREPORT_LENGTN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_QUOTE_LENGTN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_QUOTE_MEMBER_LENGTN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_UNSUPPORT_CERTIFICATION_TYPE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_BTOKEN_BLACKLISTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_CTOKEN_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INSUFFICIENT_FEE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INTERFACE_NOT_SUPPORTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_AMOUNT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_CTOKEN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_NEW_BTOKEN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_TOKEN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_TO_ADDR\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_LAST_MIGRATION_TOO_CLOSE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_PERMISSION_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_TOKEN_ARRAY_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_ADDRESS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_ADDR_MANAGER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_VALUE\",\"inputs\":[]},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"addInstances\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address[]\",\"name\":\"_instances\"}],\"outputs\":[{\"type\":\"uint256[]\"}]},{\"type\":\"function\",\"name\":\"addRevokedCertSerialNum\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"index\"},{\"type\":\"bytes[]\",\"name\":\"serialNumBatch\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"addressManager\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"addressRegistered\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"instanceAddress\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"alreadyAttested\"}]},{\"type\":\"function\",\"name\":\"allowance\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"owner\"},{\"type\":\"address\",\"name\":\"spender\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"approvals\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"version\"},{\"type\":\"bytes32\",\"name\":\"proofHash\"}],\"outputs\":[{\"type\":\"uint256\",\"name\":\"approvalBits\"}]},{\"type\":\"function\",\"name\":\"approve\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"spender\"},{\"type\":\"uint256\",\"name\":\"amount\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"approve\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_meta\",\"components\":[{\"type\":\"bytes32\",\"name\":\"l1Hash\"},{\"type\":\"bytes32\",\"name\":\"difficulty\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"bytes32\",\"name\":\"extraData\"},{\"type\":\"bytes32\",\"name\":\"depositsHash\"},{\"type\":\"address\",\"name\":\"coinbase\"},{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"uint64\",\"name\":\"timestamp\"},{\"type\":\"uint64\",\"name\":\"l1Height\"},{\"type\":\"uint16\",\"name\":\"minTier\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"bytes32\",\"name\":\"parentMetaHash\"},{\"type\":\"address\",\"name\":\"sender\"}]},{\"type\":\"tuple\",\"name\":\"_tran\",\"components\":[{\"type\":\"bytes32\",\"name\":\"parentHash\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"bytes32\",\"name\":\"graffiti\"}]},{\"type\":\"tuple\",\"name\":\"_proof\",\"components\":[{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[{\"type\":\"bool\",\"name\":\"approved_\"}]},{\"type\":\"function\",\"name\":\"approve\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"tokenId\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"authorize\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_addr\"},{\"type\":\"bool\",\"name\":\"_authorize\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"balanceOf\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"balanceOf\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"},{\"type\":\"uint256\",\"name\":\"id\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"balanceOfBatch\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address[]\",\"name\":\"accounts\"},{\"type\":\"uint256[]\",\"name\":\"ids\"}],\"outputs\":[{\"type\":\"uint256[]\"}]},{\"type\":\"function\",\"name\":\"batchTransfer\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address[]\",\"name\":\"recipients\"},{\"type\":\"uint256[]\",\"name\":\"amounts\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"bondBalanceOf\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_user\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"bridgedToCanonical\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"btoken\"}],\"outputs\":[{\"type\":\"uint64\",\"name\":\"chainId\"},{\"type\":\"address\",\"name\":\"addr\"},{\"type\":\"string\",\"name\":\"symbol\"},{\"type\":\"string\",\"name\":\"name\"}]},{\"type\":\"function\",\"name\":\"bridgedToCanonical\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"btoken\"}],\"outputs\":[{\"type\":\"uint64\",\"name\":\"chainId\"},{\"type\":\"address\",\"name\":\"addr\"},{\"type\":\"uint8\",\"name\":\"decimals\"},{\"type\":\"string\",\"name\":\"symbol\"},{\"type\":\"string\",\"name\":\"name\"}]},{\"type\":\"function\",\"name\":\"btokenDenylist\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"btoken\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"denied\"}]},{\"type\":\"function\",\"name\":\"burn\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_account\"},{\"type\":\"uint256\",\"name\":\"_tokenId\"},{\"type\":\"uint256\",\"name\":\"_amount\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"burn\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_account\"},{\"type\":\"uint256\",\"name\":\"_tokenId\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"burn\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"_amount\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"canonical\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"},{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"canonicalToBridged\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"chainId\"},{\"type\":\"address\",\"name\":\"ctoken\"}],\"outputs\":[{\"type\":\"address\",\"name\":\"btoken\"}]},{\"type\":\"function\",\"name\":\"changeBridgedToken\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_ctoken\",\"components\":[{\"type\":\"uint64\",\"name\":\"chainId\"},{\"type\":\"address\",\"name\":\"addr\"},{\"type\":\"uint8\",\"name\":\"decimals\"},{\"type\":\"string\",\"name\":\"symbol\"},{\"type\":\"string\",\"name\":\"name\"}]},{\"type\":\"address\",\"name\":\"_btokenNew\"}],\"outputs\":[{\"type\":\"address\",\"name\":\"btokenOld_\"}]},{\"type\":\"function\",\"name\":\"changeMigrationStatus\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_migratingAddress\"},{\"type\":\"bool\",\"name\":\"_migratingInbound\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"checkLocalEnclaveReport\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"checkpoints\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"},{\"type\":\"uint32\",\"name\":\"pos\"}],\"outputs\":[{\"type\":\"tuple\",\"components\":[{\"type\":\"uint32\",\"name\":\"fromBlock\"},{\"type\":\"uint224\",\"name\":\"votes\"}]}]},{\"type\":\"function\",\"name\":\"clock\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint48\"}]},{\"type\":\"function\",\"name\":\"configureQeIdentityJson\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"qeIdentityInput\",\"components\":[{\"type\":\"bytes4\",\"name\":\"miscselect\"},{\"type\":\"bytes4\",\"name\":\"miscselectMask\"},{\"type\":\"uint16\",\"name\":\"isvprodid\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes16\",\"name\":\"attributesMask\"},{\"type\":\"bytes32\",\"name\":\"mrsigner\"},{\"type\":\"tuple[]\",\"name\":\"tcbLevels\",\"components\":[{\"type\":\"tuple\",\"name\":\"tcb\",\"components\":[{\"type\":\"uint16\",\"name\":\"isvsvn\"}]},{\"type\":\"uint8\",\"name\":\"tcbStatus\"}]}]}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"configureTcbInfoJson\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"string\",\"name\":\"fmspc\"},{\"type\":\"tuple\",\"name\":\"tcbInfoInput\",\"components\":[{\"type\":\"string\",\"name\":\"pceid\"},{\"type\":\"string\",\"name\":\"fmspc\"},{\"type\":\"tuple[]\",\"name\":\"tcbLevels\",\"components\":[{\"type\":\"uint256\",\"name\":\"pcesvn\"},{\"type\":\"uint8[]\",\"name\":\"sgxTcbCompSvnArr\"},{\"type\":\"uint8\",\"name\":\"status\"}]}]}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"context\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"tuple\",\"name\":\"ctx_\",\"components\":[{\"type\":\"bytes32\",\"name\":\"msgHash\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"}]}]},{\"type\":\"function\",\"name\":\"decimals\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint8\"}]},{\"type\":\"function\",\"name\":\"decodeCert\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"bytes\",\"name\":\"der\"},{\"type\":\"bool\",\"name\":\"isPckCert\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"success\"},{\"type\":\"tuple\",\"name\":\"cert\",\"components\":[{\"type\":\"uint256\",\"name\":\"notBefore\"},{\"type\":\"uint256\",\"name\":\"notAfter\"},{\"type\":\"bytes\",\"name\":\"serialNumber\"},{\"type\":\"bytes\",\"name\":\"tbsCertificate\"},{\"type\":\"bytes\",\"name\":\"pubKey\"},{\"type\":\"bytes\",\"name\":\"signature\"},{\"type\":\"bool\",\"name\":\"isPck\"},{\"type\":\"tuple\",\"name\":\"pck\",\"components\":[{\"type\":\"string\",\"name\":\"commonName\"},{\"type\":\"string\",\"name\":\"issuerName\"},{\"type\":\"tuple\",\"name\":\"sgxExtension\",\"components\":[{\"type\":\"string\",\"name\":\"pceid\"},{\"type\":\"string\",\"name\":\"fmspc\"},{\"type\":\"uint256\",\"name\":\"pcesvn\"},{\"type\":\"uint256[]\",\"name\":\"sgxTcbCompSvnArr\"}]}]}]}]},{\"type\":\"function\",\"name\":\"decreaseAllowance\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"spender\"},{\"type\":\"uint256\",\"name\":\"subtractedValue\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"delegate\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"delegatee\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"delegateBySig\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"delegatee\"},{\"type\":\"uint256\",\"name\":\"nonce\"},{\"type\":\"uint256\",\"name\":\"expiry\"},{\"type\":\"uint8\",\"name\":\"v\"},{\"type\":\"bytes32\",\"name\":\"r\"},{\"type\":\"bytes32\",\"name\":\"s\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"delegates\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"deleteInstances\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256[]\",\"name\":\"_ids\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"depositBond\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"_amount\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"eip712Domain\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes1\",\"name\":\"fields\"},{\"type\":\"string\",\"name\":\"name\"},{\"type\":\"string\",\"name\":\"version\"},{\"type\":\"uint256\",\"name\":\"chainId\"},{\"type\":\"address\",\"name\":\"verifyingContract\"},{\"type\":\"bytes32\",\"name\":\"salt\"},{\"type\":\"uint256[]\",\"name\":\"extensions\"}]},{\"type\":\"function\",\"name\":\"enableProvingAutoPause\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"bool\",\"name\":\"_enable\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"enableTaikoTokenAllowance\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"bool\",\"name\":\"_enable\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"failMessage\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"getAddress\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"getApproved\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"tokenId\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"getBlock\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_blockId\"}],\"outputs\":[{\"type\":\"tuple\",\"name\":\"blk_\",\"components\":[{\"type\":\"bytes32\",\"name\":\"metaHash\"},{\"type\":\"address\",\"name\":\"assignedProver\"},{\"type\":\"uint96\",\"name\":\"livenessBond\"},{\"type\":\"uint64\",\"name\":\"blockId\"},{\"type\":\"uint64\",\"name\":\"proposedAt\"},{\"type\":\"uint64\",\"name\":\"proposedIn\"},{\"type\":\"uint32\",\"name\":\"nextTransitionId\"},{\"type\":\"uint32\",\"name\":\"verifiedTransitionId\"}]}]},{\"type\":\"function\",\"name\":\"getConfig\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"tuple\",\"components\":[{\"type\":\"uint64\",\"name\":\"chainId\"},{\"type\":\"uint64\",\"name\":\"blockMaxProposals\"},{\"type\":\"uint64\",\"name\":\"blockRingBufferSize\"},{\"type\":\"uint64\",\"name\":\"maxBlocksToVerify\"},{\"type\":\"uint32\",\"name\":\"blockMaxGasLimit\"},{\"type\":\"uint96\",\"name\":\"livenessBond\"},{\"type\":\"uint8\",\"name\":\"stateRootSyncInternal\"},{\"type\":\"bool\",\"name\":\"checkEOAForCalldataDA\"}]}]},{\"type\":\"function\",\"name\":\"getLastSyncedBlock\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\",\"name\":\"blockId_\"},{\"type\":\"bytes32\",\"name\":\"blockHash_\"},{\"type\":\"bytes32\",\"name\":\"stateRoot_\"}]},{\"type\":\"function\",\"name\":\"getLastVerifiedBlock\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\",\"name\":\"blockId_\"},{\"type\":\"bytes32\",\"name\":\"blockHash_\"},{\"type\":\"bytes32\",\"name\":\"stateRoot_\"}]},{\"type\":\"function\",\"name\":\"getMessageMinGasLimit\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"dataLength\"}],\"outputs\":[{\"type\":\"uint32\"}]},{\"type\":\"function\",\"name\":\"getMinTier\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\"}],\"outputs\":[{\"type\":\"uint16\"}]},{\"type\":\"function\",\"name\":\"getPastTotalSupply\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"timepoint\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"getPastVotes\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"},{\"type\":\"uint256\",\"name\":\"timepoint\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"getSignalSlot\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"address\",\"name\":\"_app\"},{\"type\":\"bytes32\",\"name\":\"_signal\"}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"getStateVariables\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"tuple\",\"components\":[{\"type\":\"uint64\",\"name\":\"genesisHeight\"},{\"type\":\"uint64\",\"name\":\"genesisTimestamp\"},{\"type\":\"uint64\",\"name\":\"lastSyncedBlockId\"},{\"type\":\"uint64\",\"name\":\"lastSynecdAt\"}]},{\"type\":\"tuple\",\"components\":[{\"type\":\"uint64\",\"name\":\"numBlocks\"},{\"type\":\"uint64\",\"name\":\"lastVerifiedBlockId\"},{\"type\":\"bool\",\"name\":\"provingPaused\"},{\"type\":\"uint8\",\"name\":\"__reservedB1\"},{\"type\":\"uint16\",\"name\":\"__reservedB2\"},{\"type\":\"uint32\",\"name\":\"__reservedB3\"},{\"type\":\"uint64\",\"name\":\"lastUnpausedAt\"}]}]},{\"type\":\"function\",\"name\":\"getSyncedChainData\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_kind\"},{\"type\":\"uint64\",\"name\":\"_blockId\"}],\"outputs\":[{\"type\":\"uint64\",\"name\":\"blockId_\"},{\"type\":\"bytes32\",\"name\":\"chainData_\"}]},{\"type\":\"function\",\"name\":\"getTier\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"uint16\",\"name\":\"_tierId\"}],\"outputs\":[{\"type\":\"tuple\",\"components\":[{\"type\":\"bytes32\",\"name\":\"verifierName\"},{\"type\":\"uint96\",\"name\":\"validityBond\"},{\"type\":\"uint96\",\"name\":\"contestBond\"},{\"type\":\"uint24\",\"name\":\"cooldownWindow\"},{\"type\":\"uint16\",\"name\":\"provingWindow\"},{\"type\":\"uint8\",\"name\":\"maxBlocksToVerifyPerProof\"}]}]},{\"type\":\"function\",\"name\":\"getTierIds\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint16[]\",\"name\":\"tiers_\"}]},{\"type\":\"function\",\"name\":\"getTransition\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_blockId\"},{\"type\":\"uint32\",\"name\":\"_tid\"}],\"outputs\":[{\"type\":\"tuple\",\"components\":[{\"type\":\"bytes32\",\"name\":\"key\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"address\",\"name\":\"prover\"},{\"type\":\"uint96\",\"name\":\"validityBond\"},{\"type\":\"address\",\"name\":\"contester\"},{\"type\":\"uint96\",\"name\":\"contestBond\"},{\"type\":\"uint64\",\"name\":\"timestamp\"},{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"uint8\",\"name\":\"__reserved1\"}]}]},{\"type\":\"function\",\"name\":\"getTransition\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_blockId\"},{\"type\":\"bytes32\",\"name\":\"_parentHash\"}],\"outputs\":[{\"type\":\"tuple\",\"components\":[{\"type\":\"bytes32\",\"name\":\"key\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"address\",\"name\":\"prover\"},{\"type\":\"uint96\",\"name\":\"validityBond\"},{\"type\":\"address\",\"name\":\"contester\"},{\"type\":\"uint96\",\"name\":\"contestBond\"},{\"type\":\"uint64\",\"name\":\"timestamp\"},{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"uint8\",\"name\":\"__reserved1\"}]}]},{\"type\":\"function\",\"name\":\"getVerifiedBlockProver\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_blockId\"}],\"outputs\":[{\"type\":\"address\",\"name\":\"prover_\"}]},{\"type\":\"function\",\"name\":\"getVotes\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"guardianIds\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"guardian\"}],\"outputs\":[{\"type\":\"uint256\",\"name\":\"id\"}]},{\"type\":\"function\",\"name\":\"guardians\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"hashAssignment\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_assignment\",\"components\":[{\"type\":\"address\",\"name\":\"feeToken\"},{\"type\":\"uint64\",\"name\":\"expiry\"},{\"type\":\"uint64\",\"name\":\"maxBlockId\"},{\"type\":\"uint64\",\"name\":\"maxProposedIn\"},{\"type\":\"bytes32\",\"name\":\"metaHash\"},{\"type\":\"bytes32\",\"name\":\"parentMetaHash\"},{\"type\":\"tuple[]\",\"name\":\"tierFees\",\"components\":[{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"uint128\",\"name\":\"fee\"}]},{\"type\":\"bytes\",\"name\":\"signature\"}]},{\"type\":\"address\",\"name\":\"_taikoL1Address\"},{\"type\":\"address\",\"name\":\"_blockProposer\"},{\"type\":\"address\",\"name\":\"_assignedProver\"},{\"type\":\"bytes32\",\"name\":\"_blobHash\"}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"hashMessage\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"impl\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"inNonReentrant\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"increaseAllowance\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"spender\"},{\"type\":\"uint256\",\"name\":\"addedValue\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"},{\"type\":\"address\",\"name\":\"_addressManager\"},{\"type\":\"bytes32\",\"name\":\"_genesisBlockHash\"},{\"type\":\"bool\",\"name\":\"_toPause\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"},{\"type\":\"address\",\"name\":\"_addressManager\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"},{\"type\":\"address\",\"name\":\"_addressManager\"},{\"type\":\"address\",\"name\":\"_srcToken\"},{\"type\":\"uint256\",\"name\":\"_srcChainId\"},{\"type\":\"string\",\"name\":\"_symbol\"},{\"type\":\"string\",\"name\":\"_name\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"owner\"},{\"type\":\"address\",\"name\":\"sigVerifyLibAddr\"},{\"type\":\"address\",\"name\":\"pemCertLibAddr\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"},{\"type\":\"address\",\"name\":\"_addressManager\"},{\"type\":\"address\",\"name\":\"_srcToken\"},{\"type\":\"uint256\",\"name\":\"_srcChainId\"},{\"type\":\"uint8\",\"name\":\"_decimals\"},{\"type\":\"string\",\"name\":\"_symbol\"},{\"type\":\"string\",\"name\":\"_name\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init2\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"instances\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"instanceId\"}],\"outputs\":[{\"type\":\"address\",\"name\":\"addr\"},{\"type\":\"uint64\",\"name\":\"validSince\"}]},{\"type\":\"function\",\"name\":\"isApprovedForAll\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"},{\"type\":\"address\",\"name\":\"operator\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"isAuthorized\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"addr\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"authorized\"}]},{\"type\":\"function\",\"name\":\"isChainDataSynced\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_kind\"},{\"type\":\"uint64\",\"name\":\"_blockId\"},{\"type\":\"bytes32\",\"name\":\"_chainData\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"isDestChainEnabled\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"enabled_\"},{\"type\":\"address\",\"name\":\"destBridge_\"}]},{\"type\":\"function\",\"name\":\"isMessageFailed\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"bytes\",\"name\":\"_proof\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"isMessageReceived\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"bytes\",\"name\":\"_proof\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"isMessageSent\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"isSignalSent\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_app\"},{\"type\":\"bytes32\",\"name\":\"_signal\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"lastMigrationStart\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"chainId\"},{\"type\":\"address\",\"name\":\"ctoken\"}],\"outputs\":[{\"type\":\"uint256\",\"name\":\"timestamp\"}]},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"latestProofHash\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"version\"},{\"type\":\"uint256\",\"name\":\"blockId\"}],\"outputs\":[{\"type\":\"bytes32\",\"name\":\"hash\"}]},{\"type\":\"function\",\"name\":\"messageStatus\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\"}],\"outputs\":[{\"type\":\"uint8\",\"name\":\"status\"}]},{\"type\":\"function\",\"name\":\"migratingAddress\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"migratingInbound\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"minGuardians\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint32\"}]},{\"type\":\"function\",\"name\":\"mint\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_to\"},{\"type\":\"uint256\",\"name\":\"_tokenId\"},{\"type\":\"uint256\",\"name\":\"_amount\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"mint\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_account\"},{\"type\":\"uint256\",\"name\":\"_tokenId\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"mintBatch\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_to\"},{\"type\":\"uint256[]\",\"name\":\"_tokenIds\"},{\"type\":\"uint256[]\",\"name\":\"_amounts\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"name\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"name\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"string\"}]},{\"type\":\"function\",\"name\":\"nextInstanceId\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"nextMessageId\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"nonces\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"owner\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"numCheckpoints\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"}],\"outputs\":[{\"type\":\"uint32\"}]},{\"type\":\"function\",\"name\":\"numGuardians\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"onBlockProposed\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_blk\",\"components\":[{\"type\":\"bytes32\",\"name\":\"metaHash\"},{\"type\":\"address\",\"name\":\"assignedProver\"},{\"type\":\"uint96\",\"name\":\"livenessBond\"},{\"type\":\"uint64\",\"name\":\"blockId\"},{\"type\":\"uint64\",\"name\":\"proposedAt\"},{\"type\":\"uint64\",\"name\":\"proposedIn\"},{\"type\":\"uint32\",\"name\":\"nextTransitionId\"},{\"type\":\"uint32\",\"name\":\"verifiedTransitionId\"}]},{\"type\":\"tuple\",\"name\":\"_meta\",\"components\":[{\"type\":\"bytes32\",\"name\":\"l1Hash\"},{\"type\":\"bytes32\",\"name\":\"difficulty\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"bytes32\",\"name\":\"extraData\"},{\"type\":\"bytes32\",\"name\":\"depositsHash\"},{\"type\":\"address\",\"name\":\"coinbase\"},{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"uint64\",\"name\":\"timestamp\"},{\"type\":\"uint64\",\"name\":\"l1Height\"},{\"type\":\"uint16\",\"name\":\"minTier\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"bytes32\",\"name\":\"parentMetaHash\"},{\"type\":\"address\",\"name\":\"sender\"}]},{\"type\":\"bytes\",\"name\":\"_data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"onERC1155BatchReceived\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"address\"},{\"type\":\"address\"},{\"type\":\"uint256[]\"},{\"type\":\"uint256[]\"},{\"type\":\"bytes\"}],\"outputs\":[{\"type\":\"bytes4\"}]},{\"type\":\"function\",\"name\":\"onERC1155Received\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"address\"},{\"type\":\"address\"},{\"type\":\"uint256\"},{\"type\":\"uint256\"},{\"type\":\"bytes\"}],\"outputs\":[{\"type\":\"bytes4\"}]},{\"type\":\"function\",\"name\":\"onERC721Received\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"address\"},{\"type\":\"address\"},{\"type\":\"uint256\"},{\"type\":\"bytes\"}],\"outputs\":[{\"type\":\"bytes4\"}]},{\"type\":\"function\",\"name\":\"onMessageInvocation\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"bytes\",\"name\":\"_data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"onMessageRecalled\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"bytes32\",\"name\":\"_msgHash\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"owner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"ownerOf\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"tokenId\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"pause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"pauseProving\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"bool\",\"name\":\"_pause\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"pauseTaikoProving\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"paused\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"pemCertLib\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"pendingOwner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"permit\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"owner\"},{\"type\":\"address\",\"name\":\"spender\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"uint256\",\"name\":\"deadline\"},{\"type\":\"uint8\",\"name\":\"v\"},{\"type\":\"bytes32\",\"name\":\"r\"},{\"type\":\"bytes32\",\"name\":\"s\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"processMessage\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"bytes\",\"name\":\"_proof\"}],\"outputs\":[{\"type\":\"uint8\",\"name\":\"status_\"},{\"type\":\"uint8\",\"name\":\"reason_\"}]},{\"type\":\"function\",\"name\":\"proposeBlock\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"bytes\",\"name\":\"_params\"},{\"type\":\"bytes\",\"name\":\"_txList\"}],\"outputs\":[{\"type\":\"tuple\",\"name\":\"meta_\",\"components\":[{\"type\":\"bytes32\",\"name\":\"l1Hash\"},{\"type\":\"bytes32\",\"name\":\"difficulty\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"bytes32\",\"name\":\"extraData\"},{\"type\":\"bytes32\",\"name\":\"depositsHash\"},{\"type\":\"address\",\"name\":\"coinbase\"},{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"uint64\",\"name\":\"timestamp\"},{\"type\":\"uint64\",\"name\":\"l1Height\"},{\"type\":\"uint16\",\"name\":\"minTier\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"bytes32\",\"name\":\"parentMetaHash\"},{\"type\":\"address\",\"name\":\"sender\"}]},{\"type\":\"tuple[]\",\"name\":\"deposits_\",\"components\":[{\"type\":\"address\",\"name\":\"recipient\"},{\"type\":\"uint96\",\"name\":\"amount\"},{\"type\":\"uint64\",\"name\":\"id\"}]}]},{\"type\":\"function\",\"name\":\"proveBlock\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_blockId\"},{\"type\":\"bytes\",\"name\":\"_input\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"proveSignalReceived\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"address\",\"name\":\"_app\"},{\"type\":\"bytes32\",\"name\":\"_signal\"},{\"type\":\"bytes\",\"name\":\"_proof\"}],\"outputs\":[{\"type\":\"uint256\",\"name\":\"numCacheOps_\"}]},{\"type\":\"function\",\"name\":\"provingAutoPauseEnabled\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"qeIdentity\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes4\",\"name\":\"miscselect\"},{\"type\":\"bytes4\",\"name\":\"miscselectMask\"},{\"type\":\"uint16\",\"name\":\"isvprodid\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes16\",\"name\":\"attributesMask\"},{\"type\":\"bytes32\",\"name\":\"mrsigner\"}]},{\"type\":\"function\",\"name\":\"recallMessage\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"bytes\",\"name\":\"_proof\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"registerInstance\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_attestation\",\"components\":[{\"type\":\"tuple\",\"name\":\"header\",\"components\":[{\"type\":\"bytes2\",\"name\":\"version\"},{\"type\":\"bytes2\",\"name\":\"attestationKeyType\"},{\"type\":\"bytes4\",\"name\":\"teeType\"},{\"type\":\"bytes2\",\"name\":\"qeSvn\"},{\"type\":\"bytes2\",\"name\":\"pceSvn\"},{\"type\":\"bytes16\",\"name\":\"qeVendorId\"},{\"type\":\"bytes20\",\"name\":\"userData\"}]},{\"type\":\"tuple\",\"name\":\"localEnclaveReport\",\"components\":[{\"type\":\"bytes16\",\"name\":\"cpuSvn\"},{\"type\":\"bytes4\",\"name\":\"miscSelect\"},{\"type\":\"bytes28\",\"name\":\"reserved1\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes32\",\"name\":\"mrEnclave\"},{\"type\":\"bytes32\",\"name\":\"reserved2\"},{\"type\":\"bytes32\",\"name\":\"mrSigner\"},{\"type\":\"bytes\",\"name\":\"reserved3\"},{\"type\":\"uint16\",\"name\":\"isvProdId\"},{\"type\":\"uint16\",\"name\":\"isvSvn\"},{\"type\":\"bytes\",\"name\":\"reserved4\"},{\"type\":\"bytes\",\"name\":\"reportData\"}]},{\"type\":\"tuple\",\"name\":\"v3AuthData\",\"components\":[{\"type\":\"bytes\",\"name\":\"ecdsa256BitSignature\"},{\"type\":\"bytes\",\"name\":\"ecdsaAttestationKey\"},{\"type\":\"tuple\",\"name\":\"pckSignedQeReport\",\"components\":[{\"type\":\"bytes16\",\"name\":\"cpuSvn\"},{\"type\":\"bytes4\",\"name\":\"miscSelect\"},{\"type\":\"bytes28\",\"name\":\"reserved1\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes32\",\"name\":\"mrEnclave\"},{\"type\":\"bytes32\",\"name\":\"reserved2\"},{\"type\":\"bytes32\",\"name\":\"mrSigner\"},{\"type\":\"bytes\",\"name\":\"reserved3\"},{\"type\":\"uint16\",\"name\":\"isvProdId\"},{\"type\":\"uint16\",\"name\":\"isvSvn\"},{\"type\":\"bytes\",\"name\":\"reserved4\"},{\"type\":\"bytes\",\"name\":\"reportData\"}]},{\"type\":\"bytes\",\"name\":\"qeReportSignature\"},{\"type\":\"tuple\",\"name\":\"qeAuthData\",\"components\":[{\"type\":\"uint16\",\"name\":\"parsedDataSize\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"tuple\",\"name\":\"certification\",\"components\":[{\"type\":\"uint16\",\"name\":\"certType\"},{\"type\":\"uint32\",\"name\":\"certDataSize\"},{\"type\":\"bytes[3]\",\"name\":\"decodedCertDataArray\"}]}]}]}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"removeRevokedCertSerialNum\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"index\"},{\"type\":\"bytes[]\",\"name\":\"serialNumBatch\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"resolve\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"bool\",\"name\":\"_allowZeroAddress\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"resolve\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"bool\",\"name\":\"_allowZeroAddress\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"retryMessage\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"bool\",\"name\":\"_isLastAttempt\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"safeBatchTransferFrom\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256[]\",\"name\":\"ids\"},{\"type\":\"uint256[]\",\"name\":\"amounts\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"safeTransferFrom\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"id\"},{\"type\":\"uint256\",\"name\":\"amount\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"safeTransferFrom\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"tokenId\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"safeTransferFrom\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"tokenId\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"selfDelegate\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_anyToken\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"sendMessage\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash_\"},{\"type\":\"tuple\",\"name\":\"message_\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}]},{\"type\":\"function\",\"name\":\"sendSignal\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"_signal\"}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"sendToken\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_op\",\"components\":[{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"address\",\"name\":\"token\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"uint256[]\",\"name\":\"tokenIds\"},{\"type\":\"uint256[]\",\"name\":\"amounts\"}]}],\"outputs\":[{\"type\":\"tuple\",\"name\":\"message_\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}]},{\"type\":\"function\",\"name\":\"sendToken\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_op\",\"components\":[{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"address\",\"name\":\"token\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"uint256\",\"name\":\"amount\"}]}],\"outputs\":[{\"type\":\"tuple\",\"name\":\"message_\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}]},{\"type\":\"function\",\"name\":\"serialNumIsRevoked\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"idx\"},{\"type\":\"bytes\",\"name\":\"serialNum\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"revoked\"}]},{\"type\":\"function\",\"name\":\"setAddress\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"address\",\"name\":\"_newAddress\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"setApprovalForAll\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"operator\"},{\"type\":\"bool\",\"name\":\"approved\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"setGuardians\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address[]\",\"name\":\"_newGuardians\"},{\"type\":\"uint8\",\"name\":\"_minGuardians\"},{\"type\":\"bool\",\"name\":\"_clearData\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"setMrEnclave\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"_mrEnclave\"},{\"type\":\"bool\",\"name\":\"_trusted\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"setMrSigner\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"_mrSigner\"},{\"type\":\"bool\",\"name\":\"_trusted\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"sigVerifyLib\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"signalForChainData\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_kind\"},{\"type\":\"uint64\",\"name\":\"_blockId\"}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"signalForFailedMessage\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"_msgHash\"}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"source\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"},{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"splitCertificateChain\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"bytes\",\"name\":\"pemChain\"},{\"type\":\"uint256\",\"name\":\"size\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"success\"},{\"type\":\"bytes[]\",\"name\":\"certs\"}]},{\"type\":\"function\",\"name\":\"srcChainId\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"srcToken\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"state\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\",\"name\":\"__reserve1\"},{\"type\":\"tuple\",\"name\":\"slotA\",\"components\":[{\"type\":\"uint64\",\"name\":\"genesisHeight\"},{\"type\":\"uint64\",\"name\":\"genesisTimestamp\"},{\"type\":\"uint64\",\"name\":\"lastSyncedBlockId\"},{\"type\":\"uint64\",\"name\":\"lastSynecdAt\"}]},{\"type\":\"tuple\",\"name\":\"slotB\",\"components\":[{\"type\":\"uint64\",\"name\":\"numBlocks\"},{\"type\":\"uint64\",\"name\":\"lastVerifiedBlockId\"},{\"type\":\"bool\",\"name\":\"provingPaused\"},{\"type\":\"uint8\",\"name\":\"__reservedB1\"},{\"type\":\"uint16\",\"name\":\"__reservedB2\"},{\"type\":\"uint32\",\"name\":\"__reservedB3\"},{\"type\":\"uint64\",\"name\":\"lastUnpausedAt\"}]}]},{\"type\":\"function\",\"name\":\"supportsInterface\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes4\",\"name\":\"_interfaceId\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"symbol\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"string\"}]},{\"type\":\"function\",\"name\":\"symbol\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"string\"}]},{\"type\":\"function\",\"name\":\"syncChainData\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_kind\"},{\"type\":\"uint64\",\"name\":\"_blockId\"},{\"type\":\"bytes32\",\"name\":\"_chainData\"}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"tcbInfo\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"string\",\"name\":\"fmspc\"}],\"outputs\":[{\"type\":\"string\",\"name\":\"pceid\"},{\"type\":\"string\",\"name\":\"fmspc\"}]},{\"type\":\"function\",\"name\":\"toggleLocalReportCheck\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"tokenURI\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"_tokenId\"}],\"outputs\":[{\"type\":\"string\"}]},{\"type\":\"function\",\"name\":\"topBlockId\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"chainId\"},{\"type\":\"bytes32\",\"name\":\"kind\"}],\"outputs\":[{\"type\":\"uint64\",\"name\":\"blockId\"}]},{\"type\":\"function\",\"name\":\"totalSupply\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"transfer\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"amount\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"transferFrom\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"amount\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"transferFrom\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"tokenId\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"transferOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newOwner\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"trustedUserMrEnclave\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"enclave\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"trusted\"}]},{\"type\":\"function\",\"name\":\"trustedUserMrSigner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"signer\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"trusted\"}]},{\"type\":\"function\",\"name\":\"unpause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeTo\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"uri\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\"}],\"outputs\":[{\"type\":\"string\"}]},{\"type\":\"function\",\"name\":\"verifyAttestation\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"success\"}]},{\"type\":\"function\",\"name\":\"verifyBlocks\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_maxBlocksToVerify\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"verifyES256Signature\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes\",\"name\":\"tbs\"},{\"type\":\"bytes\",\"name\":\"signature\"},{\"type\":\"bytes\",\"name\":\"publicKey\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"sigValid\"}]},{\"type\":\"function\",\"name\":\"verifyParsedQuote\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"v3quote\",\"components\":[{\"type\":\"tuple\",\"name\":\"header\",\"components\":[{\"type\":\"bytes2\",\"name\":\"version\"},{\"type\":\"bytes2\",\"name\":\"attestationKeyType\"},{\"type\":\"bytes4\",\"name\":\"teeType\"},{\"type\":\"bytes2\",\"name\":\"qeSvn\"},{\"type\":\"bytes2\",\"name\":\"pceSvn\"},{\"type\":\"bytes16\",\"name\":\"qeVendorId\"},{\"type\":\"bytes20\",\"name\":\"userData\"}]},{\"type\":\"tuple\",\"name\":\"localEnclaveReport\",\"components\":[{\"type\":\"bytes16\",\"name\":\"cpuSvn\"},{\"type\":\"bytes4\",\"name\":\"miscSelect\"},{\"type\":\"bytes28\",\"name\":\"reserved1\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes32\",\"name\":\"mrEnclave\"},{\"type\":\"bytes32\",\"name\":\"reserved2\"},{\"type\":\"bytes32\",\"name\":\"mrSigner\"},{\"type\":\"bytes\",\"name\":\"reserved3\"},{\"type\":\"uint16\",\"name\":\"isvProdId\"},{\"type\":\"uint16\",\"name\":\"isvSvn\"},{\"type\":\"bytes\",\"name\":\"reserved4\"},{\"type\":\"bytes\",\"name\":\"reportData\"}]},{\"type\":\"tuple\",\"name\":\"v3AuthData\",\"components\":[{\"type\":\"bytes\",\"name\":\"ecdsa256BitSignature\"},{\"type\":\"bytes\",\"name\":\"ecdsaAttestationKey\"},{\"type\":\"tuple\",\"name\":\"pckSignedQeReport\",\"components\":[{\"type\":\"bytes16\",\"name\":\"cpuSvn\"},{\"type\":\"bytes4\",\"name\":\"miscSelect\"},{\"type\":\"bytes28\",\"name\":\"reserved1\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes32\",\"name\":\"mrEnclave\"},{\"type\":\"bytes32\",\"name\":\"reserved2\"},{\"type\":\"bytes32\",\"name\":\"mrSigner\"},{\"type\":\"bytes\",\"name\":\"reserved3\"},{\"type\":\"uint16\",\"name\":\"isvProdId\"},{\"type\":\"uint16\",\"name\":\"isvSvn\"},{\"type\":\"bytes\",\"name\":\"reserved4\"},{\"type\":\"bytes\",\"name\":\"reportData\"}]},{\"type\":\"bytes\",\"name\":\"qeReportSignature\"},{\"type\":\"tuple\",\"name\":\"qeAuthData\",\"components\":[{\"type\":\"uint16\",\"name\":\"parsedDataSize\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"tuple\",\"name\":\"certification\",\"components\":[{\"type\":\"uint16\",\"name\":\"certType\"},{\"type\":\"uint32\",\"name\":\"certDataSize\"},{\"type\":\"bytes[3]\",\"name\":\"decodedCertDataArray\"}]}]}]}],\"outputs\":[{\"type\":\"bool\"},{\"type\":\"bytes\"}]},{\"type\":\"function\",\"name\":\"verifyProof\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_ctx\",\"components\":[{\"type\":\"bytes32\",\"name\":\"metaHash\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"address\",\"name\":\"prover\"},{\"type\":\"uint64\",\"name\":\"blockId\"},{\"type\":\"bool\",\"name\":\"isContesting\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"address\",\"name\":\"msgSender\"}]},{\"type\":\"tuple\",\"components\":[{\"type\":\"bytes32\",\"name\":\"parentHash\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"bytes32\",\"name\":\"graffiti\"}]},{\"type\":\"tuple\",\"components\":[{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"verifyProof\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_ctx\",\"components\":[{\"type\":\"bytes32\",\"name\":\"metaHash\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"address\",\"name\":\"prover\"},{\"type\":\"uint64\",\"name\":\"blockId\"},{\"type\":\"bool\",\"name\":\"isContesting\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"address\",\"name\":\"msgSender\"}]},{\"type\":\"tuple\",\"name\":\"_tran\",\"components\":[{\"type\":\"bytes32\",\"name\":\"parentHash\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"bytes32\",\"name\":\"graffiti\"}]},{\"type\":\"tuple\",\"name\":\"_proof\",\"components\":[{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"verifySignalReceived\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"address\",\"name\":\"_app\"},{\"type\":\"bytes32\",\"name\":\"_signal\"},{\"type\":\"bytes\",\"name\":\"_proof\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"version\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint32\"}]},{\"type\":\"function\",\"name\":\"withdrawBond\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"_amount\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"withdrawTaikoToken\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_to\"},{\"type\":\"uint256\",\"name\":\"_amount\"}],\"outputs\":[]},{\"type\":\"constructor\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"es256Verifier\"}]}]","addresses":["0x02772b7B3a5Bea0141C993Dbb8D0733C19F46169","0x06a9Ab27c7e2255df1815E6CC0168d7755Feb19a","0x0b470dd3A0e1C41228856Fb319649E7c08f419Aa","0x10dea67478c5F8C5E2D90e5E9B26dBe60c54d800","0x11A9ebA17EbF92b40fcf9a640Ebbc47Db6fBeab0","0x33879cDF01121dc7bCe011b461e64d791aE931F2","0x39E4C1214e733639d059979079A151911e42791d","0x47bB416ee947fE4a4b655011aF7d6E3A1B80E6e9","0x537a2f0D3a5879b41BCb5A2afE2EA5c4961796F6","0x579A8d63a2Db646284CBFE31FE5082c9989E985c","0x579f40D0BE111b823962043702cabe6Aaa290780","0x67281b15aee4d6b805bc755e439abd524dd8da8d","0x8d7C954960a36a7596d7eA4945dDf891967ca8A3","0x996282cA11E5DEb6B5D122CC3B9A1FcAAD4415Ab","0x9e0a24964e5397B566c1ed39258e21aB5E35C77C","0xE3D777143Ea25A6E031d1e921F396750885f43aC","0xEf9EaA1dd30a9AA1df01c36411b5F082aA65fBaa","0xa25e645ff9897b0282e5f17d36de5bca4ec21d6e","0xaf145913EA4a56BE22E120ED9C24589659881702","0xb0f3186FC1963f774f52ff455DC86aEdD0b31F81","0xc4096E9ff1526Bd1840B65e9f45695135aC12De7","0xcc5d488073FA918cBbd73B9A523F3858C4de7372","0xd60247c6848B7Ca29eDdF63AA924E53dB6Ddd8EC"]}],"createdAt":"2024-08-27T09:44:01.744Z","subscriberId":"d1b49dd5-72bd-480e-b5d7-649ce0aadd09","name":"TaikoL1: Pause/Unpause","network":"mainnet","riskCategory":"ACCESS-CONTROL","monitorId":"d1b49dd5-72bd-480e-b5d7-649ce0aadd09","blockWatcherId":"mainnet-6","paused":false,"stackResourceId":"mystack.taiko-l-1-pause-unpause","type":"BLOCK"},{"skipABIValidation":false,"alertThreshold":null,"notifyConfig":{"severityLevel":"LOW","messageBody":"**Defender Monitor {{ sentinel.name }} Triggered**\n\n**Network**\n\n{{ sentinel.network }}\n\n**Block Hash**\n\n{{ blockHash }}\n\n**Transaction Hash**\n\n{{ transaction.transactionHash }}\n\n**Explorer Link**\n\n{{ transaction.link }}\n\n{{ matchReasonsFormatted }}","messageSubject":"Defender Monitor: Taiko Mainnet SGX Prover triggered","notifications":[{"type":"discord","sendCount":0,"notificationId":"93e8dbf2-4f87-4793-b3c3-6ff0dd6cf827"}],"timeoutMs":0},"tenantId":"0691b59e-8b53-4ae2-b874-959de8a9f2ee","addressRules":[{"conditions":[{"txConditions":[{"status":"any","expression":"status == \"failed\""}],"functionConditions":[],"eventConditions":[{"eventSignature":"InstanceAdded(uint256,address,address,uint256)","expression":null}]},{"txConditions":[{"status":"any","expression":"status == \"failed\""}],"functionConditions":[],"eventConditions":[{"eventSignature":"InstanceDeleted(uint256,address)","expression":null}]},{"txConditions":[{"status":"any","expression":"status == \"failed\""}],"functionConditions":[{"functionSignature":"verifyProof((bytes32,bytes32,address,uint64,bool,bool,address),(bytes32,bytes32,bytes32,bytes32),(uint16,bytes))","expression":null}],"eventConditions":[]}],"abi":"[{\"type\":\"event\",\"anonymous\":false,\"name\":\"AdminChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousAdmin\",\"indexed\":false},{\"type\":\"address\",\"name\":\"newAdmin\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BeaconUpgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"beacon\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Initialized\",\"inputs\":[{\"type\":\"uint8\",\"name\":\"version\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"InstanceAdded\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"id\",\"indexed\":true},{\"type\":\"address\",\"name\":\"instance\",\"indexed\":true},{\"type\":\"address\",\"name\":\"replaced\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"validSince\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"InstanceDeleted\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"id\",\"indexed\":true},{\"type\":\"address\",\"name\":\"instance\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferred\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Paused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Unpaused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Upgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"implementation\",\"indexed\":true}]},{\"type\":\"function\",\"name\":\"INSTANCE_EXPIRY\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"INSTANCE_VALIDITY_DELAY\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"addInstances\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address[]\",\"name\":\"_instances\"}],\"outputs\":[{\"type\":\"uint256[]\"}]},{\"type\":\"function\",\"name\":\"addressManager\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"addressRegistered\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"instanceAddress\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"alreadyAttested\"}]},{\"type\":\"function\",\"name\":\"deleteInstances\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256[]\",\"name\":\"_ids\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"},{\"type\":\"address\",\"name\":\"_addressManager\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"instances\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"instanceId\"}],\"outputs\":[{\"type\":\"address\",\"name\":\"addr\"},{\"type\":\"uint64\",\"name\":\"validSince\"}]},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"nextInstanceId\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"owner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"pause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"paused\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"pendingOwner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"registerInstance\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_attestation\",\"components\":[{\"type\":\"tuple\",\"name\":\"header\",\"components\":[{\"type\":\"bytes2\",\"name\":\"version\"},{\"type\":\"bytes2\",\"name\":\"attestationKeyType\"},{\"type\":\"bytes4\",\"name\":\"teeType\"},{\"type\":\"bytes2\",\"name\":\"qeSvn\"},{\"type\":\"bytes2\",\"name\":\"pceSvn\"},{\"type\":\"bytes16\",\"name\":\"qeVendorId\"},{\"type\":\"bytes20\",\"name\":\"userData\"}]},{\"type\":\"tuple\",\"name\":\"localEnclaveReport\",\"components\":[{\"type\":\"bytes16\",\"name\":\"cpuSvn\"},{\"type\":\"bytes4\",\"name\":\"miscSelect\"},{\"type\":\"bytes28\",\"name\":\"reserved1\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes32\",\"name\":\"mrEnclave\"},{\"type\":\"bytes32\",\"name\":\"reserved2\"},{\"type\":\"bytes32\",\"name\":\"mrSigner\"},{\"type\":\"bytes\",\"name\":\"reserved3\"},{\"type\":\"uint16\",\"name\":\"isvProdId\"},{\"type\":\"uint16\",\"name\":\"isvSvn\"},{\"type\":\"bytes\",\"name\":\"reserved4\"},{\"type\":\"bytes\",\"name\":\"reportData\"}]},{\"type\":\"tuple\",\"name\":\"v3AuthData\",\"components\":[{\"type\":\"bytes\",\"name\":\"ecdsa256BitSignature\"},{\"type\":\"bytes\",\"name\":\"ecdsaAttestationKey\"},{\"type\":\"tuple\",\"name\":\"pckSignedQeReport\",\"components\":[{\"type\":\"bytes16\",\"name\":\"cpuSvn\"},{\"type\":\"bytes4\",\"name\":\"miscSelect\"},{\"type\":\"bytes28\",\"name\":\"reserved1\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes32\",\"name\":\"mrEnclave\"},{\"type\":\"bytes32\",\"name\":\"reserved2\"},{\"type\":\"bytes32\",\"name\":\"mrSigner\"},{\"type\":\"bytes\",\"name\":\"reserved3\"},{\"type\":\"uint16\",\"name\":\"isvProdId\"},{\"type\":\"uint16\",\"name\":\"isvSvn\"},{\"type\":\"bytes\",\"name\":\"reserved4\"},{\"type\":\"bytes\",\"name\":\"reportData\"}]},{\"type\":\"bytes\",\"name\":\"qeReportSignature\"},{\"type\":\"tuple\",\"name\":\"qeAuthData\",\"components\":[{\"type\":\"uint16\",\"name\":\"parsedDataSize\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"tuple\",\"name\":\"certification\",\"components\":[{\"type\":\"uint16\",\"name\":\"certType\"},{\"type\":\"uint32\",\"name\":\"certDataSize\"},{\"type\":\"bytes[3]\",\"name\":\"decodedCertDataArray\"}]}]}]}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"resolve\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"bool\",\"name\":\"_allowZeroAddress\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"transferOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newOwner\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"unpause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeTo\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"verifyProof\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_ctx\",\"components\":[{\"type\":\"bytes32\",\"name\":\"metaHash\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"address\",\"name\":\"prover\"},{\"type\":\"uint64\",\"name\":\"blockId\"},{\"type\":\"bool\",\"name\":\"isContesting\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"address\",\"name\":\"msgSender\"}]},{\"type\":\"tuple\",\"name\":\"_tran\",\"components\":[{\"type\":\"bytes32\",\"name\":\"parentHash\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"bytes32\",\"name\":\"graffiti\"}]},{\"type\":\"tuple\",\"name\":\"_proof\",\"components\":[{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[]}]","addresses":["0xb0f3186FC1963f774f52ff455DC86aEdD0b31F81"]}],"createdAt":"2024-05-02T14:09:42.804Z","subscriberId":"d49a2a9b-268d-4d30-9553-ec55ed952d87","name":"Taiko Mainnet SGX Prover","network":"mainnet","riskCategory":"TECHNICAL","monitorId":"d49a2a9b-268d-4d30-9553-ec55ed952d87","blockWatcherId":"mainnet-1","paused":false,"stackResourceId":"mystack.taiko-mainnet-sgx-prover","type":"BLOCK"},{"skipABIValidation":false,"alertThreshold":null,"notifyConfig":{"severityLevel":"HIGH","messageBody":"**Defender Monitor {{ sentinel.name }} Triggered**\n\n**Network**\n\n{{ sentinel.network }}\n\n**Block Hash**\n\n{{ blockHash }}\n\n**Transaction Hash**\n\n{{ transaction.transactionHash }}\n\n**Explorer Link**\n\n{{ transaction.link }}\n\n{{ matchReasonsFormatted }}","messageSubject":"Defender Monitor: Taiko Mainnet Address Managers triggered","notifications":[{"type":"discord","sendCount":0,"notificationId":"93e8dbf2-4f87-4793-b3c3-6ff0dd6cf827"}],"timeoutMs":0},"tenantId":"0691b59e-8b53-4ae2-b874-959de8a9f2ee","addressRules":[{"conditions":[{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"AddressSet(uint64,bytes32,address,address)","expression":null}]}],"abi":"[{\"type\":\"event\",\"anonymous\":false,\"name\":\"AddressSet\",\"inputs\":[{\"type\":\"uint64\",\"name\":\"chainId\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"name\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newAddress\",\"indexed\":false},{\"type\":\"address\",\"name\":\"oldAddress\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"AdminChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousAdmin\",\"indexed\":false},{\"type\":\"address\",\"name\":\"newAdmin\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BeaconUpgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"beacon\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Initialized\",\"inputs\":[{\"type\":\"uint8\",\"name\":\"version\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferred\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Paused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Unpaused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Upgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"implementation\",\"indexed\":true}]},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"addressManager\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"getAddress\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"owner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"pause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"paused\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"pendingOwner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"resolve\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"bool\",\"name\":\"_allowZeroAddress\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"setAddress\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"address\",\"name\":\"_newAddress\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"transferOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newOwner\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"unpause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeTo\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]}]","addresses":["0xEf9EaA1dd30a9AA1df01c36411b5F082aA65fBaa","0x579f40D0BE111b823962043702cabe6Aaa290780"]}],"createdAt":"2024-05-02T14:00:18.874Z","subscriberId":"3919cb83-487f-4432-88fa-33bbe4361fce","name":"Taiko Mainnet Address Managers","network":"mainnet","riskCategory":"ACCESS-CONTROL","monitorId":"3919cb83-487f-4432-88fa-33bbe4361fce","blockWatcherId":"mainnet-1","paused":false,"stackResourceId":"mystack.taiko-mainnet-address-managers","type":"BLOCK"},{"skipABIValidation":false,"alertThreshold":null,"notifyConfig":{"severityLevel":"HIGH","messageBody":"**Defender Monitor {{ sentinel.name }} Triggered**\n\n**Network**\n\n{{ sentinel.network }}\n\n**Block Hash**\n\n{{ blockHash }}\n\n**Transaction Hash**\n\n{{ transaction.transactionHash }}\n\n**Explorer Link**\n\n{{ transaction.link }}\n\n{{ matchReasonsFormatted }}","messageSubject":"Defender Monitor: Taiko Mainnet Essential Contracts triggered","notifications":[{"type":"discord","sendCount":0,"notificationId":"93e8dbf2-4f87-4793-b3c3-6ff0dd6cf827"}],"timeoutMs":0},"tenantId":"0691b59e-8b53-4ae2-b874-959de8a9f2ee","addressRules":[{"conditions":[{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"AdminChanged(address,address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"BeaconUpgraded(address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"Initialized(uint8)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"OwnershipTransferStarted(address,address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"OwnershipTransferred(address,address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"Paused(address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"Unpaused(address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"Upgraded(address)","expression":null}]}],"abi":"[{\"type\":\"event\",\"anonymous\":false,\"name\":\"AdminChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousAdmin\",\"indexed\":false},{\"type\":\"address\",\"name\":\"newAdmin\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BeaconUpgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"beacon\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Initialized\",\"inputs\":[{\"type\":\"uint8\",\"name\":\"version\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferred\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Paused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Unpaused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Upgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"implementation\",\"indexed\":true}]},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"addressManager\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"owner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"pause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"paused\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"pendingOwner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"resolve\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"bool\",\"name\":\"_allowZeroAddress\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"transferOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newOwner\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"unpause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeTo\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]}]","addresses":["0xEf9EaA1dd30a9AA1df01c36411b5F082aA65fBaa","0x10dea67478c5F8C5E2D90e5E9B26dBe60c54d800","0x9e0a24964e5397B566c1ed39258e21aB5E35C77C","0xd60247c6848B7Ca29eDdF63AA924E53dB6Ddd8EC","0x996282cA11E5DEb6B5D122CC3B9A1FcAAD4415Ab","0x0b470dd3A0e1C41228856Fb319649E7c08f419Aa","0x0b470dd3A0e1C41228856Fb319649E7c08f419Aa","0xaf145913EA4a56BE22E120ED9C24589659881702","0x579f40D0BE111b823962043702cabe6Aaa290780","0x06a9Ab27c7e2255df1815E6CC0168d7755Feb19a","0x537a2f0D3a5879b41BCb5A2afE2EA5c4961796F6","0x33879cDF01121dc7bCe011b461e64d791aE931F2","0xb0f3186FC1963f774f52ff455DC86aEdD0b31F81","0x579A8d63a2Db646284CBFE31FE5082c9989E985c","0xE3D777143Ea25A6E031d1e921F396750885f43aC","0x8d7C954960a36a7596d7eA4945dDf891967ca8A3"]}],"createdAt":"2024-05-02T13:49:54.192Z","subscriberId":"67a53521-3d4a-4de4-92ab-ede82cc45644","name":"Taiko Mainnet Essential Contracts","network":"mainnet","riskCategory":"ACCESS-CONTROL","monitorId":"67a53521-3d4a-4de4-92ab-ede82cc45644","blockWatcherId":"mainnet-1","paused":false,"stackResourceId":"mystack.taiko-mainnet-essential-contracts","type":"BLOCK"}]},"actions":{"removed":[],"created":[],"updated":[{"autotaskId":"86964fd3-3da8-4501-a572-cbf51045f861","actionId":"86964fd3-3da8-4501-a572-cbf51045f861","name":"ERC20Vault: Balance Drop Test","paused":false,"trigger":{"cron":null,"frequencyMinutes":15,"type":"schedule"},"codeDigest":"+Y75bpyOzEuCm0y95ZczKkySm4PgLyQQt6ASpaB08Lk=","stackResourceId":"mystack.erc-20-vault-balance-drop","runtime":"nodejs20.x","dependenciesVersion":"v2024-08-21","encodedZippedCode":"UEsDBAoAAAAAAAAAQVASVlLscBMAAHATAAAIAAAAaW5kZXguanNjb25zdCB7IGV0aGVycyB9ID0gcmVxdWlyZSgiZXRoZXJzIik7CmNvbnN0IHsgRGVmZW5kZXIgfSA9IHJlcXVpcmUoIkBvcGVuemVwcGVsaW4vZGVmZW5kZXItc2RrIik7Cgpjb25zdCBFUkMyMF9BQkkgPSBbCiAgewogICAgY29uc3RhbnQ6IHRydWUsCiAgICBpbnB1dHM6IFt7IG5hbWU6ICJfb3duZXIiLCB0eXBlOiAiYWRkcmVzcyIgfV0sCiAgICBuYW1lOiAiYmFsYW5jZU9mIiwKICAgIG91dHB1dHM6IFt7IG5hbWU6ICJiYWxhbmNlIiwgdHlwZTogInVpbnQyNTYiIH1dLAogICAgcGF5YWJsZTogZmFsc2UsCiAgICBzdGF0ZU11dGFiaWxpdHk6ICJ2aWV3IiwKICAgIHR5cGU6ICJmdW5jdGlvbiIsCiAgfSwKXTsKCmFzeW5jIGZ1bmN0aW9uIGdldEVSQzIwQmFsYW5jZShwcm92aWRlciwgdG9rZW5BZGRyZXNzLCB2YXVsdEFkZHJlc3MpIHsKICBjb25zdCBjb250cmFjdCA9IG5ldyBldGhlcnMuQ29udHJhY3QodG9rZW5BZGRyZXNzLCBFUkMyMF9BQkksIHByb3ZpZGVyKTsKICByZXR1cm4gYXdhaXQgY29udHJhY3QuYmFsYW5jZU9mKHZhdWx0QWRkcmVzcyk7Cn0KCmFzeW5jIGZ1bmN0aW9uIGdldE5hdGl2ZVRva2VuQmFsYW5jZShwcm92aWRlciwgdmF1bHRBZGRyZXNzKSB7CiAgcmV0dXJuIGF3YWl0IHByb3ZpZGVyLmdldEJhbGFuY2UodmF1bHRBZGRyZXNzKTsKfQoKYXN5bmMgZnVuY3Rpb24gbW9uaXRvclRva2VuQmFsYW5jZSgKICBwcm92aWRlciwKICB0b2tlbkFkZHJlc3MsCiAgdmF1bHRBZGRyZXNzLAogIHByZXZpb3VzQmFsYW5jZUtleSwKICBub3RpZmljYXRpb25DbGllbnQsCiAgc2VjcmV0cywKICBjbGllbnQsCiAgdG9rZW5OYW1lLAogIG5ldHdvcmtOYW1lLAopIHsKICBjb25zb2xlLmxvZyhgTW9uaXRvcmluZyAke3Rva2VuTmFtZX0gYmFsYW5jZSBvbiAke25ldHdvcmtOYW1lfWApOwogIGNvbnN0IHByZXZpb3VzQmFsYW5jZSA9IGV0aGVycy5CaWdOdW1iZXIuZnJvbSgKICAgIHNlY3JldHNbcHJldmlvdXNCYWxhbmNlS2V5XSB8fCAiMCIsCiAgKTsKICBjb25zb2xlLmxvZygKICAgIGBQcmV2aW91cyAke3Rva2VuTmFtZX0gQmFsYW5jZTogJHtldGhlcnMudXRpbHMuZm9ybWF0VW5pdHMoCiAgICAgIHByZXZpb3VzQmFsYW5jZSwKICAgICAgMTgsCiAgICApfWAsCiAgKTsKCiAgbGV0IGN1cnJlbnRCYWxhbmNlOwogIGlmICh0b2tlbk5hbWUgPT09ICJFVEgiKSB7CiAgICBjdXJyZW50QmFsYW5jZSA9IGF3YWl0IGdldE5hdGl2ZVRva2VuQmFsYW5jZShwcm92aWRlciwgdmF1bHRBZGRyZXNzKTsKICB9IGVsc2UgewogICAgY3VycmVudEJhbGFuY2UgPSBhd2FpdCBnZXRFUkMyMEJhbGFuY2UoCiAgICAgIHByb3ZpZGVyLAogICAgICB0b2tlbkFkZHJlc3MsCiAgICAgIHZhdWx0QWRkcmVzcywKICAgICk7CiAgfQogIGNvbnNvbGUubG9nKAogICAgYEN1cnJlbnQgJHt0b2tlbk5hbWV9IEJhbGFuY2U6ICR7ZXRoZXJzLnV0aWxzLmZvcm1hdFVuaXRzKAogICAgICBjdXJyZW50QmFsYW5jZSwKICAgICAgMTgsCiAgICApfWAsCiAgKTsKCiAgaWYgKCFwcmV2aW91c0JhbGFuY2UuaXNaZXJvKCkpIHsKICAgIGNvbnN0IGRyb3BQZXJjZW50YWdlID0gcHJldmlvdXNCYWxhbmNlCiAgICAgIC5zdWIoY3VycmVudEJhbGFuY2UpCiAgICAgIC5tdWwoMTAwKQogICAgICAuZGl2KHByZXZpb3VzQmFsYW5jZSkKICAgICAgLnRvTnVtYmVyKCk7CiAgICBjb25zb2xlLmxvZygKICAgICAgYENhbGN1bGF0ZWQgZHJvcCBwZXJjZW50YWdlIGZvciAke3Rva2VuTmFtZX06ICR7ZHJvcFBlcmNlbnRhZ2V9JWAsCiAgICApOwoKICAgIGlmIChkcm9wUGVyY2VudGFnZSA+PSA1KSB7CiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBgQWxlcnQ6ICR7dG9rZW5OYW1lfSBiYWxhbmNlIGhhcyBkcm9wcGVkIGJ5ICR7ZHJvcFBlcmNlbnRhZ2V9JSBvbiAke25ldHdvcmtOYW1lfS5cblByZXZpb3VzIEJhbGFuY2U6ICR7ZXRoZXJzLnV0aWxzLmZvcm1hdFVuaXRzKAogICAgICAgIHByZXZpb3VzQmFsYW5jZSwKICAgICAgICAxOCwKICAgICAgKX1cbkN1cnJlbnQgQmFsYW5jZTogJHtldGhlcnMudXRpbHMuZm9ybWF0VW5pdHMoY3VycmVudEJhbGFuY2UsIDE4KX1gOwogICAgICBhbGVydE9yZygKICAgICAgICBub3RpZmljYXRpb25DbGllbnQsCiAgICAgICAgYOKaoO+4jyAke25ldHdvcmtOYW1lfTogJHt0b2tlbk5hbWV9IEJhbGFuY2UgRHJvcCBBbGVydGAsCiAgICAgICAgbWVzc2FnZSwKICAgICAgKTsKICAgIH0gZWxzZSB7CiAgICAgIGNvbnNvbGUubG9nKAogICAgICAgIGBObyBzaWduaWZpY2FudCAke3Rva2VuTmFtZX0gYmFsYW5jZSBkcm9wIGRldGVjdGVkIG9uICR7bmV0d29ya05hbWV9YCwKICAgICAgKTsKICAgIH0KICB9IGVsc2UgewogICAgY29uc29sZS5sb2coCiAgICAgIGBObyBwcmV2aW91cyAke3Rva2VuTmFtZX0gYmFsYW5jZSB0byBjb21wYXJlIG9uICR7bmV0d29ya05hbWV9YCwKICAgICk7CiAgfQoKICBhd2FpdCBzdG9yZVByZXZpb3VzQmFsYW5jZShjbGllbnQsIHByZXZpb3VzQmFsYW5jZUtleSwgY3VycmVudEJhbGFuY2UpOwp9CgpmdW5jdGlvbiBhbGVydE9yZyhub3RpZmljYXRpb25DbGllbnQsIHN1YmplY3QsIG1lc3NhZ2UpIHsKICBub3RpZmljYXRpb25DbGllbnQuc2VuZCh7CiAgICBjaGFubmVsQWxpYXM6ICJkaXNjb3JkX2JyaWRnaW5nIiwKICAgIHN1YmplY3QsCiAgICBtZXNzYWdlLAogIH0pOwp9Cgphc3luYyBmdW5jdGlvbiBzdG9yZVByZXZpb3VzQmFsYW5jZShjbGllbnQsIGtleSwgbmV3QmFsYW5jZSkgewogIGNvbnNvbGUubG9nKAogICAgYFN0b3JpbmcgcHJldmlvdXMgYmFsYW5jZSB1bmRlciBrZXk6ICR7a2V5fSwgdmFsdWU6ICR7bmV3QmFsYW5jZS50b1N0cmluZygpfWAsCiAgKTsKICBjb25zdCBib2R5ID0gewogICAgZGVsZXRlczogW10sCiAgICBzZWNyZXRzOiB7CiAgICAgIFtrZXldOiBuZXdCYWxhbmNlLnRvU3RyaW5nKCksCiAgICB9LAogIH07CiAgYXdhaXQgY2xpZW50LmFjdGlvbi5jcmVhdGVTZWNyZXRzKGJvZHkpOwp9CgpmdW5jdGlvbiBjcmVhdGVQcm92aWRlcihhcGlLZXksIGFwaVNlY3JldCwgcmVsYXllckFwaUtleSwgcmVsYXllckFwaVNlY3JldCkgewogIGNvbnNvbGUubG9nKGBDcmVhdGluZyBwcm92aWRlciB3aXRoIEFQSSBrZXlzYCk7CiAgY29uc3QgY2xpZW50ID0gbmV3IERlZmVuZGVyKHsKICAgIGFwaUtleSwKICAgIGFwaVNlY3JldCwKICAgIHJlbGF5ZXJBcGlLZXksCiAgICByZWxheWVyQXBpU2VjcmV0LAogIH0pOwoKICByZXR1cm4gY2xpZW50LnJlbGF5U2lnbmVyLmdldFByb3ZpZGVyKCk7Cn0KCmV4cG9ydHMuaGFuZGxlciA9IGFzeW5jIGZ1bmN0aW9uIChldmVudCwgY29udGV4dCkgewogIGNvbnN0IHsgbm90aWZpY2F0aW9uQ2xpZW50IH0gPSBjb250ZXh0OwogIGNvbnN0IHsgYXBpS2V5LCBhcGlTZWNyZXQsIHRhaWtvTDFBcGlLZXksIHRhaWtvTDFBcGlTZWNyZXQgfSA9IGV2ZW50LnNlY3JldHM7CgogIGNvbnNvbGUubG9nKGBTdGFydGluZyBiYWxhbmNlIG1vbml0b3JpbmcgZm9yIEwxYCk7CgogIGNvbnN0IGwxUHJvdmlkZXIgPSBjcmVhdGVQcm92aWRlcigKICAgIGFwaUtleSwKICAgIGFwaVNlY3JldCwKICAgIHRhaWtvTDFBcGlLZXksCiAgICB0YWlrb0wxQXBpU2VjcmV0LAogICk7CgogIGNvbnN0IGwxVmF1bHRBZGRyZXNzID0gIjB4OTk2MjgyY0ExMUU1REViNkI1RDEyMkNDM0I5QTFGY0FBRDQ0MTVBYiI7CgogIGNvbnN0IGwxVG9rZW5BZGRyZXNzZXMgPSB7CiAgICBFVEg6IG51bGwsCiAgICBUQUlLTzogZXRoZXJzLnV0aWxzLmdldEFkZHJlc3MoCiAgICAgICIweDEwZGVhNjc0NzhjNUY4QzVFMkQ5MGU1RTlCMjZkQmU2MGM1NGQ4MDAiLAogICAgKSwKICAgIFVTREM6IGV0aGVycy51dGlscy5nZXRBZGRyZXNzKCIweEEwYjg2OTkxYzYyMThiMzZjMWQxOUQ0YTJlOUViMGNFMzYwNmVCNDgiKSwKICAgIFVTRFQ6IGV0aGVycy51dGlscy5nZXRBZGRyZXNzKCIweGRBQzE3Rjk1OEQyZWU1MjNhMjIwNjIwNjk5NDU5N0MxM0Q4MzFlYzciKSwKICB9OwoKICBjb25zdCBjbGllbnQgPSBuZXcgRGVmZW5kZXIoewogICAgYXBpS2V5LAogICAgYXBpU2VjcmV0LAogICAgdGFpa29MMUFwaUtleSwKICAgIHRhaWtvTDFBcGlTZWNyZXQsCiAgfSk7CgogIGF3YWl0IG1vbml0b3JUb2tlbkJhbGFuY2UoCiAgICBsMVByb3ZpZGVyLAogICAgbDFUb2tlbkFkZHJlc3Nlcy5FVEgsCiAgICBsMVZhdWx0QWRkcmVzcywKICAgICJwcmV2aW91c0JhbGFuY2VfTDFfRVRIIiwKICAgIG5vdGlmaWNhdGlvbkNsaWVudCwKICAgIGV2ZW50LnNlY3JldHMsCiAgICBjbGllbnQsCiAgICAiRVRIIiwKICAgICJMMSIsCiAgKTsKICBhd2FpdCBtb25pdG9yVG9rZW5CYWxhbmNlKAogICAgbDFQcm92aWRlciwKICAgIGwxVG9rZW5BZGRyZXNzZXMuVEFJS08sCiAgICBsMVZhdWx0QWRkcmVzcywKICAgICJwcmV2aW91c0JhbGFuY2VfTDFfVEFJS08iLAogICAgbm90aWZpY2F0aW9uQ2xpZW50LAogICAgZXZlbnQuc2VjcmV0cywKICAgIGNsaWVudCwKICAgICJUQUlLTyIsCiAgICAiTDEiLAogICk7CiAgYXdhaXQgbW9uaXRvclRva2VuQmFsYW5jZSgKICAgIGwxUHJvdmlkZXIsCiAgICBsMVRva2VuQWRkcmVzc2VzLlVTREMsCiAgICBsMVZhdWx0QWRkcmVzcywKICAgICJwcmV2aW91c0JhbGFuY2VfTDFfVVNEQyIsCiAgICBub3RpZmljYXRpb25DbGllbnQsCiAgICBldmVudC5zZWNyZXRzLAogICAgY2xpZW50LAogICAgIlVTREMiLAogICAgIkwxIiwKICApOwogIGF3YWl0IG1vbml0b3JUb2tlbkJhbGFuY2UoCiAgICBsMVByb3ZpZGVyLAogICAgbDFUb2tlbkFkZHJlc3Nlcy5VU0RULAogICAgbDFWYXVsdEFkZHJlc3MsCiAgICAicHJldmlvdXNCYWxhbmNlX0wxX1VTRFQiLAogICAgbm90aWZpY2F0aW9uQ2xpZW50LAogICAgZXZlbnQuc2VjcmV0cywKICAgIGNsaWVudCwKICAgICJVU0RUIiwKICAgICJMMSIsCiAgKTsKCiAgY29uc29sZS5sb2coYEJhbGFuY2UgbW9uaXRvcmluZyBjb21wbGV0ZWRgKTsKCiAgcmV0dXJuIHRydWU7Cn07ClBLAQIUAAoAAAAAAAAAQVASVlLscBMAAHATAAAIAAAAAAAAAAAAAAAAAAAAAABpbmRleC5qc1BLBQYAAAAAAQABADYAAACWEwAAAAA="}]},"contracts":{"removed":[],"created":[],"updated":[]},"relayers":{"removed":[],"created":[],"updated":[],"relayerKeys":{"removed":[],"created":[],"updated":[]}},"notifications":{"removed":[],"created":[],"updated":[{"notificationId":"93e8dbf2-4f87-4793-b3c3-6ff0dd6cf827","type":"discord","name":"discord_bridging","paused":false,"config":{"url":"https://discord.com/api/webhooks/1079966997816811520/RdYRjk74nbjEPb44tKFGAgYqDRSmmk2BAmShGkpnmm6QpK-21n-Avw5TnVEaJ1CWhE0s"},"stackResourceId":"mystack.discord-bridging"}]},"secrets":{"removed":[],"created":[],"updated":[]},"blockExplorerApiKeys":{"removed":[],"created":[],"updated":[]},"forkedNetworks":{"removed":[],"created":[],"updated":[]},"privateNetworks":{"removed":[],"created":[],"updated":[]}} +{"stack":"mystack","timestamp":"2024-09-20T10:05:14.785Z","monitors":{"removed":[],"created":[],"updated":[{"skipABIValidation":true,"alertThreshold":null,"notifyConfig":{"severityLevel":"MEDIUM","messageBody":"**Defender Monitor {{ sentinel.name }} Triggered**\n\n**Network**\n\n{{ sentinel.network }}\n\n**Block Hash**\n\n{{ blockHash }}\n\n**Transaction Hash**\n\n{{ transaction.transactionHash }}\n\n**Explorer Link**\n\n{{ transaction.link }}\n\n**Match Reasons**\n\n{{ matchReasonsFormatted }}\n\n**Metadata**\n\n{{ metadataFormatted }}","messageSubject":"Defender Monitor: TaikoL1: Pause/Unpause triggered","notifications":[{"type":"discord","sendCount":0,"notificationId":"93e8dbf2-4f87-4793-b3c3-6ff0dd6cf827"}],"timeoutMs":60000},"tenantId":"0691b59e-8b53-4ae2-b874-959de8a9f2ee","addressRules":[{"conditions":[{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"Paused(address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"Unpaused(address)","expression":null}]}],"abi":"[{\"type\":\"error\",\"name\":\"AM_ADDRESS_ALREADY_SET\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"AddressSet\",\"inputs\":[{\"type\":\"uint64\",\"name\":\"chainId\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"name\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newAddress\",\"indexed\":false},{\"type\":\"address\",\"name\":\"oldAddress\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"AdminChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousAdmin\",\"indexed\":false},{\"type\":\"address\",\"name\":\"newAdmin\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Approval\",\"inputs\":[{\"type\":\"address\",\"name\":\"owner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"spender\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"value\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Approval\",\"inputs\":[{\"type\":\"address\",\"name\":\"owner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"approved\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"tokenId\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"ApprovalForAll\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":true},{\"type\":\"address\",\"name\":\"operator\",\"indexed\":true},{\"type\":\"bool\",\"name\":\"approved\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Approved\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"operationId\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"approvalBits\",\"indexed\":false},{\"type\":\"bool\",\"name\":\"minGuardiansReached\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Authorized\",\"inputs\":[{\"type\":\"address\",\"name\":\"addr\",\"indexed\":true},{\"type\":\"bool\",\"name\":\"authorized\",\"indexed\":false}]},{\"type\":\"error\",\"name\":\"BB_INVALID_PARAMS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BB_MINT_DISALLOWED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BB_PERMISSION_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BTOKEN_CANNOT_RECEIVE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BTOKEN_INVALID_BURN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BTOKEN_INVALID_PARAMS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INSUFFICIENT_GAS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_CONTEXT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_FEE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_GAS_LIMIT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_VALUE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_MESSAGE_NOT_SENT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_OUT_OF_ETH_QUOTA\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_PERMISSION_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_PROOF_TOO_LARGE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_RETRY_FAILED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_SIGNAL_NOT_RECEIVED\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BeaconUpgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"beacon\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BlockProposed\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"address\",\"name\":\"assignedProver\",\"indexed\":true},{\"type\":\"uint96\",\"name\":\"livenessBond\",\"indexed\":false},{\"type\":\"tuple\",\"name\":\"meta\",\"indexed\":false,\"components\":[{\"type\":\"bytes32\",\"name\":\"l1Hash\"},{\"type\":\"bytes32\",\"name\":\"difficulty\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"bytes32\",\"name\":\"extraData\"},{\"type\":\"bytes32\",\"name\":\"depositsHash\"},{\"type\":\"address\",\"name\":\"coinbase\"},{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"uint64\",\"name\":\"timestamp\"},{\"type\":\"uint64\",\"name\":\"l1Height\"},{\"type\":\"uint16\",\"name\":\"minTier\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"bytes32\",\"name\":\"parentMetaHash\"},{\"type\":\"address\",\"name\":\"sender\"}]},{\"type\":\"tuple[]\",\"name\":\"depositsProcessed\",\"indexed\":false,\"components\":[{\"type\":\"address\",\"name\":\"recipient\"},{\"type\":\"uint96\",\"name\":\"amount\"},{\"type\":\"uint64\",\"name\":\"id\"}]}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BlockVerified\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"address\",\"name\":\"prover\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"blockHash\",\"indexed\":false},{\"type\":\"bytes32\",\"name\":\"stateRoot\",\"indexed\":false},{\"type\":\"uint16\",\"name\":\"tier\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BondCredited\",\"inputs\":[{\"type\":\"address\",\"name\":\"user\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"amount\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BondDebited\",\"inputs\":[{\"type\":\"address\",\"name\":\"user\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"amount\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BridgedTokenChanged\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"srcChainId\",\"indexed\":true},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":true},{\"type\":\"address\",\"name\":\"btokenOld\",\"indexed\":false},{\"type\":\"address\",\"name\":\"btokenNew\",\"indexed\":false},{\"type\":\"string\",\"name\":\"ctokenSymbol\",\"indexed\":false},{\"type\":\"string\",\"name\":\"ctokenName\",\"indexed\":false},{\"type\":\"uint8\",\"name\":\"ctokenDecimal\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BridgedTokenDeployed\",\"inputs\":[{\"type\":\"uint64\",\"name\":\"chainId\",\"indexed\":true},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":true},{\"type\":\"address\",\"name\":\"btoken\",\"indexed\":true},{\"type\":\"string\",\"name\":\"ctokenSymbol\",\"indexed\":false},{\"type\":\"string\",\"name\":\"ctokenName\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BridgedTokenDeployed\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"srcChainId\",\"indexed\":true},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":true},{\"type\":\"address\",\"name\":\"btoken\",\"indexed\":true},{\"type\":\"string\",\"name\":\"ctokenSymbol\",\"indexed\":false},{\"type\":\"string\",\"name\":\"ctokenName\",\"indexed\":false},{\"type\":\"uint8\",\"name\":\"ctokenDecimal\",\"indexed\":false}]},{\"type\":\"function\",\"name\":\"CLOCK_MODE\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"string\"}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"CalldataTxList\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"bytes\",\"name\":\"txList\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"ChainDataSynced\",\"inputs\":[{\"type\":\"uint64\",\"name\":\"chainId\",\"indexed\":true},{\"type\":\"uint64\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"kind\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"data\",\"indexed\":false},{\"type\":\"bytes32\",\"name\":\"signal\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"ConflictingProofs\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"address\",\"name\":\"guardian\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"currentProofHash\",\"indexed\":false},{\"type\":\"bytes32\",\"name\":\"newProofHash\",\"indexed\":false},{\"type\":\"bool\",\"name\":\"provingPaused\",\"indexed\":false}]},{\"type\":\"function\",\"name\":\"DOMAIN_SEPARATOR\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"DelegateChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"delegator\",\"indexed\":true},{\"type\":\"address\",\"name\":\"fromDelegate\",\"indexed\":true},{\"type\":\"address\",\"name\":\"toDelegate\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"DelegateVotesChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"delegate\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"previousBalance\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"newBalance\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"EIP712DomainChanged\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ETH_TRANSFER_FAILED\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"EtherPaymentFailed\",\"inputs\":[{\"type\":\"address\",\"name\":\"to\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"maxGas\",\"indexed\":false}]},{\"type\":\"error\",\"name\":\"FUNC_NOT_IMPLEMENTED\",\"inputs\":[]},{\"type\":\"function\",\"name\":\"GAS_OVERHEAD\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint32\"}]},{\"type\":\"function\",\"name\":\"GAS_RESERVE\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"GP_INVALID_GUARDIAN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GP_INVALID_GUARDIAN_SET\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GP_INVALID_MIN_GUARDIANS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GP_INVALID_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GV_PERMISSION_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GV_ZERO_ADDRESS\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"GuardianApproval\",\"inputs\":[{\"type\":\"address\",\"name\":\"addr\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"blockHash\",\"indexed\":true},{\"type\":\"bool\",\"name\":\"approved\",\"indexed\":false},{\"type\":\"bytes\",\"name\":\"proofData\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"GuardiansUpdated\",\"inputs\":[{\"type\":\"uint32\",\"name\":\"version\",\"indexed\":false},{\"type\":\"address[]\",\"name\":\"guardians\",\"indexed\":false}]},{\"type\":\"error\",\"name\":\"HOOK_ASSIGNMENT_EXPIRED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"HOOK_ASSIGNMENT_INVALID_SIG\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"HOOK_TIER_NOT_FOUND\",\"inputs\":[]},{\"type\":\"function\",\"name\":\"INSTANCE_EXPIRY\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"INSTANCE_VALIDITY_DELAY\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Initialized\",\"inputs\":[{\"type\":\"uint8\",\"name\":\"version\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"InstanceAdded\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"id\",\"indexed\":true},{\"type\":\"address\",\"name\":\"instance\",\"indexed\":true},{\"type\":\"address\",\"name\":\"replaced\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"validSince\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"InstanceDeleted\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"id\",\"indexed\":true},{\"type\":\"address\",\"name\":\"instance\",\"indexed\":true}]},{\"type\":\"error\",\"name\":\"L1_ALREADY_CONTESTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_ALREADY_PROVED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOB_NOT_AVAILABLE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOB_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOCK_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_CANNOT_CONTEST\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_BLOCK_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_GENESIS_HASH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_SIG\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_TIER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_TRANSITION\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_NOT_ASSIGNED_PROVER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_PROVING_PAUSED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_RECEIVE_DISABLED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TOO_MANY_BLOCKS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TRANSITION_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNEXPECTED_PARENT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNEXPECTED_TRANSITION_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"LTP_INVALID_ACCOUNT_PROOF\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"LTP_INVALID_INCLUSION_PROOF\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"LocalReportCheckToggled\",\"inputs\":[{\"type\":\"bool\",\"name\":\"checkLocalEnclaveReport\",\"indexed\":false}]},{\"type\":\"function\",\"name\":\"MAX_GAS_PAYING_PROVER\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"MIN_MIGRATION_DELAY\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MessageProcessed\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"tuple\",\"name\":\"message\",\"indexed\":false,\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"tuple\",\"name\":\"stats\",\"indexed\":false,\"components\":[{\"type\":\"uint32\",\"name\":\"gasUsedInFeeCalc\"},{\"type\":\"uint32\",\"name\":\"proofSize\"},{\"type\":\"uint32\",\"name\":\"numCacheOps\"},{\"type\":\"bool\",\"name\":\"processedByRelayer\"}]}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MessageSent\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"tuple\",\"name\":\"message\",\"indexed\":false,\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MessageStatusChanged\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"uint8\",\"name\":\"status\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MigratedTo\",\"inputs\":[{\"type\":\"address\",\"name\":\"fromToken\",\"indexed\":true},{\"type\":\"address\",\"name\":\"account\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"amount\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MigrationStatusChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"addr\",\"indexed\":false},{\"type\":\"bool\",\"name\":\"inbound\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MrEnclaveUpdated\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"mrEnclave\",\"indexed\":true},{\"type\":\"bool\",\"name\":\"trusted\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MrSignerUpdated\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"mrSigner\",\"indexed\":true},{\"type\":\"bool\",\"name\":\"trusted\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferred\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Paused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"ProvingAutoPauseEnabled\",\"inputs\":[{\"type\":\"bool\",\"name\":\"enabled\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"ProvingPaused\",\"inputs\":[{\"type\":\"bool\",\"name\":\"paused\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"QeIdentityConfigured\",\"inputs\":[{\"type\":\"tuple\",\"name\":\"qeIdentityInput\",\"indexed\":false,\"components\":[{\"type\":\"bytes4\",\"name\":\"miscselect\"},{\"type\":\"bytes4\",\"name\":\"miscselectMask\"},{\"type\":\"uint16\",\"name\":\"isvprodid\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes16\",\"name\":\"attributesMask\"},{\"type\":\"bytes32\",\"name\":\"mrsigner\"},{\"type\":\"tuple[]\",\"name\":\"tcbLevels\",\"components\":[{\"type\":\"tuple\",\"name\":\"tcb\",\"components\":[{\"type\":\"uint16\",\"name\":\"isvsvn\"}]},{\"type\":\"uint8\",\"name\":\"tcbStatus\"}]}]}]},{\"type\":\"error\",\"name\":\"REENTRANT_CALL\",\"inputs\":[]},{\"type\":\"function\",\"name\":\"RELAYER_MAX_PROOF_BYTES\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"RESOLVER_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_INVALID_MANAGER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_UNEXPECTED_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_ZERO_ADDR\",\"inputs\":[{\"type\":\"uint64\",\"name\":\"chainId\"},{\"type\":\"bytes32\",\"name\":\"name\"}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"RevokedCertSerialNumAdded\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"index\",\"indexed\":true},{\"type\":\"bytes\",\"name\":\"serialNum\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"RevokedCertSerialNumRemoved\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"index\",\"indexed\":true},{\"type\":\"bytes\",\"name\":\"serialNum\",\"indexed\":false}]},{\"type\":\"error\",\"name\":\"SGX_ALREADY_ATTESTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SGX_INVALID_ATTESTATION\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SGX_INVALID_INSTANCE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SGX_INVALID_PROOF\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SGX_RA_NOT_SUPPORTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_EMPTY_PROOF\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_INVALID_HOPS_WITH_LOOP\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_INVALID_LAST_HOP_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_INVALID_MID_HOP_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_INVALID_STATE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_SIGNAL_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_UNAUTHORIZED\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"SignalSent\",\"inputs\":[{\"type\":\"address\",\"name\":\"app\",\"indexed\":false},{\"type\":\"bytes32\",\"name\":\"signal\",\"indexed\":false},{\"type\":\"bytes32\",\"name\":\"slot\",\"indexed\":false},{\"type\":\"bytes32\",\"name\":\"value\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"StateVariablesUpdated\",\"inputs\":[{\"type\":\"tuple\",\"name\":\"slotB\",\"indexed\":false,\"components\":[{\"type\":\"uint64\",\"name\":\"numBlocks\"},{\"type\":\"uint64\",\"name\":\"lastVerifiedBlockId\"},{\"type\":\"bool\",\"name\":\"provingPaused\"},{\"type\":\"uint8\",\"name\":\"__reservedB1\"},{\"type\":\"uint16\",\"name\":\"__reservedB2\"},{\"type\":\"uint32\",\"name\":\"__reservedB3\"},{\"type\":\"uint64\",\"name\":\"lastUnpausedAt\"}]}]},{\"type\":\"error\",\"name\":\"TIER_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"TT_INVALID_PARAM\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TcbInfoJsonConfigured\",\"inputs\":[{\"type\":\"string\",\"name\":\"fmspc\",\"indexed\":true},{\"type\":\"tuple\",\"name\":\"tcbInfoInput\",\"indexed\":false,\"components\":[{\"type\":\"string\",\"name\":\"pceid\"},{\"type\":\"string\",\"name\":\"fmspc\"},{\"type\":\"tuple[]\",\"name\":\"tcbLevels\",\"components\":[{\"type\":\"uint256\",\"name\":\"pcesvn\"},{\"type\":\"uint8[]\",\"name\":\"sgxTcbCompSvnArr\"},{\"type\":\"uint8\",\"name\":\"status\"}]}]}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TokenReceived\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint64\",\"name\":\"srcChainId\",\"indexed\":false},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":false},{\"type\":\"address\",\"name\":\"token\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"tokenIds\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"amounts\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TokenReceived\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint64\",\"name\":\"srcChainId\",\"indexed\":false},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":false},{\"type\":\"address\",\"name\":\"token\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"amount\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TokenReleased\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":false},{\"type\":\"address\",\"name\":\"token\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"tokenIds\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"amounts\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TokenReleased\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":false},{\"type\":\"address\",\"name\":\"token\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"amount\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TokenSent\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint64\",\"name\":\"destChainId\",\"indexed\":false},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":false},{\"type\":\"address\",\"name\":\"token\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"tokenIds\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"amounts\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TokenSent\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint64\",\"name\":\"canonicalChainId\",\"indexed\":false},{\"type\":\"uint64\",\"name\":\"destChainId\",\"indexed\":false},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":false},{\"type\":\"address\",\"name\":\"token\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"amount\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Transfer\",\"inputs\":[{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"value\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Transfer\",\"inputs\":[{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"tokenId\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TransferBatch\",\"inputs\":[{\"type\":\"address\",\"name\":\"operator\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint256[]\",\"name\":\"ids\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"values\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TransferSingle\",\"inputs\":[{\"type\":\"address\",\"name\":\"operator\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"id\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"value\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TransitionContested\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"tuple\",\"name\":\"tran\",\"indexed\":false,\"components\":[{\"type\":\"bytes32\",\"name\":\"parentHash\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"bytes32\",\"name\":\"graffiti\"}]},{\"type\":\"address\",\"name\":\"contester\",\"indexed\":false},{\"type\":\"uint96\",\"name\":\"contestBond\",\"indexed\":false},{\"type\":\"uint16\",\"name\":\"tier\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TransitionProved\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"tuple\",\"name\":\"tran\",\"indexed\":false,\"components\":[{\"type\":\"bytes32\",\"name\":\"parentHash\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"bytes32\",\"name\":\"graffiti\"}]},{\"type\":\"address\",\"name\":\"prover\",\"indexed\":false},{\"type\":\"uint96\",\"name\":\"validityBond\",\"indexed\":false},{\"type\":\"uint16\",\"name\":\"tier\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"URI\",\"inputs\":[{\"type\":\"string\",\"name\":\"value\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"id\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Unpaused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Upgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"implementation\",\"indexed\":true}]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_CERTIFICATION_CHAIN_DATA\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_CERTIFICATION_CHAIN_SIZE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_ECDSA_SIGNATURE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_QEAUTHDATA_SIZE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_QEREPORT_LENGTN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_QUOTE_LENGTN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_QUOTE_MEMBER_LENGTN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_UNSUPPORT_CERTIFICATION_TYPE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_BTOKEN_BLACKLISTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_CTOKEN_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INSUFFICIENT_FEE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INTERFACE_NOT_SUPPORTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_AMOUNT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_CTOKEN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_NEW_BTOKEN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_TOKEN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_TO_ADDR\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_LAST_MIGRATION_TOO_CLOSE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_PERMISSION_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_TOKEN_ARRAY_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_ADDRESS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_ADDR_MANAGER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_VALUE\",\"inputs\":[]},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"addInstances\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address[]\",\"name\":\"_instances\"}],\"outputs\":[{\"type\":\"uint256[]\"}]},{\"type\":\"function\",\"name\":\"addRevokedCertSerialNum\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"index\"},{\"type\":\"bytes[]\",\"name\":\"serialNumBatch\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"addressManager\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"addressRegistered\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"instanceAddress\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"alreadyAttested\"}]},{\"type\":\"function\",\"name\":\"allowance\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"owner\"},{\"type\":\"address\",\"name\":\"spender\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"approvals\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"version\"},{\"type\":\"bytes32\",\"name\":\"proofHash\"}],\"outputs\":[{\"type\":\"uint256\",\"name\":\"approvalBits\"}]},{\"type\":\"function\",\"name\":\"approve\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"spender\"},{\"type\":\"uint256\",\"name\":\"amount\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"approve\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_meta\",\"components\":[{\"type\":\"bytes32\",\"name\":\"l1Hash\"},{\"type\":\"bytes32\",\"name\":\"difficulty\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"bytes32\",\"name\":\"extraData\"},{\"type\":\"bytes32\",\"name\":\"depositsHash\"},{\"type\":\"address\",\"name\":\"coinbase\"},{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"uint64\",\"name\":\"timestamp\"},{\"type\":\"uint64\",\"name\":\"l1Height\"},{\"type\":\"uint16\",\"name\":\"minTier\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"bytes32\",\"name\":\"parentMetaHash\"},{\"type\":\"address\",\"name\":\"sender\"}]},{\"type\":\"tuple\",\"name\":\"_tran\",\"components\":[{\"type\":\"bytes32\",\"name\":\"parentHash\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"bytes32\",\"name\":\"graffiti\"}]},{\"type\":\"tuple\",\"name\":\"_proof\",\"components\":[{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[{\"type\":\"bool\",\"name\":\"approved_\"}]},{\"type\":\"function\",\"name\":\"approve\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"tokenId\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"authorize\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_addr\"},{\"type\":\"bool\",\"name\":\"_authorize\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"balanceOf\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"balanceOf\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"},{\"type\":\"uint256\",\"name\":\"id\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"balanceOfBatch\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address[]\",\"name\":\"accounts\"},{\"type\":\"uint256[]\",\"name\":\"ids\"}],\"outputs\":[{\"type\":\"uint256[]\"}]},{\"type\":\"function\",\"name\":\"batchTransfer\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address[]\",\"name\":\"recipients\"},{\"type\":\"uint256[]\",\"name\":\"amounts\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"bondBalanceOf\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_user\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"bridgedToCanonical\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"btoken\"}],\"outputs\":[{\"type\":\"uint64\",\"name\":\"chainId\"},{\"type\":\"address\",\"name\":\"addr\"},{\"type\":\"string\",\"name\":\"symbol\"},{\"type\":\"string\",\"name\":\"name\"}]},{\"type\":\"function\",\"name\":\"bridgedToCanonical\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"btoken\"}],\"outputs\":[{\"type\":\"uint64\",\"name\":\"chainId\"},{\"type\":\"address\",\"name\":\"addr\"},{\"type\":\"uint8\",\"name\":\"decimals\"},{\"type\":\"string\",\"name\":\"symbol\"},{\"type\":\"string\",\"name\":\"name\"}]},{\"type\":\"function\",\"name\":\"btokenDenylist\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"btoken\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"denied\"}]},{\"type\":\"function\",\"name\":\"burn\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_account\"},{\"type\":\"uint256\",\"name\":\"_tokenId\"},{\"type\":\"uint256\",\"name\":\"_amount\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"burn\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_account\"},{\"type\":\"uint256\",\"name\":\"_tokenId\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"burn\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"_amount\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"canonical\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"},{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"canonicalToBridged\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"chainId\"},{\"type\":\"address\",\"name\":\"ctoken\"}],\"outputs\":[{\"type\":\"address\",\"name\":\"btoken\"}]},{\"type\":\"function\",\"name\":\"changeBridgedToken\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_ctoken\",\"components\":[{\"type\":\"uint64\",\"name\":\"chainId\"},{\"type\":\"address\",\"name\":\"addr\"},{\"type\":\"uint8\",\"name\":\"decimals\"},{\"type\":\"string\",\"name\":\"symbol\"},{\"type\":\"string\",\"name\":\"name\"}]},{\"type\":\"address\",\"name\":\"_btokenNew\"}],\"outputs\":[{\"type\":\"address\",\"name\":\"btokenOld_\"}]},{\"type\":\"function\",\"name\":\"changeMigrationStatus\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_migratingAddress\"},{\"type\":\"bool\",\"name\":\"_migratingInbound\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"checkLocalEnclaveReport\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"checkpoints\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"},{\"type\":\"uint32\",\"name\":\"pos\"}],\"outputs\":[{\"type\":\"tuple\",\"components\":[{\"type\":\"uint32\",\"name\":\"fromBlock\"},{\"type\":\"uint224\",\"name\":\"votes\"}]}]},{\"type\":\"function\",\"name\":\"clock\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint48\"}]},{\"type\":\"function\",\"name\":\"configureQeIdentityJson\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"qeIdentityInput\",\"components\":[{\"type\":\"bytes4\",\"name\":\"miscselect\"},{\"type\":\"bytes4\",\"name\":\"miscselectMask\"},{\"type\":\"uint16\",\"name\":\"isvprodid\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes16\",\"name\":\"attributesMask\"},{\"type\":\"bytes32\",\"name\":\"mrsigner\"},{\"type\":\"tuple[]\",\"name\":\"tcbLevels\",\"components\":[{\"type\":\"tuple\",\"name\":\"tcb\",\"components\":[{\"type\":\"uint16\",\"name\":\"isvsvn\"}]},{\"type\":\"uint8\",\"name\":\"tcbStatus\"}]}]}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"configureTcbInfoJson\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"string\",\"name\":\"fmspc\"},{\"type\":\"tuple\",\"name\":\"tcbInfoInput\",\"components\":[{\"type\":\"string\",\"name\":\"pceid\"},{\"type\":\"string\",\"name\":\"fmspc\"},{\"type\":\"tuple[]\",\"name\":\"tcbLevels\",\"components\":[{\"type\":\"uint256\",\"name\":\"pcesvn\"},{\"type\":\"uint8[]\",\"name\":\"sgxTcbCompSvnArr\"},{\"type\":\"uint8\",\"name\":\"status\"}]}]}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"context\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"tuple\",\"name\":\"ctx_\",\"components\":[{\"type\":\"bytes32\",\"name\":\"msgHash\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"}]}]},{\"type\":\"function\",\"name\":\"decimals\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint8\"}]},{\"type\":\"function\",\"name\":\"decodeCert\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"bytes\",\"name\":\"der\"},{\"type\":\"bool\",\"name\":\"isPckCert\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"success\"},{\"type\":\"tuple\",\"name\":\"cert\",\"components\":[{\"type\":\"uint256\",\"name\":\"notBefore\"},{\"type\":\"uint256\",\"name\":\"notAfter\"},{\"type\":\"bytes\",\"name\":\"serialNumber\"},{\"type\":\"bytes\",\"name\":\"tbsCertificate\"},{\"type\":\"bytes\",\"name\":\"pubKey\"},{\"type\":\"bytes\",\"name\":\"signature\"},{\"type\":\"bool\",\"name\":\"isPck\"},{\"type\":\"tuple\",\"name\":\"pck\",\"components\":[{\"type\":\"string\",\"name\":\"commonName\"},{\"type\":\"string\",\"name\":\"issuerName\"},{\"type\":\"tuple\",\"name\":\"sgxExtension\",\"components\":[{\"type\":\"string\",\"name\":\"pceid\"},{\"type\":\"string\",\"name\":\"fmspc\"},{\"type\":\"uint256\",\"name\":\"pcesvn\"},{\"type\":\"uint256[]\",\"name\":\"sgxTcbCompSvnArr\"}]}]}]}]},{\"type\":\"function\",\"name\":\"decreaseAllowance\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"spender\"},{\"type\":\"uint256\",\"name\":\"subtractedValue\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"delegate\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"delegatee\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"delegateBySig\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"delegatee\"},{\"type\":\"uint256\",\"name\":\"nonce\"},{\"type\":\"uint256\",\"name\":\"expiry\"},{\"type\":\"uint8\",\"name\":\"v\"},{\"type\":\"bytes32\",\"name\":\"r\"},{\"type\":\"bytes32\",\"name\":\"s\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"delegates\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"deleteInstances\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256[]\",\"name\":\"_ids\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"depositBond\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"_amount\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"eip712Domain\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes1\",\"name\":\"fields\"},{\"type\":\"string\",\"name\":\"name\"},{\"type\":\"string\",\"name\":\"version\"},{\"type\":\"uint256\",\"name\":\"chainId\"},{\"type\":\"address\",\"name\":\"verifyingContract\"},{\"type\":\"bytes32\",\"name\":\"salt\"},{\"type\":\"uint256[]\",\"name\":\"extensions\"}]},{\"type\":\"function\",\"name\":\"enableProvingAutoPause\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"bool\",\"name\":\"_enable\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"enableTaikoTokenAllowance\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"bool\",\"name\":\"_enable\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"failMessage\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"getAddress\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"getApproved\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"tokenId\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"getBlock\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_blockId\"}],\"outputs\":[{\"type\":\"tuple\",\"name\":\"blk_\",\"components\":[{\"type\":\"bytes32\",\"name\":\"metaHash\"},{\"type\":\"address\",\"name\":\"assignedProver\"},{\"type\":\"uint96\",\"name\":\"livenessBond\"},{\"type\":\"uint64\",\"name\":\"blockId\"},{\"type\":\"uint64\",\"name\":\"proposedAt\"},{\"type\":\"uint64\",\"name\":\"proposedIn\"},{\"type\":\"uint32\",\"name\":\"nextTransitionId\"},{\"type\":\"uint32\",\"name\":\"verifiedTransitionId\"}]}]},{\"type\":\"function\",\"name\":\"getConfig\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"tuple\",\"components\":[{\"type\":\"uint64\",\"name\":\"chainId\"},{\"type\":\"uint64\",\"name\":\"blockMaxProposals\"},{\"type\":\"uint64\",\"name\":\"blockRingBufferSize\"},{\"type\":\"uint64\",\"name\":\"maxBlocksToVerify\"},{\"type\":\"uint32\",\"name\":\"blockMaxGasLimit\"},{\"type\":\"uint96\",\"name\":\"livenessBond\"},{\"type\":\"uint8\",\"name\":\"stateRootSyncInternal\"},{\"type\":\"bool\",\"name\":\"checkEOAForCalldataDA\"}]}]},{\"type\":\"function\",\"name\":\"getLastSyncedBlock\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\",\"name\":\"blockId_\"},{\"type\":\"bytes32\",\"name\":\"blockHash_\"},{\"type\":\"bytes32\",\"name\":\"stateRoot_\"}]},{\"type\":\"function\",\"name\":\"getLastVerifiedBlock\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\",\"name\":\"blockId_\"},{\"type\":\"bytes32\",\"name\":\"blockHash_\"},{\"type\":\"bytes32\",\"name\":\"stateRoot_\"}]},{\"type\":\"function\",\"name\":\"getMessageMinGasLimit\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"dataLength\"}],\"outputs\":[{\"type\":\"uint32\"}]},{\"type\":\"function\",\"name\":\"getMinTier\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\"}],\"outputs\":[{\"type\":\"uint16\"}]},{\"type\":\"function\",\"name\":\"getPastTotalSupply\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"timepoint\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"getPastVotes\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"},{\"type\":\"uint256\",\"name\":\"timepoint\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"getSignalSlot\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"address\",\"name\":\"_app\"},{\"type\":\"bytes32\",\"name\":\"_signal\"}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"getStateVariables\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"tuple\",\"components\":[{\"type\":\"uint64\",\"name\":\"genesisHeight\"},{\"type\":\"uint64\",\"name\":\"genesisTimestamp\"},{\"type\":\"uint64\",\"name\":\"lastSyncedBlockId\"},{\"type\":\"uint64\",\"name\":\"lastSynecdAt\"}]},{\"type\":\"tuple\",\"components\":[{\"type\":\"uint64\",\"name\":\"numBlocks\"},{\"type\":\"uint64\",\"name\":\"lastVerifiedBlockId\"},{\"type\":\"bool\",\"name\":\"provingPaused\"},{\"type\":\"uint8\",\"name\":\"__reservedB1\"},{\"type\":\"uint16\",\"name\":\"__reservedB2\"},{\"type\":\"uint32\",\"name\":\"__reservedB3\"},{\"type\":\"uint64\",\"name\":\"lastUnpausedAt\"}]}]},{\"type\":\"function\",\"name\":\"getSyncedChainData\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_kind\"},{\"type\":\"uint64\",\"name\":\"_blockId\"}],\"outputs\":[{\"type\":\"uint64\",\"name\":\"blockId_\"},{\"type\":\"bytes32\",\"name\":\"chainData_\"}]},{\"type\":\"function\",\"name\":\"getTier\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"uint16\",\"name\":\"_tierId\"}],\"outputs\":[{\"type\":\"tuple\",\"components\":[{\"type\":\"bytes32\",\"name\":\"verifierName\"},{\"type\":\"uint96\",\"name\":\"validityBond\"},{\"type\":\"uint96\",\"name\":\"contestBond\"},{\"type\":\"uint24\",\"name\":\"cooldownWindow\"},{\"type\":\"uint16\",\"name\":\"provingWindow\"},{\"type\":\"uint8\",\"name\":\"maxBlocksToVerifyPerProof\"}]}]},{\"type\":\"function\",\"name\":\"getTierIds\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint16[]\",\"name\":\"tiers_\"}]},{\"type\":\"function\",\"name\":\"getTransition\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_blockId\"},{\"type\":\"uint32\",\"name\":\"_tid\"}],\"outputs\":[{\"type\":\"tuple\",\"components\":[{\"type\":\"bytes32\",\"name\":\"key\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"address\",\"name\":\"prover\"},{\"type\":\"uint96\",\"name\":\"validityBond\"},{\"type\":\"address\",\"name\":\"contester\"},{\"type\":\"uint96\",\"name\":\"contestBond\"},{\"type\":\"uint64\",\"name\":\"timestamp\"},{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"uint8\",\"name\":\"__reserved1\"}]}]},{\"type\":\"function\",\"name\":\"getTransition\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_blockId\"},{\"type\":\"bytes32\",\"name\":\"_parentHash\"}],\"outputs\":[{\"type\":\"tuple\",\"components\":[{\"type\":\"bytes32\",\"name\":\"key\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"address\",\"name\":\"prover\"},{\"type\":\"uint96\",\"name\":\"validityBond\"},{\"type\":\"address\",\"name\":\"contester\"},{\"type\":\"uint96\",\"name\":\"contestBond\"},{\"type\":\"uint64\",\"name\":\"timestamp\"},{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"uint8\",\"name\":\"__reserved1\"}]}]},{\"type\":\"function\",\"name\":\"getVerifiedBlockProver\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_blockId\"}],\"outputs\":[{\"type\":\"address\",\"name\":\"prover_\"}]},{\"type\":\"function\",\"name\":\"getVotes\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"guardianIds\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"guardian\"}],\"outputs\":[{\"type\":\"uint256\",\"name\":\"id\"}]},{\"type\":\"function\",\"name\":\"guardians\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"hashAssignment\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_assignment\",\"components\":[{\"type\":\"address\",\"name\":\"feeToken\"},{\"type\":\"uint64\",\"name\":\"expiry\"},{\"type\":\"uint64\",\"name\":\"maxBlockId\"},{\"type\":\"uint64\",\"name\":\"maxProposedIn\"},{\"type\":\"bytes32\",\"name\":\"metaHash\"},{\"type\":\"bytes32\",\"name\":\"parentMetaHash\"},{\"type\":\"tuple[]\",\"name\":\"tierFees\",\"components\":[{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"uint128\",\"name\":\"fee\"}]},{\"type\":\"bytes\",\"name\":\"signature\"}]},{\"type\":\"address\",\"name\":\"_taikoL1Address\"},{\"type\":\"address\",\"name\":\"_blockProposer\"},{\"type\":\"address\",\"name\":\"_assignedProver\"},{\"type\":\"bytes32\",\"name\":\"_blobHash\"}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"hashMessage\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"impl\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"inNonReentrant\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"increaseAllowance\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"spender\"},{\"type\":\"uint256\",\"name\":\"addedValue\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"},{\"type\":\"address\",\"name\":\"_addressManager\"},{\"type\":\"bytes32\",\"name\":\"_genesisBlockHash\"},{\"type\":\"bool\",\"name\":\"_toPause\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"},{\"type\":\"address\",\"name\":\"_addressManager\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"},{\"type\":\"address\",\"name\":\"_addressManager\"},{\"type\":\"address\",\"name\":\"_srcToken\"},{\"type\":\"uint256\",\"name\":\"_srcChainId\"},{\"type\":\"string\",\"name\":\"_symbol\"},{\"type\":\"string\",\"name\":\"_name\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"owner\"},{\"type\":\"address\",\"name\":\"sigVerifyLibAddr\"},{\"type\":\"address\",\"name\":\"pemCertLibAddr\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"},{\"type\":\"address\",\"name\":\"_addressManager\"},{\"type\":\"address\",\"name\":\"_srcToken\"},{\"type\":\"uint256\",\"name\":\"_srcChainId\"},{\"type\":\"uint8\",\"name\":\"_decimals\"},{\"type\":\"string\",\"name\":\"_symbol\"},{\"type\":\"string\",\"name\":\"_name\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init2\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"instances\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"instanceId\"}],\"outputs\":[{\"type\":\"address\",\"name\":\"addr\"},{\"type\":\"uint64\",\"name\":\"validSince\"}]},{\"type\":\"function\",\"name\":\"isApprovedForAll\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"},{\"type\":\"address\",\"name\":\"operator\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"isAuthorized\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"addr\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"authorized\"}]},{\"type\":\"function\",\"name\":\"isChainDataSynced\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_kind\"},{\"type\":\"uint64\",\"name\":\"_blockId\"},{\"type\":\"bytes32\",\"name\":\"_chainData\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"isDestChainEnabled\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"enabled_\"},{\"type\":\"address\",\"name\":\"destBridge_\"}]},{\"type\":\"function\",\"name\":\"isMessageFailed\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"bytes\",\"name\":\"_proof\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"isMessageReceived\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"bytes\",\"name\":\"_proof\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"isMessageSent\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"isSignalSent\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_app\"},{\"type\":\"bytes32\",\"name\":\"_signal\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"lastMigrationStart\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"chainId\"},{\"type\":\"address\",\"name\":\"ctoken\"}],\"outputs\":[{\"type\":\"uint256\",\"name\":\"timestamp\"}]},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"latestProofHash\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"version\"},{\"type\":\"uint256\",\"name\":\"blockId\"}],\"outputs\":[{\"type\":\"bytes32\",\"name\":\"hash\"}]},{\"type\":\"function\",\"name\":\"messageStatus\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\"}],\"outputs\":[{\"type\":\"uint8\",\"name\":\"status\"}]},{\"type\":\"function\",\"name\":\"migratingAddress\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"migratingInbound\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"minGuardians\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint32\"}]},{\"type\":\"function\",\"name\":\"mint\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_to\"},{\"type\":\"uint256\",\"name\":\"_tokenId\"},{\"type\":\"uint256\",\"name\":\"_amount\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"mint\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_account\"},{\"type\":\"uint256\",\"name\":\"_tokenId\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"mintBatch\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_to\"},{\"type\":\"uint256[]\",\"name\":\"_tokenIds\"},{\"type\":\"uint256[]\",\"name\":\"_amounts\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"name\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"name\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"string\"}]},{\"type\":\"function\",\"name\":\"nextInstanceId\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"nextMessageId\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"nonces\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"owner\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"numCheckpoints\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"}],\"outputs\":[{\"type\":\"uint32\"}]},{\"type\":\"function\",\"name\":\"numGuardians\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"onBlockProposed\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_blk\",\"components\":[{\"type\":\"bytes32\",\"name\":\"metaHash\"},{\"type\":\"address\",\"name\":\"assignedProver\"},{\"type\":\"uint96\",\"name\":\"livenessBond\"},{\"type\":\"uint64\",\"name\":\"blockId\"},{\"type\":\"uint64\",\"name\":\"proposedAt\"},{\"type\":\"uint64\",\"name\":\"proposedIn\"},{\"type\":\"uint32\",\"name\":\"nextTransitionId\"},{\"type\":\"uint32\",\"name\":\"verifiedTransitionId\"}]},{\"type\":\"tuple\",\"name\":\"_meta\",\"components\":[{\"type\":\"bytes32\",\"name\":\"l1Hash\"},{\"type\":\"bytes32\",\"name\":\"difficulty\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"bytes32\",\"name\":\"extraData\"},{\"type\":\"bytes32\",\"name\":\"depositsHash\"},{\"type\":\"address\",\"name\":\"coinbase\"},{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"uint64\",\"name\":\"timestamp\"},{\"type\":\"uint64\",\"name\":\"l1Height\"},{\"type\":\"uint16\",\"name\":\"minTier\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"bytes32\",\"name\":\"parentMetaHash\"},{\"type\":\"address\",\"name\":\"sender\"}]},{\"type\":\"bytes\",\"name\":\"_data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"onERC1155BatchReceived\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"address\"},{\"type\":\"address\"},{\"type\":\"uint256[]\"},{\"type\":\"uint256[]\"},{\"type\":\"bytes\"}],\"outputs\":[{\"type\":\"bytes4\"}]},{\"type\":\"function\",\"name\":\"onERC1155Received\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"address\"},{\"type\":\"address\"},{\"type\":\"uint256\"},{\"type\":\"uint256\"},{\"type\":\"bytes\"}],\"outputs\":[{\"type\":\"bytes4\"}]},{\"type\":\"function\",\"name\":\"onERC721Received\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"address\"},{\"type\":\"address\"},{\"type\":\"uint256\"},{\"type\":\"bytes\"}],\"outputs\":[{\"type\":\"bytes4\"}]},{\"type\":\"function\",\"name\":\"onMessageInvocation\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"bytes\",\"name\":\"_data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"onMessageRecalled\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"bytes32\",\"name\":\"_msgHash\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"owner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"ownerOf\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"tokenId\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"pause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"pauseProving\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"bool\",\"name\":\"_pause\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"pauseTaikoProving\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"paused\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"pemCertLib\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"pendingOwner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"permit\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"owner\"},{\"type\":\"address\",\"name\":\"spender\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"uint256\",\"name\":\"deadline\"},{\"type\":\"uint8\",\"name\":\"v\"},{\"type\":\"bytes32\",\"name\":\"r\"},{\"type\":\"bytes32\",\"name\":\"s\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"processMessage\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"bytes\",\"name\":\"_proof\"}],\"outputs\":[{\"type\":\"uint8\",\"name\":\"status_\"},{\"type\":\"uint8\",\"name\":\"reason_\"}]},{\"type\":\"function\",\"name\":\"proposeBlock\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"bytes\",\"name\":\"_params\"},{\"type\":\"bytes\",\"name\":\"_txList\"}],\"outputs\":[{\"type\":\"tuple\",\"name\":\"meta_\",\"components\":[{\"type\":\"bytes32\",\"name\":\"l1Hash\"},{\"type\":\"bytes32\",\"name\":\"difficulty\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"bytes32\",\"name\":\"extraData\"},{\"type\":\"bytes32\",\"name\":\"depositsHash\"},{\"type\":\"address\",\"name\":\"coinbase\"},{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"uint64\",\"name\":\"timestamp\"},{\"type\":\"uint64\",\"name\":\"l1Height\"},{\"type\":\"uint16\",\"name\":\"minTier\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"bytes32\",\"name\":\"parentMetaHash\"},{\"type\":\"address\",\"name\":\"sender\"}]},{\"type\":\"tuple[]\",\"name\":\"deposits_\",\"components\":[{\"type\":\"address\",\"name\":\"recipient\"},{\"type\":\"uint96\",\"name\":\"amount\"},{\"type\":\"uint64\",\"name\":\"id\"}]}]},{\"type\":\"function\",\"name\":\"proveBlock\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_blockId\"},{\"type\":\"bytes\",\"name\":\"_input\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"proveSignalReceived\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"address\",\"name\":\"_app\"},{\"type\":\"bytes32\",\"name\":\"_signal\"},{\"type\":\"bytes\",\"name\":\"_proof\"}],\"outputs\":[{\"type\":\"uint256\",\"name\":\"numCacheOps_\"}]},{\"type\":\"function\",\"name\":\"provingAutoPauseEnabled\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"qeIdentity\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes4\",\"name\":\"miscselect\"},{\"type\":\"bytes4\",\"name\":\"miscselectMask\"},{\"type\":\"uint16\",\"name\":\"isvprodid\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes16\",\"name\":\"attributesMask\"},{\"type\":\"bytes32\",\"name\":\"mrsigner\"}]},{\"type\":\"function\",\"name\":\"recallMessage\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"bytes\",\"name\":\"_proof\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"registerInstance\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_attestation\",\"components\":[{\"type\":\"tuple\",\"name\":\"header\",\"components\":[{\"type\":\"bytes2\",\"name\":\"version\"},{\"type\":\"bytes2\",\"name\":\"attestationKeyType\"},{\"type\":\"bytes4\",\"name\":\"teeType\"},{\"type\":\"bytes2\",\"name\":\"qeSvn\"},{\"type\":\"bytes2\",\"name\":\"pceSvn\"},{\"type\":\"bytes16\",\"name\":\"qeVendorId\"},{\"type\":\"bytes20\",\"name\":\"userData\"}]},{\"type\":\"tuple\",\"name\":\"localEnclaveReport\",\"components\":[{\"type\":\"bytes16\",\"name\":\"cpuSvn\"},{\"type\":\"bytes4\",\"name\":\"miscSelect\"},{\"type\":\"bytes28\",\"name\":\"reserved1\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes32\",\"name\":\"mrEnclave\"},{\"type\":\"bytes32\",\"name\":\"reserved2\"},{\"type\":\"bytes32\",\"name\":\"mrSigner\"},{\"type\":\"bytes\",\"name\":\"reserved3\"},{\"type\":\"uint16\",\"name\":\"isvProdId\"},{\"type\":\"uint16\",\"name\":\"isvSvn\"},{\"type\":\"bytes\",\"name\":\"reserved4\"},{\"type\":\"bytes\",\"name\":\"reportData\"}]},{\"type\":\"tuple\",\"name\":\"v3AuthData\",\"components\":[{\"type\":\"bytes\",\"name\":\"ecdsa256BitSignature\"},{\"type\":\"bytes\",\"name\":\"ecdsaAttestationKey\"},{\"type\":\"tuple\",\"name\":\"pckSignedQeReport\",\"components\":[{\"type\":\"bytes16\",\"name\":\"cpuSvn\"},{\"type\":\"bytes4\",\"name\":\"miscSelect\"},{\"type\":\"bytes28\",\"name\":\"reserved1\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes32\",\"name\":\"mrEnclave\"},{\"type\":\"bytes32\",\"name\":\"reserved2\"},{\"type\":\"bytes32\",\"name\":\"mrSigner\"},{\"type\":\"bytes\",\"name\":\"reserved3\"},{\"type\":\"uint16\",\"name\":\"isvProdId\"},{\"type\":\"uint16\",\"name\":\"isvSvn\"},{\"type\":\"bytes\",\"name\":\"reserved4\"},{\"type\":\"bytes\",\"name\":\"reportData\"}]},{\"type\":\"bytes\",\"name\":\"qeReportSignature\"},{\"type\":\"tuple\",\"name\":\"qeAuthData\",\"components\":[{\"type\":\"uint16\",\"name\":\"parsedDataSize\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"tuple\",\"name\":\"certification\",\"components\":[{\"type\":\"uint16\",\"name\":\"certType\"},{\"type\":\"uint32\",\"name\":\"certDataSize\"},{\"type\":\"bytes[3]\",\"name\":\"decodedCertDataArray\"}]}]}]}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"removeRevokedCertSerialNum\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"index\"},{\"type\":\"bytes[]\",\"name\":\"serialNumBatch\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"resolve\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"bool\",\"name\":\"_allowZeroAddress\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"resolve\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"bool\",\"name\":\"_allowZeroAddress\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"retryMessage\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"bool\",\"name\":\"_isLastAttempt\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"safeBatchTransferFrom\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256[]\",\"name\":\"ids\"},{\"type\":\"uint256[]\",\"name\":\"amounts\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"safeTransferFrom\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"id\"},{\"type\":\"uint256\",\"name\":\"amount\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"safeTransferFrom\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"tokenId\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"safeTransferFrom\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"tokenId\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"selfDelegate\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_anyToken\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"sendMessage\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash_\"},{\"type\":\"tuple\",\"name\":\"message_\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}]},{\"type\":\"function\",\"name\":\"sendSignal\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"_signal\"}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"sendToken\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_op\",\"components\":[{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"address\",\"name\":\"token\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"uint256[]\",\"name\":\"tokenIds\"},{\"type\":\"uint256[]\",\"name\":\"amounts\"}]}],\"outputs\":[{\"type\":\"tuple\",\"name\":\"message_\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}]},{\"type\":\"function\",\"name\":\"sendToken\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_op\",\"components\":[{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"address\",\"name\":\"token\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"uint256\",\"name\":\"amount\"}]}],\"outputs\":[{\"type\":\"tuple\",\"name\":\"message_\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}]},{\"type\":\"function\",\"name\":\"serialNumIsRevoked\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"idx\"},{\"type\":\"bytes\",\"name\":\"serialNum\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"revoked\"}]},{\"type\":\"function\",\"name\":\"setAddress\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"address\",\"name\":\"_newAddress\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"setApprovalForAll\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"operator\"},{\"type\":\"bool\",\"name\":\"approved\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"setGuardians\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address[]\",\"name\":\"_newGuardians\"},{\"type\":\"uint8\",\"name\":\"_minGuardians\"},{\"type\":\"bool\",\"name\":\"_clearData\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"setMrEnclave\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"_mrEnclave\"},{\"type\":\"bool\",\"name\":\"_trusted\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"setMrSigner\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"_mrSigner\"},{\"type\":\"bool\",\"name\":\"_trusted\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"sigVerifyLib\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"signalForChainData\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_kind\"},{\"type\":\"uint64\",\"name\":\"_blockId\"}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"signalForFailedMessage\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"_msgHash\"}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"source\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"},{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"splitCertificateChain\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"bytes\",\"name\":\"pemChain\"},{\"type\":\"uint256\",\"name\":\"size\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"success\"},{\"type\":\"bytes[]\",\"name\":\"certs\"}]},{\"type\":\"function\",\"name\":\"srcChainId\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"srcToken\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"state\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\",\"name\":\"__reserve1\"},{\"type\":\"tuple\",\"name\":\"slotA\",\"components\":[{\"type\":\"uint64\",\"name\":\"genesisHeight\"},{\"type\":\"uint64\",\"name\":\"genesisTimestamp\"},{\"type\":\"uint64\",\"name\":\"lastSyncedBlockId\"},{\"type\":\"uint64\",\"name\":\"lastSynecdAt\"}]},{\"type\":\"tuple\",\"name\":\"slotB\",\"components\":[{\"type\":\"uint64\",\"name\":\"numBlocks\"},{\"type\":\"uint64\",\"name\":\"lastVerifiedBlockId\"},{\"type\":\"bool\",\"name\":\"provingPaused\"},{\"type\":\"uint8\",\"name\":\"__reservedB1\"},{\"type\":\"uint16\",\"name\":\"__reservedB2\"},{\"type\":\"uint32\",\"name\":\"__reservedB3\"},{\"type\":\"uint64\",\"name\":\"lastUnpausedAt\"}]}]},{\"type\":\"function\",\"name\":\"supportsInterface\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes4\",\"name\":\"_interfaceId\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"symbol\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"string\"}]},{\"type\":\"function\",\"name\":\"symbol\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"string\"}]},{\"type\":\"function\",\"name\":\"syncChainData\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_kind\"},{\"type\":\"uint64\",\"name\":\"_blockId\"},{\"type\":\"bytes32\",\"name\":\"_chainData\"}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"tcbInfo\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"string\",\"name\":\"fmspc\"}],\"outputs\":[{\"type\":\"string\",\"name\":\"pceid\"},{\"type\":\"string\",\"name\":\"fmspc\"}]},{\"type\":\"function\",\"name\":\"toggleLocalReportCheck\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"tokenURI\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"_tokenId\"}],\"outputs\":[{\"type\":\"string\"}]},{\"type\":\"function\",\"name\":\"topBlockId\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"chainId\"},{\"type\":\"bytes32\",\"name\":\"kind\"}],\"outputs\":[{\"type\":\"uint64\",\"name\":\"blockId\"}]},{\"type\":\"function\",\"name\":\"totalSupply\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"transfer\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"amount\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"transferFrom\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"amount\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"transferFrom\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"tokenId\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"transferOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newOwner\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"trustedUserMrEnclave\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"enclave\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"trusted\"}]},{\"type\":\"function\",\"name\":\"trustedUserMrSigner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"signer\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"trusted\"}]},{\"type\":\"function\",\"name\":\"unpause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeTo\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"uri\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\"}],\"outputs\":[{\"type\":\"string\"}]},{\"type\":\"function\",\"name\":\"verifyAttestation\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"success\"}]},{\"type\":\"function\",\"name\":\"verifyBlocks\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_maxBlocksToVerify\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"verifyES256Signature\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes\",\"name\":\"tbs\"},{\"type\":\"bytes\",\"name\":\"signature\"},{\"type\":\"bytes\",\"name\":\"publicKey\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"sigValid\"}]},{\"type\":\"function\",\"name\":\"verifyParsedQuote\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"v3quote\",\"components\":[{\"type\":\"tuple\",\"name\":\"header\",\"components\":[{\"type\":\"bytes2\",\"name\":\"version\"},{\"type\":\"bytes2\",\"name\":\"attestationKeyType\"},{\"type\":\"bytes4\",\"name\":\"teeType\"},{\"type\":\"bytes2\",\"name\":\"qeSvn\"},{\"type\":\"bytes2\",\"name\":\"pceSvn\"},{\"type\":\"bytes16\",\"name\":\"qeVendorId\"},{\"type\":\"bytes20\",\"name\":\"userData\"}]},{\"type\":\"tuple\",\"name\":\"localEnclaveReport\",\"components\":[{\"type\":\"bytes16\",\"name\":\"cpuSvn\"},{\"type\":\"bytes4\",\"name\":\"miscSelect\"},{\"type\":\"bytes28\",\"name\":\"reserved1\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes32\",\"name\":\"mrEnclave\"},{\"type\":\"bytes32\",\"name\":\"reserved2\"},{\"type\":\"bytes32\",\"name\":\"mrSigner\"},{\"type\":\"bytes\",\"name\":\"reserved3\"},{\"type\":\"uint16\",\"name\":\"isvProdId\"},{\"type\":\"uint16\",\"name\":\"isvSvn\"},{\"type\":\"bytes\",\"name\":\"reserved4\"},{\"type\":\"bytes\",\"name\":\"reportData\"}]},{\"type\":\"tuple\",\"name\":\"v3AuthData\",\"components\":[{\"type\":\"bytes\",\"name\":\"ecdsa256BitSignature\"},{\"type\":\"bytes\",\"name\":\"ecdsaAttestationKey\"},{\"type\":\"tuple\",\"name\":\"pckSignedQeReport\",\"components\":[{\"type\":\"bytes16\",\"name\":\"cpuSvn\"},{\"type\":\"bytes4\",\"name\":\"miscSelect\"},{\"type\":\"bytes28\",\"name\":\"reserved1\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes32\",\"name\":\"mrEnclave\"},{\"type\":\"bytes32\",\"name\":\"reserved2\"},{\"type\":\"bytes32\",\"name\":\"mrSigner\"},{\"type\":\"bytes\",\"name\":\"reserved3\"},{\"type\":\"uint16\",\"name\":\"isvProdId\"},{\"type\":\"uint16\",\"name\":\"isvSvn\"},{\"type\":\"bytes\",\"name\":\"reserved4\"},{\"type\":\"bytes\",\"name\":\"reportData\"}]},{\"type\":\"bytes\",\"name\":\"qeReportSignature\"},{\"type\":\"tuple\",\"name\":\"qeAuthData\",\"components\":[{\"type\":\"uint16\",\"name\":\"parsedDataSize\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"tuple\",\"name\":\"certification\",\"components\":[{\"type\":\"uint16\",\"name\":\"certType\"},{\"type\":\"uint32\",\"name\":\"certDataSize\"},{\"type\":\"bytes[3]\",\"name\":\"decodedCertDataArray\"}]}]}]}],\"outputs\":[{\"type\":\"bool\"},{\"type\":\"bytes\"}]},{\"type\":\"function\",\"name\":\"verifyProof\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_ctx\",\"components\":[{\"type\":\"bytes32\",\"name\":\"metaHash\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"address\",\"name\":\"prover\"},{\"type\":\"uint64\",\"name\":\"blockId\"},{\"type\":\"bool\",\"name\":\"isContesting\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"address\",\"name\":\"msgSender\"}]},{\"type\":\"tuple\",\"components\":[{\"type\":\"bytes32\",\"name\":\"parentHash\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"bytes32\",\"name\":\"graffiti\"}]},{\"type\":\"tuple\",\"components\":[{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"verifyProof\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_ctx\",\"components\":[{\"type\":\"bytes32\",\"name\":\"metaHash\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"address\",\"name\":\"prover\"},{\"type\":\"uint64\",\"name\":\"blockId\"},{\"type\":\"bool\",\"name\":\"isContesting\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"address\",\"name\":\"msgSender\"}]},{\"type\":\"tuple\",\"name\":\"_tran\",\"components\":[{\"type\":\"bytes32\",\"name\":\"parentHash\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"bytes32\",\"name\":\"graffiti\"}]},{\"type\":\"tuple\",\"name\":\"_proof\",\"components\":[{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"verifySignalReceived\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"address\",\"name\":\"_app\"},{\"type\":\"bytes32\",\"name\":\"_signal\"},{\"type\":\"bytes\",\"name\":\"_proof\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"version\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint32\"}]},{\"type\":\"function\",\"name\":\"withdrawBond\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"_amount\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"withdrawTaikoToken\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_to\"},{\"type\":\"uint256\",\"name\":\"_amount\"}],\"outputs\":[]},{\"type\":\"constructor\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"es256Verifier\"}]}]","addresses":["0x02772b7B3a5Bea0141C993Dbb8D0733C19F46169","0x06a9Ab27c7e2255df1815E6CC0168d7755Feb19a","0x0b470dd3A0e1C41228856Fb319649E7c08f419Aa","0x10dea67478c5F8C5E2D90e5E9B26dBe60c54d800","0x11A9ebA17EbF92b40fcf9a640Ebbc47Db6fBeab0","0x33879cDF01121dc7bCe011b461e64d791aE931F2","0x39E4C1214e733639d059979079A151911e42791d","0x47bB416ee947fE4a4b655011aF7d6E3A1B80E6e9","0x537a2f0D3a5879b41BCb5A2afE2EA5c4961796F6","0x579A8d63a2Db646284CBFE31FE5082c9989E985c","0x579f40D0BE111b823962043702cabe6Aaa290780","0x67281b15aee4d6b805bc755e439abd524dd8da8d","0x8d7C954960a36a7596d7eA4945dDf891967ca8A3","0x996282cA11E5DEb6B5D122CC3B9A1FcAAD4415Ab","0x9e0a24964e5397B566c1ed39258e21aB5E35C77C","0xE3D777143Ea25A6E031d1e921F396750885f43aC","0xEf9EaA1dd30a9AA1df01c36411b5F082aA65fBaa","0xa25e645ff9897b0282e5f17d36de5bca4ec21d6e","0xaf145913EA4a56BE22E120ED9C24589659881702","0xb0f3186FC1963f774f52ff455DC86aEdD0b31F81","0xc4096E9ff1526Bd1840B65e9f45695135aC12De7","0xcc5d488073FA918cBbd73B9A523F3858C4de7372","0xd60247c6848B7Ca29eDdF63AA924E53dB6Ddd8EC"]}],"createdAt":"2024-08-27T09:44:01.744Z","subscriberId":"d1b49dd5-72bd-480e-b5d7-649ce0aadd09","name":"TaikoL1: Pause/Unpause","network":"mainnet","riskCategory":"ACCESS-CONTROL","monitorId":"d1b49dd5-72bd-480e-b5d7-649ce0aadd09","blockWatcherId":"mainnet-6","paused":false,"stackResourceId":"mystack.taiko-l-1-pause-unpause","type":"BLOCK"},{"skipABIValidation":false,"alertThreshold":null,"notifyConfig":{"severityLevel":"LOW","messageBody":"**Defender Monitor {{ sentinel.name }} Triggered**\n\n**Network**\n\n{{ sentinel.network }}\n\n**Block Hash**\n\n{{ blockHash }}\n\n**Transaction Hash**\n\n{{ transaction.transactionHash }}\n\n**Explorer Link**\n\n{{ transaction.link }}\n\n{{ matchReasonsFormatted }}","messageSubject":"Defender Monitor: Taiko Mainnet SGX Prover triggered","notifications":[{"type":"discord","sendCount":0,"notificationId":"93e8dbf2-4f87-4793-b3c3-6ff0dd6cf827"}],"timeoutMs":0},"tenantId":"0691b59e-8b53-4ae2-b874-959de8a9f2ee","addressRules":[{"conditions":[{"txConditions":[{"status":"any","expression":"status == \"failed\""}],"functionConditions":[],"eventConditions":[{"eventSignature":"InstanceAdded(uint256,address,address,uint256)","expression":null}]},{"txConditions":[{"status":"any","expression":"status == \"failed\""}],"functionConditions":[],"eventConditions":[{"eventSignature":"InstanceDeleted(uint256,address)","expression":null}]},{"txConditions":[{"status":"any","expression":"status == \"failed\""}],"functionConditions":[{"functionSignature":"verifyProof((bytes32,bytes32,address,uint64,bool,bool,address),(bytes32,bytes32,bytes32,bytes32),(uint16,bytes))","expression":null}],"eventConditions":[]}],"abi":"[{\"type\":\"event\",\"anonymous\":false,\"name\":\"AdminChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousAdmin\",\"indexed\":false},{\"type\":\"address\",\"name\":\"newAdmin\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BeaconUpgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"beacon\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Initialized\",\"inputs\":[{\"type\":\"uint8\",\"name\":\"version\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"InstanceAdded\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"id\",\"indexed\":true},{\"type\":\"address\",\"name\":\"instance\",\"indexed\":true},{\"type\":\"address\",\"name\":\"replaced\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"validSince\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"InstanceDeleted\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"id\",\"indexed\":true},{\"type\":\"address\",\"name\":\"instance\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferred\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Paused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Unpaused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Upgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"implementation\",\"indexed\":true}]},{\"type\":\"function\",\"name\":\"INSTANCE_EXPIRY\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"INSTANCE_VALIDITY_DELAY\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"addInstances\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address[]\",\"name\":\"_instances\"}],\"outputs\":[{\"type\":\"uint256[]\"}]},{\"type\":\"function\",\"name\":\"addressManager\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"addressRegistered\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"instanceAddress\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"alreadyAttested\"}]},{\"type\":\"function\",\"name\":\"deleteInstances\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256[]\",\"name\":\"_ids\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"},{\"type\":\"address\",\"name\":\"_addressManager\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"instances\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"instanceId\"}],\"outputs\":[{\"type\":\"address\",\"name\":\"addr\"},{\"type\":\"uint64\",\"name\":\"validSince\"}]},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"nextInstanceId\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"owner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"pause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"paused\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"pendingOwner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"registerInstance\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_attestation\",\"components\":[{\"type\":\"tuple\",\"name\":\"header\",\"components\":[{\"type\":\"bytes2\",\"name\":\"version\"},{\"type\":\"bytes2\",\"name\":\"attestationKeyType\"},{\"type\":\"bytes4\",\"name\":\"teeType\"},{\"type\":\"bytes2\",\"name\":\"qeSvn\"},{\"type\":\"bytes2\",\"name\":\"pceSvn\"},{\"type\":\"bytes16\",\"name\":\"qeVendorId\"},{\"type\":\"bytes20\",\"name\":\"userData\"}]},{\"type\":\"tuple\",\"name\":\"localEnclaveReport\",\"components\":[{\"type\":\"bytes16\",\"name\":\"cpuSvn\"},{\"type\":\"bytes4\",\"name\":\"miscSelect\"},{\"type\":\"bytes28\",\"name\":\"reserved1\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes32\",\"name\":\"mrEnclave\"},{\"type\":\"bytes32\",\"name\":\"reserved2\"},{\"type\":\"bytes32\",\"name\":\"mrSigner\"},{\"type\":\"bytes\",\"name\":\"reserved3\"},{\"type\":\"uint16\",\"name\":\"isvProdId\"},{\"type\":\"uint16\",\"name\":\"isvSvn\"},{\"type\":\"bytes\",\"name\":\"reserved4\"},{\"type\":\"bytes\",\"name\":\"reportData\"}]},{\"type\":\"tuple\",\"name\":\"v3AuthData\",\"components\":[{\"type\":\"bytes\",\"name\":\"ecdsa256BitSignature\"},{\"type\":\"bytes\",\"name\":\"ecdsaAttestationKey\"},{\"type\":\"tuple\",\"name\":\"pckSignedQeReport\",\"components\":[{\"type\":\"bytes16\",\"name\":\"cpuSvn\"},{\"type\":\"bytes4\",\"name\":\"miscSelect\"},{\"type\":\"bytes28\",\"name\":\"reserved1\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes32\",\"name\":\"mrEnclave\"},{\"type\":\"bytes32\",\"name\":\"reserved2\"},{\"type\":\"bytes32\",\"name\":\"mrSigner\"},{\"type\":\"bytes\",\"name\":\"reserved3\"},{\"type\":\"uint16\",\"name\":\"isvProdId\"},{\"type\":\"uint16\",\"name\":\"isvSvn\"},{\"type\":\"bytes\",\"name\":\"reserved4\"},{\"type\":\"bytes\",\"name\":\"reportData\"}]},{\"type\":\"bytes\",\"name\":\"qeReportSignature\"},{\"type\":\"tuple\",\"name\":\"qeAuthData\",\"components\":[{\"type\":\"uint16\",\"name\":\"parsedDataSize\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"tuple\",\"name\":\"certification\",\"components\":[{\"type\":\"uint16\",\"name\":\"certType\"},{\"type\":\"uint32\",\"name\":\"certDataSize\"},{\"type\":\"bytes[3]\",\"name\":\"decodedCertDataArray\"}]}]}]}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"resolve\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"bool\",\"name\":\"_allowZeroAddress\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"transferOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newOwner\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"unpause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeTo\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"verifyProof\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_ctx\",\"components\":[{\"type\":\"bytes32\",\"name\":\"metaHash\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"address\",\"name\":\"prover\"},{\"type\":\"uint64\",\"name\":\"blockId\"},{\"type\":\"bool\",\"name\":\"isContesting\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"address\",\"name\":\"msgSender\"}]},{\"type\":\"tuple\",\"name\":\"_tran\",\"components\":[{\"type\":\"bytes32\",\"name\":\"parentHash\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"bytes32\",\"name\":\"graffiti\"}]},{\"type\":\"tuple\",\"name\":\"_proof\",\"components\":[{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[]}]","addresses":["0xb0f3186FC1963f774f52ff455DC86aEdD0b31F81"]}],"createdAt":"2024-05-02T14:09:42.804Z","subscriberId":"d49a2a9b-268d-4d30-9553-ec55ed952d87","name":"Taiko Mainnet SGX Prover","network":"mainnet","riskCategory":"TECHNICAL","monitorId":"d49a2a9b-268d-4d30-9553-ec55ed952d87","blockWatcherId":"mainnet-1","paused":false,"stackResourceId":"mystack.taiko-mainnet-sgx-prover","type":"BLOCK"},{"skipABIValidation":false,"alertThreshold":null,"notifyConfig":{"severityLevel":"HIGH","messageBody":"**Defender Monitor {{ sentinel.name }} Triggered**\n\n**Network**\n\n{{ sentinel.network }}\n\n**Block Hash**\n\n{{ blockHash }}\n\n**Transaction Hash**\n\n{{ transaction.transactionHash }}\n\n**Explorer Link**\n\n{{ transaction.link }}\n\n{{ matchReasonsFormatted }}","messageSubject":"Defender Monitor: Taiko Mainnet Address Managers triggered","notifications":[{"type":"discord","sendCount":0,"notificationId":"93e8dbf2-4f87-4793-b3c3-6ff0dd6cf827"}],"timeoutMs":0},"tenantId":"0691b59e-8b53-4ae2-b874-959de8a9f2ee","addressRules":[{"conditions":[{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"AddressSet(uint64,bytes32,address,address)","expression":null}]}],"abi":"[{\"type\":\"event\",\"anonymous\":false,\"name\":\"AddressSet\",\"inputs\":[{\"type\":\"uint64\",\"name\":\"chainId\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"name\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newAddress\",\"indexed\":false},{\"type\":\"address\",\"name\":\"oldAddress\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"AdminChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousAdmin\",\"indexed\":false},{\"type\":\"address\",\"name\":\"newAdmin\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BeaconUpgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"beacon\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Initialized\",\"inputs\":[{\"type\":\"uint8\",\"name\":\"version\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferred\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Paused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Unpaused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Upgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"implementation\",\"indexed\":true}]},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"addressManager\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"getAddress\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"owner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"pause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"paused\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"pendingOwner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"resolve\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"bool\",\"name\":\"_allowZeroAddress\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"setAddress\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"address\",\"name\":\"_newAddress\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"transferOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newOwner\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"unpause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeTo\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]}]","addresses":["0xEf9EaA1dd30a9AA1df01c36411b5F082aA65fBaa","0x579f40D0BE111b823962043702cabe6Aaa290780"]}],"createdAt":"2024-05-02T14:00:18.874Z","subscriberId":"3919cb83-487f-4432-88fa-33bbe4361fce","name":"Taiko Mainnet Address Managers","network":"mainnet","riskCategory":"ACCESS-CONTROL","monitorId":"3919cb83-487f-4432-88fa-33bbe4361fce","blockWatcherId":"mainnet-1","paused":false,"stackResourceId":"mystack.taiko-mainnet-address-managers","type":"BLOCK"},{"skipABIValidation":false,"alertThreshold":null,"notifyConfig":{"severityLevel":"HIGH","messageBody":"**Defender Monitor {{ sentinel.name }} Triggered**\n\n**Network**\n\n{{ sentinel.network }}\n\n**Block Hash**\n\n{{ blockHash }}\n\n**Transaction Hash**\n\n{{ transaction.transactionHash }}\n\n**Explorer Link**\n\n{{ transaction.link }}\n\n{{ matchReasonsFormatted }}","messageSubject":"Defender Monitor: Taiko Mainnet Essential Contracts triggered","notifications":[{"type":"discord","sendCount":0,"notificationId":"93e8dbf2-4f87-4793-b3c3-6ff0dd6cf827"}],"timeoutMs":0},"tenantId":"0691b59e-8b53-4ae2-b874-959de8a9f2ee","addressRules":[{"conditions":[{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"AdminChanged(address,address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"BeaconUpgraded(address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"Initialized(uint8)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"OwnershipTransferStarted(address,address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"OwnershipTransferred(address,address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"Paused(address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"Unpaused(address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"Upgraded(address)","expression":null}]}],"abi":"[{\"type\":\"event\",\"anonymous\":false,\"name\":\"AdminChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousAdmin\",\"indexed\":false},{\"type\":\"address\",\"name\":\"newAdmin\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BeaconUpgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"beacon\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Initialized\",\"inputs\":[{\"type\":\"uint8\",\"name\":\"version\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferred\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Paused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Unpaused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Upgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"implementation\",\"indexed\":true}]},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"addressManager\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"owner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"pause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"paused\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"pendingOwner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"resolve\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"bool\",\"name\":\"_allowZeroAddress\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"transferOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newOwner\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"unpause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeTo\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]}]","addresses":["0xEf9EaA1dd30a9AA1df01c36411b5F082aA65fBaa","0x10dea67478c5F8C5E2D90e5E9B26dBe60c54d800","0x9e0a24964e5397B566c1ed39258e21aB5E35C77C","0xd60247c6848B7Ca29eDdF63AA924E53dB6Ddd8EC","0x996282cA11E5DEb6B5D122CC3B9A1FcAAD4415Ab","0x0b470dd3A0e1C41228856Fb319649E7c08f419Aa","0x0b470dd3A0e1C41228856Fb319649E7c08f419Aa","0xaf145913EA4a56BE22E120ED9C24589659881702","0x579f40D0BE111b823962043702cabe6Aaa290780","0x06a9Ab27c7e2255df1815E6CC0168d7755Feb19a","0x537a2f0D3a5879b41BCb5A2afE2EA5c4961796F6","0x33879cDF01121dc7bCe011b461e64d791aE931F2","0xb0f3186FC1963f774f52ff455DC86aEdD0b31F81","0x579A8d63a2Db646284CBFE31FE5082c9989E985c","0xE3D777143Ea25A6E031d1e921F396750885f43aC","0x8d7C954960a36a7596d7eA4945dDf891967ca8A3"]}],"createdAt":"2024-05-02T13:49:54.192Z","subscriberId":"67a53521-3d4a-4de4-92ab-ede82cc45644","name":"Taiko Mainnet Essential Contracts","network":"mainnet","riskCategory":"ACCESS-CONTROL","monitorId":"67a53521-3d4a-4de4-92ab-ede82cc45644","blockWatcherId":"mainnet-1","paused":false,"stackResourceId":"mystack.taiko-mainnet-essential-contracts","type":"BLOCK"}]},"actions":{"removed":[],"created":[],"updated":[{"autotaskId":"4390573f-1796-4c27-8933-7f157e77c2b4","actionId":"4390573f-1796-4c27-8933-7f157e77c2b4","name":"TaikoL1: BlockVerified Alert","paused":false,"trigger":{"cron":null,"frequencyMinutes":4,"type":"schedule"},"codeDigest":"KOTnS1Yf5tvLYRNPMJ0JnrGAv66lJy5ms0M9KHsmVZI=","stackResourceId":"mystack.taiko-l-1-block-verified-alert","runtime":"nodejs20.x","dependenciesVersion":"v2024-08-05","encodedZippedCode":"UEsDBAoAAAAAAAAAQVDHg6kMXRAAAF0QAAAIAAAAaW5kZXguanNjb25zdCB7IGV0aGVycyB9ID0gcmVxdWlyZSgiZXRoZXJzIik7CmNvbnN0IHsgRGVmZW5kZXIgfSA9IHJlcXVpcmUoIkBvcGVuemVwcGVsaW4vZGVmZW5kZXItc2RrIik7Cgpjb25zdCBBQkkgPSBbCiAgewogICAgYW5vbnltb3VzOiBmYWxzZSwKICAgIGlucHV0czogWwogICAgICB7CiAgICAgICAgaW5kZXhlZDogdHJ1ZSwKICAgICAgICBpbnRlcm5hbFR5cGU6ICJ1aW50MjU2IiwKICAgICAgICBuYW1lOiAiYmxvY2tJZCIsCiAgICAgICAgdHlwZTogInVpbnQyNTYiLAogICAgICB9LAogICAgICB7CiAgICAgICAgaW5kZXhlZDogdHJ1ZSwKICAgICAgICBpbnRlcm5hbFR5cGU6ICJhZGRyZXNzIiwKICAgICAgICBuYW1lOiAicHJvdmVyIiwKICAgICAgICB0eXBlOiAiYWRkcmVzcyIsCiAgICAgIH0sCiAgICAgIHsKICAgICAgICBpbmRleGVkOiBmYWxzZSwKICAgICAgICBpbnRlcm5hbFR5cGU6ICJieXRlczMyIiwKICAgICAgICBuYW1lOiAiYmxvY2tIYXNoIiwKICAgICAgICB0eXBlOiAiYnl0ZXMzMiIsCiAgICAgIH0sCiAgICAgIHsKICAgICAgICBpbmRleGVkOiBmYWxzZSwKICAgICAgICBpbnRlcm5hbFR5cGU6ICJieXRlczMyIiwKICAgICAgICBuYW1lOiAic3RhdGVSb290IiwKICAgICAgICB0eXBlOiAiYnl0ZXMzMiIsCiAgICAgIH0sCiAgICAgIHsKICAgICAgICBpbmRleGVkOiBmYWxzZSwKICAgICAgICBpbnRlcm5hbFR5cGU6ICJ1aW50MTYiLAogICAgICAgIG5hbWU6ICJ0aWVyIiwKICAgICAgICB0eXBlOiAidWludDE2IiwKICAgICAgfSwKICAgIF0sCiAgICBuYW1lOiAiQmxvY2tWZXJpZmllZCIsCiAgICB0eXBlOiAiZXZlbnQiLAogIH0sCiAgewogICAgYW5vbnltb3VzOiBmYWxzZSwKICAgIGlucHV0czogWwogICAgICB7CiAgICAgICAgaW5kZXhlZDogdHJ1ZSwKICAgICAgICBpbnRlcm5hbFR5cGU6ICJ1aW50MjU2IiwKICAgICAgICBuYW1lOiAiYmxvY2tJZCIsCiAgICAgICAgdHlwZTogInVpbnQyNTYiLAogICAgICB9LAogICAgICB7CiAgICAgICAgaW5kZXhlZDogdHJ1ZSwKICAgICAgICBpbnRlcm5hbFR5cGU6ICJhZGRyZXNzIiwKICAgICAgICBuYW1lOiAicHJvdmVyIiwKICAgICAgICB0eXBlOiAiYWRkcmVzcyIsCiAgICAgIH0sCiAgICAgIHsKICAgICAgICBpbmRleGVkOiBmYWxzZSwKICAgICAgICBpbnRlcm5hbFR5cGU6ICJieXRlczMyIiwKICAgICAgICBuYW1lOiAiYmxvY2tIYXNoIiwKICAgICAgICB0eXBlOiAiYnl0ZXMzMiIsCiAgICAgIH0sCiAgICAgIHsKICAgICAgICBpbmRleGVkOiBmYWxzZSwKICAgICAgICBpbnRlcm5hbFR5cGU6ICJieXRlczMyIiwKICAgICAgICBuYW1lOiAic3RhdGVSb290IiwKICAgICAgICB0eXBlOiAiYnl0ZXMzMiIsCiAgICAgIH0sCiAgICAgIHsKICAgICAgICBpbmRleGVkOiBmYWxzZSwKICAgICAgICBpbnRlcm5hbFR5cGU6ICJ1aW50MTYiLAogICAgICAgIG5hbWU6ICJ0aWVyIiwKICAgICAgICB0eXBlOiAidWludDE2IiwKICAgICAgfSwKICAgIF0sCiAgICBuYW1lOiAiQmxvY2tWZXJpZmllZFYyIiwKICAgIHR5cGU6ICJldmVudCIsCiAgfSwKXTsKCmZ1bmN0aW9uIGFsZXJ0T3JnKG5vdGlmaWNhdGlvbkNsaWVudCwgbWVzc2FnZSkgewogIG5vdGlmaWNhdGlvbkNsaWVudC5zZW5kKHsKICAgIGNoYW5uZWxBbGlhczogImRpc2NvcmRfYnJpZGdpbmciLAogICAgc3ViamVjdDogIvCfmqggVGFpa29MMTogQmxvY2tWZXJpZmllZCBBbGVydCIsCiAgICBtZXNzYWdlLAogIH0pOwoKICBub3RpZmljYXRpb25DbGllbnQuc2VuZCh7CiAgICBjaGFubmVsQWxpYXM6ICJ0Z190YWlrb19ndWFyZGlhbnMiLAogICAgc3ViamVjdDogIvCfmqggVGFpa29MMTogQmxvY2tWZXJpZmllZCBBbGVydCIsCiAgICBtZXNzYWdlLAogIH0pOwp9Cgphc3luYyBmdW5jdGlvbiBnZXRMYXRlc3RCbG9ja051bWJlcihwcm92aWRlcikgewogIGNvbnN0IGN1cnJlbnRCbG9jayA9IGF3YWl0IHByb3ZpZGVyLmdldEJsb2NrKCJsYXRlc3QiKTsKICByZXR1cm4gY3VycmVudEJsb2NrLm51bWJlcjsKfQoKYXN5bmMgZnVuY3Rpb24gZmV0Y2hMb2dzRnJvbUwxKAogIGV2ZW50TmFtZXMsCiAgZnJvbUJsb2NrLAogIHRvQmxvY2ssCiAgYWRkcmVzcywKICBhYmksCiAgcHJvdmlkZXIsCikgewogIGNvbnN0IGlmYWNlID0gbmV3IGV0aGVycy51dGlscy5JbnRlcmZhY2UoYWJpKTsKICBjb25zdCBldmVudFRvcGljcyA9IGV2ZW50TmFtZXMubWFwKChldmVudE5hbWUpID0+CiAgICBpZmFjZS5nZXRFdmVudFRvcGljKGV2ZW50TmFtZSksCiAgKTsKCiAgY29uc29sZS5sb2coYGV2ZW50VG9waWNzOiAke2V2ZW50VG9waWNzfWApOwoKICB0cnkgewogICAgY29uc3QgbG9ncyA9IGF3YWl0IHByb3ZpZGVyLmdldExvZ3MoewogICAgICBhZGRyZXNzLAogICAgICBmcm9tQmxvY2ssCiAgICAgIHRvQmxvY2ssCiAgICAgIHRvcGljczogW2V2ZW50VG9waWNzXSwKICAgIH0pOwoKICAgIHJldHVybiBsb2dzLm1hcCgobG9nKSA9PiBpZmFjZS5wYXJzZUxvZyhsb2cpKTsKICB9IGNhdGNoIChlcnJvcikgewogICAgY29uc29sZS5lcnJvcigiRXJyb3IgZmV0Y2hpbmcgTDEgbG9nczoiLCBlcnJvcik7CiAgICByZXR1cm4gW107CiAgfQp9CgpmdW5jdGlvbiBjcmVhdGVQcm92aWRlcihhcGlLZXksIGFwaVNlY3JldCwgcmVsYXllckFwaUtleSwgcmVsYXllckFwaVNlY3JldCkgewogIGNvbnN0IGNsaWVudCA9IG5ldyBEZWZlbmRlcih7CiAgICBhcGlLZXksCiAgICBhcGlTZWNyZXQsCiAgICByZWxheWVyQXBpS2V5LAogICAgcmVsYXllckFwaVNlY3JldCwKICB9KTsKCiAgcmV0dXJuIGNsaWVudC5yZWxheVNpZ25lci5nZXRQcm92aWRlcigpOwp9Cgphc3luYyBmdW5jdGlvbiBjYWxjdWxhdGVCbG9ja1RpbWUocHJvdmlkZXIpIHsKICBjb25zdCBsYXRlc3RCbG9jayA9IGF3YWl0IHByb3ZpZGVyLmdldEJsb2NrKCJsYXRlc3QiKTsKICBjb25zdCBwcmV2aW91c0Jsb2NrID0gYXdhaXQgcHJvdmlkZXIuZ2V0QmxvY2sobGF0ZXN0QmxvY2subnVtYmVyIC0gMTAwKTsKCiAgY29uc3QgdGltZURpZmYgPSBsYXRlc3RCbG9jay50aW1lc3RhbXAgLSBwcmV2aW91c0Jsb2NrLnRpbWVzdGFtcDsKICBjb25zdCBibG9ja0RpZmYgPSBsYXRlc3RCbG9jay5udW1iZXIgLSBwcmV2aW91c0Jsb2NrLm51bWJlcjsKCiAgY29uc3QgYmxvY2tUaW1lID0gdGltZURpZmYgLyBibG9ja0RpZmY7CiAgcmV0dXJuIGJsb2NrVGltZTsKfQoKZXhwb3J0cy5oYW5kbGVyID0gYXN5bmMgZnVuY3Rpb24gKGV2ZW50LCBjb250ZXh0KSB7CiAgY29uc3QgeyBub3RpZmljYXRpb25DbGllbnQgfSA9IGNvbnRleHQ7CiAgY29uc3QgeyBhcGlLZXksIGFwaVNlY3JldCwgdGFpa29MMUFwaUtleSwgdGFpa29MMUFwaVNlY3JldCB9ID0gZXZlbnQuc2VjcmV0czsKCiAgY29uc3QgdGFpa29MMVByb3ZpZGVyID0gY3JlYXRlUHJvdmlkZXIoCiAgICBhcGlLZXksCiAgICBhcGlTZWNyZXQsCiAgICB0YWlrb0wxQXBpS2V5LAogICAgdGFpa29MMUFwaVNlY3JldCwKICApOwoKICBjb25zdCBjdXJyZW50QmxvY2tOdW1iZXIgPSBhd2FpdCBnZXRMYXRlc3RCbG9ja051bWJlcih0YWlrb0wxUHJvdmlkZXIpOwogIGNvbnN0IGJsb2NrVGltZUluU2Vjb25kcyA9IGF3YWl0IGNhbGN1bGF0ZUJsb2NrVGltZSh0YWlrb0wxUHJvdmlkZXIpOwogIGNvbnN0IGJsb2Nrc0luRml2ZU1pbnV0ZXMgPSBNYXRoLmZsb29yKCg1ICogNjApIC8gYmxvY2tUaW1lSW5TZWNvbmRzKTsKCiAgY29uc3QgZnJvbUJsb2NrID0gY3VycmVudEJsb2NrTnVtYmVyIC0gYmxvY2tzSW5GaXZlTWludXRlczsKICBjb25zdCB0b0Jsb2NrID0gY3VycmVudEJsb2NrTnVtYmVyOwoKICBjb25zdCBsb2dzID0gYXdhaXQgZmV0Y2hMb2dzRnJvbUwxKAogICAgWyJCbG9ja1ZlcmlmaWVkIiwgIkJsb2NrVmVyaWZpZWRWMiJdLAogICAgZnJvbUJsb2NrLAogICAgdG9CbG9jaywKICAgICIweDA2YTlBYjI3YzdlMjI1NWRmMTgxNUU2Q0MwMTY4ZDc3NTVGZWIxOWEiLAogICAgQUJJLAogICAgdGFpa29MMVByb3ZpZGVyLAogICk7CgogIGlmIChsb2dzLmxlbmd0aCA9PT0gMCkgewogICAgYWxlcnRPcmcoCiAgICAgIG5vdGlmaWNhdGlvbkNsaWVudCwKICAgICAgYEBkYXZpZGNhaSBAeXVlYTc1ODMgTm8gQmxvY2tWZXJpZmllZCBldmVudCBkZXRlY3RlZCBpbiB0aGUgbGFzdCAzMCBtaW5zIGluIFRhaWtvTDEhYCwKICAgICk7CiAgfQoKICByZXR1cm4gdHJ1ZTsKfTsKUEsBAhQACgAAAAAAAABBUMeDqQxdEAAAXRAAAAgAAAAAAAAAAAAAAAAAAAAAAGluZGV4LmpzUEsFBgAAAAABAAEANgAAAIMQAAAAAA=="}]},"contracts":{"removed":[],"created":[],"updated":[]},"relayers":{"removed":[],"created":[],"updated":[],"relayerKeys":{"removed":[],"created":[],"updated":[]}},"notifications":{"removed":[],"created":[],"updated":[]},"secrets":{"removed":[],"created":[],"updated":[]},"blockExplorerApiKeys":{"removed":[],"created":[],"updated":[]},"forkedNetworks":{"removed":[],"created":[],"updated":[]},"privateNetworks":{"removed":[],"created":[],"updated":[]}} +{"stack":"mystack","timestamp":"2024-09-20T10:34:25.843Z","monitors":{"removed":[],"created":[{"type":"BLOCK","network":"mainnet","tenantId":"0691b59e-8b53-4ae2-b874-959de8a9f2ee","subscriberId":"1bc1012e-54fc-4fbc-8971-54c5b2a5146e","monitorId":"1bc1012e-54fc-4fbc-8971-54c5b2a5146e","createdAt":"2024-09-20T10:36:31.684Z","name":"TaikoL1: ProvingPaused Alert","paused":false,"notifyConfig":{"notifications":[{"notificationId":"93e8dbf2-4f87-4793-b3c3-6ff0dd6cf827","config":{"url":"https://discord.com/api/webhooks/1079966997816811520/RdYRjk74nbjEPb44tKFGAgYqDRSmmk2BAmShGkpnmm6QpK-21n-Avw5TnVEaJ1CWhE0s"},"updatedAt":"2024-09-19T10:48:03.908Z","tenantId":"0691b59e-8b53-4ae2-b874-959de8a9f2ee","name":"discord_bridging","paused":false,"stackResourceId":"mystack.discord-bridging","type":"discord"}],"severityLevel":"HIGH","timeoutMs":60000,"messageBody":"**Defender Monitor {{ sentinel.name }} Triggered**\n\n**Network**\n\n{{ sentinel.network }}\n\n**Block Hash**\n\n{{ blockHash }}\n\n**Transaction Hash**\n\n{{ transaction.transactionHash }}\n\n**Explorer Link**\n\n{{ transaction.link }}\n\n**Match Reasons**\n\n{{ matchReasonsFormatted }}\n\n**Metadata**\n\n{{ metadataFormatted }}","messageSubject":"⚠️ TaikoL1: ProvingPaused Alert"},"stackResourceId":"mystack.taiko-l-1-proving-paused-alert","skipABIValidation":false,"blockWatcherId":"mainnet-1","addressRules":[{"conditions":[],"addresses":["0x06a9Ab27c7e2255df1815E6CC0168d7755Feb19a"]}]},{"type":"BLOCK","network":"mainnet","tenantId":"0691b59e-8b53-4ae2-b874-959de8a9f2ee","subscriberId":"8e05b9b7-09d2-4b2e-b843-96a62f03c80a","monitorId":"8e05b9b7-09d2-4b2e-b843-96a62f03c80a","createdAt":"2024-09-20T10:36:35.701Z","name":"GuardianProver: GuardiansUpdated Alert","paused":false,"notifyConfig":{"notifications":[{"notificationId":"93e8dbf2-4f87-4793-b3c3-6ff0dd6cf827","config":{"url":"https://discord.com/api/webhooks/1079966997816811520/RdYRjk74nbjEPb44tKFGAgYqDRSmmk2BAmShGkpnmm6QpK-21n-Avw5TnVEaJ1CWhE0s"},"updatedAt":"2024-09-19T10:48:03.908Z","tenantId":"0691b59e-8b53-4ae2-b874-959de8a9f2ee","name":"discord_bridging","paused":false,"stackResourceId":"mystack.discord-bridging","type":"discord"}],"severityLevel":"MEDIUM","timeoutMs":60000,"messageBody":"**Defender Monitor {{ sentinel.name }} Triggered**\n\n**Network**\n\n{{ sentinel.network }}\n\n**Block Hash**\n\n{{ blockHash }}\n\n**Transaction Hash**\n\n{{ transaction.transactionHash }}\n\n**Explorer Link**\n\n{{ transaction.link }}\n\n**Match Reasons**\n\n{{ matchReasonsFormatted }}\n\n**Metadata**\n\n{{ metadataFormatted }}","messageSubject":"⚠️ GuardianProver: GuardiansUpdated Alert"},"stackResourceId":"mystack.guardian-prover-guardians-updated-alert","skipABIValidation":false,"blockWatcherId":"mainnet-1","addressRules":[{"conditions":[],"addresses":["0xE3D777143Ea25A6E031d1e921F396750885f43aC"]}]},{"type":"BLOCK","network":"mainnet","tenantId":"0691b59e-8b53-4ae2-b874-959de8a9f2ee","subscriberId":"deb988aa-3550-4690-9f9b-b45486a45af0","monitorId":"deb988aa-3550-4690-9f9b-b45486a45af0","createdAt":"2024-09-20T10:36:39.801Z","name":"GuardianProver: ConflictingProofs Alert","paused":false,"notifyConfig":{"notifications":[{"notificationId":"93e8dbf2-4f87-4793-b3c3-6ff0dd6cf827","config":{"url":"https://discord.com/api/webhooks/1079966997816811520/RdYRjk74nbjEPb44tKFGAgYqDRSmmk2BAmShGkpnmm6QpK-21n-Avw5TnVEaJ1CWhE0s"},"updatedAt":"2024-09-19T10:48:03.908Z","tenantId":"0691b59e-8b53-4ae2-b874-959de8a9f2ee","name":"discord_bridging","paused":false,"stackResourceId":"mystack.discord-bridging","type":"discord"}],"severityLevel":"MEDIUM","timeoutMs":60000,"messageBody":"**Defender Monitor {{ sentinel.name }} Triggered**\n\n**Network**\n\n{{ sentinel.network }}\n\n**Block Hash**\n\n{{ blockHash }}\n\n**Transaction Hash**\n\n{{ transaction.transactionHash }}\n\n**Explorer Link**\n\n{{ transaction.link }}\n\n**Match Reasons**\n\n{{ matchReasonsFormatted }}\n\n**Metadata**\n\n{{ metadataFormatted }}","messageSubject":"🚨 GuardianProver: ConflictingProofs Alert"},"stackResourceId":"mystack.guardian-prover-conflicting-proofs-alert","skipABIValidation":false,"blockWatcherId":"mainnet-1","addressRules":[{"conditions":[],"addresses":["0xE3D777143Ea25A6E031d1e921F396750885f43aC"]}]},{"type":"BLOCK","network":"mainnet","tenantId":"0691b59e-8b53-4ae2-b874-959de8a9f2ee","subscriberId":"cf7ea759-183f-4761-96cc-ec6cf9052d3b","monitorId":"cf7ea759-183f-4761-96cc-ec6cf9052d3b","createdAt":"2024-09-20T10:36:44.961Z","name":"GuardianProver: ProvingAutoPauseEnabled Alert","paused":false,"notifyConfig":{"notifications":[{"notificationId":"93e8dbf2-4f87-4793-b3c3-6ff0dd6cf827","config":{"url":"https://discord.com/api/webhooks/1079966997816811520/RdYRjk74nbjEPb44tKFGAgYqDRSmmk2BAmShGkpnmm6QpK-21n-Avw5TnVEaJ1CWhE0s"},"updatedAt":"2024-09-19T10:48:03.908Z","tenantId":"0691b59e-8b53-4ae2-b874-959de8a9f2ee","name":"discord_bridging","paused":false,"stackResourceId":"mystack.discord-bridging","type":"discord"}],"severityLevel":"MEDIUM","timeoutMs":60000,"messageBody":"**Defender Monitor {{ sentinel.name }} Triggered**\n\n**Network**\n\n{{ sentinel.network }}\n\n**Block Hash**\n\n{{ blockHash }}\n\n**Transaction Hash**\n\n{{ transaction.transactionHash }}\n\n**Explorer Link**\n\n{{ transaction.link }}\n\n**Match Reasons**\n\n{{ matchReasonsFormatted }}\n\n**Metadata**\n\n{{ metadataFormatted }}","messageSubject":"⚠️ GuardianProver: ProvingAutoPauseEnabled Alert"},"stackResourceId":"mystack.guardian-prover-proving-auto-pause-enabled-alert","skipABIValidation":false,"blockWatcherId":"mainnet-1","addressRules":[{"conditions":[],"addresses":["0xE3D777143Ea25A6E031d1e921F396750885f43aC"]}]}],"updated":[{"skipABIValidation":true,"alertThreshold":null,"notifyConfig":{"severityLevel":"MEDIUM","messageBody":"**Defender Monitor {{ sentinel.name }} Triggered**\n\n**Network**\n\n{{ sentinel.network }}\n\n**Block Hash**\n\n{{ blockHash }}\n\n**Transaction Hash**\n\n{{ transaction.transactionHash }}\n\n**Explorer Link**\n\n{{ transaction.link }}\n\n**Match Reasons**\n\n{{ matchReasonsFormatted }}\n\n**Metadata**\n\n{{ metadataFormatted }}","messageSubject":"Defender Monitor: TaikoL1: Pause/Unpause triggered","notifications":[{"type":"discord","sendCount":0,"notificationId":"93e8dbf2-4f87-4793-b3c3-6ff0dd6cf827"}],"timeoutMs":60000},"tenantId":"0691b59e-8b53-4ae2-b874-959de8a9f2ee","addressRules":[{"conditions":[{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"Paused(address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"Unpaused(address)","expression":null}]}],"abi":"[{\"type\":\"error\",\"name\":\"AM_ADDRESS_ALREADY_SET\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"AddressSet\",\"inputs\":[{\"type\":\"uint64\",\"name\":\"chainId\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"name\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newAddress\",\"indexed\":false},{\"type\":\"address\",\"name\":\"oldAddress\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"AdminChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousAdmin\",\"indexed\":false},{\"type\":\"address\",\"name\":\"newAdmin\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Approval\",\"inputs\":[{\"type\":\"address\",\"name\":\"owner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"spender\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"value\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Approval\",\"inputs\":[{\"type\":\"address\",\"name\":\"owner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"approved\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"tokenId\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"ApprovalForAll\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":true},{\"type\":\"address\",\"name\":\"operator\",\"indexed\":true},{\"type\":\"bool\",\"name\":\"approved\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Approved\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"operationId\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"approvalBits\",\"indexed\":false},{\"type\":\"bool\",\"name\":\"minGuardiansReached\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Authorized\",\"inputs\":[{\"type\":\"address\",\"name\":\"addr\",\"indexed\":true},{\"type\":\"bool\",\"name\":\"authorized\",\"indexed\":false}]},{\"type\":\"error\",\"name\":\"BB_INVALID_PARAMS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BB_MINT_DISALLOWED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BB_PERMISSION_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BTOKEN_CANNOT_RECEIVE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BTOKEN_INVALID_BURN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BTOKEN_INVALID_PARAMS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INSUFFICIENT_GAS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_CONTEXT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_FEE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_GAS_LIMIT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_VALUE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_MESSAGE_NOT_SENT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_OUT_OF_ETH_QUOTA\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_PERMISSION_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_PROOF_TOO_LARGE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_RETRY_FAILED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_SIGNAL_NOT_RECEIVED\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BeaconUpgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"beacon\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BlockProposed\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"address\",\"name\":\"assignedProver\",\"indexed\":true},{\"type\":\"uint96\",\"name\":\"livenessBond\",\"indexed\":false},{\"type\":\"tuple\",\"name\":\"meta\",\"indexed\":false,\"components\":[{\"type\":\"bytes32\",\"name\":\"l1Hash\"},{\"type\":\"bytes32\",\"name\":\"difficulty\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"bytes32\",\"name\":\"extraData\"},{\"type\":\"bytes32\",\"name\":\"depositsHash\"},{\"type\":\"address\",\"name\":\"coinbase\"},{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"uint64\",\"name\":\"timestamp\"},{\"type\":\"uint64\",\"name\":\"l1Height\"},{\"type\":\"uint16\",\"name\":\"minTier\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"bytes32\",\"name\":\"parentMetaHash\"},{\"type\":\"address\",\"name\":\"sender\"}]},{\"type\":\"tuple[]\",\"name\":\"depositsProcessed\",\"indexed\":false,\"components\":[{\"type\":\"address\",\"name\":\"recipient\"},{\"type\":\"uint96\",\"name\":\"amount\"},{\"type\":\"uint64\",\"name\":\"id\"}]}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BlockVerified\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"address\",\"name\":\"prover\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"blockHash\",\"indexed\":false},{\"type\":\"bytes32\",\"name\":\"stateRoot\",\"indexed\":false},{\"type\":\"uint16\",\"name\":\"tier\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BondCredited\",\"inputs\":[{\"type\":\"address\",\"name\":\"user\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"amount\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BondDebited\",\"inputs\":[{\"type\":\"address\",\"name\":\"user\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"amount\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BridgedTokenChanged\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"srcChainId\",\"indexed\":true},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":true},{\"type\":\"address\",\"name\":\"btokenOld\",\"indexed\":false},{\"type\":\"address\",\"name\":\"btokenNew\",\"indexed\":false},{\"type\":\"string\",\"name\":\"ctokenSymbol\",\"indexed\":false},{\"type\":\"string\",\"name\":\"ctokenName\",\"indexed\":false},{\"type\":\"uint8\",\"name\":\"ctokenDecimal\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BridgedTokenDeployed\",\"inputs\":[{\"type\":\"uint64\",\"name\":\"chainId\",\"indexed\":true},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":true},{\"type\":\"address\",\"name\":\"btoken\",\"indexed\":true},{\"type\":\"string\",\"name\":\"ctokenSymbol\",\"indexed\":false},{\"type\":\"string\",\"name\":\"ctokenName\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BridgedTokenDeployed\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"srcChainId\",\"indexed\":true},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":true},{\"type\":\"address\",\"name\":\"btoken\",\"indexed\":true},{\"type\":\"string\",\"name\":\"ctokenSymbol\",\"indexed\":false},{\"type\":\"string\",\"name\":\"ctokenName\",\"indexed\":false},{\"type\":\"uint8\",\"name\":\"ctokenDecimal\",\"indexed\":false}]},{\"type\":\"function\",\"name\":\"CLOCK_MODE\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"string\"}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"CalldataTxList\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"bytes\",\"name\":\"txList\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"ChainDataSynced\",\"inputs\":[{\"type\":\"uint64\",\"name\":\"chainId\",\"indexed\":true},{\"type\":\"uint64\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"kind\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"data\",\"indexed\":false},{\"type\":\"bytes32\",\"name\":\"signal\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"ConflictingProofs\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"address\",\"name\":\"guardian\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"currentProofHash\",\"indexed\":false},{\"type\":\"bytes32\",\"name\":\"newProofHash\",\"indexed\":false},{\"type\":\"bool\",\"name\":\"provingPaused\",\"indexed\":false}]},{\"type\":\"function\",\"name\":\"DOMAIN_SEPARATOR\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"DelegateChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"delegator\",\"indexed\":true},{\"type\":\"address\",\"name\":\"fromDelegate\",\"indexed\":true},{\"type\":\"address\",\"name\":\"toDelegate\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"DelegateVotesChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"delegate\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"previousBalance\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"newBalance\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"EIP712DomainChanged\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ETH_TRANSFER_FAILED\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"EtherPaymentFailed\",\"inputs\":[{\"type\":\"address\",\"name\":\"to\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"maxGas\",\"indexed\":false}]},{\"type\":\"error\",\"name\":\"FUNC_NOT_IMPLEMENTED\",\"inputs\":[]},{\"type\":\"function\",\"name\":\"GAS_OVERHEAD\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint32\"}]},{\"type\":\"function\",\"name\":\"GAS_RESERVE\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"GP_INVALID_GUARDIAN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GP_INVALID_GUARDIAN_SET\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GP_INVALID_MIN_GUARDIANS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GP_INVALID_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GV_PERMISSION_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GV_ZERO_ADDRESS\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"GuardianApproval\",\"inputs\":[{\"type\":\"address\",\"name\":\"addr\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"blockHash\",\"indexed\":true},{\"type\":\"bool\",\"name\":\"approved\",\"indexed\":false},{\"type\":\"bytes\",\"name\":\"proofData\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"GuardiansUpdated\",\"inputs\":[{\"type\":\"uint32\",\"name\":\"version\",\"indexed\":false},{\"type\":\"address[]\",\"name\":\"guardians\",\"indexed\":false}]},{\"type\":\"error\",\"name\":\"HOOK_ASSIGNMENT_EXPIRED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"HOOK_ASSIGNMENT_INVALID_SIG\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"HOOK_TIER_NOT_FOUND\",\"inputs\":[]},{\"type\":\"function\",\"name\":\"INSTANCE_EXPIRY\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"INSTANCE_VALIDITY_DELAY\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Initialized\",\"inputs\":[{\"type\":\"uint8\",\"name\":\"version\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"InstanceAdded\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"id\",\"indexed\":true},{\"type\":\"address\",\"name\":\"instance\",\"indexed\":true},{\"type\":\"address\",\"name\":\"replaced\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"validSince\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"InstanceDeleted\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"id\",\"indexed\":true},{\"type\":\"address\",\"name\":\"instance\",\"indexed\":true}]},{\"type\":\"error\",\"name\":\"L1_ALREADY_CONTESTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_ALREADY_PROVED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOB_NOT_AVAILABLE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOB_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOCK_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_CANNOT_CONTEST\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_BLOCK_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_GENESIS_HASH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_SIG\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_TIER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_TRANSITION\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_NOT_ASSIGNED_PROVER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_PROVING_PAUSED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_RECEIVE_DISABLED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TOO_MANY_BLOCKS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TRANSITION_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNEXPECTED_PARENT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNEXPECTED_TRANSITION_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"LTP_INVALID_ACCOUNT_PROOF\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"LTP_INVALID_INCLUSION_PROOF\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"LocalReportCheckToggled\",\"inputs\":[{\"type\":\"bool\",\"name\":\"checkLocalEnclaveReport\",\"indexed\":false}]},{\"type\":\"function\",\"name\":\"MAX_GAS_PAYING_PROVER\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"MIN_MIGRATION_DELAY\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MessageProcessed\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"tuple\",\"name\":\"message\",\"indexed\":false,\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"tuple\",\"name\":\"stats\",\"indexed\":false,\"components\":[{\"type\":\"uint32\",\"name\":\"gasUsedInFeeCalc\"},{\"type\":\"uint32\",\"name\":\"proofSize\"},{\"type\":\"uint32\",\"name\":\"numCacheOps\"},{\"type\":\"bool\",\"name\":\"processedByRelayer\"}]}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MessageSent\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"tuple\",\"name\":\"message\",\"indexed\":false,\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MessageStatusChanged\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"uint8\",\"name\":\"status\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MigratedTo\",\"inputs\":[{\"type\":\"address\",\"name\":\"fromToken\",\"indexed\":true},{\"type\":\"address\",\"name\":\"account\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"amount\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MigrationStatusChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"addr\",\"indexed\":false},{\"type\":\"bool\",\"name\":\"inbound\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MrEnclaveUpdated\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"mrEnclave\",\"indexed\":true},{\"type\":\"bool\",\"name\":\"trusted\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MrSignerUpdated\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"mrSigner\",\"indexed\":true},{\"type\":\"bool\",\"name\":\"trusted\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferred\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Paused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"ProvingAutoPauseEnabled\",\"inputs\":[{\"type\":\"bool\",\"name\":\"enabled\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"ProvingPaused\",\"inputs\":[{\"type\":\"bool\",\"name\":\"paused\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"QeIdentityConfigured\",\"inputs\":[{\"type\":\"tuple\",\"name\":\"qeIdentityInput\",\"indexed\":false,\"components\":[{\"type\":\"bytes4\",\"name\":\"miscselect\"},{\"type\":\"bytes4\",\"name\":\"miscselectMask\"},{\"type\":\"uint16\",\"name\":\"isvprodid\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes16\",\"name\":\"attributesMask\"},{\"type\":\"bytes32\",\"name\":\"mrsigner\"},{\"type\":\"tuple[]\",\"name\":\"tcbLevels\",\"components\":[{\"type\":\"tuple\",\"name\":\"tcb\",\"components\":[{\"type\":\"uint16\",\"name\":\"isvsvn\"}]},{\"type\":\"uint8\",\"name\":\"tcbStatus\"}]}]}]},{\"type\":\"error\",\"name\":\"REENTRANT_CALL\",\"inputs\":[]},{\"type\":\"function\",\"name\":\"RELAYER_MAX_PROOF_BYTES\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"RESOLVER_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_INVALID_MANAGER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_UNEXPECTED_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_ZERO_ADDR\",\"inputs\":[{\"type\":\"uint64\",\"name\":\"chainId\"},{\"type\":\"bytes32\",\"name\":\"name\"}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"RevokedCertSerialNumAdded\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"index\",\"indexed\":true},{\"type\":\"bytes\",\"name\":\"serialNum\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"RevokedCertSerialNumRemoved\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"index\",\"indexed\":true},{\"type\":\"bytes\",\"name\":\"serialNum\",\"indexed\":false}]},{\"type\":\"error\",\"name\":\"SGX_ALREADY_ATTESTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SGX_INVALID_ATTESTATION\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SGX_INVALID_INSTANCE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SGX_INVALID_PROOF\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SGX_RA_NOT_SUPPORTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_EMPTY_PROOF\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_INVALID_HOPS_WITH_LOOP\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_INVALID_LAST_HOP_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_INVALID_MID_HOP_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_INVALID_STATE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_SIGNAL_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_UNAUTHORIZED\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"SignalSent\",\"inputs\":[{\"type\":\"address\",\"name\":\"app\",\"indexed\":false},{\"type\":\"bytes32\",\"name\":\"signal\",\"indexed\":false},{\"type\":\"bytes32\",\"name\":\"slot\",\"indexed\":false},{\"type\":\"bytes32\",\"name\":\"value\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"StateVariablesUpdated\",\"inputs\":[{\"type\":\"tuple\",\"name\":\"slotB\",\"indexed\":false,\"components\":[{\"type\":\"uint64\",\"name\":\"numBlocks\"},{\"type\":\"uint64\",\"name\":\"lastVerifiedBlockId\"},{\"type\":\"bool\",\"name\":\"provingPaused\"},{\"type\":\"uint8\",\"name\":\"__reservedB1\"},{\"type\":\"uint16\",\"name\":\"__reservedB2\"},{\"type\":\"uint32\",\"name\":\"__reservedB3\"},{\"type\":\"uint64\",\"name\":\"lastUnpausedAt\"}]}]},{\"type\":\"error\",\"name\":\"TIER_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"TT_INVALID_PARAM\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TcbInfoJsonConfigured\",\"inputs\":[{\"type\":\"string\",\"name\":\"fmspc\",\"indexed\":true},{\"type\":\"tuple\",\"name\":\"tcbInfoInput\",\"indexed\":false,\"components\":[{\"type\":\"string\",\"name\":\"pceid\"},{\"type\":\"string\",\"name\":\"fmspc\"},{\"type\":\"tuple[]\",\"name\":\"tcbLevels\",\"components\":[{\"type\":\"uint256\",\"name\":\"pcesvn\"},{\"type\":\"uint8[]\",\"name\":\"sgxTcbCompSvnArr\"},{\"type\":\"uint8\",\"name\":\"status\"}]}]}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TokenReceived\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint64\",\"name\":\"srcChainId\",\"indexed\":false},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":false},{\"type\":\"address\",\"name\":\"token\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"tokenIds\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"amounts\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TokenReceived\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint64\",\"name\":\"srcChainId\",\"indexed\":false},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":false},{\"type\":\"address\",\"name\":\"token\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"amount\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TokenReleased\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":false},{\"type\":\"address\",\"name\":\"token\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"tokenIds\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"amounts\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TokenReleased\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":false},{\"type\":\"address\",\"name\":\"token\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"amount\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TokenSent\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint64\",\"name\":\"destChainId\",\"indexed\":false},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":false},{\"type\":\"address\",\"name\":\"token\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"tokenIds\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"amounts\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TokenSent\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint64\",\"name\":\"canonicalChainId\",\"indexed\":false},{\"type\":\"uint64\",\"name\":\"destChainId\",\"indexed\":false},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":false},{\"type\":\"address\",\"name\":\"token\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"amount\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Transfer\",\"inputs\":[{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"value\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Transfer\",\"inputs\":[{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"tokenId\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TransferBatch\",\"inputs\":[{\"type\":\"address\",\"name\":\"operator\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint256[]\",\"name\":\"ids\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"values\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TransferSingle\",\"inputs\":[{\"type\":\"address\",\"name\":\"operator\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"id\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"value\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TransitionContested\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"tuple\",\"name\":\"tran\",\"indexed\":false,\"components\":[{\"type\":\"bytes32\",\"name\":\"parentHash\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"bytes32\",\"name\":\"graffiti\"}]},{\"type\":\"address\",\"name\":\"contester\",\"indexed\":false},{\"type\":\"uint96\",\"name\":\"contestBond\",\"indexed\":false},{\"type\":\"uint16\",\"name\":\"tier\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TransitionProved\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"tuple\",\"name\":\"tran\",\"indexed\":false,\"components\":[{\"type\":\"bytes32\",\"name\":\"parentHash\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"bytes32\",\"name\":\"graffiti\"}]},{\"type\":\"address\",\"name\":\"prover\",\"indexed\":false},{\"type\":\"uint96\",\"name\":\"validityBond\",\"indexed\":false},{\"type\":\"uint16\",\"name\":\"tier\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"URI\",\"inputs\":[{\"type\":\"string\",\"name\":\"value\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"id\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Unpaused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Upgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"implementation\",\"indexed\":true}]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_CERTIFICATION_CHAIN_DATA\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_CERTIFICATION_CHAIN_SIZE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_ECDSA_SIGNATURE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_QEAUTHDATA_SIZE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_QEREPORT_LENGTN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_QUOTE_LENGTN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_QUOTE_MEMBER_LENGTN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_UNSUPPORT_CERTIFICATION_TYPE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_BTOKEN_BLACKLISTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_CTOKEN_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INSUFFICIENT_FEE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INTERFACE_NOT_SUPPORTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_AMOUNT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_CTOKEN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_NEW_BTOKEN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_TOKEN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_TO_ADDR\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_LAST_MIGRATION_TOO_CLOSE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_PERMISSION_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_TOKEN_ARRAY_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_ADDRESS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_ADDR_MANAGER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_VALUE\",\"inputs\":[]},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"addInstances\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address[]\",\"name\":\"_instances\"}],\"outputs\":[{\"type\":\"uint256[]\"}]},{\"type\":\"function\",\"name\":\"addRevokedCertSerialNum\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"index\"},{\"type\":\"bytes[]\",\"name\":\"serialNumBatch\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"addressManager\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"addressRegistered\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"instanceAddress\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"alreadyAttested\"}]},{\"type\":\"function\",\"name\":\"allowance\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"owner\"},{\"type\":\"address\",\"name\":\"spender\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"approvals\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"version\"},{\"type\":\"bytes32\",\"name\":\"proofHash\"}],\"outputs\":[{\"type\":\"uint256\",\"name\":\"approvalBits\"}]},{\"type\":\"function\",\"name\":\"approve\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"spender\"},{\"type\":\"uint256\",\"name\":\"amount\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"approve\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_meta\",\"components\":[{\"type\":\"bytes32\",\"name\":\"l1Hash\"},{\"type\":\"bytes32\",\"name\":\"difficulty\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"bytes32\",\"name\":\"extraData\"},{\"type\":\"bytes32\",\"name\":\"depositsHash\"},{\"type\":\"address\",\"name\":\"coinbase\"},{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"uint64\",\"name\":\"timestamp\"},{\"type\":\"uint64\",\"name\":\"l1Height\"},{\"type\":\"uint16\",\"name\":\"minTier\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"bytes32\",\"name\":\"parentMetaHash\"},{\"type\":\"address\",\"name\":\"sender\"}]},{\"type\":\"tuple\",\"name\":\"_tran\",\"components\":[{\"type\":\"bytes32\",\"name\":\"parentHash\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"bytes32\",\"name\":\"graffiti\"}]},{\"type\":\"tuple\",\"name\":\"_proof\",\"components\":[{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[{\"type\":\"bool\",\"name\":\"approved_\"}]},{\"type\":\"function\",\"name\":\"approve\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"tokenId\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"authorize\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_addr\"},{\"type\":\"bool\",\"name\":\"_authorize\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"balanceOf\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"balanceOf\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"},{\"type\":\"uint256\",\"name\":\"id\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"balanceOfBatch\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address[]\",\"name\":\"accounts\"},{\"type\":\"uint256[]\",\"name\":\"ids\"}],\"outputs\":[{\"type\":\"uint256[]\"}]},{\"type\":\"function\",\"name\":\"batchTransfer\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address[]\",\"name\":\"recipients\"},{\"type\":\"uint256[]\",\"name\":\"amounts\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"bondBalanceOf\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_user\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"bridgedToCanonical\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"btoken\"}],\"outputs\":[{\"type\":\"uint64\",\"name\":\"chainId\"},{\"type\":\"address\",\"name\":\"addr\"},{\"type\":\"string\",\"name\":\"symbol\"},{\"type\":\"string\",\"name\":\"name\"}]},{\"type\":\"function\",\"name\":\"bridgedToCanonical\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"btoken\"}],\"outputs\":[{\"type\":\"uint64\",\"name\":\"chainId\"},{\"type\":\"address\",\"name\":\"addr\"},{\"type\":\"uint8\",\"name\":\"decimals\"},{\"type\":\"string\",\"name\":\"symbol\"},{\"type\":\"string\",\"name\":\"name\"}]},{\"type\":\"function\",\"name\":\"btokenDenylist\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"btoken\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"denied\"}]},{\"type\":\"function\",\"name\":\"burn\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_account\"},{\"type\":\"uint256\",\"name\":\"_tokenId\"},{\"type\":\"uint256\",\"name\":\"_amount\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"burn\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_account\"},{\"type\":\"uint256\",\"name\":\"_tokenId\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"burn\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"_amount\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"canonical\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"},{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"canonicalToBridged\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"chainId\"},{\"type\":\"address\",\"name\":\"ctoken\"}],\"outputs\":[{\"type\":\"address\",\"name\":\"btoken\"}]},{\"type\":\"function\",\"name\":\"changeBridgedToken\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_ctoken\",\"components\":[{\"type\":\"uint64\",\"name\":\"chainId\"},{\"type\":\"address\",\"name\":\"addr\"},{\"type\":\"uint8\",\"name\":\"decimals\"},{\"type\":\"string\",\"name\":\"symbol\"},{\"type\":\"string\",\"name\":\"name\"}]},{\"type\":\"address\",\"name\":\"_btokenNew\"}],\"outputs\":[{\"type\":\"address\",\"name\":\"btokenOld_\"}]},{\"type\":\"function\",\"name\":\"changeMigrationStatus\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_migratingAddress\"},{\"type\":\"bool\",\"name\":\"_migratingInbound\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"checkLocalEnclaveReport\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"checkpoints\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"},{\"type\":\"uint32\",\"name\":\"pos\"}],\"outputs\":[{\"type\":\"tuple\",\"components\":[{\"type\":\"uint32\",\"name\":\"fromBlock\"},{\"type\":\"uint224\",\"name\":\"votes\"}]}]},{\"type\":\"function\",\"name\":\"clock\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint48\"}]},{\"type\":\"function\",\"name\":\"configureQeIdentityJson\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"qeIdentityInput\",\"components\":[{\"type\":\"bytes4\",\"name\":\"miscselect\"},{\"type\":\"bytes4\",\"name\":\"miscselectMask\"},{\"type\":\"uint16\",\"name\":\"isvprodid\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes16\",\"name\":\"attributesMask\"},{\"type\":\"bytes32\",\"name\":\"mrsigner\"},{\"type\":\"tuple[]\",\"name\":\"tcbLevels\",\"components\":[{\"type\":\"tuple\",\"name\":\"tcb\",\"components\":[{\"type\":\"uint16\",\"name\":\"isvsvn\"}]},{\"type\":\"uint8\",\"name\":\"tcbStatus\"}]}]}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"configureTcbInfoJson\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"string\",\"name\":\"fmspc\"},{\"type\":\"tuple\",\"name\":\"tcbInfoInput\",\"components\":[{\"type\":\"string\",\"name\":\"pceid\"},{\"type\":\"string\",\"name\":\"fmspc\"},{\"type\":\"tuple[]\",\"name\":\"tcbLevels\",\"components\":[{\"type\":\"uint256\",\"name\":\"pcesvn\"},{\"type\":\"uint8[]\",\"name\":\"sgxTcbCompSvnArr\"},{\"type\":\"uint8\",\"name\":\"status\"}]}]}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"context\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"tuple\",\"name\":\"ctx_\",\"components\":[{\"type\":\"bytes32\",\"name\":\"msgHash\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"}]}]},{\"type\":\"function\",\"name\":\"decimals\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint8\"}]},{\"type\":\"function\",\"name\":\"decodeCert\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"bytes\",\"name\":\"der\"},{\"type\":\"bool\",\"name\":\"isPckCert\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"success\"},{\"type\":\"tuple\",\"name\":\"cert\",\"components\":[{\"type\":\"uint256\",\"name\":\"notBefore\"},{\"type\":\"uint256\",\"name\":\"notAfter\"},{\"type\":\"bytes\",\"name\":\"serialNumber\"},{\"type\":\"bytes\",\"name\":\"tbsCertificate\"},{\"type\":\"bytes\",\"name\":\"pubKey\"},{\"type\":\"bytes\",\"name\":\"signature\"},{\"type\":\"bool\",\"name\":\"isPck\"},{\"type\":\"tuple\",\"name\":\"pck\",\"components\":[{\"type\":\"string\",\"name\":\"commonName\"},{\"type\":\"string\",\"name\":\"issuerName\"},{\"type\":\"tuple\",\"name\":\"sgxExtension\",\"components\":[{\"type\":\"string\",\"name\":\"pceid\"},{\"type\":\"string\",\"name\":\"fmspc\"},{\"type\":\"uint256\",\"name\":\"pcesvn\"},{\"type\":\"uint256[]\",\"name\":\"sgxTcbCompSvnArr\"}]}]}]}]},{\"type\":\"function\",\"name\":\"decreaseAllowance\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"spender\"},{\"type\":\"uint256\",\"name\":\"subtractedValue\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"delegate\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"delegatee\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"delegateBySig\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"delegatee\"},{\"type\":\"uint256\",\"name\":\"nonce\"},{\"type\":\"uint256\",\"name\":\"expiry\"},{\"type\":\"uint8\",\"name\":\"v\"},{\"type\":\"bytes32\",\"name\":\"r\"},{\"type\":\"bytes32\",\"name\":\"s\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"delegates\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"deleteInstances\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256[]\",\"name\":\"_ids\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"depositBond\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"_amount\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"eip712Domain\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes1\",\"name\":\"fields\"},{\"type\":\"string\",\"name\":\"name\"},{\"type\":\"string\",\"name\":\"version\"},{\"type\":\"uint256\",\"name\":\"chainId\"},{\"type\":\"address\",\"name\":\"verifyingContract\"},{\"type\":\"bytes32\",\"name\":\"salt\"},{\"type\":\"uint256[]\",\"name\":\"extensions\"}]},{\"type\":\"function\",\"name\":\"enableProvingAutoPause\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"bool\",\"name\":\"_enable\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"enableTaikoTokenAllowance\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"bool\",\"name\":\"_enable\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"failMessage\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"getAddress\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"getApproved\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"tokenId\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"getBlock\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_blockId\"}],\"outputs\":[{\"type\":\"tuple\",\"name\":\"blk_\",\"components\":[{\"type\":\"bytes32\",\"name\":\"metaHash\"},{\"type\":\"address\",\"name\":\"assignedProver\"},{\"type\":\"uint96\",\"name\":\"livenessBond\"},{\"type\":\"uint64\",\"name\":\"blockId\"},{\"type\":\"uint64\",\"name\":\"proposedAt\"},{\"type\":\"uint64\",\"name\":\"proposedIn\"},{\"type\":\"uint32\",\"name\":\"nextTransitionId\"},{\"type\":\"uint32\",\"name\":\"verifiedTransitionId\"}]}]},{\"type\":\"function\",\"name\":\"getConfig\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"tuple\",\"components\":[{\"type\":\"uint64\",\"name\":\"chainId\"},{\"type\":\"uint64\",\"name\":\"blockMaxProposals\"},{\"type\":\"uint64\",\"name\":\"blockRingBufferSize\"},{\"type\":\"uint64\",\"name\":\"maxBlocksToVerify\"},{\"type\":\"uint32\",\"name\":\"blockMaxGasLimit\"},{\"type\":\"uint96\",\"name\":\"livenessBond\"},{\"type\":\"uint8\",\"name\":\"stateRootSyncInternal\"},{\"type\":\"bool\",\"name\":\"checkEOAForCalldataDA\"}]}]},{\"type\":\"function\",\"name\":\"getLastSyncedBlock\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\",\"name\":\"blockId_\"},{\"type\":\"bytes32\",\"name\":\"blockHash_\"},{\"type\":\"bytes32\",\"name\":\"stateRoot_\"}]},{\"type\":\"function\",\"name\":\"getLastVerifiedBlock\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\",\"name\":\"blockId_\"},{\"type\":\"bytes32\",\"name\":\"blockHash_\"},{\"type\":\"bytes32\",\"name\":\"stateRoot_\"}]},{\"type\":\"function\",\"name\":\"getMessageMinGasLimit\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"dataLength\"}],\"outputs\":[{\"type\":\"uint32\"}]},{\"type\":\"function\",\"name\":\"getMinTier\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\"}],\"outputs\":[{\"type\":\"uint16\"}]},{\"type\":\"function\",\"name\":\"getPastTotalSupply\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"timepoint\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"getPastVotes\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"},{\"type\":\"uint256\",\"name\":\"timepoint\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"getSignalSlot\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"address\",\"name\":\"_app\"},{\"type\":\"bytes32\",\"name\":\"_signal\"}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"getStateVariables\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"tuple\",\"components\":[{\"type\":\"uint64\",\"name\":\"genesisHeight\"},{\"type\":\"uint64\",\"name\":\"genesisTimestamp\"},{\"type\":\"uint64\",\"name\":\"lastSyncedBlockId\"},{\"type\":\"uint64\",\"name\":\"lastSynecdAt\"}]},{\"type\":\"tuple\",\"components\":[{\"type\":\"uint64\",\"name\":\"numBlocks\"},{\"type\":\"uint64\",\"name\":\"lastVerifiedBlockId\"},{\"type\":\"bool\",\"name\":\"provingPaused\"},{\"type\":\"uint8\",\"name\":\"__reservedB1\"},{\"type\":\"uint16\",\"name\":\"__reservedB2\"},{\"type\":\"uint32\",\"name\":\"__reservedB3\"},{\"type\":\"uint64\",\"name\":\"lastUnpausedAt\"}]}]},{\"type\":\"function\",\"name\":\"getSyncedChainData\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_kind\"},{\"type\":\"uint64\",\"name\":\"_blockId\"}],\"outputs\":[{\"type\":\"uint64\",\"name\":\"blockId_\"},{\"type\":\"bytes32\",\"name\":\"chainData_\"}]},{\"type\":\"function\",\"name\":\"getTier\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"uint16\",\"name\":\"_tierId\"}],\"outputs\":[{\"type\":\"tuple\",\"components\":[{\"type\":\"bytes32\",\"name\":\"verifierName\"},{\"type\":\"uint96\",\"name\":\"validityBond\"},{\"type\":\"uint96\",\"name\":\"contestBond\"},{\"type\":\"uint24\",\"name\":\"cooldownWindow\"},{\"type\":\"uint16\",\"name\":\"provingWindow\"},{\"type\":\"uint8\",\"name\":\"maxBlocksToVerifyPerProof\"}]}]},{\"type\":\"function\",\"name\":\"getTierIds\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint16[]\",\"name\":\"tiers_\"}]},{\"type\":\"function\",\"name\":\"getTransition\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_blockId\"},{\"type\":\"uint32\",\"name\":\"_tid\"}],\"outputs\":[{\"type\":\"tuple\",\"components\":[{\"type\":\"bytes32\",\"name\":\"key\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"address\",\"name\":\"prover\"},{\"type\":\"uint96\",\"name\":\"validityBond\"},{\"type\":\"address\",\"name\":\"contester\"},{\"type\":\"uint96\",\"name\":\"contestBond\"},{\"type\":\"uint64\",\"name\":\"timestamp\"},{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"uint8\",\"name\":\"__reserved1\"}]}]},{\"type\":\"function\",\"name\":\"getTransition\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_blockId\"},{\"type\":\"bytes32\",\"name\":\"_parentHash\"}],\"outputs\":[{\"type\":\"tuple\",\"components\":[{\"type\":\"bytes32\",\"name\":\"key\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"address\",\"name\":\"prover\"},{\"type\":\"uint96\",\"name\":\"validityBond\"},{\"type\":\"address\",\"name\":\"contester\"},{\"type\":\"uint96\",\"name\":\"contestBond\"},{\"type\":\"uint64\",\"name\":\"timestamp\"},{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"uint8\",\"name\":\"__reserved1\"}]}]},{\"type\":\"function\",\"name\":\"getVerifiedBlockProver\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_blockId\"}],\"outputs\":[{\"type\":\"address\",\"name\":\"prover_\"}]},{\"type\":\"function\",\"name\":\"getVotes\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"guardianIds\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"guardian\"}],\"outputs\":[{\"type\":\"uint256\",\"name\":\"id\"}]},{\"type\":\"function\",\"name\":\"guardians\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"hashAssignment\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_assignment\",\"components\":[{\"type\":\"address\",\"name\":\"feeToken\"},{\"type\":\"uint64\",\"name\":\"expiry\"},{\"type\":\"uint64\",\"name\":\"maxBlockId\"},{\"type\":\"uint64\",\"name\":\"maxProposedIn\"},{\"type\":\"bytes32\",\"name\":\"metaHash\"},{\"type\":\"bytes32\",\"name\":\"parentMetaHash\"},{\"type\":\"tuple[]\",\"name\":\"tierFees\",\"components\":[{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"uint128\",\"name\":\"fee\"}]},{\"type\":\"bytes\",\"name\":\"signature\"}]},{\"type\":\"address\",\"name\":\"_taikoL1Address\"},{\"type\":\"address\",\"name\":\"_blockProposer\"},{\"type\":\"address\",\"name\":\"_assignedProver\"},{\"type\":\"bytes32\",\"name\":\"_blobHash\"}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"hashMessage\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"impl\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"inNonReentrant\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"increaseAllowance\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"spender\"},{\"type\":\"uint256\",\"name\":\"addedValue\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"},{\"type\":\"address\",\"name\":\"_addressManager\"},{\"type\":\"bytes32\",\"name\":\"_genesisBlockHash\"},{\"type\":\"bool\",\"name\":\"_toPause\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"},{\"type\":\"address\",\"name\":\"_addressManager\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"},{\"type\":\"address\",\"name\":\"_addressManager\"},{\"type\":\"address\",\"name\":\"_srcToken\"},{\"type\":\"uint256\",\"name\":\"_srcChainId\"},{\"type\":\"string\",\"name\":\"_symbol\"},{\"type\":\"string\",\"name\":\"_name\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"owner\"},{\"type\":\"address\",\"name\":\"sigVerifyLibAddr\"},{\"type\":\"address\",\"name\":\"pemCertLibAddr\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"},{\"type\":\"address\",\"name\":\"_addressManager\"},{\"type\":\"address\",\"name\":\"_srcToken\"},{\"type\":\"uint256\",\"name\":\"_srcChainId\"},{\"type\":\"uint8\",\"name\":\"_decimals\"},{\"type\":\"string\",\"name\":\"_symbol\"},{\"type\":\"string\",\"name\":\"_name\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init2\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"instances\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"instanceId\"}],\"outputs\":[{\"type\":\"address\",\"name\":\"addr\"},{\"type\":\"uint64\",\"name\":\"validSince\"}]},{\"type\":\"function\",\"name\":\"isApprovedForAll\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"},{\"type\":\"address\",\"name\":\"operator\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"isAuthorized\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"addr\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"authorized\"}]},{\"type\":\"function\",\"name\":\"isChainDataSynced\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_kind\"},{\"type\":\"uint64\",\"name\":\"_blockId\"},{\"type\":\"bytes32\",\"name\":\"_chainData\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"isDestChainEnabled\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"enabled_\"},{\"type\":\"address\",\"name\":\"destBridge_\"}]},{\"type\":\"function\",\"name\":\"isMessageFailed\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"bytes\",\"name\":\"_proof\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"isMessageReceived\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"bytes\",\"name\":\"_proof\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"isMessageSent\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"isSignalSent\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_app\"},{\"type\":\"bytes32\",\"name\":\"_signal\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"lastMigrationStart\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"chainId\"},{\"type\":\"address\",\"name\":\"ctoken\"}],\"outputs\":[{\"type\":\"uint256\",\"name\":\"timestamp\"}]},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"latestProofHash\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"version\"},{\"type\":\"uint256\",\"name\":\"blockId\"}],\"outputs\":[{\"type\":\"bytes32\",\"name\":\"hash\"}]},{\"type\":\"function\",\"name\":\"messageStatus\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\"}],\"outputs\":[{\"type\":\"uint8\",\"name\":\"status\"}]},{\"type\":\"function\",\"name\":\"migratingAddress\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"migratingInbound\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"minGuardians\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint32\"}]},{\"type\":\"function\",\"name\":\"mint\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_to\"},{\"type\":\"uint256\",\"name\":\"_tokenId\"},{\"type\":\"uint256\",\"name\":\"_amount\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"mint\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_account\"},{\"type\":\"uint256\",\"name\":\"_tokenId\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"mintBatch\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_to\"},{\"type\":\"uint256[]\",\"name\":\"_tokenIds\"},{\"type\":\"uint256[]\",\"name\":\"_amounts\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"name\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"name\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"string\"}]},{\"type\":\"function\",\"name\":\"nextInstanceId\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"nextMessageId\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"nonces\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"owner\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"numCheckpoints\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"}],\"outputs\":[{\"type\":\"uint32\"}]},{\"type\":\"function\",\"name\":\"numGuardians\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"onBlockProposed\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_blk\",\"components\":[{\"type\":\"bytes32\",\"name\":\"metaHash\"},{\"type\":\"address\",\"name\":\"assignedProver\"},{\"type\":\"uint96\",\"name\":\"livenessBond\"},{\"type\":\"uint64\",\"name\":\"blockId\"},{\"type\":\"uint64\",\"name\":\"proposedAt\"},{\"type\":\"uint64\",\"name\":\"proposedIn\"},{\"type\":\"uint32\",\"name\":\"nextTransitionId\"},{\"type\":\"uint32\",\"name\":\"verifiedTransitionId\"}]},{\"type\":\"tuple\",\"name\":\"_meta\",\"components\":[{\"type\":\"bytes32\",\"name\":\"l1Hash\"},{\"type\":\"bytes32\",\"name\":\"difficulty\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"bytes32\",\"name\":\"extraData\"},{\"type\":\"bytes32\",\"name\":\"depositsHash\"},{\"type\":\"address\",\"name\":\"coinbase\"},{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"uint64\",\"name\":\"timestamp\"},{\"type\":\"uint64\",\"name\":\"l1Height\"},{\"type\":\"uint16\",\"name\":\"minTier\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"bytes32\",\"name\":\"parentMetaHash\"},{\"type\":\"address\",\"name\":\"sender\"}]},{\"type\":\"bytes\",\"name\":\"_data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"onERC1155BatchReceived\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"address\"},{\"type\":\"address\"},{\"type\":\"uint256[]\"},{\"type\":\"uint256[]\"},{\"type\":\"bytes\"}],\"outputs\":[{\"type\":\"bytes4\"}]},{\"type\":\"function\",\"name\":\"onERC1155Received\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"address\"},{\"type\":\"address\"},{\"type\":\"uint256\"},{\"type\":\"uint256\"},{\"type\":\"bytes\"}],\"outputs\":[{\"type\":\"bytes4\"}]},{\"type\":\"function\",\"name\":\"onERC721Received\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"address\"},{\"type\":\"address\"},{\"type\":\"uint256\"},{\"type\":\"bytes\"}],\"outputs\":[{\"type\":\"bytes4\"}]},{\"type\":\"function\",\"name\":\"onMessageInvocation\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"bytes\",\"name\":\"_data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"onMessageRecalled\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"bytes32\",\"name\":\"_msgHash\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"owner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"ownerOf\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"tokenId\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"pause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"pauseProving\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"bool\",\"name\":\"_pause\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"pauseTaikoProving\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"paused\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"pemCertLib\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"pendingOwner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"permit\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"owner\"},{\"type\":\"address\",\"name\":\"spender\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"uint256\",\"name\":\"deadline\"},{\"type\":\"uint8\",\"name\":\"v\"},{\"type\":\"bytes32\",\"name\":\"r\"},{\"type\":\"bytes32\",\"name\":\"s\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"processMessage\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"bytes\",\"name\":\"_proof\"}],\"outputs\":[{\"type\":\"uint8\",\"name\":\"status_\"},{\"type\":\"uint8\",\"name\":\"reason_\"}]},{\"type\":\"function\",\"name\":\"proposeBlock\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"bytes\",\"name\":\"_params\"},{\"type\":\"bytes\",\"name\":\"_txList\"}],\"outputs\":[{\"type\":\"tuple\",\"name\":\"meta_\",\"components\":[{\"type\":\"bytes32\",\"name\":\"l1Hash\"},{\"type\":\"bytes32\",\"name\":\"difficulty\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"bytes32\",\"name\":\"extraData\"},{\"type\":\"bytes32\",\"name\":\"depositsHash\"},{\"type\":\"address\",\"name\":\"coinbase\"},{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"uint64\",\"name\":\"timestamp\"},{\"type\":\"uint64\",\"name\":\"l1Height\"},{\"type\":\"uint16\",\"name\":\"minTier\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"bytes32\",\"name\":\"parentMetaHash\"},{\"type\":\"address\",\"name\":\"sender\"}]},{\"type\":\"tuple[]\",\"name\":\"deposits_\",\"components\":[{\"type\":\"address\",\"name\":\"recipient\"},{\"type\":\"uint96\",\"name\":\"amount\"},{\"type\":\"uint64\",\"name\":\"id\"}]}]},{\"type\":\"function\",\"name\":\"proveBlock\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_blockId\"},{\"type\":\"bytes\",\"name\":\"_input\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"proveSignalReceived\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"address\",\"name\":\"_app\"},{\"type\":\"bytes32\",\"name\":\"_signal\"},{\"type\":\"bytes\",\"name\":\"_proof\"}],\"outputs\":[{\"type\":\"uint256\",\"name\":\"numCacheOps_\"}]},{\"type\":\"function\",\"name\":\"provingAutoPauseEnabled\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"qeIdentity\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes4\",\"name\":\"miscselect\"},{\"type\":\"bytes4\",\"name\":\"miscselectMask\"},{\"type\":\"uint16\",\"name\":\"isvprodid\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes16\",\"name\":\"attributesMask\"},{\"type\":\"bytes32\",\"name\":\"mrsigner\"}]},{\"type\":\"function\",\"name\":\"recallMessage\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"bytes\",\"name\":\"_proof\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"registerInstance\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_attestation\",\"components\":[{\"type\":\"tuple\",\"name\":\"header\",\"components\":[{\"type\":\"bytes2\",\"name\":\"version\"},{\"type\":\"bytes2\",\"name\":\"attestationKeyType\"},{\"type\":\"bytes4\",\"name\":\"teeType\"},{\"type\":\"bytes2\",\"name\":\"qeSvn\"},{\"type\":\"bytes2\",\"name\":\"pceSvn\"},{\"type\":\"bytes16\",\"name\":\"qeVendorId\"},{\"type\":\"bytes20\",\"name\":\"userData\"}]},{\"type\":\"tuple\",\"name\":\"localEnclaveReport\",\"components\":[{\"type\":\"bytes16\",\"name\":\"cpuSvn\"},{\"type\":\"bytes4\",\"name\":\"miscSelect\"},{\"type\":\"bytes28\",\"name\":\"reserved1\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes32\",\"name\":\"mrEnclave\"},{\"type\":\"bytes32\",\"name\":\"reserved2\"},{\"type\":\"bytes32\",\"name\":\"mrSigner\"},{\"type\":\"bytes\",\"name\":\"reserved3\"},{\"type\":\"uint16\",\"name\":\"isvProdId\"},{\"type\":\"uint16\",\"name\":\"isvSvn\"},{\"type\":\"bytes\",\"name\":\"reserved4\"},{\"type\":\"bytes\",\"name\":\"reportData\"}]},{\"type\":\"tuple\",\"name\":\"v3AuthData\",\"components\":[{\"type\":\"bytes\",\"name\":\"ecdsa256BitSignature\"},{\"type\":\"bytes\",\"name\":\"ecdsaAttestationKey\"},{\"type\":\"tuple\",\"name\":\"pckSignedQeReport\",\"components\":[{\"type\":\"bytes16\",\"name\":\"cpuSvn\"},{\"type\":\"bytes4\",\"name\":\"miscSelect\"},{\"type\":\"bytes28\",\"name\":\"reserved1\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes32\",\"name\":\"mrEnclave\"},{\"type\":\"bytes32\",\"name\":\"reserved2\"},{\"type\":\"bytes32\",\"name\":\"mrSigner\"},{\"type\":\"bytes\",\"name\":\"reserved3\"},{\"type\":\"uint16\",\"name\":\"isvProdId\"},{\"type\":\"uint16\",\"name\":\"isvSvn\"},{\"type\":\"bytes\",\"name\":\"reserved4\"},{\"type\":\"bytes\",\"name\":\"reportData\"}]},{\"type\":\"bytes\",\"name\":\"qeReportSignature\"},{\"type\":\"tuple\",\"name\":\"qeAuthData\",\"components\":[{\"type\":\"uint16\",\"name\":\"parsedDataSize\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"tuple\",\"name\":\"certification\",\"components\":[{\"type\":\"uint16\",\"name\":\"certType\"},{\"type\":\"uint32\",\"name\":\"certDataSize\"},{\"type\":\"bytes[3]\",\"name\":\"decodedCertDataArray\"}]}]}]}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"removeRevokedCertSerialNum\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"index\"},{\"type\":\"bytes[]\",\"name\":\"serialNumBatch\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"resolve\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"bool\",\"name\":\"_allowZeroAddress\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"resolve\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"bool\",\"name\":\"_allowZeroAddress\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"retryMessage\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"bool\",\"name\":\"_isLastAttempt\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"safeBatchTransferFrom\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256[]\",\"name\":\"ids\"},{\"type\":\"uint256[]\",\"name\":\"amounts\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"safeTransferFrom\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"id\"},{\"type\":\"uint256\",\"name\":\"amount\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"safeTransferFrom\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"tokenId\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"safeTransferFrom\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"tokenId\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"selfDelegate\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_anyToken\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"sendMessage\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash_\"},{\"type\":\"tuple\",\"name\":\"message_\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}]},{\"type\":\"function\",\"name\":\"sendSignal\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"_signal\"}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"sendToken\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_op\",\"components\":[{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"address\",\"name\":\"token\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"uint256[]\",\"name\":\"tokenIds\"},{\"type\":\"uint256[]\",\"name\":\"amounts\"}]}],\"outputs\":[{\"type\":\"tuple\",\"name\":\"message_\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}]},{\"type\":\"function\",\"name\":\"sendToken\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_op\",\"components\":[{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"address\",\"name\":\"token\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"uint256\",\"name\":\"amount\"}]}],\"outputs\":[{\"type\":\"tuple\",\"name\":\"message_\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}]},{\"type\":\"function\",\"name\":\"serialNumIsRevoked\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"idx\"},{\"type\":\"bytes\",\"name\":\"serialNum\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"revoked\"}]},{\"type\":\"function\",\"name\":\"setAddress\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"address\",\"name\":\"_newAddress\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"setApprovalForAll\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"operator\"},{\"type\":\"bool\",\"name\":\"approved\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"setGuardians\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address[]\",\"name\":\"_newGuardians\"},{\"type\":\"uint8\",\"name\":\"_minGuardians\"},{\"type\":\"bool\",\"name\":\"_clearData\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"setMrEnclave\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"_mrEnclave\"},{\"type\":\"bool\",\"name\":\"_trusted\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"setMrSigner\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"_mrSigner\"},{\"type\":\"bool\",\"name\":\"_trusted\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"sigVerifyLib\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"signalForChainData\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_kind\"},{\"type\":\"uint64\",\"name\":\"_blockId\"}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"signalForFailedMessage\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"_msgHash\"}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"source\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"},{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"splitCertificateChain\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"bytes\",\"name\":\"pemChain\"},{\"type\":\"uint256\",\"name\":\"size\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"success\"},{\"type\":\"bytes[]\",\"name\":\"certs\"}]},{\"type\":\"function\",\"name\":\"srcChainId\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"srcToken\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"state\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\",\"name\":\"__reserve1\"},{\"type\":\"tuple\",\"name\":\"slotA\",\"components\":[{\"type\":\"uint64\",\"name\":\"genesisHeight\"},{\"type\":\"uint64\",\"name\":\"genesisTimestamp\"},{\"type\":\"uint64\",\"name\":\"lastSyncedBlockId\"},{\"type\":\"uint64\",\"name\":\"lastSynecdAt\"}]},{\"type\":\"tuple\",\"name\":\"slotB\",\"components\":[{\"type\":\"uint64\",\"name\":\"numBlocks\"},{\"type\":\"uint64\",\"name\":\"lastVerifiedBlockId\"},{\"type\":\"bool\",\"name\":\"provingPaused\"},{\"type\":\"uint8\",\"name\":\"__reservedB1\"},{\"type\":\"uint16\",\"name\":\"__reservedB2\"},{\"type\":\"uint32\",\"name\":\"__reservedB3\"},{\"type\":\"uint64\",\"name\":\"lastUnpausedAt\"}]}]},{\"type\":\"function\",\"name\":\"supportsInterface\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes4\",\"name\":\"_interfaceId\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"symbol\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"string\"}]},{\"type\":\"function\",\"name\":\"symbol\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"string\"}]},{\"type\":\"function\",\"name\":\"syncChainData\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_kind\"},{\"type\":\"uint64\",\"name\":\"_blockId\"},{\"type\":\"bytes32\",\"name\":\"_chainData\"}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"tcbInfo\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"string\",\"name\":\"fmspc\"}],\"outputs\":[{\"type\":\"string\",\"name\":\"pceid\"},{\"type\":\"string\",\"name\":\"fmspc\"}]},{\"type\":\"function\",\"name\":\"toggleLocalReportCheck\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"tokenURI\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"_tokenId\"}],\"outputs\":[{\"type\":\"string\"}]},{\"type\":\"function\",\"name\":\"topBlockId\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"chainId\"},{\"type\":\"bytes32\",\"name\":\"kind\"}],\"outputs\":[{\"type\":\"uint64\",\"name\":\"blockId\"}]},{\"type\":\"function\",\"name\":\"totalSupply\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"transfer\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"amount\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"transferFrom\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"amount\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"transferFrom\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"tokenId\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"transferOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newOwner\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"trustedUserMrEnclave\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"enclave\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"trusted\"}]},{\"type\":\"function\",\"name\":\"trustedUserMrSigner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"signer\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"trusted\"}]},{\"type\":\"function\",\"name\":\"unpause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeTo\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"uri\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\"}],\"outputs\":[{\"type\":\"string\"}]},{\"type\":\"function\",\"name\":\"verifyAttestation\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"success\"}]},{\"type\":\"function\",\"name\":\"verifyBlocks\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_maxBlocksToVerify\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"verifyES256Signature\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes\",\"name\":\"tbs\"},{\"type\":\"bytes\",\"name\":\"signature\"},{\"type\":\"bytes\",\"name\":\"publicKey\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"sigValid\"}]},{\"type\":\"function\",\"name\":\"verifyParsedQuote\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"v3quote\",\"components\":[{\"type\":\"tuple\",\"name\":\"header\",\"components\":[{\"type\":\"bytes2\",\"name\":\"version\"},{\"type\":\"bytes2\",\"name\":\"attestationKeyType\"},{\"type\":\"bytes4\",\"name\":\"teeType\"},{\"type\":\"bytes2\",\"name\":\"qeSvn\"},{\"type\":\"bytes2\",\"name\":\"pceSvn\"},{\"type\":\"bytes16\",\"name\":\"qeVendorId\"},{\"type\":\"bytes20\",\"name\":\"userData\"}]},{\"type\":\"tuple\",\"name\":\"localEnclaveReport\",\"components\":[{\"type\":\"bytes16\",\"name\":\"cpuSvn\"},{\"type\":\"bytes4\",\"name\":\"miscSelect\"},{\"type\":\"bytes28\",\"name\":\"reserved1\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes32\",\"name\":\"mrEnclave\"},{\"type\":\"bytes32\",\"name\":\"reserved2\"},{\"type\":\"bytes32\",\"name\":\"mrSigner\"},{\"type\":\"bytes\",\"name\":\"reserved3\"},{\"type\":\"uint16\",\"name\":\"isvProdId\"},{\"type\":\"uint16\",\"name\":\"isvSvn\"},{\"type\":\"bytes\",\"name\":\"reserved4\"},{\"type\":\"bytes\",\"name\":\"reportData\"}]},{\"type\":\"tuple\",\"name\":\"v3AuthData\",\"components\":[{\"type\":\"bytes\",\"name\":\"ecdsa256BitSignature\"},{\"type\":\"bytes\",\"name\":\"ecdsaAttestationKey\"},{\"type\":\"tuple\",\"name\":\"pckSignedQeReport\",\"components\":[{\"type\":\"bytes16\",\"name\":\"cpuSvn\"},{\"type\":\"bytes4\",\"name\":\"miscSelect\"},{\"type\":\"bytes28\",\"name\":\"reserved1\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes32\",\"name\":\"mrEnclave\"},{\"type\":\"bytes32\",\"name\":\"reserved2\"},{\"type\":\"bytes32\",\"name\":\"mrSigner\"},{\"type\":\"bytes\",\"name\":\"reserved3\"},{\"type\":\"uint16\",\"name\":\"isvProdId\"},{\"type\":\"uint16\",\"name\":\"isvSvn\"},{\"type\":\"bytes\",\"name\":\"reserved4\"},{\"type\":\"bytes\",\"name\":\"reportData\"}]},{\"type\":\"bytes\",\"name\":\"qeReportSignature\"},{\"type\":\"tuple\",\"name\":\"qeAuthData\",\"components\":[{\"type\":\"uint16\",\"name\":\"parsedDataSize\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"tuple\",\"name\":\"certification\",\"components\":[{\"type\":\"uint16\",\"name\":\"certType\"},{\"type\":\"uint32\",\"name\":\"certDataSize\"},{\"type\":\"bytes[3]\",\"name\":\"decodedCertDataArray\"}]}]}]}],\"outputs\":[{\"type\":\"bool\"},{\"type\":\"bytes\"}]},{\"type\":\"function\",\"name\":\"verifyProof\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_ctx\",\"components\":[{\"type\":\"bytes32\",\"name\":\"metaHash\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"address\",\"name\":\"prover\"},{\"type\":\"uint64\",\"name\":\"blockId\"},{\"type\":\"bool\",\"name\":\"isContesting\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"address\",\"name\":\"msgSender\"}]},{\"type\":\"tuple\",\"components\":[{\"type\":\"bytes32\",\"name\":\"parentHash\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"bytes32\",\"name\":\"graffiti\"}]},{\"type\":\"tuple\",\"components\":[{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"verifyProof\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_ctx\",\"components\":[{\"type\":\"bytes32\",\"name\":\"metaHash\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"address\",\"name\":\"prover\"},{\"type\":\"uint64\",\"name\":\"blockId\"},{\"type\":\"bool\",\"name\":\"isContesting\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"address\",\"name\":\"msgSender\"}]},{\"type\":\"tuple\",\"name\":\"_tran\",\"components\":[{\"type\":\"bytes32\",\"name\":\"parentHash\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"bytes32\",\"name\":\"graffiti\"}]},{\"type\":\"tuple\",\"name\":\"_proof\",\"components\":[{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"verifySignalReceived\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"address\",\"name\":\"_app\"},{\"type\":\"bytes32\",\"name\":\"_signal\"},{\"type\":\"bytes\",\"name\":\"_proof\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"version\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint32\"}]},{\"type\":\"function\",\"name\":\"withdrawBond\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"_amount\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"withdrawTaikoToken\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_to\"},{\"type\":\"uint256\",\"name\":\"_amount\"}],\"outputs\":[]},{\"type\":\"constructor\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"es256Verifier\"}]}]","addresses":["0x02772b7B3a5Bea0141C993Dbb8D0733C19F46169","0x06a9Ab27c7e2255df1815E6CC0168d7755Feb19a","0x0b470dd3A0e1C41228856Fb319649E7c08f419Aa","0x10dea67478c5F8C5E2D90e5E9B26dBe60c54d800","0x11A9ebA17EbF92b40fcf9a640Ebbc47Db6fBeab0","0x33879cDF01121dc7bCe011b461e64d791aE931F2","0x39E4C1214e733639d059979079A151911e42791d","0x47bB416ee947fE4a4b655011aF7d6E3A1B80E6e9","0x537a2f0D3a5879b41BCb5A2afE2EA5c4961796F6","0x579A8d63a2Db646284CBFE31FE5082c9989E985c","0x579f40D0BE111b823962043702cabe6Aaa290780","0x67281b15aee4d6b805bc755e439abd524dd8da8d","0x8d7C954960a36a7596d7eA4945dDf891967ca8A3","0x996282cA11E5DEb6B5D122CC3B9A1FcAAD4415Ab","0x9e0a24964e5397B566c1ed39258e21aB5E35C77C","0xE3D777143Ea25A6E031d1e921F396750885f43aC","0xEf9EaA1dd30a9AA1df01c36411b5F082aA65fBaa","0xa25e645ff9897b0282e5f17d36de5bca4ec21d6e","0xaf145913EA4a56BE22E120ED9C24589659881702","0xb0f3186FC1963f774f52ff455DC86aEdD0b31F81","0xc4096E9ff1526Bd1840B65e9f45695135aC12De7","0xcc5d488073FA918cBbd73B9A523F3858C4de7372","0xd60247c6848B7Ca29eDdF63AA924E53dB6Ddd8EC"]}],"createdAt":"2024-08-27T09:44:01.744Z","subscriberId":"d1b49dd5-72bd-480e-b5d7-649ce0aadd09","name":"TaikoL1: Pause/Unpause","network":"mainnet","riskCategory":"ACCESS-CONTROL","monitorId":"d1b49dd5-72bd-480e-b5d7-649ce0aadd09","blockWatcherId":"mainnet-6","paused":false,"stackResourceId":"mystack.taiko-l-1-pause-unpause","type":"BLOCK"},{"skipABIValidation":false,"alertThreshold":null,"notifyConfig":{"severityLevel":"LOW","messageBody":"**Defender Monitor {{ sentinel.name }} Triggered**\n\n**Network**\n\n{{ sentinel.network }}\n\n**Block Hash**\n\n{{ blockHash }}\n\n**Transaction Hash**\n\n{{ transaction.transactionHash }}\n\n**Explorer Link**\n\n{{ transaction.link }}\n\n{{ matchReasonsFormatted }}","messageSubject":"Defender Monitor: Taiko Mainnet SGX Prover triggered","notifications":[{"type":"discord","sendCount":0,"notificationId":"93e8dbf2-4f87-4793-b3c3-6ff0dd6cf827"}],"timeoutMs":0},"tenantId":"0691b59e-8b53-4ae2-b874-959de8a9f2ee","addressRules":[{"conditions":[{"txConditions":[{"status":"any","expression":"status == \"failed\""}],"functionConditions":[],"eventConditions":[{"eventSignature":"InstanceAdded(uint256,address,address,uint256)","expression":null}]},{"txConditions":[{"status":"any","expression":"status == \"failed\""}],"functionConditions":[],"eventConditions":[{"eventSignature":"InstanceDeleted(uint256,address)","expression":null}]},{"txConditions":[{"status":"any","expression":"status == \"failed\""}],"functionConditions":[{"functionSignature":"verifyProof((bytes32,bytes32,address,uint64,bool,bool,address),(bytes32,bytes32,bytes32,bytes32),(uint16,bytes))","expression":null}],"eventConditions":[]}],"abi":"[{\"type\":\"event\",\"anonymous\":false,\"name\":\"AdminChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousAdmin\",\"indexed\":false},{\"type\":\"address\",\"name\":\"newAdmin\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BeaconUpgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"beacon\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Initialized\",\"inputs\":[{\"type\":\"uint8\",\"name\":\"version\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"InstanceAdded\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"id\",\"indexed\":true},{\"type\":\"address\",\"name\":\"instance\",\"indexed\":true},{\"type\":\"address\",\"name\":\"replaced\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"validSince\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"InstanceDeleted\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"id\",\"indexed\":true},{\"type\":\"address\",\"name\":\"instance\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferred\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Paused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Unpaused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Upgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"implementation\",\"indexed\":true}]},{\"type\":\"function\",\"name\":\"INSTANCE_EXPIRY\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"INSTANCE_VALIDITY_DELAY\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"addInstances\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address[]\",\"name\":\"_instances\"}],\"outputs\":[{\"type\":\"uint256[]\"}]},{\"type\":\"function\",\"name\":\"addressManager\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"addressRegistered\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"instanceAddress\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"alreadyAttested\"}]},{\"type\":\"function\",\"name\":\"deleteInstances\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256[]\",\"name\":\"_ids\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"},{\"type\":\"address\",\"name\":\"_addressManager\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"instances\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"instanceId\"}],\"outputs\":[{\"type\":\"address\",\"name\":\"addr\"},{\"type\":\"uint64\",\"name\":\"validSince\"}]},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"nextInstanceId\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"owner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"pause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"paused\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"pendingOwner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"registerInstance\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_attestation\",\"components\":[{\"type\":\"tuple\",\"name\":\"header\",\"components\":[{\"type\":\"bytes2\",\"name\":\"version\"},{\"type\":\"bytes2\",\"name\":\"attestationKeyType\"},{\"type\":\"bytes4\",\"name\":\"teeType\"},{\"type\":\"bytes2\",\"name\":\"qeSvn\"},{\"type\":\"bytes2\",\"name\":\"pceSvn\"},{\"type\":\"bytes16\",\"name\":\"qeVendorId\"},{\"type\":\"bytes20\",\"name\":\"userData\"}]},{\"type\":\"tuple\",\"name\":\"localEnclaveReport\",\"components\":[{\"type\":\"bytes16\",\"name\":\"cpuSvn\"},{\"type\":\"bytes4\",\"name\":\"miscSelect\"},{\"type\":\"bytes28\",\"name\":\"reserved1\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes32\",\"name\":\"mrEnclave\"},{\"type\":\"bytes32\",\"name\":\"reserved2\"},{\"type\":\"bytes32\",\"name\":\"mrSigner\"},{\"type\":\"bytes\",\"name\":\"reserved3\"},{\"type\":\"uint16\",\"name\":\"isvProdId\"},{\"type\":\"uint16\",\"name\":\"isvSvn\"},{\"type\":\"bytes\",\"name\":\"reserved4\"},{\"type\":\"bytes\",\"name\":\"reportData\"}]},{\"type\":\"tuple\",\"name\":\"v3AuthData\",\"components\":[{\"type\":\"bytes\",\"name\":\"ecdsa256BitSignature\"},{\"type\":\"bytes\",\"name\":\"ecdsaAttestationKey\"},{\"type\":\"tuple\",\"name\":\"pckSignedQeReport\",\"components\":[{\"type\":\"bytes16\",\"name\":\"cpuSvn\"},{\"type\":\"bytes4\",\"name\":\"miscSelect\"},{\"type\":\"bytes28\",\"name\":\"reserved1\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes32\",\"name\":\"mrEnclave\"},{\"type\":\"bytes32\",\"name\":\"reserved2\"},{\"type\":\"bytes32\",\"name\":\"mrSigner\"},{\"type\":\"bytes\",\"name\":\"reserved3\"},{\"type\":\"uint16\",\"name\":\"isvProdId\"},{\"type\":\"uint16\",\"name\":\"isvSvn\"},{\"type\":\"bytes\",\"name\":\"reserved4\"},{\"type\":\"bytes\",\"name\":\"reportData\"}]},{\"type\":\"bytes\",\"name\":\"qeReportSignature\"},{\"type\":\"tuple\",\"name\":\"qeAuthData\",\"components\":[{\"type\":\"uint16\",\"name\":\"parsedDataSize\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"tuple\",\"name\":\"certification\",\"components\":[{\"type\":\"uint16\",\"name\":\"certType\"},{\"type\":\"uint32\",\"name\":\"certDataSize\"},{\"type\":\"bytes[3]\",\"name\":\"decodedCertDataArray\"}]}]}]}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"resolve\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"bool\",\"name\":\"_allowZeroAddress\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"transferOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newOwner\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"unpause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeTo\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"verifyProof\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_ctx\",\"components\":[{\"type\":\"bytes32\",\"name\":\"metaHash\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"address\",\"name\":\"prover\"},{\"type\":\"uint64\",\"name\":\"blockId\"},{\"type\":\"bool\",\"name\":\"isContesting\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"address\",\"name\":\"msgSender\"}]},{\"type\":\"tuple\",\"name\":\"_tran\",\"components\":[{\"type\":\"bytes32\",\"name\":\"parentHash\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"bytes32\",\"name\":\"graffiti\"}]},{\"type\":\"tuple\",\"name\":\"_proof\",\"components\":[{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[]}]","addresses":["0xb0f3186FC1963f774f52ff455DC86aEdD0b31F81"]}],"createdAt":"2024-05-02T14:09:42.804Z","subscriberId":"d49a2a9b-268d-4d30-9553-ec55ed952d87","name":"Taiko Mainnet SGX Prover","network":"mainnet","riskCategory":"TECHNICAL","monitorId":"d49a2a9b-268d-4d30-9553-ec55ed952d87","blockWatcherId":"mainnet-1","paused":false,"stackResourceId":"mystack.taiko-mainnet-sgx-prover","type":"BLOCK"},{"skipABIValidation":false,"alertThreshold":null,"notifyConfig":{"severityLevel":"HIGH","messageBody":"**Defender Monitor {{ sentinel.name }} Triggered**\n\n**Network**\n\n{{ sentinel.network }}\n\n**Block Hash**\n\n{{ blockHash }}\n\n**Transaction Hash**\n\n{{ transaction.transactionHash }}\n\n**Explorer Link**\n\n{{ transaction.link }}\n\n{{ matchReasonsFormatted }}","messageSubject":"Defender Monitor: Taiko Mainnet Address Managers triggered","notifications":[{"type":"discord","sendCount":0,"notificationId":"93e8dbf2-4f87-4793-b3c3-6ff0dd6cf827"}],"timeoutMs":0},"tenantId":"0691b59e-8b53-4ae2-b874-959de8a9f2ee","addressRules":[{"conditions":[{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"AddressSet(uint64,bytes32,address,address)","expression":null}]}],"abi":"[{\"type\":\"event\",\"anonymous\":false,\"name\":\"AddressSet\",\"inputs\":[{\"type\":\"uint64\",\"name\":\"chainId\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"name\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newAddress\",\"indexed\":false},{\"type\":\"address\",\"name\":\"oldAddress\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"AdminChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousAdmin\",\"indexed\":false},{\"type\":\"address\",\"name\":\"newAdmin\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BeaconUpgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"beacon\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Initialized\",\"inputs\":[{\"type\":\"uint8\",\"name\":\"version\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferred\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Paused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Unpaused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Upgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"implementation\",\"indexed\":true}]},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"addressManager\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"getAddress\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"owner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"pause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"paused\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"pendingOwner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"resolve\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"bool\",\"name\":\"_allowZeroAddress\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"setAddress\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"address\",\"name\":\"_newAddress\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"transferOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newOwner\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"unpause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeTo\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]}]","addresses":["0xEf9EaA1dd30a9AA1df01c36411b5F082aA65fBaa","0x579f40D0BE111b823962043702cabe6Aaa290780"]}],"createdAt":"2024-05-02T14:00:18.874Z","subscriberId":"3919cb83-487f-4432-88fa-33bbe4361fce","name":"Taiko Mainnet Address Managers","network":"mainnet","riskCategory":"ACCESS-CONTROL","monitorId":"3919cb83-487f-4432-88fa-33bbe4361fce","blockWatcherId":"mainnet-1","paused":false,"stackResourceId":"mystack.taiko-mainnet-address-managers","type":"BLOCK"},{"skipABIValidation":false,"alertThreshold":null,"notifyConfig":{"severityLevel":"HIGH","messageBody":"**Defender Monitor {{ sentinel.name }} Triggered**\n\n**Network**\n\n{{ sentinel.network }}\n\n**Block Hash**\n\n{{ blockHash }}\n\n**Transaction Hash**\n\n{{ transaction.transactionHash }}\n\n**Explorer Link**\n\n{{ transaction.link }}\n\n{{ matchReasonsFormatted }}","messageSubject":"Defender Monitor: Taiko Mainnet Essential Contracts triggered","notifications":[{"type":"discord","sendCount":0,"notificationId":"93e8dbf2-4f87-4793-b3c3-6ff0dd6cf827"}],"timeoutMs":0},"tenantId":"0691b59e-8b53-4ae2-b874-959de8a9f2ee","addressRules":[{"conditions":[{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"AdminChanged(address,address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"BeaconUpgraded(address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"Initialized(uint8)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"OwnershipTransferStarted(address,address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"OwnershipTransferred(address,address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"Paused(address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"Unpaused(address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"Upgraded(address)","expression":null}]}],"abi":"[{\"type\":\"event\",\"anonymous\":false,\"name\":\"AdminChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousAdmin\",\"indexed\":false},{\"type\":\"address\",\"name\":\"newAdmin\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BeaconUpgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"beacon\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Initialized\",\"inputs\":[{\"type\":\"uint8\",\"name\":\"version\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferred\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Paused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Unpaused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Upgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"implementation\",\"indexed\":true}]},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"addressManager\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"owner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"pause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"paused\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"pendingOwner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"resolve\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"bool\",\"name\":\"_allowZeroAddress\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"transferOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newOwner\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"unpause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeTo\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]}]","addresses":["0xEf9EaA1dd30a9AA1df01c36411b5F082aA65fBaa","0x10dea67478c5F8C5E2D90e5E9B26dBe60c54d800","0x9e0a24964e5397B566c1ed39258e21aB5E35C77C","0xd60247c6848B7Ca29eDdF63AA924E53dB6Ddd8EC","0x996282cA11E5DEb6B5D122CC3B9A1FcAAD4415Ab","0x0b470dd3A0e1C41228856Fb319649E7c08f419Aa","0x0b470dd3A0e1C41228856Fb319649E7c08f419Aa","0xaf145913EA4a56BE22E120ED9C24589659881702","0x579f40D0BE111b823962043702cabe6Aaa290780","0x06a9Ab27c7e2255df1815E6CC0168d7755Feb19a","0x537a2f0D3a5879b41BCb5A2afE2EA5c4961796F6","0x33879cDF01121dc7bCe011b461e64d791aE931F2","0xb0f3186FC1963f774f52ff455DC86aEdD0b31F81","0x579A8d63a2Db646284CBFE31FE5082c9989E985c","0xE3D777143Ea25A6E031d1e921F396750885f43aC","0x8d7C954960a36a7596d7eA4945dDf891967ca8A3"]}],"createdAt":"2024-05-02T13:49:54.192Z","subscriberId":"67a53521-3d4a-4de4-92ab-ede82cc45644","name":"Taiko Mainnet Essential Contracts","network":"mainnet","riskCategory":"ACCESS-CONTROL","monitorId":"67a53521-3d4a-4de4-92ab-ede82cc45644","blockWatcherId":"mainnet-1","paused":false,"stackResourceId":"mystack.taiko-mainnet-essential-contracts","type":"BLOCK"}]},"actions":{"removed":[],"created":[],"updated":[]},"contracts":{"removed":[],"created":[],"updated":[]},"relayers":{"removed":[],"created":[],"updated":[],"relayerKeys":{"removed":[],"created":[],"updated":[]}},"notifications":{"removed":[],"created":[],"updated":[]},"secrets":{"removed":[],"created":[],"updated":[]},"blockExplorerApiKeys":{"removed":[],"created":[],"updated":[]},"forkedNetworks":{"removed":[],"created":[],"updated":[]},"privateNetworks":{"removed":[],"created":[],"updated":[]}} +{"stack":"mystack","timestamp":"2024-09-20T11:03:25.435Z","monitors":{"removed":[],"created":[],"updated":[{"skipABIValidation":false,"notifyConfig":{"severityLevel":"HIGH","messageBody":"**Defender Monitor {{ sentinel.name }} Triggered**\n\n**Network**\n\n{{ sentinel.network }}\n\n**Block Hash**\n\n{{ blockHash }}\n\n**Transaction Hash**\n\n{{ transaction.transactionHash }}\n\n**Explorer Link**\n\n{{ transaction.link }}\n\n**Match Reasons**\n\n{{ matchReasonsFormatted }}\n\n**Metadata**\n\n{{ metadataFormatted }}","messageSubject":"⚠️ TaikoL1: ProvingPaused Alert","notifications":[{"paused":false,"tenantId":"0691b59e-8b53-4ae2-b874-959de8a9f2ee","name":"discord_bridging","notificationId":"93e8dbf2-4f87-4793-b3c3-6ff0dd6cf827","type":"discord","config":{"url":"https://discord.com/api/webhooks/1079966997816811520/RdYRjk74nbjEPb44tKFGAgYqDRSmmk2BAmShGkpnmm6QpK-21n-Avw5TnVEaJ1CWhE0s"},"stackResourceId":"mystack.discord-bridging","updatedAt":"2024-09-19T10:48:03.908Z"}],"timeoutMs":60000},"tenantId":"0691b59e-8b53-4ae2-b874-959de8a9f2ee","addressRules":[{"conditions":[],"addresses":["0x06a9Ab27c7e2255df1815E6CC0168d7755Feb19a"]}],"createdAt":"2024-09-20T10:36:31.684Z","subscriberId":"1bc1012e-54fc-4fbc-8971-54c5b2a5146e","name":"TaikoL1: ProvingPaused Alert","network":"mainnet","monitorId":"1bc1012e-54fc-4fbc-8971-54c5b2a5146e","blockWatcherId":"mainnet-1","paused":false,"stackResourceId":"mystack.taiko-l-1-proving-paused-alert","type":"BLOCK"},{"skipABIValidation":false,"notifyConfig":{"severityLevel":"MEDIUM","messageBody":"**Defender Monitor {{ sentinel.name }} Triggered**\n\n**Network**\n\n{{ sentinel.network }}\n\n**Block Hash**\n\n{{ blockHash }}\n\n**Transaction Hash**\n\n{{ transaction.transactionHash }}\n\n**Explorer Link**\n\n{{ transaction.link }}\n\n**Match Reasons**\n\n{{ matchReasonsFormatted }}\n\n**Metadata**\n\n{{ metadataFormatted }}","messageSubject":"⚠️ GuardianProver: GuardiansUpdated Alert","notifications":[{"paused":false,"tenantId":"0691b59e-8b53-4ae2-b874-959de8a9f2ee","name":"discord_bridging","notificationId":"93e8dbf2-4f87-4793-b3c3-6ff0dd6cf827","type":"discord","config":{"url":"https://discord.com/api/webhooks/1079966997816811520/RdYRjk74nbjEPb44tKFGAgYqDRSmmk2BAmShGkpnmm6QpK-21n-Avw5TnVEaJ1CWhE0s"},"stackResourceId":"mystack.discord-bridging","updatedAt":"2024-09-19T10:48:03.908Z"}],"timeoutMs":60000},"tenantId":"0691b59e-8b53-4ae2-b874-959de8a9f2ee","addressRules":[{"conditions":[],"addresses":["0xE3D777143Ea25A6E031d1e921F396750885f43aC"]}],"createdAt":"2024-09-20T10:36:35.701Z","subscriberId":"8e05b9b7-09d2-4b2e-b843-96a62f03c80a","name":"GuardianProver: GuardiansUpdated Alert","network":"mainnet","monitorId":"8e05b9b7-09d2-4b2e-b843-96a62f03c80a","blockWatcherId":"mainnet-1","paused":false,"stackResourceId":"mystack.guardian-prover-guardians-updated-alert","type":"BLOCK"},{"skipABIValidation":false,"notifyConfig":{"severityLevel":"MEDIUM","messageBody":"**Defender Monitor {{ sentinel.name }} Triggered**\n\n**Network**\n\n{{ sentinel.network }}\n\n**Block Hash**\n\n{{ blockHash }}\n\n**Transaction Hash**\n\n{{ transaction.transactionHash }}\n\n**Explorer Link**\n\n{{ transaction.link }}\n\n**Match Reasons**\n\n{{ matchReasonsFormatted }}\n\n**Metadata**\n\n{{ metadataFormatted }}","messageSubject":"🚨 GuardianProver: ConflictingProofs Alert","notifications":[{"paused":false,"tenantId":"0691b59e-8b53-4ae2-b874-959de8a9f2ee","name":"discord_bridging","notificationId":"93e8dbf2-4f87-4793-b3c3-6ff0dd6cf827","type":"discord","config":{"url":"https://discord.com/api/webhooks/1079966997816811520/RdYRjk74nbjEPb44tKFGAgYqDRSmmk2BAmShGkpnmm6QpK-21n-Avw5TnVEaJ1CWhE0s"},"stackResourceId":"mystack.discord-bridging","updatedAt":"2024-09-19T10:48:03.908Z"}],"timeoutMs":60000},"tenantId":"0691b59e-8b53-4ae2-b874-959de8a9f2ee","addressRules":[{"conditions":[],"addresses":["0xE3D777143Ea25A6E031d1e921F396750885f43aC"]}],"createdAt":"2024-09-20T10:36:39.801Z","subscriberId":"deb988aa-3550-4690-9f9b-b45486a45af0","name":"GuardianProver: ConflictingProofs Alert","network":"mainnet","monitorId":"deb988aa-3550-4690-9f9b-b45486a45af0","blockWatcherId":"mainnet-1","paused":false,"stackResourceId":"mystack.guardian-prover-conflicting-proofs-alert","type":"BLOCK"},{"skipABIValidation":false,"notifyConfig":{"severityLevel":"MEDIUM","messageBody":"**Defender Monitor {{ sentinel.name }} Triggered**\n\n**Network**\n\n{{ sentinel.network }}\n\n**Block Hash**\n\n{{ blockHash }}\n\n**Transaction Hash**\n\n{{ transaction.transactionHash }}\n\n**Explorer Link**\n\n{{ transaction.link }}\n\n**Match Reasons**\n\n{{ matchReasonsFormatted }}\n\n**Metadata**\n\n{{ metadataFormatted }}","messageSubject":"⚠️ GuardianProver: ProvingAutoPauseEnabled Alert","notifications":[{"paused":false,"tenantId":"0691b59e-8b53-4ae2-b874-959de8a9f2ee","name":"discord_bridging","notificationId":"93e8dbf2-4f87-4793-b3c3-6ff0dd6cf827","type":"discord","config":{"url":"https://discord.com/api/webhooks/1079966997816811520/RdYRjk74nbjEPb44tKFGAgYqDRSmmk2BAmShGkpnmm6QpK-21n-Avw5TnVEaJ1CWhE0s"},"stackResourceId":"mystack.discord-bridging","updatedAt":"2024-09-19T10:48:03.908Z"}],"timeoutMs":60000},"tenantId":"0691b59e-8b53-4ae2-b874-959de8a9f2ee","addressRules":[{"conditions":[],"addresses":["0xE3D777143Ea25A6E031d1e921F396750885f43aC"]}],"createdAt":"2024-09-20T10:36:44.961Z","subscriberId":"cf7ea759-183f-4761-96cc-ec6cf9052d3b","name":"GuardianProver: ProvingAutoPauseEnabled Alert","network":"mainnet","monitorId":"cf7ea759-183f-4761-96cc-ec6cf9052d3b","blockWatcherId":"mainnet-1","paused":false,"stackResourceId":"mystack.guardian-prover-proving-auto-pause-enabled-alert","type":"BLOCK"},{"skipABIValidation":true,"alertThreshold":null,"notifyConfig":{"severityLevel":"MEDIUM","messageBody":"**Defender Monitor {{ sentinel.name }} Triggered**\n\n**Network**\n\n{{ sentinel.network }}\n\n**Block Hash**\n\n{{ blockHash }}\n\n**Transaction Hash**\n\n{{ transaction.transactionHash }}\n\n**Explorer Link**\n\n{{ transaction.link }}\n\n**Match Reasons**\n\n{{ matchReasonsFormatted }}\n\n**Metadata**\n\n{{ metadataFormatted }}","messageSubject":"Defender Monitor: TaikoL1: Pause/Unpause triggered","notifications":[{"type":"discord","sendCount":0,"notificationId":"93e8dbf2-4f87-4793-b3c3-6ff0dd6cf827"}],"timeoutMs":60000},"tenantId":"0691b59e-8b53-4ae2-b874-959de8a9f2ee","addressRules":[{"conditions":[{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"Paused(address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"Unpaused(address)","expression":null}]}],"abi":"[{\"type\":\"error\",\"name\":\"AM_ADDRESS_ALREADY_SET\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"AddressSet\",\"inputs\":[{\"type\":\"uint64\",\"name\":\"chainId\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"name\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newAddress\",\"indexed\":false},{\"type\":\"address\",\"name\":\"oldAddress\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"AdminChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousAdmin\",\"indexed\":false},{\"type\":\"address\",\"name\":\"newAdmin\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Approval\",\"inputs\":[{\"type\":\"address\",\"name\":\"owner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"spender\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"value\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Approval\",\"inputs\":[{\"type\":\"address\",\"name\":\"owner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"approved\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"tokenId\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"ApprovalForAll\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":true},{\"type\":\"address\",\"name\":\"operator\",\"indexed\":true},{\"type\":\"bool\",\"name\":\"approved\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Approved\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"operationId\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"approvalBits\",\"indexed\":false},{\"type\":\"bool\",\"name\":\"minGuardiansReached\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Authorized\",\"inputs\":[{\"type\":\"address\",\"name\":\"addr\",\"indexed\":true},{\"type\":\"bool\",\"name\":\"authorized\",\"indexed\":false}]},{\"type\":\"error\",\"name\":\"BB_INVALID_PARAMS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BB_MINT_DISALLOWED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BB_PERMISSION_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BTOKEN_CANNOT_RECEIVE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BTOKEN_INVALID_BURN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BTOKEN_INVALID_PARAMS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INSUFFICIENT_GAS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_CONTEXT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_FEE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_GAS_LIMIT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_VALUE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_MESSAGE_NOT_SENT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_OUT_OF_ETH_QUOTA\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_PERMISSION_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_PROOF_TOO_LARGE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_RETRY_FAILED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_SIGNAL_NOT_RECEIVED\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BeaconUpgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"beacon\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BlockProposed\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"address\",\"name\":\"assignedProver\",\"indexed\":true},{\"type\":\"uint96\",\"name\":\"livenessBond\",\"indexed\":false},{\"type\":\"tuple\",\"name\":\"meta\",\"indexed\":false,\"components\":[{\"type\":\"bytes32\",\"name\":\"l1Hash\"},{\"type\":\"bytes32\",\"name\":\"difficulty\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"bytes32\",\"name\":\"extraData\"},{\"type\":\"bytes32\",\"name\":\"depositsHash\"},{\"type\":\"address\",\"name\":\"coinbase\"},{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"uint64\",\"name\":\"timestamp\"},{\"type\":\"uint64\",\"name\":\"l1Height\"},{\"type\":\"uint16\",\"name\":\"minTier\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"bytes32\",\"name\":\"parentMetaHash\"},{\"type\":\"address\",\"name\":\"sender\"}]},{\"type\":\"tuple[]\",\"name\":\"depositsProcessed\",\"indexed\":false,\"components\":[{\"type\":\"address\",\"name\":\"recipient\"},{\"type\":\"uint96\",\"name\":\"amount\"},{\"type\":\"uint64\",\"name\":\"id\"}]}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BlockVerified\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"address\",\"name\":\"prover\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"blockHash\",\"indexed\":false},{\"type\":\"bytes32\",\"name\":\"stateRoot\",\"indexed\":false},{\"type\":\"uint16\",\"name\":\"tier\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BondCredited\",\"inputs\":[{\"type\":\"address\",\"name\":\"user\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"amount\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BondDebited\",\"inputs\":[{\"type\":\"address\",\"name\":\"user\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"amount\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BridgedTokenChanged\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"srcChainId\",\"indexed\":true},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":true},{\"type\":\"address\",\"name\":\"btokenOld\",\"indexed\":false},{\"type\":\"address\",\"name\":\"btokenNew\",\"indexed\":false},{\"type\":\"string\",\"name\":\"ctokenSymbol\",\"indexed\":false},{\"type\":\"string\",\"name\":\"ctokenName\",\"indexed\":false},{\"type\":\"uint8\",\"name\":\"ctokenDecimal\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BridgedTokenDeployed\",\"inputs\":[{\"type\":\"uint64\",\"name\":\"chainId\",\"indexed\":true},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":true},{\"type\":\"address\",\"name\":\"btoken\",\"indexed\":true},{\"type\":\"string\",\"name\":\"ctokenSymbol\",\"indexed\":false},{\"type\":\"string\",\"name\":\"ctokenName\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BridgedTokenDeployed\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"srcChainId\",\"indexed\":true},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":true},{\"type\":\"address\",\"name\":\"btoken\",\"indexed\":true},{\"type\":\"string\",\"name\":\"ctokenSymbol\",\"indexed\":false},{\"type\":\"string\",\"name\":\"ctokenName\",\"indexed\":false},{\"type\":\"uint8\",\"name\":\"ctokenDecimal\",\"indexed\":false}]},{\"type\":\"function\",\"name\":\"CLOCK_MODE\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"string\"}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"CalldataTxList\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"bytes\",\"name\":\"txList\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"ChainDataSynced\",\"inputs\":[{\"type\":\"uint64\",\"name\":\"chainId\",\"indexed\":true},{\"type\":\"uint64\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"kind\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"data\",\"indexed\":false},{\"type\":\"bytes32\",\"name\":\"signal\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"ConflictingProofs\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"address\",\"name\":\"guardian\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"currentProofHash\",\"indexed\":false},{\"type\":\"bytes32\",\"name\":\"newProofHash\",\"indexed\":false},{\"type\":\"bool\",\"name\":\"provingPaused\",\"indexed\":false}]},{\"type\":\"function\",\"name\":\"DOMAIN_SEPARATOR\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"DelegateChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"delegator\",\"indexed\":true},{\"type\":\"address\",\"name\":\"fromDelegate\",\"indexed\":true},{\"type\":\"address\",\"name\":\"toDelegate\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"DelegateVotesChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"delegate\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"previousBalance\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"newBalance\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"EIP712DomainChanged\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ETH_TRANSFER_FAILED\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"EtherPaymentFailed\",\"inputs\":[{\"type\":\"address\",\"name\":\"to\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"maxGas\",\"indexed\":false}]},{\"type\":\"error\",\"name\":\"FUNC_NOT_IMPLEMENTED\",\"inputs\":[]},{\"type\":\"function\",\"name\":\"GAS_OVERHEAD\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint32\"}]},{\"type\":\"function\",\"name\":\"GAS_RESERVE\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"GP_INVALID_GUARDIAN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GP_INVALID_GUARDIAN_SET\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GP_INVALID_MIN_GUARDIANS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GP_INVALID_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GV_PERMISSION_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GV_ZERO_ADDRESS\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"GuardianApproval\",\"inputs\":[{\"type\":\"address\",\"name\":\"addr\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"blockHash\",\"indexed\":true},{\"type\":\"bool\",\"name\":\"approved\",\"indexed\":false},{\"type\":\"bytes\",\"name\":\"proofData\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"GuardiansUpdated\",\"inputs\":[{\"type\":\"uint32\",\"name\":\"version\",\"indexed\":false},{\"type\":\"address[]\",\"name\":\"guardians\",\"indexed\":false}]},{\"type\":\"error\",\"name\":\"HOOK_ASSIGNMENT_EXPIRED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"HOOK_ASSIGNMENT_INVALID_SIG\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"HOOK_TIER_NOT_FOUND\",\"inputs\":[]},{\"type\":\"function\",\"name\":\"INSTANCE_EXPIRY\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"INSTANCE_VALIDITY_DELAY\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Initialized\",\"inputs\":[{\"type\":\"uint8\",\"name\":\"version\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"InstanceAdded\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"id\",\"indexed\":true},{\"type\":\"address\",\"name\":\"instance\",\"indexed\":true},{\"type\":\"address\",\"name\":\"replaced\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"validSince\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"InstanceDeleted\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"id\",\"indexed\":true},{\"type\":\"address\",\"name\":\"instance\",\"indexed\":true}]},{\"type\":\"error\",\"name\":\"L1_ALREADY_CONTESTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_ALREADY_PROVED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOB_NOT_AVAILABLE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOB_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOCK_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_CANNOT_CONTEST\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_BLOCK_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_GENESIS_HASH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_SIG\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_TIER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_TRANSITION\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_NOT_ASSIGNED_PROVER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_PROVING_PAUSED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_RECEIVE_DISABLED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TOO_MANY_BLOCKS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TRANSITION_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNEXPECTED_PARENT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNEXPECTED_TRANSITION_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"LTP_INVALID_ACCOUNT_PROOF\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"LTP_INVALID_INCLUSION_PROOF\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"LocalReportCheckToggled\",\"inputs\":[{\"type\":\"bool\",\"name\":\"checkLocalEnclaveReport\",\"indexed\":false}]},{\"type\":\"function\",\"name\":\"MAX_GAS_PAYING_PROVER\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"MIN_MIGRATION_DELAY\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MessageProcessed\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"tuple\",\"name\":\"message\",\"indexed\":false,\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"tuple\",\"name\":\"stats\",\"indexed\":false,\"components\":[{\"type\":\"uint32\",\"name\":\"gasUsedInFeeCalc\"},{\"type\":\"uint32\",\"name\":\"proofSize\"},{\"type\":\"uint32\",\"name\":\"numCacheOps\"},{\"type\":\"bool\",\"name\":\"processedByRelayer\"}]}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MessageSent\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"tuple\",\"name\":\"message\",\"indexed\":false,\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MessageStatusChanged\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"uint8\",\"name\":\"status\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MigratedTo\",\"inputs\":[{\"type\":\"address\",\"name\":\"fromToken\",\"indexed\":true},{\"type\":\"address\",\"name\":\"account\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"amount\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MigrationStatusChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"addr\",\"indexed\":false},{\"type\":\"bool\",\"name\":\"inbound\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MrEnclaveUpdated\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"mrEnclave\",\"indexed\":true},{\"type\":\"bool\",\"name\":\"trusted\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MrSignerUpdated\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"mrSigner\",\"indexed\":true},{\"type\":\"bool\",\"name\":\"trusted\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferred\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Paused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"ProvingAutoPauseEnabled\",\"inputs\":[{\"type\":\"bool\",\"name\":\"enabled\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"ProvingPaused\",\"inputs\":[{\"type\":\"bool\",\"name\":\"paused\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"QeIdentityConfigured\",\"inputs\":[{\"type\":\"tuple\",\"name\":\"qeIdentityInput\",\"indexed\":false,\"components\":[{\"type\":\"bytes4\",\"name\":\"miscselect\"},{\"type\":\"bytes4\",\"name\":\"miscselectMask\"},{\"type\":\"uint16\",\"name\":\"isvprodid\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes16\",\"name\":\"attributesMask\"},{\"type\":\"bytes32\",\"name\":\"mrsigner\"},{\"type\":\"tuple[]\",\"name\":\"tcbLevels\",\"components\":[{\"type\":\"tuple\",\"name\":\"tcb\",\"components\":[{\"type\":\"uint16\",\"name\":\"isvsvn\"}]},{\"type\":\"uint8\",\"name\":\"tcbStatus\"}]}]}]},{\"type\":\"error\",\"name\":\"REENTRANT_CALL\",\"inputs\":[]},{\"type\":\"function\",\"name\":\"RELAYER_MAX_PROOF_BYTES\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"RESOLVER_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_INVALID_MANAGER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_UNEXPECTED_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_ZERO_ADDR\",\"inputs\":[{\"type\":\"uint64\",\"name\":\"chainId\"},{\"type\":\"bytes32\",\"name\":\"name\"}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"RevokedCertSerialNumAdded\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"index\",\"indexed\":true},{\"type\":\"bytes\",\"name\":\"serialNum\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"RevokedCertSerialNumRemoved\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"index\",\"indexed\":true},{\"type\":\"bytes\",\"name\":\"serialNum\",\"indexed\":false}]},{\"type\":\"error\",\"name\":\"SGX_ALREADY_ATTESTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SGX_INVALID_ATTESTATION\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SGX_INVALID_INSTANCE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SGX_INVALID_PROOF\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SGX_RA_NOT_SUPPORTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_EMPTY_PROOF\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_INVALID_HOPS_WITH_LOOP\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_INVALID_LAST_HOP_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_INVALID_MID_HOP_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_INVALID_STATE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_SIGNAL_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_UNAUTHORIZED\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"SignalSent\",\"inputs\":[{\"type\":\"address\",\"name\":\"app\",\"indexed\":false},{\"type\":\"bytes32\",\"name\":\"signal\",\"indexed\":false},{\"type\":\"bytes32\",\"name\":\"slot\",\"indexed\":false},{\"type\":\"bytes32\",\"name\":\"value\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"StateVariablesUpdated\",\"inputs\":[{\"type\":\"tuple\",\"name\":\"slotB\",\"indexed\":false,\"components\":[{\"type\":\"uint64\",\"name\":\"numBlocks\"},{\"type\":\"uint64\",\"name\":\"lastVerifiedBlockId\"},{\"type\":\"bool\",\"name\":\"provingPaused\"},{\"type\":\"uint8\",\"name\":\"__reservedB1\"},{\"type\":\"uint16\",\"name\":\"__reservedB2\"},{\"type\":\"uint32\",\"name\":\"__reservedB3\"},{\"type\":\"uint64\",\"name\":\"lastUnpausedAt\"}]}]},{\"type\":\"error\",\"name\":\"TIER_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"TT_INVALID_PARAM\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TcbInfoJsonConfigured\",\"inputs\":[{\"type\":\"string\",\"name\":\"fmspc\",\"indexed\":true},{\"type\":\"tuple\",\"name\":\"tcbInfoInput\",\"indexed\":false,\"components\":[{\"type\":\"string\",\"name\":\"pceid\"},{\"type\":\"string\",\"name\":\"fmspc\"},{\"type\":\"tuple[]\",\"name\":\"tcbLevels\",\"components\":[{\"type\":\"uint256\",\"name\":\"pcesvn\"},{\"type\":\"uint8[]\",\"name\":\"sgxTcbCompSvnArr\"},{\"type\":\"uint8\",\"name\":\"status\"}]}]}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TokenReceived\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint64\",\"name\":\"srcChainId\",\"indexed\":false},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":false},{\"type\":\"address\",\"name\":\"token\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"tokenIds\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"amounts\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TokenReceived\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint64\",\"name\":\"srcChainId\",\"indexed\":false},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":false},{\"type\":\"address\",\"name\":\"token\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"amount\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TokenReleased\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":false},{\"type\":\"address\",\"name\":\"token\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"tokenIds\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"amounts\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TokenReleased\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":false},{\"type\":\"address\",\"name\":\"token\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"amount\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TokenSent\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint64\",\"name\":\"destChainId\",\"indexed\":false},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":false},{\"type\":\"address\",\"name\":\"token\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"tokenIds\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"amounts\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TokenSent\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint64\",\"name\":\"canonicalChainId\",\"indexed\":false},{\"type\":\"uint64\",\"name\":\"destChainId\",\"indexed\":false},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":false},{\"type\":\"address\",\"name\":\"token\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"amount\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Transfer\",\"inputs\":[{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"value\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Transfer\",\"inputs\":[{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"tokenId\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TransferBatch\",\"inputs\":[{\"type\":\"address\",\"name\":\"operator\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint256[]\",\"name\":\"ids\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"values\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TransferSingle\",\"inputs\":[{\"type\":\"address\",\"name\":\"operator\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"id\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"value\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TransitionContested\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"tuple\",\"name\":\"tran\",\"indexed\":false,\"components\":[{\"type\":\"bytes32\",\"name\":\"parentHash\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"bytes32\",\"name\":\"graffiti\"}]},{\"type\":\"address\",\"name\":\"contester\",\"indexed\":false},{\"type\":\"uint96\",\"name\":\"contestBond\",\"indexed\":false},{\"type\":\"uint16\",\"name\":\"tier\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TransitionProved\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"tuple\",\"name\":\"tran\",\"indexed\":false,\"components\":[{\"type\":\"bytes32\",\"name\":\"parentHash\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"bytes32\",\"name\":\"graffiti\"}]},{\"type\":\"address\",\"name\":\"prover\",\"indexed\":false},{\"type\":\"uint96\",\"name\":\"validityBond\",\"indexed\":false},{\"type\":\"uint16\",\"name\":\"tier\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"URI\",\"inputs\":[{\"type\":\"string\",\"name\":\"value\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"id\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Unpaused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Upgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"implementation\",\"indexed\":true}]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_CERTIFICATION_CHAIN_DATA\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_CERTIFICATION_CHAIN_SIZE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_ECDSA_SIGNATURE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_QEAUTHDATA_SIZE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_QEREPORT_LENGTN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_QUOTE_LENGTN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_QUOTE_MEMBER_LENGTN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_UNSUPPORT_CERTIFICATION_TYPE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_BTOKEN_BLACKLISTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_CTOKEN_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INSUFFICIENT_FEE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INTERFACE_NOT_SUPPORTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_AMOUNT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_CTOKEN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_NEW_BTOKEN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_TOKEN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_TO_ADDR\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_LAST_MIGRATION_TOO_CLOSE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_PERMISSION_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_TOKEN_ARRAY_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_ADDRESS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_ADDR_MANAGER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_VALUE\",\"inputs\":[]},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"addInstances\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address[]\",\"name\":\"_instances\"}],\"outputs\":[{\"type\":\"uint256[]\"}]},{\"type\":\"function\",\"name\":\"addRevokedCertSerialNum\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"index\"},{\"type\":\"bytes[]\",\"name\":\"serialNumBatch\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"addressManager\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"addressRegistered\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"instanceAddress\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"alreadyAttested\"}]},{\"type\":\"function\",\"name\":\"allowance\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"owner\"},{\"type\":\"address\",\"name\":\"spender\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"approvals\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"version\"},{\"type\":\"bytes32\",\"name\":\"proofHash\"}],\"outputs\":[{\"type\":\"uint256\",\"name\":\"approvalBits\"}]},{\"type\":\"function\",\"name\":\"approve\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"spender\"},{\"type\":\"uint256\",\"name\":\"amount\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"approve\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_meta\",\"components\":[{\"type\":\"bytes32\",\"name\":\"l1Hash\"},{\"type\":\"bytes32\",\"name\":\"difficulty\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"bytes32\",\"name\":\"extraData\"},{\"type\":\"bytes32\",\"name\":\"depositsHash\"},{\"type\":\"address\",\"name\":\"coinbase\"},{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"uint64\",\"name\":\"timestamp\"},{\"type\":\"uint64\",\"name\":\"l1Height\"},{\"type\":\"uint16\",\"name\":\"minTier\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"bytes32\",\"name\":\"parentMetaHash\"},{\"type\":\"address\",\"name\":\"sender\"}]},{\"type\":\"tuple\",\"name\":\"_tran\",\"components\":[{\"type\":\"bytes32\",\"name\":\"parentHash\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"bytes32\",\"name\":\"graffiti\"}]},{\"type\":\"tuple\",\"name\":\"_proof\",\"components\":[{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[{\"type\":\"bool\",\"name\":\"approved_\"}]},{\"type\":\"function\",\"name\":\"approve\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"tokenId\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"authorize\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_addr\"},{\"type\":\"bool\",\"name\":\"_authorize\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"balanceOf\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"balanceOf\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"},{\"type\":\"uint256\",\"name\":\"id\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"balanceOfBatch\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address[]\",\"name\":\"accounts\"},{\"type\":\"uint256[]\",\"name\":\"ids\"}],\"outputs\":[{\"type\":\"uint256[]\"}]},{\"type\":\"function\",\"name\":\"batchTransfer\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address[]\",\"name\":\"recipients\"},{\"type\":\"uint256[]\",\"name\":\"amounts\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"bondBalanceOf\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_user\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"bridgedToCanonical\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"btoken\"}],\"outputs\":[{\"type\":\"uint64\",\"name\":\"chainId\"},{\"type\":\"address\",\"name\":\"addr\"},{\"type\":\"string\",\"name\":\"symbol\"},{\"type\":\"string\",\"name\":\"name\"}]},{\"type\":\"function\",\"name\":\"bridgedToCanonical\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"btoken\"}],\"outputs\":[{\"type\":\"uint64\",\"name\":\"chainId\"},{\"type\":\"address\",\"name\":\"addr\"},{\"type\":\"uint8\",\"name\":\"decimals\"},{\"type\":\"string\",\"name\":\"symbol\"},{\"type\":\"string\",\"name\":\"name\"}]},{\"type\":\"function\",\"name\":\"btokenDenylist\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"btoken\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"denied\"}]},{\"type\":\"function\",\"name\":\"burn\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_account\"},{\"type\":\"uint256\",\"name\":\"_tokenId\"},{\"type\":\"uint256\",\"name\":\"_amount\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"burn\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_account\"},{\"type\":\"uint256\",\"name\":\"_tokenId\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"burn\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"_amount\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"canonical\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"},{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"canonicalToBridged\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"chainId\"},{\"type\":\"address\",\"name\":\"ctoken\"}],\"outputs\":[{\"type\":\"address\",\"name\":\"btoken\"}]},{\"type\":\"function\",\"name\":\"changeBridgedToken\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_ctoken\",\"components\":[{\"type\":\"uint64\",\"name\":\"chainId\"},{\"type\":\"address\",\"name\":\"addr\"},{\"type\":\"uint8\",\"name\":\"decimals\"},{\"type\":\"string\",\"name\":\"symbol\"},{\"type\":\"string\",\"name\":\"name\"}]},{\"type\":\"address\",\"name\":\"_btokenNew\"}],\"outputs\":[{\"type\":\"address\",\"name\":\"btokenOld_\"}]},{\"type\":\"function\",\"name\":\"changeMigrationStatus\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_migratingAddress\"},{\"type\":\"bool\",\"name\":\"_migratingInbound\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"checkLocalEnclaveReport\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"checkpoints\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"},{\"type\":\"uint32\",\"name\":\"pos\"}],\"outputs\":[{\"type\":\"tuple\",\"components\":[{\"type\":\"uint32\",\"name\":\"fromBlock\"},{\"type\":\"uint224\",\"name\":\"votes\"}]}]},{\"type\":\"function\",\"name\":\"clock\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint48\"}]},{\"type\":\"function\",\"name\":\"configureQeIdentityJson\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"qeIdentityInput\",\"components\":[{\"type\":\"bytes4\",\"name\":\"miscselect\"},{\"type\":\"bytes4\",\"name\":\"miscselectMask\"},{\"type\":\"uint16\",\"name\":\"isvprodid\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes16\",\"name\":\"attributesMask\"},{\"type\":\"bytes32\",\"name\":\"mrsigner\"},{\"type\":\"tuple[]\",\"name\":\"tcbLevels\",\"components\":[{\"type\":\"tuple\",\"name\":\"tcb\",\"components\":[{\"type\":\"uint16\",\"name\":\"isvsvn\"}]},{\"type\":\"uint8\",\"name\":\"tcbStatus\"}]}]}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"configureTcbInfoJson\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"string\",\"name\":\"fmspc\"},{\"type\":\"tuple\",\"name\":\"tcbInfoInput\",\"components\":[{\"type\":\"string\",\"name\":\"pceid\"},{\"type\":\"string\",\"name\":\"fmspc\"},{\"type\":\"tuple[]\",\"name\":\"tcbLevels\",\"components\":[{\"type\":\"uint256\",\"name\":\"pcesvn\"},{\"type\":\"uint8[]\",\"name\":\"sgxTcbCompSvnArr\"},{\"type\":\"uint8\",\"name\":\"status\"}]}]}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"context\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"tuple\",\"name\":\"ctx_\",\"components\":[{\"type\":\"bytes32\",\"name\":\"msgHash\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"}]}]},{\"type\":\"function\",\"name\":\"decimals\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint8\"}]},{\"type\":\"function\",\"name\":\"decodeCert\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"bytes\",\"name\":\"der\"},{\"type\":\"bool\",\"name\":\"isPckCert\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"success\"},{\"type\":\"tuple\",\"name\":\"cert\",\"components\":[{\"type\":\"uint256\",\"name\":\"notBefore\"},{\"type\":\"uint256\",\"name\":\"notAfter\"},{\"type\":\"bytes\",\"name\":\"serialNumber\"},{\"type\":\"bytes\",\"name\":\"tbsCertificate\"},{\"type\":\"bytes\",\"name\":\"pubKey\"},{\"type\":\"bytes\",\"name\":\"signature\"},{\"type\":\"bool\",\"name\":\"isPck\"},{\"type\":\"tuple\",\"name\":\"pck\",\"components\":[{\"type\":\"string\",\"name\":\"commonName\"},{\"type\":\"string\",\"name\":\"issuerName\"},{\"type\":\"tuple\",\"name\":\"sgxExtension\",\"components\":[{\"type\":\"string\",\"name\":\"pceid\"},{\"type\":\"string\",\"name\":\"fmspc\"},{\"type\":\"uint256\",\"name\":\"pcesvn\"},{\"type\":\"uint256[]\",\"name\":\"sgxTcbCompSvnArr\"}]}]}]}]},{\"type\":\"function\",\"name\":\"decreaseAllowance\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"spender\"},{\"type\":\"uint256\",\"name\":\"subtractedValue\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"delegate\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"delegatee\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"delegateBySig\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"delegatee\"},{\"type\":\"uint256\",\"name\":\"nonce\"},{\"type\":\"uint256\",\"name\":\"expiry\"},{\"type\":\"uint8\",\"name\":\"v\"},{\"type\":\"bytes32\",\"name\":\"r\"},{\"type\":\"bytes32\",\"name\":\"s\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"delegates\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"deleteInstances\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256[]\",\"name\":\"_ids\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"depositBond\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"_amount\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"eip712Domain\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes1\",\"name\":\"fields\"},{\"type\":\"string\",\"name\":\"name\"},{\"type\":\"string\",\"name\":\"version\"},{\"type\":\"uint256\",\"name\":\"chainId\"},{\"type\":\"address\",\"name\":\"verifyingContract\"},{\"type\":\"bytes32\",\"name\":\"salt\"},{\"type\":\"uint256[]\",\"name\":\"extensions\"}]},{\"type\":\"function\",\"name\":\"enableProvingAutoPause\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"bool\",\"name\":\"_enable\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"enableTaikoTokenAllowance\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"bool\",\"name\":\"_enable\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"failMessage\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"getAddress\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"getApproved\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"tokenId\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"getBlock\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_blockId\"}],\"outputs\":[{\"type\":\"tuple\",\"name\":\"blk_\",\"components\":[{\"type\":\"bytes32\",\"name\":\"metaHash\"},{\"type\":\"address\",\"name\":\"assignedProver\"},{\"type\":\"uint96\",\"name\":\"livenessBond\"},{\"type\":\"uint64\",\"name\":\"blockId\"},{\"type\":\"uint64\",\"name\":\"proposedAt\"},{\"type\":\"uint64\",\"name\":\"proposedIn\"},{\"type\":\"uint32\",\"name\":\"nextTransitionId\"},{\"type\":\"uint32\",\"name\":\"verifiedTransitionId\"}]}]},{\"type\":\"function\",\"name\":\"getConfig\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"tuple\",\"components\":[{\"type\":\"uint64\",\"name\":\"chainId\"},{\"type\":\"uint64\",\"name\":\"blockMaxProposals\"},{\"type\":\"uint64\",\"name\":\"blockRingBufferSize\"},{\"type\":\"uint64\",\"name\":\"maxBlocksToVerify\"},{\"type\":\"uint32\",\"name\":\"blockMaxGasLimit\"},{\"type\":\"uint96\",\"name\":\"livenessBond\"},{\"type\":\"uint8\",\"name\":\"stateRootSyncInternal\"},{\"type\":\"bool\",\"name\":\"checkEOAForCalldataDA\"}]}]},{\"type\":\"function\",\"name\":\"getLastSyncedBlock\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\",\"name\":\"blockId_\"},{\"type\":\"bytes32\",\"name\":\"blockHash_\"},{\"type\":\"bytes32\",\"name\":\"stateRoot_\"}]},{\"type\":\"function\",\"name\":\"getLastVerifiedBlock\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\",\"name\":\"blockId_\"},{\"type\":\"bytes32\",\"name\":\"blockHash_\"},{\"type\":\"bytes32\",\"name\":\"stateRoot_\"}]},{\"type\":\"function\",\"name\":\"getMessageMinGasLimit\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"dataLength\"}],\"outputs\":[{\"type\":\"uint32\"}]},{\"type\":\"function\",\"name\":\"getMinTier\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\"}],\"outputs\":[{\"type\":\"uint16\"}]},{\"type\":\"function\",\"name\":\"getPastTotalSupply\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"timepoint\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"getPastVotes\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"},{\"type\":\"uint256\",\"name\":\"timepoint\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"getSignalSlot\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"address\",\"name\":\"_app\"},{\"type\":\"bytes32\",\"name\":\"_signal\"}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"getStateVariables\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"tuple\",\"components\":[{\"type\":\"uint64\",\"name\":\"genesisHeight\"},{\"type\":\"uint64\",\"name\":\"genesisTimestamp\"},{\"type\":\"uint64\",\"name\":\"lastSyncedBlockId\"},{\"type\":\"uint64\",\"name\":\"lastSynecdAt\"}]},{\"type\":\"tuple\",\"components\":[{\"type\":\"uint64\",\"name\":\"numBlocks\"},{\"type\":\"uint64\",\"name\":\"lastVerifiedBlockId\"},{\"type\":\"bool\",\"name\":\"provingPaused\"},{\"type\":\"uint8\",\"name\":\"__reservedB1\"},{\"type\":\"uint16\",\"name\":\"__reservedB2\"},{\"type\":\"uint32\",\"name\":\"__reservedB3\"},{\"type\":\"uint64\",\"name\":\"lastUnpausedAt\"}]}]},{\"type\":\"function\",\"name\":\"getSyncedChainData\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_kind\"},{\"type\":\"uint64\",\"name\":\"_blockId\"}],\"outputs\":[{\"type\":\"uint64\",\"name\":\"blockId_\"},{\"type\":\"bytes32\",\"name\":\"chainData_\"}]},{\"type\":\"function\",\"name\":\"getTier\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"uint16\",\"name\":\"_tierId\"}],\"outputs\":[{\"type\":\"tuple\",\"components\":[{\"type\":\"bytes32\",\"name\":\"verifierName\"},{\"type\":\"uint96\",\"name\":\"validityBond\"},{\"type\":\"uint96\",\"name\":\"contestBond\"},{\"type\":\"uint24\",\"name\":\"cooldownWindow\"},{\"type\":\"uint16\",\"name\":\"provingWindow\"},{\"type\":\"uint8\",\"name\":\"maxBlocksToVerifyPerProof\"}]}]},{\"type\":\"function\",\"name\":\"getTierIds\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint16[]\",\"name\":\"tiers_\"}]},{\"type\":\"function\",\"name\":\"getTransition\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_blockId\"},{\"type\":\"uint32\",\"name\":\"_tid\"}],\"outputs\":[{\"type\":\"tuple\",\"components\":[{\"type\":\"bytes32\",\"name\":\"key\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"address\",\"name\":\"prover\"},{\"type\":\"uint96\",\"name\":\"validityBond\"},{\"type\":\"address\",\"name\":\"contester\"},{\"type\":\"uint96\",\"name\":\"contestBond\"},{\"type\":\"uint64\",\"name\":\"timestamp\"},{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"uint8\",\"name\":\"__reserved1\"}]}]},{\"type\":\"function\",\"name\":\"getTransition\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_blockId\"},{\"type\":\"bytes32\",\"name\":\"_parentHash\"}],\"outputs\":[{\"type\":\"tuple\",\"components\":[{\"type\":\"bytes32\",\"name\":\"key\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"address\",\"name\":\"prover\"},{\"type\":\"uint96\",\"name\":\"validityBond\"},{\"type\":\"address\",\"name\":\"contester\"},{\"type\":\"uint96\",\"name\":\"contestBond\"},{\"type\":\"uint64\",\"name\":\"timestamp\"},{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"uint8\",\"name\":\"__reserved1\"}]}]},{\"type\":\"function\",\"name\":\"getVerifiedBlockProver\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_blockId\"}],\"outputs\":[{\"type\":\"address\",\"name\":\"prover_\"}]},{\"type\":\"function\",\"name\":\"getVotes\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"guardianIds\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"guardian\"}],\"outputs\":[{\"type\":\"uint256\",\"name\":\"id\"}]},{\"type\":\"function\",\"name\":\"guardians\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"hashAssignment\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_assignment\",\"components\":[{\"type\":\"address\",\"name\":\"feeToken\"},{\"type\":\"uint64\",\"name\":\"expiry\"},{\"type\":\"uint64\",\"name\":\"maxBlockId\"},{\"type\":\"uint64\",\"name\":\"maxProposedIn\"},{\"type\":\"bytes32\",\"name\":\"metaHash\"},{\"type\":\"bytes32\",\"name\":\"parentMetaHash\"},{\"type\":\"tuple[]\",\"name\":\"tierFees\",\"components\":[{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"uint128\",\"name\":\"fee\"}]},{\"type\":\"bytes\",\"name\":\"signature\"}]},{\"type\":\"address\",\"name\":\"_taikoL1Address\"},{\"type\":\"address\",\"name\":\"_blockProposer\"},{\"type\":\"address\",\"name\":\"_assignedProver\"},{\"type\":\"bytes32\",\"name\":\"_blobHash\"}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"hashMessage\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"impl\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"inNonReentrant\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"increaseAllowance\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"spender\"},{\"type\":\"uint256\",\"name\":\"addedValue\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"},{\"type\":\"address\",\"name\":\"_addressManager\"},{\"type\":\"bytes32\",\"name\":\"_genesisBlockHash\"},{\"type\":\"bool\",\"name\":\"_toPause\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"},{\"type\":\"address\",\"name\":\"_addressManager\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"},{\"type\":\"address\",\"name\":\"_addressManager\"},{\"type\":\"address\",\"name\":\"_srcToken\"},{\"type\":\"uint256\",\"name\":\"_srcChainId\"},{\"type\":\"string\",\"name\":\"_symbol\"},{\"type\":\"string\",\"name\":\"_name\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"owner\"},{\"type\":\"address\",\"name\":\"sigVerifyLibAddr\"},{\"type\":\"address\",\"name\":\"pemCertLibAddr\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"},{\"type\":\"address\",\"name\":\"_addressManager\"},{\"type\":\"address\",\"name\":\"_srcToken\"},{\"type\":\"uint256\",\"name\":\"_srcChainId\"},{\"type\":\"uint8\",\"name\":\"_decimals\"},{\"type\":\"string\",\"name\":\"_symbol\"},{\"type\":\"string\",\"name\":\"_name\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init2\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"instances\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"instanceId\"}],\"outputs\":[{\"type\":\"address\",\"name\":\"addr\"},{\"type\":\"uint64\",\"name\":\"validSince\"}]},{\"type\":\"function\",\"name\":\"isApprovedForAll\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"},{\"type\":\"address\",\"name\":\"operator\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"isAuthorized\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"addr\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"authorized\"}]},{\"type\":\"function\",\"name\":\"isChainDataSynced\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_kind\"},{\"type\":\"uint64\",\"name\":\"_blockId\"},{\"type\":\"bytes32\",\"name\":\"_chainData\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"isDestChainEnabled\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"enabled_\"},{\"type\":\"address\",\"name\":\"destBridge_\"}]},{\"type\":\"function\",\"name\":\"isMessageFailed\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"bytes\",\"name\":\"_proof\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"isMessageReceived\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"bytes\",\"name\":\"_proof\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"isMessageSent\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"isSignalSent\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_app\"},{\"type\":\"bytes32\",\"name\":\"_signal\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"lastMigrationStart\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"chainId\"},{\"type\":\"address\",\"name\":\"ctoken\"}],\"outputs\":[{\"type\":\"uint256\",\"name\":\"timestamp\"}]},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"latestProofHash\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"version\"},{\"type\":\"uint256\",\"name\":\"blockId\"}],\"outputs\":[{\"type\":\"bytes32\",\"name\":\"hash\"}]},{\"type\":\"function\",\"name\":\"messageStatus\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\"}],\"outputs\":[{\"type\":\"uint8\",\"name\":\"status\"}]},{\"type\":\"function\",\"name\":\"migratingAddress\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"migratingInbound\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"minGuardians\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint32\"}]},{\"type\":\"function\",\"name\":\"mint\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_to\"},{\"type\":\"uint256\",\"name\":\"_tokenId\"},{\"type\":\"uint256\",\"name\":\"_amount\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"mint\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_account\"},{\"type\":\"uint256\",\"name\":\"_tokenId\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"mintBatch\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_to\"},{\"type\":\"uint256[]\",\"name\":\"_tokenIds\"},{\"type\":\"uint256[]\",\"name\":\"_amounts\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"name\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"name\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"string\"}]},{\"type\":\"function\",\"name\":\"nextInstanceId\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"nextMessageId\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"nonces\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"owner\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"numCheckpoints\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"}],\"outputs\":[{\"type\":\"uint32\"}]},{\"type\":\"function\",\"name\":\"numGuardians\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"onBlockProposed\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_blk\",\"components\":[{\"type\":\"bytes32\",\"name\":\"metaHash\"},{\"type\":\"address\",\"name\":\"assignedProver\"},{\"type\":\"uint96\",\"name\":\"livenessBond\"},{\"type\":\"uint64\",\"name\":\"blockId\"},{\"type\":\"uint64\",\"name\":\"proposedAt\"},{\"type\":\"uint64\",\"name\":\"proposedIn\"},{\"type\":\"uint32\",\"name\":\"nextTransitionId\"},{\"type\":\"uint32\",\"name\":\"verifiedTransitionId\"}]},{\"type\":\"tuple\",\"name\":\"_meta\",\"components\":[{\"type\":\"bytes32\",\"name\":\"l1Hash\"},{\"type\":\"bytes32\",\"name\":\"difficulty\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"bytes32\",\"name\":\"extraData\"},{\"type\":\"bytes32\",\"name\":\"depositsHash\"},{\"type\":\"address\",\"name\":\"coinbase\"},{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"uint64\",\"name\":\"timestamp\"},{\"type\":\"uint64\",\"name\":\"l1Height\"},{\"type\":\"uint16\",\"name\":\"minTier\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"bytes32\",\"name\":\"parentMetaHash\"},{\"type\":\"address\",\"name\":\"sender\"}]},{\"type\":\"bytes\",\"name\":\"_data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"onERC1155BatchReceived\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"address\"},{\"type\":\"address\"},{\"type\":\"uint256[]\"},{\"type\":\"uint256[]\"},{\"type\":\"bytes\"}],\"outputs\":[{\"type\":\"bytes4\"}]},{\"type\":\"function\",\"name\":\"onERC1155Received\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"address\"},{\"type\":\"address\"},{\"type\":\"uint256\"},{\"type\":\"uint256\"},{\"type\":\"bytes\"}],\"outputs\":[{\"type\":\"bytes4\"}]},{\"type\":\"function\",\"name\":\"onERC721Received\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"address\"},{\"type\":\"address\"},{\"type\":\"uint256\"},{\"type\":\"bytes\"}],\"outputs\":[{\"type\":\"bytes4\"}]},{\"type\":\"function\",\"name\":\"onMessageInvocation\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"bytes\",\"name\":\"_data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"onMessageRecalled\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"bytes32\",\"name\":\"_msgHash\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"owner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"ownerOf\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"tokenId\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"pause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"pauseProving\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"bool\",\"name\":\"_pause\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"pauseTaikoProving\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"paused\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"pemCertLib\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"pendingOwner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"permit\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"owner\"},{\"type\":\"address\",\"name\":\"spender\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"uint256\",\"name\":\"deadline\"},{\"type\":\"uint8\",\"name\":\"v\"},{\"type\":\"bytes32\",\"name\":\"r\"},{\"type\":\"bytes32\",\"name\":\"s\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"processMessage\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"bytes\",\"name\":\"_proof\"}],\"outputs\":[{\"type\":\"uint8\",\"name\":\"status_\"},{\"type\":\"uint8\",\"name\":\"reason_\"}]},{\"type\":\"function\",\"name\":\"proposeBlock\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"bytes\",\"name\":\"_params\"},{\"type\":\"bytes\",\"name\":\"_txList\"}],\"outputs\":[{\"type\":\"tuple\",\"name\":\"meta_\",\"components\":[{\"type\":\"bytes32\",\"name\":\"l1Hash\"},{\"type\":\"bytes32\",\"name\":\"difficulty\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"bytes32\",\"name\":\"extraData\"},{\"type\":\"bytes32\",\"name\":\"depositsHash\"},{\"type\":\"address\",\"name\":\"coinbase\"},{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"uint64\",\"name\":\"timestamp\"},{\"type\":\"uint64\",\"name\":\"l1Height\"},{\"type\":\"uint16\",\"name\":\"minTier\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"bytes32\",\"name\":\"parentMetaHash\"},{\"type\":\"address\",\"name\":\"sender\"}]},{\"type\":\"tuple[]\",\"name\":\"deposits_\",\"components\":[{\"type\":\"address\",\"name\":\"recipient\"},{\"type\":\"uint96\",\"name\":\"amount\"},{\"type\":\"uint64\",\"name\":\"id\"}]}]},{\"type\":\"function\",\"name\":\"proveBlock\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_blockId\"},{\"type\":\"bytes\",\"name\":\"_input\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"proveSignalReceived\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"address\",\"name\":\"_app\"},{\"type\":\"bytes32\",\"name\":\"_signal\"},{\"type\":\"bytes\",\"name\":\"_proof\"}],\"outputs\":[{\"type\":\"uint256\",\"name\":\"numCacheOps_\"}]},{\"type\":\"function\",\"name\":\"provingAutoPauseEnabled\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"qeIdentity\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes4\",\"name\":\"miscselect\"},{\"type\":\"bytes4\",\"name\":\"miscselectMask\"},{\"type\":\"uint16\",\"name\":\"isvprodid\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes16\",\"name\":\"attributesMask\"},{\"type\":\"bytes32\",\"name\":\"mrsigner\"}]},{\"type\":\"function\",\"name\":\"recallMessage\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"bytes\",\"name\":\"_proof\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"registerInstance\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_attestation\",\"components\":[{\"type\":\"tuple\",\"name\":\"header\",\"components\":[{\"type\":\"bytes2\",\"name\":\"version\"},{\"type\":\"bytes2\",\"name\":\"attestationKeyType\"},{\"type\":\"bytes4\",\"name\":\"teeType\"},{\"type\":\"bytes2\",\"name\":\"qeSvn\"},{\"type\":\"bytes2\",\"name\":\"pceSvn\"},{\"type\":\"bytes16\",\"name\":\"qeVendorId\"},{\"type\":\"bytes20\",\"name\":\"userData\"}]},{\"type\":\"tuple\",\"name\":\"localEnclaveReport\",\"components\":[{\"type\":\"bytes16\",\"name\":\"cpuSvn\"},{\"type\":\"bytes4\",\"name\":\"miscSelect\"},{\"type\":\"bytes28\",\"name\":\"reserved1\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes32\",\"name\":\"mrEnclave\"},{\"type\":\"bytes32\",\"name\":\"reserved2\"},{\"type\":\"bytes32\",\"name\":\"mrSigner\"},{\"type\":\"bytes\",\"name\":\"reserved3\"},{\"type\":\"uint16\",\"name\":\"isvProdId\"},{\"type\":\"uint16\",\"name\":\"isvSvn\"},{\"type\":\"bytes\",\"name\":\"reserved4\"},{\"type\":\"bytes\",\"name\":\"reportData\"}]},{\"type\":\"tuple\",\"name\":\"v3AuthData\",\"components\":[{\"type\":\"bytes\",\"name\":\"ecdsa256BitSignature\"},{\"type\":\"bytes\",\"name\":\"ecdsaAttestationKey\"},{\"type\":\"tuple\",\"name\":\"pckSignedQeReport\",\"components\":[{\"type\":\"bytes16\",\"name\":\"cpuSvn\"},{\"type\":\"bytes4\",\"name\":\"miscSelect\"},{\"type\":\"bytes28\",\"name\":\"reserved1\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes32\",\"name\":\"mrEnclave\"},{\"type\":\"bytes32\",\"name\":\"reserved2\"},{\"type\":\"bytes32\",\"name\":\"mrSigner\"},{\"type\":\"bytes\",\"name\":\"reserved3\"},{\"type\":\"uint16\",\"name\":\"isvProdId\"},{\"type\":\"uint16\",\"name\":\"isvSvn\"},{\"type\":\"bytes\",\"name\":\"reserved4\"},{\"type\":\"bytes\",\"name\":\"reportData\"}]},{\"type\":\"bytes\",\"name\":\"qeReportSignature\"},{\"type\":\"tuple\",\"name\":\"qeAuthData\",\"components\":[{\"type\":\"uint16\",\"name\":\"parsedDataSize\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"tuple\",\"name\":\"certification\",\"components\":[{\"type\":\"uint16\",\"name\":\"certType\"},{\"type\":\"uint32\",\"name\":\"certDataSize\"},{\"type\":\"bytes[3]\",\"name\":\"decodedCertDataArray\"}]}]}]}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"removeRevokedCertSerialNum\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"index\"},{\"type\":\"bytes[]\",\"name\":\"serialNumBatch\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"resolve\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"bool\",\"name\":\"_allowZeroAddress\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"resolve\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"bool\",\"name\":\"_allowZeroAddress\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"retryMessage\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"bool\",\"name\":\"_isLastAttempt\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"safeBatchTransferFrom\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256[]\",\"name\":\"ids\"},{\"type\":\"uint256[]\",\"name\":\"amounts\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"safeTransferFrom\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"id\"},{\"type\":\"uint256\",\"name\":\"amount\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"safeTransferFrom\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"tokenId\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"safeTransferFrom\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"tokenId\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"selfDelegate\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_anyToken\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"sendMessage\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash_\"},{\"type\":\"tuple\",\"name\":\"message_\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}]},{\"type\":\"function\",\"name\":\"sendSignal\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"_signal\"}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"sendToken\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_op\",\"components\":[{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"address\",\"name\":\"token\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"uint256[]\",\"name\":\"tokenIds\"},{\"type\":\"uint256[]\",\"name\":\"amounts\"}]}],\"outputs\":[{\"type\":\"tuple\",\"name\":\"message_\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}]},{\"type\":\"function\",\"name\":\"sendToken\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_op\",\"components\":[{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"address\",\"name\":\"token\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"uint256\",\"name\":\"amount\"}]}],\"outputs\":[{\"type\":\"tuple\",\"name\":\"message_\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}]},{\"type\":\"function\",\"name\":\"serialNumIsRevoked\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"idx\"},{\"type\":\"bytes\",\"name\":\"serialNum\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"revoked\"}]},{\"type\":\"function\",\"name\":\"setAddress\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"address\",\"name\":\"_newAddress\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"setApprovalForAll\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"operator\"},{\"type\":\"bool\",\"name\":\"approved\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"setGuardians\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address[]\",\"name\":\"_newGuardians\"},{\"type\":\"uint8\",\"name\":\"_minGuardians\"},{\"type\":\"bool\",\"name\":\"_clearData\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"setMrEnclave\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"_mrEnclave\"},{\"type\":\"bool\",\"name\":\"_trusted\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"setMrSigner\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"_mrSigner\"},{\"type\":\"bool\",\"name\":\"_trusted\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"sigVerifyLib\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"signalForChainData\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_kind\"},{\"type\":\"uint64\",\"name\":\"_blockId\"}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"signalForFailedMessage\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"_msgHash\"}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"source\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"},{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"splitCertificateChain\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"bytes\",\"name\":\"pemChain\"},{\"type\":\"uint256\",\"name\":\"size\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"success\"},{\"type\":\"bytes[]\",\"name\":\"certs\"}]},{\"type\":\"function\",\"name\":\"srcChainId\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"srcToken\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"state\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\",\"name\":\"__reserve1\"},{\"type\":\"tuple\",\"name\":\"slotA\",\"components\":[{\"type\":\"uint64\",\"name\":\"genesisHeight\"},{\"type\":\"uint64\",\"name\":\"genesisTimestamp\"},{\"type\":\"uint64\",\"name\":\"lastSyncedBlockId\"},{\"type\":\"uint64\",\"name\":\"lastSynecdAt\"}]},{\"type\":\"tuple\",\"name\":\"slotB\",\"components\":[{\"type\":\"uint64\",\"name\":\"numBlocks\"},{\"type\":\"uint64\",\"name\":\"lastVerifiedBlockId\"},{\"type\":\"bool\",\"name\":\"provingPaused\"},{\"type\":\"uint8\",\"name\":\"__reservedB1\"},{\"type\":\"uint16\",\"name\":\"__reservedB2\"},{\"type\":\"uint32\",\"name\":\"__reservedB3\"},{\"type\":\"uint64\",\"name\":\"lastUnpausedAt\"}]}]},{\"type\":\"function\",\"name\":\"supportsInterface\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes4\",\"name\":\"_interfaceId\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"symbol\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"string\"}]},{\"type\":\"function\",\"name\":\"symbol\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"string\"}]},{\"type\":\"function\",\"name\":\"syncChainData\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_kind\"},{\"type\":\"uint64\",\"name\":\"_blockId\"},{\"type\":\"bytes32\",\"name\":\"_chainData\"}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"tcbInfo\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"string\",\"name\":\"fmspc\"}],\"outputs\":[{\"type\":\"string\",\"name\":\"pceid\"},{\"type\":\"string\",\"name\":\"fmspc\"}]},{\"type\":\"function\",\"name\":\"toggleLocalReportCheck\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"tokenURI\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"_tokenId\"}],\"outputs\":[{\"type\":\"string\"}]},{\"type\":\"function\",\"name\":\"topBlockId\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"chainId\"},{\"type\":\"bytes32\",\"name\":\"kind\"}],\"outputs\":[{\"type\":\"uint64\",\"name\":\"blockId\"}]},{\"type\":\"function\",\"name\":\"totalSupply\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"transfer\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"amount\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"transferFrom\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"amount\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"transferFrom\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"tokenId\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"transferOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newOwner\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"trustedUserMrEnclave\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"enclave\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"trusted\"}]},{\"type\":\"function\",\"name\":\"trustedUserMrSigner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"signer\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"trusted\"}]},{\"type\":\"function\",\"name\":\"unpause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeTo\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"uri\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\"}],\"outputs\":[{\"type\":\"string\"}]},{\"type\":\"function\",\"name\":\"verifyAttestation\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"success\"}]},{\"type\":\"function\",\"name\":\"verifyBlocks\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_maxBlocksToVerify\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"verifyES256Signature\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes\",\"name\":\"tbs\"},{\"type\":\"bytes\",\"name\":\"signature\"},{\"type\":\"bytes\",\"name\":\"publicKey\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"sigValid\"}]},{\"type\":\"function\",\"name\":\"verifyParsedQuote\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"v3quote\",\"components\":[{\"type\":\"tuple\",\"name\":\"header\",\"components\":[{\"type\":\"bytes2\",\"name\":\"version\"},{\"type\":\"bytes2\",\"name\":\"attestationKeyType\"},{\"type\":\"bytes4\",\"name\":\"teeType\"},{\"type\":\"bytes2\",\"name\":\"qeSvn\"},{\"type\":\"bytes2\",\"name\":\"pceSvn\"},{\"type\":\"bytes16\",\"name\":\"qeVendorId\"},{\"type\":\"bytes20\",\"name\":\"userData\"}]},{\"type\":\"tuple\",\"name\":\"localEnclaveReport\",\"components\":[{\"type\":\"bytes16\",\"name\":\"cpuSvn\"},{\"type\":\"bytes4\",\"name\":\"miscSelect\"},{\"type\":\"bytes28\",\"name\":\"reserved1\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes32\",\"name\":\"mrEnclave\"},{\"type\":\"bytes32\",\"name\":\"reserved2\"},{\"type\":\"bytes32\",\"name\":\"mrSigner\"},{\"type\":\"bytes\",\"name\":\"reserved3\"},{\"type\":\"uint16\",\"name\":\"isvProdId\"},{\"type\":\"uint16\",\"name\":\"isvSvn\"},{\"type\":\"bytes\",\"name\":\"reserved4\"},{\"type\":\"bytes\",\"name\":\"reportData\"}]},{\"type\":\"tuple\",\"name\":\"v3AuthData\",\"components\":[{\"type\":\"bytes\",\"name\":\"ecdsa256BitSignature\"},{\"type\":\"bytes\",\"name\":\"ecdsaAttestationKey\"},{\"type\":\"tuple\",\"name\":\"pckSignedQeReport\",\"components\":[{\"type\":\"bytes16\",\"name\":\"cpuSvn\"},{\"type\":\"bytes4\",\"name\":\"miscSelect\"},{\"type\":\"bytes28\",\"name\":\"reserved1\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes32\",\"name\":\"mrEnclave\"},{\"type\":\"bytes32\",\"name\":\"reserved2\"},{\"type\":\"bytes32\",\"name\":\"mrSigner\"},{\"type\":\"bytes\",\"name\":\"reserved3\"},{\"type\":\"uint16\",\"name\":\"isvProdId\"},{\"type\":\"uint16\",\"name\":\"isvSvn\"},{\"type\":\"bytes\",\"name\":\"reserved4\"},{\"type\":\"bytes\",\"name\":\"reportData\"}]},{\"type\":\"bytes\",\"name\":\"qeReportSignature\"},{\"type\":\"tuple\",\"name\":\"qeAuthData\",\"components\":[{\"type\":\"uint16\",\"name\":\"parsedDataSize\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"tuple\",\"name\":\"certification\",\"components\":[{\"type\":\"uint16\",\"name\":\"certType\"},{\"type\":\"uint32\",\"name\":\"certDataSize\"},{\"type\":\"bytes[3]\",\"name\":\"decodedCertDataArray\"}]}]}]}],\"outputs\":[{\"type\":\"bool\"},{\"type\":\"bytes\"}]},{\"type\":\"function\",\"name\":\"verifyProof\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_ctx\",\"components\":[{\"type\":\"bytes32\",\"name\":\"metaHash\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"address\",\"name\":\"prover\"},{\"type\":\"uint64\",\"name\":\"blockId\"},{\"type\":\"bool\",\"name\":\"isContesting\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"address\",\"name\":\"msgSender\"}]},{\"type\":\"tuple\",\"components\":[{\"type\":\"bytes32\",\"name\":\"parentHash\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"bytes32\",\"name\":\"graffiti\"}]},{\"type\":\"tuple\",\"components\":[{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"verifyProof\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_ctx\",\"components\":[{\"type\":\"bytes32\",\"name\":\"metaHash\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"address\",\"name\":\"prover\"},{\"type\":\"uint64\",\"name\":\"blockId\"},{\"type\":\"bool\",\"name\":\"isContesting\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"address\",\"name\":\"msgSender\"}]},{\"type\":\"tuple\",\"name\":\"_tran\",\"components\":[{\"type\":\"bytes32\",\"name\":\"parentHash\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"bytes32\",\"name\":\"graffiti\"}]},{\"type\":\"tuple\",\"name\":\"_proof\",\"components\":[{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"verifySignalReceived\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"address\",\"name\":\"_app\"},{\"type\":\"bytes32\",\"name\":\"_signal\"},{\"type\":\"bytes\",\"name\":\"_proof\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"version\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint32\"}]},{\"type\":\"function\",\"name\":\"withdrawBond\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"_amount\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"withdrawTaikoToken\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_to\"},{\"type\":\"uint256\",\"name\":\"_amount\"}],\"outputs\":[]},{\"type\":\"constructor\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"es256Verifier\"}]}]","addresses":["0x02772b7B3a5Bea0141C993Dbb8D0733C19F46169","0x06a9Ab27c7e2255df1815E6CC0168d7755Feb19a","0x0b470dd3A0e1C41228856Fb319649E7c08f419Aa","0x10dea67478c5F8C5E2D90e5E9B26dBe60c54d800","0x11A9ebA17EbF92b40fcf9a640Ebbc47Db6fBeab0","0x33879cDF01121dc7bCe011b461e64d791aE931F2","0x39E4C1214e733639d059979079A151911e42791d","0x47bB416ee947fE4a4b655011aF7d6E3A1B80E6e9","0x537a2f0D3a5879b41BCb5A2afE2EA5c4961796F6","0x579A8d63a2Db646284CBFE31FE5082c9989E985c","0x579f40D0BE111b823962043702cabe6Aaa290780","0x67281b15aee4d6b805bc755e439abd524dd8da8d","0x8d7C954960a36a7596d7eA4945dDf891967ca8A3","0x996282cA11E5DEb6B5D122CC3B9A1FcAAD4415Ab","0x9e0a24964e5397B566c1ed39258e21aB5E35C77C","0xE3D777143Ea25A6E031d1e921F396750885f43aC","0xEf9EaA1dd30a9AA1df01c36411b5F082aA65fBaa","0xa25e645ff9897b0282e5f17d36de5bca4ec21d6e","0xaf145913EA4a56BE22E120ED9C24589659881702","0xb0f3186FC1963f774f52ff455DC86aEdD0b31F81","0xc4096E9ff1526Bd1840B65e9f45695135aC12De7","0xcc5d488073FA918cBbd73B9A523F3858C4de7372","0xd60247c6848B7Ca29eDdF63AA924E53dB6Ddd8EC"]}],"createdAt":"2024-08-27T09:44:01.744Z","subscriberId":"d1b49dd5-72bd-480e-b5d7-649ce0aadd09","name":"TaikoL1: Pause/Unpause","network":"mainnet","riskCategory":"ACCESS-CONTROL","monitorId":"d1b49dd5-72bd-480e-b5d7-649ce0aadd09","blockWatcherId":"mainnet-6","paused":false,"stackResourceId":"mystack.taiko-l-1-pause-unpause","type":"BLOCK"},{"skipABIValidation":false,"alertThreshold":null,"notifyConfig":{"severityLevel":"LOW","messageBody":"**Defender Monitor {{ sentinel.name }} Triggered**\n\n**Network**\n\n{{ sentinel.network }}\n\n**Block Hash**\n\n{{ blockHash }}\n\n**Transaction Hash**\n\n{{ transaction.transactionHash }}\n\n**Explorer Link**\n\n{{ transaction.link }}\n\n{{ matchReasonsFormatted }}","messageSubject":"Defender Monitor: Taiko Mainnet SGX Prover triggered","notifications":[{"type":"discord","sendCount":0,"notificationId":"93e8dbf2-4f87-4793-b3c3-6ff0dd6cf827"}],"timeoutMs":0},"tenantId":"0691b59e-8b53-4ae2-b874-959de8a9f2ee","addressRules":[{"conditions":[{"txConditions":[{"status":"any","expression":"status == \"failed\""}],"functionConditions":[],"eventConditions":[{"eventSignature":"InstanceAdded(uint256,address,address,uint256)","expression":null}]},{"txConditions":[{"status":"any","expression":"status == \"failed\""}],"functionConditions":[],"eventConditions":[{"eventSignature":"InstanceDeleted(uint256,address)","expression":null}]},{"txConditions":[{"status":"any","expression":"status == \"failed\""}],"functionConditions":[{"functionSignature":"verifyProof((bytes32,bytes32,address,uint64,bool,bool,address),(bytes32,bytes32,bytes32,bytes32),(uint16,bytes))","expression":null}],"eventConditions":[]}],"abi":"[{\"type\":\"event\",\"anonymous\":false,\"name\":\"AdminChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousAdmin\",\"indexed\":false},{\"type\":\"address\",\"name\":\"newAdmin\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BeaconUpgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"beacon\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Initialized\",\"inputs\":[{\"type\":\"uint8\",\"name\":\"version\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"InstanceAdded\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"id\",\"indexed\":true},{\"type\":\"address\",\"name\":\"instance\",\"indexed\":true},{\"type\":\"address\",\"name\":\"replaced\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"validSince\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"InstanceDeleted\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"id\",\"indexed\":true},{\"type\":\"address\",\"name\":\"instance\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferred\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Paused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Unpaused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Upgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"implementation\",\"indexed\":true}]},{\"type\":\"function\",\"name\":\"INSTANCE_EXPIRY\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"INSTANCE_VALIDITY_DELAY\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"addInstances\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address[]\",\"name\":\"_instances\"}],\"outputs\":[{\"type\":\"uint256[]\"}]},{\"type\":\"function\",\"name\":\"addressManager\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"addressRegistered\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"instanceAddress\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"alreadyAttested\"}]},{\"type\":\"function\",\"name\":\"deleteInstances\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256[]\",\"name\":\"_ids\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"},{\"type\":\"address\",\"name\":\"_addressManager\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"instances\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"instanceId\"}],\"outputs\":[{\"type\":\"address\",\"name\":\"addr\"},{\"type\":\"uint64\",\"name\":\"validSince\"}]},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"nextInstanceId\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"owner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"pause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"paused\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"pendingOwner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"registerInstance\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_attestation\",\"components\":[{\"type\":\"tuple\",\"name\":\"header\",\"components\":[{\"type\":\"bytes2\",\"name\":\"version\"},{\"type\":\"bytes2\",\"name\":\"attestationKeyType\"},{\"type\":\"bytes4\",\"name\":\"teeType\"},{\"type\":\"bytes2\",\"name\":\"qeSvn\"},{\"type\":\"bytes2\",\"name\":\"pceSvn\"},{\"type\":\"bytes16\",\"name\":\"qeVendorId\"},{\"type\":\"bytes20\",\"name\":\"userData\"}]},{\"type\":\"tuple\",\"name\":\"localEnclaveReport\",\"components\":[{\"type\":\"bytes16\",\"name\":\"cpuSvn\"},{\"type\":\"bytes4\",\"name\":\"miscSelect\"},{\"type\":\"bytes28\",\"name\":\"reserved1\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes32\",\"name\":\"mrEnclave\"},{\"type\":\"bytes32\",\"name\":\"reserved2\"},{\"type\":\"bytes32\",\"name\":\"mrSigner\"},{\"type\":\"bytes\",\"name\":\"reserved3\"},{\"type\":\"uint16\",\"name\":\"isvProdId\"},{\"type\":\"uint16\",\"name\":\"isvSvn\"},{\"type\":\"bytes\",\"name\":\"reserved4\"},{\"type\":\"bytes\",\"name\":\"reportData\"}]},{\"type\":\"tuple\",\"name\":\"v3AuthData\",\"components\":[{\"type\":\"bytes\",\"name\":\"ecdsa256BitSignature\"},{\"type\":\"bytes\",\"name\":\"ecdsaAttestationKey\"},{\"type\":\"tuple\",\"name\":\"pckSignedQeReport\",\"components\":[{\"type\":\"bytes16\",\"name\":\"cpuSvn\"},{\"type\":\"bytes4\",\"name\":\"miscSelect\"},{\"type\":\"bytes28\",\"name\":\"reserved1\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes32\",\"name\":\"mrEnclave\"},{\"type\":\"bytes32\",\"name\":\"reserved2\"},{\"type\":\"bytes32\",\"name\":\"mrSigner\"},{\"type\":\"bytes\",\"name\":\"reserved3\"},{\"type\":\"uint16\",\"name\":\"isvProdId\"},{\"type\":\"uint16\",\"name\":\"isvSvn\"},{\"type\":\"bytes\",\"name\":\"reserved4\"},{\"type\":\"bytes\",\"name\":\"reportData\"}]},{\"type\":\"bytes\",\"name\":\"qeReportSignature\"},{\"type\":\"tuple\",\"name\":\"qeAuthData\",\"components\":[{\"type\":\"uint16\",\"name\":\"parsedDataSize\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"tuple\",\"name\":\"certification\",\"components\":[{\"type\":\"uint16\",\"name\":\"certType\"},{\"type\":\"uint32\",\"name\":\"certDataSize\"},{\"type\":\"bytes[3]\",\"name\":\"decodedCertDataArray\"}]}]}]}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"resolve\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"bool\",\"name\":\"_allowZeroAddress\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"transferOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newOwner\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"unpause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeTo\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"verifyProof\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_ctx\",\"components\":[{\"type\":\"bytes32\",\"name\":\"metaHash\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"address\",\"name\":\"prover\"},{\"type\":\"uint64\",\"name\":\"blockId\"},{\"type\":\"bool\",\"name\":\"isContesting\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"address\",\"name\":\"msgSender\"}]},{\"type\":\"tuple\",\"name\":\"_tran\",\"components\":[{\"type\":\"bytes32\",\"name\":\"parentHash\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"bytes32\",\"name\":\"graffiti\"}]},{\"type\":\"tuple\",\"name\":\"_proof\",\"components\":[{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[]}]","addresses":["0xb0f3186FC1963f774f52ff455DC86aEdD0b31F81"]}],"createdAt":"2024-05-02T14:09:42.804Z","subscriberId":"d49a2a9b-268d-4d30-9553-ec55ed952d87","name":"Taiko Mainnet SGX Prover","network":"mainnet","riskCategory":"TECHNICAL","monitorId":"d49a2a9b-268d-4d30-9553-ec55ed952d87","blockWatcherId":"mainnet-1","paused":false,"stackResourceId":"mystack.taiko-mainnet-sgx-prover","type":"BLOCK"},{"skipABIValidation":false,"alertThreshold":null,"notifyConfig":{"severityLevel":"HIGH","messageBody":"**Defender Monitor {{ sentinel.name }} Triggered**\n\n**Network**\n\n{{ sentinel.network }}\n\n**Block Hash**\n\n{{ blockHash }}\n\n**Transaction Hash**\n\n{{ transaction.transactionHash }}\n\n**Explorer Link**\n\n{{ transaction.link }}\n\n{{ matchReasonsFormatted }}","messageSubject":"Defender Monitor: Taiko Mainnet Address Managers triggered","notifications":[{"type":"discord","sendCount":0,"notificationId":"93e8dbf2-4f87-4793-b3c3-6ff0dd6cf827"}],"timeoutMs":0},"tenantId":"0691b59e-8b53-4ae2-b874-959de8a9f2ee","addressRules":[{"conditions":[{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"AddressSet(uint64,bytes32,address,address)","expression":null}]}],"abi":"[{\"type\":\"event\",\"anonymous\":false,\"name\":\"AddressSet\",\"inputs\":[{\"type\":\"uint64\",\"name\":\"chainId\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"name\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newAddress\",\"indexed\":false},{\"type\":\"address\",\"name\":\"oldAddress\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"AdminChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousAdmin\",\"indexed\":false},{\"type\":\"address\",\"name\":\"newAdmin\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BeaconUpgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"beacon\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Initialized\",\"inputs\":[{\"type\":\"uint8\",\"name\":\"version\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferred\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Paused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Unpaused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Upgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"implementation\",\"indexed\":true}]},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"addressManager\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"getAddress\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"owner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"pause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"paused\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"pendingOwner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"resolve\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"bool\",\"name\":\"_allowZeroAddress\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"setAddress\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"address\",\"name\":\"_newAddress\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"transferOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newOwner\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"unpause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeTo\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]}]","addresses":["0xEf9EaA1dd30a9AA1df01c36411b5F082aA65fBaa","0x579f40D0BE111b823962043702cabe6Aaa290780"]}],"createdAt":"2024-05-02T14:00:18.874Z","subscriberId":"3919cb83-487f-4432-88fa-33bbe4361fce","name":"Taiko Mainnet Address Managers","network":"mainnet","riskCategory":"ACCESS-CONTROL","monitorId":"3919cb83-487f-4432-88fa-33bbe4361fce","blockWatcherId":"mainnet-1","paused":false,"stackResourceId":"mystack.taiko-mainnet-address-managers","type":"BLOCK"},{"skipABIValidation":false,"alertThreshold":null,"notifyConfig":{"severityLevel":"HIGH","messageBody":"**Defender Monitor {{ sentinel.name }} Triggered**\n\n**Network**\n\n{{ sentinel.network }}\n\n**Block Hash**\n\n{{ blockHash }}\n\n**Transaction Hash**\n\n{{ transaction.transactionHash }}\n\n**Explorer Link**\n\n{{ transaction.link }}\n\n{{ matchReasonsFormatted }}","messageSubject":"Defender Monitor: Taiko Mainnet Essential Contracts triggered","notifications":[{"type":"discord","sendCount":0,"notificationId":"93e8dbf2-4f87-4793-b3c3-6ff0dd6cf827"}],"timeoutMs":0},"tenantId":"0691b59e-8b53-4ae2-b874-959de8a9f2ee","addressRules":[{"conditions":[{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"AdminChanged(address,address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"BeaconUpgraded(address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"Initialized(uint8)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"OwnershipTransferStarted(address,address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"OwnershipTransferred(address,address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"Paused(address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"Unpaused(address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"Upgraded(address)","expression":null}]}],"abi":"[{\"type\":\"event\",\"anonymous\":false,\"name\":\"AdminChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousAdmin\",\"indexed\":false},{\"type\":\"address\",\"name\":\"newAdmin\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BeaconUpgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"beacon\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Initialized\",\"inputs\":[{\"type\":\"uint8\",\"name\":\"version\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferred\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Paused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Unpaused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Upgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"implementation\",\"indexed\":true}]},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"addressManager\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"owner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"pause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"paused\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"pendingOwner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"resolve\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"bool\",\"name\":\"_allowZeroAddress\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"transferOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newOwner\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"unpause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeTo\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]}]","addresses":["0xEf9EaA1dd30a9AA1df01c36411b5F082aA65fBaa","0x10dea67478c5F8C5E2D90e5E9B26dBe60c54d800","0x9e0a24964e5397B566c1ed39258e21aB5E35C77C","0xd60247c6848B7Ca29eDdF63AA924E53dB6Ddd8EC","0x996282cA11E5DEb6B5D122CC3B9A1FcAAD4415Ab","0x0b470dd3A0e1C41228856Fb319649E7c08f419Aa","0x0b470dd3A0e1C41228856Fb319649E7c08f419Aa","0xaf145913EA4a56BE22E120ED9C24589659881702","0x579f40D0BE111b823962043702cabe6Aaa290780","0x06a9Ab27c7e2255df1815E6CC0168d7755Feb19a","0x537a2f0D3a5879b41BCb5A2afE2EA5c4961796F6","0x33879cDF01121dc7bCe011b461e64d791aE931F2","0xb0f3186FC1963f774f52ff455DC86aEdD0b31F81","0x579A8d63a2Db646284CBFE31FE5082c9989E985c","0xE3D777143Ea25A6E031d1e921F396750885f43aC","0x8d7C954960a36a7596d7eA4945dDf891967ca8A3"]}],"createdAt":"2024-05-02T13:49:54.192Z","subscriberId":"67a53521-3d4a-4de4-92ab-ede82cc45644","name":"Taiko Mainnet Essential Contracts","network":"mainnet","riskCategory":"ACCESS-CONTROL","monitorId":"67a53521-3d4a-4de4-92ab-ede82cc45644","blockWatcherId":"mainnet-1","paused":false,"stackResourceId":"mystack.taiko-mainnet-essential-contracts","type":"BLOCK"}]},"actions":{"removed":[],"created":[],"updated":[{"autotaskId":"86964fd3-3da8-4501-a572-cbf51045f861","actionId":"86964fd3-3da8-4501-a572-cbf51045f861","name":"ERC20Vault: Balance Drop","paused":false,"trigger":{"cron":null,"frequencyMinutes":15,"type":"schedule"},"codeDigest":"+Y75bpyOzEuCm0y95ZczKkySm4PgLyQQt6ASpaB08Lk=","stackResourceId":"mystack.erc-20-vault-balance-drop","runtime":"nodejs20.x","dependenciesVersion":"v2024-08-21","encodedZippedCode":"UEsDBAoAAAAAAAAAQVASVlLscBMAAHATAAAIAAAAaW5kZXguanNjb25zdCB7IGV0aGVycyB9ID0gcmVxdWlyZSgiZXRoZXJzIik7CmNvbnN0IHsgRGVmZW5kZXIgfSA9IHJlcXVpcmUoIkBvcGVuemVwcGVsaW4vZGVmZW5kZXItc2RrIik7Cgpjb25zdCBFUkMyMF9BQkkgPSBbCiAgewogICAgY29uc3RhbnQ6IHRydWUsCiAgICBpbnB1dHM6IFt7IG5hbWU6ICJfb3duZXIiLCB0eXBlOiAiYWRkcmVzcyIgfV0sCiAgICBuYW1lOiAiYmFsYW5jZU9mIiwKICAgIG91dHB1dHM6IFt7IG5hbWU6ICJiYWxhbmNlIiwgdHlwZTogInVpbnQyNTYiIH1dLAogICAgcGF5YWJsZTogZmFsc2UsCiAgICBzdGF0ZU11dGFiaWxpdHk6ICJ2aWV3IiwKICAgIHR5cGU6ICJmdW5jdGlvbiIsCiAgfSwKXTsKCmFzeW5jIGZ1bmN0aW9uIGdldEVSQzIwQmFsYW5jZShwcm92aWRlciwgdG9rZW5BZGRyZXNzLCB2YXVsdEFkZHJlc3MpIHsKICBjb25zdCBjb250cmFjdCA9IG5ldyBldGhlcnMuQ29udHJhY3QodG9rZW5BZGRyZXNzLCBFUkMyMF9BQkksIHByb3ZpZGVyKTsKICByZXR1cm4gYXdhaXQgY29udHJhY3QuYmFsYW5jZU9mKHZhdWx0QWRkcmVzcyk7Cn0KCmFzeW5jIGZ1bmN0aW9uIGdldE5hdGl2ZVRva2VuQmFsYW5jZShwcm92aWRlciwgdmF1bHRBZGRyZXNzKSB7CiAgcmV0dXJuIGF3YWl0IHByb3ZpZGVyLmdldEJhbGFuY2UodmF1bHRBZGRyZXNzKTsKfQoKYXN5bmMgZnVuY3Rpb24gbW9uaXRvclRva2VuQmFsYW5jZSgKICBwcm92aWRlciwKICB0b2tlbkFkZHJlc3MsCiAgdmF1bHRBZGRyZXNzLAogIHByZXZpb3VzQmFsYW5jZUtleSwKICBub3RpZmljYXRpb25DbGllbnQsCiAgc2VjcmV0cywKICBjbGllbnQsCiAgdG9rZW5OYW1lLAogIG5ldHdvcmtOYW1lLAopIHsKICBjb25zb2xlLmxvZyhgTW9uaXRvcmluZyAke3Rva2VuTmFtZX0gYmFsYW5jZSBvbiAke25ldHdvcmtOYW1lfWApOwogIGNvbnN0IHByZXZpb3VzQmFsYW5jZSA9IGV0aGVycy5CaWdOdW1iZXIuZnJvbSgKICAgIHNlY3JldHNbcHJldmlvdXNCYWxhbmNlS2V5XSB8fCAiMCIsCiAgKTsKICBjb25zb2xlLmxvZygKICAgIGBQcmV2aW91cyAke3Rva2VuTmFtZX0gQmFsYW5jZTogJHtldGhlcnMudXRpbHMuZm9ybWF0VW5pdHMoCiAgICAgIHByZXZpb3VzQmFsYW5jZSwKICAgICAgMTgsCiAgICApfWAsCiAgKTsKCiAgbGV0IGN1cnJlbnRCYWxhbmNlOwogIGlmICh0b2tlbk5hbWUgPT09ICJFVEgiKSB7CiAgICBjdXJyZW50QmFsYW5jZSA9IGF3YWl0IGdldE5hdGl2ZVRva2VuQmFsYW5jZShwcm92aWRlciwgdmF1bHRBZGRyZXNzKTsKICB9IGVsc2UgewogICAgY3VycmVudEJhbGFuY2UgPSBhd2FpdCBnZXRFUkMyMEJhbGFuY2UoCiAgICAgIHByb3ZpZGVyLAogICAgICB0b2tlbkFkZHJlc3MsCiAgICAgIHZhdWx0QWRkcmVzcywKICAgICk7CiAgfQogIGNvbnNvbGUubG9nKAogICAgYEN1cnJlbnQgJHt0b2tlbk5hbWV9IEJhbGFuY2U6ICR7ZXRoZXJzLnV0aWxzLmZvcm1hdFVuaXRzKAogICAgICBjdXJyZW50QmFsYW5jZSwKICAgICAgMTgsCiAgICApfWAsCiAgKTsKCiAgaWYgKCFwcmV2aW91c0JhbGFuY2UuaXNaZXJvKCkpIHsKICAgIGNvbnN0IGRyb3BQZXJjZW50YWdlID0gcHJldmlvdXNCYWxhbmNlCiAgICAgIC5zdWIoY3VycmVudEJhbGFuY2UpCiAgICAgIC5tdWwoMTAwKQogICAgICAuZGl2KHByZXZpb3VzQmFsYW5jZSkKICAgICAgLnRvTnVtYmVyKCk7CiAgICBjb25zb2xlLmxvZygKICAgICAgYENhbGN1bGF0ZWQgZHJvcCBwZXJjZW50YWdlIGZvciAke3Rva2VuTmFtZX06ICR7ZHJvcFBlcmNlbnRhZ2V9JWAsCiAgICApOwoKICAgIGlmIChkcm9wUGVyY2VudGFnZSA+PSA1KSB7CiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBgQWxlcnQ6ICR7dG9rZW5OYW1lfSBiYWxhbmNlIGhhcyBkcm9wcGVkIGJ5ICR7ZHJvcFBlcmNlbnRhZ2V9JSBvbiAke25ldHdvcmtOYW1lfS5cblByZXZpb3VzIEJhbGFuY2U6ICR7ZXRoZXJzLnV0aWxzLmZvcm1hdFVuaXRzKAogICAgICAgIHByZXZpb3VzQmFsYW5jZSwKICAgICAgICAxOCwKICAgICAgKX1cbkN1cnJlbnQgQmFsYW5jZTogJHtldGhlcnMudXRpbHMuZm9ybWF0VW5pdHMoY3VycmVudEJhbGFuY2UsIDE4KX1gOwogICAgICBhbGVydE9yZygKICAgICAgICBub3RpZmljYXRpb25DbGllbnQsCiAgICAgICAgYOKaoO+4jyAke25ldHdvcmtOYW1lfTogJHt0b2tlbk5hbWV9IEJhbGFuY2UgRHJvcCBBbGVydGAsCiAgICAgICAgbWVzc2FnZSwKICAgICAgKTsKICAgIH0gZWxzZSB7CiAgICAgIGNvbnNvbGUubG9nKAogICAgICAgIGBObyBzaWduaWZpY2FudCAke3Rva2VuTmFtZX0gYmFsYW5jZSBkcm9wIGRldGVjdGVkIG9uICR7bmV0d29ya05hbWV9YCwKICAgICAgKTsKICAgIH0KICB9IGVsc2UgewogICAgY29uc29sZS5sb2coCiAgICAgIGBObyBwcmV2aW91cyAke3Rva2VuTmFtZX0gYmFsYW5jZSB0byBjb21wYXJlIG9uICR7bmV0d29ya05hbWV9YCwKICAgICk7CiAgfQoKICBhd2FpdCBzdG9yZVByZXZpb3VzQmFsYW5jZShjbGllbnQsIHByZXZpb3VzQmFsYW5jZUtleSwgY3VycmVudEJhbGFuY2UpOwp9CgpmdW5jdGlvbiBhbGVydE9yZyhub3RpZmljYXRpb25DbGllbnQsIHN1YmplY3QsIG1lc3NhZ2UpIHsKICBub3RpZmljYXRpb25DbGllbnQuc2VuZCh7CiAgICBjaGFubmVsQWxpYXM6ICJkaXNjb3JkX2JyaWRnaW5nIiwKICAgIHN1YmplY3QsCiAgICBtZXNzYWdlLAogIH0pOwp9Cgphc3luYyBmdW5jdGlvbiBzdG9yZVByZXZpb3VzQmFsYW5jZShjbGllbnQsIGtleSwgbmV3QmFsYW5jZSkgewogIGNvbnNvbGUubG9nKAogICAgYFN0b3JpbmcgcHJldmlvdXMgYmFsYW5jZSB1bmRlciBrZXk6ICR7a2V5fSwgdmFsdWU6ICR7bmV3QmFsYW5jZS50b1N0cmluZygpfWAsCiAgKTsKICBjb25zdCBib2R5ID0gewogICAgZGVsZXRlczogW10sCiAgICBzZWNyZXRzOiB7CiAgICAgIFtrZXldOiBuZXdCYWxhbmNlLnRvU3RyaW5nKCksCiAgICB9LAogIH07CiAgYXdhaXQgY2xpZW50LmFjdGlvbi5jcmVhdGVTZWNyZXRzKGJvZHkpOwp9CgpmdW5jdGlvbiBjcmVhdGVQcm92aWRlcihhcGlLZXksIGFwaVNlY3JldCwgcmVsYXllckFwaUtleSwgcmVsYXllckFwaVNlY3JldCkgewogIGNvbnNvbGUubG9nKGBDcmVhdGluZyBwcm92aWRlciB3aXRoIEFQSSBrZXlzYCk7CiAgY29uc3QgY2xpZW50ID0gbmV3IERlZmVuZGVyKHsKICAgIGFwaUtleSwKICAgIGFwaVNlY3JldCwKICAgIHJlbGF5ZXJBcGlLZXksCiAgICByZWxheWVyQXBpU2VjcmV0LAogIH0pOwoKICByZXR1cm4gY2xpZW50LnJlbGF5U2lnbmVyLmdldFByb3ZpZGVyKCk7Cn0KCmV4cG9ydHMuaGFuZGxlciA9IGFzeW5jIGZ1bmN0aW9uIChldmVudCwgY29udGV4dCkgewogIGNvbnN0IHsgbm90aWZpY2F0aW9uQ2xpZW50IH0gPSBjb250ZXh0OwogIGNvbnN0IHsgYXBpS2V5LCBhcGlTZWNyZXQsIHRhaWtvTDFBcGlLZXksIHRhaWtvTDFBcGlTZWNyZXQgfSA9IGV2ZW50LnNlY3JldHM7CgogIGNvbnNvbGUubG9nKGBTdGFydGluZyBiYWxhbmNlIG1vbml0b3JpbmcgZm9yIEwxYCk7CgogIGNvbnN0IGwxUHJvdmlkZXIgPSBjcmVhdGVQcm92aWRlcigKICAgIGFwaUtleSwKICAgIGFwaVNlY3JldCwKICAgIHRhaWtvTDFBcGlLZXksCiAgICB0YWlrb0wxQXBpU2VjcmV0LAogICk7CgogIGNvbnN0IGwxVmF1bHRBZGRyZXNzID0gIjB4OTk2MjgyY0ExMUU1REViNkI1RDEyMkNDM0I5QTFGY0FBRDQ0MTVBYiI7CgogIGNvbnN0IGwxVG9rZW5BZGRyZXNzZXMgPSB7CiAgICBFVEg6IG51bGwsCiAgICBUQUlLTzogZXRoZXJzLnV0aWxzLmdldEFkZHJlc3MoCiAgICAgICIweDEwZGVhNjc0NzhjNUY4QzVFMkQ5MGU1RTlCMjZkQmU2MGM1NGQ4MDAiLAogICAgKSwKICAgIFVTREM6IGV0aGVycy51dGlscy5nZXRBZGRyZXNzKCIweEEwYjg2OTkxYzYyMThiMzZjMWQxOUQ0YTJlOUViMGNFMzYwNmVCNDgiKSwKICAgIFVTRFQ6IGV0aGVycy51dGlscy5nZXRBZGRyZXNzKCIweGRBQzE3Rjk1OEQyZWU1MjNhMjIwNjIwNjk5NDU5N0MxM0Q4MzFlYzciKSwKICB9OwoKICBjb25zdCBjbGllbnQgPSBuZXcgRGVmZW5kZXIoewogICAgYXBpS2V5LAogICAgYXBpU2VjcmV0LAogICAgdGFpa29MMUFwaUtleSwKICAgIHRhaWtvTDFBcGlTZWNyZXQsCiAgfSk7CgogIGF3YWl0IG1vbml0b3JUb2tlbkJhbGFuY2UoCiAgICBsMVByb3ZpZGVyLAogICAgbDFUb2tlbkFkZHJlc3Nlcy5FVEgsCiAgICBsMVZhdWx0QWRkcmVzcywKICAgICJwcmV2aW91c0JhbGFuY2VfTDFfRVRIIiwKICAgIG5vdGlmaWNhdGlvbkNsaWVudCwKICAgIGV2ZW50LnNlY3JldHMsCiAgICBjbGllbnQsCiAgICAiRVRIIiwKICAgICJMMSIsCiAgKTsKICBhd2FpdCBtb25pdG9yVG9rZW5CYWxhbmNlKAogICAgbDFQcm92aWRlciwKICAgIGwxVG9rZW5BZGRyZXNzZXMuVEFJS08sCiAgICBsMVZhdWx0QWRkcmVzcywKICAgICJwcmV2aW91c0JhbGFuY2VfTDFfVEFJS08iLAogICAgbm90aWZpY2F0aW9uQ2xpZW50LAogICAgZXZlbnQuc2VjcmV0cywKICAgIGNsaWVudCwKICAgICJUQUlLTyIsCiAgICAiTDEiLAogICk7CiAgYXdhaXQgbW9uaXRvclRva2VuQmFsYW5jZSgKICAgIGwxUHJvdmlkZXIsCiAgICBsMVRva2VuQWRkcmVzc2VzLlVTREMsCiAgICBsMVZhdWx0QWRkcmVzcywKICAgICJwcmV2aW91c0JhbGFuY2VfTDFfVVNEQyIsCiAgICBub3RpZmljYXRpb25DbGllbnQsCiAgICBldmVudC5zZWNyZXRzLAogICAgY2xpZW50LAogICAgIlVTREMiLAogICAgIkwxIiwKICApOwogIGF3YWl0IG1vbml0b3JUb2tlbkJhbGFuY2UoCiAgICBsMVByb3ZpZGVyLAogICAgbDFUb2tlbkFkZHJlc3Nlcy5VU0RULAogICAgbDFWYXVsdEFkZHJlc3MsCiAgICAicHJldmlvdXNCYWxhbmNlX0wxX1VTRFQiLAogICAgbm90aWZpY2F0aW9uQ2xpZW50LAogICAgZXZlbnQuc2VjcmV0cywKICAgIGNsaWVudCwKICAgICJVU0RUIiwKICAgICJMMSIsCiAgKTsKCiAgY29uc29sZS5sb2coYEJhbGFuY2UgbW9uaXRvcmluZyBjb21wbGV0ZWRgKTsKCiAgcmV0dXJuIHRydWU7Cn07ClBLAQIUAAoAAAAAAAAAQVASVlLscBMAAHATAAAIAAAAAAAAAAAAAAAAAAAAAABpbmRleC5qc1BLBQYAAAAAAQABADYAAACWEwAAAAA="},{"autotaskId":"9c132973-b8dc-4406-895c-a4ba343455cf","actionId":"9c132973-b8dc-4406-895c-a4ba343455cf","name":"GuardianProver: Approved Count","paused":false,"trigger":{"cron":null,"frequencyMinutes":15,"type":"schedule"},"codeDigest":"uAUUlOAM2ITq1/WSZHtl4SydkwiCxNgrhR21sTpxmfc=","stackResourceId":"mystack.guardian-prover-approved-count","runtime":"nodejs20.x","dependenciesVersion":"v2024-08-21","encodedZippedCode":"UEsDBAoAAAAAAAAAQVCjgTWbWw0AAFsNAAAIAAAAaW5kZXguanNjb25zdCB7IGV0aGVycyB9ID0gcmVxdWlyZSgiZXRoZXJzIik7CmNvbnN0IHsgRGVmZW5kZXIgfSA9IHJlcXVpcmUoIkBvcGVuemVwcGVsaW4vZGVmZW5kZXItc2RrIik7Cgpjb25zdCBBQkkgPSBbCiAgewogICAgYW5vbnltb3VzOiBmYWxzZSwKICAgIGlucHV0czogWwogICAgICB7CiAgICAgICAgaW5kZXhlZDogdHJ1ZSwKICAgICAgICBpbnRlcm5hbFR5cGU6ICJ1aW50MjU2IiwKICAgICAgICBuYW1lOiAib3BlcmF0aW9uSWQiLAogICAgICAgIHR5cGU6ICJ1aW50MjU2IiwKICAgICAgfSwKICAgICAgewogICAgICAgIGluZGV4ZWQ6IGZhbHNlLAogICAgICAgIGludGVybmFsVHlwZTogInVpbnQyNTYiLAogICAgICAgIG5hbWU6ICJhcHByb3ZhbEJpdHMiLAogICAgICAgIHR5cGU6ICJ1aW50MjU2IiwKICAgICAgfSwKICAgICAgewogICAgICAgIGluZGV4ZWQ6IGZhbHNlLAogICAgICAgIGludGVybmFsVHlwZTogImJvb2wiLAogICAgICAgIG5hbWU6ICJtaW5HdWFyZGlhbnNSZWFjaGVkIiwKICAgICAgICB0eXBlOiAiYm9vbCIsCiAgICAgIH0sCiAgICBdLAogICAgbmFtZTogIkFwcHJvdmVkIiwKICAgIHR5cGU6ICJldmVudCIsCiAgfSwKXTsKCmZ1bmN0aW9uIGFsZXJ0T3JnKG5vdGlmaWNhdGlvbkNsaWVudCwgbWVzc2FnZSkgewogIG5vdGlmaWNhdGlvbkNsaWVudC5zZW5kKHsKICAgIGNoYW5uZWxBbGlhczogImRpc2NvcmRfYnJpZGdpbmciLAogICAgc3ViamVjdDogIuKaoO+4jyBHdWFyZGlhblByb3ZlcjogQXBwcm92ZWQgQ291bnQiLAogICAgbWVzc2FnZSwKICB9KTsKfQoKYXN5bmMgZnVuY3Rpb24gZ2V0TGF0ZXN0QmxvY2tOdW1iZXIocHJvdmlkZXIpIHsKICBjb25zdCBjdXJyZW50QmxvY2sgPSBhd2FpdCBwcm92aWRlci5nZXRCbG9jaygibGF0ZXN0Iik7CiAgcmV0dXJuIGN1cnJlbnRCbG9jay5udW1iZXI7Cn0KCmFzeW5jIGZ1bmN0aW9uIGNhbGN1bGF0ZUJsb2NrVGltZShwcm92aWRlcikgewogIGNvbnN0IGxhdGVzdEJsb2NrID0gYXdhaXQgcHJvdmlkZXIuZ2V0QmxvY2soImxhdGVzdCIpOwogIGNvbnN0IHByZXZpb3VzQmxvY2sgPSBhd2FpdCBwcm92aWRlci5nZXRCbG9jayhsYXRlc3RCbG9jay5udW1iZXIgLSAxMDApOwoKICBjb25zdCB0aW1lRGlmZiA9IGxhdGVzdEJsb2NrLnRpbWVzdGFtcCAtIHByZXZpb3VzQmxvY2sudGltZXN0YW1wOwogIGNvbnN0IGJsb2NrRGlmZiA9IGxhdGVzdEJsb2NrLm51bWJlciAtIHByZXZpb3VzQmxvY2subnVtYmVyOwoKICBjb25zdCBibG9ja1RpbWUgPSB0aW1lRGlmZiAvIGJsb2NrRGlmZjsKICByZXR1cm4gYmxvY2tUaW1lOwp9Cgphc3luYyBmdW5jdGlvbiBjYWxjdWxhdGVCbG9ja1JhbmdlKHByb3ZpZGVyKSB7CiAgY29uc3QgY3VycmVudEJsb2NrTnVtYmVyID0gYXdhaXQgZ2V0TGF0ZXN0QmxvY2tOdW1iZXIocHJvdmlkZXIpOwogIGNvbnN0IGJsb2NrVGltZUluU2Vjb25kcyA9IGF3YWl0IGNhbGN1bGF0ZUJsb2NrVGltZShwcm92aWRlcik7CiAgY29uc3QgYmxvY2tzSW5PbmVIb3VyID0gTWF0aC5mbG9vcigoMTYgKiA2MCkgLyBibG9ja1RpbWVJblNlY29uZHMpOwoKICBjb25zdCBmcm9tQmxvY2sgPSBjdXJyZW50QmxvY2tOdW1iZXIgLSBibG9ja3NJbk9uZUhvdXI7CiAgY29uc3QgdG9CbG9jayA9IGN1cnJlbnRCbG9ja051bWJlcjsKCiAgY29uc29sZS5sb2coYENhbGN1bGF0ZWQgYmxvY2sgcmFuZ2U6IGZyb20gJHtmcm9tQmxvY2t9IHRvICR7dG9CbG9ja31gKTsKCiAgcmV0dXJuIHsgZnJvbUJsb2NrLCB0b0Jsb2NrIH07Cn0KCmFzeW5jIGZ1bmN0aW9uIGZldGNoTG9nc0Zyb21MMSgKICBldmVudE5hbWUsCiAgZnJvbUJsb2NrLAogIHRvQmxvY2ssCiAgYWRkcmVzcywKICBhYmksCiAgcHJvdmlkZXIsCikgewogIGNvbnN0IGlmYWNlID0gbmV3IGV0aGVycy51dGlscy5JbnRlcmZhY2UoYWJpKTsKICBjb25zdCBldmVudFRvcGljID0gaWZhY2UuZ2V0RXZlbnRUb3BpYyhldmVudE5hbWUpOwogIGNvbnNvbGUubG9nKGBldmVudFRvcGljOiAke2V2ZW50VG9waWN9YCk7CiAgdHJ5IHsKICAgIGNvbnN0IGxvZ3MgPSBhd2FpdCBwcm92aWRlci5nZXRMb2dzKHsKICAgICAgYWRkcmVzcywKICAgICAgZnJvbUJsb2NrLAogICAgICB0b0Jsb2NrLAogICAgICB0b3BpY3M6IFtldmVudFRvcGljXSwKICAgIH0pOwogICAgY29uc29sZS5sb2coYEZldGNoZWQgbG9nczogJHtsb2dzLmxlbmd0aH1gKTsKICAgIHJldHVybiBsb2dzLm1hcCgobG9nKSA9PiB7CiAgICAgIGNvbnN0IHBhcnNlZExvZyA9IGlmYWNlLnBhcnNlTG9nKGxvZyk7CiAgICAgIGNvbnNvbGUubG9nKGBQYXJzZWQgbG9nOiAke0pTT04uc3RyaW5naWZ5KHBhcnNlZExvZyl9YCk7CiAgICAgIHJldHVybiBwYXJzZWRMb2c7CiAgICB9KTsKICB9IGNhdGNoIChlcnJvcikgewogICAgY29uc29sZS5lcnJvcigiRXJyb3IgZmV0Y2hpbmcgTDEgbG9nczoiLCBlcnJvcik7CiAgICByZXR1cm4gW107CiAgfQp9CgpmdW5jdGlvbiBjcmVhdGVQcm92aWRlcihhcGlLZXksIGFwaVNlY3JldCwgcmVsYXllckFwaUtleSwgcmVsYXllckFwaVNlY3JldCkgewogIGNvbnN0IGNsaWVudCA9IG5ldyBEZWZlbmRlcih7CiAgICBhcGlLZXksCiAgICBhcGlTZWNyZXQsCiAgICByZWxheWVyQXBpS2V5LAogICAgcmVsYXllckFwaVNlY3JldCwKICB9KTsKCiAgcmV0dXJuIGNsaWVudC5yZWxheVNpZ25lci5nZXRQcm92aWRlcigpOwp9CgpleHBvcnRzLmhhbmRsZXIgPSBhc3luYyBmdW5jdGlvbiAoZXZlbnQsIGNvbnRleHQpIHsKICBjb25zdCB7IG5vdGlmaWNhdGlvbkNsaWVudCB9ID0gY29udGV4dDsKICBjb25zdCB7IGFwaUtleSwgYXBpU2VjcmV0LCB0YWlrb0wxQXBpS2V5LCB0YWlrb0wxQXBpU2VjcmV0IH0gPSBldmVudC5zZWNyZXRzOwoKICBjb25zdCB0YWlrb0wxUHJvdmlkZXIgPSBjcmVhdGVQcm92aWRlcigKICAgIGFwaUtleSwKICAgIGFwaVNlY3JldCwKICAgIHRhaWtvTDFBcGlLZXksCiAgICB0YWlrb0wxQXBpU2VjcmV0LAogICk7CgogIGNvbnN0IHsgZnJvbUJsb2NrLCB0b0Jsb2NrIH0gPSBhd2FpdCBjYWxjdWxhdGVCbG9ja1JhbmdlKHRhaWtvTDFQcm92aWRlcik7CgogIGNvbnN0IGxvZ3MgPSBhd2FpdCBmZXRjaExvZ3NGcm9tTDEoCiAgICAiQXBwcm92ZWQiLAogICAgZnJvbUJsb2NrLAogICAgdG9CbG9jaywKICAgICIweEUzRDc3NzE0M0VhMjVBNkUwMzFkMWU5MjFGMzk2NzUwODg1ZjQzYUMiLAogICAgQUJJLAogICAgdGFpa29MMVByb3ZpZGVyLAogICk7CgogIGlmIChsb2dzLmxlbmd0aCA+IDApIHsKICAgIGFsZXJ0T3JnKAogICAgICBub3RpZmljYXRpb25DbGllbnQsCiAgICAgIGBAdGFpa298Z3VhcmRpYW5zIERldGVjdGVkICR7bG9ncy5sZW5ndGh9IEFwcHJvdmVkIGV2ZW50cyBpbiB0aGUgbGFzdCAxNSBtaW5zIG9uIEd1YXJkaWFuIWAsCiAgICApOwogIH0KCiAgcmV0dXJuIHRydWU7Cn07ClBLAQIUAAoAAAAAAAAAQVCjgTWbWw0AAFsNAAAIAAAAAAAAAAAAAAAAAAAAAABpbmRleC5qc1BLBQYAAAAAAQABADYAAACBDQAAAAA="},{"autotaskId":"3cabb163-79fb-432c-a90a-c111b346a209","actionId":"3cabb163-79fb-432c-a90a-c111b346a209","name":"TaikoL1: BlockProposed Alert","paused":false,"trigger":{"cron":null,"frequencyMinutes":4,"type":"schedule"},"codeDigest":"vJWyfL6uhkwr/JAecuiNP9OlAKXck8QKPr4RG7swqew=","stackResourceId":"mystack.taiko-l-1-block-proposed-alert","runtime":"nodejs20.x","dependenciesVersion":"v2024-08-05","encodedZippedCode":"UEsDBAoAAAAAAAAAQVDWZSrfwCEAAMAhAAAIAAAAaW5kZXguanNjb25zdCB7IGV0aGVycyB9ID0gcmVxdWlyZSgiZXRoZXJzIik7CmNvbnN0IHsgRGVmZW5kZXIgfSA9IHJlcXVpcmUoIkBvcGVuemVwcGVsaW4vZGVmZW5kZXItc2RrIik7Cgpjb25zdCBBQkkgPSBbCiAgewogICAgYW5vbnltb3VzOiBmYWxzZSwKICAgIGlucHV0czogWwogICAgICB7CiAgICAgICAgaW5kZXhlZDogdHJ1ZSwKICAgICAgICBpbnRlcm5hbFR5cGU6ICJ1aW50MjU2IiwKICAgICAgICBuYW1lOiAiYmxvY2tJZCIsCiAgICAgICAgdHlwZTogInVpbnQyNTYiLAogICAgICB9LAogICAgICB7CiAgICAgICAgaW5kZXhlZDogdHJ1ZSwKICAgICAgICBpbnRlcm5hbFR5cGU6ICJhZGRyZXNzIiwKICAgICAgICBuYW1lOiAiYXNzaWduZWRQcm92ZXIiLAogICAgICAgIHR5cGU6ICJhZGRyZXNzIiwKICAgICAgfSwKICAgICAgewogICAgICAgIGluZGV4ZWQ6IGZhbHNlLAogICAgICAgIGludGVybmFsVHlwZTogInVpbnQ5NiIsCiAgICAgICAgbmFtZTogImxpdmVuZXNzQm9uZCIsCiAgICAgICAgdHlwZTogInVpbnQ5NiIsCiAgICAgIH0sCiAgICAgIHsKICAgICAgICBjb21wb25lbnRzOiBbCiAgICAgICAgICB7CiAgICAgICAgICAgIGludGVybmFsVHlwZTogImJ5dGVzMzIiLAogICAgICAgICAgICBuYW1lOiAibDFIYXNoIiwKICAgICAgICAgICAgdHlwZTogImJ5dGVzMzIiLAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgaW50ZXJuYWxUeXBlOiAiYnl0ZXMzMiIsCiAgICAgICAgICAgIG5hbWU6ICJkaWZmaWN1bHR5IiwKICAgICAgICAgICAgdHlwZTogImJ5dGVzMzIiLAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgaW50ZXJuYWxUeXBlOiAiYnl0ZXMzMiIsCiAgICAgICAgICAgIG5hbWU6ICJibG9iSGFzaCIsCiAgICAgICAgICAgIHR5cGU6ICJieXRlczMyIiwKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgIGludGVybmFsVHlwZTogImJ5dGVzMzIiLAogICAgICAgICAgICBuYW1lOiAiZXh0cmFEYXRhIiwKICAgICAgICAgICAgdHlwZTogImJ5dGVzMzIiLAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgaW50ZXJuYWxUeXBlOiAiYnl0ZXMzMiIsCiAgICAgICAgICAgIG5hbWU6ICJkZXBvc2l0c0hhc2giLAogICAgICAgICAgICB0eXBlOiAiYnl0ZXMzMiIsCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICBpbnRlcm5hbFR5cGU6ICJhZGRyZXNzIiwKICAgICAgICAgICAgbmFtZTogImNvaW5iYXNlIiwKICAgICAgICAgICAgdHlwZTogImFkZHJlc3MiLAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgaW50ZXJuYWxUeXBlOiAidWludDY0IiwKICAgICAgICAgICAgbmFtZTogImlkIiwKICAgICAgICAgICAgdHlwZTogInVpbnQ2NCIsCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICBpbnRlcm5hbFR5cGU6ICJ1aW50MzIiLAogICAgICAgICAgICBuYW1lOiAiZ2FzTGltaXQiLAogICAgICAgICAgICB0eXBlOiAidWludDMyIiwKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgIGludGVybmFsVHlwZTogInVpbnQ2NCIsCiAgICAgICAgICAgIG5hbWU6ICJ0aW1lc3RhbXAiLAogICAgICAgICAgICB0eXBlOiAidWludDY0IiwKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgIGludGVybmFsVHlwZTogInVpbnQ2NCIsCiAgICAgICAgICAgIG5hbWU6ICJsMUhlaWdodCIsCiAgICAgICAgICAgIHR5cGU6ICJ1aW50NjQiLAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgaW50ZXJuYWxUeXBlOiAidWludDE2IiwKICAgICAgICAgICAgbmFtZTogIm1pblRpZXIiLAogICAgICAgICAgICB0eXBlOiAidWludDE2IiwKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgIGludGVybmFsVHlwZTogImJvb2wiLAogICAgICAgICAgICBuYW1lOiAiYmxvYlVzZWQiLAogICAgICAgICAgICB0eXBlOiAiYm9vbCIsCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICBpbnRlcm5hbFR5cGU6ICJieXRlczMyIiwKICAgICAgICAgICAgbmFtZTogInBhcmVudE1ldGFIYXNoIiwKICAgICAgICAgICAgdHlwZTogImJ5dGVzMzIiLAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgaW50ZXJuYWxUeXBlOiAiYWRkcmVzcyIsCiAgICAgICAgICAgIG5hbWU6ICJzZW5kZXIiLAogICAgICAgICAgICB0eXBlOiAiYWRkcmVzcyIsCiAgICAgICAgICB9LAogICAgICAgIF0sCiAgICAgICAgaW5kZXhlZDogZmFsc2UsCiAgICAgICAgaW50ZXJuYWxUeXBlOiAic3RydWN0IFRhaWtvRGF0YS5CbG9ja01ldGFkYXRhIiwKICAgICAgICBuYW1lOiAibWV0YSIsCiAgICAgICAgdHlwZTogInR1cGxlIiwKICAgICAgfSwKICAgICAgewogICAgICAgIGNvbXBvbmVudHM6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgaW50ZXJuYWxUeXBlOiAiYWRkcmVzcyIsCiAgICAgICAgICAgIG5hbWU6ICJyZWNpcGllbnQiLAogICAgICAgICAgICB0eXBlOiAiYWRkcmVzcyIsCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICBpbnRlcm5hbFR5cGU6ICJ1aW50OTYiLAogICAgICAgICAgICBuYW1lOiAiYW1vdW50IiwKICAgICAgICAgICAgdHlwZTogInVpbnQ5NiIsCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICBpbnRlcm5hbFR5cGU6ICJ1aW50NjQiLAogICAgICAgICAgICBuYW1lOiAiaWQiLAogICAgICAgICAgICB0eXBlOiAidWludDY0IiwKICAgICAgICAgIH0sCiAgICAgICAgXSwKICAgICAgICBpbmRleGVkOiBmYWxzZSwKICAgICAgICBpbnRlcm5hbFR5cGU6ICJzdHJ1Y3QgVGFpa29EYXRhLkV0aERlcG9zaXRbXSIsCiAgICAgICAgbmFtZTogImRlcG9zaXRzUHJvY2Vzc2VkIiwKICAgICAgICB0eXBlOiAidHVwbGVbXSIsCiAgICAgIH0sCiAgICBdLAogICAgbmFtZTogIkJsb2NrUHJvcG9zZWQiLAogICAgdHlwZTogImV2ZW50IiwKICB9LAogIHsKICAgIGFub255bW91czogZmFsc2UsCiAgICBpbnB1dHM6IFsKICAgICAgewogICAgICAgIGluZGV4ZWQ6IHRydWUsCiAgICAgICAgaW50ZXJuYWxUeXBlOiAidWludDI1NiIsCiAgICAgICAgbmFtZTogImJsb2NrSWQiLAogICAgICAgIHR5cGU6ICJ1aW50MjU2IiwKICAgICAgfSwKICAgICAgewogICAgICAgIGluZGV4ZWQ6IHRydWUsCiAgICAgICAgaW50ZXJuYWxUeXBlOiAiYWRkcmVzcyIsCiAgICAgICAgbmFtZTogImFzc2lnbmVkUHJvdmVyIiwKICAgICAgICB0eXBlOiAiYWRkcmVzcyIsCiAgICAgIH0sCiAgICAgIHsKICAgICAgICBpbmRleGVkOiBmYWxzZSwKICAgICAgICBpbnRlcm5hbFR5cGU6ICJ1aW50OTYiLAogICAgICAgIG5hbWU6ICJsaXZlbmVzc0JvbmQiLAogICAgICAgIHR5cGU6ICJ1aW50OTYiLAogICAgICB9LAogICAgICB7CiAgICAgICAgY29tcG9uZW50czogWwogICAgICAgICAgewogICAgICAgICAgICBpbnRlcm5hbFR5cGU6ICJieXRlczMyIiwKICAgICAgICAgICAgbmFtZTogImwxSGFzaCIsCiAgICAgICAgICAgIHR5cGU6ICJieXRlczMyIiwKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgIGludGVybmFsVHlwZTogImJ5dGVzMzIiLAogICAgICAgICAgICBuYW1lOiAiZGlmZmljdWx0eSIsCiAgICAgICAgICAgIHR5cGU6ICJieXRlczMyIiwKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgIGludGVybmFsVHlwZTogImJ5dGVzMzIiLAogICAgICAgICAgICBuYW1lOiAiYmxvYkhhc2giLAogICAgICAgICAgICB0eXBlOiAiYnl0ZXMzMiIsCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICBpbnRlcm5hbFR5cGU6ICJieXRlczMyIiwKICAgICAgICAgICAgbmFtZTogImV4dHJhRGF0YSIsCiAgICAgICAgICAgIHR5cGU6ICJieXRlczMyIiwKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgIGludGVybmFsVHlwZTogImJ5dGVzMzIiLAogICAgICAgICAgICBuYW1lOiAiZGVwb3NpdHNIYXNoIiwKICAgICAgICAgICAgdHlwZTogImJ5dGVzMzIiLAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgaW50ZXJuYWxUeXBlOiAiYWRkcmVzcyIsCiAgICAgICAgICAgIG5hbWU6ICJjb2luYmFzZSIsCiAgICAgICAgICAgIHR5cGU6ICJhZGRyZXNzIiwKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgIGludGVybmFsVHlwZTogInVpbnQ2NCIsCiAgICAgICAgICAgIG5hbWU6ICJpZCIsCiAgICAgICAgICAgIHR5cGU6ICJ1aW50NjQiLAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgaW50ZXJuYWxUeXBlOiAidWludDMyIiwKICAgICAgICAgICAgbmFtZTogImdhc0xpbWl0IiwKICAgICAgICAgICAgdHlwZTogInVpbnQzMiIsCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICBpbnRlcm5hbFR5cGU6ICJ1aW50NjQiLAogICAgICAgICAgICBuYW1lOiAidGltZXN0YW1wIiwKICAgICAgICAgICAgdHlwZTogInVpbnQ2NCIsCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICBpbnRlcm5hbFR5cGU6ICJ1aW50NjQiLAogICAgICAgICAgICBuYW1lOiAibDFIZWlnaHQiLAogICAgICAgICAgICB0eXBlOiAidWludDY0IiwKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgIGludGVybmFsVHlwZTogInVpbnQxNiIsCiAgICAgICAgICAgIG5hbWU6ICJtaW5UaWVyIiwKICAgICAgICAgICAgdHlwZTogInVpbnQxNiIsCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICBpbnRlcm5hbFR5cGU6ICJib29sIiwKICAgICAgICAgICAgbmFtZTogImJsb2JVc2VkIiwKICAgICAgICAgICAgdHlwZTogImJvb2wiLAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgaW50ZXJuYWxUeXBlOiAiYnl0ZXMzMiIsCiAgICAgICAgICAgIG5hbWU6ICJwYXJlbnRNZXRhSGFzaCIsCiAgICAgICAgICAgIHR5cGU6ICJieXRlczMyIiwKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgIGludGVybmFsVHlwZTogImFkZHJlc3MiLAogICAgICAgICAgICBuYW1lOiAic2VuZGVyIiwKICAgICAgICAgICAgdHlwZTogImFkZHJlc3MiLAogICAgICAgICAgfSwKICAgICAgICBdLAogICAgICAgIGluZGV4ZWQ6IGZhbHNlLAogICAgICAgIGludGVybmFsVHlwZTogInN0cnVjdCBUYWlrb0RhdGEuQmxvY2tNZXRhZGF0YSIsCiAgICAgICAgbmFtZTogIm1ldGEiLAogICAgICAgIHR5cGU6ICJ0dXBsZSIsCiAgICAgIH0sCiAgICAgIHsKICAgICAgICBjb21wb25lbnRzOiBbCiAgICAgICAgICB7CiAgICAgICAgICAgIGludGVybmFsVHlwZTogImFkZHJlc3MiLAogICAgICAgICAgICBuYW1lOiAicmVjaXBpZW50IiwKICAgICAgICAgICAgdHlwZTogImFkZHJlc3MiLAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgaW50ZXJuYWxUeXBlOiAidWludDk2IiwKICAgICAgICAgICAgbmFtZTogImFtb3VudCIsCiAgICAgICAgICAgIHR5cGU6ICJ1aW50OTYiLAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgaW50ZXJuYWxUeXBlOiAidWludDY0IiwKICAgICAgICAgICAgbmFtZTogImlkIiwKICAgICAgICAgICAgdHlwZTogInVpbnQ2NCIsCiAgICAgICAgICB9LAogICAgICAgIF0sCiAgICAgICAgaW5kZXhlZDogZmFsc2UsCiAgICAgICAgaW50ZXJuYWxUeXBlOiAic3RydWN0IFRhaWtvRGF0YS5FdGhEZXBvc2l0W10iLAogICAgICAgIG5hbWU6ICJkZXBvc2l0c1Byb2Nlc3NlZCIsCiAgICAgICAgdHlwZTogInR1cGxlW10iLAogICAgICB9LAogICAgXSwKICAgIG5hbWU6ICJCbG9ja1Byb3Bvc2VkVjIiLAogICAgdHlwZTogImV2ZW50IiwKICB9LApdOwoKZnVuY3Rpb24gYWxlcnRPcmcobm90aWZpY2F0aW9uQ2xpZW50LCBtZXNzYWdlKSB7CiAgbm90aWZpY2F0aW9uQ2xpZW50LnNlbmQoewogICAgY2hhbm5lbEFsaWFzOiAiZGlzY29yZF9icmlkZ2luZyIsCiAgICBzdWJqZWN0OiAi8J+aqCBUYWlrb0wxOiBCbG9ja1Byb3Bvc2VkIEFsZXJ0IiwKICAgIG1lc3NhZ2UsCiAgfSk7CgogIG5vdGlmaWNhdGlvbkNsaWVudC5zZW5kKHsKICAgIGNoYW5uZWxBbGlhczogInRnX3RhaWtvX2d1YXJkaWFucyIsCiAgICBzdWJqZWN0OiAi8J+aqCBUYWlrb0wxOiBCbG9ja1Byb3Bvc2VkIEFsZXJ0IiwKICAgIG1lc3NhZ2UsCiAgfSk7Cn0KCmFzeW5jIGZ1bmN0aW9uIGdldExhdGVzdEJsb2NrTnVtYmVyKHByb3ZpZGVyKSB7CiAgY29uc3QgY3VycmVudEJsb2NrID0gYXdhaXQgcHJvdmlkZXIuZ2V0QmxvY2soImxhdGVzdCIpOwogIHJldHVybiBjdXJyZW50QmxvY2subnVtYmVyOwp9Cgphc3luYyBmdW5jdGlvbiBmZXRjaExvZ3NGcm9tTDEoCiAgZXZlbnROYW1lcywKICBmcm9tQmxvY2ssCiAgdG9CbG9jaywKICBhZGRyZXNzLAogIGFiaSwKICBwcm92aWRlciwKKSB7CiAgY29uc3QgaWZhY2UgPSBuZXcgZXRoZXJzLnV0aWxzLkludGVyZmFjZShhYmkpOwoKICBjb25zdCBhbGxMb2dzID0gW107CgogIGZvciAoY29uc3QgZXZlbnROYW1lIG9mIGV2ZW50TmFtZXMpIHsKICAgIGNvbnN0IGV2ZW50VG9waWMgPSBpZmFjZS5nZXRFdmVudFRvcGljKGV2ZW50TmFtZSk7CgogICAgdHJ5IHsKICAgICAgY29uc3QgbG9ncyA9IGF3YWl0IHByb3ZpZGVyLmdldExvZ3MoewogICAgICAgIGFkZHJlc3MsCiAgICAgICAgZnJvbUJsb2NrLAogICAgICAgIHRvQmxvY2ssCiAgICAgICAgdG9waWNzOiBbZXZlbnRUb3BpY10sCiAgICAgIH0pOwoKICAgICAgYWxsTG9ncy5wdXNoKAogICAgICAgIC4uLmxvZ3MubWFwKChsb2cpID0+CiAgICAgICAgICBpZmFjZS5kZWNvZGVFdmVudExvZyhldmVudE5hbWUsIGxvZy5kYXRhLCBsb2cudG9waWNzKSwKICAgICAgICApLAogICAgICApOwogICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgY29uc29sZS5lcnJvcihgRXJyb3IgZmV0Y2hpbmcgbG9ncyBmb3IgJHtldmVudE5hbWV9OmAsIGVycm9yKTsKICAgIH0KICB9CgogIHJldHVybiBhbGxMb2dzOwp9CgpmdW5jdGlvbiBjcmVhdGVQcm92aWRlcihhcGlLZXksIGFwaVNlY3JldCwgcmVsYXllckFwaUtleSwgcmVsYXllckFwaVNlY3JldCkgewogIGNvbnN0IGNsaWVudCA9IG5ldyBEZWZlbmRlcih7CiAgICBhcGlLZXksCiAgICBhcGlTZWNyZXQsCiAgICByZWxheWVyQXBpS2V5LAogICAgcmVsYXllckFwaVNlY3JldCwKICB9KTsKCiAgcmV0dXJuIGNsaWVudC5yZWxheVNpZ25lci5nZXRQcm92aWRlcigpOwp9Cgphc3luYyBmdW5jdGlvbiBjYWxjdWxhdGVCbG9ja1RpbWUocHJvdmlkZXIpIHsKICBjb25zdCBsYXRlc3RCbG9jayA9IGF3YWl0IHByb3ZpZGVyLmdldEJsb2NrKCJsYXRlc3QiKTsKICBjb25zdCBwcmV2aW91c0Jsb2NrID0gYXdhaXQgcHJvdmlkZXIuZ2V0QmxvY2sobGF0ZXN0QmxvY2subnVtYmVyIC0gMTAwKTsKCiAgY29uc3QgdGltZURpZmYgPSBsYXRlc3RCbG9jay50aW1lc3RhbXAgLSBwcmV2aW91c0Jsb2NrLnRpbWVzdGFtcDsKICBjb25zdCBibG9ja0RpZmYgPSBsYXRlc3RCbG9jay5udW1iZXIgLSBwcmV2aW91c0Jsb2NrLm51bWJlcjsKCiAgY29uc3QgYmxvY2tUaW1lID0gdGltZURpZmYgLyBibG9ja0RpZmY7CiAgcmV0dXJuIGJsb2NrVGltZTsKfQoKZXhwb3J0cy5oYW5kbGVyID0gYXN5bmMgZnVuY3Rpb24gKGV2ZW50LCBjb250ZXh0KSB7CiAgY29uc3QgeyBub3RpZmljYXRpb25DbGllbnQgfSA9IGNvbnRleHQ7CiAgY29uc3QgeyBhcGlLZXksIGFwaVNlY3JldCwgdGFpa29MMUFwaUtleSwgdGFpa29MMUFwaVNlY3JldCB9ID0gZXZlbnQuc2VjcmV0czsKCiAgY29uc3QgdGFpa29MMVByb3ZpZGVyID0gY3JlYXRlUHJvdmlkZXIoCiAgICBhcGlLZXksCiAgICBhcGlTZWNyZXQsCiAgICB0YWlrb0wxQXBpS2V5LAogICAgdGFpa29MMUFwaVNlY3JldCwKICApOwoKICBjb25zdCBjdXJyZW50QmxvY2tOdW1iZXIgPSBhd2FpdCBnZXRMYXRlc3RCbG9ja051bWJlcih0YWlrb0wxUHJvdmlkZXIpOwogIGNvbnN0IGJsb2NrVGltZUluU2Vjb25kcyA9IGF3YWl0IGNhbGN1bGF0ZUJsb2NrVGltZSh0YWlrb0wxUHJvdmlkZXIpOwogIGNvbnN0IGJsb2Nrc0luRml2ZU1pbnV0ZXMgPSBNYXRoLmZsb29yKCg1ICogNjApIC8gYmxvY2tUaW1lSW5TZWNvbmRzKTsKCiAgY29uc3QgZnJvbUJsb2NrID0gY3VycmVudEJsb2NrTnVtYmVyIC0gYmxvY2tzSW5GaXZlTWludXRlczsKICBjb25zdCB0b0Jsb2NrID0gY3VycmVudEJsb2NrTnVtYmVyOwoKICBjb25zdCBsb2dzID0gYXdhaXQgZmV0Y2hMb2dzRnJvbUwxKAogICAgWyJCbG9ja1Byb3Bvc2VkIiwgIkJsb2NrUHJvcG9zZWRWMiJdLAogICAgZnJvbUJsb2NrLAogICAgdG9CbG9jaywKICAgICIweDA2YTlBYjI3YzdlMjI1NWRmMTgxNUU2Q0MwMTY4ZDc3NTVGZWIxOWEiLAogICAgQUJJLAogICAgdGFpa29MMVByb3ZpZGVyLAogICk7CgogIGNvbnNvbGUubG9nKGBMb2dzIGZvdW5kOiAke2xvZ3MubGVuZ3RofWApOwoKICBpZiAobG9ncy5sZW5ndGggPT09IDApIHsKICAgIGFsZXJ0T3JnKAogICAgICBub3RpZmljYXRpb25DbGllbnQsCiAgICAgIGBObyBCbG9ja1Byb3Bvc2VkIGV2ZW50IGRldGVjdGVkIGluIHRoZSBsYXN0IDE1IG1pbnMgb24gVGFpa29MMSFgLAogICAgKTsKICB9CgogIHJldHVybiB0cnVlOwp9OwpQSwECFAAKAAAAAAAAAEFQ1mUq38AhAADAIQAACAAAAAAAAAAAAAAAAAAAAAAAaW5kZXguanNQSwUGAAAAAAEAAQA2AAAA5iEAAAAA"}]},"contracts":{"removed":[],"created":[],"updated":[]},"relayers":{"removed":[],"created":[],"updated":[],"relayerKeys":{"removed":[],"created":[],"updated":[]}},"notifications":{"removed":[],"created":[],"updated":[]},"secrets":{"removed":[],"created":[],"updated":[]},"blockExplorerApiKeys":{"removed":[],"created":[],"updated":[]},"forkedNetworks":{"removed":[],"created":[],"updated":[]},"privateNetworks":{"removed":[],"created":[],"updated":[]}} +{"stack":"mystack","timestamp":"2024-09-20T11:10:56.918Z","monitors":{"removed":[],"created":[],"updated":[{"skipABIValidation":false,"notifyConfig":{"severityLevel":"HIGH","messageBody":"**Defender Monitor {{ sentinel.name }} Triggered**\n\n**Network**\n\n{{ sentinel.network }}\n\n**Block Hash**\n\n{{ blockHash }}\n\n**Transaction Hash**\n\n{{ transaction.transactionHash }}\n\n**Explorer Link**\n\n{{ transaction.link }}\n\n**Match Reasons**\n\n{{ matchReasonsFormatted }}\n\n**Metadata**\n\n{{ metadataFormatted }}","messageSubject":"⚠️ TaikoL1: ProvingPaused Alert","notifications":[{"paused":false,"tenantId":"0691b59e-8b53-4ae2-b874-959de8a9f2ee","name":"discord_bridging","notificationId":"93e8dbf2-4f87-4793-b3c3-6ff0dd6cf827","type":"discord","config":{"url":"https://discord.com/api/webhooks/1079966997816811520/RdYRjk74nbjEPb44tKFGAgYqDRSmmk2BAmShGkpnmm6QpK-21n-Avw5TnVEaJ1CWhE0s"},"stackResourceId":"mystack.discord-bridging","updatedAt":"2024-09-19T10:48:03.908Z"}],"timeoutMs":60000},"tenantId":"0691b59e-8b53-4ae2-b874-959de8a9f2ee","addressRules":[{"conditions":[],"addresses":["0x06a9Ab27c7e2255df1815E6CC0168d7755Feb19a"]}],"createdAt":"2024-09-20T10:36:31.684Z","subscriberId":"1bc1012e-54fc-4fbc-8971-54c5b2a5146e","name":"TaikoL1: ProvingPaused Alert","network":"mainnet","monitorId":"1bc1012e-54fc-4fbc-8971-54c5b2a5146e","blockWatcherId":"mainnet-1","paused":false,"stackResourceId":"mystack.taiko-l-1-proving-paused-alert","type":"BLOCK"},{"skipABIValidation":false,"notifyConfig":{"severityLevel":"MEDIUM","messageBody":"**Defender Monitor {{ sentinel.name }} Triggered**\n\n**Network**\n\n{{ sentinel.network }}\n\n**Block Hash**\n\n{{ blockHash }}\n\n**Transaction Hash**\n\n{{ transaction.transactionHash }}\n\n**Explorer Link**\n\n{{ transaction.link }}\n\n**Match Reasons**\n\n{{ matchReasonsFormatted }}\n\n**Metadata**\n\n{{ metadataFormatted }}","messageSubject":"⚠️ GuardianProver: GuardiansUpdated Alert","notifications":[{"paused":false,"tenantId":"0691b59e-8b53-4ae2-b874-959de8a9f2ee","name":"discord_bridging","notificationId":"93e8dbf2-4f87-4793-b3c3-6ff0dd6cf827","type":"discord","config":{"url":"https://discord.com/api/webhooks/1079966997816811520/RdYRjk74nbjEPb44tKFGAgYqDRSmmk2BAmShGkpnmm6QpK-21n-Avw5TnVEaJ1CWhE0s"},"stackResourceId":"mystack.discord-bridging","updatedAt":"2024-09-19T10:48:03.908Z"}],"timeoutMs":60000},"tenantId":"0691b59e-8b53-4ae2-b874-959de8a9f2ee","addressRules":[{"conditions":[],"addresses":["0xE3D777143Ea25A6E031d1e921F396750885f43aC"]}],"createdAt":"2024-09-20T10:36:35.701Z","subscriberId":"8e05b9b7-09d2-4b2e-b843-96a62f03c80a","name":"GuardianProver: GuardiansUpdated Alert","network":"mainnet","monitorId":"8e05b9b7-09d2-4b2e-b843-96a62f03c80a","blockWatcherId":"mainnet-1","paused":false,"stackResourceId":"mystack.guardian-prover-guardians-updated-alert","type":"BLOCK"},{"skipABIValidation":false,"notifyConfig":{"severityLevel":"MEDIUM","messageBody":"**Defender Monitor {{ sentinel.name }} Triggered**\n\n**Network**\n\n{{ sentinel.network }}\n\n**Block Hash**\n\n{{ blockHash }}\n\n**Transaction Hash**\n\n{{ transaction.transactionHash }}\n\n**Explorer Link**\n\n{{ transaction.link }}\n\n**Match Reasons**\n\n{{ matchReasonsFormatted }}\n\n**Metadata**\n\n{{ metadataFormatted }}","messageSubject":"🚨 GuardianProver: ConflictingProofs Alert","notifications":[{"paused":false,"tenantId":"0691b59e-8b53-4ae2-b874-959de8a9f2ee","name":"discord_bridging","notificationId":"93e8dbf2-4f87-4793-b3c3-6ff0dd6cf827","type":"discord","config":{"url":"https://discord.com/api/webhooks/1079966997816811520/RdYRjk74nbjEPb44tKFGAgYqDRSmmk2BAmShGkpnmm6QpK-21n-Avw5TnVEaJ1CWhE0s"},"stackResourceId":"mystack.discord-bridging","updatedAt":"2024-09-19T10:48:03.908Z"}],"timeoutMs":60000},"tenantId":"0691b59e-8b53-4ae2-b874-959de8a9f2ee","addressRules":[{"conditions":[],"addresses":["0xE3D777143Ea25A6E031d1e921F396750885f43aC"]}],"createdAt":"2024-09-20T10:36:39.801Z","subscriberId":"deb988aa-3550-4690-9f9b-b45486a45af0","name":"GuardianProver: ConflictingProofs Alert","network":"mainnet","monitorId":"deb988aa-3550-4690-9f9b-b45486a45af0","blockWatcherId":"mainnet-1","paused":false,"stackResourceId":"mystack.guardian-prover-conflicting-proofs-alert","type":"BLOCK"},{"skipABIValidation":false,"notifyConfig":{"severityLevel":"MEDIUM","messageBody":"**Defender Monitor {{ sentinel.name }} Triggered**\n\n**Network**\n\n{{ sentinel.network }}\n\n**Block Hash**\n\n{{ blockHash }}\n\n**Transaction Hash**\n\n{{ transaction.transactionHash }}\n\n**Explorer Link**\n\n{{ transaction.link }}\n\n**Match Reasons**\n\n{{ matchReasonsFormatted }}\n\n**Metadata**\n\n{{ metadataFormatted }}","messageSubject":"⚠️ GuardianProver: ProvingAutoPauseEnabled Alert","notifications":[{"paused":false,"tenantId":"0691b59e-8b53-4ae2-b874-959de8a9f2ee","name":"discord_bridging","notificationId":"93e8dbf2-4f87-4793-b3c3-6ff0dd6cf827","type":"discord","config":{"url":"https://discord.com/api/webhooks/1079966997816811520/RdYRjk74nbjEPb44tKFGAgYqDRSmmk2BAmShGkpnmm6QpK-21n-Avw5TnVEaJ1CWhE0s"},"stackResourceId":"mystack.discord-bridging","updatedAt":"2024-09-19T10:48:03.908Z"}],"timeoutMs":60000},"tenantId":"0691b59e-8b53-4ae2-b874-959de8a9f2ee","addressRules":[{"conditions":[],"addresses":["0xE3D777143Ea25A6E031d1e921F396750885f43aC"]}],"createdAt":"2024-09-20T10:36:44.961Z","subscriberId":"cf7ea759-183f-4761-96cc-ec6cf9052d3b","name":"GuardianProver: ProvingAutoPauseEnabled Alert","network":"mainnet","monitorId":"cf7ea759-183f-4761-96cc-ec6cf9052d3b","blockWatcherId":"mainnet-1","paused":false,"stackResourceId":"mystack.guardian-prover-proving-auto-pause-enabled-alert","type":"BLOCK"},{"skipABIValidation":true,"alertThreshold":null,"notifyConfig":{"severityLevel":"MEDIUM","messageBody":"**Defender Monitor {{ sentinel.name }} Triggered**\n\n**Network**\n\n{{ sentinel.network }}\n\n**Block Hash**\n\n{{ blockHash }}\n\n**Transaction Hash**\n\n{{ transaction.transactionHash }}\n\n**Explorer Link**\n\n{{ transaction.link }}\n\n**Match Reasons**\n\n{{ matchReasonsFormatted }}\n\n**Metadata**\n\n{{ metadataFormatted }}","messageSubject":"Defender Monitor: TaikoL1: Pause/Unpause triggered","notifications":[{"type":"discord","sendCount":0,"notificationId":"93e8dbf2-4f87-4793-b3c3-6ff0dd6cf827"}],"timeoutMs":60000},"tenantId":"0691b59e-8b53-4ae2-b874-959de8a9f2ee","addressRules":[{"conditions":[{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"Paused(address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"Unpaused(address)","expression":null}]}],"abi":"[{\"type\":\"error\",\"name\":\"AM_ADDRESS_ALREADY_SET\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"AddressSet\",\"inputs\":[{\"type\":\"uint64\",\"name\":\"chainId\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"name\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newAddress\",\"indexed\":false},{\"type\":\"address\",\"name\":\"oldAddress\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"AdminChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousAdmin\",\"indexed\":false},{\"type\":\"address\",\"name\":\"newAdmin\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Approval\",\"inputs\":[{\"type\":\"address\",\"name\":\"owner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"spender\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"value\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Approval\",\"inputs\":[{\"type\":\"address\",\"name\":\"owner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"approved\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"tokenId\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"ApprovalForAll\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":true},{\"type\":\"address\",\"name\":\"operator\",\"indexed\":true},{\"type\":\"bool\",\"name\":\"approved\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Approved\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"operationId\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"approvalBits\",\"indexed\":false},{\"type\":\"bool\",\"name\":\"minGuardiansReached\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Authorized\",\"inputs\":[{\"type\":\"address\",\"name\":\"addr\",\"indexed\":true},{\"type\":\"bool\",\"name\":\"authorized\",\"indexed\":false}]},{\"type\":\"error\",\"name\":\"BB_INVALID_PARAMS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BB_MINT_DISALLOWED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BB_PERMISSION_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BTOKEN_CANNOT_RECEIVE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BTOKEN_INVALID_BURN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BTOKEN_INVALID_PARAMS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INSUFFICIENT_GAS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_CONTEXT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_FEE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_GAS_LIMIT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_VALUE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_MESSAGE_NOT_SENT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_OUT_OF_ETH_QUOTA\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_PERMISSION_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_PROOF_TOO_LARGE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_RETRY_FAILED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_SIGNAL_NOT_RECEIVED\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BeaconUpgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"beacon\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BlockProposed\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"address\",\"name\":\"assignedProver\",\"indexed\":true},{\"type\":\"uint96\",\"name\":\"livenessBond\",\"indexed\":false},{\"type\":\"tuple\",\"name\":\"meta\",\"indexed\":false,\"components\":[{\"type\":\"bytes32\",\"name\":\"l1Hash\"},{\"type\":\"bytes32\",\"name\":\"difficulty\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"bytes32\",\"name\":\"extraData\"},{\"type\":\"bytes32\",\"name\":\"depositsHash\"},{\"type\":\"address\",\"name\":\"coinbase\"},{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"uint64\",\"name\":\"timestamp\"},{\"type\":\"uint64\",\"name\":\"l1Height\"},{\"type\":\"uint16\",\"name\":\"minTier\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"bytes32\",\"name\":\"parentMetaHash\"},{\"type\":\"address\",\"name\":\"sender\"}]},{\"type\":\"tuple[]\",\"name\":\"depositsProcessed\",\"indexed\":false,\"components\":[{\"type\":\"address\",\"name\":\"recipient\"},{\"type\":\"uint96\",\"name\":\"amount\"},{\"type\":\"uint64\",\"name\":\"id\"}]}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BlockVerified\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"address\",\"name\":\"prover\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"blockHash\",\"indexed\":false},{\"type\":\"bytes32\",\"name\":\"stateRoot\",\"indexed\":false},{\"type\":\"uint16\",\"name\":\"tier\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BondCredited\",\"inputs\":[{\"type\":\"address\",\"name\":\"user\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"amount\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BondDebited\",\"inputs\":[{\"type\":\"address\",\"name\":\"user\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"amount\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BridgedTokenChanged\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"srcChainId\",\"indexed\":true},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":true},{\"type\":\"address\",\"name\":\"btokenOld\",\"indexed\":false},{\"type\":\"address\",\"name\":\"btokenNew\",\"indexed\":false},{\"type\":\"string\",\"name\":\"ctokenSymbol\",\"indexed\":false},{\"type\":\"string\",\"name\":\"ctokenName\",\"indexed\":false},{\"type\":\"uint8\",\"name\":\"ctokenDecimal\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BridgedTokenDeployed\",\"inputs\":[{\"type\":\"uint64\",\"name\":\"chainId\",\"indexed\":true},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":true},{\"type\":\"address\",\"name\":\"btoken\",\"indexed\":true},{\"type\":\"string\",\"name\":\"ctokenSymbol\",\"indexed\":false},{\"type\":\"string\",\"name\":\"ctokenName\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BridgedTokenDeployed\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"srcChainId\",\"indexed\":true},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":true},{\"type\":\"address\",\"name\":\"btoken\",\"indexed\":true},{\"type\":\"string\",\"name\":\"ctokenSymbol\",\"indexed\":false},{\"type\":\"string\",\"name\":\"ctokenName\",\"indexed\":false},{\"type\":\"uint8\",\"name\":\"ctokenDecimal\",\"indexed\":false}]},{\"type\":\"function\",\"name\":\"CLOCK_MODE\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"string\"}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"CalldataTxList\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"bytes\",\"name\":\"txList\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"ChainDataSynced\",\"inputs\":[{\"type\":\"uint64\",\"name\":\"chainId\",\"indexed\":true},{\"type\":\"uint64\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"kind\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"data\",\"indexed\":false},{\"type\":\"bytes32\",\"name\":\"signal\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"ConflictingProofs\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"address\",\"name\":\"guardian\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"currentProofHash\",\"indexed\":false},{\"type\":\"bytes32\",\"name\":\"newProofHash\",\"indexed\":false},{\"type\":\"bool\",\"name\":\"provingPaused\",\"indexed\":false}]},{\"type\":\"function\",\"name\":\"DOMAIN_SEPARATOR\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"DelegateChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"delegator\",\"indexed\":true},{\"type\":\"address\",\"name\":\"fromDelegate\",\"indexed\":true},{\"type\":\"address\",\"name\":\"toDelegate\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"DelegateVotesChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"delegate\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"previousBalance\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"newBalance\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"EIP712DomainChanged\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ETH_TRANSFER_FAILED\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"EtherPaymentFailed\",\"inputs\":[{\"type\":\"address\",\"name\":\"to\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"maxGas\",\"indexed\":false}]},{\"type\":\"error\",\"name\":\"FUNC_NOT_IMPLEMENTED\",\"inputs\":[]},{\"type\":\"function\",\"name\":\"GAS_OVERHEAD\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint32\"}]},{\"type\":\"function\",\"name\":\"GAS_RESERVE\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"GP_INVALID_GUARDIAN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GP_INVALID_GUARDIAN_SET\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GP_INVALID_MIN_GUARDIANS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GP_INVALID_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GV_PERMISSION_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GV_ZERO_ADDRESS\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"GuardianApproval\",\"inputs\":[{\"type\":\"address\",\"name\":\"addr\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"blockHash\",\"indexed\":true},{\"type\":\"bool\",\"name\":\"approved\",\"indexed\":false},{\"type\":\"bytes\",\"name\":\"proofData\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"GuardiansUpdated\",\"inputs\":[{\"type\":\"uint32\",\"name\":\"version\",\"indexed\":false},{\"type\":\"address[]\",\"name\":\"guardians\",\"indexed\":false}]},{\"type\":\"error\",\"name\":\"HOOK_ASSIGNMENT_EXPIRED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"HOOK_ASSIGNMENT_INVALID_SIG\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"HOOK_TIER_NOT_FOUND\",\"inputs\":[]},{\"type\":\"function\",\"name\":\"INSTANCE_EXPIRY\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"INSTANCE_VALIDITY_DELAY\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Initialized\",\"inputs\":[{\"type\":\"uint8\",\"name\":\"version\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"InstanceAdded\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"id\",\"indexed\":true},{\"type\":\"address\",\"name\":\"instance\",\"indexed\":true},{\"type\":\"address\",\"name\":\"replaced\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"validSince\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"InstanceDeleted\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"id\",\"indexed\":true},{\"type\":\"address\",\"name\":\"instance\",\"indexed\":true}]},{\"type\":\"error\",\"name\":\"L1_ALREADY_CONTESTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_ALREADY_PROVED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOB_NOT_AVAILABLE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOB_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOCK_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_CANNOT_CONTEST\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_BLOCK_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_GENESIS_HASH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_SIG\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_TIER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_TRANSITION\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_NOT_ASSIGNED_PROVER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_PROVING_PAUSED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_RECEIVE_DISABLED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TOO_MANY_BLOCKS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TRANSITION_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNEXPECTED_PARENT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNEXPECTED_TRANSITION_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"LTP_INVALID_ACCOUNT_PROOF\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"LTP_INVALID_INCLUSION_PROOF\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"LocalReportCheckToggled\",\"inputs\":[{\"type\":\"bool\",\"name\":\"checkLocalEnclaveReport\",\"indexed\":false}]},{\"type\":\"function\",\"name\":\"MAX_GAS_PAYING_PROVER\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"MIN_MIGRATION_DELAY\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MessageProcessed\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"tuple\",\"name\":\"message\",\"indexed\":false,\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"tuple\",\"name\":\"stats\",\"indexed\":false,\"components\":[{\"type\":\"uint32\",\"name\":\"gasUsedInFeeCalc\"},{\"type\":\"uint32\",\"name\":\"proofSize\"},{\"type\":\"uint32\",\"name\":\"numCacheOps\"},{\"type\":\"bool\",\"name\":\"processedByRelayer\"}]}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MessageSent\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"tuple\",\"name\":\"message\",\"indexed\":false,\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MessageStatusChanged\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"uint8\",\"name\":\"status\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MigratedTo\",\"inputs\":[{\"type\":\"address\",\"name\":\"fromToken\",\"indexed\":true},{\"type\":\"address\",\"name\":\"account\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"amount\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MigrationStatusChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"addr\",\"indexed\":false},{\"type\":\"bool\",\"name\":\"inbound\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MrEnclaveUpdated\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"mrEnclave\",\"indexed\":true},{\"type\":\"bool\",\"name\":\"trusted\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"MrSignerUpdated\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"mrSigner\",\"indexed\":true},{\"type\":\"bool\",\"name\":\"trusted\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferred\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Paused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"ProvingAutoPauseEnabled\",\"inputs\":[{\"type\":\"bool\",\"name\":\"enabled\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"ProvingPaused\",\"inputs\":[{\"type\":\"bool\",\"name\":\"paused\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"QeIdentityConfigured\",\"inputs\":[{\"type\":\"tuple\",\"name\":\"qeIdentityInput\",\"indexed\":false,\"components\":[{\"type\":\"bytes4\",\"name\":\"miscselect\"},{\"type\":\"bytes4\",\"name\":\"miscselectMask\"},{\"type\":\"uint16\",\"name\":\"isvprodid\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes16\",\"name\":\"attributesMask\"},{\"type\":\"bytes32\",\"name\":\"mrsigner\"},{\"type\":\"tuple[]\",\"name\":\"tcbLevels\",\"components\":[{\"type\":\"tuple\",\"name\":\"tcb\",\"components\":[{\"type\":\"uint16\",\"name\":\"isvsvn\"}]},{\"type\":\"uint8\",\"name\":\"tcbStatus\"}]}]}]},{\"type\":\"error\",\"name\":\"REENTRANT_CALL\",\"inputs\":[]},{\"type\":\"function\",\"name\":\"RELAYER_MAX_PROOF_BYTES\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"RESOLVER_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_INVALID_MANAGER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_UNEXPECTED_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_ZERO_ADDR\",\"inputs\":[{\"type\":\"uint64\",\"name\":\"chainId\"},{\"type\":\"bytes32\",\"name\":\"name\"}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"RevokedCertSerialNumAdded\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"index\",\"indexed\":true},{\"type\":\"bytes\",\"name\":\"serialNum\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"RevokedCertSerialNumRemoved\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"index\",\"indexed\":true},{\"type\":\"bytes\",\"name\":\"serialNum\",\"indexed\":false}]},{\"type\":\"error\",\"name\":\"SGX_ALREADY_ATTESTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SGX_INVALID_ATTESTATION\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SGX_INVALID_INSTANCE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SGX_INVALID_PROOF\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SGX_RA_NOT_SUPPORTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_EMPTY_PROOF\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_INVALID_HOPS_WITH_LOOP\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_INVALID_LAST_HOP_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_INVALID_MID_HOP_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_INVALID_STATE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_SIGNAL_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SS_UNAUTHORIZED\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"SignalSent\",\"inputs\":[{\"type\":\"address\",\"name\":\"app\",\"indexed\":false},{\"type\":\"bytes32\",\"name\":\"signal\",\"indexed\":false},{\"type\":\"bytes32\",\"name\":\"slot\",\"indexed\":false},{\"type\":\"bytes32\",\"name\":\"value\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"StateVariablesUpdated\",\"inputs\":[{\"type\":\"tuple\",\"name\":\"slotB\",\"indexed\":false,\"components\":[{\"type\":\"uint64\",\"name\":\"numBlocks\"},{\"type\":\"uint64\",\"name\":\"lastVerifiedBlockId\"},{\"type\":\"bool\",\"name\":\"provingPaused\"},{\"type\":\"uint8\",\"name\":\"__reservedB1\"},{\"type\":\"uint16\",\"name\":\"__reservedB2\"},{\"type\":\"uint32\",\"name\":\"__reservedB3\"},{\"type\":\"uint64\",\"name\":\"lastUnpausedAt\"}]}]},{\"type\":\"error\",\"name\":\"TIER_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"TT_INVALID_PARAM\",\"inputs\":[]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TcbInfoJsonConfigured\",\"inputs\":[{\"type\":\"string\",\"name\":\"fmspc\",\"indexed\":true},{\"type\":\"tuple\",\"name\":\"tcbInfoInput\",\"indexed\":false,\"components\":[{\"type\":\"string\",\"name\":\"pceid\"},{\"type\":\"string\",\"name\":\"fmspc\"},{\"type\":\"tuple[]\",\"name\":\"tcbLevels\",\"components\":[{\"type\":\"uint256\",\"name\":\"pcesvn\"},{\"type\":\"uint8[]\",\"name\":\"sgxTcbCompSvnArr\"},{\"type\":\"uint8\",\"name\":\"status\"}]}]}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TokenReceived\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint64\",\"name\":\"srcChainId\",\"indexed\":false},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":false},{\"type\":\"address\",\"name\":\"token\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"tokenIds\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"amounts\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TokenReceived\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint64\",\"name\":\"srcChainId\",\"indexed\":false},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":false},{\"type\":\"address\",\"name\":\"token\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"amount\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TokenReleased\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":false},{\"type\":\"address\",\"name\":\"token\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"tokenIds\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"amounts\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TokenReleased\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":false},{\"type\":\"address\",\"name\":\"token\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"amount\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TokenSent\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint64\",\"name\":\"destChainId\",\"indexed\":false},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":false},{\"type\":\"address\",\"name\":\"token\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"tokenIds\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"amounts\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TokenSent\",\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint64\",\"name\":\"canonicalChainId\",\"indexed\":false},{\"type\":\"uint64\",\"name\":\"destChainId\",\"indexed\":false},{\"type\":\"address\",\"name\":\"ctoken\",\"indexed\":false},{\"type\":\"address\",\"name\":\"token\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"amount\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Transfer\",\"inputs\":[{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"value\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Transfer\",\"inputs\":[{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"tokenId\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TransferBatch\",\"inputs\":[{\"type\":\"address\",\"name\":\"operator\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint256[]\",\"name\":\"ids\",\"indexed\":false},{\"type\":\"uint256[]\",\"name\":\"values\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TransferSingle\",\"inputs\":[{\"type\":\"address\",\"name\":\"operator\",\"indexed\":true},{\"type\":\"address\",\"name\":\"from\",\"indexed\":true},{\"type\":\"address\",\"name\":\"to\",\"indexed\":true},{\"type\":\"uint256\",\"name\":\"id\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"value\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TransitionContested\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"tuple\",\"name\":\"tran\",\"indexed\":false,\"components\":[{\"type\":\"bytes32\",\"name\":\"parentHash\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"bytes32\",\"name\":\"graffiti\"}]},{\"type\":\"address\",\"name\":\"contester\",\"indexed\":false},{\"type\":\"uint96\",\"name\":\"contestBond\",\"indexed\":false},{\"type\":\"uint16\",\"name\":\"tier\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"TransitionProved\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"blockId\",\"indexed\":true},{\"type\":\"tuple\",\"name\":\"tran\",\"indexed\":false,\"components\":[{\"type\":\"bytes32\",\"name\":\"parentHash\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"bytes32\",\"name\":\"graffiti\"}]},{\"type\":\"address\",\"name\":\"prover\",\"indexed\":false},{\"type\":\"uint96\",\"name\":\"validityBond\",\"indexed\":false},{\"type\":\"uint16\",\"name\":\"tier\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"URI\",\"inputs\":[{\"type\":\"string\",\"name\":\"value\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"id\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Unpaused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Upgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"implementation\",\"indexed\":true}]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_CERTIFICATION_CHAIN_DATA\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_CERTIFICATION_CHAIN_SIZE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_ECDSA_SIGNATURE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_QEAUTHDATA_SIZE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_QEREPORT_LENGTN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_QUOTE_LENGTN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_INVALID_QUOTE_MEMBER_LENGTN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"V3PARSER_UNSUPPORT_CERTIFICATION_TYPE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_BTOKEN_BLACKLISTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_CTOKEN_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INSUFFICIENT_FEE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INTERFACE_NOT_SUPPORTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_AMOUNT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_CTOKEN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_NEW_BTOKEN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_TOKEN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_TO_ADDR\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_LAST_MIGRATION_TOO_CLOSE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_PERMISSION_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_TOKEN_ARRAY_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_ADDRESS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_ADDR_MANAGER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_VALUE\",\"inputs\":[]},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"addInstances\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address[]\",\"name\":\"_instances\"}],\"outputs\":[{\"type\":\"uint256[]\"}]},{\"type\":\"function\",\"name\":\"addRevokedCertSerialNum\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"index\"},{\"type\":\"bytes[]\",\"name\":\"serialNumBatch\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"addressManager\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"addressRegistered\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"instanceAddress\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"alreadyAttested\"}]},{\"type\":\"function\",\"name\":\"allowance\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"owner\"},{\"type\":\"address\",\"name\":\"spender\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"approvals\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"version\"},{\"type\":\"bytes32\",\"name\":\"proofHash\"}],\"outputs\":[{\"type\":\"uint256\",\"name\":\"approvalBits\"}]},{\"type\":\"function\",\"name\":\"approve\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"spender\"},{\"type\":\"uint256\",\"name\":\"amount\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"approve\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_meta\",\"components\":[{\"type\":\"bytes32\",\"name\":\"l1Hash\"},{\"type\":\"bytes32\",\"name\":\"difficulty\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"bytes32\",\"name\":\"extraData\"},{\"type\":\"bytes32\",\"name\":\"depositsHash\"},{\"type\":\"address\",\"name\":\"coinbase\"},{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"uint64\",\"name\":\"timestamp\"},{\"type\":\"uint64\",\"name\":\"l1Height\"},{\"type\":\"uint16\",\"name\":\"minTier\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"bytes32\",\"name\":\"parentMetaHash\"},{\"type\":\"address\",\"name\":\"sender\"}]},{\"type\":\"tuple\",\"name\":\"_tran\",\"components\":[{\"type\":\"bytes32\",\"name\":\"parentHash\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"bytes32\",\"name\":\"graffiti\"}]},{\"type\":\"tuple\",\"name\":\"_proof\",\"components\":[{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[{\"type\":\"bool\",\"name\":\"approved_\"}]},{\"type\":\"function\",\"name\":\"approve\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"tokenId\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"authorize\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_addr\"},{\"type\":\"bool\",\"name\":\"_authorize\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"balanceOf\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"balanceOf\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"},{\"type\":\"uint256\",\"name\":\"id\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"balanceOfBatch\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address[]\",\"name\":\"accounts\"},{\"type\":\"uint256[]\",\"name\":\"ids\"}],\"outputs\":[{\"type\":\"uint256[]\"}]},{\"type\":\"function\",\"name\":\"batchTransfer\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address[]\",\"name\":\"recipients\"},{\"type\":\"uint256[]\",\"name\":\"amounts\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"bondBalanceOf\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_user\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"bridgedToCanonical\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"btoken\"}],\"outputs\":[{\"type\":\"uint64\",\"name\":\"chainId\"},{\"type\":\"address\",\"name\":\"addr\"},{\"type\":\"string\",\"name\":\"symbol\"},{\"type\":\"string\",\"name\":\"name\"}]},{\"type\":\"function\",\"name\":\"bridgedToCanonical\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"btoken\"}],\"outputs\":[{\"type\":\"uint64\",\"name\":\"chainId\"},{\"type\":\"address\",\"name\":\"addr\"},{\"type\":\"uint8\",\"name\":\"decimals\"},{\"type\":\"string\",\"name\":\"symbol\"},{\"type\":\"string\",\"name\":\"name\"}]},{\"type\":\"function\",\"name\":\"btokenDenylist\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"btoken\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"denied\"}]},{\"type\":\"function\",\"name\":\"burn\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_account\"},{\"type\":\"uint256\",\"name\":\"_tokenId\"},{\"type\":\"uint256\",\"name\":\"_amount\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"burn\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_account\"},{\"type\":\"uint256\",\"name\":\"_tokenId\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"burn\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"_amount\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"canonical\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"},{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"canonicalToBridged\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"chainId\"},{\"type\":\"address\",\"name\":\"ctoken\"}],\"outputs\":[{\"type\":\"address\",\"name\":\"btoken\"}]},{\"type\":\"function\",\"name\":\"changeBridgedToken\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_ctoken\",\"components\":[{\"type\":\"uint64\",\"name\":\"chainId\"},{\"type\":\"address\",\"name\":\"addr\"},{\"type\":\"uint8\",\"name\":\"decimals\"},{\"type\":\"string\",\"name\":\"symbol\"},{\"type\":\"string\",\"name\":\"name\"}]},{\"type\":\"address\",\"name\":\"_btokenNew\"}],\"outputs\":[{\"type\":\"address\",\"name\":\"btokenOld_\"}]},{\"type\":\"function\",\"name\":\"changeMigrationStatus\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_migratingAddress\"},{\"type\":\"bool\",\"name\":\"_migratingInbound\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"checkLocalEnclaveReport\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"checkpoints\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"},{\"type\":\"uint32\",\"name\":\"pos\"}],\"outputs\":[{\"type\":\"tuple\",\"components\":[{\"type\":\"uint32\",\"name\":\"fromBlock\"},{\"type\":\"uint224\",\"name\":\"votes\"}]}]},{\"type\":\"function\",\"name\":\"clock\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint48\"}]},{\"type\":\"function\",\"name\":\"configureQeIdentityJson\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"qeIdentityInput\",\"components\":[{\"type\":\"bytes4\",\"name\":\"miscselect\"},{\"type\":\"bytes4\",\"name\":\"miscselectMask\"},{\"type\":\"uint16\",\"name\":\"isvprodid\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes16\",\"name\":\"attributesMask\"},{\"type\":\"bytes32\",\"name\":\"mrsigner\"},{\"type\":\"tuple[]\",\"name\":\"tcbLevels\",\"components\":[{\"type\":\"tuple\",\"name\":\"tcb\",\"components\":[{\"type\":\"uint16\",\"name\":\"isvsvn\"}]},{\"type\":\"uint8\",\"name\":\"tcbStatus\"}]}]}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"configureTcbInfoJson\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"string\",\"name\":\"fmspc\"},{\"type\":\"tuple\",\"name\":\"tcbInfoInput\",\"components\":[{\"type\":\"string\",\"name\":\"pceid\"},{\"type\":\"string\",\"name\":\"fmspc\"},{\"type\":\"tuple[]\",\"name\":\"tcbLevels\",\"components\":[{\"type\":\"uint256\",\"name\":\"pcesvn\"},{\"type\":\"uint8[]\",\"name\":\"sgxTcbCompSvnArr\"},{\"type\":\"uint8\",\"name\":\"status\"}]}]}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"context\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"tuple\",\"name\":\"ctx_\",\"components\":[{\"type\":\"bytes32\",\"name\":\"msgHash\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"}]}]},{\"type\":\"function\",\"name\":\"decimals\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint8\"}]},{\"type\":\"function\",\"name\":\"decodeCert\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"bytes\",\"name\":\"der\"},{\"type\":\"bool\",\"name\":\"isPckCert\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"success\"},{\"type\":\"tuple\",\"name\":\"cert\",\"components\":[{\"type\":\"uint256\",\"name\":\"notBefore\"},{\"type\":\"uint256\",\"name\":\"notAfter\"},{\"type\":\"bytes\",\"name\":\"serialNumber\"},{\"type\":\"bytes\",\"name\":\"tbsCertificate\"},{\"type\":\"bytes\",\"name\":\"pubKey\"},{\"type\":\"bytes\",\"name\":\"signature\"},{\"type\":\"bool\",\"name\":\"isPck\"},{\"type\":\"tuple\",\"name\":\"pck\",\"components\":[{\"type\":\"string\",\"name\":\"commonName\"},{\"type\":\"string\",\"name\":\"issuerName\"},{\"type\":\"tuple\",\"name\":\"sgxExtension\",\"components\":[{\"type\":\"string\",\"name\":\"pceid\"},{\"type\":\"string\",\"name\":\"fmspc\"},{\"type\":\"uint256\",\"name\":\"pcesvn\"},{\"type\":\"uint256[]\",\"name\":\"sgxTcbCompSvnArr\"}]}]}]}]},{\"type\":\"function\",\"name\":\"decreaseAllowance\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"spender\"},{\"type\":\"uint256\",\"name\":\"subtractedValue\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"delegate\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"delegatee\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"delegateBySig\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"delegatee\"},{\"type\":\"uint256\",\"name\":\"nonce\"},{\"type\":\"uint256\",\"name\":\"expiry\"},{\"type\":\"uint8\",\"name\":\"v\"},{\"type\":\"bytes32\",\"name\":\"r\"},{\"type\":\"bytes32\",\"name\":\"s\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"delegates\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"deleteInstances\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256[]\",\"name\":\"_ids\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"depositBond\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"_amount\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"eip712Domain\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes1\",\"name\":\"fields\"},{\"type\":\"string\",\"name\":\"name\"},{\"type\":\"string\",\"name\":\"version\"},{\"type\":\"uint256\",\"name\":\"chainId\"},{\"type\":\"address\",\"name\":\"verifyingContract\"},{\"type\":\"bytes32\",\"name\":\"salt\"},{\"type\":\"uint256[]\",\"name\":\"extensions\"}]},{\"type\":\"function\",\"name\":\"enableProvingAutoPause\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"bool\",\"name\":\"_enable\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"enableTaikoTokenAllowance\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"bool\",\"name\":\"_enable\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"failMessage\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"getAddress\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"getApproved\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"tokenId\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"getBlock\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_blockId\"}],\"outputs\":[{\"type\":\"tuple\",\"name\":\"blk_\",\"components\":[{\"type\":\"bytes32\",\"name\":\"metaHash\"},{\"type\":\"address\",\"name\":\"assignedProver\"},{\"type\":\"uint96\",\"name\":\"livenessBond\"},{\"type\":\"uint64\",\"name\":\"blockId\"},{\"type\":\"uint64\",\"name\":\"proposedAt\"},{\"type\":\"uint64\",\"name\":\"proposedIn\"},{\"type\":\"uint32\",\"name\":\"nextTransitionId\"},{\"type\":\"uint32\",\"name\":\"verifiedTransitionId\"}]}]},{\"type\":\"function\",\"name\":\"getConfig\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"tuple\",\"components\":[{\"type\":\"uint64\",\"name\":\"chainId\"},{\"type\":\"uint64\",\"name\":\"blockMaxProposals\"},{\"type\":\"uint64\",\"name\":\"blockRingBufferSize\"},{\"type\":\"uint64\",\"name\":\"maxBlocksToVerify\"},{\"type\":\"uint32\",\"name\":\"blockMaxGasLimit\"},{\"type\":\"uint96\",\"name\":\"livenessBond\"},{\"type\":\"uint8\",\"name\":\"stateRootSyncInternal\"},{\"type\":\"bool\",\"name\":\"checkEOAForCalldataDA\"}]}]},{\"type\":\"function\",\"name\":\"getLastSyncedBlock\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\",\"name\":\"blockId_\"},{\"type\":\"bytes32\",\"name\":\"blockHash_\"},{\"type\":\"bytes32\",\"name\":\"stateRoot_\"}]},{\"type\":\"function\",\"name\":\"getLastVerifiedBlock\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\",\"name\":\"blockId_\"},{\"type\":\"bytes32\",\"name\":\"blockHash_\"},{\"type\":\"bytes32\",\"name\":\"stateRoot_\"}]},{\"type\":\"function\",\"name\":\"getMessageMinGasLimit\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"dataLength\"}],\"outputs\":[{\"type\":\"uint32\"}]},{\"type\":\"function\",\"name\":\"getMinTier\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\"}],\"outputs\":[{\"type\":\"uint16\"}]},{\"type\":\"function\",\"name\":\"getPastTotalSupply\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"timepoint\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"getPastVotes\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"},{\"type\":\"uint256\",\"name\":\"timepoint\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"getSignalSlot\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"address\",\"name\":\"_app\"},{\"type\":\"bytes32\",\"name\":\"_signal\"}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"getStateVariables\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"tuple\",\"components\":[{\"type\":\"uint64\",\"name\":\"genesisHeight\"},{\"type\":\"uint64\",\"name\":\"genesisTimestamp\"},{\"type\":\"uint64\",\"name\":\"lastSyncedBlockId\"},{\"type\":\"uint64\",\"name\":\"lastSynecdAt\"}]},{\"type\":\"tuple\",\"components\":[{\"type\":\"uint64\",\"name\":\"numBlocks\"},{\"type\":\"uint64\",\"name\":\"lastVerifiedBlockId\"},{\"type\":\"bool\",\"name\":\"provingPaused\"},{\"type\":\"uint8\",\"name\":\"__reservedB1\"},{\"type\":\"uint16\",\"name\":\"__reservedB2\"},{\"type\":\"uint32\",\"name\":\"__reservedB3\"},{\"type\":\"uint64\",\"name\":\"lastUnpausedAt\"}]}]},{\"type\":\"function\",\"name\":\"getSyncedChainData\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_kind\"},{\"type\":\"uint64\",\"name\":\"_blockId\"}],\"outputs\":[{\"type\":\"uint64\",\"name\":\"blockId_\"},{\"type\":\"bytes32\",\"name\":\"chainData_\"}]},{\"type\":\"function\",\"name\":\"getTier\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"uint16\",\"name\":\"_tierId\"}],\"outputs\":[{\"type\":\"tuple\",\"components\":[{\"type\":\"bytes32\",\"name\":\"verifierName\"},{\"type\":\"uint96\",\"name\":\"validityBond\"},{\"type\":\"uint96\",\"name\":\"contestBond\"},{\"type\":\"uint24\",\"name\":\"cooldownWindow\"},{\"type\":\"uint16\",\"name\":\"provingWindow\"},{\"type\":\"uint8\",\"name\":\"maxBlocksToVerifyPerProof\"}]}]},{\"type\":\"function\",\"name\":\"getTierIds\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint16[]\",\"name\":\"tiers_\"}]},{\"type\":\"function\",\"name\":\"getTransition\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_blockId\"},{\"type\":\"uint32\",\"name\":\"_tid\"}],\"outputs\":[{\"type\":\"tuple\",\"components\":[{\"type\":\"bytes32\",\"name\":\"key\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"address\",\"name\":\"prover\"},{\"type\":\"uint96\",\"name\":\"validityBond\"},{\"type\":\"address\",\"name\":\"contester\"},{\"type\":\"uint96\",\"name\":\"contestBond\"},{\"type\":\"uint64\",\"name\":\"timestamp\"},{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"uint8\",\"name\":\"__reserved1\"}]}]},{\"type\":\"function\",\"name\":\"getTransition\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_blockId\"},{\"type\":\"bytes32\",\"name\":\"_parentHash\"}],\"outputs\":[{\"type\":\"tuple\",\"components\":[{\"type\":\"bytes32\",\"name\":\"key\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"address\",\"name\":\"prover\"},{\"type\":\"uint96\",\"name\":\"validityBond\"},{\"type\":\"address\",\"name\":\"contester\"},{\"type\":\"uint96\",\"name\":\"contestBond\"},{\"type\":\"uint64\",\"name\":\"timestamp\"},{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"uint8\",\"name\":\"__reserved1\"}]}]},{\"type\":\"function\",\"name\":\"getVerifiedBlockProver\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_blockId\"}],\"outputs\":[{\"type\":\"address\",\"name\":\"prover_\"}]},{\"type\":\"function\",\"name\":\"getVotes\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"guardianIds\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"guardian\"}],\"outputs\":[{\"type\":\"uint256\",\"name\":\"id\"}]},{\"type\":\"function\",\"name\":\"guardians\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"hashAssignment\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_assignment\",\"components\":[{\"type\":\"address\",\"name\":\"feeToken\"},{\"type\":\"uint64\",\"name\":\"expiry\"},{\"type\":\"uint64\",\"name\":\"maxBlockId\"},{\"type\":\"uint64\",\"name\":\"maxProposedIn\"},{\"type\":\"bytes32\",\"name\":\"metaHash\"},{\"type\":\"bytes32\",\"name\":\"parentMetaHash\"},{\"type\":\"tuple[]\",\"name\":\"tierFees\",\"components\":[{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"uint128\",\"name\":\"fee\"}]},{\"type\":\"bytes\",\"name\":\"signature\"}]},{\"type\":\"address\",\"name\":\"_taikoL1Address\"},{\"type\":\"address\",\"name\":\"_blockProposer\"},{\"type\":\"address\",\"name\":\"_assignedProver\"},{\"type\":\"bytes32\",\"name\":\"_blobHash\"}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"hashMessage\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"impl\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"inNonReentrant\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"increaseAllowance\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"spender\"},{\"type\":\"uint256\",\"name\":\"addedValue\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"},{\"type\":\"address\",\"name\":\"_addressManager\"},{\"type\":\"bytes32\",\"name\":\"_genesisBlockHash\"},{\"type\":\"bool\",\"name\":\"_toPause\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"},{\"type\":\"address\",\"name\":\"_addressManager\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"},{\"type\":\"address\",\"name\":\"_addressManager\"},{\"type\":\"address\",\"name\":\"_srcToken\"},{\"type\":\"uint256\",\"name\":\"_srcChainId\"},{\"type\":\"string\",\"name\":\"_symbol\"},{\"type\":\"string\",\"name\":\"_name\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"owner\"},{\"type\":\"address\",\"name\":\"sigVerifyLibAddr\"},{\"type\":\"address\",\"name\":\"pemCertLibAddr\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"},{\"type\":\"address\",\"name\":\"_addressManager\"},{\"type\":\"address\",\"name\":\"_srcToken\"},{\"type\":\"uint256\",\"name\":\"_srcChainId\"},{\"type\":\"uint8\",\"name\":\"_decimals\"},{\"type\":\"string\",\"name\":\"_symbol\"},{\"type\":\"string\",\"name\":\"_name\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init2\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"instances\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"instanceId\"}],\"outputs\":[{\"type\":\"address\",\"name\":\"addr\"},{\"type\":\"uint64\",\"name\":\"validSince\"}]},{\"type\":\"function\",\"name\":\"isApprovedForAll\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"},{\"type\":\"address\",\"name\":\"operator\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"isAuthorized\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"addr\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"authorized\"}]},{\"type\":\"function\",\"name\":\"isChainDataSynced\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_kind\"},{\"type\":\"uint64\",\"name\":\"_blockId\"},{\"type\":\"bytes32\",\"name\":\"_chainData\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"isDestChainEnabled\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"enabled_\"},{\"type\":\"address\",\"name\":\"destBridge_\"}]},{\"type\":\"function\",\"name\":\"isMessageFailed\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"bytes\",\"name\":\"_proof\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"isMessageReceived\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"bytes\",\"name\":\"_proof\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"isMessageSent\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"isSignalSent\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_app\"},{\"type\":\"bytes32\",\"name\":\"_signal\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"lastMigrationStart\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"chainId\"},{\"type\":\"address\",\"name\":\"ctoken\"}],\"outputs\":[{\"type\":\"uint256\",\"name\":\"timestamp\"}]},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"latestProofHash\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"version\"},{\"type\":\"uint256\",\"name\":\"blockId\"}],\"outputs\":[{\"type\":\"bytes32\",\"name\":\"hash\"}]},{\"type\":\"function\",\"name\":\"messageStatus\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash\"}],\"outputs\":[{\"type\":\"uint8\",\"name\":\"status\"}]},{\"type\":\"function\",\"name\":\"migratingAddress\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"migratingInbound\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"minGuardians\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint32\"}]},{\"type\":\"function\",\"name\":\"mint\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_to\"},{\"type\":\"uint256\",\"name\":\"_tokenId\"},{\"type\":\"uint256\",\"name\":\"_amount\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"mint\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_account\"},{\"type\":\"uint256\",\"name\":\"_tokenId\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"mintBatch\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_to\"},{\"type\":\"uint256[]\",\"name\":\"_tokenIds\"},{\"type\":\"uint256[]\",\"name\":\"_amounts\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"name\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"name\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"string\"}]},{\"type\":\"function\",\"name\":\"nextInstanceId\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"nextMessageId\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"nonces\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"owner\"}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"numCheckpoints\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"account\"}],\"outputs\":[{\"type\":\"uint32\"}]},{\"type\":\"function\",\"name\":\"numGuardians\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"onBlockProposed\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_blk\",\"components\":[{\"type\":\"bytes32\",\"name\":\"metaHash\"},{\"type\":\"address\",\"name\":\"assignedProver\"},{\"type\":\"uint96\",\"name\":\"livenessBond\"},{\"type\":\"uint64\",\"name\":\"blockId\"},{\"type\":\"uint64\",\"name\":\"proposedAt\"},{\"type\":\"uint64\",\"name\":\"proposedIn\"},{\"type\":\"uint32\",\"name\":\"nextTransitionId\"},{\"type\":\"uint32\",\"name\":\"verifiedTransitionId\"}]},{\"type\":\"tuple\",\"name\":\"_meta\",\"components\":[{\"type\":\"bytes32\",\"name\":\"l1Hash\"},{\"type\":\"bytes32\",\"name\":\"difficulty\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"bytes32\",\"name\":\"extraData\"},{\"type\":\"bytes32\",\"name\":\"depositsHash\"},{\"type\":\"address\",\"name\":\"coinbase\"},{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"uint64\",\"name\":\"timestamp\"},{\"type\":\"uint64\",\"name\":\"l1Height\"},{\"type\":\"uint16\",\"name\":\"minTier\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"bytes32\",\"name\":\"parentMetaHash\"},{\"type\":\"address\",\"name\":\"sender\"}]},{\"type\":\"bytes\",\"name\":\"_data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"onERC1155BatchReceived\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"address\"},{\"type\":\"address\"},{\"type\":\"uint256[]\"},{\"type\":\"uint256[]\"},{\"type\":\"bytes\"}],\"outputs\":[{\"type\":\"bytes4\"}]},{\"type\":\"function\",\"name\":\"onERC1155Received\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"address\"},{\"type\":\"address\"},{\"type\":\"uint256\"},{\"type\":\"uint256\"},{\"type\":\"bytes\"}],\"outputs\":[{\"type\":\"bytes4\"}]},{\"type\":\"function\",\"name\":\"onERC721Received\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"address\"},{\"type\":\"address\"},{\"type\":\"uint256\"},{\"type\":\"bytes\"}],\"outputs\":[{\"type\":\"bytes4\"}]},{\"type\":\"function\",\"name\":\"onMessageInvocation\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"bytes\",\"name\":\"_data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"onMessageRecalled\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"bytes32\",\"name\":\"_msgHash\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"owner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"ownerOf\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"tokenId\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"pause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"pauseProving\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"bool\",\"name\":\"_pause\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"pauseTaikoProving\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"paused\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"pemCertLib\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"pendingOwner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"permit\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"owner\"},{\"type\":\"address\",\"name\":\"spender\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"uint256\",\"name\":\"deadline\"},{\"type\":\"uint8\",\"name\":\"v\"},{\"type\":\"bytes32\",\"name\":\"r\"},{\"type\":\"bytes32\",\"name\":\"s\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"processMessage\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"bytes\",\"name\":\"_proof\"}],\"outputs\":[{\"type\":\"uint8\",\"name\":\"status_\"},{\"type\":\"uint8\",\"name\":\"reason_\"}]},{\"type\":\"function\",\"name\":\"proposeBlock\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"bytes\",\"name\":\"_params\"},{\"type\":\"bytes\",\"name\":\"_txList\"}],\"outputs\":[{\"type\":\"tuple\",\"name\":\"meta_\",\"components\":[{\"type\":\"bytes32\",\"name\":\"l1Hash\"},{\"type\":\"bytes32\",\"name\":\"difficulty\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"bytes32\",\"name\":\"extraData\"},{\"type\":\"bytes32\",\"name\":\"depositsHash\"},{\"type\":\"address\",\"name\":\"coinbase\"},{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"uint64\",\"name\":\"timestamp\"},{\"type\":\"uint64\",\"name\":\"l1Height\"},{\"type\":\"uint16\",\"name\":\"minTier\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"bytes32\",\"name\":\"parentMetaHash\"},{\"type\":\"address\",\"name\":\"sender\"}]},{\"type\":\"tuple[]\",\"name\":\"deposits_\",\"components\":[{\"type\":\"address\",\"name\":\"recipient\"},{\"type\":\"uint96\",\"name\":\"amount\"},{\"type\":\"uint64\",\"name\":\"id\"}]}]},{\"type\":\"function\",\"name\":\"proveBlock\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_blockId\"},{\"type\":\"bytes\",\"name\":\"_input\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"proveSignalReceived\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"address\",\"name\":\"_app\"},{\"type\":\"bytes32\",\"name\":\"_signal\"},{\"type\":\"bytes\",\"name\":\"_proof\"}],\"outputs\":[{\"type\":\"uint256\",\"name\":\"numCacheOps_\"}]},{\"type\":\"function\",\"name\":\"provingAutoPauseEnabled\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"qeIdentity\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes4\",\"name\":\"miscselect\"},{\"type\":\"bytes4\",\"name\":\"miscselectMask\"},{\"type\":\"uint16\",\"name\":\"isvprodid\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes16\",\"name\":\"attributesMask\"},{\"type\":\"bytes32\",\"name\":\"mrsigner\"}]},{\"type\":\"function\",\"name\":\"recallMessage\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"bytes\",\"name\":\"_proof\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"registerInstance\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_attestation\",\"components\":[{\"type\":\"tuple\",\"name\":\"header\",\"components\":[{\"type\":\"bytes2\",\"name\":\"version\"},{\"type\":\"bytes2\",\"name\":\"attestationKeyType\"},{\"type\":\"bytes4\",\"name\":\"teeType\"},{\"type\":\"bytes2\",\"name\":\"qeSvn\"},{\"type\":\"bytes2\",\"name\":\"pceSvn\"},{\"type\":\"bytes16\",\"name\":\"qeVendorId\"},{\"type\":\"bytes20\",\"name\":\"userData\"}]},{\"type\":\"tuple\",\"name\":\"localEnclaveReport\",\"components\":[{\"type\":\"bytes16\",\"name\":\"cpuSvn\"},{\"type\":\"bytes4\",\"name\":\"miscSelect\"},{\"type\":\"bytes28\",\"name\":\"reserved1\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes32\",\"name\":\"mrEnclave\"},{\"type\":\"bytes32\",\"name\":\"reserved2\"},{\"type\":\"bytes32\",\"name\":\"mrSigner\"},{\"type\":\"bytes\",\"name\":\"reserved3\"},{\"type\":\"uint16\",\"name\":\"isvProdId\"},{\"type\":\"uint16\",\"name\":\"isvSvn\"},{\"type\":\"bytes\",\"name\":\"reserved4\"},{\"type\":\"bytes\",\"name\":\"reportData\"}]},{\"type\":\"tuple\",\"name\":\"v3AuthData\",\"components\":[{\"type\":\"bytes\",\"name\":\"ecdsa256BitSignature\"},{\"type\":\"bytes\",\"name\":\"ecdsaAttestationKey\"},{\"type\":\"tuple\",\"name\":\"pckSignedQeReport\",\"components\":[{\"type\":\"bytes16\",\"name\":\"cpuSvn\"},{\"type\":\"bytes4\",\"name\":\"miscSelect\"},{\"type\":\"bytes28\",\"name\":\"reserved1\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes32\",\"name\":\"mrEnclave\"},{\"type\":\"bytes32\",\"name\":\"reserved2\"},{\"type\":\"bytes32\",\"name\":\"mrSigner\"},{\"type\":\"bytes\",\"name\":\"reserved3\"},{\"type\":\"uint16\",\"name\":\"isvProdId\"},{\"type\":\"uint16\",\"name\":\"isvSvn\"},{\"type\":\"bytes\",\"name\":\"reserved4\"},{\"type\":\"bytes\",\"name\":\"reportData\"}]},{\"type\":\"bytes\",\"name\":\"qeReportSignature\"},{\"type\":\"tuple\",\"name\":\"qeAuthData\",\"components\":[{\"type\":\"uint16\",\"name\":\"parsedDataSize\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"tuple\",\"name\":\"certification\",\"components\":[{\"type\":\"uint16\",\"name\":\"certType\"},{\"type\":\"uint32\",\"name\":\"certDataSize\"},{\"type\":\"bytes[3]\",\"name\":\"decodedCertDataArray\"}]}]}]}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"removeRevokedCertSerialNum\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"index\"},{\"type\":\"bytes[]\",\"name\":\"serialNumBatch\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"resolve\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"bool\",\"name\":\"_allowZeroAddress\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"resolve\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"bool\",\"name\":\"_allowZeroAddress\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"retryMessage\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"bool\",\"name\":\"_isLastAttempt\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"safeBatchTransferFrom\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256[]\",\"name\":\"ids\"},{\"type\":\"uint256[]\",\"name\":\"amounts\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"safeTransferFrom\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"id\"},{\"type\":\"uint256\",\"name\":\"amount\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"safeTransferFrom\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"tokenId\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"safeTransferFrom\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"tokenId\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"selfDelegate\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_anyToken\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"sendMessage\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_message\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[{\"type\":\"bytes32\",\"name\":\"msgHash_\"},{\"type\":\"tuple\",\"name\":\"message_\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}]},{\"type\":\"function\",\"name\":\"sendSignal\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"_signal\"}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"sendToken\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_op\",\"components\":[{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"address\",\"name\":\"token\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"uint256[]\",\"name\":\"tokenIds\"},{\"type\":\"uint256[]\",\"name\":\"amounts\"}]}],\"outputs\":[{\"type\":\"tuple\",\"name\":\"message_\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}]},{\"type\":\"function\",\"name\":\"sendToken\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_op\",\"components\":[{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"address\",\"name\":\"token\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"uint256\",\"name\":\"amount\"}]}],\"outputs\":[{\"type\":\"tuple\",\"name\":\"message_\",\"components\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"fee\"},{\"type\":\"uint32\",\"name\":\"gasLimit\"},{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"uint64\",\"name\":\"srcChainId\"},{\"type\":\"address\",\"name\":\"srcOwner\"},{\"type\":\"uint64\",\"name\":\"destChainId\"},{\"type\":\"address\",\"name\":\"destOwner\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"value\"},{\"type\":\"bytes\",\"name\":\"data\"}]}]},{\"type\":\"function\",\"name\":\"serialNumIsRevoked\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"idx\"},{\"type\":\"bytes\",\"name\":\"serialNum\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"revoked\"}]},{\"type\":\"function\",\"name\":\"setAddress\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"address\",\"name\":\"_newAddress\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"setApprovalForAll\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"operator\"},{\"type\":\"bool\",\"name\":\"approved\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"setGuardians\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address[]\",\"name\":\"_newGuardians\"},{\"type\":\"uint8\",\"name\":\"_minGuardians\"},{\"type\":\"bool\",\"name\":\"_clearData\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"setMrEnclave\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"_mrEnclave\"},{\"type\":\"bool\",\"name\":\"_trusted\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"setMrSigner\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"_mrSigner\"},{\"type\":\"bool\",\"name\":\"_trusted\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"sigVerifyLib\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"signalForChainData\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_kind\"},{\"type\":\"uint64\",\"name\":\"_blockId\"}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"signalForFailedMessage\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"_msgHash\"}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"source\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"},{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"splitCertificateChain\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[{\"type\":\"bytes\",\"name\":\"pemChain\"},{\"type\":\"uint256\",\"name\":\"size\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"success\"},{\"type\":\"bytes[]\",\"name\":\"certs\"}]},{\"type\":\"function\",\"name\":\"srcChainId\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"srcToken\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"state\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\",\"name\":\"__reserve1\"},{\"type\":\"tuple\",\"name\":\"slotA\",\"components\":[{\"type\":\"uint64\",\"name\":\"genesisHeight\"},{\"type\":\"uint64\",\"name\":\"genesisTimestamp\"},{\"type\":\"uint64\",\"name\":\"lastSyncedBlockId\"},{\"type\":\"uint64\",\"name\":\"lastSynecdAt\"}]},{\"type\":\"tuple\",\"name\":\"slotB\",\"components\":[{\"type\":\"uint64\",\"name\":\"numBlocks\"},{\"type\":\"uint64\",\"name\":\"lastVerifiedBlockId\"},{\"type\":\"bool\",\"name\":\"provingPaused\"},{\"type\":\"uint8\",\"name\":\"__reservedB1\"},{\"type\":\"uint16\",\"name\":\"__reservedB2\"},{\"type\":\"uint32\",\"name\":\"__reservedB3\"},{\"type\":\"uint64\",\"name\":\"lastUnpausedAt\"}]}]},{\"type\":\"function\",\"name\":\"supportsInterface\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes4\",\"name\":\"_interfaceId\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"symbol\",\"constant\":true,\"stateMutability\":\"pure\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"string\"}]},{\"type\":\"function\",\"name\":\"symbol\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"string\"}]},{\"type\":\"function\",\"name\":\"syncChainData\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_kind\"},{\"type\":\"uint64\",\"name\":\"_blockId\"},{\"type\":\"bytes32\",\"name\":\"_chainData\"}],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"tcbInfo\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"string\",\"name\":\"fmspc\"}],\"outputs\":[{\"type\":\"string\",\"name\":\"pceid\"},{\"type\":\"string\",\"name\":\"fmspc\"}]},{\"type\":\"function\",\"name\":\"toggleLocalReportCheck\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"tokenURI\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"_tokenId\"}],\"outputs\":[{\"type\":\"string\"}]},{\"type\":\"function\",\"name\":\"topBlockId\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"chainId\"},{\"type\":\"bytes32\",\"name\":\"kind\"}],\"outputs\":[{\"type\":\"uint64\",\"name\":\"blockId\"}]},{\"type\":\"function\",\"name\":\"totalSupply\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"transfer\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"amount\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"transferFrom\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"amount\"}],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"transferFrom\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"from\"},{\"type\":\"address\",\"name\":\"to\"},{\"type\":\"uint256\",\"name\":\"tokenId\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"transferOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newOwner\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"trustedUserMrEnclave\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"enclave\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"trusted\"}]},{\"type\":\"function\",\"name\":\"trustedUserMrSigner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes32\",\"name\":\"signer\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"trusted\"}]},{\"type\":\"function\",\"name\":\"unpause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeTo\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"uri\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\"}],\"outputs\":[{\"type\":\"string\"}]},{\"type\":\"function\",\"name\":\"verifyAttestation\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"success\"}]},{\"type\":\"function\",\"name\":\"verifyBlocks\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_maxBlocksToVerify\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"verifyES256Signature\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"bytes\",\"name\":\"tbs\"},{\"type\":\"bytes\",\"name\":\"signature\"},{\"type\":\"bytes\",\"name\":\"publicKey\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"sigValid\"}]},{\"type\":\"function\",\"name\":\"verifyParsedQuote\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"v3quote\",\"components\":[{\"type\":\"tuple\",\"name\":\"header\",\"components\":[{\"type\":\"bytes2\",\"name\":\"version\"},{\"type\":\"bytes2\",\"name\":\"attestationKeyType\"},{\"type\":\"bytes4\",\"name\":\"teeType\"},{\"type\":\"bytes2\",\"name\":\"qeSvn\"},{\"type\":\"bytes2\",\"name\":\"pceSvn\"},{\"type\":\"bytes16\",\"name\":\"qeVendorId\"},{\"type\":\"bytes20\",\"name\":\"userData\"}]},{\"type\":\"tuple\",\"name\":\"localEnclaveReport\",\"components\":[{\"type\":\"bytes16\",\"name\":\"cpuSvn\"},{\"type\":\"bytes4\",\"name\":\"miscSelect\"},{\"type\":\"bytes28\",\"name\":\"reserved1\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes32\",\"name\":\"mrEnclave\"},{\"type\":\"bytes32\",\"name\":\"reserved2\"},{\"type\":\"bytes32\",\"name\":\"mrSigner\"},{\"type\":\"bytes\",\"name\":\"reserved3\"},{\"type\":\"uint16\",\"name\":\"isvProdId\"},{\"type\":\"uint16\",\"name\":\"isvSvn\"},{\"type\":\"bytes\",\"name\":\"reserved4\"},{\"type\":\"bytes\",\"name\":\"reportData\"}]},{\"type\":\"tuple\",\"name\":\"v3AuthData\",\"components\":[{\"type\":\"bytes\",\"name\":\"ecdsa256BitSignature\"},{\"type\":\"bytes\",\"name\":\"ecdsaAttestationKey\"},{\"type\":\"tuple\",\"name\":\"pckSignedQeReport\",\"components\":[{\"type\":\"bytes16\",\"name\":\"cpuSvn\"},{\"type\":\"bytes4\",\"name\":\"miscSelect\"},{\"type\":\"bytes28\",\"name\":\"reserved1\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes32\",\"name\":\"mrEnclave\"},{\"type\":\"bytes32\",\"name\":\"reserved2\"},{\"type\":\"bytes32\",\"name\":\"mrSigner\"},{\"type\":\"bytes\",\"name\":\"reserved3\"},{\"type\":\"uint16\",\"name\":\"isvProdId\"},{\"type\":\"uint16\",\"name\":\"isvSvn\"},{\"type\":\"bytes\",\"name\":\"reserved4\"},{\"type\":\"bytes\",\"name\":\"reportData\"}]},{\"type\":\"bytes\",\"name\":\"qeReportSignature\"},{\"type\":\"tuple\",\"name\":\"qeAuthData\",\"components\":[{\"type\":\"uint16\",\"name\":\"parsedDataSize\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"tuple\",\"name\":\"certification\",\"components\":[{\"type\":\"uint16\",\"name\":\"certType\"},{\"type\":\"uint32\",\"name\":\"certDataSize\"},{\"type\":\"bytes[3]\",\"name\":\"decodedCertDataArray\"}]}]}]}],\"outputs\":[{\"type\":\"bool\"},{\"type\":\"bytes\"}]},{\"type\":\"function\",\"name\":\"verifyProof\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_ctx\",\"components\":[{\"type\":\"bytes32\",\"name\":\"metaHash\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"address\",\"name\":\"prover\"},{\"type\":\"uint64\",\"name\":\"blockId\"},{\"type\":\"bool\",\"name\":\"isContesting\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"address\",\"name\":\"msgSender\"}]},{\"type\":\"tuple\",\"components\":[{\"type\":\"bytes32\",\"name\":\"parentHash\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"bytes32\",\"name\":\"graffiti\"}]},{\"type\":\"tuple\",\"components\":[{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"verifyProof\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_ctx\",\"components\":[{\"type\":\"bytes32\",\"name\":\"metaHash\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"address\",\"name\":\"prover\"},{\"type\":\"uint64\",\"name\":\"blockId\"},{\"type\":\"bool\",\"name\":\"isContesting\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"address\",\"name\":\"msgSender\"}]},{\"type\":\"tuple\",\"name\":\"_tran\",\"components\":[{\"type\":\"bytes32\",\"name\":\"parentHash\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"bytes32\",\"name\":\"graffiti\"}]},{\"type\":\"tuple\",\"name\":\"_proof\",\"components\":[{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"verifySignalReceived\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"address\",\"name\":\"_app\"},{\"type\":\"bytes32\",\"name\":\"_signal\"},{\"type\":\"bytes\",\"name\":\"_proof\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"version\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint32\"}]},{\"type\":\"function\",\"name\":\"withdrawBond\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"_amount\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"withdrawTaikoToken\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_to\"},{\"type\":\"uint256\",\"name\":\"_amount\"}],\"outputs\":[]},{\"type\":\"constructor\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"es256Verifier\"}]}]","addresses":["0x02772b7B3a5Bea0141C993Dbb8D0733C19F46169","0x06a9Ab27c7e2255df1815E6CC0168d7755Feb19a","0x0b470dd3A0e1C41228856Fb319649E7c08f419Aa","0x10dea67478c5F8C5E2D90e5E9B26dBe60c54d800","0x11A9ebA17EbF92b40fcf9a640Ebbc47Db6fBeab0","0x33879cDF01121dc7bCe011b461e64d791aE931F2","0x39E4C1214e733639d059979079A151911e42791d","0x47bB416ee947fE4a4b655011aF7d6E3A1B80E6e9","0x537a2f0D3a5879b41BCb5A2afE2EA5c4961796F6","0x579A8d63a2Db646284CBFE31FE5082c9989E985c","0x579f40D0BE111b823962043702cabe6Aaa290780","0x67281b15aee4d6b805bc755e439abd524dd8da8d","0x8d7C954960a36a7596d7eA4945dDf891967ca8A3","0x996282cA11E5DEb6B5D122CC3B9A1FcAAD4415Ab","0x9e0a24964e5397B566c1ed39258e21aB5E35C77C","0xE3D777143Ea25A6E031d1e921F396750885f43aC","0xEf9EaA1dd30a9AA1df01c36411b5F082aA65fBaa","0xa25e645ff9897b0282e5f17d36de5bca4ec21d6e","0xaf145913EA4a56BE22E120ED9C24589659881702","0xb0f3186FC1963f774f52ff455DC86aEdD0b31F81","0xc4096E9ff1526Bd1840B65e9f45695135aC12De7","0xcc5d488073FA918cBbd73B9A523F3858C4de7372","0xd60247c6848B7Ca29eDdF63AA924E53dB6Ddd8EC"]}],"createdAt":"2024-08-27T09:44:01.744Z","subscriberId":"d1b49dd5-72bd-480e-b5d7-649ce0aadd09","name":"TaikoL1: Pause/Unpause","network":"mainnet","riskCategory":"ACCESS-CONTROL","monitorId":"d1b49dd5-72bd-480e-b5d7-649ce0aadd09","blockWatcherId":"mainnet-6","paused":false,"stackResourceId":"mystack.taiko-l-1-pause-unpause","type":"BLOCK"},{"skipABIValidation":false,"alertThreshold":null,"notifyConfig":{"severityLevel":"LOW","messageBody":"**Defender Monitor {{ sentinel.name }} Triggered**\n\n**Network**\n\n{{ sentinel.network }}\n\n**Block Hash**\n\n{{ blockHash }}\n\n**Transaction Hash**\n\n{{ transaction.transactionHash }}\n\n**Explorer Link**\n\n{{ transaction.link }}\n\n{{ matchReasonsFormatted }}","messageSubject":"Defender Monitor: Taiko Mainnet SGX Prover triggered","notifications":[{"type":"discord","sendCount":0,"notificationId":"93e8dbf2-4f87-4793-b3c3-6ff0dd6cf827"}],"timeoutMs":0},"tenantId":"0691b59e-8b53-4ae2-b874-959de8a9f2ee","addressRules":[{"conditions":[{"txConditions":[{"status":"any","expression":"status == \"failed\""}],"functionConditions":[],"eventConditions":[{"eventSignature":"InstanceAdded(uint256,address,address,uint256)","expression":null}]},{"txConditions":[{"status":"any","expression":"status == \"failed\""}],"functionConditions":[],"eventConditions":[{"eventSignature":"InstanceDeleted(uint256,address)","expression":null}]},{"txConditions":[{"status":"any","expression":"status == \"failed\""}],"functionConditions":[{"functionSignature":"verifyProof((bytes32,bytes32,address,uint64,bool,bool,address),(bytes32,bytes32,bytes32,bytes32),(uint16,bytes))","expression":null}],"eventConditions":[]}],"abi":"[{\"type\":\"event\",\"anonymous\":false,\"name\":\"AdminChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousAdmin\",\"indexed\":false},{\"type\":\"address\",\"name\":\"newAdmin\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BeaconUpgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"beacon\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Initialized\",\"inputs\":[{\"type\":\"uint8\",\"name\":\"version\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"InstanceAdded\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"id\",\"indexed\":true},{\"type\":\"address\",\"name\":\"instance\",\"indexed\":true},{\"type\":\"address\",\"name\":\"replaced\",\"indexed\":false},{\"type\":\"uint256\",\"name\":\"validSince\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"InstanceDeleted\",\"inputs\":[{\"type\":\"uint256\",\"name\":\"id\",\"indexed\":true},{\"type\":\"address\",\"name\":\"instance\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferred\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Paused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Unpaused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Upgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"implementation\",\"indexed\":true}]},{\"type\":\"function\",\"name\":\"INSTANCE_EXPIRY\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"INSTANCE_VALIDITY_DELAY\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"addInstances\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address[]\",\"name\":\"_instances\"}],\"outputs\":[{\"type\":\"uint256[]\"}]},{\"type\":\"function\",\"name\":\"addressManager\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"addressRegistered\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"instanceAddress\"}],\"outputs\":[{\"type\":\"bool\",\"name\":\"alreadyAttested\"}]},{\"type\":\"function\",\"name\":\"deleteInstances\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint256[]\",\"name\":\"_ids\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"},{\"type\":\"address\",\"name\":\"_addressManager\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"instances\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint256\",\"name\":\"instanceId\"}],\"outputs\":[{\"type\":\"address\",\"name\":\"addr\"},{\"type\":\"uint64\",\"name\":\"validSince\"}]},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"nextInstanceId\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"owner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"pause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"paused\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"pendingOwner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"registerInstance\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_attestation\",\"components\":[{\"type\":\"tuple\",\"name\":\"header\",\"components\":[{\"type\":\"bytes2\",\"name\":\"version\"},{\"type\":\"bytes2\",\"name\":\"attestationKeyType\"},{\"type\":\"bytes4\",\"name\":\"teeType\"},{\"type\":\"bytes2\",\"name\":\"qeSvn\"},{\"type\":\"bytes2\",\"name\":\"pceSvn\"},{\"type\":\"bytes16\",\"name\":\"qeVendorId\"},{\"type\":\"bytes20\",\"name\":\"userData\"}]},{\"type\":\"tuple\",\"name\":\"localEnclaveReport\",\"components\":[{\"type\":\"bytes16\",\"name\":\"cpuSvn\"},{\"type\":\"bytes4\",\"name\":\"miscSelect\"},{\"type\":\"bytes28\",\"name\":\"reserved1\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes32\",\"name\":\"mrEnclave\"},{\"type\":\"bytes32\",\"name\":\"reserved2\"},{\"type\":\"bytes32\",\"name\":\"mrSigner\"},{\"type\":\"bytes\",\"name\":\"reserved3\"},{\"type\":\"uint16\",\"name\":\"isvProdId\"},{\"type\":\"uint16\",\"name\":\"isvSvn\"},{\"type\":\"bytes\",\"name\":\"reserved4\"},{\"type\":\"bytes\",\"name\":\"reportData\"}]},{\"type\":\"tuple\",\"name\":\"v3AuthData\",\"components\":[{\"type\":\"bytes\",\"name\":\"ecdsa256BitSignature\"},{\"type\":\"bytes\",\"name\":\"ecdsaAttestationKey\"},{\"type\":\"tuple\",\"name\":\"pckSignedQeReport\",\"components\":[{\"type\":\"bytes16\",\"name\":\"cpuSvn\"},{\"type\":\"bytes4\",\"name\":\"miscSelect\"},{\"type\":\"bytes28\",\"name\":\"reserved1\"},{\"type\":\"bytes16\",\"name\":\"attributes\"},{\"type\":\"bytes32\",\"name\":\"mrEnclave\"},{\"type\":\"bytes32\",\"name\":\"reserved2\"},{\"type\":\"bytes32\",\"name\":\"mrSigner\"},{\"type\":\"bytes\",\"name\":\"reserved3\"},{\"type\":\"uint16\",\"name\":\"isvProdId\"},{\"type\":\"uint16\",\"name\":\"isvSvn\"},{\"type\":\"bytes\",\"name\":\"reserved4\"},{\"type\":\"bytes\",\"name\":\"reportData\"}]},{\"type\":\"bytes\",\"name\":\"qeReportSignature\"},{\"type\":\"tuple\",\"name\":\"qeAuthData\",\"components\":[{\"type\":\"uint16\",\"name\":\"parsedDataSize\"},{\"type\":\"bytes\",\"name\":\"data\"}]},{\"type\":\"tuple\",\"name\":\"certification\",\"components\":[{\"type\":\"uint16\",\"name\":\"certType\"},{\"type\":\"uint32\",\"name\":\"certDataSize\"},{\"type\":\"bytes[3]\",\"name\":\"decodedCertDataArray\"}]}]}]}],\"outputs\":[{\"type\":\"uint256\"}]},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"resolve\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"bool\",\"name\":\"_allowZeroAddress\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"transferOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newOwner\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"unpause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeTo\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"verifyProof\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"tuple\",\"name\":\"_ctx\",\"components\":[{\"type\":\"bytes32\",\"name\":\"metaHash\"},{\"type\":\"bytes32\",\"name\":\"blobHash\"},{\"type\":\"address\",\"name\":\"prover\"},{\"type\":\"uint64\",\"name\":\"blockId\"},{\"type\":\"bool\",\"name\":\"isContesting\"},{\"type\":\"bool\",\"name\":\"blobUsed\"},{\"type\":\"address\",\"name\":\"msgSender\"}]},{\"type\":\"tuple\",\"name\":\"_tran\",\"components\":[{\"type\":\"bytes32\",\"name\":\"parentHash\"},{\"type\":\"bytes32\",\"name\":\"blockHash\"},{\"type\":\"bytes32\",\"name\":\"stateRoot\"},{\"type\":\"bytes32\",\"name\":\"graffiti\"}]},{\"type\":\"tuple\",\"name\":\"_proof\",\"components\":[{\"type\":\"uint16\",\"name\":\"tier\"},{\"type\":\"bytes\",\"name\":\"data\"}]}],\"outputs\":[]}]","addresses":["0xb0f3186FC1963f774f52ff455DC86aEdD0b31F81"]}],"createdAt":"2024-05-02T14:09:42.804Z","subscriberId":"d49a2a9b-268d-4d30-9553-ec55ed952d87","name":"Taiko Mainnet SGX Prover","network":"mainnet","riskCategory":"TECHNICAL","monitorId":"d49a2a9b-268d-4d30-9553-ec55ed952d87","blockWatcherId":"mainnet-1","paused":false,"stackResourceId":"mystack.taiko-mainnet-sgx-prover","type":"BLOCK"},{"skipABIValidation":false,"alertThreshold":null,"notifyConfig":{"severityLevel":"HIGH","messageBody":"**Defender Monitor {{ sentinel.name }} Triggered**\n\n**Network**\n\n{{ sentinel.network }}\n\n**Block Hash**\n\n{{ blockHash }}\n\n**Transaction Hash**\n\n{{ transaction.transactionHash }}\n\n**Explorer Link**\n\n{{ transaction.link }}\n\n{{ matchReasonsFormatted }}","messageSubject":"Defender Monitor: Taiko Mainnet Address Managers triggered","notifications":[{"type":"discord","sendCount":0,"notificationId":"93e8dbf2-4f87-4793-b3c3-6ff0dd6cf827"}],"timeoutMs":0},"tenantId":"0691b59e-8b53-4ae2-b874-959de8a9f2ee","addressRules":[{"conditions":[{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"AddressSet(uint64,bytes32,address,address)","expression":null}]}],"abi":"[{\"type\":\"event\",\"anonymous\":false,\"name\":\"AddressSet\",\"inputs\":[{\"type\":\"uint64\",\"name\":\"chainId\",\"indexed\":true},{\"type\":\"bytes32\",\"name\":\"name\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newAddress\",\"indexed\":false},{\"type\":\"address\",\"name\":\"oldAddress\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"AdminChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousAdmin\",\"indexed\":false},{\"type\":\"address\",\"name\":\"newAdmin\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BeaconUpgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"beacon\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Initialized\",\"inputs\":[{\"type\":\"uint8\",\"name\":\"version\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferred\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Paused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Unpaused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Upgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"implementation\",\"indexed\":true}]},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"addressManager\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"getAddress\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"init\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"_owner\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"owner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"pause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"paused\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"pendingOwner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"resolve\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"bool\",\"name\":\"_allowZeroAddress\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"setAddress\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"address\",\"name\":\"_newAddress\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"transferOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newOwner\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"unpause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeTo\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]}]","addresses":["0xEf9EaA1dd30a9AA1df01c36411b5F082aA65fBaa","0x579f40D0BE111b823962043702cabe6Aaa290780"]}],"createdAt":"2024-05-02T14:00:18.874Z","subscriberId":"3919cb83-487f-4432-88fa-33bbe4361fce","name":"Taiko Mainnet Address Managers","network":"mainnet","riskCategory":"ACCESS-CONTROL","monitorId":"3919cb83-487f-4432-88fa-33bbe4361fce","blockWatcherId":"mainnet-1","paused":false,"stackResourceId":"mystack.taiko-mainnet-address-managers","type":"BLOCK"},{"skipABIValidation":false,"alertThreshold":null,"notifyConfig":{"severityLevel":"HIGH","messageBody":"**Defender Monitor {{ sentinel.name }} Triggered**\n\n**Network**\n\n{{ sentinel.network }}\n\n**Block Hash**\n\n{{ blockHash }}\n\n**Transaction Hash**\n\n{{ transaction.transactionHash }}\n\n**Explorer Link**\n\n{{ transaction.link }}\n\n{{ matchReasonsFormatted }}","messageSubject":"Defender Monitor: Taiko Mainnet Essential Contracts triggered","notifications":[{"type":"discord","sendCount":0,"notificationId":"93e8dbf2-4f87-4793-b3c3-6ff0dd6cf827"}],"timeoutMs":0},"tenantId":"0691b59e-8b53-4ae2-b874-959de8a9f2ee","addressRules":[{"conditions":[{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"AdminChanged(address,address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"BeaconUpgraded(address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"Initialized(uint8)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"OwnershipTransferStarted(address,address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"OwnershipTransferred(address,address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"Paused(address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"Unpaused(address)","expression":null}]},{"txConditions":[],"functionConditions":[],"eventConditions":[{"eventSignature":"Upgraded(address)","expression":null}]}],"abi":"[{\"type\":\"event\",\"anonymous\":false,\"name\":\"AdminChanged\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousAdmin\",\"indexed\":false},{\"type\":\"address\",\"name\":\"newAdmin\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"BeaconUpgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"beacon\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Initialized\",\"inputs\":[{\"type\":\"uint8\",\"name\":\"version\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"OwnershipTransferred\",\"inputs\":[{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true},{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Paused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Unpaused\",\"inputs\":[{\"type\":\"address\",\"name\":\"account\",\"indexed\":false}]},{\"type\":\"event\",\"anonymous\":false,\"name\":\"Upgraded\",\"inputs\":[{\"type\":\"address\",\"name\":\"implementation\",\"indexed\":true}]},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"addressManager\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"uint64\"}]},{\"type\":\"function\",\"name\":\"owner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"pause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"paused\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bool\"}]},{\"type\":\"function\",\"name\":\"pendingOwner\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[],\"outputs\":[{\"type\":\"bytes32\"}]},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"resolve\",\"constant\":true,\"stateMutability\":\"view\",\"payable\":false,\"inputs\":[{\"type\":\"uint64\",\"name\":\"_chainId\"},{\"type\":\"bytes32\",\"name\":\"_name\"},{\"type\":\"bool\",\"name\":\"_allowZeroAddress\"}],\"outputs\":[{\"type\":\"address\"}]},{\"type\":\"function\",\"name\":\"transferOwnership\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newOwner\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"unpause\",\"constant\":false,\"payable\":false,\"inputs\":[],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeTo\",\"constant\":false,\"payable\":false,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"}],\"outputs\":[]},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"constant\":false,\"stateMutability\":\"payable\",\"payable\":true,\"inputs\":[{\"type\":\"address\",\"name\":\"newImplementation\"},{\"type\":\"bytes\",\"name\":\"data\"}],\"outputs\":[]}]","addresses":["0xEf9EaA1dd30a9AA1df01c36411b5F082aA65fBaa","0x10dea67478c5F8C5E2D90e5E9B26dBe60c54d800","0x9e0a24964e5397B566c1ed39258e21aB5E35C77C","0xd60247c6848B7Ca29eDdF63AA924E53dB6Ddd8EC","0x996282cA11E5DEb6B5D122CC3B9A1FcAAD4415Ab","0x0b470dd3A0e1C41228856Fb319649E7c08f419Aa","0x0b470dd3A0e1C41228856Fb319649E7c08f419Aa","0xaf145913EA4a56BE22E120ED9C24589659881702","0x579f40D0BE111b823962043702cabe6Aaa290780","0x06a9Ab27c7e2255df1815E6CC0168d7755Feb19a","0x537a2f0D3a5879b41BCb5A2afE2EA5c4961796F6","0x33879cDF01121dc7bCe011b461e64d791aE931F2","0xb0f3186FC1963f774f52ff455DC86aEdD0b31F81","0x579A8d63a2Db646284CBFE31FE5082c9989E985c","0xE3D777143Ea25A6E031d1e921F396750885f43aC","0x8d7C954960a36a7596d7eA4945dDf891967ca8A3"]}],"createdAt":"2024-05-02T13:49:54.192Z","subscriberId":"67a53521-3d4a-4de4-92ab-ede82cc45644","name":"Taiko Mainnet Essential Contracts","network":"mainnet","riskCategory":"ACCESS-CONTROL","monitorId":"67a53521-3d4a-4de4-92ab-ede82cc45644","blockWatcherId":"mainnet-1","paused":false,"stackResourceId":"mystack.taiko-mainnet-essential-contracts","type":"BLOCK"}]},"actions":{"removed":[],"created":[],"updated":[]},"contracts":{"removed":[],"created":[],"updated":[]},"relayers":{"removed":[],"created":[],"updated":[],"relayerKeys":{"removed":[],"created":[],"updated":[]}},"notifications":{"removed":[],"created":[],"updated":[]},"secrets":{"removed":[],"created":[],"updated":[]},"blockExplorerApiKeys":{"removed":[],"created":[],"updated":[]},"forkedNetworks":{"removed":[],"created":[],"updated":[]},"privateNetworks":{"removed":[],"created":[],"updated":[]}} diff --git a/packages/monitors/defender/mainnet/.env.example b/packages/monitors/defender/mainnet/.env.example new file mode 100644 index 00000000000..dc8a45401c3 --- /dev/null +++ b/packages/monitors/defender/mainnet/.env.example @@ -0,0 +1,2 @@ +DEFENDER_API_SECRET= +DEFENDER_API_KEY= diff --git a/packages/monitors/defender/mainnet/README.md b/packages/monitors/defender/mainnet/README.md new file mode 100644 index 00000000000..b0c8dcde464 --- /dev/null +++ b/packages/monitors/defender/mainnet/README.md @@ -0,0 +1,236 @@ +# Defender as Code Serverless Plugin + +Defender as Code (DaC) is a Serverless Framework plugin for automated resource management and configuration as code. + +:warning: This plugin is under development and behavior might change. Handle with care. + +## Prerequisites + +Serverless Framework: https://www.serverless.com/framework/docs/getting-started/ + +## Installation + +You can initialise your Serverless project directly using our pre-configured template: + +``` +sls install --url https://github.com/OpenZeppelin/defender-as-code/tree/main/template -n my-service +``` + +Note: for the command above to work correctly you need access to this repo. + +Alternatively, you can install it directly into an existing project with: + +`yarn add @openzeppelin/defender-as-code` + +## Setup + +There are a few ways you can set up the `serverless.yml` configuration: + +- Create it from scratch; +- Use Defender's 2.0 Serverless export capability; +- Leverage the example [template](https://github.com/OpenZeppelin/defender-as-code/blob/main/template/serverless.yml) provided in the `defender-as-code` repository. + +If you already have resources such as contracts, notifications, relayers, actions, etc. in Defender 2.0, you can export a `serverless.yml` configuration file containing these resources from the manage → advanced page. + +NOTE: If you have previously deployed with `defender-as-code` to the same account and subsequently created new resources through the Defender 2.0 user interface, the export function will automatically assign a `stackResourceId` to the new resources based on the name of your latest deployment stack. If you have not deployed using `defender-as-code` before, a default stack name of `mystack` will be used. + +This plugin allows you to define Actions, Monitors, Notifications, Categories, Relayers, Contracts, Policies and Secrets declaratively from a `serverless.yml` and provision them via the CLI using `serverless deploy`. An example template below with an action, a relayer, a policy and a single relayer API key defined: + +```yaml +service: defender-serverless-template +configValidationMode: error +frameworkVersion: "3" + +provider: + name: defender + stage: ${opt:stage, 'dev'} + stackName: "mystack" + ssot: false + +defender: + key: "${env:TEAM_API_KEY}" + secret: "${env:TEAM_API_SECRET}" + +resources: + actions: + action-example-1: + name: "Hello world from serverless" + path: "./actions/hello-world" + relayer: ${self:resources.relayers.relayer-1} + trigger: + type: "schedule" + frequency: 1500 + paused: false + # optional - unencrypted and scoped to the individual action + environment-variables: + hello: "world!" + action-example-2: 2cbc3f58-d962-4be8-a158-1035be4b661c + + policies: + policy-1: + gas-price-cap: 1000 + whitelist-receivers: + - "0x0f06aB75c7DD497981b75CD82F6566e3a5CAd8f2" + eip1559-pricing: true + + relayers: + relayer-1: + name: "Test Relayer 1" + network: "sepolia" + min-balance: 1000 + policy: ${self:resources.policies.policy-1} + api-keys: + - key1 + +plugins: + - "@openzeppelin/defender-as-code" +``` + +This requires setting the `key` and `secret` under the `defender` property of the YAML file. We recommend using environment variables or a secure (gitignored) configuration file to retrieve these values. Modify the `serverless.yml` accordingly. + +Ensure the Defender Team API Keys are setup with all appropriate API capabilities. + +The `stackName` (e.g. mystack) is combined with the resource key (e.g. relayer-1) to uniquely identify each resource. This identifier is called the `stackResourceId` (e.g. mystack.relayer-1) and allows you to manage multiple deployments within the same Defender team. + +You may also reference existing Defender resources directly by their unique ID (e.g. `2cbc3f58-d962-4be8-a158-1035be4b661c`). These resources will not be managed by the plugin and will be ignored during the deploy process. However, you may reference them in other resources to update their configuration accordingly. + +A list of properties that support direct referencing: + +- `relayer` may reference a `relayerId` in Actions +- `action-trigger` may reference an `actionid` in Monitor +- `action-condition` may reference an `actionId` in Monitor +- `address-from-relayer` may reference a `relayerId` in Relayer +- `notify-config.channels` may reference multiple `notificationId` in Monitor +- `contracts` may be used over `addresses` and reference multiple `contractId` in Monitor + +The following is an example of how a direct reference to a Defender contract and relayer can be used in monitor and action respectively: + +```yaml +... +contracts: + contract-1: 'sepolia-0x62034459131329bE4349A9cc322B03c63806Aa11' # contractId of an existing resource in Defender + +relayers: + relayer-2: 'bcb659c6-7e11-4d37-a15b-0fa9f3d3442c' # relayerId of an existing relayer in Defender + +actions: + action-example-1: + name: 'Hello world from serverless' + path: './actions/hello-world' + relayer: ${self:resources.relayers.relayer-2} + trigger: + type: 'schedule' + frequency: 1500 + paused: false + +monitors: + block-example: + name: 'Block Example' + type: 'BLOCK' + network: 'sepolia' + risk-category: 'TECHNICAL' + # optional - either contracts OR addresses should be defined + contracts: + - ${self:resources.contracts.contract-1} + ... +... +``` + +### SSOT mode + +Under the `provider` property in the `serverless.yml` file, you can optionally add a `ssot` boolean. SSOT or Single Source of Truth, ensures that the state of your stack in Defender is perfectly in sync with the `serverless.yml` template. +This means that all Defender resources, that are not defined in your current template file, are removed from Defender, with the exception of Relayers, upon deployment. If SSOT is not defined in the template, it will default to `false`. + +Any resource removed from the `serverless.yml` file does _not_ get automatically deleted in order to prevent inadvertent resource deletion. For this behaviour to be anticipated, SSOT mode must be enabled. + +### Block Explorer Api Keys + +Exported serverless configurations with Block Explorer Api Keys will not contain the `key` field but instead a `key-hash` field which is a keccak256 hash of the key. This must be replaced with the actual `key` field (and `key-hash` removed) before deploying + +### Secrets (Action) + +Action secrets can be defined both globally and per stack. Secrets defined under `global` are not affected by changes to the `stackName` and will retain when redeployed under a new stack. Secrets defined under `stack` will be removed (on the condition that [SSOT mode](#SSOT-mode) is enabled) when the stack is redeployed under a new `stackName`. To reference secrets defined under `stack`, use the following format: `_`, for example `mystack_test`. + +```yaml +secrets: + # optional - global secrets are not affected by stackName changes + global: + foo: ${self:custom.config.secrets.foo} + hello: ${self:custom.config.secrets.hello} + # optional - stack secrets (formatted as _) + stack: + test: ${self:custom.config.secrets.test} +``` + +### Types and Schema validation + +We provide auto-generated documentation based on the JSON schemas: + +- [Defender Property](https://github.com/OpenZeppelin/defender-as-code/blob/main/src/types/docs/defender.md) +- [Provider Property](https://github.com/OpenZeppelin/defender-as-code/blob/main/src/types/docs/provider.md) +- [Resources Property](https://github.com/OpenZeppelin/defender-as-code/blob/main/src/types/docs/resources.md) + +More information on types can be found [here](https://github.com/OpenZeppelin/defender-as-code/blob/main/src/types/index.ts). Specifically, the types preceded with `Y` (e.g. YRelayer). For the schemas, you can check out the [docs-schema](https://github.com/OpenZeppelin/defender-as-code/blob/main/src/types/docs-schemas) folder. + +Additionally, an [example project](https://github.com/OpenZeppelin/defender-as-code/blob/main/examples/defender-test-project/serverless.yml) is available which provides majority of properties that can be defined in the `serverless.yml` file. + +## Commands + +### Deploy + +You can use `sls deploy` to deploy your current stack to Defender. + +The deploy takes in an optional `--stage` flag, which is defaulted to `dev` when installed from the template above. + +Moreover, the `serverless.yml` may contain an `ssot` property. More information can be found in the [SSOT mode](#SSOT-mode) section. + +This command will append a log entry in the `.defender` folder of the current working directory. Additionally, if any new relayer keys are created, these will be stored as JSON objects in the `.defender/relayer-keys` folder. + +> When installed from the template, we ensure the `.defender` folder is ignored from any git commits. However, when installing directly, make sure to add this folder it your `.gitignore` file. + +### Info + +You can use `sls info` to retrieve information on every resource defined in the `serverless.yml` file, including unique identifiers, and properties unique to each Defender component. + +### Remove + +You can use `sls remove` to remove all Defender resources defined in the `serverless.yml` file. + +> To avoid potential loss of funds, Relayers can only be deleted from the Defender UI directly. + +### Logs + +You can use `sls logs --function ` to retrieve the latest action logs for a given action identifier (e.g. mystack.action-example-1). This command will run continuously and retrieve logs every 2 seconds. + +### Invoke + +You can use `sls invoke --function ` to manually run an action, given its identifier (e.g. mystack.action-example-1). + +> Each command has a standard output to a JSON object. + +More information can be found on our documentation page [here](https://docs.openzeppelin.com/defender/dac) + +## Caveats + +Errors thrown during the `deploy` process, will not revert any prior changes. Common errors are: + +- Not having set the API key and secret +- Insufficient permissions for the API key +- Validation error of the `serverless.yml` file (see [Types and Schema validation](#Types-and-Schema-validation)) + +Usually, fixing the error and retrying the deploy should suffice as any existing resources will fall within the `update` clause of the deployment. However, if unsure, you can always call `sls remove` to remove the entire stack, and retry. + +Action secrets are encrypted key-value pairs and injected at runtime into the lambda environment. Secrets are scoped to all actions automatically. Alternatively, you may use environment-variables to define key-value pairs that are scoped to the individual action, and available at runtime through `process.env`. Note that these values are not encrypted. + +## Publish a new release + +```bash +npm login +git checkout main +git pull origin main +# increment version in package.json +npm publish +git add package.json +git commit -m 'v{version here}' +git push origin main +``` diff --git a/packages/monitors/defender/mainnet/actions/Bridge-MessageProcessed/index.js b/packages/monitors/defender/mainnet/actions/Bridge-MessageProcessed/index.js new file mode 100644 index 00000000000..06936f591c9 --- /dev/null +++ b/packages/monitors/defender/mainnet/actions/Bridge-MessageProcessed/index.js @@ -0,0 +1,312 @@ +const { Defender } = require("@openzeppelin/defender-sdk"); +const ethers = require("ethers"); + +const bridgeAbi = [ + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "bytes32", + name: "msgHash", + type: "bytes32", + }, + { + components: [ + { + internalType: "uint64", + name: "id", + type: "uint64", + }, + { + internalType: "uint64", + name: "fee", + type: "uint64", + }, + { + internalType: "uint32", + name: "gasLimit", + type: "uint32", + }, + { + internalType: "address", + name: "from", + type: "address", + }, + { + internalType: "uint64", + name: "srcChainId", + type: "uint64", + }, + { + internalType: "address", + name: "srcOwner", + type: "address", + }, + { + internalType: "uint64", + name: "destChainId", + type: "uint64", + }, + { + internalType: "address", + name: "destOwner", + type: "address", + }, + { + internalType: "address", + name: "to", + type: "address", + }, + { + internalType: "uint256", + name: "value", + type: "uint256", + }, + { + internalType: "bytes", + name: "data", + type: "bytes", + }, + ], + indexed: false, + internalType: "struct IBridge.Message", + name: "message", + type: "tuple", + }, + { + components: [ + { + internalType: "uint32", + name: "gasUsedInFeeCalc", + type: "uint32", + }, + { + internalType: "uint32", + name: "proofSize", + type: "uint32", + }, + { + internalType: "uint32", + name: "numCacheOps", + type: "uint32", + }, + ], + indexed: false, + internalType: "struct Bridge.ProcessingStats", + name: "stats", + type: "tuple", + }, + ], + name: "MessageProcessed", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "bytes32", + name: "msgHash", + type: "bytes32", + }, + { + components: [ + { + internalType: "uint64", + name: "id", + type: "uint64", + }, + { + internalType: "uint64", + name: "fee", + type: "uint64", + }, + { + internalType: "uint32", + name: "gasLimit", + type: "uint32", + }, + { + internalType: "address", + name: "from", + type: "address", + }, + { + internalType: "uint64", + name: "srcChainId", + type: "uint64", + }, + { + internalType: "address", + name: "srcOwner", + type: "address", + }, + { + internalType: "uint64", + name: "destChainId", + type: "uint64", + }, + { + internalType: "address", + name: "destOwner", + type: "address", + }, + { + internalType: "address", + name: "to", + type: "address", + }, + { + internalType: "uint256", + name: "value", + type: "uint256", + }, + { + internalType: "bytes", + name: "data", + type: "bytes", + }, + ], + indexed: false, + internalType: "struct IBridge.Message", + name: "message", + type: "tuple", + }, + ], + name: "MessageSent", + type: "event", + }, +]; + +async function getLogsByTopic(notificationClient, l1provider, l2provider) { + const [ + processedMessagesL1, + processedMessagesL2, + sentMessagesL1, + sentMessagesL2, + ] = await Promise.all([ + fetchLogs( + "MessageProcessed", + 1000, + "0xd60247c6848B7Ca29eDdF63AA924E53dB6Ddd8EC", + bridgeAbi, + l1provider, + ), + fetchLogs( + "MessageProcessed", + 1000, + "0x1670000000000000000000000000000000000001", + bridgeAbi, + l2provider, + ), + fetchLogs( + "MessageSent", + 1000, + "0xd60247c6848B7Ca29eDdF63AA924E53dB6Ddd8EC", + bridgeAbi, + l1provider, + ), + fetchLogs( + "MessageSent", + 1000, + "0x1670000000000000000000000000000000000001", + bridgeAbi, + l2provider, + ), + ]); + + const unmatchedL1 = findUnmatchedMessages( + processedMessagesL1, + sentMessagesL2, + ); + const unmatchedL2 = findUnmatchedMessages( + processedMessagesL2, + sentMessagesL1, + ); + + if (unmatchedL1.length > 0 || unmatchedL2.length > 0) { + const missingCount = unmatchedL1.length + unmatchedL2.length; + alertOrg(notificationClient, missingCount); + } else { + console.log("All messages are matched."); + } +} + +async function fetchLogs(eventName, limit, address, abi, provider) { + const currentBlock = await provider.getBlock("latest"); + const fromBlock = currentBlock.number - limit; + + const iface = new ethers.utils.Interface(abi); + const eventTopic = iface.getEventTopic(eventName); + + try { + const logs = await provider.getLogs({ + address, + fromBlock, + toBlock: currentBlock.number, + topics: [eventTopic], + }); + + return logs.map( + (log) => iface.decodeEventLog(eventName, log.data, log.topics).msgHash, + ); + } catch (error) { + console.error(`Error fetching ${eventName} logs:`, error); + return []; + } +} + +function findUnmatchedMessages(processedMessages, sentMessages) { + return processedMessages.filter((msgHash) => !sentMessages.includes(msgHash)); +} + +function alertOrg(notificationClient, missingCount) { + const outputMessage = `@cyberhorsey @soylent_ @xiaodino007 Bridge Health Alert! \nThere are ${missingCount} missing MessageSent events for the processed messages on the other chain.`; + + notificationClient.send({ + channelAlias: "discord_bridging", + subject: "🚨 Bridge: MessageProcessed", + message: outputMessage, + }); +} + +function createProvider(apiKey, apiSecret, relayerApiKey, relayerApiSecret) { + const client = new Defender({ + apiKey, + apiSecret, + relayerApiKey, + relayerApiSecret, + }); + + return client.relaySigner.getProvider(); +} + +exports.handler = async function (event, context) { + const { notificationClient } = context; + const { + apiKey, + apiSecret, + taikoL1ApiKey, + taikoL1ApiSecret, + taikoL2ApiKey, + taikoL2ApiSecret, + } = event.secrets; + + const l1Provider = createProvider( + apiKey, + apiSecret, + taikoL1ApiKey, + taikoL1ApiSecret, + ); + const l2Provider = createProvider( + apiKey, + apiSecret, + taikoL2ApiKey, + taikoL2ApiSecret, + ); + + await getLogsByTopic(notificationClient, l1Provider, l2Provider); + + return true; +}; diff --git a/packages/monitors/defender/mainnet/actions/ER20Vault-BridgedTokenChanged/index.js b/packages/monitors/defender/mainnet/actions/ER20Vault-BridgedTokenChanged/index.js new file mode 100644 index 00000000000..ba04f4bcfb2 --- /dev/null +++ b/packages/monitors/defender/mainnet/actions/ER20Vault-BridgedTokenChanged/index.js @@ -0,0 +1,210 @@ +const { ethers } = require("ethers"); +const { Defender } = require("@openzeppelin/defender-sdk"); + +const ABI = [ + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "uint256", + name: "srcChainId", + type: "uint256", + }, + { + indexed: true, + internalType: "address", + name: "ctoken", + type: "address", + }, + { + indexed: false, + internalType: "address", + name: "btokenOld", + type: "address", + }, + { + indexed: false, + internalType: "address", + name: "btokenNew", + type: "address", + }, + { + indexed: false, + internalType: "string", + name: "ctokenSymbol", + type: "string", + }, + { + indexed: false, + internalType: "string", + name: "ctokenName", + type: "string", + }, + { + indexed: false, + internalType: "uint8", + name: "ctokenDecimal", + type: "uint8", + }, + ], + name: "BridgedTokenChanged", + type: "event", + }, +]; + +function alertOrg(notificationClient, message) { + notificationClient.send({ + channelAlias: "discord_bridging", + subject: "⚠️ ER20Vault: BridgedTokenChanged Alert", + message, + }); +} + +async function getLatestBlockNumber(provider) { + const currentBlock = await provider.getBlock("latest"); + return currentBlock.number; +} + +async function fetchLogs( + eventName, + fromBlock, + toBlock, + address, + abi, + provider, + networkName, +) { + const iface = new ethers.utils.Interface(abi); + const eventTopic = iface.getEventTopic(eventName); + + try { + const logs = await provider.getLogs({ + address, + fromBlock, + toBlock, + topics: [eventTopic], + }); + + return logs.map((log) => { + const parsedLog = iface.decodeEventLog(eventName, log.data, log.topics); + return { ...parsedLog, network: networkName }; + }); + } catch (error) { + console.error( + `Error fetching logs for ${eventName} on ${networkName}:`, + error, + ); + return []; + } +} + +function createProvider(apiKey, apiSecret, relayerApiKey, relayerApiSecret) { + const client = new Defender({ + apiKey, + apiSecret, + relayerApiKey, + relayerApiSecret, + }); + + return client.relaySigner.getProvider(); +} + +async function calculateBlockTime(provider) { + const latestBlock = await provider.getBlock("latest"); + const previousBlock = await provider.getBlock(latestBlock.number - 100); + + const timeDiff = latestBlock.timestamp - previousBlock.timestamp; + const blockDiff = latestBlock.number - previousBlock.number; + + const blockTime = timeDiff / blockDiff; + return blockTime; +} + +function calculateBlockRange( + currentBlockNumber, + blockTimeInSeconds, + minutes = 5, +) { + const blocksInGivenMinutes = Math.floor((minutes * 60) / blockTimeInSeconds); + const fromBlock = currentBlockNumber - blocksInGivenMinutes; + const toBlock = currentBlockNumber; + + return { fromBlock, toBlock }; +} + +exports.handler = async function (event, context) { + const { notificationClient } = context; + const { + apiKey, + apiSecret, + taikoL1ApiKey, + taikoL1ApiSecret, + taikoL2ApiKey, + taikoL2ApiSecret, + } = event.secrets; + + const taikoL1Provider = createProvider( + apiKey, + apiSecret, + taikoL1ApiKey, + taikoL1ApiSecret, + ); + const taikoL2Provider = createProvider( + apiKey, + apiSecret, + taikoL2ApiKey, + taikoL2ApiSecret, + ); + + const currentBlockNumberL1 = await getLatestBlockNumber(taikoL1Provider); + const currentBlockNumberL2 = await getLatestBlockNumber(taikoL2Provider); + + const blockTimeInSecondsL1 = await calculateBlockTime(taikoL1Provider); + const blockTimeInSecondsL2 = await calculateBlockTime(taikoL2Provider); + + const { fromBlock: fromBlockL1, toBlock: toBlockL1 } = calculateBlockRange( + currentBlockNumberL1, + blockTimeInSecondsL1, + ); + const { fromBlock: fromBlockL2, toBlock: toBlockL2 } = calculateBlockRange( + currentBlockNumberL2, + blockTimeInSecondsL2, + ); + + const logsL1 = await fetchLogs( + "BridgedTokenChanged", + fromBlockL1, + toBlockL1, + "0x996282cA11E5DEb6B5D122CC3B9A1FcAAD4415Ab", + ABI, + taikoL1Provider, + "L1", + ); + const logsL2 = await fetchLogs( + "BridgedTokenChanged", + fromBlockL2, + toBlockL2, + "0x1670000000000000000000000000000000000002", + ABI, + taikoL2Provider, + "L2", + ); + + const logs = [...logsL1, ...logsL2]; + + if (logs.length > 0) { + const logDetails = logs + .map( + (log) => + `Network: ${log.network}, Token: ${log.ctoken}, Old Token: ${log.btokenOld}, New Token: ${log.btokenNew}`, + ) + .join("\n"); + alertOrg( + notificationClient, + `BridgedTokenChanged event detected!\nDetails:\n${logDetails}`, + ); + } + + return true; +}; diff --git a/packages/monitors/defender/mainnet/actions/ERC20Vault-BalanceDrop/index.js b/packages/monitors/defender/mainnet/actions/ERC20Vault-BalanceDrop/index.js new file mode 100644 index 00000000000..dd6920e4c23 --- /dev/null +++ b/packages/monitors/defender/mainnet/actions/ERC20Vault-BalanceDrop/index.js @@ -0,0 +1,210 @@ +const { ethers } = require("ethers"); +const { Defender } = require("@openzeppelin/defender-sdk"); + +const ERC20_ABI = [ + { + constant: true, + inputs: [{ name: "_owner", type: "address" }], + name: "balanceOf", + outputs: [{ name: "balance", type: "uint256" }], + payable: false, + stateMutability: "view", + type: "function", + }, +]; + +async function getERC20Balance(provider, tokenAddress, vaultAddress) { + const contract = new ethers.Contract(tokenAddress, ERC20_ABI, provider); + return await contract.balanceOf(vaultAddress); +} + +async function getNativeTokenBalance(provider, vaultAddress) { + return await provider.getBalance(vaultAddress); +} + +async function monitorTokenBalance( + provider, + tokenAddress, + vaultAddress, + previousBalanceKey, + notificationClient, + secrets, + client, + tokenName, + networkName, +) { + console.log(`Monitoring ${tokenName} balance on ${networkName}`); + const previousBalance = ethers.BigNumber.from( + secrets[previousBalanceKey] || "0", + ); + console.log( + `Previous ${tokenName} Balance: ${ethers.utils.formatUnits( + previousBalance, + 18, + )}`, + ); + + let currentBalance; + if (tokenName === "ETH") { + currentBalance = await getNativeTokenBalance(provider, vaultAddress); + } else { + currentBalance = await getERC20Balance( + provider, + tokenAddress, + vaultAddress, + ); + } + console.log( + `Current ${tokenName} Balance: ${ethers.utils.formatUnits( + currentBalance, + 18, + )}`, + ); + + if (!previousBalance.isZero()) { + const dropPercentage = previousBalance + .sub(currentBalance) + .mul(100) + .div(previousBalance) + .toNumber(); + console.log( + `Calculated drop percentage for ${tokenName}: ${dropPercentage}%`, + ); + + if (dropPercentage >= 5) { + const message = `Alert: ${tokenName} balance has dropped by ${dropPercentage}% on ${networkName}.\nPrevious Balance: ${ethers.utils.formatUnits( + previousBalance, + 18, + )}\nCurrent Balance: ${ethers.utils.formatUnits(currentBalance, 18)}`; + alertOrg( + notificationClient, + `⚠️ ${networkName}: ${tokenName} Balance Drop Alert`, + message, + ); + } else { + console.log( + `No significant ${tokenName} balance drop detected on ${networkName}`, + ); + } + } else { + console.log( + `No previous ${tokenName} balance to compare on ${networkName}`, + ); + } + + await storePreviousBalance(client, previousBalanceKey, currentBalance); +} + +function alertOrg(notificationClient, subject, message) { + notificationClient.send({ + channelAlias: "discord_bridging", + subject, + message, + }); +} + +async function storePreviousBalance(client, key, newBalance) { + console.log( + `Storing previous balance under key: ${key}, value: ${newBalance.toString()}`, + ); + const body = { + deletes: [], + secrets: { + [key]: newBalance.toString(), + }, + }; + await client.action.createSecrets(body); +} + +function createProvider(apiKey, apiSecret, relayerApiKey, relayerApiSecret) { + console.log(`Creating provider with API keys`); + const client = new Defender({ + apiKey, + apiSecret, + relayerApiKey, + relayerApiSecret, + }); + + return client.relaySigner.getProvider(); +} + +exports.handler = async function (event, context) { + const { notificationClient } = context; + const { apiKey, apiSecret, taikoL1ApiKey, taikoL1ApiSecret } = event.secrets; + + console.log(`Starting balance monitoring for L1`); + + const l1Provider = createProvider( + apiKey, + apiSecret, + taikoL1ApiKey, + taikoL1ApiSecret, + ); + + const l1VaultAddress = "0x996282cA11E5DEb6B5D122CC3B9A1FcAAD4415Ab"; + + const l1TokenAddresses = { + ETH: null, + TAIKO: ethers.utils.getAddress( + "0x10dea67478c5F8C5E2D90e5E9B26dBe60c54d800", + ), + USDC: ethers.utils.getAddress("0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"), + USDT: ethers.utils.getAddress("0xdAC17F958D2ee523a2206206994597C13D831ec7"), + }; + + const client = new Defender({ + apiKey, + apiSecret, + taikoL1ApiKey, + taikoL1ApiSecret, + }); + + await monitorTokenBalance( + l1Provider, + l1TokenAddresses.ETH, + l1VaultAddress, + "previousBalance_L1_ETH", + notificationClient, + event.secrets, + client, + "ETH", + "L1", + ); + await monitorTokenBalance( + l1Provider, + l1TokenAddresses.TAIKO, + l1VaultAddress, + "previousBalance_L1_TAIKO", + notificationClient, + event.secrets, + client, + "TAIKO", + "L1", + ); + await monitorTokenBalance( + l1Provider, + l1TokenAddresses.USDC, + l1VaultAddress, + "previousBalance_L1_USDC", + notificationClient, + event.secrets, + client, + "USDC", + "L1", + ); + await monitorTokenBalance( + l1Provider, + l1TokenAddresses.USDT, + l1VaultAddress, + "previousBalance_L1_USDT", + notificationClient, + event.secrets, + client, + "USDT", + "L1", + ); + + console.log(`Balance monitoring completed`); + + return true; +}; diff --git a/packages/monitors/defender/mainnet/actions/GuardianProver-ApprovedCount/index.js b/packages/monitors/defender/mainnet/actions/GuardianProver-ApprovedCount/index.js new file mode 100644 index 00000000000..ae37c7da0ef --- /dev/null +++ b/packages/monitors/defender/mainnet/actions/GuardianProver-ApprovedCount/index.js @@ -0,0 +1,140 @@ +const { ethers } = require("ethers"); +const { Defender } = require("@openzeppelin/defender-sdk"); + +const ABI = [ + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "uint256", + name: "operationId", + type: "uint256", + }, + { + indexed: false, + internalType: "uint256", + name: "approvalBits", + type: "uint256", + }, + { + indexed: false, + internalType: "bool", + name: "minGuardiansReached", + type: "bool", + }, + ], + name: "Approved", + type: "event", + }, +]; + +function alertOrg(notificationClient, message) { + notificationClient.send({ + channelAlias: "discord_bridging", + subject: "⚠️ GuardianProver: Approved Count", + message, + }); +} + +async function getLatestBlockNumber(provider) { + const currentBlock = await provider.getBlock("latest"); + return currentBlock.number; +} + +async function calculateBlockTime(provider) { + const latestBlock = await provider.getBlock("latest"); + const previousBlock = await provider.getBlock(latestBlock.number - 100); + + const timeDiff = latestBlock.timestamp - previousBlock.timestamp; + const blockDiff = latestBlock.number - previousBlock.number; + + const blockTime = timeDiff / blockDiff; + return blockTime; +} + +async function calculateBlockRange(provider) { + const currentBlockNumber = await getLatestBlockNumber(provider); + const blockTimeInSeconds = await calculateBlockTime(provider); + const blocksInOneHour = Math.floor((15 * 60) / blockTimeInSeconds); + + const fromBlock = currentBlockNumber - blocksInOneHour; + const toBlock = currentBlockNumber; + + console.log(`Calculated block range: from ${fromBlock} to ${toBlock}`); + + return { fromBlock, toBlock }; +} + +async function fetchLogsFromL1( + eventName, + fromBlock, + toBlock, + address, + abi, + provider, +) { + const iface = new ethers.utils.Interface(abi); + const eventTopic = iface.getEventTopic(eventName); + console.log(`eventTopic: ${eventTopic}`); + try { + const logs = await provider.getLogs({ + address, + fromBlock, + toBlock, + topics: [eventTopic], + }); + console.log(`Fetched logs: ${logs.length}`); + return logs.map((log) => { + const parsedLog = iface.parseLog(log); + console.log(`Parsed log: ${JSON.stringify(parsedLog)}`); + return parsedLog; + }); + } catch (error) { + console.error("Error fetching L1 logs:", error); + return []; + } +} + +function createProvider(apiKey, apiSecret, relayerApiKey, relayerApiSecret) { + const client = new Defender({ + apiKey, + apiSecret, + relayerApiKey, + relayerApiSecret, + }); + + return client.relaySigner.getProvider(); +} + +exports.handler = async function (event, context) { + const { notificationClient } = context; + const { apiKey, apiSecret, taikoL1ApiKey, taikoL1ApiSecret } = event.secrets; + + const taikoL1Provider = createProvider( + apiKey, + apiSecret, + taikoL1ApiKey, + taikoL1ApiSecret, + ); + + const { fromBlock, toBlock } = await calculateBlockRange(taikoL1Provider); + + const logs = await fetchLogsFromL1( + "Approved", + fromBlock, + toBlock, + "0xE3D777143Ea25A6E031d1e921F396750885f43aC", + ABI, + taikoL1Provider, + ); + + if (logs.length > 0) { + alertOrg( + notificationClient, + `@taiko|guardians Detected ${logs.length} Approved events in the last 15 mins on Guardian!`, + ); + } + + return true; +}; diff --git a/packages/monitors/defender/mainnet/actions/GuardianProver-ConflictingProofs/index.js b/packages/monitors/defender/mainnet/actions/GuardianProver-ConflictingProofs/index.js new file mode 100644 index 00000000000..bf9e9e00c8d --- /dev/null +++ b/packages/monitors/defender/mainnet/actions/GuardianProver-ConflictingProofs/index.js @@ -0,0 +1,150 @@ +const { ethers } = require("ethers"); +const { Defender } = require("@openzeppelin/defender-sdk"); + +const ABI = [ + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "uint256", + name: "blockId", + type: "uint256", + }, + { + indexed: true, + internalType: "address", + name: "guardian", + type: "address", + }, + { + indexed: false, + internalType: "bytes32", + name: "currentProofHash", + type: "bytes32", + }, + { + indexed: false, + internalType: "bytes32", + name: "newProofHash", + type: "bytes32", + }, + { + indexed: false, + internalType: "bool", + name: "provingPaused", + type: "bool", + }, + ], + name: "ConflictingProofs", + type: "event", + }, +]; + +function alertOrg(notificationClient, message) { + notificationClient.send({ + channelAlias: "discord_bridging", + subject: "🚨 GuardianProver: ConflictingProofs Alert", + message, + }); + + notificationClient.send({ + channelAlias: "tg_taiko_guardians", + subject: "🚨 GuardianProver: ConflictingProofs Alert", + message, + }); +} + +async function getLatestBlockNumber(provider) { + const currentBlock = await provider.getBlock("latest"); + return currentBlock.number; +} + +async function fetchLogsFromL1( + eventName, + fromBlock, + toBlock, + address, + abi, + provider, +) { + const iface = new ethers.utils.Interface(abi); + const eventTopic = iface.getEventTopic(eventName); + + try { + const logs = await provider.getLogs({ + address, + fromBlock, + toBlock, + topics: [eventTopic], + }); + + return logs.map((log) => + iface.decodeEventLog(eventName, log.data, log.topics), + ); + } catch (error) { + console.error(`Error fetching logs for ${eventName}:`, error); + return []; + } +} + +function createProvider(apiKey, apiSecret, relayerApiKey, relayerApiSecret) { + const client = new Defender({ + apiKey, + apiSecret, + relayerApiKey, + relayerApiSecret, + }); + + return client.relaySigner.getProvider(); +} + +async function calculateBlockTime(provider) { + const latestBlock = await provider.getBlock("latest"); + const previousBlock = await provider.getBlock(latestBlock.number - 100); + + const timeDiff = latestBlock.timestamp - previousBlock.timestamp; + const blockDiff = latestBlock.number - previousBlock.number; + + const blockTime = timeDiff / blockDiff; + return blockTime; +} + +exports.handler = async function (event, context) { + const { notificationClient } = context; + const { apiKey, apiSecret, taikoL1ApiKey, taikoL1ApiSecret } = event.secrets; + + const taikoL1Provider = createProvider( + apiKey, + apiSecret, + taikoL1ApiKey, + taikoL1ApiSecret, + ); + + const currentBlockNumber = await getLatestBlockNumber(taikoL1Provider); + const blockTimeInSeconds = await calculateBlockTime(taikoL1Provider); + const blocksInFiveMinutes = Math.floor((5 * 60) / blockTimeInSeconds); + + const fromBlock = currentBlockNumber - blocksInFiveMinutes; + const toBlock = currentBlockNumber; + + const logs = await fetchLogsFromL1( + "ConflictingProofs", + fromBlock, + toBlock, + "0xE3D777143Ea25A6E031d1e921F396750885f43aC", + ABI, + taikoL1Provider, + ); + + console.log(`Logs found: ${logs.length}`); + + if (logs.length > 0) { + alertOrg( + notificationClient, + `ConflictingProofs event detected! Details: ${JSON.stringify(logs)}`, + ); + } + + return true; +}; diff --git a/packages/monitors/defender/mainnet/actions/GuardianProver-GuardiansUpdated/index.js b/packages/monitors/defender/mainnet/actions/GuardianProver-GuardiansUpdated/index.js new file mode 100644 index 00000000000..e6250747ec3 --- /dev/null +++ b/packages/monitors/defender/mainnet/actions/GuardianProver-GuardiansUpdated/index.js @@ -0,0 +1,132 @@ +const { ethers } = require("ethers"); +const { Defender } = require("@openzeppelin/defender-sdk"); + +const ABI = [ + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "uint32", + name: "version", + type: "uint32", + }, + { + indexed: false, + internalType: "address[]", + name: "guardians", + type: "address[]", + }, + ], + name: "GuardiansUpdated", + type: "event", + }, +]; + +function alertOrg(notificationClient, message) { + notificationClient.send({ + channelAlias: "discord_bridging", + subject: "⚠️ GuardianProver: GuardiansUpdated Alert", + message, + }); + + notificationClient.send({ + channelAlias: "tg_taiko_guardians", + subject: "⚠️ GuardianProver: GuardiansUpdated Alert", + message, + }); +} + +async function getLatestBlockNumber(provider) { + const currentBlock = await provider.getBlock("latest"); + return currentBlock.number; +} + +async function fetchLogsFromL1( + eventName, + fromBlock, + toBlock, + address, + abi, + provider, +) { + const iface = new ethers.utils.Interface(abi); + const eventTopic = iface.getEventTopic(eventName); + + try { + const logs = await provider.getLogs({ + address, + fromBlock, + toBlock, + topics: [eventTopic], + }); + + return logs.map((log) => + iface.decodeEventLog(eventName, log.data, log.topics), + ); + } catch (error) { + console.error(`Error fetching logs for ${eventName}:`, error); + return []; + } +} + +function createProvider(apiKey, apiSecret, relayerApiKey, relayerApiSecret) { + const client = new Defender({ + apiKey, + apiSecret, + relayerApiKey, + relayerApiSecret, + }); + + return client.relaySigner.getProvider(); +} + +async function calculateBlockTime(provider) { + const latestBlock = await provider.getBlock("latest"); + const previousBlock = await provider.getBlock(latestBlock.number - 100); + + const timeDiff = latestBlock.timestamp - previousBlock.timestamp; + const blockDiff = latestBlock.number - previousBlock.number; + + const blockTime = timeDiff / blockDiff; + return blockTime; +} + +exports.handler = async function (event, context) { + const { notificationClient } = context; + const { apiKey, apiSecret, taikoL1ApiKey, taikoL1ApiSecret } = event.secrets; + + const taikoL1Provider = createProvider( + apiKey, + apiSecret, + taikoL1ApiKey, + taikoL1ApiSecret, + ); + + const currentBlockNumber = await getLatestBlockNumber(taikoL1Provider); + const blockTimeInSeconds = await calculateBlockTime(taikoL1Provider); + const blocksInFiveMinutes = Math.floor((5 * 60) / blockTimeInSeconds); + + const fromBlock = currentBlockNumber - blocksInFiveMinutes; + const toBlock = currentBlockNumber; + + const logs = await fetchLogsFromL1( + "GuardiansUpdated", + fromBlock, + toBlock, + "0xE3D777143Ea25A6E031d1e921F396750885f43aC", + ABI, + taikoL1Provider, + ); + + console.log(`Logs found: ${logs.length}`); + + if (logs.length > 0) { + alertOrg( + notificationClient, + `GuardiansUpdated event detected! Details: ${JSON.stringify(logs)}`, + ); + } + + return true; +}; diff --git a/packages/monitors/defender/mainnet/actions/GuardianProver-ProvingAutoPauseEnabled/index.js b/packages/monitors/defender/mainnet/actions/GuardianProver-ProvingAutoPauseEnabled/index.js new file mode 100644 index 00000000000..80acbd46f5a --- /dev/null +++ b/packages/monitors/defender/mainnet/actions/GuardianProver-ProvingAutoPauseEnabled/index.js @@ -0,0 +1,127 @@ +const { ethers } = require("ethers"); +const { Defender } = require("@openzeppelin/defender-sdk"); + +const ABI = [ + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "bool", + name: "enabled", + type: "bool", + }, + ], + name: "ProvingAutoPauseEnabled", + type: "event", + }, +]; + +function alertOrg(notificationClient, message) { + notificationClient.send({ + channelAlias: "discord_bridging", + subject: "⚠️ GuardianProver: ProvingAutoPauseEnabled Alert", + message, + }); + notificationClient.send({ + channelAlias: "tg_taiko_guardians", + subject: "⚠️ GuardianProver: ProvingAutoPauseEnabled Alert", + message, + }); +} + +async function getLatestBlockNumber(provider) { + const currentBlock = await provider.getBlock("latest"); + return currentBlock.number; +} + +async function fetchLogsFromL1( + eventName, + fromBlock, + toBlock, + address, + abi, + provider, +) { + const iface = new ethers.utils.Interface(abi); + const eventTopic = iface.getEventTopic(eventName); + + try { + const logs = await provider.getLogs({ + address, + fromBlock, + toBlock, + topics: [eventTopic], + }); + + return logs.map((log) => + iface.decodeEventLog(eventName, log.data, log.topics), + ); + } catch (error) { + console.error(`Error fetching logs for ${eventName}:`, error); + return []; + } +} + +function createProvider(apiKey, apiSecret, relayerApiKey, relayerApiSecret) { + const client = new Defender({ + apiKey, + apiSecret, + relayerApiKey, + relayerApiSecret, + }); + + return client.relaySigner.getProvider(); +} + +async function calculateBlockTime(provider) { + const latestBlock = await provider.getBlock("latest"); + const previousBlock = await provider.getBlock(latestBlock.number - 100); + + const timeDiff = latestBlock.timestamp - previousBlock.timestamp; + const blockDiff = latestBlock.number - previousBlock.number; + + const blockTime = timeDiff / blockDiff; + return blockTime; +} + +exports.handler = async function (event, context) { + const { notificationClient } = context; + const { apiKey, apiSecret, taikoL1ApiKey, taikoL1ApiSecret } = event.secrets; + + const taikoL1Provider = createProvider( + apiKey, + apiSecret, + taikoL1ApiKey, + taikoL1ApiSecret, + ); + + const currentBlockNumber = await getLatestBlockNumber(taikoL1Provider); + const blockTimeInSeconds = await calculateBlockTime(taikoL1Provider); + const blocksInFiveMinutes = Math.floor((5 * 60) / blockTimeInSeconds); + + const fromBlock = currentBlockNumber - blocksInFiveMinutes; + const toBlock = currentBlockNumber; + + const logs = await fetchLogsFromL1( + "ProvingAutoPauseEnabled", + fromBlock, + toBlock, + "0xE3D777143Ea25A6E031d1e921F396750885f43aC", + ABI, + taikoL1Provider, + ); + + console.log(`Logs found: ${logs.length}`); + + if (logs.length > 0) { + logs.forEach((log) => { + const enabled = log.enabled; + const status = enabled ? "ENABLED" : "DISABLED"; + const message = `Proving Auto-Pause has been ${status}.\n\nDetails:\n- Enabled: ${enabled}\n- Block Number: ${log.blockNumber}`; + alertOrg(notificationClient, message); + }); + } + + return true; +}; diff --git a/packages/monitors/defender/mainnet/actions/SGXVerifier-verifyProofFailure/index.js b/packages/monitors/defender/mainnet/actions/SGXVerifier-verifyProofFailure/index.js new file mode 100644 index 00000000000..0403697f3e8 --- /dev/null +++ b/packages/monitors/defender/mainnet/actions/SGXVerifier-verifyProofFailure/index.js @@ -0,0 +1,107 @@ +const { ethers } = require("ethers"); +const { Defender } = require("@openzeppelin/defender-sdk"); + +const verifyProofSignature = "verifyProof(address,bytes32,bytes32)"; +const verifyProofSelector = ethers.utils + .keccak256(ethers.utils.toUtf8Bytes(verifyProofSignature)) + .substring(0, 10); + +function alertOrg(notificationClient, message) { + notificationClient.send({ + channelAlias: "discord_bridging", + subject: "⚠️ SGXVerifier: verifyProof Failure Alert", + message, + }); +} + +function createProvider(apiKey, apiSecret, relayerApiKey, relayerApiSecret) { + const client = new Defender({ + apiKey, + apiSecret, + relayerApiKey, + relayerApiSecret, + }); + return client.relaySigner.getProvider(); +} + +async function getLatestBlockNumber(provider) { + const currentBlock = await provider.getBlock("latest"); + return currentBlock.number; +} + +async function calculateBlockTime(provider) { + const latestBlock = await provider.getBlock("latest"); + const previousBlock = await provider.getBlock(latestBlock.number - 100); + + const timeDiff = latestBlock.timestamp - previousBlock.timestamp; + const blockDiff = latestBlock.number - previousBlock.number; + + const blockTime = timeDiff / blockDiff; + return blockTime; +} + +async function calculateBlockRange(provider, hours = 24) { + const currentBlockNumber = await getLatestBlockNumber(provider); + const blockTimeInSeconds = await calculateBlockTime(provider); + const blocksInTimeFrame = Math.floor((hours * 60 * 60) / blockTimeInSeconds); + + const fromBlock = currentBlockNumber - blocksInTimeFrame; + const toBlock = currentBlockNumber; + + console.log(`Calculated block range: from ${fromBlock} to ${toBlock}`); + + return { fromBlock, toBlock }; +} + +async function monitorTransactions( + provider, + contractAddress, + notificationClient, + hours, +) { + const { fromBlock, toBlock } = await calculateBlockRange(provider, hours); + + const logs = await provider.getLogs({ + fromBlock, + toBlock, + address: contractAddress, + }); + + for (const log of logs) { + const tx = await provider.getTransaction(log.transactionHash); + + if (tx.data.startsWith(verifyProofSelector)) { + const txReceipt = await provider.getTransactionReceipt( + log.transactionHash, + ); + + if (txReceipt && txReceipt.status === 0) { + const message = ` + A failed verifyProof transaction was detected. + - Contract Address: ${log.address} + - Transaction Hash: ${log.transactionHash} + - Block Number: ${txReceipt.blockNumber} + `; + alertOrg(notificationClient, message); + } + } + } +} + +exports.handler = async function (event, context) { + const { notificationClient } = context; + const { apiKey, apiSecret, taikoL1ApiKey, taikoL1ApiSecret } = event.secrets; + + const contractAddress = "0xb0f3186FC1963f774f52ff455DC86aEdD0b31F81"; + + const provider = createProvider( + apiKey, + apiSecret, + taikoL1ApiKey, + taikoL1ApiSecret, + ); + + await monitorTransactions(provider, contractAddress, notificationClient, 24); + + return true; +}; diff --git a/packages/monitors/defender/mainnet/actions/TaikoL1-BlockProposed/index.js b/packages/monitors/defender/mainnet/actions/TaikoL1-BlockProposed/index.js new file mode 100644 index 00000000000..7ea49a7d858 --- /dev/null +++ b/packages/monitors/defender/mainnet/actions/TaikoL1-BlockProposed/index.js @@ -0,0 +1,373 @@ +const { ethers } = require("ethers"); +const { Defender } = require("@openzeppelin/defender-sdk"); + +const ABI = [ + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "uint256", + name: "blockId", + type: "uint256", + }, + { + indexed: true, + internalType: "address", + name: "assignedProver", + type: "address", + }, + { + indexed: false, + internalType: "uint96", + name: "livenessBond", + type: "uint96", + }, + { + components: [ + { + internalType: "bytes32", + name: "l1Hash", + type: "bytes32", + }, + { + internalType: "bytes32", + name: "difficulty", + type: "bytes32", + }, + { + internalType: "bytes32", + name: "blobHash", + type: "bytes32", + }, + { + internalType: "bytes32", + name: "extraData", + type: "bytes32", + }, + { + internalType: "bytes32", + name: "depositsHash", + type: "bytes32", + }, + { + internalType: "address", + name: "coinbase", + type: "address", + }, + { + internalType: "uint64", + name: "id", + type: "uint64", + }, + { + internalType: "uint32", + name: "gasLimit", + type: "uint32", + }, + { + internalType: "uint64", + name: "timestamp", + type: "uint64", + }, + { + internalType: "uint64", + name: "l1Height", + type: "uint64", + }, + { + internalType: "uint16", + name: "minTier", + type: "uint16", + }, + { + internalType: "bool", + name: "blobUsed", + type: "bool", + }, + { + internalType: "bytes32", + name: "parentMetaHash", + type: "bytes32", + }, + { + internalType: "address", + name: "sender", + type: "address", + }, + ], + indexed: false, + internalType: "struct TaikoData.BlockMetadata", + name: "meta", + type: "tuple", + }, + { + components: [ + { + internalType: "address", + name: "recipient", + type: "address", + }, + { + internalType: "uint96", + name: "amount", + type: "uint96", + }, + { + internalType: "uint64", + name: "id", + type: "uint64", + }, + ], + indexed: false, + internalType: "struct TaikoData.EthDeposit[]", + name: "depositsProcessed", + type: "tuple[]", + }, + ], + name: "BlockProposed", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "uint256", + name: "blockId", + type: "uint256", + }, + { + indexed: true, + internalType: "address", + name: "assignedProver", + type: "address", + }, + { + indexed: false, + internalType: "uint96", + name: "livenessBond", + type: "uint96", + }, + { + components: [ + { + internalType: "bytes32", + name: "l1Hash", + type: "bytes32", + }, + { + internalType: "bytes32", + name: "difficulty", + type: "bytes32", + }, + { + internalType: "bytes32", + name: "blobHash", + type: "bytes32", + }, + { + internalType: "bytes32", + name: "extraData", + type: "bytes32", + }, + { + internalType: "bytes32", + name: "depositsHash", + type: "bytes32", + }, + { + internalType: "address", + name: "coinbase", + type: "address", + }, + { + internalType: "uint64", + name: "id", + type: "uint64", + }, + { + internalType: "uint32", + name: "gasLimit", + type: "uint32", + }, + { + internalType: "uint64", + name: "timestamp", + type: "uint64", + }, + { + internalType: "uint64", + name: "l1Height", + type: "uint64", + }, + { + internalType: "uint16", + name: "minTier", + type: "uint16", + }, + { + internalType: "bool", + name: "blobUsed", + type: "bool", + }, + { + internalType: "bytes32", + name: "parentMetaHash", + type: "bytes32", + }, + { + internalType: "address", + name: "sender", + type: "address", + }, + ], + indexed: false, + internalType: "struct TaikoData.BlockMetadata", + name: "meta", + type: "tuple", + }, + { + components: [ + { + internalType: "address", + name: "recipient", + type: "address", + }, + { + internalType: "uint96", + name: "amount", + type: "uint96", + }, + { + internalType: "uint64", + name: "id", + type: "uint64", + }, + ], + indexed: false, + internalType: "struct TaikoData.EthDeposit[]", + name: "depositsProcessed", + type: "tuple[]", + }, + ], + name: "BlockProposedV2", + type: "event", + }, +]; + +function alertOrg(notificationClient, message) { + notificationClient.send({ + channelAlias: "discord_bridging", + subject: "🚨 TaikoL1: BlockProposed Alert", + message, + }); + + notificationClient.send({ + channelAlias: "tg_taiko_guardians", + subject: "🚨 TaikoL1: BlockProposed Alert", + message, + }); +} + +async function getLatestBlockNumber(provider) { + const currentBlock = await provider.getBlock("latest"); + return currentBlock.number; +} + +async function fetchLogsFromL1( + eventNames, + fromBlock, + toBlock, + address, + abi, + provider, +) { + const iface = new ethers.utils.Interface(abi); + + const allLogs = []; + + for (const eventName of eventNames) { + const eventTopic = iface.getEventTopic(eventName); + + try { + const logs = await provider.getLogs({ + address, + fromBlock, + toBlock, + topics: [eventTopic], + }); + + allLogs.push( + ...logs.map((log) => + iface.decodeEventLog(eventName, log.data, log.topics), + ), + ); + } catch (error) { + console.error(`Error fetching logs for ${eventName}:`, error); + } + } + + return allLogs; +} + +function createProvider(apiKey, apiSecret, relayerApiKey, relayerApiSecret) { + const client = new Defender({ + apiKey, + apiSecret, + relayerApiKey, + relayerApiSecret, + }); + + return client.relaySigner.getProvider(); +} + +async function calculateBlockTime(provider) { + const latestBlock = await provider.getBlock("latest"); + const previousBlock = await provider.getBlock(latestBlock.number - 100); + + const timeDiff = latestBlock.timestamp - previousBlock.timestamp; + const blockDiff = latestBlock.number - previousBlock.number; + + const blockTime = timeDiff / blockDiff; + return blockTime; +} + +exports.handler = async function (event, context) { + const { notificationClient } = context; + const { apiKey, apiSecret, taikoL1ApiKey, taikoL1ApiSecret } = event.secrets; + + const taikoL1Provider = createProvider( + apiKey, + apiSecret, + taikoL1ApiKey, + taikoL1ApiSecret, + ); + + const currentBlockNumber = await getLatestBlockNumber(taikoL1Provider); + const blockTimeInSeconds = await calculateBlockTime(taikoL1Provider); + const blocksInFiveMinutes = Math.floor((15 * 60) / blockTimeInSeconds); + + const fromBlock = currentBlockNumber - blocksInFiveMinutes; + const toBlock = currentBlockNumber; + + const logs = await fetchLogsFromL1( + ["BlockProposed", "BlockProposedV2"], + fromBlock, + toBlock, + "0x06a9Ab27c7e2255df1815E6CC0168d7755Feb19a", + ABI, + taikoL1Provider, + ); + + console.log(`Logs found: ${logs.length}`); + + if (logs.length === 0) { + alertOrg( + notificationClient, + `No BlockProposed event detected in the last 15 mins on TaikoL1!`, + ); + } + + return true; +}; diff --git a/packages/monitors/defender/mainnet/actions/TaikoL1-BlockVerified/index.js b/packages/monitors/defender/mainnet/actions/TaikoL1-BlockVerified/index.js new file mode 100644 index 00000000000..fd3b74def30 --- /dev/null +++ b/packages/monitors/defender/mainnet/actions/TaikoL1-BlockVerified/index.js @@ -0,0 +1,187 @@ +const { ethers } = require("ethers"); +const { Defender } = require("@openzeppelin/defender-sdk"); + +const ABI = [ + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "uint256", + name: "blockId", + type: "uint256", + }, + { + indexed: true, + internalType: "address", + name: "prover", + type: "address", + }, + { + indexed: false, + internalType: "bytes32", + name: "blockHash", + type: "bytes32", + }, + { + indexed: false, + internalType: "bytes32", + name: "stateRoot", + type: "bytes32", + }, + { + indexed: false, + internalType: "uint16", + name: "tier", + type: "uint16", + }, + ], + name: "BlockVerified", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "uint256", + name: "blockId", + type: "uint256", + }, + { + indexed: true, + internalType: "address", + name: "prover", + type: "address", + }, + { + indexed: false, + internalType: "bytes32", + name: "blockHash", + type: "bytes32", + }, + { + indexed: false, + internalType: "bytes32", + name: "stateRoot", + type: "bytes32", + }, + { + indexed: false, + internalType: "uint16", + name: "tier", + type: "uint16", + }, + ], + name: "BlockVerifiedV2", + type: "event", + }, +]; + +function alertOrg(notificationClient, message) { + notificationClient.send({ + channelAlias: "discord_bridging", + subject: "🚨 TaikoL1: BlockVerified Alert", + message, + }); + + notificationClient.send({ + channelAlias: "tg_taiko_guardians", + subject: "🚨 TaikoL1: BlockVerified Alert", + message, + }); +} + +async function getLatestBlockNumber(provider) { + const currentBlock = await provider.getBlock("latest"); + return currentBlock.number; +} + +async function fetchLogsFromL1( + eventNames, + fromBlock, + toBlock, + address, + abi, + provider, +) { + const iface = new ethers.utils.Interface(abi); + const eventTopics = eventNames.map((eventName) => + iface.getEventTopic(eventName), + ); + + console.log(`eventTopics: ${eventTopics}`); + + try { + const logs = await provider.getLogs({ + address, + fromBlock, + toBlock, + topics: [eventTopics], + }); + + return logs.map((log) => iface.parseLog(log)); + } catch (error) { + console.error("Error fetching L1 logs:", error); + return []; + } +} + +function createProvider(apiKey, apiSecret, relayerApiKey, relayerApiSecret) { + const client = new Defender({ + apiKey, + apiSecret, + relayerApiKey, + relayerApiSecret, + }); + + return client.relaySigner.getProvider(); +} + +async function calculateBlockTime(provider) { + const latestBlock = await provider.getBlock("latest"); + const previousBlock = await provider.getBlock(latestBlock.number - 100); + + const timeDiff = latestBlock.timestamp - previousBlock.timestamp; + const blockDiff = latestBlock.number - previousBlock.number; + + const blockTime = timeDiff / blockDiff; + return blockTime; +} + +exports.handler = async function (event, context) { + const { notificationClient } = context; + const { apiKey, apiSecret, taikoL1ApiKey, taikoL1ApiSecret } = event.secrets; + + const taikoL1Provider = createProvider( + apiKey, + apiSecret, + taikoL1ApiKey, + taikoL1ApiSecret, + ); + + const currentBlockNumber = await getLatestBlockNumber(taikoL1Provider); + const blockTimeInSeconds = await calculateBlockTime(taikoL1Provider); + const blocksInFiveMinutes = Math.floor((30 * 60) / blockTimeInSeconds); + + const fromBlock = currentBlockNumber - blocksInFiveMinutes; + const toBlock = currentBlockNumber; + + const logs = await fetchLogsFromL1( + ["BlockVerified", "BlockVerifiedV2"], + fromBlock, + toBlock, + "0x06a9Ab27c7e2255df1815E6CC0168d7755Feb19a", + ABI, + taikoL1Provider, + ); + + if (logs.length === 0) { + alertOrg( + notificationClient, + `@davidcai @yuea7583 No BlockVerified event detected in the last 30 mins in TaikoL1!`, + ); + } + + return true; +}; diff --git a/packages/monitors/defender/mainnet/actions/TaikoL1-CalldataTxListCount/index.js b/packages/monitors/defender/mainnet/actions/TaikoL1-CalldataTxListCount/index.js new file mode 100644 index 00000000000..2539f4e90bd --- /dev/null +++ b/packages/monitors/defender/mainnet/actions/TaikoL1-CalldataTxListCount/index.js @@ -0,0 +1,138 @@ +const { ethers } = require("ethers"); +const { Defender } = require("@openzeppelin/defender-sdk"); + +const ABI = [ + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "uint256", + name: "blockId", + type: "uint256", + }, + { + indexed: false, + internalType: "bytes", + name: "txList", + type: "bytes", + }, + ], + name: "CalldataTxList", + type: "event", + }, +]; + +function alertOrg(notificationClient, message) { + notificationClient.send({ + channelAlias: "discord_bridging", + subject: "ℹ️ TaikoL1: CalldataTxList Count", + message, + }); +} + +async function getLatestBlockNumber(provider) { + const currentBlock = await provider.getBlock("latest"); + return currentBlock.number; +} + +async function calculateBlockTime(provider) { + const latestBlock = await provider.getBlock("latest"); + const previousBlock = await provider.getBlock(latestBlock.number - 100); + + const timeDiff = latestBlock.timestamp - previousBlock.timestamp; + const blockDiff = latestBlock.number - previousBlock.number; + + const blockTime = timeDiff / blockDiff; + return blockTime; +} + +async function calculateBlockRange(provider) { + const currentBlockNumber = await getLatestBlockNumber(provider); + const blockTimeInSeconds = await calculateBlockTime(provider); + const blocksIn24Hours = Math.floor((24 * 60 * 60) / blockTimeInSeconds); // 24 hours in seconds + + const fromBlock = currentBlockNumber - blocksIn24Hours; + const toBlock = currentBlockNumber; + + console.log(`Calculated block range: from ${fromBlock} to ${toBlock}`); + + return { fromBlock, toBlock }; +} + +async function fetchLogsFromL1( + eventNames, + fromBlock, + toBlock, + address, + abi, + provider, +) { + const iface = new ethers.utils.Interface(abi); + const eventTopics = eventNames.map((eventName) => + iface.getEventTopic(eventName), + ); + + console.log(`eventTopics: ${eventTopics}`); + + try { + const logs = await provider.getLogs({ + address, + fromBlock, + toBlock, + topics: [eventTopics], + }); + console.log(`Fetched logs: ${logs.length}`); + return logs.map((log) => { + const parsedLog = iface.parseLog(log); + console.log(`Parsed log: ${JSON.stringify(parsedLog)}`); + return parsedLog; + }); + } catch (error) { + console.error("Error fetching L1 logs:", error); + return []; + } +} + +function createProvider(apiKey, apiSecret, relayerApiKey, relayerApiSecret) { + const client = new Defender({ + apiKey, + apiSecret, + relayerApiKey, + relayerApiSecret, + }); + + return client.relaySigner.getProvider(); +} + +exports.handler = async function (event, context) { + const { notificationClient } = context; + const { apiKey, apiSecret, taikoL1ApiKey, taikoL1ApiSecret } = event.secrets; + + const taikoL1Provider = createProvider( + apiKey, + apiSecret, + taikoL1ApiKey, + taikoL1ApiSecret, + ); + + const { fromBlock, toBlock } = await calculateBlockRange(taikoL1Provider); + + const logs = await fetchLogsFromL1( + ["CalldataTxList"], + fromBlock, + toBlock, + "0x06a9Ab27c7e2255df1815E6CC0168d7755Feb19a", + ABI, + taikoL1Provider, + ); + + if (logs.length > 0) { + alertOrg( + notificationClient, + `Detected ${logs.length} CalldataTxList events in the last 24 hours on TaikoL1!`, + ); + } + + return true; +}; diff --git a/packages/monitors/defender/mainnet/actions/TaikoL1-ProvingPaused/index.js b/packages/monitors/defender/mainnet/actions/TaikoL1-ProvingPaused/index.js new file mode 100644 index 00000000000..9e52d04f3c8 --- /dev/null +++ b/packages/monitors/defender/mainnet/actions/TaikoL1-ProvingPaused/index.js @@ -0,0 +1,120 @@ +const { ethers } = require("ethers"); +const { Defender } = require("@openzeppelin/defender-sdk"); + +const ABI = [ + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "bool", + name: "paused", + type: "bool", + }, + ], + name: "ProvingPaused", + type: "event", + }, +]; + +function alertOrg(notificationClient, message) { + notificationClient.send({ + channelAlias: "discord_bridging", + subject: "⚠️ TaikoL1: ProvingPaused Alert", + message, + }); +} + +async function getLatestBlockNumber(provider) { + const currentBlock = await provider.getBlock("latest"); + return currentBlock.number; +} + +async function fetchLogsFromL1( + eventName, + fromBlock, + toBlock, + address, + abi, + provider, +) { + const iface = new ethers.utils.Interface(abi); + const eventTopic = iface.getEventTopic(eventName); + + try { + const logs = await provider.getLogs({ + address, + fromBlock, + toBlock, + topics: [eventTopic], + }); + + return logs.map((log) => + iface.decodeEventLog(eventName, log.data, log.topics), + ); + } catch (error) { + console.error(`Error fetching logs for ${eventName}:`, error); + return []; + } +} + +function createProvider(apiKey, apiSecret, relayerApiKey, relayerApiSecret) { + const client = new Defender({ + apiKey, + apiSecret, + relayerApiKey, + relayerApiSecret, + }); + + return client.relaySigner.getProvider(); +} + +async function calculateBlockTime(provider) { + const latestBlock = await provider.getBlock("latest"); + const previousBlock = await provider.getBlock(latestBlock.number - 100); + + const timeDiff = latestBlock.timestamp - previousBlock.timestamp; + const blockDiff = latestBlock.number - previousBlock.number; + + const blockTime = timeDiff / blockDiff; + return blockTime; +} + +exports.handler = async function (event, context) { + const { notificationClient } = context; + const { apiKey, apiSecret, taikoL1ApiKey, taikoL1ApiSecret } = event.secrets; + + const taikoL1Provider = createProvider( + apiKey, + apiSecret, + taikoL1ApiKey, + taikoL1ApiSecret, + ); + + const currentBlockNumber = await getLatestBlockNumber(taikoL1Provider); + const blockTimeInSeconds = await calculateBlockTime(taikoL1Provider); + const blocksInFiveMinutes = Math.floor((5 * 60) / blockTimeInSeconds); + + const fromBlock = currentBlockNumber - blocksInFiveMinutes; + const toBlock = currentBlockNumber; + + const logs = await fetchLogsFromL1( + "ProvingPaused", + fromBlock, + toBlock, + "0x06a9Ab27c7e2255df1815E6CC0168d7755Feb19a", + ABI, + taikoL1Provider, + ); + + console.log(`Logs found: ${logs.length}`); + + if (logs.length > 0) { + alertOrg( + notificationClient, + `ProvingPaused event detected! Details: ${JSON.stringify(logs)}`, + ); + } + + return true; +}; diff --git a/packages/monitors/defender/mainnet/actions/TaikoL1-TransitionContestedCount/index.js b/packages/monitors/defender/mainnet/actions/TaikoL1-TransitionContestedCount/index.js new file mode 100644 index 00000000000..8c47353c3a5 --- /dev/null +++ b/packages/monitors/defender/mainnet/actions/TaikoL1-TransitionContestedCount/index.js @@ -0,0 +1,237 @@ +const { ethers } = require("ethers"); +const { Defender } = require("@openzeppelin/defender-sdk"); + +const ABI = [ + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "uint256", + name: "blockId", + type: "uint256", + }, + { + components: [ + { + internalType: "bytes32", + name: "parentHash", + type: "bytes32", + }, + { + internalType: "bytes32", + name: "blockHash", + type: "bytes32", + }, + { + internalType: "bytes32", + name: "stateRoot", + type: "bytes32", + }, + { + internalType: "bytes32", + name: "graffiti", + type: "bytes32", + }, + ], + indexed: false, + internalType: "struct TaikoData.Transition", + name: "tran", + type: "tuple", + }, + { + indexed: false, + internalType: "address", + name: "contester", + type: "address", + }, + { + indexed: false, + internalType: "uint96", + name: "contestBond", + type: "uint96", + }, + { + indexed: false, + internalType: "uint16", + name: "tier", + type: "uint16", + }, + ], + name: "TransitionContested", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "uint256", + name: "blockId", + type: "uint256", + }, + { + components: [ + { + internalType: "bytes32", + name: "parentHash", + type: "bytes32", + }, + { + internalType: "bytes32", + name: "blockHash", + type: "bytes32", + }, + { + internalType: "bytes32", + name: "stateRoot", + type: "bytes32", + }, + { + internalType: "bytes32", + name: "graffiti", + type: "bytes32", + }, + ], + indexed: false, + internalType: "struct TaikoData.Transition", + name: "tran", + type: "tuple", + }, + { + indexed: false, + internalType: "address", + name: "contester", + type: "address", + }, + { + indexed: false, + internalType: "uint96", + name: "contestBond", + type: "uint96", + }, + { + indexed: false, + internalType: "uint16", + name: "tier", + type: "uint16", + }, + ], + name: "TransitionContestedV2", + type: "event", + }, +]; + +function alertOrg(notificationClient, message) { + notificationClient.send({ + channelAlias: "discord_bridging", + subject: "ℹ️ TaikoL1: TransitionContested Count", + message, + }); +} + +async function getLatestBlockNumber(provider) { + const currentBlock = await provider.getBlock("latest"); + return currentBlock.number; +} + +async function calculateBlockTime(provider) { + const latestBlock = await provider.getBlock("latest"); + const previousBlock = await provider.getBlock(latestBlock.number - 100); + + const timeDiff = latestBlock.timestamp - previousBlock.timestamp; + const blockDiff = latestBlock.number - previousBlock.number; + + const blockTime = timeDiff / blockDiff; + return blockTime; +} + +async function calculateBlockRange(provider) { + const currentBlockNumber = await getLatestBlockNumber(provider); + const blockTimeInSeconds = await calculateBlockTime(provider); + const blocksInOneHour = Math.floor((60 * 60) / blockTimeInSeconds); + + const fromBlock = currentBlockNumber - blocksInOneHour; + const toBlock = currentBlockNumber; + + console.log(`Calculated block range: from ${fromBlock} to ${toBlock}`); + + return { fromBlock, toBlock }; +} + +async function fetchLogsFromL1( + eventNames, + fromBlock, + toBlock, + address, + abi, + provider, +) { + const iface = new ethers.utils.Interface(abi); + const eventTopics = eventNames.map((eventName) => + iface.getEventTopic(eventName), + ); + + console.log(`eventTopics: ${eventTopics}`); + + try { + const logs = await provider.getLogs({ + address, + fromBlock, + toBlock, + topics: [eventTopics], + }); + console.log(`Fetched logs: ${logs.length}`); + return logs.map((log) => { + const parsedLog = iface.parseLog(log); + console.log(`Parsed log: ${JSON.stringify(parsedLog)}`); + return parsedLog; + }); + } catch (error) { + console.error("Error fetching L1 logs:", error); + return []; + } +} + +function createProvider(apiKey, apiSecret, relayerApiKey, relayerApiSecret) { + const client = new Defender({ + apiKey, + apiSecret, + relayerApiKey, + relayerApiSecret, + }); + + return client.relaySigner.getProvider(); +} + +exports.handler = async function (event, context) { + const { notificationClient } = context; + const { apiKey, apiSecret, taikoL1ApiKey, taikoL1ApiSecret } = event.secrets; + + const taikoL1Provider = createProvider( + apiKey, + apiSecret, + taikoL1ApiKey, + taikoL1ApiSecret, + ); + + const { fromBlock, toBlock } = await calculateBlockRange(taikoL1Provider); + + const logs = await fetchLogsFromL1( + ["TransitionContested", "TransitionContestedV2"], + fromBlock, + toBlock, + "0x06a9Ab27c7e2255df1815E6CC0168d7755Feb19a", + ABI, + taikoL1Provider, + ); + + if (logs.length > 0) { + alertOrg( + notificationClient, + `Detected ${logs.length} TransitionContested and TransitionContestedV2 events in the last hour on TaikoL1!`, + ); + } + + return true; +}; diff --git a/packages/monitors/defender/mainnet/actions/TaikoL1-TransitionProved/index.js b/packages/monitors/defender/mainnet/actions/TaikoL1-TransitionProved/index.js new file mode 100644 index 00000000000..489d8a94542 --- /dev/null +++ b/packages/monitors/defender/mainnet/actions/TaikoL1-TransitionProved/index.js @@ -0,0 +1,223 @@ +const { ethers } = require("ethers"); +const { Defender } = require("@openzeppelin/defender-sdk"); + +const ABI = [ + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "uint256", + name: "blockId", + type: "uint256", + }, + { + components: [ + { + internalType: "bytes32", + name: "parentHash", + type: "bytes32", + }, + { + internalType: "bytes32", + name: "blockHash", + type: "bytes32", + }, + { + internalType: "bytes32", + name: "stateRoot", + type: "bytes32", + }, + { + internalType: "bytes32", + name: "graffiti", + type: "bytes32", + }, + ], + indexed: false, + internalType: "struct TaikoData.Transition", + name: "tran", + type: "tuple", + }, + { + indexed: false, + internalType: "address", + name: "prover", + type: "address", + }, + { + indexed: false, + internalType: "uint96", + name: "validityBond", + type: "uint96", + }, + { + indexed: false, + internalType: "uint16", + name: "tier", + type: "uint16", + }, + ], + name: "TransitionProved", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "uint256", + name: "blockId", + type: "uint256", + }, + { + components: [ + { + internalType: "bytes32", + name: "parentHash", + type: "bytes32", + }, + { + internalType: "bytes32", + name: "blockHash", + type: "bytes32", + }, + { + internalType: "bytes32", + name: "stateRoot", + type: "bytes32", + }, + { + internalType: "bytes32", + name: "graffiti", + type: "bytes32", + }, + ], + indexed: false, + internalType: "struct TaikoData.Transition", + name: "tran", + type: "tuple", + }, + { + indexed: false, + internalType: "address", + name: "prover", + type: "address", + }, + { + indexed: false, + internalType: "uint96", + name: "validityBond", + type: "uint96", + }, + { + indexed: false, + internalType: "uint16", + name: "tier", + type: "uint16", + }, + ], + name: "TransitionProvedV2", + type: "event", + }, +]; + +function alertOrg(notificationClient, message) { + notificationClient.send({ + channelAlias: "discord_bridging", + subject: "🚨 TaikoL1: TransitionProved Alert", + message, + }); +} + +async function getLatestBlockNumber(provider) { + const currentBlock = await provider.getBlock("latest"); + return currentBlock.number; +} + +async function fetchLogsFromL1( + eventNames, + fromBlock, + toBlock, + address, + abi, + provider, +) { + const iface = new ethers.utils.Interface(abi); + const eventTopics = eventNames.map((eventName) => + iface.getEventTopic(eventName), + ); + + try { + const logs = await provider.getLogs({ + address, + fromBlock, + toBlock, + topics: [eventTopics], + }); + console.log("Raw logs fetched:", logs); + return logs.map((log) => iface.parseLog(log)); + } catch (error) { + console.error("Error fetching L1 logs:", error); + return []; + } +} + +function createProvider(apiKey, apiSecret, relayerApiKey, relayerApiSecret) { + const client = new Defender({ + apiKey, + apiSecret, + relayerApiKey, + relayerApiSecret, + }); + + return client.relaySigner.getProvider(); +} + +async function calculateBlockTime(provider) { + const latestBlock = await provider.getBlock("latest"); + const previousBlock = await provider.getBlock(latestBlock.number - 100); + + const timeDiff = latestBlock.timestamp - previousBlock.timestamp; + const blockDiff = latestBlock.number - previousBlock.number; + + const blockTime = timeDiff / blockDiff; + return blockTime; +} + +exports.handler = async function (event, context) { + const { notificationClient } = context; + const { apiKey, apiSecret, taikoL1ApiKey, taikoL1ApiSecret } = event.secrets; + + const taikoL1Provider = createProvider( + apiKey, + apiSecret, + taikoL1ApiKey, + taikoL1ApiSecret, + ); + + const currentBlockNumber = await getLatestBlockNumber(taikoL1Provider); + const blockTimeInSeconds = await calculateBlockTime(taikoL1Provider); + const blocksInThirtyMinutes = Math.floor((30 * 60) / blockTimeInSeconds); + + const fromBlock = currentBlockNumber - blocksInThirtyMinutes; + const toBlock = currentBlockNumber; + + const logs = await fetchLogsFromL1( + ["TransitionProved", "TransitionProvedV2"], + fromBlock, + toBlock, + "0x06a9Ab27c7e2255df1815E6CC0168d7755Feb19a", + ABI, + taikoL1Provider, + ); + + if (logs.length === 0) { + alertOrg( + notificationClient, + `No TransitionProved event detected in the last 30 mins on TaikoL1!`, + ); + } + + return true; +}; diff --git a/packages/monitors/defender/mainnet/actions/Vaults-BridgedTokenDeployed/index.js b/packages/monitors/defender/mainnet/actions/Vaults-BridgedTokenDeployed/index.js new file mode 100644 index 00000000000..53dcf85a248 --- /dev/null +++ b/packages/monitors/defender/mainnet/actions/Vaults-BridgedTokenDeployed/index.js @@ -0,0 +1,332 @@ +const { ethers } = require("ethers"); +const { Defender } = require("@openzeppelin/defender-sdk"); + +const ABIs = { + ERC1155Vault: [ + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "uint64", + name: "chainId", + type: "uint64", + }, + { + indexed: true, + internalType: "address", + name: "ctoken", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "btoken", + type: "address", + }, + { + indexed: false, + internalType: "string", + name: "ctokenSymbol", + type: "string", + }, + { + indexed: false, + internalType: "string", + name: "ctokenName", + type: "string", + }, + ], + name: "BridgedTokenDeployed", + type: "event", + }, + ], + ERC721Vault: [ + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "uint64", + name: "chainId", + type: "uint64", + }, + { + indexed: true, + internalType: "address", + name: "ctoken", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "btoken", + type: "address", + }, + { + indexed: false, + internalType: "string", + name: "ctokenSymbol", + type: "string", + }, + { + indexed: false, + internalType: "string", + name: "ctokenName", + type: "string", + }, + ], + name: "BridgedTokenDeployed", + type: "event", + }, + ], + ERC20Vault: [ + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "uint256", + name: "srcChainId", + type: "uint256", + }, + { + indexed: true, + internalType: "address", + name: "ctoken", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "btoken", + type: "address", + }, + { + indexed: false, + internalType: "string", + name: "ctokenSymbol", + type: "string", + }, + { + indexed: false, + internalType: "string", + name: "ctokenName", + type: "string", + }, + { + indexed: false, + internalType: "uint8", + name: "ctokenDecimal", + type: "uint8", + }, + ], + name: "BridgedTokenDeployed", + type: "event", + }, + ], +}; + +function alertOrg(notificationClient, subject, message) { + notificationClient.send({ + channelAlias: "discord_bridging", + subject: subject, + message: message, + }); +} + +async function getLatestBlockNumber(provider) { + const currentBlock = await provider.getBlock("latest"); + return currentBlock.number; +} + +async function calculateBlockTime(provider) { + const latestBlock = await provider.getBlock("latest"); + const previousBlock = await provider.getBlock(latestBlock.number - 100); + + const timeDiff = latestBlock.timestamp - previousBlock.timestamp; + const blockDiff = latestBlock.number - previousBlock.number; + + const blockTime = timeDiff / blockDiff; + return blockTime; +} + +async function calculateBlockRange(provider) { + const currentBlockNumber = await getLatestBlockNumber(provider); + const blockTimeInSeconds = await calculateBlockTime(provider); + const blocksIn24Hours = Math.floor((24 * 60 * 60) / blockTimeInSeconds); + + const fromBlock = currentBlockNumber - blocksIn24Hours; + const toBlock = currentBlockNumber; + + console.log(`Calculated block range: from ${fromBlock} to ${toBlock}`); + + return { fromBlock, toBlock }; +} + +async function fetchLogs( + eventName, + fromBlock, + toBlock, + address, + abi, + provider, +) { + const iface = new ethers.utils.Interface(abi); + const eventTopic = iface.getEventTopic(eventName); + console.log(`eventTopic: ${eventTopic}`); + try { + const logs = await provider.getLogs({ + address, + fromBlock, + toBlock, + topics: [eventTopic], + }); + console.log(`Fetched logs: ${logs.length}`); + return logs.map((log) => { + const parsedLog = iface.parseLog(log); + console.log(`Parsed log: ${JSON.stringify(parsedLog)}`); + return parsedLog; + }); + } catch (error) { + console.error("Error fetching logs:", error); + return []; + } +} + +function createProvider(apiKey, apiSecret, relayerApiKey, relayerApiSecret) { + const client = new Defender({ + apiKey, + apiSecret, + relayerApiKey, + relayerApiSecret, + }); + + return client.relaySigner.getProvider(); +} + +async function monitorEvent( + provider, + eventName, + fromBlock, + toBlock, + contractAddress, + abi, + subject, + notificationClient, +) { + const logs = await fetchLogs( + eventName, + fromBlock, + toBlock, + contractAddress, + abi, + provider, + ); + const eventCount = logs.length; + + if (eventCount > 0) { + const alertMessage = `ℹ️ Detected ${eventCount} ${subject} events on ${provider.network.name} in the last 24 hours!`; + alertOrg(notificationClient, subject, alertMessage); + } + + return; +} + +exports.handler = async function (event, context) { + const { notificationClient } = context; + const { + apiKey, + apiSecret, + taikoL1ApiKey, + taikoL1ApiSecret, + taikoL2ApiKey, + taikoL2ApiSecret, + } = event.secrets; + + const l1Provider = createProvider( + apiKey, + apiSecret, + taikoL1ApiKey, + taikoL1ApiSecret, + ); + const l2Provider = createProvider( + apiKey, + apiSecret, + taikoL2ApiKey, + taikoL2ApiSecret, + ); + + const { fromBlock: l1FromBlock, toBlock: l1ToBlock } = + await calculateBlockRange(l1Provider); + const { fromBlock: l2FromBlock, toBlock: l2ToBlock } = + await calculateBlockRange(l2Provider); + + await monitorEvent( + l1Provider, + "BridgedTokenDeployed", + l1FromBlock, + l1ToBlock, + "0xaf145913EA4a56BE22E120ED9C24589659881702", // L1 + ABIs.ERC1155Vault, + " ERC1155Vault.BridgedTokenDeployed", + notificationClient, + ); + + await monitorEvent( + l2Provider, + "BridgedTokenDeployed", + l2FromBlock, + l2ToBlock, + "0x1670000000000000000000000000000000000004", // L2 + ABIs.ERC1155Vault, + " ERC1155Vault.BridgedTokenDeployed", + notificationClient, + ); + + await monitorEvent( + l1Provider, + "BridgedTokenDeployed", + l1FromBlock, + l1ToBlock, + "0x0b470dd3A0e1C41228856Fb319649E7c08f419Aa", // L1 + ABIs.ERC721Vault, + " ERC721Vault.BridgedTokenDeployed", + notificationClient, + ); + + await monitorEvent( + l2Provider, + "BridgedTokenDeployed", + l2FromBlock, + l2ToBlock, + "0x1670000000000000000000000000000000000003", // L2 + ABIs.ERC721Vault, + " ERC721Vault.BridgedTokenDeployed", + notificationClient, + ); + + await monitorEvent( + l1Provider, + "BridgedTokenDeployed", + l1FromBlock, + l1ToBlock, + "0x996282cA11E5DEb6B5D122CC3B9A1FcAAD4415Ab", // L1 + ABIs.ERC20Vault, + " ERC20Vault.BridgedTokenDeployed", + notificationClient, + ); + + await monitorEvent( + l2Provider, + "BridgedTokenDeployed", + l2FromBlock, + l2ToBlock, + "0x1670000000000000000000000000000000000002", // L2 + ABIs.ERC20Vault, + " ERC20Vault.BridgedTokenDeployed", + notificationClient, + ); + + return true; +}; diff --git a/packages/monitors/defender/mainnet/serverless.yml b/packages/monitors/defender/mainnet/serverless.yml new file mode 100644 index 00000000000..78cb450766a --- /dev/null +++ b/packages/monitors/defender/mainnet/serverless.yml @@ -0,0 +1,912 @@ +service: taiko-defender-as-code +configValidationMode: error +frameworkVersion: "3" + +useDotenv: true + +provider: + name: defender + stage: ${opt:stage, 'dev'} + stackName: mystack + ssot: false + +defender: + key: ${env:DEFENDER_API_KEY} + secret: ${env:DEFENDER_API_SECRET} + +resources: + actions: + erc-20-vault-balance-drop: + name: "ERC20Vault: Balance Drop" + trigger: + type: schedule + frequency: 15 + paused: false + path: ./actions/ERC20Vault-BalanceDrop + + sgx-verifier-verify-proof-failure-alert: + name: "SGXVerifier: VerifyProof failure Alert" + trigger: + type: schedule + frequency: 5 + paused: false + path: ./actions/SGXVerifier-verifyProofFailure + + vaults-bridged-token-deployed: + name: "Vaults: BridgedTokenDeployed" + trigger: + type: schedule + frequency: 1440 + paused: false + path: ./actions/Vaults-BridgedTokenDeployed + + er-20-vault-bridged-token-changed: + name: "ER20Vault : BridgedTokenChanged" + trigger: + type: schedule + frequency: 4 + paused: false + path: ./actions/ER20Vault-BridgedTokenChanged + + bridge-message-processed: + name: "Bridge: MessageProcessed" + trigger: + type: schedule + frequency: 15 + paused: false + path: ./actions/Bridge-MessageProcessed + + taiko-l-1-calldata-tx-list-count: + name: "TaikoL1: CalldataTxList Count" + trigger: + type: schedule + frequency: 1440 + paused: false + path: ./actions/TaikoL1-CalldataTxListCount + + guardian-prover-approved-count: + name: "GuardianProver: Approved Count" + trigger: + type: schedule + frequency: 15 + paused: false + path: ./actions/GuardianProver-ApprovedCount + + taiko-l-1-transition-contested-count: + name: "TaikoL1: TransitionContested Count" + trigger: + type: schedule + frequency: 60 + paused: false + path: ./actions/TaikoL1-TransitionContestedCount + + taiko-l-1-transition-proved-alert: + name: "TaikoL1: TransitionProved Alert" + trigger: + type: schedule + frequency: 4 + paused: false + path: ./actions/TaikoL1-TransitionProved + + taiko-l-1-block-verified-alert: + name: "TaikoL1: BlockVerified Alert" + trigger: + type: schedule + frequency: 4 + paused: false + path: ./actions/TaikoL1-BlockVerified + + taiko-l-1-block-proposed-alert: + name: "TaikoL1: BlockProposed Alert" + trigger: + type: schedule + frequency: 4 + paused: false + path: ./actions/TaikoL1-BlockProposed + + policies: + policy-ts: + eip1559-pricing: true + policy-rA: + eip1559-pricing: true + contracts: + pem-cert-chain-lib: + name: pem_cert_chain_lib + address: "0x02772b7B3a5Bea0141C993Dbb8D0733C19F46169" + network: mainnet + taiko-l-1: + name: taikoL1 + address: "0x06a9Ab27c7e2255df1815E6CC0168d7755Feb19a" + network: mainnet + erc-721-vault: + name: erc721_vault + address: "0x1670000000000000000000000000000000000003" + network: taikol2 + taiko-token: + name: taiko_token + address: "0x10dea67478c5F8C5E2D90e5E9B26dBe60c54d800" + network: mainnet + p-256-verifier: + name: p256_verifier + address: "0x11A9ebA17EbF92b40fcf9a640Ebbc47Db6fBeab0" + network: mainnet + tier-provider: + name: tierProvider + address: "0x33879cDF01121dc7bCe011b461e64d791aE931F2" + network: mainnet + bridged-erc-1155: + name: bridged_erc1155 + address: "0x39E4C1214e733639d059979079A151911e42791d" + network: mainnet + sig-verify-lib: + name: sig_verify_lib + address: "0x47bB416ee947fE4a4b655011aF7d6E3A1B80E6e9" + network: mainnet + assignment-hook: + name: assignmentHook + address: "0x537a2f0D3a5879b41BCb5A2afE2EA5c4961796F6" + network: mainnet + guardian-prover-minority: + name: guardian_prover_minority + address: "0x579A8d63a2Db646284CBFE31FE5082c9989E985c" + network: mainnet + rollup-address-manager: + name: rollup_address_manager + address: "0x1670000000000000000000000000000000010002" + network: taikol2 + automata-dcap-attestation: + name: automata_dcap_attestation + address: "0x8d7C954960a36a7596d7eA4945dDf891967ca8A3" + network: mainnet + erc-20-vault: + name: erc20_vault + address: "0x1670000000000000000000000000000000000002" + network: taikol2 + signal-service: + name: signal_service + address: "0x1670000000000000000000000000000000000005" + network: taikol2 + guardian-prover: + name: guardian_prover + address: "0xE3D777143Ea25A6E031d1e921F396750885f43aC" + network: mainnet + shared-address-manager: + name: shared_address_manager + address: "0x1670000000000000000000000000000000000006" + network: taikol2 + erc-1155-vault: + name: erc1155_vault + address: "0x1670000000000000000000000000000000000004" + network: taikol2 + tier-sgx: + name: tier_sgx + address: "0xb0f3186FC1963f774f52ff455DC86aEdD0b31F81" + network: mainnet + bridged-erc-721: + name: bridged_erc721 + address: "0xc4096E9ff1526Bd1840B65e9f45695135aC12De7" + network: mainnet + bridged-erc-20: + name: bridged_erc20 + address: "0xcc5d488073FA918cBbd73B9A523F3858C4de7372" + network: mainnet + bridge: + name: bridge + address: "0x1670000000000000000000000000000000000001" + network: taikol2 + taiko-l-2: + name: taikoL2 + address: "0x1670000000000000000000000000000000010001" + network: taikol2 + relayers: + taiko-l-2-relayer: + name: TaikoL2Relayer + network: taikol2 + min-balance: "100000000000000000" + policy: ${self:resources.policies.policy-Qe} + api-keys: + - key-1 + taiko-l-1-relayer: + name: TaikoL1Relayer + network: mainnet + min-balance: "100000000000000000" + policy: ${self:resources.policies.policy-hk} + api-keys: + - key-1 + notifications: + discord-bridging: + type: discord + name: discord_bridging + config: + url: >- + https://discord.com/api/webhooks/1079966997816811520/RdYRjk74nbjEPb44tKFGAgYqDRSmmk2BAmShGkpnmm6QpK-21n-Avw5TnVEaJ1CWhE0s + paused: false + monitors: + taiko-l-1-prove-block-tx-failure: + name: "TaikoL1: proveBlock Tx Failure" + type: BLOCK + network: mainnet + addresses: + - "0x06a9Ab27c7e2255df1815E6CC0168d7755Feb19a" + skip-abi-validation: true + paused: false + confirm-level: 6 + notify-config: + timeout: 0 + message: >- + **Defender Monitor {{ monitor.name }} Triggered an Alert at {{ + timestamp }}** + + + **Network:** {{ monitor.network }} + + + **Block Hash:** {{ blockHash }} + + + **Transaction Hash:** {{ transaction.transactionHash }} + + + **Explorer Link:** {{ transaction.link }} + + + **Match Reasons** + + + {{ matchReasonsFormatted }} + + + **Metadata** + + + {{ metadataFormatted }} + message-subject: "[Alert] OpenZeppelin Defender Monitor TaikoL1: proveBlock Tx Failure" + channels: + - ${self:resources.notifications.tg-taiko-guardians} + - ${self:resources.notifications.discord-bridging} + severity-level: HIGH + conditions: + event: + - expression: null + signature: >- + BlockProposed(uint256,address,uint96,(bytes32,bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address),(address,uint96,uint64)[]) + function: + - expression: null + signature: proveBlock(uint64,bytes) + transaction: >- + (status == "failed") AND (from == + "0x000000629FBCf27A347d1AEbA658435230D74a5f" OR from == + "0x000000633b68f5d8d3a86593ebb815b4663bcbe0" OR from == + "0x00000027F51a57E7FcBC4b481d15fcE5BE68b30B") + taiko-l-1-proposed-block-tx-failure: + name: "TaikoL1: ProposedBlock Tx Failure" + type: BLOCK + network: mainnet + addresses: + - "0x06a9Ab27c7e2255df1815E6CC0168d7755Feb19a" + skip-abi-validation: true + paused: false + confirm-level: 1 + notify-config: + timeout: 0 + message: >- + **Defender Monitor {{ monitor.name }} Triggered an Alert at {{ + timestamp }}** + + + **Network:** {{ monitor.network }} + + + **Block Hash:** {{ blockHash }} + + + **Transaction Hash:** {{ transaction.transactionHash }} + + + **Explorer Link:** {{ transaction.link }} + + + **Match Reasons** + + + {{ matchReasonsFormatted }} + + + **Metadata** + + + {{ metadataFormatted }} + message-subject: >- + [Alert] OpenZeppelin Defender Monitor TaikoL1: ProposedBlock Tx + Failure + channels: + - ${self:resources.notifications.discord-bridging} + - ${self:resources.notifications.tg-taiko-guardians} + severity-level: HIGH + conditions: + event: + - expression: null + signature: >- + BlockProposed(uint256,address,uint96,(bytes32,bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address),(address,uint96,uint64)[]) + function: + - expression: null + signature: proposeBlock(bytes,bytes) + transaction: >- + (status == "failed") AND (from == + "0x000000629FBCf27A347d1AEbA658435230D74a5f" OR from == + "0x000000633b68f5d8d3a86593ebb815b4663bcbe0" OR from == + "0x00000027F51a57E7FcBC4b481d15fcE5BE68b30B") + guardian-prover-proving-auto-pause-enabled-alert: + name: "GuardianProver: ProvingAutoPauseEnabled" + type: BLOCK + network: mainnet + addresses: + - "0xE3D777143Ea25A6E031d1e921F396750885f43aC" + skip-abi-validation: false + paused: false + confirm-level: 6 + notify-config: + timeout: 60000 + message: >- + **Defender Monitor {{ monitor.name }} Triggered an Alert at {{ + timestamp }}** + + + **Network:** {{ monitor.network }} + + + **Block Hash:** {{ blockHash }} + + + **Transaction Hash:** {{ transaction.transactionHash }} + + + **Explorer Link:** {{ transaction.link }} + + + **Match Reasons** + + + {{ matchReasonsFormatted }} + + + **Metadata** + + + {{ metadataFormatted }} + message-subject: >- + [Alert] OpenZeppelin Defender Monitor GuardianProver: + ProvingAutoPauseEnabled + channels: + - ${self:resources.notifications.discord-bridging} + - ${self:resources.notifications.tg-taiko-guardians} + severity-level: MEDIUM + conditions: + event: + - expression: null + signature: GuardiansUpdated(uint32,address[]) + guardian-prover-conflicting-proofs-alert: + name: "GuardianProver: ConflictingProofs Alert" + type: BLOCK + network: mainnet + addresses: + - "0xE3D777143Ea25A6E031d1e921F396750885f43aC" + skip-abi-validation: false + paused: false + confirm-level: 1 + notify-config: + timeout: 60000 + message: >- + **Defender Monitor {{ monitor.name }} Triggered an Alert at {{ + timestamp }}** + + + **Network:** {{ monitor.network }} + + + **Block Hash:** {{ blockHash }} + + + **Transaction Hash:** {{ transaction.transactionHash }} + + + **Explorer Link:** {{ transaction.link }} + + + **Match Reasons** + + + {{ matchReasonsFormatted }} + + + **Metadata** + + + {{ metadataFormatted }} + message-subject: >- + [Alert] OpenZeppelin Defender Monitor GuardianProver: + ConflictingProofs Alert + channels: + - ${self:resources.notifications.discord-bridging} + - ${self:resources.notifications.tg-taiko-guardians} + severity-level: MEDIUM + conditions: + event: + - expression: null + signature: ConflictingProofs(uint256,address,bytes32,bytes32,bool) + guardian-prover-guardians-updated-alert: + name: "GuardianProver: GuardiansUpdated Alert" + type: BLOCK + network: mainnet + addresses: + - "0xE3D777143Ea25A6E031d1e921F396750885f43aC" + skip-abi-validation: false + paused: false + confirm-level: 1 + notify-config: + timeout: 60000 + message: >- + **Defender Monitor {{ monitor.name }} Triggered an Alert at {{ + timestamp }}** + + + **Network:** {{ monitor.network }} + + + **Block Hash:** {{ blockHash }} + + + **Transaction Hash:** {{ transaction.transactionHash }} + + + **Explorer Link:** {{ transaction.link }} + + + **Match Reasons** + + + {{ matchReasonsFormatted }} + + + **Metadata** + + + {{ metadataFormatted }} + message-subject: >- + [Alert] OpenZeppelin Defender Monitor GuardianProver: GuardiansUpdated + Alert + channels: + - ${self:resources.notifications.discord-bridging} + - ${self:resources.notifications.tg-taiko-guardians} + severity-level: MEDIUM + conditions: + event: + - expression: null + signature: GuardiansUpdated(uint32,address[]) + taiko-l-1-proving-paused-alert: + name: "TaikoL1: ProvingPaused Alert" + type: BLOCK + network: mainnet + addresses: + - "0x06a9Ab27c7e2255df1815E6CC0168d7755Feb19a" + skip-abi-validation: false + paused: false + confirm-level: 6 + notify-config: + timeout: 60000 + message: >- + **Defender Monitor {{ monitor.name }} Triggered an Alert at {{ + timestamp }}** + + + **Network:** {{ monitor.network }} + + + **Block Hash:** {{ blockHash }} + + + **Transaction Hash:** {{ transaction.transactionHash }} + + + **Explorer Link:** {{ transaction.link }} + + + **Match Reasons** + + + {{ matchReasonsFormatted }} + + + **Metadata** + + + {{ metadataFormatted }} + message-subject: "[Alert] OpenZeppelin Defender Monitor TaikoL1: ProvingPaused Alert" + channels: + - ${self:resources.notifications.discord-bridging} + severity-level: HIGH + conditions: + event: + - expression: null + signature: ProvingPaused(bool) + address-manager-l-2-address-set: + name: "Address Manager (L2): AddressSet" + type: BLOCK + network: taikol2 + addresses: + - "0x1670000000000000000000000000000000000006" + - "0x1670000000000000000000000000000000010002" + skip-abi-validation: false + paused: false + confirm-level: 1 + notify-config: + timeout: 60000 + message: |- + **Defender Monitor {{ sentinel.name }} Triggered** + + **Network** + + {{ sentinel.network }} + + **Block Hash** + + {{ blockHash }} + + **Transaction Hash** + + {{ transaction.transactionHash }} + + **Explorer Link** + + {{ transaction.link }} + + **Match Reasons** + + {{ matchReasonsFormatted }} + + **Metadata** + + {{ metadataFormatted }} + message-subject: "Defender Monitor: Address Manager (L2): AddressSet triggered" + channels: + - ${self:resources.notifications.discord-bridging} + severity-level: MEDIUM + conditions: + event: + - expression: null + signature: AddressSet(uint64,bytes32,address,address) + address-manager-l-1-address-set: + name: "Address Manager (L1): AddressSet" + type: BLOCK + network: mainnet + addresses: + - "0x579f40D0BE111b823962043702cabe6Aaa290780" + - "0xEf9EaA1dd30a9AA1df01c36411b5F082aA65fBaa" + skip-abi-validation: false + paused: true + confirm-level: 9007199254740991 + notify-config: + timeout: 60000 + message: |- + **Defender Monitor {{ sentinel.name }} Triggered** + + **Network** + + {{ sentinel.network }} + + **Block Hash** + + {{ blockHash }} + + **Transaction Hash** + + {{ transaction.transactionHash }} + + **Explorer Link** + + {{ transaction.link }} + + **Match Reasons** + + {{ matchReasonsFormatted }} + + **Metadata** + + {{ metadataFormatted }} + message-subject: "Defender Monitor: Address Manager (L1): AddressSet triggered" + channels: [] + severity-level: MEDIUM + conditions: + event: + - expression: null + signature: AddressSet(uint64,bytes32,address,address) + taiko-l-2-pause-unpause: + name: "TaikoL2: Pause/Unpause" + type: BLOCK + network: taikol2 + addresses: + - "0xbd0999f42742ed29d3311fc5fb5c609be008e9e5" + - "0x1670000000000000000000000000000000000001" + - "0x1670000000000000000000000000000000000002" + - "0x1670000000000000000000000000000000000003" + - "0x1670000000000000000000000000000000000004" + - "0x1670000000000000000000000000000000000005" + - "0x1670000000000000000000000000000000000006" + - "0x1670000000000000000000000000000000010001" + - "0x1670000000000000000000000000000000010002" + skip-abi-validation: true + paused: false + confirm-level: 1 + notify-config: + timeout: 60000 + message: |- + **Defender Monitor {{ sentinel.name }} Triggered** + + **Network** + + {{ sentinel.network }} + + **Block Hash** + + {{ blockHash }} + + **Transaction Hash** + + {{ transaction.transactionHash }} + + **Explorer Link** + + {{ transaction.link }} + + **Match Reasons** + + {{ matchReasonsFormatted }} + + **Metadata** + + {{ metadataFormatted }} + message-subject: "Defender Monitor: TaikoL2: Pause/Unpause triggered" + channels: + - ${self:resources.notifications.discord-bridging} + severity-level: MEDIUM + conditions: + event: + - expression: null + signature: Paused(address) + - expression: null + signature: Unpaused(address) + taiko-l-1-pause-unpause: + name: "TaikoL1: Pause/Unpause" + type: BLOCK + network: mainnet + addresses: + - "0x02772b7B3a5Bea0141C993Dbb8D0733C19F46169" + - "0x06a9Ab27c7e2255df1815E6CC0168d7755Feb19a" + - "0x0b470dd3A0e1C41228856Fb319649E7c08f419Aa" + - "0x10dea67478c5F8C5E2D90e5E9B26dBe60c54d800" + - "0x11A9ebA17EbF92b40fcf9a640Ebbc47Db6fBeab0" + - "0x33879cDF01121dc7bCe011b461e64d791aE931F2" + - "0x39E4C1214e733639d059979079A151911e42791d" + - "0x47bB416ee947fE4a4b655011aF7d6E3A1B80E6e9" + - "0x537a2f0D3a5879b41BCb5A2afE2EA5c4961796F6" + - "0x579A8d63a2Db646284CBFE31FE5082c9989E985c" + - "0x579f40D0BE111b823962043702cabe6Aaa290780" + - "0x67281b15aee4d6b805bc755e439abd524dd8da8d" + - "0x8d7C954960a36a7596d7eA4945dDf891967ca8A3" + - "0x996282cA11E5DEb6B5D122CC3B9A1FcAAD4415Ab" + - "0x9e0a24964e5397B566c1ed39258e21aB5E35C77C" + - "0xE3D777143Ea25A6E031d1e921F396750885f43aC" + - "0xEf9EaA1dd30a9AA1df01c36411b5F082aA65fBaa" + - "0xa25e645ff9897b0282e5f17d36de5bca4ec21d6e" + - "0xaf145913EA4a56BE22E120ED9C24589659881702" + - "0xb0f3186FC1963f774f52ff455DC86aEdD0b31F81" + - "0xc4096E9ff1526Bd1840B65e9f45695135aC12De7" + - "0xcc5d488073FA918cBbd73B9A523F3858C4de7372" + - "0xd60247c6848B7Ca29eDdF63AA924E53dB6Ddd8EC" + skip-abi-validation: true + paused: false + confirm-level: 6 + notify-config: + timeout: 60000 + message: |- + **Defender Monitor {{ sentinel.name }} Triggered** + + **Network** + + {{ sentinel.network }} + + **Block Hash** + + {{ blockHash }} + + **Transaction Hash** + + {{ transaction.transactionHash }} + + **Explorer Link** + + {{ transaction.link }} + + **Match Reasons** + + {{ matchReasonsFormatted }} + + **Metadata** + + {{ metadataFormatted }} + message-subject: "Defender Monitor: TaikoL1: Pause/Unpause triggered" + channels: + - ${self:resources.notifications.discord-bridging} + severity-level: MEDIUM + conditions: + event: + - expression: null + signature: Paused(address) + - expression: null + signature: Unpaused(address) + taiko-mainnet-sgx-prover: + name: Taiko Mainnet SGX Prover + type: BLOCK + network: mainnet + addresses: + - "0xb0f3186FC1963f774f52ff455DC86aEdD0b31F81" + skip-abi-validation: false + paused: false + confirm-level: 1 + notify-config: + timeout: 0 + message: |- + **Defender Monitor {{ sentinel.name }} Triggered** + + **Network** + + {{ sentinel.network }} + + **Block Hash** + + {{ blockHash }} + + **Transaction Hash** + + {{ transaction.transactionHash }} + + **Explorer Link** + + {{ transaction.link }} + + {{ matchReasonsFormatted }} + message-subject: "Defender Monitor: Taiko Mainnet SGX Prover triggered" + channels: + - ${self:resources.notifications.discord-bridging} + severity-level: LOW + conditions: + event: + - expression: null + signature: InstanceAdded(uint256,address,address,uint256) + - expression: null + signature: InstanceDeleted(uint256,address) + function: + - expression: null + signature: >- + verifyProof((bytes32,bytes32,address,uint64,bool,bool,address),(bytes32,bytes32,bytes32,bytes32),(uint16,bytes)) + transaction: status == "failed" + taiko-mainnet-address-managers: + name: Taiko Mainnet Address Managers + type: BLOCK + network: mainnet + addresses: + - "0xEf9EaA1dd30a9AA1df01c36411b5F082aA65fBaa" + - "0x579f40D0BE111b823962043702cabe6Aaa290780" + skip-abi-validation: false + paused: false + confirm-level: 1 + notify-config: + timeout: 0 + message: |- + **Defender Monitor {{ sentinel.name }} Triggered** + + **Network** + + {{ sentinel.network }} + + **Block Hash** + + {{ blockHash }} + + **Transaction Hash** + + {{ transaction.transactionHash }} + + **Explorer Link** + + {{ transaction.link }} + + {{ matchReasonsFormatted }} + message-subject: "Defender Monitor: Taiko Mainnet Address Managers triggered" + channels: + - ${self:resources.notifications.discord-bridging} + severity-level: HIGH + conditions: + event: + - expression: null + signature: AddressSet(uint64,bytes32,address,address) + taiko-mainnet-essential-contracts: + name: Taiko Mainnet Essential Contracts + type: BLOCK + network: mainnet + addresses: + - "0xEf9EaA1dd30a9AA1df01c36411b5F082aA65fBaa" + - "0x10dea67478c5F8C5E2D90e5E9B26dBe60c54d800" + - "0x9e0a24964e5397B566c1ed39258e21aB5E35C77C" + - "0xd60247c6848B7Ca29eDdF63AA924E53dB6Ddd8EC" + - "0x996282cA11E5DEb6B5D122CC3B9A1FcAAD4415Ab" + - "0x0b470dd3A0e1C41228856Fb319649E7c08f419Aa" + - "0x0b470dd3A0e1C41228856Fb319649E7c08f419Aa" + - "0xaf145913EA4a56BE22E120ED9C24589659881702" + - "0x579f40D0BE111b823962043702cabe6Aaa290780" + - "0x06a9Ab27c7e2255df1815E6CC0168d7755Feb19a" + - "0x537a2f0D3a5879b41BCb5A2afE2EA5c4961796F6" + - "0x33879cDF01121dc7bCe011b461e64d791aE931F2" + - "0xb0f3186FC1963f774f52ff455DC86aEdD0b31F81" + - "0x579A8d63a2Db646284CBFE31FE5082c9989E985c" + - "0xE3D777143Ea25A6E031d1e921F396750885f43aC" + - "0x8d7C954960a36a7596d7eA4945dDf891967ca8A3" + skip-abi-validation: false + paused: false + confirm-level: 1 + notify-config: + timeout: 0 + message: |- + **Defender Monitor {{ sentinel.name }} Triggered** + + **Network** + + {{ sentinel.network }} + + **Block Hash** + + {{ blockHash }} + + **Transaction Hash** + + {{ transaction.transactionHash }} + + **Explorer Link** + + {{ transaction.link }} + + {{ matchReasonsFormatted }} + message-subject: "Defender Monitor: Taiko Mainnet Essential Contracts triggered" + channels: + - ${self:resources.notifications.discord-bridging} + severity-level: HIGH + conditions: + event: + - expression: null + signature: AdminChanged(address,address) + - expression: null + signature: BeaconUpgraded(address) + - expression: null + signature: Initialized(uint8) + - expression: null + signature: OwnershipTransferStarted(address,address) + - expression: null + signature: OwnershipTransferred(address,address) + - expression: null + signature: Paused(address) + - expression: null + signature: Unpaused(address) + - expression: null + signature: Upgraded(address) + forked-networks: {} + private-networks: + taikol2: + name: taikol2 + rpc-url: https://rpc.mainnet.taiko.xyz + configuration: + symbol: ETH + eips: + isEIP1559: true + block-explorer-api-keys: {} +plugins: + - "@openzeppelin/defender-as-code" diff --git a/packages/monitors/package.json b/packages/monitors/package.json new file mode 100644 index 00000000000..fa01b245454 --- /dev/null +++ b/packages/monitors/package.json @@ -0,0 +1,16 @@ +{ + "name": "monitors", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "keywords": [], + "author": "", + "license": "ISC", + "devDependencies": { + "@openzeppelin/defender-as-code": "^3.0.1", + "serverless": "4.4.3" + } +} diff --git a/packages/nfts/README.md b/packages/nfts/README.md index fa7c0c91fb8..af6f8cd3fe8 100644 --- a/packages/nfts/README.md +++ b/packages/nfts/README.md @@ -2,7 +2,7 @@ ## Setup -To run in localhost, first, start an Anvil node: +To run on localhost, first, start an Anvil node: ```shell $ pnpm node @@ -20,7 +20,7 @@ $ pnpm install # installs the workspace's dependencies ## Deploying the Taikoons -In order to deploy the token, the images for the NFTs must be placed under `data/original/`. The following script will re-size them and upload them to IPFS: +In order to deploy the token, the images for the NFTs must be placed under `data/original/`. The following script will resize them and upload them to IPFS: ```shell $ pnpm deploy:ipfs diff --git a/packages/nfts/contract_layout.md b/packages/nfts/contract_layout.md new file mode 100644 index 00000000000..01a91eacf3f --- /dev/null +++ b/packages/nfts/contract_layout.md @@ -0,0 +1,56 @@ +## MerkleWhitelist + +| Name | Type | Slot | Offset | Bytes | Contract | +| --------- | -------------------------- | ---- | ------ | ----- | ------------------------------------------------------ | +| root | bytes32 | 0 | 0 | 32 | contracts/snaefell/MerkleWhitelist.sol:MerkleWhitelist | +| minted | mapping(bytes32 => bool) | 1 | 0 | 32 | contracts/snaefell/MerkleWhitelist.sol:MerkleWhitelist | +| blacklist | contract IMinimalBlacklist | 2 | 0 | 20 | contracts/snaefell/MerkleWhitelist.sol:MerkleWhitelist | +| \_\_gap | uint256[48] | 3 | 0 | 1536 | contracts/snaefell/MerkleWhitelist.sol:MerkleWhitelist | + +## TaikoonToken + +| Name | Type | Slot | Offset | Bytes | Contract | +| ----------------- | -------------------------- | ---- | ------ | ----- | ----------------------------------------------- | +| root | bytes32 | 0 | 0 | 32 | contracts/taikoon/TaikoonToken.sol:TaikoonToken | +| minted | mapping(bytes32 => bool) | 1 | 0 | 32 | contracts/taikoon/TaikoonToken.sol:TaikoonToken | +| blacklist | contract IMinimalBlacklist | 2 | 0 | 20 | contracts/taikoon/TaikoonToken.sol:TaikoonToken | +| \_\_gap | uint256[47] | 3 | 0 | 1504 | contracts/taikoon/TaikoonToken.sol:TaikoonToken | +| \_totalSupply | uint256 | 50 | 0 | 32 | contracts/taikoon/TaikoonToken.sol:TaikoonToken | +| \_baseURIExtended | string | 51 | 0 | 32 | contracts/taikoon/TaikoonToken.sol:TaikoonToken | +| \_\_gap | uint256[47] | 52 | 0 | 1504 | contracts/taikoon/TaikoonToken.sol:TaikoonToken | + +## SnaefellToken + +| Name | Type | Slot | Offset | Bytes | Contract | +| ----------------- | -------------------------- | ---- | ------ | ----- | -------------------------------------------------- | +| root | bytes32 | 0 | 0 | 32 | contracts/snaefell/SnaefellToken.sol:SnaefellToken | +| minted | mapping(bytes32 => bool) | 1 | 0 | 32 | contracts/snaefell/SnaefellToken.sol:SnaefellToken | +| blacklist | contract IMinimalBlacklist | 2 | 0 | 20 | contracts/snaefell/SnaefellToken.sol:SnaefellToken | +| \_\_gap | uint256[48] | 3 | 0 | 1536 | contracts/snaefell/SnaefellToken.sol:SnaefellToken | +| \_totalSupply | uint256 | 51 | 0 | 32 | contracts/snaefell/SnaefellToken.sol:SnaefellToken | +| \_baseURIExtended | string | 52 | 0 | 32 | contracts/snaefell/SnaefellToken.sol:SnaefellToken | +| \_\_gap | uint256[48] | 53 | 0 | 1536 | contracts/snaefell/SnaefellToken.sol:SnaefellToken | + +## ECDSAWhitelist + +| Name | Type | Slot | Offset | Bytes | Contract | +| ---------- | -------------------------- | ---- | ------ | ----- | --------------------------------------------------------------- | +| mintSigner | address | 0 | 0 | 20 | contracts/trailblazers-badges/ECDSAWhitelist.sol:ECDSAWhitelist | +| minted | mapping(bytes32 => bool) | 1 | 0 | 32 | contracts/trailblazers-badges/ECDSAWhitelist.sol:ECDSAWhitelist | +| blacklist | contract IMinimalBlacklist | 2 | 0 | 20 | contracts/trailblazers-badges/ECDSAWhitelist.sol:ECDSAWhitelist | +| \_\_gap | uint256[47] | 3 | 0 | 1504 | contracts/trailblazers-badges/ECDSAWhitelist.sol:ECDSAWhitelist | + +## TrailblazersBadges + +| Name | Type | Slot | Offset | Bytes | Contract | +| ----------------- | ----------------------------------------------- | ---- | ------ | ----- | ----------------------------------------------------------------------- | +| mintSigner | address | 0 | 0 | 20 | contracts/trailblazers-badges/TrailblazersBadges.sol:TrailblazersBadges | +| minted | mapping(bytes32 => bool) | 1 | 0 | 32 | contracts/trailblazers-badges/TrailblazersBadges.sol:TrailblazersBadges | +| blacklist | contract IMinimalBlacklist | 2 | 0 | 20 | contracts/trailblazers-badges/TrailblazersBadges.sol:TrailblazersBadges | +| \_\_gap | uint256[47] | 3 | 0 | 1504 | contracts/trailblazers-badges/TrailblazersBadges.sol:TrailblazersBadges | +| \_baseURIExtended | string | 50 | 0 | 32 | contracts/trailblazers-badges/TrailblazersBadges.sol:TrailblazersBadges | +| badges | mapping(uint256 => uint256) | 51 | 0 | 32 | contracts/trailblazers-badges/TrailblazersBadges.sol:TrailblazersBadges | +| movements | mapping(address => uint256) | 52 | 0 | 32 | contracts/trailblazers-badges/TrailblazersBadges.sol:TrailblazersBadges | +| userBadges | mapping(address => mapping(uint256 => uint256)) | 53 | 0 | 32 | contracts/trailblazers-badges/TrailblazersBadges.sol:TrailblazersBadges | +| movementBadges | mapping(bytes32 => uint256[2]) | 54 | 0 | 32 | contracts/trailblazers-badges/TrailblazersBadges.sol:TrailblazersBadges | +| \_\_gap | uint256[43] | 55 | 0 | 1376 | contracts/trailblazers-badges/TrailblazersBadges.sol:TrailblazersBadges | diff --git a/packages/nfts/contracts/eventRegister/EventRegister.sol b/packages/nfts/contracts/eventRegister/EventRegister.sol new file mode 100644 index 00000000000..779bb94b543 --- /dev/null +++ b/packages/nfts/contracts/eventRegister/EventRegister.sol @@ -0,0 +1,282 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24.0; + +import { Ownable2StepUpgradeable } from + "@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol"; +import { AccessControlUpgradeable } from + "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol"; +/** + * @title EventRegister + * @notice A contract that allows authorized managers to create events, manage user registrations, + * and track user participation using role-based access control. + * @dev Utilizes OpenZeppelin's AccessControl for role management. The contract does not hold any + * Ether. + */ + +contract EventRegister is Ownable2StepUpgradeable, AccessControlUpgradeable { + /** + * @dev The role identifier for event managers. This role allows accounts to create events + * and manage registrations. + */ + bytes32 public constant EVENT_MANAGER_ROLE = keccak256("EVENT_MANAGER_ROLE"); + + /** + * @dev Represents an event with its associated details. + */ + struct Event { + ///< Unique identifier for the event. + uint256 id; + ///< Name of the event. + string name; + ///< Flag indicating whether the event exists. + bool exists; + ///< Flag indicating whether registrations are open for the event. + bool registrationOpen; + } + + /** + * @dev Mapping from event ID to Event details. + */ + mapping(uint256 eventId => Event eventData) public events; + + /** + * @dev Mapping from event ID to a mapping of user addresses to their registration status. + * Indicates whether a user has registered for a specific event. + */ + mapping(uint256 eventId => mapping(address registrant => bool isRegistered)) public isRegistered; + + /** + * @dev Emitted when a new event is created. + * @param id The unique identifier of the created event. + * @param name The name of the created event. + */ + event EventCreated(uint256 id, string name); + + /** + * @dev Emitted when a user registers for an event. + * @param registrant The address of the user who registered. + * @param eventId The unique identifier of the event for which the user registered. + */ + event Registered(address indexed registrant, uint256 eventId); + + /** + * @dev Emitted when a user unregisters for an event. + * @param registrant The address of the user who unregistered. + * @param eventId The unique identifier of the event for which the user unregistered. + */ + event Unregistered(address indexed registrant, uint256 eventId); + + /** + * @dev Emitted when registrations are opened for an event. + * @param eventId The unique identifier of the event whose registrations are opened. + */ + event RegistrationOpened(uint256 eventId); + + /** + * @dev Emitted when registrations are closed for an event. + * @param eventId The unique identifier of the event whose registrations are closed. + */ + event RegistrationClosed(uint256 eventId); + + /** + * @dev Counter for assigning unique event IDs. + */ + uint256 private nextEventId; + + /** + * @notice Contract initializer + * @dev Initializes the contract by granting the deployer the default admin role. + * The deployer is also granted the EVENT_MANAGER_ROLE. + * The deployer is set as the owner of the contract. + */ + function initialize() external initializer { + __Context_init(); + _grantRole(EVENT_MANAGER_ROLE, _msgSender()); + _transferOwnership(_msgSender()); + } + + /** + * @notice Initializes the contract by granting the deployer the default admin role. + * @dev The deployer of the contract is granted the DEFAULT_ADMIN_ROLE, allowing them to manage + * roles. + */ + constructor() { + _grantRole(DEFAULT_ADMIN_ROLE, _msgSender()); + } + + /** + * @notice Grants the EVENT_MANAGER_ROLE to a specified account. + * @dev Only accounts with the DEFAULT_ADMIN_ROLE can call this function. + * @param account The address to be granted the EVENT_MANAGER_ROLE. + * + * Requirements: + * + * - The caller must have the DEFAULT_ADMIN_ROLE. + */ + function grantEventManagerRole(address account) external onlyRole(DEFAULT_ADMIN_ROLE) { + grantRole(EVENT_MANAGER_ROLE, account); + } + + /** + * @notice Revokes the EVENT_MANAGER_ROLE from a specified account. + * @dev Only accounts with the DEFAULT_ADMIN_ROLE can call this function. + * @param account The address from which the EVENT_MANAGER_ROLE will be revoked. + * + * Requirements: + * + * - The caller must have the DEFAULT_ADMIN_ROLE. + */ + function revokeEventManagerRole(address account) external onlyRole(DEFAULT_ADMIN_ROLE) { + revokeRole(EVENT_MANAGER_ROLE, account); + } + + /** + * @notice Creates a new event with the given name. + * @dev Only accounts with the EVENT_MANAGER_ROLE can call this function. + * Emits EventCreated and RegistrationOpened events upon successful creation. + * @param _name The name of the event to be created. + * + * Requirements: + * + * - The caller must have the EVENT_MANAGER_ROLE. + */ + function createEvent(string memory _name) external onlyRole(EVENT_MANAGER_ROLE) { + uint256 eventId = nextEventId; + events[eventId] = Event({ id: eventId, name: _name, exists: true, registrationOpen: true }); + emit EventCreated(eventId, _name); + emit RegistrationOpened(eventId); // Emit event indicating registrations are open + nextEventId++; + } + + /** + * @notice Opens registrations for a specific event. + * @dev Only accounts with the EVENT_MANAGER_ROLE can call this function. + * Emits a RegistrationOpened event upon successful operation. + * @param _eventId The unique identifier of the event for which to open registrations. + * + * Requirements: + * + * - The event with `_eventId` must exist. + * - Registrations for the event must currently be closed. + * - The caller must have the EVENT_MANAGER_ROLE. + */ + function openRegistration(uint256 _eventId) external onlyRole(EVENT_MANAGER_ROLE) { + require(events[_eventId].exists, "Event not found"); + require(!events[_eventId].registrationOpen, "Already open"); + + events[_eventId].registrationOpen = true; + emit RegistrationOpened(_eventId); + } + + /** + * @notice Closes registrations for a specific event. + * @dev Only accounts with the EVENT_MANAGER_ROLE can call this function. + * Emits a RegistrationClosed event upon successful operation. + * @param _eventId The unique identifier of the event for which to close registrations. + * + * Requirements: + * + * - The event with `_eventId` must exist. + * - Registrations for the event must currently be open. + * - The caller must have the EVENT_MANAGER_ROLE. + */ + function closeRegistration(uint256 _eventId) external onlyRole(EVENT_MANAGER_ROLE) { + require(events[_eventId].exists, "Event not found"); + require(events[_eventId].registrationOpen, "Already closed"); + + events[_eventId].registrationOpen = false; + emit RegistrationClosed(_eventId); + } + + /** + * @notice Allows a user to register for a specific event. + * @dev Emits a Registered event upon successful registration. + * @param _eventId The unique identifier of the event to register for. + * + * Requirements: + * + * - The event with `_eventId` must exist. + * - Registrations for the event must be open. + * - The caller must not have already registered for the event. + */ + function register(uint256 _eventId) external { + Event memory currentEvent = events[_eventId]; + require(currentEvent.exists, "Event not found"); + require(currentEvent.registrationOpen, "Registrations closed"); + require(!isRegistered[_eventId][msg.sender], "Already registered"); + + isRegistered[_eventId][msg.sender] = true; + + emit Registered(msg.sender, _eventId); + } + + /** + * @notice Allows the event manager to unregister a user from a specific event. + * @dev Emits an Unregistered event upon successful un-registration. + * @param _eventId The unique identifier of the event to unregister from. + * @param _user The address of the user to unregister. + * + * Requirements: + * - The event with `_eventId` must exist. + * - Registrations for the event must be open. + * - The user must be registered for the event. + */ + function unregister(uint256 _eventId, address _user) external onlyRole(EVENT_MANAGER_ROLE) { + Event memory currentEvent = events[_eventId]; + require(currentEvent.exists, "Event not found"); + require(currentEvent.registrationOpen, "Registrations closed"); + require(isRegistered[_eventId][_user], "Not registered"); + + isRegistered[_eventId][_user] = false; + emit Unregistered(_user, _eventId); + } + + /** + * @notice Retrieves all event IDs for which a user has registered. + * @dev Iterates through all existing events to compile a list of registrations. + * @param _user The address of the user whose registrations are to be retrieved. + * @return An array of event IDs that the user has registered for. + * + */ + function getRegisteredEvents(address _user) external view returns (uint256[] memory) { + uint256[] memory temp = new uint256[](nextEventId); + uint256 count = 0; + + for (uint256 i = 0; i < nextEventId; i++) { + if (isRegistered[i][_user]) { + temp[count] = i; + count++; + } + } + + // Create a fixed-size array to return + uint256[] memory registeredEvents = new uint256[](count); + for (uint256 j = 0; j < count; j++) { + registeredEvents[j] = temp[j]; + } + + return registeredEvents; + } + + /** + * @notice Retrieves the details of a specific event. + * @dev Returns the event's ID, name, and registration status. + * @param _eventId The unique identifier of the event to retrieve. + * @return id The unique identifier of the event. + * @return name The name of the event. + * @return registrationOpen_ A boolean indicating whether registrations are open for the event. + * + * Requirements: + * + * - The event with `_eventId` must exist. + */ + function getEvent(uint256 _eventId) + external + view + returns (uint256 id, string memory name, bool registrationOpen_) + { + require(events[_eventId].exists, "Event not found"); + Event memory e = events[_eventId]; + return (e.id, e.name, e.registrationOpen); + } +} diff --git a/packages/nfts/contracts/galxe/RegisterGalxePoints.sol b/packages/nfts/contracts/galxe/RegisterGalxePoints.sol new file mode 100644 index 00000000000..c303158754a --- /dev/null +++ b/packages/nfts/contracts/galxe/RegisterGalxePoints.sol @@ -0,0 +1,14 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.24; + +contract RegisterGalxePoints { + mapping(address => bool) public alreadyRegistered; + + event Registered(address registrant); + + function register() public { + require(!alreadyRegistered[msg.sender], "Address already registered"); + alreadyRegistered[msg.sender] = true; + emit Registered(msg.sender); + } +} diff --git a/packages/nfts/contracts/party-ticket/TaikoPartyTicket.sol b/packages/nfts/contracts/party-ticket/TaikoPartyTicket.sol new file mode 100644 index 00000000000..b0883734186 --- /dev/null +++ b/packages/nfts/contracts/party-ticket/TaikoPartyTicket.sol @@ -0,0 +1,298 @@ +// SPDX-License-Identifier: MIT +// Compatible with OpenZeppelin Contracts ^5.0.0 +pragma solidity ^0.8.24; + +import "@openzeppelin/contracts/token/ERC721/ERC721.sol"; +import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Pausable.sol"; +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "@openzeppelin/contracts/utils/Strings.sol"; +import { ERC721EnumerableUpgradeable } from + "@openzeppelin/contracts-upgradeable/token/ERC721/extensions/ERC721EnumerableUpgradeable.sol"; +import { AccessControlUpgradeable } from + "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol"; +import { PausableUpgradeable } from + "@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol"; +import { IMinimalBlacklist } from "@taiko/blacklist/IMinimalBlacklist.sol"; +import { UUPSUpgradeable } from + "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; +import { Ownable2StepUpgradeable } from + "@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol"; + +/// @title TaikoPartyTicket +/// @dev ERC-721 KBW Raffle & Party Tickets +/// @custom:security-contact security@taiko.xyz +contract TaikoPartyTicket is + ERC721EnumerableUpgradeable, + PausableUpgradeable, + UUPSUpgradeable, + Ownable2StepUpgradeable, + AccessControlUpgradeable +{ + event BlacklistUpdated(address _blacklist); + + /// @notice Mint fee + uint256 public mintFee; + /// @notice Mint active flag + bool public mintActive; + /// @notice Token ID to winner mapping + mapping(uint256 tokenId => bool isWinner) public winners; + /// @notice Base URI required to interact with IPFS + string public baseURI; + /// @notice Winner base URI required to interact with IPFS + string public winnerBaseURI; + /// @notice Payout address + address public payoutAddress; + /// @notice Internal counter for token IDs + uint256 private _nextTokenId; + /// @notice Blackist address + IMinimalBlacklist public blacklist; + /// @notice Convenience array for winners + uint256[] public winnerIds; + /// @notice Gap for upgrade safety + uint256[42] private __gap; + + error INSUFFICIENT_MINT_FEE(); + error CANNOT_REVOKE_NON_WINNER(); + error ADDRESS_BLACKLISTED(); + + /// @notice Contract initializer + /// @param _payoutAddress The address to receive mint fees + /// @param _mintFee The fee to mint a ticket + /// @param _baseURI Base URI for the token metadata pre-raffle + /// @param _blacklistAddress The address of the blacklist contract + function initialize( + address _payoutAddress, + uint256 _mintFee, + string memory _baseURI, + IMinimalBlacklist _blacklistAddress + ) + external + initializer + { + __ERC721_init("TaikoPartyTicket", "TPT"); + __Context_init(); + mintFee = _mintFee; + baseURI = _baseURI; + payoutAddress = _payoutAddress; + blacklist = _blacklistAddress; + + _grantRole(DEFAULT_ADMIN_ROLE, _msgSender()); + + _transferOwnership(_msgSender()); + } + + /// @notice Modifier to check if an address is blacklisted + /// @param _address The address to check + modifier notBlacklisted(address _address) { + if (blacklist.isBlacklisted(_address)) revert ADDRESS_BLACKLISTED(); + _; + } + + /// @notice Update the blacklist address + /// @param _blacklist The new blacklist address + function updateBlacklist(IMinimalBlacklist _blacklist) external onlyRole(DEFAULT_ADMIN_ROLE) { + blacklist = _blacklist; + emit BlacklistUpdated(address(_blacklist)); + } + + /// @notice Get individual token's URI + /// @param tokenId The token ID + /// @return The token URI + function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { + if (winnerIds.length == 0) { + return string(abi.encodePacked(baseURI, "/raffle.json")); + } else if (winners[tokenId]) { + return string(abi.encodePacked(baseURI, "/winner.json")); + } else { + return string(abi.encodePacked(baseURI, "/loser.json")); + } + } + + /// @notice Checks if a tokenId is a winner + /// @param tokenId The token ID + /// @return Whether the token is a winner + function isWinner(uint256 tokenId) public view returns (bool) { + return winners[tokenId]; + } + + /// @notice Checks if an address is a winner + /// @param minter The address to check + /// @return Whether the address is a winner + function isWinner(address minter) public view returns (bool) { + for (uint256 i = 0; i < balanceOf(minter); i++) { + if (winners[tokenOfOwnerByIndex(minter, i)]) { + return true; + } + } + return false; + } + + /// @notice Set the winners + /// @param _winners The list of winning token ids + function setWinners(uint256[] calldata _winners) + external + whenPaused + onlyRole(DEFAULT_ADMIN_ROLE) + { + for (uint256 i = 0; i < _winners.length; i++) { + winners[_winners[i]] = true; + winnerIds.push(_winners[i]); + } + } + + /// @notice Set the base URI + /// @param _baseURI The new base URI + function setBaseURI(string memory _baseURI) external onlyRole(DEFAULT_ADMIN_ROLE) { + baseURI = _baseURI; + } + + /// @notice Set the winner base URI + /// @param _winnerBaseURI The new winner base URI + function setWinnerURI(string memory _winnerBaseURI) external onlyRole(DEFAULT_ADMIN_ROLE) { + winnerBaseURI = _winnerBaseURI; + } + + /// @notice Mint a raffle ticket + /// @dev Requires a fee to mint + /// @dev Requires the contract to not be paused + function mint() external payable whenNotPaused notBlacklisted(_msgSender()) { + if (msg.value < mintFee) revert INSUFFICIENT_MINT_FEE(); + uint256 tokenId = _nextTokenId++; + _safeMint(msg.sender, tokenId); + } + + /// @notice Mint multiple raffle tickets + /// @param amount The number of tickets to mint + /// @dev Requires a fee to mint + /// @dev Requires the contract to not be paused + function mint(uint256 amount) external payable whenNotPaused notBlacklisted(_msgSender()) { + if (msg.value < mintFee * amount) revert INSUFFICIENT_MINT_FEE(); + for (uint256 i = 0; i < amount; i++) { + uint256 tokenId = _nextTokenId++; + _safeMint(msg.sender, tokenId); + } + } + + /// @notice Mint a raffle ticket + /// @param to The address to mint to + /// @dev Requires the contract to not be paused + /// @dev Can only be called by the admin + function mint(address to) + public + whenNotPaused + onlyRole(DEFAULT_ADMIN_ROLE) + notBlacklisted(to) + { + uint256 tokenId = _nextTokenId++; + _safeMint(to, tokenId); + } + + /// @notice Mint a winner ticket + /// @param to The address to mint to + /// @dev Requires calling as an admin + function mintWinner(address to) public onlyRole(DEFAULT_ADMIN_ROLE) notBlacklisted(to) { + uint256 tokenId = _nextTokenId++; + winners[tokenId] = true; + _safeMint(to, tokenId); + } + + /// @notice Revoke a winner's status + /// @param tokenId The ID of the winner to revoke + function revokeWinner(uint256 tokenId) public onlyRole(DEFAULT_ADMIN_ROLE) { + winners[tokenId] = false; + + for (uint256 i = 0; i < winnerIds.length; i++) { + if (winnerIds[i] == tokenId) { + winnerIds[i] = winnerIds[winnerIds.length - 1]; + winnerIds.pop(); + break; + } + } + } + + /// @notice Revoke a winner's status + /// @param tokenIds The IDs of the winner to revoke + function revokeWinners(uint256[] calldata tokenIds) external onlyRole(DEFAULT_ADMIN_ROLE) { + for (uint256 i = 0; i < tokenIds.length; i++) { + revokeWinner(tokenIds[i]); + } + } + + /// @notice Revoke a winner and replace with a new winner + /// @param revokeId The ID of the winner to revoke + /// @param newWinnerId The ID of the new winner + function revokeAndReplaceWinner( + uint256 revokeId, + uint256 newWinnerId + ) + external + onlyRole(DEFAULT_ADMIN_ROLE) + { + if (!winners[revokeId]) revert CANNOT_REVOKE_NON_WINNER(); + revokeWinner(revokeId); + winners[newWinnerId] = true; + winnerIds.push(newWinnerId); + } + + /// @notice Pause the contract + /// @dev Can only be called by the admin + function pause() public onlyRole(DEFAULT_ADMIN_ROLE) { + _pause(); + } + + /// @notice Unpause the contract + /// @dev Can only be called by the admin + function unpause() public onlyRole(DEFAULT_ADMIN_ROLE) { + _unpause(); + } + + /// @notice Update the payout address + /// @param _payoutAddress The new payout address + function updatePayoutAddress(address _payoutAddress) external onlyRole(DEFAULT_ADMIN_ROLE) { + payoutAddress = _payoutAddress; + } + + /// @notice Withdraw the contract balance + /// @dev Can only be called by the admin + /// @dev Requires the contract to be paused + function payout() external whenPaused onlyRole(DEFAULT_ADMIN_ROLE) { + payable(payoutAddress).transfer(address(this).balance); + } + + /// @notice Get the winner token IDs + /// @return The winner token IDs + function getWinnerTokenIds() public view whenPaused returns (uint256[] memory) { + return winnerIds; + } + + /// @notice Get the winner addresses + /// @return _winners The winner addresses + function getWinners() public view whenPaused returns (address[] memory _winners) { + _winners = new address[](winnerIds.length); + for (uint256 i = 0; i < winnerIds.length; i++) { + _winners[i] = ownerOf(winnerIds[i]); + } + return _winners; + } + + /// @notice Get the winner addresses + /// @return bool if the winners have been set + function areWinnersSet() public view returns (bool) { + return winnerIds.length > 0; + } + + /// @notice supportsInterface implementation + /// @param interfaceId The interface ID + /// @return Whether the interface is supported + function supportsInterface(bytes4 interfaceId) + public + view + override(ERC721EnumerableUpgradeable, AccessControlUpgradeable) + returns (bool) + { + return super.supportsInterface(interfaceId); + } + + /// @notice Internal method to authorize an upgrade + function _authorizeUpgrade(address) internal virtual override onlyOwner { } +} diff --git a/packages/nfts/contracts/party-ticket/TaikoPartyTicketV2.sol b/packages/nfts/contracts/party-ticket/TaikoPartyTicketV2.sol new file mode 100644 index 00000000000..ac0d97b7473 --- /dev/null +++ b/packages/nfts/contracts/party-ticket/TaikoPartyTicketV2.sol @@ -0,0 +1,51 @@ +// SPDX-License-Identifier: MIT +// Compatible with OpenZeppelin Contracts ^5.0.0 +pragma solidity ^0.8.24; + +import { TaikoPartyTicket } from "./TaikoPartyTicket.sol"; + +/// @title TaikoPartyTicketV2 +/// @dev Upgrade to support Golden Ticket (winner of winners, singular) ticket +/// @custom:security-contact security@taiko.xyz +contract TaikoPartyTicketV2 is TaikoPartyTicket { + /// @notice Get the version of the contract + /// @return The version of the contract + function version() public pure returns (string memory) { + return "v2"; + } + + /// @notice Get individual token's URI + /// @param tokenId The token ID + /// @return The token URI + /// @dev re-implemented to support golden winner + function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { + if (winnerIds.length == 0) { + return string(abi.encodePacked(baseURI, "/raffle.json")); + } else if (winners[tokenId] && winnerIds[0] == tokenId) { + return string(abi.encodePacked(baseURI, "/golden-winner.json")); + } else if (winners[tokenId]) { + return string(abi.encodePacked(baseURI, "/winner.json")); + } else { + return string(abi.encodePacked(baseURI, "/loser.json")); + } + } + + /// @notice Checks if a tokenId is the golden winner + /// @param tokenId The token ID + /// @return True if the token is the golden winner + function isGoldenWinner(uint256 tokenId) public view returns (bool) { + return winners[tokenId] && winnerIds[0] == tokenId; + } + + /// @notice Checks if an account has a golden winner token + /// @param account The account address + /// @return True if the account has a golden winner + function isGoldenWinner(address account) public view returns (bool) { + for (uint256 i = 0; i < balanceOf(account); i++) { + if (isGoldenWinner(tokenOfOwnerByIndex(account, i))) { + return true; + } + } + return false; + } +} diff --git a/packages/nfts/contracts/profile/RegisterProfilePicture.sol b/packages/nfts/contracts/profile/RegisterProfilePicture.sol new file mode 100644 index 00000000000..c885339e9ab --- /dev/null +++ b/packages/nfts/contracts/profile/RegisterProfilePicture.sol @@ -0,0 +1,97 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.24; + +import "@openzeppelin/contracts/token/ERC721/ERC721.sol"; +import "@openzeppelin/contracts/token/ERC1155/ERC1155.sol"; +import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; +import { UUPSUpgradeable } from + "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; +import { Ownable2StepUpgradeable } from + "@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol"; + +/// @title A store for trailblazer profile pictures +/// @author Bennett Yogn +/// @dev All function calls are currently implemented without side effects +contract RegisterProfilePicture is Initializable, UUPSUpgradeable, Ownable2StepUpgradeable { + error InvalidNFTContract(address nftContract); + error NotTokenOwner(address nftContract, uint256 tokenId, address caller); + + /// @notice struct of nft contract address and token id + struct ProfilePicture { + address nftContract; + uint256 tokenId; + } + + /// @notice mapping of user id to profile picture + mapping(address user => ProfilePicture pfp) public profilePicture; + + event ProfilePictureSet( + address indexed user, address indexed nftContract, uint256 indexed tokenId + ); + + /// @notice Contract initializer + function initialize() public initializer { + _transferOwnership(_msgSender()); + } + + /// @notice Set the profile picture + /// @param nftContract The address of the nft to set as the profile picture + /// @param tokenId The tokenId of the nft to set as the profile picture + function setPFP(address nftContract, uint256 tokenId) external { + if (IERC721(nftContract).supportsInterface(type(IERC721).interfaceId)) { + // Check if the provided contract address is a valid ERC721 contract + if (IERC721(nftContract).ownerOf(tokenId) != _msgSender()) { + revert NotTokenOwner(nftContract, tokenId, _msgSender()); + } + } else if (IERC1155(nftContract).supportsInterface(type(IERC1155).interfaceId)) { + // Check if the provided contract address is a valid ERC1155 contract + if (IERC1155(nftContract).balanceOf(_msgSender(), tokenId) == 0) { + revert NotTokenOwner(nftContract, tokenId, _msgSender()); + } + } else { + // If the contract does not support ERC721 or ERC1155 interfaces + revert InvalidNFTContract(nftContract); + } + + // Set the PFP + profilePicture[_msgSender()] = ProfilePicture(nftContract, tokenId); + + emit ProfilePictureSet(_msgSender(), nftContract, tokenId); + } + + /// @notice Get the profile picture of a user + /// @param user The address of user + function getProfilePicture(address user) external view returns (string memory) { + ProfilePicture memory userProfilePicture = profilePicture[user]; + + if (IERC721(userProfilePicture.nftContract).supportsInterface(type(IERC721).interfaceId)) { + // ERC721 case: Check ownership before returning the URI + if (IERC721(userProfilePicture.nftContract).ownerOf(userProfilePicture.tokenId) != user) + { + revert NotTokenOwner( + userProfilePicture.nftContract, userProfilePicture.tokenId, user + ); + } + return ERC721(userProfilePicture.nftContract).tokenURI(userProfilePicture.tokenId); + } else if ( + IERC1155(userProfilePicture.nftContract).supportsInterface(type(IERC1155).interfaceId) + ) { + // ERC1155 case: Check ownership before returning the URI + if ( + IERC1155(userProfilePicture.nftContract).balanceOf(user, userProfilePicture.tokenId) + == 0 + ) { + revert NotTokenOwner( + userProfilePicture.nftContract, userProfilePicture.tokenId, user + ); + } + return ERC1155(userProfilePicture.nftContract).uri(userProfilePicture.tokenId); + } else { + // If the contract does not support ERC721 or ERC1155 interfaces + revert InvalidNFTContract(userProfilePicture.nftContract); + } + } + + /// @notice Internal method to authorize an upgrade + function _authorizeUpgrade(address) internal virtual override onlyOwner { } +} diff --git a/packages/nfts/contracts/snaefell/SnaefellToken.sol b/packages/nfts/contracts/snaefell/SnaefellToken.sol index d4f934789b6..fd51efa031d 100644 --- a/packages/nfts/contracts/snaefell/SnaefellToken.sol +++ b/packages/nfts/contracts/snaefell/SnaefellToken.sol @@ -122,4 +122,17 @@ contract SnaefellToken is ERC721EnumerableUpgradeable, MerkleWhitelist { } return super._update(to, tokenId, auth); } + + /// @notice Update the base URI + /// @param _rootURI The new base URI + /// @dev Only the owner can update the base URI + function updateBaseURI(string memory _rootURI) public onlyOwner { + _baseURIExtended = _rootURI; + } + + /// @notice Get the base URI + /// @return The base URI + function baseURI() public view returns (string memory) { + return _baseURIExtended; + } } diff --git a/packages/nfts/contracts/taikoon/TaikoonToken.sol b/packages/nfts/contracts/taikoon/TaikoonToken.sol index 6461800c796..dbe54650996 100644 --- a/packages/nfts/contracts/taikoon/TaikoonToken.sol +++ b/packages/nfts/contracts/taikoon/TaikoonToken.sol @@ -112,4 +112,19 @@ contract TaikoonToken is ERC721EnumerableUpgradeable, MerkleWhitelist { _mint(_to, tokenIds[i]); } } + + /// @dev V2 code additions + + /// @notice Update the base URI + /// @param _rootURI The new base URI + /// @dev Only the owner can update the base URI + function updateBaseURI(string memory _rootURI) public onlyOwner { + _baseURIExtended = _rootURI; + } + + /// @notice Get the base URI + /// @return The base URI + function baseURI() public view returns (string memory) { + return _baseURIExtended; + } } diff --git a/packages/nfts/contracts/trailblazers-airdrop/ERC20Airdrop.sol b/packages/nfts/contracts/trailblazers-airdrop/ERC20Airdrop.sol new file mode 100644 index 00000000000..0f25d27945e --- /dev/null +++ b/packages/nfts/contracts/trailblazers-airdrop/ERC20Airdrop.sol @@ -0,0 +1,107 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.24; + +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +import "@openzeppelin/contracts/governance/utils/IVotes.sol"; +import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; +import "@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol"; +import "@taiko/blacklist/IMinimalBlacklist.sol"; + +import "./MerkleClaimable.sol"; + +/// @title ERC20Airdrop +/// @notice Contract for managing Taiko token airdrop for eligible users. +/// @custom:security-contact security@taiko.xyz +contract ERC20Airdrop is MerkleClaimable, ReentrancyGuardUpgradeable, PausableUpgradeable { + using SafeERC20 for IERC20; + + /// @notice The address of the Taiko token contract. + IERC20 public token; + /// @notice Blackist address + IMinimalBlacklist public blacklist; + + /// @notice Event emitted when the blacklist is updated. + event BlacklistUpdated(address _blacklist); + + /// @notice Errors + error ADDRESS_BLACKLISTED(); + + uint256[48] private __gap; + + /// @notice Modifier to check if the address is not blacklisted. + /// @param _address The address to check. + modifier isNotBlacklisted(address _address) { + if (blacklist.isBlacklisted(_address)) revert ADDRESS_BLACKLISTED(); + _; + } + + /// @notice Initializes the contract. + /// @param _owner The owner of this contract. + /// @param _claimStart The start time of the claim period. + /// @param _claimEnd The end time of the claim period. + /// @param _merkleRoot The merkle root. + /// @param _token The address of the token contract. + function init( + address _owner, + uint64 _claimStart, + uint64 _claimEnd, + bytes32 _merkleRoot, + IERC20 _token, + address _blacklist + ) + external + initializer + { + __ReentrancyGuard_init(); + __Pausable_init(); + __MerkleClaimable_init(_claimStart, _claimEnd, _merkleRoot); + _transferOwnership(_owner == address(0) ? _msgSender() : _owner); + blacklist = IMinimalBlacklist(_blacklist); + token = _token; + } + + /// @notice Claims the airdrop for the user. + /// @param user The address of the user. + /// @param amount The amount of tokens to claim. + /// @param proof The merkle proof. + function claim( + address user, + uint256 amount, + bytes32[] calldata proof + ) + external + nonReentrant + isNotBlacklisted(user) + { + // Check if this can be claimed + _verifyClaim(abi.encode(user, amount), proof); + + // Transfer the tokens from contract + IERC20(token).transfer(user, amount); + } + + /// @notice Withdraw ERC20 tokens from the Vault + /// @param _token The ERC20 token address to withdraw + /// @dev Only the owner can execute this function + function withdrawERC20(IERC20 _token) external onlyOwner { + // If token address is address(0), use token + if (address(_token) == address(0)) { + _token = token; + } + // Transfer the tokens to owner + _token.transfer(owner(), _token.balanceOf(address(this))); + } + + /// @notice Update blacklist contract + /// @param _blacklist The new blacklist contract address + /// @dev Only the owner can execute this function + function updateBlacklist(address _blacklist) external onlyOwner { + blacklist = IMinimalBlacklist(_blacklist); + emit BlacklistUpdated(_blacklist); + } + + /// @notice Internal method to authorize an upgrade + function _authorizeUpgrade(address) internal virtual override onlyOwner { } +} diff --git a/packages/nfts/contracts/trailblazers-airdrop/MerkleClaimable.sol b/packages/nfts/contracts/trailblazers-airdrop/MerkleClaimable.sol new file mode 100644 index 00000000000..149bb99493e --- /dev/null +++ b/packages/nfts/contracts/trailblazers-airdrop/MerkleClaimable.sol @@ -0,0 +1,147 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.24; + +import "@openzeppelin/contracts/utils/cryptography/MerkleProof.sol"; + +import { UUPSUpgradeable } from + "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; +import { Ownable2StepUpgradeable } from + "@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol"; +import { MerkleProof } from "@openzeppelin/contracts/utils/cryptography/MerkleProof.sol"; +import { ContextUpgradeable } from + "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol"; + +/// @title MerkleClaimable +/// @notice Contract for managing Taiko token airdrop for eligible users +/// @custom:security-contact security@taiko.xyz +abstract contract MerkleClaimable is + ContextUpgradeable, + UUPSUpgradeable, + Ownable2StepUpgradeable +{ + /// @notice Mapping of hashes and their claim status + mapping(bytes32 hash => bool claimed) public isClaimed; + + /// @notice Merkle root of the tree + bytes32 public merkleRoot; + + /// @notice Unix timestamp for claim start + uint64 public claimStart; + + /// @notice Unix timestamp for claim end + uint64 public claimEnd; + + uint256[47] private __gap; + + /// @notice Event emitted when a claim is made + /// @param hash Hash of the claim + event Claimed(bytes32 hash); + + /// @notice Event emitted when config is changed + /// @param claimStart Unix timestamp for claim start + /// @param claimEnd Unix timestamp for claim end + /// @param merkleRoot Merkle root of the tree + event ConfigChanged(uint64 claimStart, uint64 claimEnd, bytes32 merkleRoot); + + /// @notice Errors + error CLAIM_NOT_ONGOING(); + error CLAIMED_ALREADY(); + error INVALID_PARAMS(); + error INVALID_PROOF(); + + /// @notice Modifier to check if the claim is ongoing + modifier ongoingClaim() { + if ( + merkleRoot == 0x0 || claimStart == 0 || claimEnd == 0 || claimStart > block.timestamp + || claimEnd < block.timestamp + ) revert CLAIM_NOT_ONGOING(); + _; + } + + /// @notice Set config parameters + /// @param _claimStart Unix timestamp for claim start + /// @param _claimEnd Unix timestamp for claim end + /// @param _merkleRoot Merkle root of the tree + function setConfig( + uint64 _claimStart, + uint64 _claimEnd, + bytes32 _merkleRoot + ) + external + onlyOwner + { + _setConfig(_claimStart, _claimEnd, _merkleRoot); + } + + /// @notice Initialize the contract + /// @param _claimStart Unix timestamp for claim start + /// @param _claimEnd Unix timestamp for claim end + /// @param _merkleRoot Merkle root of the tree + function __MerkleClaimable_init( + uint64 _claimStart, + uint64 _claimEnd, + bytes32 _merkleRoot + ) + internal + onlyInitializing + { + __Context_init(); + _setConfig(_claimStart, _claimEnd, _merkleRoot); + } + + /// @notice Verify an airdrop claim + /// @param data Data to be hashed + /// @param proof Merkle proof + function _verifyClaim(bytes memory data, bytes32[] calldata proof) internal ongoingClaim { + bytes32 hash = keccak256(abi.encode("CLAIM_TAIKO_AIRDROP", data)); + + if (isClaimed[hash]) revert CLAIMED_ALREADY(); + if (!_verifyMerkleProof(proof, merkleRoot, hash)) revert INVALID_PROOF(); + + isClaimed[hash] = true; + emit Claimed(hash); + } + + /// @notice Verify a Merkle proof + /// @param _proof Merkle proof + /// @param _merkleRoot Merkle root + /// @param _value Value to verify + /// @return Whether the proof is valid + function _verifyMerkleProof( + bytes32[] calldata _proof, + bytes32 _merkleRoot, + bytes32 _value + ) + internal + pure + virtual + returns (bool) + { + return MerkleProof.verify(_proof, _merkleRoot, _value); + } + + /// @notice Set config parameters + /// @param _claimStart Unix timestamp for claim start + /// @param _claimEnd Unix timestamp for claim end + /// @param _merkleRoot Merkle root of the tree + function _setConfig(uint64 _claimStart, uint64 _claimEnd, bytes32 _merkleRoot) private { + if (_claimStart > _claimEnd) revert INVALID_PARAMS(); + + claimStart = _claimStart; + claimEnd = _claimEnd; + merkleRoot = _merkleRoot; + emit ConfigChanged(_claimStart, _claimEnd, _merkleRoot); + } + + /// @notice Check if a claim has been made + /// @param user Address of the user + /// @param amount Amount of tokens claimed + /// @return Whether the claim has been made + function hasClaimed(address user, uint256 amount) external view returns (bool) { + bytes32 hash = keccak256(abi.encode("CLAIM_TAIKO_AIRDROP", (abi.encode(user, amount)))); + return isClaimed[hash]; + } + + /// @notice Internal method to authorize an upgrade + function _authorizeUpgrade(address) internal virtual override onlyOwner { } +} diff --git a/packages/nfts/contracts/trailblazers-badges/ECDSAWhitelist.sol b/packages/nfts/contracts/trailblazers-badges/ECDSAWhitelist.sol new file mode 100644 index 00000000000..cee54194521 --- /dev/null +++ b/packages/nfts/contracts/trailblazers-badges/ECDSAWhitelist.sol @@ -0,0 +1,149 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.24; + +import { UUPSUpgradeable } from + "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; +import { Ownable2StepUpgradeable } from + "@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol"; +import { ContextUpgradeable } from + "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol"; +import { IMinimalBlacklist } from "@taiko/blacklist/IMinimalBlacklist.sol"; +import { ECDSA } from "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; + +/// @title ECDSAWhitelist +/// @dev Signature-driven mint whitelist +/// @custom:security-contact security@taiko.xyz +contract ECDSAWhitelist is ContextUpgradeable, UUPSUpgradeable, Ownable2StepUpgradeable { + event MintSignerUpdated(address _mintSigner); + event MintConsumed(address _minter, uint256 _tokenId); + event BlacklistUpdated(address _blacklist); + + error MINTS_EXCEEDED(); + error ADDRESS_BLACKLISTED(); + error ONLY_MINT_SIGNER(); + + /// @notice Mint signer address + address public mintSigner; + /// @notice Tracker for minted signatures + mapping(bytes32 signatureHash => bool hasMinted) public minted; + /// @notice Blackist address + IMinimalBlacklist public blacklist; + /// @notice Gap for upgrade safety + uint256[47] private __gap; + + /// @custom:oz-upgrades-unsafe-allow constructor + constructor() { + _disableInitializers(); + } + + /// @notice Modifier to restrict access to the mint signer + modifier onlyMintSigner() { + if (msg.sender != mintSigner) revert ONLY_MINT_SIGNER(); + _; + } + + /// @notice Update the blacklist address + /// @param _blacklist The new blacklist address + function updateBlacklist(IMinimalBlacklist _blacklist) external onlyOwner { + blacklist = _blacklist; + emit BlacklistUpdated(address(_blacklist)); + } + + /// @notice Update the mint signer address + /// @param _mintSigner The new mint signer address + function updateMintSigner(address _mintSigner) public onlyOwner { + mintSigner = _mintSigner; + emit MintSignerUpdated(_mintSigner); + } + + /// @notice Contract initializer + /// @param _owner Contract owner + /// @param _mintSigner Mint signer address + /// @param _blacklist Blacklist address + function initialize( + address _owner, + address _mintSigner, + IMinimalBlacklist _blacklist + ) + external + initializer + { + __ECDSAWhitelist_init(_owner, _mintSigner, _blacklist); + } + + /// @notice Generate a standardized hash for externally signing + /// @param _minter Address of the minter + /// @param _tokenId ID for the token to mint + function getHash(address _minter, uint256 _tokenId) public pure returns (bytes32) { + return keccak256(bytes.concat(keccak256(abi.encode(_minter, _tokenId)))); + } + + /// @notice Internal method to verify valid signatures + /// @param _signature Signature to verify + /// @param _minter Address of the minter + /// @param _tokenId ID for the token to mint + /// @return Whether the signature is valid + function _isSignatureValid( + bytes memory _signature, + address _minter, + uint256 _tokenId + ) + internal + view + returns (bool) + { + bytes32 _hash = getHash(_minter, _tokenId); + (address _recovered,,) = ECDSA.tryRecover(_hash, _signature); + + return _recovered == mintSigner; + } + + /// @notice Check if a wallet can mint + /// @param _signature Signature to verify + /// @param _minter Address of the minter + /// @param _tokenId ID for the token to mint + /// @return Whether the wallet can mint + function canMint( + bytes memory _signature, + address _minter, + uint256 _tokenId + ) + public + view + returns (bool) + { + if (blacklist.isBlacklisted(_minter)) revert ADDRESS_BLACKLISTED(); + if (minted[keccak256(_signature)]) return false; + return _isSignatureValid(_signature, _minter, _tokenId); + } + + /// @notice Internal initializer + /// @param _owner Contract owner + /// @param _mintSigner Mint signer address + /// @param _blacklist Blacklist address + function __ECDSAWhitelist_init( + address _owner, + address _mintSigner, + IMinimalBlacklist _blacklist + ) + internal + { + _transferOwnership(_owner == address(0) ? msg.sender : _owner); + __Context_init(); + mintSigner = _mintSigner; + blacklist = _blacklist; + } + + /// @notice Internal method to consume a mint + /// @param _signature Signature to verify + /// @param _minter Address of the minter + /// @param _tokenId ID for the token to mint + function _consumeMint(bytes memory _signature, address _minter, uint256 _tokenId) internal { + if (!canMint(_signature, _minter, _tokenId)) revert MINTS_EXCEEDED(); + minted[keccak256(_signature)] = true; + emit MintConsumed(_minter, _tokenId); + } + + /// @notice Internal method to authorize an upgrade + function _authorizeUpgrade(address) internal virtual override onlyOwner { } +} diff --git a/packages/nfts/contracts/trailblazers-badges/TrailblazersBadges.sol b/packages/nfts/contracts/trailblazers-badges/TrailblazersBadges.sol new file mode 100644 index 00000000000..7b55195d412 --- /dev/null +++ b/packages/nfts/contracts/trailblazers-badges/TrailblazersBadges.sol @@ -0,0 +1,224 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.24; + +import { ERC721EnumerableUpgradeable } from + "@openzeppelin/contracts-upgradeable/token/ERC721/extensions/ERC721EnumerableUpgradeable.sol"; +import { ECDSAWhitelist } from "./ECDSAWhitelist.sol"; +import { IMinimalBlacklist } from "@taiko/blacklist/IMinimalBlacklist.sol"; +import { Strings } from "@openzeppelin/contracts/utils/Strings.sol"; + +contract TrailblazersBadges is ERC721EnumerableUpgradeable, ECDSAWhitelist { + /// @notice Movement IDs + uint256 public constant MOVEMENT_NEUTRAL = 0; + uint256 public constant MOVEMENT_BASED = 1; + uint256 public constant MOVEMENT_BOOSTED = 2; + /// @notice Badge IDs + uint256 public constant BADGE_RAVERS = 0; + uint256 public constant BADGE_ROBOTS = 1; + uint256 public constant BADGE_BOUNCERS = 2; + uint256 public constant BADGE_MASTERS = 3; + uint256 public constant BADGE_MONKS = 4; + uint256 public constant BADGE_DRUMMERS = 5; + uint256 public constant BADGE_ANDROIDS = 6; + uint256 public constant BADGE_SHINTO = 7; + + /// @notice Base URI required to interact with IPFS + string private _baseURIExtended; + /// @notice Token ID to badge ID mapping + mapping(uint256 _tokenId => uint256 _badgeId) public badges; + /// @notice Wallet-to-Movement mapping + mapping(address _user => uint256 _movement) public movements; + /// @notice Wallet to badge ID, token ID mapping + mapping(address _user => mapping(uint256 _badgeId => uint256 _tokenId)) public userBadges; + /// @notice Movement to badge ID, token ID mapping + mapping(bytes32 movementBadgeHash => uint256[2] movementBadge) public movementBadges; + /// @notice Gap for upgrade safety + uint256[43] private __gap; + + error MINTER_NOT_WHITELISTED(); + error INVALID_INPUT(); + error INVALID_BADGE_ID(); + error INVALID_MOVEMENT_ID(); + + event BadgeCreated(uint256 _tokenId, address _minter, uint256 _badgeId); + event MovementSet(address _user, uint256 _movementId); + event UriSet(string _uri); + + /// @notice Contract initializer + /// @param _owner Contract owner + /// @param _rootURI Base URI for the token metadata + /// @param _mintSigner The address that can authorize minting badges + /// @param _blacklistAddress The address of the blacklist contract + function initialize( + address _owner, + string memory _rootURI, + address _mintSigner, + IMinimalBlacklist _blacklistAddress + ) + external + initializer + { + __ERC721_init("Trailblazers Badges", "TBB"); + _baseURIExtended = _rootURI; + __ECDSAWhitelist_init(_owner, _mintSigner, _blacklistAddress); + } + + /// @notice Ensure update of userBadges on transfers + /// @param to The address to transfer to + /// @param tokenId The token id to transfer + /// @param auth The authorizer of the transfer + function _update( + address to, + uint256 tokenId, + address auth + ) + internal + virtual + override + returns (address) + { + userBadges[_ownerOf(tokenId)][badges[tokenId]] = 0; + userBadges[to][badges[tokenId]] = tokenId; + return super._update(to, tokenId, auth); + } + + /// @notice Update the base URI + /// @param _uri The new base URI + function setUri(string memory _uri) public onlyOwner { + _baseURIExtended = _uri; + emit UriSet(_uri); + } + + /// @notice Get the URI for a tokenId + /// @param _tokenId The badge ID + /// @return URI The URI for the badge + function tokenURI(uint256 _tokenId) public view override returns (string memory) { + uint256 movementId = movements[ownerOf(_tokenId)]; + uint256 badgeId = badges[_tokenId]; + return string( + abi.encodePacked( + _baseURIExtended, "/", Strings.toString(movementId), "/", Strings.toString(badgeId) + ) + ); + } + + /// @notice Mint a badge from the calling wallet + /// @param _signature The signature authorizing the mint + /// @param _badgeId The badge ID to mint + function mint(bytes memory _signature, uint256 _badgeId) public { + _mintBadgeTo(_signature, _msgSender(), _badgeId); + } + + /// @notice Mint a badge to a specific address + /// @param _signature The signature authorizing the mint + /// @param _minter The address to mint the badge to + /// @param _badgeId The badge ID to mint + /// @dev Admin only method + function mint(bytes memory _signature, address _minter, uint256 _badgeId) public onlyOwner { + _mintBadgeTo(_signature, _minter, _badgeId); + } + + /// @notice Internal method for badge minting + /// @param _signature The signature authorizing the mint + /// @param _minter The address to mint the badge to + /// @param _badgeId The badge ID to mint + function _mintBadgeTo(bytes memory _signature, address _minter, uint256 _badgeId) internal { + if (_badgeId > BADGE_SHINTO) revert INVALID_BADGE_ID(); + + _consumeMint(_signature, _minter, _badgeId); + + uint256 tokenId = totalSupply() + 1; + badges[tokenId] = _badgeId; + + _mint(_minter, tokenId); + + emit BadgeCreated(tokenId, _minter, _badgeId); + } + + /// @notice Sets movement for the calling wallet + /// @param _movementId The movement ID to set + function setMovement(uint256 _movementId) public { + _setMovement(_msgSender(), _movementId); + } + + /// @notice Sets movement for a specific address + /// @param _user The address to set the movement for + /// @param _movementId The movement ID to set + /// @dev Owner-only method + function setMovement(address _user, uint256 _movementId) public onlyOwner { + _setMovement(_user, _movementId); + } + + /// @notice Internal method for setting movement + /// @param _user The address to set the movement for + /// @param _movementId The movement ID to set + function _setMovement(address _user, uint256 _movementId) internal { + if (_movementId > MOVEMENT_BOOSTED) revert INVALID_MOVEMENT_ID(); + movements[_user] = _movementId; + emit MovementSet(_user, _movementId); + } + + /// @notice Retrieve a token ID given their owner and Badge ID + /// @param _user The address of the badge owner + /// @param _badgeId The badge ID + /// @return tokenId The token ID + function getTokenId(address _user, uint256 _badgeId) public view returns (uint256) { + return userBadges[_user][_badgeId]; + } + + /// @notice Retrieve boolean balance for each badge + /// @param _owner The addresses to check + /// @return balances The badges atomic balances + function badgeBalances(address _owner) public view returns (bool[] memory) { + bool[] memory balances = new bool[](8); + balances[0] = 0 != getTokenId(_owner, BADGE_RAVERS); + balances[1] = 0 != getTokenId(_owner, BADGE_ROBOTS); + balances[2] = 0 != getTokenId(_owner, BADGE_BOUNCERS); + balances[3] = 0 != getTokenId(_owner, BADGE_MASTERS); + balances[4] = 0 != getTokenId(_owner, BADGE_MONKS); + balances[5] = 0 != getTokenId(_owner, BADGE_DRUMMERS); + balances[6] = 0 != getTokenId(_owner, BADGE_ANDROIDS); + balances[7] = 0 != getTokenId(_owner, BADGE_SHINTO); + return balances; + } + + /// @notice v2 + + /// @notice Retrieve the base URI + function baseURI() public view returns (string memory) { + return _baseURIExtended; + } + + /// @notice Upgraded badgeBalances using tokenOfOwnerByIndex + /// @param _owner The addresses to check + /// @return balances The badges atomic balances + function badgeBalancesV2(address _owner) public view returns (bool[] memory balances) { + uint256 balance = balanceOf(_owner); + uint256[] memory tokenIds = new uint256[](balance); + for (uint256 i = 0; i < balance; i++) { + tokenIds[i] = tokenOfOwnerByIndex(_owner, i); + } + balances = new bool[](8); + + for (uint256 i = 0; i < balance; i++) { + uint256 badgeId = badges[tokenIds[i]]; + balances[badgeId] = true; + } + + return balances; + } + + /// @notice Return the total badge supply by badgeId + /// @return balances The amount of each badge id + function totalBadgeSupply() public view returns (uint256[] memory balances) { + uint256 totalSupply = totalSupply(); + balances = new uint256[](8); + + for (uint256 i = 1; i <= totalSupply; i++) { + uint256 badgeId = badges[i]; + balances[badgeId]++; + } + + return balances; + } +} diff --git a/packages/nfts/contracts/trailblazers-badges/TrailblazersBadgesV3.sol b/packages/nfts/contracts/trailblazers-badges/TrailblazersBadgesV3.sol new file mode 100644 index 00000000000..cae60cd6468 --- /dev/null +++ b/packages/nfts/contracts/trailblazers-badges/TrailblazersBadgesV3.sol @@ -0,0 +1,24 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.24; + +import "./TrailblazersBadges.sol"; + +contract TrailblazersBadgesV3 is TrailblazersBadges { + function version() external pure virtual returns (string memory) { + return "V3"; + } + + function _update( + address to, + uint256 tokenId, + address auth + ) + internal + virtual + override + returns (address) + { + if (blacklist.isBlacklisted(_msgSender())) revert ADDRESS_BLACKLISTED(); + return super._update(to, tokenId, auth); + } +} diff --git a/packages/nfts/contracts/trailblazers-season-2/BadgeRecruitment.sol b/packages/nfts/contracts/trailblazers-season-2/BadgeRecruitment.sol new file mode 100644 index 00000000000..44e93329add --- /dev/null +++ b/packages/nfts/contracts/trailblazers-season-2/BadgeRecruitment.sol @@ -0,0 +1,745 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.24; + +import "@openzeppelin/contracts-upgradeable/token/ERC1155/extensions/ERC1155SupplyUpgradeable.sol"; +import "../trailblazers-badges/ECDSAWhitelist.sol"; +import "@taiko/blacklist/IMinimalBlacklist.sol"; +import "@openzeppelin/contracts/utils/Strings.sol"; +import "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol"; +import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; +import "@openzeppelin/contracts-upgradeable/token/ERC1155/ERC1155Upgradeable.sol"; +import "@openzeppelin/contracts/token/ERC721/ERC721.sol"; +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "@openzeppelin/contracts/utils/Strings.sol"; +import "@openzeppelin/contracts-upgradeable/token/ERC721/extensions/ERC721EnumerableUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/token/ERC721/utils/ERC721HolderUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol"; +import "./TrailblazersS1BadgesV4.sol"; +import { ECDSA } from "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; +import "./TrailblazersBadgesS2.sol"; + +contract BadgeRecruitment is + UUPSUpgradeable, + Ownable2StepUpgradeable, + AccessControlUpgradeable, + ERC721HolderUpgradeable +{ + /// @notice Season 1 Badges ERC721 contract + TrailblazersBadgesV4 public s1Badges; + /// @notice badges role key + bytes32 public constant S1_BADGES_ROLE = keccak256("S1_BADGES_ROLE"); + /// @notice Season 2 Badges ERC1155 contract + TrailblazersBadgesS2 public s2Badges; + /// @notice Wallet authorized to sign as a source of randomness + address public randomSigner; + /// @notice Current recruitment cycle + uint256 public recruitmentCycleId; + + /// @notice Mapping of unique user-per-mint-per-cycle + mapping( + uint256 recruitmentCycle + => mapping( + address minter + => mapping( + uint256 s1BadgeId + => mapping(RecruitmentType recruitmentType => bool mintEnded) + ) + ) + ) public recruitmentCycleUniqueMints; + /// @notice User experience points + + mapping(address user => uint256 experience) public userExperience; + /// @notice Influence colors available + + enum InfluenceColor { + Undefined, // unused + Whale, // based, pink + Minnow // boosted, purple + + } + + /// @notice Recruitment types + enum RecruitmentType { + Undefined, + Claim, + Migration + } + /// @notice Hash types + enum HashType { + Undefined, + Start, + End, + Influence + } + + /// @notice Configuration struct + struct Config { + uint256 cooldownRecruitment; + uint256 cooldownInfluence; + uint256 influenceWeightPercent; + uint256 baseMaxInfluences; + uint256 maxInfluencesDivider; + uint256 defaultCycleDuration; + } + /// @notice Current config + + Config private config; + /// @notice Recruitment struct + + struct Recruitment { + uint256 recruitmentCycle; + address user; + uint256 s1BadgeId; + uint256 s1TokenId; + uint256 s2TokenId; + uint256 cooldownExpiration; + uint256 influenceExpiration; + uint256 whaleInfluences; + uint256 minnowInfluences; + } + /// @notice Recruitment Cycle struct + + struct RecruitmentCycle { + uint256 cycleId; + uint256 startTime; + uint256 endTime; + uint256[] s1BadgeIds; + } + + /// @notice Recruitment cycles + mapping(uint256 cycleId => RecruitmentCycle recruitmentCycle) public recruitmentCycles; + + /// @notice Recruitments per user + + mapping(address _user => Recruitment[] _recruitment) public recruitments; + /// @notice Gap for upgrade safety + uint256[43] private __gap; + /// @notice Errors + + error MAX_INFLUENCES_REACHED(); + error RECRUITMENT_NOT_STARTED(); + error RECRUITMENT_ALREADY_STARTED(); + error INFLUENCE_IN_PROGRESS(); + error RECRUITMENT_NOT_READY(); + error RECRUITMENT_NOT_ENABLED(); + error TOKEN_NOT_OWNED(); + error NOT_RANDOM_SIGNER(); + error ALREADY_MIGRATED_IN_CYCLE(); + error HASH_MISMATCH(); + error NOT_S1_CONTRACT(); + error EXP_TOO_LOW(); + error INVALID_INFLUENCE_COLOR(); + error CURRENT_CYCLE_NOT_OVER(); + /// @notice Events + + event RecruitmentCycleToggled( + uint256 indexed recruitmentCycleId, + uint256 indexed startTime, + uint256 indexed endTime, + uint256[] s1BadgeIds, + bool enabled + ); + + event RecruitmentUpdated( + uint256 indexed recruitmentCycle, + address indexed user, + uint256 s1BadgeId, + uint256 s1TokenId, + uint256 s2TokenId, + uint256 cooldownExpiration, + uint256 influenceExpiration, + uint256 whaleInfluences, + uint256 minnowInfluences + ); + + event RecruitmentComplete( + uint256 indexed recruitmentCycle, + address indexed user, + uint256 s1TokenId, + uint256 s2TokenId, + uint256 finalColor + ); + + /// @notice Check if the message sender has an active recruitment + modifier isMigrating() { + Recruitment memory recruitment_ = getActiveRecruitmentFor(_msgSender()); + if (recruitment_.cooldownExpiration == 0) { + revert RECRUITMENT_NOT_STARTED(); + } + _; + } + + /// @notice Reverts if sender is already migrating + modifier isNotMigrating(address _user) { + if ( + recruitments[_user].length > 0 + && recruitments[_user][recruitments[_user].length - 1].cooldownExpiration + > block.timestamp + ) { + revert RECRUITMENT_ALREADY_STARTED(); + } + _; + } + + /// @notice Reverts if recruitments aren't enabled for that badge + /// @param _s1BadgeId The badge ID + modifier recruitmentOpen(uint256 _s1BadgeId) { + RecruitmentCycle memory cycle_ = recruitmentCycles[recruitmentCycleId]; + + if (cycle_.startTime > block.timestamp || cycle_.endTime < block.timestamp) { + revert RECRUITMENT_NOT_ENABLED(); + } + + bool found_ = false; + + for (uint256 i = 0; i < cycle_.s1BadgeIds.length; i++) { + if (cycle_.s1BadgeIds[i] == _s1BadgeId) { + found_ = true; + break; + } + } + + if (!found_) { + revert RECRUITMENT_NOT_ENABLED(); + } + _; + } + + /// @notice Limits recruitments to one per user, badge and cycle + /// @param _s1BadgeId The badge ID + /// @param _minter The minter address + /// @param _recruitmentType The recruitment type + modifier hasntMigratedInCycle( + uint256 _s1BadgeId, + address _minter, + RecruitmentType _recruitmentType + ) { + // check that the minter hasn't used the recruitment within this cycle + if (recruitmentCycleUniqueMints[recruitmentCycleId][_minter][_s1BadgeId][_recruitmentType]) + { + revert ALREADY_MIGRATED_IN_CYCLE(); + } + _; + } + + /// @notice Contract initializer + /// @param _s1Badges The Season 1 Badges contract address + /// @param _s2Badges The Season 2 Badges contract address + /// @param _randomSigner The random signer address + /// @param _config The initial configuration + function initialize( + address _s1Badges, + address _s2Badges, + address _randomSigner, + Config memory _config + ) + external + initializer + { + _transferOwnership(_msgSender()); + __Context_init(); + _grantRole(DEFAULT_ADMIN_ROLE, _msgSender()); + s1Badges = TrailblazersBadgesV4(_s1Badges); + _grantRole(S1_BADGES_ROLE, _s1Badges); + s2Badges = TrailblazersBadgesS2(_s2Badges); + randomSigner = _randomSigner; + config = _config; + } + + /// @notice Upgrade configuration + /// @param _config The new configuration + function setConfig(Config memory _config) external onlyRole(DEFAULT_ADMIN_ROLE) { + config = _config; + } + + /// @notice Get the current configuration + /// @return The current configuration + function getConfig() external view returns (Config memory) { + return config; + } + + /// @notice Disable all current recruitments + /// @dev Bypasses the default date checks + function forceDisableRecruitments() internal onlyRole(DEFAULT_ADMIN_ROLE) { + recruitmentCycles[recruitmentCycleId].endTime = block.timestamp; + } + + /// @notice Enable recruitments for a set of badges + /// @param _startTime The start time of the recruitment cycle + /// @param _endTime The end time of the recruitment cycle + /// @param _s1BadgeIds The badge IDs to enable + function _enableRecruitments( + uint256 _startTime, + uint256 _endTime, + uint256[] calldata _s1BadgeIds + ) + internal + { + if ( + recruitmentCycleId > 0 + && recruitmentCycles[recruitmentCycleId].endTime > block.timestamp + ) { + revert CURRENT_CYCLE_NOT_OVER(); + } + // emit disabled badges + emit RecruitmentCycleToggled( + recruitmentCycleId, + recruitmentCycles[recruitmentCycleId].startTime, + recruitmentCycles[recruitmentCycleId].endTime, + recruitmentCycles[recruitmentCycleId].s1BadgeIds, + false + ); + + recruitmentCycleId++; + recruitmentCycles[recruitmentCycleId] = + RecruitmentCycle(recruitmentCycleId, _startTime, _endTime, _s1BadgeIds); + + // emit enabled badges + emit RecruitmentCycleToggled(recruitmentCycleId, _startTime, _endTime, _s1BadgeIds, true); + } + + /// @notice Enable recruitments for a set of badges + /// @param _s1BadgeIds The badge IDs to enable + /// @dev Can be called only by the contract owner/admin + function enableRecruitments(uint256[] calldata _s1BadgeIds) + external + onlyRole(DEFAULT_ADMIN_ROLE) + { + _enableRecruitments( + block.timestamp, block.timestamp + config.defaultCycleDuration, _s1BadgeIds + ); + } + + /// @notice Enable recruitments for a set of badges + /// @param _startTime The start time of the recruitment cycle + /// @param _endTime The end time of the recruitment cycle + /// @param _s1BadgeIds The badge IDs to enable + /// @dev Can be called only by the contract owner/admin + function enableRecruitments( + uint256 _startTime, + uint256 _endTime, + uint256[] calldata _s1BadgeIds + ) + external + onlyRole(DEFAULT_ADMIN_ROLE) + { + _enableRecruitments(_startTime, _endTime, _s1BadgeIds); + } + + /// @notice Get the current recruitment cycle + /// @return The current recruitment cycle + function getRecruitmentCycle(uint256 _cycleId) + external + view + returns (RecruitmentCycle memory) + { + return recruitmentCycles[_cycleId]; + } + + /// @notice Internal logic to start a recruitment + /// @param _user The user address + /// @param _s1BadgeId The badge ID + /// @param _s1TokenId The badge token ID + /// @param _recruitmentType The recruitment type + function _startRecruitment( + address _user, + uint256 _s1BadgeId, + uint256 _s1TokenId, + RecruitmentType _recruitmentType + ) + internal + virtual + { + Recruitment memory _recruitment = Recruitment( + recruitmentCycleId, // recruitmentCycle + _user, // user + _s1BadgeId, + _s1TokenId, + 0, // s2TokenId, unset + block.timestamp + config.cooldownRecruitment, // cooldownExpiration + 0, // influenceExpiration, unset + 0, // whaleInfluences + 0 // minnowInfluences + ); + + recruitments[_user].push(_recruitment); + recruitmentCycleUniqueMints[recruitmentCycleId][_user][_s1BadgeId][_recruitmentType] = true; + + emit RecruitmentUpdated( + _recruitment.recruitmentCycle, + _recruitment.user, + _recruitment.s1BadgeId, + _recruitment.s1TokenId, + _recruitment.s2TokenId, + _recruitment.cooldownExpiration, + _recruitment.influenceExpiration, + _recruitment.whaleInfluences, + _recruitment.minnowInfluences + ); + } + + /// @notice Start a recruitment for a badge using the user's experience points + /// @param _hash The hash to sign of the signature + /// @param _v The signature V field + /// @param _r The signature R field + /// @param _s The signature S field + /// @param _exp The user's experience points + function startRecruitment( + bytes32 _hash, + uint8 _v, + bytes32 _r, + bytes32 _s, + uint256 _exp + ) + external + virtual + isNotMigrating(_msgSender()) + { + bytes32 calculatedHash_ = generateClaimHash(HashType.Start, _msgSender(), _exp); + + if (calculatedHash_ != _hash) { + revert HASH_MISMATCH(); + } + + (address recovered_,,) = ECDSA.tryRecover(_hash, _v, _r, _s); + if (recovered_ != randomSigner) { + revert NOT_RANDOM_SIGNER(); + } + + if (_exp < userExperience[_msgSender()]) { + revert EXP_TOO_LOW(); + } + + userExperience[_msgSender()] = _exp; + + RecruitmentCycle memory cycle_ = recruitmentCycles[recruitmentCycleId]; + if (cycle_.startTime > block.timestamp || cycle_.endTime < block.timestamp) { + revert RECRUITMENT_NOT_ENABLED(); + } + uint256 randomSeed_ = randomFromSignature(_hash, _v, _r, _s); + uint256 s1BadgeId_ = cycle_.s1BadgeIds[randomSeed_ % cycle_.s1BadgeIds.length]; + + if ( + recruitmentCycleUniqueMints[recruitmentCycleId][_msgSender()][s1BadgeId_][RecruitmentType + .Claim] + ) { + revert ALREADY_MIGRATED_IN_CYCLE(); + } + + _startRecruitment(_msgSender(), s1BadgeId_, 0, RecruitmentType.Claim); + } + + /// @notice Start a recruitment for a badge using the user's experience points + /// @param _hash The hash to sign of the signature + /// @param _v The signature V field + /// @param _r The signature R field + /// @param _s The signature S field + /// @param _exp The user's experience points + /// @param _s1BadgeId The badge ID (s1) + function startRecruitment( + bytes32 _hash, + uint8 _v, + bytes32 _r, + bytes32 _s, + uint256 _exp, + uint256 _s1BadgeId + ) + external + virtual + isNotMigrating(_msgSender()) + recruitmentOpen(_s1BadgeId) + hasntMigratedInCycle(_s1BadgeId, _msgSender(), RecruitmentType.Claim) + { + bytes32 calculatedHash_ = generateClaimHash(HashType.Start, _msgSender(), _s1BadgeId); + + if (calculatedHash_ != _hash) { + revert HASH_MISMATCH(); + } + + (address recovered_,,) = ECDSA.tryRecover(_hash, _v, _r, _s); + if (recovered_ != randomSigner) { + revert NOT_RANDOM_SIGNER(); + } + + if (_exp < userExperience[_msgSender()]) { + revert EXP_TOO_LOW(); + } + + userExperience[_msgSender()] = _exp; + + _startRecruitment(_msgSender(), _s1BadgeId, 0, RecruitmentType.Claim); + } + + /// @notice Start a recruitment for a badge + /// @param _s1BadgeId The badge ID (s1) + /// @dev Not all badges are eligible for recruitment at the same time + /// @dev Defines a cooldown for the recruitment to be complete + /// @dev the cooldown is lesser the higher the Pass Tier + /// @dev Must be called from the s1 badges contract + function startRecruitment( + address _user, + uint256 _s1BadgeId + ) + external + virtual + onlyRole(S1_BADGES_ROLE) + recruitmentOpen(_s1BadgeId) + isNotMigrating(_user) + hasntMigratedInCycle(_s1BadgeId, _user, RecruitmentType.Migration) + { + uint256 s1TokenId_ = s1Badges.getTokenId(_user, _s1BadgeId); + + if (s1Badges.ownerOf(s1TokenId_) != _user) { + revert TOKEN_NOT_OWNED(); + } + _startRecruitment(_user, _s1BadgeId, s1TokenId_, RecruitmentType.Migration); + } + + /// @notice Get the active recruitment for a user + /// @param _user The user address + /// @return The active recruitment + function getActiveRecruitmentFor(address _user) public view returns (Recruitment memory) { + if (recruitments[_user].length == 0) { + revert RECRUITMENT_NOT_STARTED(); + } + return recruitments[_user][recruitments[_user].length - 1]; + } + + /// @notice Update a recruitment + /// @param _recruitment The updated recruitment + function _updateRecruitment(Recruitment memory _recruitment) internal virtual { + recruitments[_recruitment.user][recruitments[_recruitment.user].length - 1] = _recruitment; + + emit RecruitmentUpdated( + _recruitment.recruitmentCycle, + _recruitment.user, + _recruitment.s1BadgeId, + _recruitment.s1TokenId, + _recruitment.s2TokenId, + _recruitment.cooldownExpiration, + _recruitment.influenceExpiration, + _recruitment.whaleInfluences, + _recruitment.minnowInfluences + ); + } + + /// @notice Get the maximum number of influences for a given experience + /// @param _exp The user's experience points + function maxInfluences(uint256 _exp) public view virtual returns (uint256 value) { + value = 0; // _exp / config.maxInfluencesDivider; + value += config.baseMaxInfluences; + return value; + } + + /// @notice Influence (alter) the chances during a recruitment + /// @param _hash The hash to sign + /// @param _v signature V field + /// @param _r signature R field + /// @param _s signature S field + /// @param _influenceColor the influence's color + /// @dev Can be called only during an active recruitment + /// @dev Implements a cooldown before allowing to re-influence + /// @dev The max influence amount is determined by Pass Tier + function influenceRecruitment( + bytes32 _hash, + uint8 _v, + bytes32 _r, + bytes32 _s, + uint256 _exp, + InfluenceColor _influenceColor + ) + external + isMigrating + { + bytes32 calculatedHash_ = generateClaimHash(HashType.Influence, _msgSender(), _exp); + + if (calculatedHash_ != _hash) { + revert HASH_MISMATCH(); + } + + (address recovered_,,) = ECDSA.tryRecover(_hash, _v, _r, _s); + if (recovered_ != randomSigner) revert NOT_RANDOM_SIGNER(); + Recruitment memory recruitment_ = getActiveRecruitmentFor(_msgSender()); + + if ((recruitment_.whaleInfluences + recruitment_.minnowInfluences) >= maxInfluences(_exp)) { + revert MAX_INFLUENCES_REACHED(); + } + + if (recruitment_.influenceExpiration > block.timestamp) { + revert INFLUENCE_IN_PROGRESS(); + } + + // apply the influence, and reset the other + if (_influenceColor == InfluenceColor.Whale) { + recruitment_.whaleInfluences++; + recruitment_.minnowInfluences = 0; + } else if (_influenceColor == InfluenceColor.Minnow) { + recruitment_.minnowInfluences++; + recruitment_.whaleInfluences = 0; + } else { + revert INVALID_INFLUENCE_COLOR(); + } + + recruitment_.influenceExpiration = block.timestamp + config.cooldownInfluence; + + _updateRecruitment(recruitment_); + } + + /// @notice End a recruitment + /// @param _hash The hash to sign + /// @param _v signature V field + /// @param _r signature R field + /// @param _s signature S field + /// @param _exp The user's experience points + /// @dev Can be called only during an active recruitment, after the cooldown is over + /// @dev The final color is determined randomly, and affected by the influence amounts + function endRecruitment( + bytes32 _hash, + uint8 _v, + bytes32 _r, + bytes32 _s, + uint256 _exp + ) + external + isMigrating + { + Recruitment memory recruitment_ = getActiveRecruitmentFor(_msgSender()); + + if (recruitment_.influenceExpiration > block.timestamp) { + revert INFLUENCE_IN_PROGRESS(); + } + // check if the cooldown is over + if (recruitment_.cooldownExpiration > block.timestamp) { + revert RECRUITMENT_NOT_READY(); + } + // ensure the hash corresponds to the start time + bytes32 calculatedHash_ = generateClaimHash(HashType.End, _msgSender(), _exp); + + if (calculatedHash_ != _hash) { + revert HASH_MISMATCH(); + } + + uint256 randomSeed_ = randomFromSignature(_hash, _v, _r, _s); + + uint256 whaleWeight_ = 50 + recruitment_.whaleInfluences * config.influenceWeightPercent; + uint256 minnowWeight_ = 50 + recruitment_.minnowInfluences * config.influenceWeightPercent; + + uint256 totalWeight_ = whaleWeight_ + minnowWeight_; + + uint256 randomValue = randomSeed_ % totalWeight_; + + TrailblazersBadgesS2.MovementType finalColor_; + if (randomValue < minnowWeight_) { + finalColor_ = TrailblazersBadgesS2.MovementType.Minnow; + } else { + finalColor_ = TrailblazersBadgesS2.MovementType.Whale; + } + + uint256 s1BadgeId_ = recruitment_.s1BadgeId; + + // mint the badge + s2Badges.mint(_msgSender(), TrailblazersBadgesS2.BadgeType(s1BadgeId_), finalColor_); + uint256 s2TokenId_ = s2Badges.totalSupply(); + + recruitment_.s2TokenId = s2TokenId_; + recruitment_.cooldownExpiration = 0; + recruitment_.influenceExpiration = 0; + + _updateRecruitment(recruitment_); + + emit RecruitmentComplete( + recruitment_.recruitmentCycle, + recruitment_.user, + recruitment_.s1TokenId, + recruitment_.s2TokenId, + uint256(finalColor_) + ); + } + + /// @notice Generate a unique hash for each recruitment uniquely + /// @param _user The user address + /// @param _exp The users experience points + /// @return _hash The unique hash + function generateClaimHash( + HashType _hashType, + address _user, + uint256 _exp + ) + public + pure + returns (bytes32) + { + return keccak256(abi.encodePacked(_hashType, _user, _exp)); + } + + /// @notice Check if a recruitment is active for a user + /// @param _user The user address + /// @return Whether the user has an active recruitment + function isRecruitmentActive(address _user) public view returns (bool) { + if (recruitments[_user].length == 0) { + return false; + } + Recruitment memory recruitment_ = getActiveRecruitmentFor(_user); + return recruitment_.cooldownExpiration != 0; + } + + /// @notice Generates a random number from a signature + /// @param _hash The hash to sign + /// @param _v signature V field + /// @param _r signature R field + /// @param _s signature S field + /// @return _random The pseudo-random number + function randomFromSignature( + bytes32 _hash, + uint8 _v, + bytes32 _r, + bytes32 _s + ) + public + view + returns (uint256 _random) + { + (address recovered_,,) = ECDSA.tryRecover(_hash, _v, _r, _s); + if (recovered_ != randomSigner) revert NOT_RANDOM_SIGNER(); + return uint256(keccak256(abi.encodePacked(_r, _s, _v))); + } + + /// @notice Check if a influence is active for a user + /// @param _user The user address + /// @return Whether the user has an active influence + function isInfluenceActive(address _user) public view returns (bool) { + Recruitment memory recruitment_ = getActiveRecruitmentFor(_user); + return recruitment_.influenceExpiration > block.timestamp; + } + + /// @notice Get the recruitment influence counts for a user + /// @param _user The user address + /// @return _whaleInfluences The Whale influence count + /// @return _minnowInfluences The Minnow influence count + function getRecruitmentInfluences(address _user) + public + view + returns (uint256 _whaleInfluences, uint256 _minnowInfluences) + { + if (!isRecruitmentActive(_user)) { + revert RECRUITMENT_NOT_STARTED(); + } + Recruitment memory recruitment_ = getActiveRecruitmentFor(_user); + return (recruitment_.whaleInfluences, recruitment_.minnowInfluences); + } + + /// @notice supportsInterface implementation + /// @param _interfaceId The interface ID + /// @return Whether the interface is supported + function supportsInterface(bytes4 _interfaceId) public view override returns (bool) { + return super.supportsInterface(_interfaceId); + } + + /// @notice Internal method to authorize an upgrade + function _authorizeUpgrade(address) internal virtual override onlyOwner { } +} diff --git a/packages/nfts/contracts/trailblazers-season-2/BadgeRecruitmentV2.sol b/packages/nfts/contracts/trailblazers-season-2/BadgeRecruitmentV2.sol new file mode 100644 index 00000000000..cb14278a371 --- /dev/null +++ b/packages/nfts/contracts/trailblazers-season-2/BadgeRecruitmentV2.sol @@ -0,0 +1,141 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.24; + +import "./BadgeRecruitment.sol"; + +contract BadgeRecruitmentV2 is BadgeRecruitment { + /// @notice Events + event RecruitmentReset( + uint256 indexed cycleId, address indexed user, uint256 indexed s1TokenId, uint256 s1BadgeId + ); + + /// @notice Errors + error RECRUITMENT_ALREADY_COMPLETED(); + error RECRUITMENT_NOT_FOUND(); + error NOT_ENOUGH_TIME_LEFT(); + + modifier recruitmentHasTimeLeft(address _user) { + uint256 endCycleTime = recruitmentCycles[recruitmentCycleId].endTime; + uint256 potentialRecruitmentEndTime = block.timestamp + this.getConfig().cooldownRecruitment; + + if (potentialRecruitmentEndTime > endCycleTime) { + revert NOT_ENOUGH_TIME_LEFT(); + } + _; + } + + /// @notice Updated version function + function version() external pure virtual returns (string memory) { + return "V2"; + } + + /// @notice Start a recruitment for a badge + /// @param _s1BadgeId The badge ID (s1) + /// @dev Not all badges are eligible for recruitment at the same time + /// @dev Defines a cooldown for the recruitment to be complete + /// @dev the cooldown is lesser the higher the Pass Tier + /// @dev Must be called from the s1 badges contract + function startRecruitment( + address _user, + uint256 _s1BadgeId, + uint256 _s1TokenId + ) + external + virtual + onlyRole(S1_BADGES_ROLE) + recruitmentOpen(_s1BadgeId) + isNotMigrating(_user) + hasntMigratedInCycle(_s1BadgeId, _user, RecruitmentType.Migration) + recruitmentHasTimeLeft(_user) + { + if (s1Badges.ownerOf(_s1TokenId) != _user) { + revert TOKEN_NOT_OWNED(); + } + _startRecruitment(_user, _s1BadgeId, _s1TokenId, RecruitmentType.Migration); + } + + /// @notice Disable all current recruitments + /// @dev Bypasses the default date checks + function forceDisableAllRecruitments() external virtual onlyRole(DEFAULT_ADMIN_ROLE) { + forceDisableRecruitments(); + + emit RecruitmentCycleToggled( + recruitmentCycleId, + recruitmentCycles[recruitmentCycleId].startTime, + recruitmentCycles[recruitmentCycleId].endTime, + recruitmentCycles[recruitmentCycleId].s1BadgeIds, + false + ); + } + + /// @notice Get the active recruitment for a user + /// @param _user The user address + /// @return The active recruitment + function getActiveRecruitmentsFor(address _user) public view returns (Recruitment[] memory) { + if (recruitments[_user].length == 0) { + revert RECRUITMENT_NOT_STARTED(); + } + return recruitments[_user]; + } + + /// @notice Reset a recruitment that hasn't been completed + /// @param _user The user address + /// @param _s1TokenId The s1 token ID + /// @param _s1BadgeId The s1 badge ID + /// @param _recruitmentCycle The recruitment index + /// @dev Must be called from the s1 badges contract + function resetRecruitment( + address _user, + uint256 _s1TokenId, + uint256 _s1BadgeId, + uint256 _recruitmentCycle + ) + public + virtual + onlyRole(S1_BADGES_ROLE) + { + if ( + !recruitmentCycleUniqueMints[_recruitmentCycle][_user][_s1BadgeId][RecruitmentType + .Migration] + && !recruitmentCycleUniqueMints[_recruitmentCycle][_user][_s1BadgeId][RecruitmentType.Claim] + && !recruitmentCycleUniqueMints[_recruitmentCycle][_user][_s1BadgeId][RecruitmentType + .Undefined] + ) { + revert RECRUITMENT_NOT_FOUND(); + } + + bool found = false; + + for (uint256 i = 0; i < recruitments[_user].length; i++) { + if ( + recruitments[_user][i].recruitmentCycle == _recruitmentCycle + && recruitments[_user][i].s1TokenId == _s1TokenId + && recruitments[_user][i].s2TokenId == 0 + ) { + delete recruitments[_user][i]; + found = true; + break; + } + } + + if (!found) { + revert RECRUITMENT_NOT_FOUND(); + } + + recruitmentCycleUniqueMints[_recruitmentCycle][_user][_s1BadgeId][RecruitmentType.Undefined] + = false; + recruitmentCycleUniqueMints[_recruitmentCycle][_user][_s1BadgeId][RecruitmentType.Claim] = + false; + recruitmentCycleUniqueMints[_recruitmentCycle][_user][_s1BadgeId][RecruitmentType.Migration] + = false; + + emit RecruitmentReset(_recruitmentCycle, _user, _s1TokenId, _s1BadgeId); + } + + /// @notice Set the s2 badges contract + /// @param _s2Badges The s2 badges contract address + /// @dev Must be called from the admin account + function setS2BadgesContract(address _s2Badges) external virtual onlyRole(DEFAULT_ADMIN_ROLE) { + s2Badges = TrailblazersBadgesS2(_s2Badges); + } +} diff --git a/packages/nfts/contracts/trailblazers-season-2/TrailblazersBadgesS2.sol b/packages/nfts/contracts/trailblazers-season-2/TrailblazersBadgesS2.sol new file mode 100644 index 00000000000..5984e3a3e75 --- /dev/null +++ b/packages/nfts/contracts/trailblazers-season-2/TrailblazersBadgesS2.sol @@ -0,0 +1,211 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.24; + +import "@openzeppelin/contracts-upgradeable/token/ERC1155/extensions/ERC1155SupplyUpgradeable.sol"; +import "../trailblazers-badges/ECDSAWhitelist.sol"; +import "@taiko/blacklist/IMinimalBlacklist.sol"; +import "@openzeppelin/contracts/utils/Strings.sol"; +import "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol"; +import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; +import "@openzeppelin/contracts-upgradeable/token/ERC1155/ERC1155Upgradeable.sol"; +import "@openzeppelin/contracts/token/ERC721/ERC721.sol"; +import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Pausable.sol"; +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "@openzeppelin/contracts/utils/Strings.sol"; +import "@openzeppelin/contracts-upgradeable/token/ERC721/extensions/ERC721EnumerableUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/token/ERC721/utils/ERC721HolderUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol"; +import "./TrailblazersS1BadgesV4.sol"; +import { Strings } from "@openzeppelin/contracts/utils/Strings.sol"; + +contract TrailblazersBadgesS2 is + ContextUpgradeable, + UUPSUpgradeable, + Ownable2StepUpgradeable, + AccessControlUpgradeable, + ERC1155SupplyUpgradeable +{ + /// @notice Badge types + enum BadgeType { + Ravers, // s1 id: 0 + Robots, // s1 id: 1 + Bouncers, // s1 id: 2 + Masters, // s1 id: 3 + Monks, // s1 id: 4 + Androids, // s1 id: 5 + Drummers, // s1 id: 6 + Shinto // s1 id: 7 + + } + + /// @notice Movement types + enum MovementType { + Undefined, // unused + Whale, // s1 based/pink + Minnow // s1 boosted/purple + + } + + /// @notice Badge struct + struct Badge { + uint256 tokenId; + BadgeType badgeType; + MovementType movementType; + } + + /// @notice Badge mapping + mapping(uint256 tokenId => Badge badge) private badges; + /// @notice User, Badge, and Movement relation to tokenId + mapping( + address user + => mapping(BadgeType badgeType => mapping(MovementType movementType => uint256 tokenId)) + ) private userBadges; + /// @notice Badge URI template + string public uriTemplate; + /// @notice Minter address; BadgeMigration contract + address public minter; + /// @notice Minter role + bytes32 public constant MINTER_ROLE = keccak256("MINTER"); + /// @notice Gap for upgrade safety + uint256[43] private __gap; + + /// @notice Errors + error NOT_MINTER(); + error TOKEN_NOT_MINTED(); + + /// @notice Initialize the contract + /// @param _minter The minter address + /// @param _uriTemplate The badge URI template + function initialize( + address _minter, + string calldata _uriTemplate + ) + external + virtual + initializer + { + __ERC1155_init(""); + __ERC1155Supply_init(); + _transferOwnership(_msgSender()); + __Context_init(); + _grantRole(DEFAULT_ADMIN_ROLE, _msgSender()); + _grantRole(MINTER_ROLE, _minter); + minter = _minter; + uriTemplate = _uriTemplate; + } + + /// @notice Set the minter address + /// @param _minter The minter address + /// @dev Only the owner can call this function + function setMinter(address _minter) external virtual onlyRole(DEFAULT_ADMIN_ROLE) { + minter = _minter; + _grantRole(MINTER_ROLE, _minter); + } + + /// @notice Mint a badge + /// @param _to The address to mint the badge to + /// @param _badgeType The badge type + /// @param _movementType The movement type + /// @dev Only the minter can call this function + function mint( + address _to, + BadgeType _badgeType, + MovementType _movementType + ) + external + virtual + onlyRole(MINTER_ROLE) + { + uint256 tokenId_ = totalSupply() + 1; + Badge memory badge_ = Badge(tokenId_, _badgeType, _movementType); + _mint(_to, tokenId_, 1, ""); + badges[tokenId_] = badge_; + } + + /// @notice Internal method to assemble URIs + /// @param _badgeType The badge type + /// @param _movementType The movement type + /// @return The URI + function _uri( + BadgeType _badgeType, + MovementType _movementType + ) + internal + view + virtual + returns (string memory) + { + string memory badgeType_ = Strings.toString(uint256(_badgeType)); + string memory movementType_ = Strings.toString(uint256(_movementType)); + + return string(abi.encodePacked(uriTemplate, "/", movementType_, "/", badgeType_)); + } + + /// @notice Retrieve the URI for a badge given the type & movement + /// @param _badgeType The badge type + /// @param _movementType The movement type + /// @return The URI + function uri( + BadgeType _badgeType, + MovementType _movementType + ) + external + view + virtual + returns (string memory) + { + return _uri(_badgeType, _movementType); + } + + /// @notice Retrieve the URI for a badge given the token ID + /// @param _tokenId The token ID + /// @return The URI + function uri(uint256 _tokenId) public view virtual override returns (string memory) { + if (_tokenId > totalSupply()) { + revert TOKEN_NOT_MINTED(); + } + Badge memory badge_ = badges[_tokenId]; + return _uri(badge_.badgeType, badge_.movementType); + } + + /// @notice Retrieve a badge + /// @param _tokenId The token ID + /// @return The badge + function getBadge(uint256 _tokenId) external view virtual returns (Badge memory) { + if (_tokenId < totalSupply()) { + revert TOKEN_NOT_MINTED(); + } + return badges[_tokenId]; + } + + /// @notice supportsInterface implementation + /// @param _interfaceId The interface ID + /// @return Whether the interface is supported + function supportsInterface(bytes4 _interfaceId) + public + view + virtual + override(AccessControlUpgradeable, ERC1155Upgradeable) + returns (bool) + { + return super.supportsInterface(_interfaceId); + } + + /// @notice Internal method to authorize an upgrade + function _authorizeUpgrade(address) internal virtual override onlyOwner { } + + // v2 + + function version() public pure returns (string memory) { + return "v2"; + } + + function setUri(string memory __uri) public onlyRole(DEFAULT_ADMIN_ROLE) { + uriTemplate = __uri; + } +} diff --git a/packages/nfts/contracts/trailblazers-season-2/TrailblazersS1BadgesV4.sol b/packages/nfts/contracts/trailblazers-season-2/TrailblazersS1BadgesV4.sol new file mode 100644 index 00000000000..f3313f03350 --- /dev/null +++ b/packages/nfts/contracts/trailblazers-season-2/TrailblazersS1BadgesV4.sol @@ -0,0 +1,70 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.24; + +import "../trailblazers-badges/TrailblazersBadgesV3.sol"; +import "./BadgeRecruitment.sol"; + +contract TrailblazersBadgesV4 is TrailblazersBadgesV3 { + /// @notice Duration for which a s1 badge is locked after recruitment is started + uint256 public recruitmentLockDuration; + /// @notice BadgeRecruitment contract + BadgeRecruitment public recruitmentContract; + /// @notice Mapping of badge token id to unlock timestamp + mapping(uint256 tokenId => uint256 unlockTimestamp) public unlockTimestamps; + + /// @notice Errors + error BADGE_LOCKED(); + error RECRUITMENT_LOCK_DURATION_NOT_SET(); + + /// @notice Updated version function + /// @return Version string + function version() external pure virtual override returns (string memory) { + return "V4"; + } + + /// @notice Overwritten update function that prevents locked badges from being transferred + /// @param to Address to transfer badge to + /// @param tokenId Badge token id + /// @param auth Address to authorize transfer + /// @return Address of the recipient + function _update( + address to, + uint256 tokenId, + address auth + ) + internal + virtual + override + returns (address) + { + if (unlockTimestamps[tokenId] > block.timestamp) { + revert BADGE_LOCKED(); + } + return super._update(to, tokenId, auth); + } + + /// @notice Set recruitment contract + /// @param _recruitmentContract Address of the recruitment contract + /// @dev Only owner + function setRecruitmentContract(address _recruitmentContract) public onlyOwner { + recruitmentContract = BadgeRecruitment(_recruitmentContract); + } + + /// @notice Set recruitment lock duration + /// @param _duration Duration in seconds + /// @dev Only owner + function setRecruitmentLockDuration(uint256 _duration) public onlyOwner { + recruitmentLockDuration = _duration; + } + + /// @notice Start recruitment for a badge + /// @param _badgeId Badge id + function startRecruitment(uint256 _badgeId) public virtual { + if (recruitmentLockDuration == 0) { + revert RECRUITMENT_LOCK_DURATION_NOT_SET(); + } + uint256 tokenId = getTokenId(_msgSender(), _badgeId); + unlockTimestamps[tokenId] = block.timestamp + recruitmentLockDuration; + recruitmentContract.startRecruitment(_msgSender(), _badgeId); + } +} diff --git a/packages/nfts/contracts/trailblazers-season-2/TrailblazersS1BadgesV5.sol b/packages/nfts/contracts/trailblazers-season-2/TrailblazersS1BadgesV5.sol new file mode 100644 index 00000000000..9dbf8942068 --- /dev/null +++ b/packages/nfts/contracts/trailblazers-season-2/TrailblazersS1BadgesV5.sol @@ -0,0 +1,66 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.24; + +import "./TrailblazersS1BadgesV4.sol"; +import "./BadgeRecruitment.sol"; +import "./BadgeRecruitmentV2.sol"; + +contract TrailblazersBadgesV5 is TrailblazersBadgesV4 { + /// @notice Errors + error RECRUITMENT_ALREADY_COMPLETED(); + error NOT_OWNER(); + error NOT_IMPLEMENTED(); + error RECRUITMENT_NOT_FOUND(); + /// @notice Updated version function + /// @return Version string + + function version() external pure virtual override returns (string memory) { + return "V5"; + } + /// @notice Recruitment contract + + BadgeRecruitmentV2 public recruitmentContractV2; + /// @notice Setter for recruitment contract + + function setRecruitmentContractV2(address _recruitmentContractV2) public onlyOwner { + recruitmentContractV2 = BadgeRecruitmentV2(_recruitmentContractV2); + } + + /// @notice Start recruitment for a badge + /// @param _badgeId Badge ID + /// @param _tokenId Token ID + function startRecruitment(uint256 _badgeId, uint256 _tokenId) public { + if (recruitmentLockDuration == 0) { + revert RECRUITMENT_LOCK_DURATION_NOT_SET(); + } + if (ownerOf(_tokenId) != _msgSender()) { + revert NOT_OWNER(); + } + + if (unlockTimestamps[_tokenId] > block.timestamp) { + revert BADGE_LOCKED(); + } + + unlockTimestamps[_tokenId] = block.timestamp + recruitmentLockDuration; + recruitmentContractV2.startRecruitment(_msgSender(), _badgeId, _tokenId); + } + + /// @notice Deprecated of legacy function + function startRecruitment(uint256 /*_badgeId*/ ) public virtual override { + revert NOT_IMPLEMENTED(); + } + + /// @notice Reset an ongoing migration + /// @param _tokenId Token ID + /// @param _badgeId Badge ID + /// @param _cycleId Cycle ID + /// @dev Only the owner of the token can reset the migration + function resetMigration(uint256 _tokenId, uint256 _badgeId, uint256 _cycleId) public virtual { + if (ownerOf(_tokenId) != _msgSender()) { + revert NOT_OWNER(); + } + + recruitmentContractV2.resetRecruitment(_msgSender(), _tokenId, _badgeId, _cycleId); + unlockTimestamps[_tokenId] = 0; + } +} diff --git a/packages/nfts/data/party-token/metadata/golden-winner.json b/packages/nfts/data/party-token/metadata/golden-winner.json new file mode 100644 index 00000000000..53d54f7c9f2 --- /dev/null +++ b/packages/nfts/data/party-token/metadata/golden-winner.json @@ -0,0 +1,5 @@ +{ + "name": "[GW] KBW Party Raffle Ticket", + "description": "A unique raffle ticket for the KBW Party. This ticket won a special prize at the raffle.", + "image": "https://taikonfts.4everland.link/ipfs/bafybeif2piyppimpd4rn6wkq4mxtwdgajil7vt6shkb2gt72a2zyqufg2a/golden-winner.png" +} diff --git a/packages/nfts/data/party-token/metadata/loser.json b/packages/nfts/data/party-token/metadata/loser.json new file mode 100644 index 00000000000..d0814c76707 --- /dev/null +++ b/packages/nfts/data/party-token/metadata/loser.json @@ -0,0 +1,5 @@ +{ + "name": "[L] KBW Party Raffle Ticket", + "description": "A raffle ticket for the KBW Party. This ticket won nothing at the raffle.", + "image": "https://taikonfts.4everland.link/ipfs/bafybeif2piyppimpd4rn6wkq4mxtwdgajil7vt6shkb2gt72a2zyqufg2a/loser.png" +} diff --git a/packages/nfts/data/party-token/metadata/raffle.json b/packages/nfts/data/party-token/metadata/raffle.json new file mode 100644 index 00000000000..429c5cbf593 --- /dev/null +++ b/packages/nfts/data/party-token/metadata/raffle.json @@ -0,0 +1,5 @@ +{ + "name": "KBW Party Raffle Ticket", + "description": "A raffle ticket for the KBW Party. This ticket gives you a chance to win a special prize.", + "image": "https://taikonfts.4everland.link/ipfs/bafybeif2piyppimpd4rn6wkq4mxtwdgajil7vt6shkb2gt72a2zyqufg2a/raffle.png" +} diff --git a/packages/nfts/data/party-token/metadata/winner.json b/packages/nfts/data/party-token/metadata/winner.json new file mode 100644 index 00000000000..9f301d467e7 --- /dev/null +++ b/packages/nfts/data/party-token/metadata/winner.json @@ -0,0 +1,6 @@ +{ + "name": "[W] KBW Party Raffle Ticket", + "description": "A raffle ticket for the KBW Party. This ticket won a special prize at the raffle.", + "image": "https://taikonfts.4everland.link/ipfs/bafybeif2piyppimpd4rn6wkq4mxtwdgajil7vt6shkb2gt72a2zyqufg2a/winner.gif", + "animation_url": "https://taikonfts.4everland.link/ipfs/bafybeif2piyppimpd4rn6wkq4mxtwdgajil7vt6shkb2gt72a2zyqufg2a/winner.gif" +} diff --git a/packages/nfts/data/party-token/static/golden-winner.png b/packages/nfts/data/party-token/static/golden-winner.png new file mode 100644 index 00000000000..1578f5b11ad Binary files /dev/null and b/packages/nfts/data/party-token/static/golden-winner.png differ diff --git a/packages/nfts/data/party-token/static/loser.png b/packages/nfts/data/party-token/static/loser.png new file mode 100644 index 00000000000..9da31c54da1 Binary files /dev/null and b/packages/nfts/data/party-token/static/loser.png differ diff --git a/packages/nfts/data/party-token/static/raffle.png b/packages/nfts/data/party-token/static/raffle.png new file mode 100644 index 00000000000..b7ec903e594 Binary files /dev/null and b/packages/nfts/data/party-token/static/raffle.png differ diff --git a/packages/nfts/data/party-token/static/winner.gif b/packages/nfts/data/party-token/static/winner.gif new file mode 100644 index 00000000000..90b551d549e Binary files /dev/null and b/packages/nfts/data/party-token/static/winner.gif differ diff --git a/packages/nfts/deployments/eventRegister/hekla.json b/packages/nfts/deployments/eventRegister/hekla.json new file mode 100644 index 00000000000..b40d00f89cb --- /dev/null +++ b/packages/nfts/deployments/eventRegister/hekla.json @@ -0,0 +1,3 @@ +{ + "EventRegister": "0x6439Bb31dE508Dc36B8D3A39C389EB8E6C214ebE" +} diff --git a/packages/nfts/deployments/eventRegister/mainnet.json b/packages/nfts/deployments/eventRegister/mainnet.json new file mode 100644 index 00000000000..32df83a78ec --- /dev/null +++ b/packages/nfts/deployments/eventRegister/mainnet.json @@ -0,0 +1,3 @@ +{ + "EventRegister": "0x7cbec64D099D49eA91062746B38182455c94862C" +} diff --git a/packages/protocol/deployments/gen-layouts.sh b/packages/nfts/deployments/gen-layouts.sh similarity index 56% rename from packages/protocol/deployments/gen-layouts.sh rename to packages/nfts/deployments/gen-layouts.sh index 6b727609e16..6f647cfb56c 100755 --- a/packages/protocol/deployments/gen-layouts.sh +++ b/packages/nfts/deployments/gen-layouts.sh @@ -2,28 +2,13 @@ # Define the list of contracts to inspect contracts=( - "TaikoL1" - "TaikoL2" - "SignalService" - "Bridge" - "DelegateOwner" - "GuardianProver" - "TaikoToken" - "BridgedTaikoToken" - "ERC20Vault" - "ERC721Vault" - "ERC1155Vault" - "BridgedERC20" - "BridgedERC721" - "BridgedERC1155" - "AssignmentHook" - "ERC20Airdrop" - "AutomataDcapV3Attestation" - "SgxVerifier" - "RiscZeroVerifier" - "QuotaManager" - "ProverSet" - "TokenUnlock" + "MerkleWhitelist" + "TaikoonToken" + "SnaefellToken" + "ECDSAWhitelist" + "TrailblazersBadges" + "TrailblazersBadgesV2" + "BadgeMigration" ) # Empty the output file initially diff --git a/packages/nfts/deployments/party-ticket/hekla.json b/packages/nfts/deployments/party-ticket/hekla.json new file mode 100644 index 00000000000..cb0a3609871 --- /dev/null +++ b/packages/nfts/deployments/party-ticket/hekla.json @@ -0,0 +1,3 @@ +{ + "TaikoPartyTicket": "0x1d504615c42130F4fdbEb87775585B250BA78422" +} diff --git a/packages/nfts/deployments/party-ticket/mainnet.json b/packages/nfts/deployments/party-ticket/mainnet.json new file mode 100644 index 00000000000..3574e47293c --- /dev/null +++ b/packages/nfts/deployments/party-ticket/mainnet.json @@ -0,0 +1,3 @@ +{ + "TaikoPartyTicket": "0x00E6dc8B0a58d505de61309df3568Ba3f9734a6C" +} diff --git a/packages/nfts/deployments/profile/hekla.json b/packages/nfts/deployments/profile/hekla.json new file mode 100644 index 00000000000..ccf10cfc18c --- /dev/null +++ b/packages/nfts/deployments/profile/hekla.json @@ -0,0 +1,3 @@ +{ + "RegisterProfilePicture": "0xdBfaFc789c4272161ce01a4A3aBa04C232362504" +} diff --git a/packages/nfts/deployments/profile/mainnet.json b/packages/nfts/deployments/profile/mainnet.json new file mode 100644 index 00000000000..4093af55cab --- /dev/null +++ b/packages/nfts/deployments/profile/mainnet.json @@ -0,0 +1,3 @@ +{ + "RegisterProfilePicture": "0x58617427f3d42e5435908661d3c788d7d2EAf3fa" +} diff --git a/packages/nfts/deployments/taikoon/hekla.json b/packages/nfts/deployments/taikoon/hekla.json new file mode 100644 index 00000000000..f9241cbc4ef --- /dev/null +++ b/packages/nfts/deployments/taikoon/hekla.json @@ -0,0 +1,5 @@ +{ + "MerkleRoot": "0x1c3b504b4d5640d26ad1aa3b57a9df9ec034f19239768e734b849c306d10b110", + "Owner": "0x4100a9B680B1Be1F10Cb8b5a57fE59eA77A8184e", + "TaikoonToken": "0x6e68900B53D6de5c20A4b81CE42A488b887f40Ce" +} diff --git a/packages/nfts/deployments/taikoon/localhost.json b/packages/nfts/deployments/taikoon/localhost.json index cc24a11762d..f6c1643871b 100644 --- a/packages/nfts/deployments/taikoon/localhost.json +++ b/packages/nfts/deployments/taikoon/localhost.json @@ -1,5 +1,5 @@ { "MerkleRoot": "0x1c3b504b4d5640d26ad1aa3b57a9df9ec034f19239768e734b849c306d10b110", "Owner": "0xf8ff2AF0DC1D5BA4811f22aCb02936A1529fd2Be", - "TaikoonToken": "0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9" + "TaikoonToken": "0xa513E6E4b8f2a923D98304ec87F64353C4D5C853" } diff --git a/packages/nfts/deployments/trailblazers-airdrop/hekla.json b/packages/nfts/deployments/trailblazers-airdrop/hekla.json new file mode 100644 index 00000000000..10960be94d8 --- /dev/null +++ b/packages/nfts/deployments/trailblazers-airdrop/hekla.json @@ -0,0 +1,5 @@ +{ + "ERC20Airdrop": "0xdeC2662Dff4eAB8b94B5257D637204d18D95cb74", + "MerkleRoot": "0xbe8ec647626f95185f551887b3eee43ea9e8965c7baf558a9f8cb22b020597f0", + "ERC20Token": "0xa9d23408b9ba935c230493c40c73824df71a0975" +} diff --git a/packages/nfts/deployments/trailblazers-airdrop/mainnet.json b/packages/nfts/deployments/trailblazers-airdrop/mainnet.json new file mode 100644 index 00000000000..d0f2601ab76 --- /dev/null +++ b/packages/nfts/deployments/trailblazers-airdrop/mainnet.json @@ -0,0 +1,5 @@ +{ + "ERC20Airdrop": "0x290265ACd21816EE414E64eEC77dd490d8dd9f51", + "MerkleRoot": "0xc7f7e6bb3d1bb31b0ef5e2e34383c12ec9ef8a301ffde9771bd9de7554c70b1d", + "ERC20Token": "0xa9d23408b9ba935c230493c40c73824df71a0975" +} diff --git a/packages/nfts/deployments/trailblazers-badges/hekla.json b/packages/nfts/deployments/trailblazers-badges/hekla.json new file mode 100644 index 00000000000..ecc500a7b7c --- /dev/null +++ b/packages/nfts/deployments/trailblazers-badges/hekla.json @@ -0,0 +1,5 @@ +{ + "Owner": "0x4100a9B680B1Be1F10Cb8b5a57fE59eA77A8184e", + "TrailblazersBadges": "0xe20616Be39a58cC990c3B8ab069F31e230BeD74D", + "TrailblazersBadgesS2": "0x5dC1F8ef5c7f4f40AdA892B0988b563e71f03eEd" +} diff --git a/packages/nfts/deployments/trailblazers-badges/localhost.json b/packages/nfts/deployments/trailblazers-badges/localhost.json new file mode 100644 index 00000000000..45b2da0f36c --- /dev/null +++ b/packages/nfts/deployments/trailblazers-badges/localhost.json @@ -0,0 +1,5 @@ +{ + "MintSigner": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "Owner": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "TrailblazersBadges": "0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512" +} diff --git a/packages/nfts/deployments/trailblazers-badges/mainnet.json b/packages/nfts/deployments/trailblazers-badges/mainnet.json new file mode 100644 index 00000000000..c05eaea1a87 --- /dev/null +++ b/packages/nfts/deployments/trailblazers-badges/mainnet.json @@ -0,0 +1,5 @@ +{ + "MintSigner": "0x3cda4F2EaC3fc2FdE78B3DFFe1A1A1Eff88c68c5", + "Owner": "0x7d70236E2517f5B95247AF1d806A9E3C328a7860", + "TrailblazersBadges": "0xa20a8856e00F5ad024a55A663F06DCc419FFc4d5" +} diff --git a/packages/nfts/deployments/trailblazers-season-2/hekla.json b/packages/nfts/deployments/trailblazers-season-2/hekla.json new file mode 100644 index 00000000000..23b05d5ecbd --- /dev/null +++ b/packages/nfts/deployments/trailblazers-season-2/hekla.json @@ -0,0 +1,6 @@ +{ + "BadgeRecruitment": "0xcb00B57e8F5fCFffE87bb65f3047b6e4e5A73cA9", + "Owner": "0x4100a9B680B1Be1F10Cb8b5a57fE59eA77A8184e", + "TrailblazersBadges": "0x3a7d7c963EF905FCdb6CefAA21b52497fae3EFC4", + "TrailblazersBadgesS2": "0xDE43b7b9A485d76bc8D48a69DdE6b89540b27DdD" +} diff --git a/packages/nfts/deployments/trailblazers-season-2/mainnet.json b/packages/nfts/deployments/trailblazers-season-2/mainnet.json new file mode 100644 index 00000000000..4430837567d --- /dev/null +++ b/packages/nfts/deployments/trailblazers-season-2/mainnet.json @@ -0,0 +1,6 @@ +{ + "BadgeRecruitment": "0xa9Ceb04F3aF71fF123409d426A92BABb5124970C", + "Owner": "0x7d70236E2517f5B95247AF1d806A9E3C328a7860", + "TrailblazersBadges": "0xa20a8856e00F5ad024a55A663F06DCc419FFc4d5", + "TrailblazersBadgesS2": "0x52A7dBeC10B404548066F59DE89484e27b4181dA" +} diff --git a/packages/nfts/foundry.toml b/packages/nfts/foundry.toml index a961a20c568..ca822e9ad28 100644 --- a/packages/nfts/foundry.toml +++ b/packages/nfts/foundry.toml @@ -11,7 +11,7 @@ ffi = true memory_limit = 2_073_741_824 solc_version = "0.8.24" evm_version = "cancun" -ast=true +ast = true remappings = [ "@openzeppelin/contracts-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/", "@openzeppelin/contracts/=node_modules/@openzeppelin/contracts/", @@ -22,6 +22,7 @@ remappings = [ "murky/=node_modules/murky/src/", "solidity-stringutils/=node_modules/solidity-stringutils/", "@taiko/blacklist/=node_modules/@taiko/supplementary-contracts/contracts/blacklist/", + "openzeppelin-foundry-upgrades/=node_modules/openzeppelin-foundry-upgrades/src/", ] # Do not change the block_gas_limit value, TaikoL2.t.sol depends on it. @@ -34,7 +35,7 @@ fs_permissions = [ { access = "read-write", path = "./deployments/" }, { access = "read", path = "./test" }, { access = "read", path = "./genesis" }, - {access = "read", path="./data/"}, + { access = "read", path = "./data/" }, ] # 2394: Transient storage warning @@ -52,4 +53,3 @@ line_length = 100 multiline_func_header = "all" number_underscore = "thousands" wrap_comments = true - diff --git a/packages/nfts/package.json b/packages/nfts/package.json index a2c77c5295b..9203661d0a1 100644 --- a/packages/nfts/package.json +++ b/packages/nfts/package.json @@ -8,19 +8,42 @@ "eslint": "pnpm exec eslint --ignore-path .eslintignore --ext .js,.ts . --fix", "fmt:sol": "forge fmt", "lint:sol": "forge fmt && pnpm solhint 'contracts/**/*.sol'", - "test": "pnpm clean && pnpm compile && forge test --match-path 'test/*.t.sol' -vvv", + "test": "forge test --match-path 'test/*.t.sol' -vvv", "node": "anvil", + "layout": "./deployments/gen-layouts.sh", "taikoon:merkle": "node script/taikoon/js/generate-merkle-tree.js", - "snaefell:merkle": "node script/snaefell/js/generate-merkle-tree.js", - "taikoon:deploy:localhost": "forge clean && pnpm compile && forge script script/taikoon/sol/Deploy.s.sol --rpc-url http://localhost:8545 --broadcast", - "snaefell:deploy:localhost": "forge clean && pnpm compile && forge script script/snaefell/sol/Deploy.s.sol --rpc-url http://localhost:8545 --broadcast", + "taikoon:deploy:localhost": "forge clean && forge script script/taikoon/sol/Deploy.s.sol --rpc-url http://localhost:8545 --broadcast", "taikoon:deploy:ipfs": "rm -rf data/taikoon/metadata/* && node script/taikoon/js/4everland.js", + "taikoon:deploy:devnet": "forge clean && forge script script/taikoon/sol/Deploy.s.sol --rpc-url https://rpc.internal.taiko.xyz --broadcast --gas-estimate-multiplier 200", + "taikoon:deploy:mainnet": "forge clean && forge script script/taikoon/sol/Deploy.s.sol --rpc-url https://rpc.mainnet.taiko.xyz --broadcast --legacy --with-gas-price 13 ", + "taikoon:deploy:holesky": "forge clean && forge script script/taikoon/sol/Deploy.s.sol --rpc-url https://1rpc.io/holesky --broadcast --gas-estimate-multiplier 200", + "taikoon:deploy:v2": "forge clean && forge script script/taikoon/sol/UpgradeV2.sol --rpc-url https://rpc.mainnet.taiko.xyz --broadcast", + "snaefell:merkle": "node script/snaefell/js/generate-merkle-tree.js", + "snaefell:deploy:localhost": "forge clean && forge script script/snaefell/sol/Deploy.s.sol --rpc-url http://localhost:8545 --broadcast", "snaefell:deploy:ipfs": "rm -rf data/snaefell/metadata/* && node script/snaefell/js/4everland.js", - "taikoon:deploy:devnet": "forge clean && pnpm compile && forge script script/taikoon/sol/Deploy.s.sol --rpc-url https://rpc.internal.taiko.xyz --broadcast --gas-estimate-multiplier 200", - "snaefell:deploy:devnet": "forge clean && pnpm compile && forge script script/snaefell/sol/Deploy.s.sol --rpc-url https://rpc.internal.taiko.xyz --broadcast --gas-estimate-multiplier 200", - "taikoon:deploy:mainnet": "forge clean && pnpm compile && forge script script/taikoon/sol/Deploy.s.sol --rpc-url https://rpc.mainnet.taiko.xyz --broadcast --legacy --with-gas-price 13 ", - "snaefell:deploy:mainnet": "forge clean && pnpm compile && forge script script/snaefell/sol/Deploy.s.sol --rpc-url https://rpc.mainnet.taiko.xyz --broadcast --legacy --with-gas-price 13 ", - "taikoon:deploy:holesky": "forge clean && pnpm compile && forge script script/taikoon/sol/Deploy.s.sol --rpc-url https://1rpc.io/holesky --broadcast --gas-estimate-multiplier 200" + "snaefell:deploy:devnet": "forge clean && forge script script/snaefell/sol/Deploy.s.sol --rpc-url https://rpc.internal.taiko.xyz --broadcast --gas-estimate-multiplier 200", + "snaefell:deploy:mainnet": "forge clean && forge script script/snaefell/sol/Deploy.s.sol --rpc-url https://rpc.mainnet.taiko.xyz --broadcast --legacy --with-gas-price 13 ", + "kbw:deploy:mainnet": "forge clean && pnpm compile && forge script script/party-ticket/sol/Deploy.s.sol --rpc-url https://rpc.mainnet.taiko.xyz --broadcast --legacy --with-gas-price 30 ", + "kbw:upgradeV2:hekla": "forge clean && pnpm compile && forge script script/party-ticket/sol/UpgradeV2.s.sol --rpc-url https://rpc.hekla.taiko.xyz --broadcast --gas-estimate-multiplier 200", + "kbw:upgradeV2:mainnet": "forge clean && pnpm compile && forge script script/party-ticket/sol/UpgradeV2.s.sol --rpc-url https://rpc.mainnet.taiko.xyz --broadcast", + "tbzb:deploy:localhost": "forge clean && forge script script/trailblazers-badges/Deploy.s.sol --rpc-url http://localhost:8545 --broadcast", + "tbzb:deploy:hekla": "forge clean && forge script script/trailblazers-badges/Deploy.s.sol --rpc-url https://rpc.hekla.taiko.xyz --broadcast --gas-estimate-multiplier 200", + "galxe:deploy:mainnet": "forge clean && forge script script/galxe/Deploy.s.sol --rpc-url https://rpc.mainnet.taiko.xyz --legacy --with-gas-price 1", + "tbzb:deploy:mainnet": "forge clean && forge script script/trailblazers-badges/Deploy.s.sol --rpc-url https://rpc.mainnet.taiko.xyz --broadcast --legacy --with-gas-price 13 ", + "kbw:deploy:hekla": "forge clean && forge script script/party-ticket/sol/Deploy.s.sol --rpc-url https://rpc.hekla.taiko.xyz --broadcast --gas-estimate-multiplier 200", + "tbz:s2:deploy:hekla": "forge clean && forge script script/trailblazers-season-2/Deploy.s.sol --tc DeployS2Script --rpc-url https://rpc.hekla.taiko.xyz --broadcast --gas-estimate-multiplier 200", + "tbz:s2:deploy:mainnet": "forge clean && forge script script/trailblazers-season-2/Deploy.s.sol --tc DeployS2Script --rpc-url https://rpc.mainnet.taiko.xyz --broadcast --gas-estimate-multiplier 200", + "taikoon:deploy:hekla": "forge clean && pnpm compile && forge script script/taikoon/sol/Deploy.s.sol --rpc-url https://rpc.hekla.taiko.xyz --broadcast --gas-estimate-multiplier 200", + "pfp:deploy:hekla": "forge clean && pnpm compile && forge script script/profile/Deploy.s.sol --rpc-url https://rpc.hekla.taiko.xyz --broadcast --gas-estimate-multiplier 200", + "pfp:deploy:mainnet": "forge clean && pnpm compile && forge script script/profile/Deploy.s.sol --rpc-url https://rpc.mainnet.taiko.xyz --broadcast --gas-estimate-multiplier 200", + "tbz:airdrop:hekla": "forge clean && pnpm compile && forge script script/trailblazers-airdrop/Deploy.s.sol --rpc-url https://rpc.hekla.taiko.xyz --broadcast --gas-estimate-multiplier 200", + "tbz:airdrop:mainnet": "forge clean && pnpm compile && forge script script/trailblazers-airdrop/Deploy.s.sol --rpc-url https://rpc.mainnet.taiko.xyz --verify --broadcast --gas-estimate-multiplier 100", + "tbz:upgradeV3:hekla": "forge clean && pnpm compile && forge script script/trailblazers-badges/sol/UpgradeV3.s.sol --rpc-url https://rpc.hekla.taiko.xyz --broadcast --gas-estimate-multiplier 200", + "tbz:upgradeV3:mainnet": "forge clean && pnpm compile && forge script script/trailblazers-badges/sol/UpgradeV3.s.sol --rpc-url https://rpc.mainnet.taiko.xyz --broadcast --gas-estimate-multiplier 100", + "tbz:upgradeV4:mainnet": "forge clean && pnpm compile && forge script script/trailblazers-badges/UpgradeV4.s.sol --rpc-url https://rpc.mainnet.taiko.xyz --broadcast --gas-estimate-multiplier 100", + "tbz-s2:upgradeV2:mainnet": "forge clean && pnpm compile && forge script script/trailblazers-season-2/UpgradeV2.s.sol --rpc-url https://rpc.mainnet.taiko.xyz --broadcast --gas-estimate-multiplier 100", + "tbz-s2:upgradeRecruitmentV2:hekla": "forge clean && pnpm compile && forge script script/trailblazers-season-2/RecruitmentUpgradeV2.s.sol --rpc-url https://rpc.hekla.taiko.xyz --broadcast --gas-estimate-multiplier 200", + "tbz-s2:upgradeRecruitmentV2:mainnet": "forge clean && pnpm compile && forge script script/trailblazers-season-2/RecruitmentUpgradeV2.s.sol --rpc-url https://rpc.mainnet.taiko.xyz --broadcast --gas-estimate-multiplier 100" }, "devDependencies": { "@types/node": "^20.11.30", @@ -45,17 +68,17 @@ "@openzeppelin/contracts": "5.0.2", "@openzeppelin/contracts-upgradeable": "5.0.2", "@openzeppelin/merkle-tree": "^1.0.6", + "@taiko/supplementary-contracts": "workspace:*", "convert-csv-to-json": "^2.46.0", "dotenv": "^16.4.5", "ds-test": "github:dapphub/ds-test#e282159d5170298eb2455a6c05280ab5a73a4ef0", "forge-std": "github:foundry-rs/forge-std", "ipfs-http-client": "^60.0.1", - "merkletreejs": "^0.3.11", + "merkletreejs": "^0.4.0", "murky": "github:dmfxyz/murky", "p256-verifier": "github:taikoxyz/p256-verifier#v0.1.0", "sharp": "^0.33.3", "solady": "github:Vectorized/solady#v0.0.167", - "solidity-stringutils": "github:Arachnid/solidity-stringutils", - "@taiko/supplementary-contracts": "workspace:*" + "solidity-stringutils": "github:Arachnid/solidity-stringutils" } } diff --git a/packages/nfts/script/party-ticket/sol/Deploy.s.sol b/packages/nfts/script/party-ticket/sol/Deploy.s.sol new file mode 100644 index 00000000000..1e574758a2e --- /dev/null +++ b/packages/nfts/script/party-ticket/sol/Deploy.s.sol @@ -0,0 +1,67 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.24; + +import { UtilsScript } from "./Utils.s.sol"; +import { Script, console } from "forge-std/src/Script.sol"; +import { Merkle } from "murky/Merkle.sol"; +import { ERC1967Proxy } from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; +import { TaikoPartyTicket } from "../../../contracts/party-ticket/TaikoPartyTicket.sol"; +import { IMinimalBlacklist } from "@taiko/blacklist/IMinimalBlacklist.sol"; +import { TaikoPartyTicketV2 } from "../../../contracts/party-ticket/TaikoPartyTicketV2.sol"; + +contract DeployScript is Script { + UtilsScript public utils; + string public jsonLocation; + uint256 public deployerPrivateKey; + address public deployerAddress; + + string baseURI = + "https://taikonfts.4everland.link/ipfs/bafybeiep3ju3glnzsrqdzaibv7v5ifa7dy4bkyprwkjz6wytl37oqwcmya"; + IMinimalBlacklist blacklist = IMinimalBlacklist(0xfA5EA6f9A13532cd64e805996a941F101CCaAc9a); + + uint256 mintFee = 0.002 ether; + address payoutWallet = 0x2e44474B7F5726908ef509B6C8d561fA40a52f90; + + function setUp() public { + utils = new UtilsScript(); + utils.setUp(); + + jsonLocation = utils.getContractJsonLocation(); + deployerPrivateKey = utils.getPrivateKey(); + deployerAddress = utils.getAddress(); + } + + function run() public { + string memory jsonRoot = "root"; + + vm.startBroadcast(deployerPrivateKey); + + // deploy token with empty root + address impl = address(new TaikoPartyTicket()); + address proxy = address( + new ERC1967Proxy( + impl, + abi.encodeCall( + TaikoPartyTicket.initialize, (payoutWallet, mintFee, baseURI, blacklist) + ) + ) + ); + + TaikoPartyTicket token = TaikoPartyTicket(proxy); + + console.log("Token Base URI:", baseURI); + console.log("Deployed TaikoPartyTicket to:", address(token)); + /* + token.upgradeToAndCall( + address(new TaikoPartyTicketV2()), abi.encodeCall(TaikoPartyTicketV2.version, ()) + ); + + TaikoPartyTicketV2 tokenV2 = TaikoPartyTicketV2(address(token)); + + */ + string memory finalJson = vm.serializeAddress(jsonRoot, "TaikoPartyTicket", address(token)); + vm.writeJson(finalJson, jsonLocation); + + vm.stopBroadcast(); + } +} diff --git a/packages/nfts/script/party-ticket/sol/UpgradeV2.s.sol b/packages/nfts/script/party-ticket/sol/UpgradeV2.s.sol new file mode 100644 index 00000000000..ffef2740fca --- /dev/null +++ b/packages/nfts/script/party-ticket/sol/UpgradeV2.s.sol @@ -0,0 +1,54 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.24; + +import { UtilsScript } from "./Utils.s.sol"; +import { Script, console } from "forge-std/src/Script.sol"; +import { Merkle } from "murky/Merkle.sol"; +import { ERC1967Proxy } from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; +import { TaikoPartyTicket } from "../../../contracts/party-ticket/TaikoPartyTicket.sol"; +import { IMinimalBlacklist } from "@taiko/blacklist/IMinimalBlacklist.sol"; +import { TaikoPartyTicketV2 } from "../../../contracts/party-ticket/TaikoPartyTicketV2.sol"; + +contract DeployScript is Script { + UtilsScript public utils; + string public jsonLocation; + uint256 public deployerPrivateKey; + address public deployerAddress; + + // hekla + //address tokenV1 = 0x1d504615c42130F4fdbEb87775585B250BA78422; + // mainnet + address tokenV1 = 0x00E6dc8B0a58d505de61309df3568Ba3f9734a6C; + + function setUp() public { + utils = new UtilsScript(); + utils.setUp(); + + jsonLocation = utils.getContractJsonLocation(); + deployerPrivateKey = utils.getPrivateKey(); + deployerAddress = utils.getAddress(); + } + + function run() public { + string memory jsonRoot = "root"; + + vm.startBroadcast(deployerPrivateKey); + + TaikoPartyTicket token = TaikoPartyTicket(tokenV1); + + console.log("Deployed TaikoPartyTicket to:", address(token)); + + token.upgradeToAndCall( + address(new TaikoPartyTicketV2()), abi.encodeCall(TaikoPartyTicketV2.version, ()) + ); + + TaikoPartyTicketV2 tokenV2 = TaikoPartyTicketV2(address(token)); + console.log("Upgraded token to:", address(tokenV2)); + console.log("Version:", tokenV2.version()); + + string memory finalJson = vm.serializeAddress(jsonRoot, "TaikoPartyTicket", address(token)); + vm.writeJson(finalJson, jsonLocation); + + vm.stopBroadcast(); + } +} diff --git a/packages/nfts/script/party-ticket/sol/Utils.s.sol b/packages/nfts/script/party-ticket/sol/Utils.s.sol new file mode 100644 index 00000000000..9f6f58c38ae --- /dev/null +++ b/packages/nfts/script/party-ticket/sol/Utils.s.sol @@ -0,0 +1,77 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.24; + +import { Script, console } from "forge-std/src/Script.sol"; +import "forge-std/src/StdJson.sol"; +import { IMinimalBlacklist } from "@taiko/blacklist/IMinimalBlacklist.sol"; +import { MockBlacklist } from "../../../test/util/Blacklist.sol"; + +contract UtilsScript is Script { + using stdJson for string; + + address public nounsTokenAddress; + + uint256 public chainId; + + string public lowercaseNetworkKey; + string public uppercaseNetworkKey; + + function setUp() public { + // load all network configs + chainId = block.chainid; + + if (chainId == 31_337) { + lowercaseNetworkKey = "localhost"; + uppercaseNetworkKey = "LOCALHOST"; + } else if (chainId == 17_000) { + lowercaseNetworkKey = "holesky"; + uppercaseNetworkKey = "HOLESKY"; + } else if (chainId == 167_001) { + lowercaseNetworkKey = "devnet"; + uppercaseNetworkKey = "DEVNET"; + } else if (chainId == 11_155_111) { + lowercaseNetworkKey = "sepolia"; + uppercaseNetworkKey = "SEPOLIA"; + } else if (chainId == 167_008) { + lowercaseNetworkKey = "katla"; + uppercaseNetworkKey = "KATLA"; + } else if (chainId == 167_000) { + lowercaseNetworkKey = "mainnet"; + uppercaseNetworkKey = "MAINNET"; + } else if (chainId == 167_009) { + lowercaseNetworkKey = "hekla"; + uppercaseNetworkKey = "HEKLA"; + } else { + revert("Unsupported chainId"); + } + } + + function getPrivateKey() public view returns (uint256) { + string memory lookupKey = string.concat(uppercaseNetworkKey, "_PRIVATE_KEY"); + return vm.envUint(lookupKey); + } + + function getAddress() public view returns (address) { + string memory lookupKey = string.concat(uppercaseNetworkKey, "_ADDRESS"); + return vm.envAddress(lookupKey); + } + + function getContractJsonLocation() public view returns (string memory) { + string memory root = vm.projectRoot(); + return string.concat(root, "/deployments/party-ticket/", lowercaseNetworkKey, ".json"); + } + + function getBlacklist() public view returns (IMinimalBlacklist blacklistAddress) { + if (block.chainid == 167_000) { + // mainnet blacklist address + blacklistAddress = IMinimalBlacklist(vm.envAddress("BLACKLIST_ADDRESS")); + } else { + // deploy a mock blacklist otherwise + blacklistAddress = IMinimalBlacklist(0xbdEd0D2bf404bdcBa897a74E6657f1f12e5C6fb6); + } + + return blacklistAddress; + } + + function run() public { } +} diff --git a/packages/nfts/script/profile/Deploy.s.sol b/packages/nfts/script/profile/Deploy.s.sol new file mode 100644 index 00000000000..f032a7a69bd --- /dev/null +++ b/packages/nfts/script/profile/Deploy.s.sol @@ -0,0 +1,44 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.24; + +import { UtilsScript } from "./Utils.s.sol"; +import { Script, console } from "forge-std/src/Script.sol"; +import { ERC1967Proxy } from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; +import { RegisterProfilePicture } from "../../contracts/profile/RegisterProfilePicture.sol"; + +contract DeployScript is Script { + UtilsScript public utils; + string public jsonLocation; + uint256 public deployerPrivateKey; + address public deployerAddress; + + function setUp() public { + utils = new UtilsScript(); + utils.setUp(); + + jsonLocation = utils.getContractJsonLocation(); + deployerPrivateKey = utils.getPrivateKey(); + deployerAddress = utils.getAddress(); + } + + function run() public { + string memory jsonRoot = "root"; + + vm.startBroadcast(deployerPrivateKey); + + // deploy token with empty root + address impl = address(new RegisterProfilePicture()); + address proxy = + address(new ERC1967Proxy(impl, abi.encodeCall(RegisterProfilePicture.initialize, ()))); + + RegisterProfilePicture profile = RegisterProfilePicture(proxy); + + console.log("Deployed Trailblazers PFP to:", address(profile)); + + string memory finalJson = + vm.serializeAddress(jsonRoot, "RegisterProfilePicture", address(profile)); + vm.writeJson(finalJson, jsonLocation); + + vm.stopBroadcast(); + } +} diff --git a/packages/nfts/script/profile/Utils.s.sol b/packages/nfts/script/profile/Utils.s.sol new file mode 100644 index 00000000000..756321175f8 --- /dev/null +++ b/packages/nfts/script/profile/Utils.s.sol @@ -0,0 +1,61 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.24; + +import { Script, console } from "forge-std/src/Script.sol"; +import "forge-std/src/StdJson.sol"; + +contract UtilsScript is Script { + using stdJson for string; + + uint256 public chainId; + + string public lowercaseNetworkKey; + string public uppercaseNetworkKey; + + function setUp() public { + // load all network configs + chainId = block.chainid; + + if (chainId == 31_337) { + lowercaseNetworkKey = "localhost"; + uppercaseNetworkKey = "LOCALHOST"; + } else if (chainId == 17_000) { + lowercaseNetworkKey = "holesky"; + uppercaseNetworkKey = "HOLESKY"; + } else if (chainId == 167_001) { + lowercaseNetworkKey = "devnet"; + uppercaseNetworkKey = "DEVNET"; + } else if (chainId == 11_155_111) { + lowercaseNetworkKey = "sepolia"; + uppercaseNetworkKey = "SEPOLIA"; + } else if (chainId == 167_008) { + lowercaseNetworkKey = "katla"; + uppercaseNetworkKey = "KATLA"; + } else if (chainId == 167_000) { + lowercaseNetworkKey = "mainnet"; + uppercaseNetworkKey = "MAINNET"; + } else if (chainId == 167_009) { + lowercaseNetworkKey = "hekla"; + uppercaseNetworkKey = "HEKLA"; + } else { + revert("Unsupported chainId"); + } + } + + function getPrivateKey() public view returns (uint256) { + string memory lookupKey = string.concat(uppercaseNetworkKey, "_PRIVATE_KEY"); + return vm.envUint(lookupKey); + } + + function getAddress() public view returns (address) { + string memory lookupKey = string.concat(uppercaseNetworkKey, "_ADDRESS"); + return vm.envAddress(lookupKey); + } + + function getContractJsonLocation() public view returns (string memory) { + string memory root = vm.projectRoot(); + return string.concat(root, "/deployments/profile/", lowercaseNetworkKey, ".json"); + } + + function run() public { } +} diff --git a/packages/nfts/script/snaefell/sol/Deploy.s.sol b/packages/nfts/script/snaefell/sol/Deploy.s.sol index 225a3cb0ed2..5aa958f0669 100644 --- a/packages/nfts/script/snaefell/sol/Deploy.s.sol +++ b/packages/nfts/script/snaefell/sol/Deploy.s.sol @@ -6,6 +6,7 @@ import { Script, console } from "forge-std/src/Script.sol"; import { Merkle } from "murky/Merkle.sol"; import { ERC1967Proxy } from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; import { SnaefellToken } from "../../../contracts/snaefell/SnaefellToken.sol"; +import { IMinimalBlacklist } from "@taiko/blacklist/IMinimalBlacklist.sol"; contract DeployScript is Script { UtilsScript public utils; @@ -13,9 +14,12 @@ contract DeployScript is Script { uint256 public deployerPrivateKey; address public deployerAddress; - // Please set owner to labs.taiko.eth (0xB73b0FC4C0Cfc73cF6e034Af6f6b42Ebe6c8b49D) on Mainnnet. - address owner = vm.envAddress("OWNER"); - bytes32 root = vm.envBytes32("MERKLE_ROOT"); + // V2 Taiko Mainnet data + address owner = 0x7d70236E2517f5B95247AF1d806A9E3C328a7860; + bytes32 root = 0xb5edb18eeaeb9c03bde474b7dd392d0594ecc3d9066c7e3c90d611086543d01e; + string baseURI = + "https://taikonfts.4everland.link/ipfs/bafkreib2bkniueraowa23nga3cdijcx7lo4734dmkpgbeiz7hu2yfop4je"; + IMinimalBlacklist blacklist = IMinimalBlacklist(0xfA5EA6f9A13532cd64e805996a941F101CCaAc9a); function setUp() public { utils = new UtilsScript(); @@ -33,15 +37,10 @@ contract DeployScript is Script { vm.startBroadcast(deployerPrivateKey); - string memory baseURI = utils.getIpfsBaseURI(); - address impl = address(new SnaefellToken()); address proxy = address( new ERC1967Proxy( - impl, - abi.encodeCall( - SnaefellToken.initialize, (owner, baseURI, root, utils.getBlacklist()) - ) + impl, abi.encodeCall(SnaefellToken.initialize, (owner, baseURI, root, blacklist)) ) ); diff --git a/packages/nfts/script/taikoon/js/4everland.js b/packages/nfts/script/taikoon/js/4everland.js index 654723c1686..9151e558930 100644 --- a/packages/nfts/script/taikoon/js/4everland.js +++ b/packages/nfts/script/taikoon/js/4everland.js @@ -28,7 +28,7 @@ function populateNFTMetadata(name, description, CID) { return { name, description, - image: CID, + image: `https://taikonfts.4everland.link/ipfs/${CID}`, }; } diff --git a/packages/nfts/script/taikoon/sol/Deploy.s.sol b/packages/nfts/script/taikoon/sol/Deploy.s.sol index fd87b911cc7..b305177b3d8 100644 --- a/packages/nfts/script/taikoon/sol/Deploy.s.sol +++ b/packages/nfts/script/taikoon/sol/Deploy.s.sol @@ -17,10 +17,11 @@ contract DeployScript is Script { address public deployerAddress; // Taiko Mainnet Values - address owner = 0xf8ff2AF0DC1D5BA4811f22aCb02936A1529fd2Be; - bytes32 root = 0xa7e510d5aed347e65609cf6f0e0738cdd752ffdf5980749057c634489fd09fc3; - string baseURI = "bafybeierqzehlrqeqqeb6fwmil4dj3ij2p6exgoj4lysl53fsxwob6wbdy"; - IMinimalBlacklist blacklist = IMinimalBlacklist(0xfA5EA6f9A13532cd64e805996a941F101CCaAc9a); + // address owner = 0xf8ff2AF0DC1D5BA4811f22aCb02936A1529fd2Be; + // bytes32 root = 0xa7e510d5aed347e65609cf6f0e0738cdd752ffdf5980749057c634489fd09fc3; + // string baseURI = + // "https://taikonfts.4everland.link/ipfs/bafybeiegdqpwx3he5dvoxqklspdjekjepjcobfaakyficksratn73qbbyy"; + // IMinimalBlacklist blacklist = IMinimalBlacklist(0xfA5EA6f9A13532cd64e805996a941F101CCaAc9a); // Holesky Testnet Values // address owner = 0xf8ff2AF0DC1D5BA4811f22aCb02936A1529fd2Be; @@ -29,10 +30,11 @@ contract DeployScript is Script { // IMinimalBlacklist blacklist = IMinimalBlacklist(0xe61E9034b5633977eC98E302b33e321e8140F105); // Hardhat Testnet Values - //address owner = 0xf8ff2AF0DC1D5BA4811f22aCb02936A1529fd2Be; - //bytes32 root = 0x1c3b504b4d5640d26ad1aa3b57a9df9ec034f19239768e734b849c306d10b110; - //string baseURI = "bafybeierqzehlrqeqqeb6fwmil4dj3ij2p6exgoj4lysl53fsxwob6wbdy"; - //IMinimalBlacklist blacklist = IMinimalBlacklist(0xe61E9034b5633977eC98E302b33e321e8140F105); + address owner = 0x4100a9B680B1Be1F10Cb8b5a57fE59eA77A8184e; + bytes32 root = 0x1c3b504b4d5640d26ad1aa3b57a9df9ec034f19239768e734b849c306d10b110; + string baseURI = + "https://taikonfts.4everland.link/ipfs/bafybeiegdqpwx3he5dvoxqklspdjekjepjcobfaakyficksratn73qbbyy"; + IMinimalBlacklist blacklist = IMinimalBlacklist(0xe61E9034b5633977eC98E302b33e321e8140F105); function setUp() public { utils = new UtilsScript(); diff --git a/packages/nfts/script/taikoon/sol/UpgradeV2.sol b/packages/nfts/script/taikoon/sol/UpgradeV2.sol new file mode 100644 index 00000000000..24451b43603 --- /dev/null +++ b/packages/nfts/script/taikoon/sol/UpgradeV2.sol @@ -0,0 +1,46 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.24; + +import { UtilsScript } from "./Utils.s.sol"; +import { Script, console } from "forge-std/src/Script.sol"; +import { MerkleMintersScript } from "./MerkleMinters.s.sol"; +import { Merkle } from "murky/Merkle.sol"; +import { ERC1967Proxy } from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; +import { TaikoonToken } from "../../../contracts/taikoon/TaikoonToken.sol"; +import { IMinimalBlacklist } from "@taiko/blacklist/IMinimalBlacklist.sol"; + +contract UpgradeV2 is Script { + UtilsScript public utils; + string public jsonLocation; + uint256 public deployerPrivateKey; + address public deployerAddress; + + address tokenV1 = 0x4A045C5016B200F7E08a4caBB2cdA6E85bF53295; + + string baseURI = + "https://taikonfts.4everland.link/ipfs/bafybeiegdqpwx3he5dvoxqklspdjekjepjcobfaakyficksratn73qbbyy"; + + TaikoonToken public token; + + function setUp() public { + utils = new UtilsScript(); + utils.setUp(); + + jsonLocation = utils.getContractJsonLocation(); + deployerPrivateKey = utils.getPrivateKey(); + deployerAddress = utils.getAddress(); + } + + function run() public { + token = TaikoonToken(tokenV1); + vm.startBroadcast(deployerPrivateKey); + + token.upgradeToAndCall( + address(new TaikoonToken()), abi.encodeCall(TaikoonToken.updateBaseURI, (baseURI)) + ); + + token = TaikoonToken(token); + + console.log("Upgraded TaikoonToken to:", address(token)); + } +} diff --git a/packages/nfts/script/taikoon/sol/Utils.s.sol b/packages/nfts/script/taikoon/sol/Utils.s.sol index 30358e6eef7..4bbef44b9a2 100644 --- a/packages/nfts/script/taikoon/sol/Utils.s.sol +++ b/packages/nfts/script/taikoon/sol/Utils.s.sol @@ -38,6 +38,9 @@ contract UtilsScript is Script { } else if (chainId == 167_000) { lowercaseNetworkKey = "mainnet"; uppercaseNetworkKey = "MAINNET"; + } else if (chainId == 167_009) { + lowercaseNetworkKey = "hekla"; + uppercaseNetworkKey = "HEKLA"; } else { revert("Unsupported chainId"); } diff --git a/packages/nfts/script/trailblazer/eventRegister/Deploy.s.sol b/packages/nfts/script/trailblazer/eventRegister/Deploy.s.sol new file mode 100644 index 00000000000..4a8d576803f --- /dev/null +++ b/packages/nfts/script/trailblazer/eventRegister/Deploy.s.sol @@ -0,0 +1,25 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import { Script, console } from "forge-std/src/Script.sol"; +import { EventRegister } from "../../../contracts/eventRegister/EventRegister.sol"; + +contract DeployEventRegisterScript is Script { + function run() public { + uint256 deployerPrivateKey = vm.envUint("MAINNET_PRIVATE_KEY"); + address deployerAddress = vm.addr(deployerPrivateKey); + + vm.startBroadcast(deployerPrivateKey); + + EventRegister eventRegister = new EventRegister(); + + console.log("Deployed EventRegister to:", address(eventRegister), "from", deployerAddress); + + // Initialize the contract + eventRegister.initialize(); + + console.log("Initialized EventRegister contract."); + + vm.stopBroadcast(); + } +} diff --git a/packages/nfts/script/trailblazer/galxe/Deploy.s.sol b/packages/nfts/script/trailblazer/galxe/Deploy.s.sol new file mode 100644 index 00000000000..c33708d9f73 --- /dev/null +++ b/packages/nfts/script/trailblazer/galxe/Deploy.s.sol @@ -0,0 +1,25 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import { Script, console } from "forge-std/src/Script.sol"; +import { RegisterGalxePoints } from "../../../contracts/galxe/RegisterGalxePoints.sol"; + +contract DeployRegisterMyGalaxyPointScript is Script { + function run() public { + uint256 deployerPrivateKey = vm.envUint("MAINNET_PRIVATE_KEY"); + address deployerAddress = vm.addr(deployerPrivateKey); + + vm.startBroadcast(deployerPrivateKey); + + RegisterGalxePoints registerGalxePoints = new RegisterGalxePoints(); + + console.log( + "Deployed RegisterGalxePoints to:", + address(registerGalxePoints), + "from", + deployerAddress + ); + + vm.stopBroadcast(); + } +} diff --git a/packages/nfts/script/trailblazer/trailblazers-badges/Deploy.s.sol b/packages/nfts/script/trailblazer/trailblazers-badges/Deploy.s.sol new file mode 100644 index 00000000000..932321e9237 --- /dev/null +++ b/packages/nfts/script/trailblazer/trailblazers-badges/Deploy.s.sol @@ -0,0 +1,83 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.24; + +import { UtilsScript, MockBlacklist } from "./Utils.s.sol"; +import { Script, console } from "forge-std/src/Script.sol"; +import { Merkle } from "murky/Merkle.sol"; +import { ERC1967Proxy } from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; +import { TrailblazersBadges } from "../../../contracts/trailblazers-badges/TrailblazersBadges.sol"; +import { IMinimalBlacklist } from "@taiko/blacklist/IMinimalBlacklist.sol"; + +contract DeployScript is Script { + UtilsScript public utils; + string public jsonLocation; + uint256 public deployerPrivateKey; + address public deployerAddress; + + // Taiko Mainnet Values + //address owner = 0xf8ff2AF0DC1D5BA4811f22aCb02936A1529fd2Be; + //bytes32 root = 0xa7e510d5aed347e65609cf6f0e0738cdd752ffdf5980749057c634489fd09fc3; + // string baseURI = "bafybeiebmvj6roz4iuoinackb5c6eeshvppctkydrckqrnxexdnzh6odq4"; + // IMinimalBlacklist blacklist = IMinimalBlacklist(0xfA5EA6f9A13532cd64e805996a941F101CCaAc9a); + + // Holesky Testnet Values + // address owner = 0xf8ff2AF0DC1D5BA4811f22aCb02936A1529fd2Be; + // bytes32 root = 0xf1359c4c4ba41a72025f2534ea8ad23c6b941b55a715838ebdc71202a78c6c87; + // string baseURI = "bafybeiebmvj6roz4iuoinackb5c6eeshvppctkydrckqrnxexdnzh6odq4"; + // IMinimalBlacklist blacklist = IMinimalBlacklist(0xe61E9034b5633977eC98E302b33e321e8140F105); + + // Hardhat Testnet Values + address owner = 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266; + address mintSigner = 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266; + string baseURI = + "https://taikonfts.4everland.link/ipfs/bafybeiebmvj6roz4iuoinackb5c6eeshvppctkydrckqrnxexdnzh6odq4"; + IMinimalBlacklist blacklist = IMinimalBlacklist(0xe61E9034b5633977eC98E302b33e321e8140F105); + + function setUp() public { + utils = new UtilsScript(); + utils.setUp(); + + jsonLocation = utils.getContractJsonLocation(); + deployerPrivateKey = utils.getPrivateKey(); + deployerAddress = utils.getAddress(); + } + + function run() public { + string memory jsonRoot = "root"; + + require(owner != address(0), "Owner must be specified"); + + vm.startBroadcast(deployerPrivateKey); + + if (block.chainid == 167_000) { + // mainnet, use existing blacklist + } else { + blacklist = new MockBlacklist(); + } + + // deploy token with empty root + address impl = address(new TrailblazersBadges()); + address proxy = address( + new ERC1967Proxy( + impl, + abi.encodeCall( + TrailblazersBadges.initialize, (owner, baseURI, mintSigner, blacklist) + ) + ) + ); + + TrailblazersBadges token = TrailblazersBadges(proxy); + + console.log("Token Base URI:", baseURI); + console.log("Deployed TrailblazersBadges to:", address(token)); + + vm.serializeAddress(jsonRoot, "Owner", token.owner()); + vm.serializeAddress(jsonRoot, "MintSigner", token.mintSigner()); + + string memory finalJson = + vm.serializeAddress(jsonRoot, "TrailblazersBadges", address(token)); + vm.writeJson(finalJson, jsonLocation); + + vm.stopBroadcast(); + } +} diff --git a/packages/nfts/script/trailblazer/trailblazers-badges/UpgradeS1.sol b/packages/nfts/script/trailblazer/trailblazers-badges/UpgradeS1.sol new file mode 100644 index 00000000000..662a98a3561 --- /dev/null +++ b/packages/nfts/script/trailblazer/trailblazers-badges/UpgradeS1.sol @@ -0,0 +1,41 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.24; + +import { UtilsScript } from "./Utils.s.sol"; +import { Script, console } from "forge-std/src/Script.sol"; +import { Merkle } from "murky/Merkle.sol"; +import { ERC1967Proxy } from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; +import { TrailblazersBadges } from "../../../contracts/trailblazers-badges/TrailblazersBadges.sol"; +import { IMinimalBlacklist } from "@taiko/blacklist/IMinimalBlacklist.sol"; + +contract UpgradeV2 is Script { + UtilsScript public utils; + string public jsonLocation; + uint256 public deployerPrivateKey; + address public deployerAddress; + + address s1Token = 0xa20a8856e00F5ad024a55A663F06DCc419FFc4d5; + TrailblazersBadges public token; + + function setUp() public { + utils = new UtilsScript(); + utils.setUp(); + + jsonLocation = utils.getContractJsonLocation(); + deployerPrivateKey = utils.getPrivateKey(); + deployerAddress = utils.getAddress(); + } + + function run() public { + token = TrailblazersBadges(s1Token); + vm.startBroadcast(deployerPrivateKey); + + token.upgradeToAndCall( + address(new TrailblazersBadges()), abi.encodeCall(TrailblazersBadges.baseURI, ()) + ); + + token = TrailblazersBadges(token); + + console.log("Upgraded TrailblazersBadges to:", address(token)); + } +} diff --git a/packages/nfts/script/trailblazer/trailblazers-badges/UpgradeV3.s.sol b/packages/nfts/script/trailblazer/trailblazers-badges/UpgradeV3.s.sol new file mode 100644 index 00000000000..e212f866987 --- /dev/null +++ b/packages/nfts/script/trailblazer/trailblazers-badges/UpgradeV3.s.sol @@ -0,0 +1,44 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.24; + +import { UtilsScript } from "./Utils.s.sol"; +import { Script, console } from "forge-std/src/Script.sol"; +import { Merkle } from "murky/Merkle.sol"; +import { ERC1967Proxy } from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; +import { TrailblazersBadges } from "../../../contracts/trailblazers-badges/TrailblazersBadges.sol"; +import { IMinimalBlacklist } from "@taiko/blacklist/IMinimalBlacklist.sol"; +import { TrailblazersBadgesV3 } from + "../../../contracts/trailblazers-badges/TrailblazersBadgesV3.sol"; + +contract UpgradeV3 is Script { + UtilsScript public utils; + string public jsonLocation; + uint256 public deployerPrivateKey; + address public deployerAddress; + + address tokenV2Address = 0xa20a8856e00F5ad024a55A663F06DCc419FFc4d5; + TrailblazersBadges public tokenV2; + TrailblazersBadgesV3 public tokenV3; + + function setUp() public { + utils = new UtilsScript(); + utils.setUp(); + + jsonLocation = utils.getContractJsonLocation(); + deployerPrivateKey = utils.getPrivateKey(); + deployerAddress = utils.getAddress(); + } + + function run() public { + vm.startBroadcast(deployerPrivateKey); + tokenV2 = TrailblazersBadges(tokenV2Address); + + tokenV2.upgradeToAndCall( + address(new TrailblazersBadgesV3()), abi.encodeCall(TrailblazersBadgesV3.version, ()) + ); + + tokenV3 = TrailblazersBadgesV3(address(tokenV2)); + + console.log("Upgraded TrailblazersBadgesV3 to:", address(tokenV3)); + } +} diff --git a/packages/nfts/script/trailblazer/trailblazers-badges/UpgradeV3.sol b/packages/nfts/script/trailblazer/trailblazers-badges/UpgradeV3.sol new file mode 100644 index 00000000000..e212f866987 --- /dev/null +++ b/packages/nfts/script/trailblazer/trailblazers-badges/UpgradeV3.sol @@ -0,0 +1,44 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.24; + +import { UtilsScript } from "./Utils.s.sol"; +import { Script, console } from "forge-std/src/Script.sol"; +import { Merkle } from "murky/Merkle.sol"; +import { ERC1967Proxy } from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; +import { TrailblazersBadges } from "../../../contracts/trailblazers-badges/TrailblazersBadges.sol"; +import { IMinimalBlacklist } from "@taiko/blacklist/IMinimalBlacklist.sol"; +import { TrailblazersBadgesV3 } from + "../../../contracts/trailblazers-badges/TrailblazersBadgesV3.sol"; + +contract UpgradeV3 is Script { + UtilsScript public utils; + string public jsonLocation; + uint256 public deployerPrivateKey; + address public deployerAddress; + + address tokenV2Address = 0xa20a8856e00F5ad024a55A663F06DCc419FFc4d5; + TrailblazersBadges public tokenV2; + TrailblazersBadgesV3 public tokenV3; + + function setUp() public { + utils = new UtilsScript(); + utils.setUp(); + + jsonLocation = utils.getContractJsonLocation(); + deployerPrivateKey = utils.getPrivateKey(); + deployerAddress = utils.getAddress(); + } + + function run() public { + vm.startBroadcast(deployerPrivateKey); + tokenV2 = TrailblazersBadges(tokenV2Address); + + tokenV2.upgradeToAndCall( + address(new TrailblazersBadgesV3()), abi.encodeCall(TrailblazersBadgesV3.version, ()) + ); + + tokenV3 = TrailblazersBadgesV3(address(tokenV2)); + + console.log("Upgraded TrailblazersBadgesV3 to:", address(tokenV3)); + } +} diff --git a/packages/nfts/script/trailblazer/trailblazers-badges/UpgradeV4.s.sol b/packages/nfts/script/trailblazer/trailblazers-badges/UpgradeV4.s.sol new file mode 100644 index 00000000000..d49ad9cb55a --- /dev/null +++ b/packages/nfts/script/trailblazer/trailblazers-badges/UpgradeV4.s.sol @@ -0,0 +1,52 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.24; + +import { UtilsScript } from "./Utils.s.sol"; +import { Script, console } from "forge-std/src/Script.sol"; +import { Merkle } from "murky/Merkle.sol"; +import { ERC1967Proxy } from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; +import { TrailblazersBadges } from "../../../contracts/trailblazers-badges/TrailblazersBadges.sol"; +import { IMinimalBlacklist } from "@taiko/blacklist/IMinimalBlacklist.sol"; +import { TrailblazersBadgesV3 } from + "../../../contracts/trailblazers-badges/TrailblazersBadgesV3.sol"; +import { TrailblazersBadgesV4 } from + "../../../contracts/trailblazers-season-2/TrailblazersS1BadgesV4.sol"; + +contract UpgradeV4 is Script { + UtilsScript public utils; + string public jsonLocation; + uint256 public deployerPrivateKey; + address public deployerAddress; + + address tokenV3Address = 0xa20a8856e00F5ad024a55A663F06DCc419FFc4d5; + TrailblazersBadgesV3 public tokenV3; + TrailblazersBadgesV4 public tokenV4; + + function setUp() public { + utils = new UtilsScript(); + utils.setUp(); + + jsonLocation = utils.getContractJsonLocation(); + deployerPrivateKey = utils.getPrivateKey(); + deployerAddress = utils.getAddress(); + } + + function run() public { + vm.startBroadcast(deployerPrivateKey); + tokenV3 = TrailblazersBadgesV3(tokenV3Address); + + tokenV3.upgradeToAndCall( + address(new TrailblazersBadgesV4()), abi.encodeCall(TrailblazersBadgesV4.version, ()) + ); + + tokenV4 = TrailblazersBadgesV4(address(tokenV3)); + + console.log("Upgraded TrailblazersBadgesV3 to:", address(tokenV4)); + + // update uri + tokenV4.setUri( + "https://taikonfts.4everland.link/ipfs/bafybeiatuzeeeznd3hi5qiulslxcjd22ebu45t4fra2jvi3smhocr2c66a" + ); + console.log("Updated token URI"); + } +} diff --git a/packages/nfts/script/trailblazer/trailblazers-badges/Utils.s.sol b/packages/nfts/script/trailblazer/trailblazers-badges/Utils.s.sol new file mode 100644 index 00000000000..3a0dc45a5c6 --- /dev/null +++ b/packages/nfts/script/trailblazer/trailblazers-badges/Utils.s.sol @@ -0,0 +1,80 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.24; + +import { Script, console } from "forge-std/src/Script.sol"; +import "forge-std/src/StdJson.sol"; +import { MockBlacklist } from "../../../test/util/Blacklist.sol"; +import { IMinimalBlacklist } from "@taiko/blacklist/IMinimalBlacklist.sol"; + +contract UtilsScript is Script { + using stdJson for string; + + address public nounsTokenAddress; + + uint256 public chainId; + + string public lowercaseNetworkKey; + string public uppercaseNetworkKey; + + error UNSUPPORTED_CHAIN_ID(); + + function setUp() public { + // load all network configs + chainId = block.chainid; + + if (chainId == 31_337) { + lowercaseNetworkKey = "localhost"; + uppercaseNetworkKey = "LOCALHOST"; + } else if (chainId == 17_000) { + lowercaseNetworkKey = "holesky"; + uppercaseNetworkKey = "HOLESKY"; + } else if (chainId == 167_001) { + lowercaseNetworkKey = "devnet"; + uppercaseNetworkKey = "DEVNET"; + } else if (chainId == 11_155_111) { + lowercaseNetworkKey = "sepolia"; + uppercaseNetworkKey = "SEPOLIA"; + } else if (chainId == 167_008) { + lowercaseNetworkKey = "katla"; + uppercaseNetworkKey = "KATLA"; + } else if (chainId == 167_000) { + lowercaseNetworkKey = "mainnet"; + uppercaseNetworkKey = "MAINNET"; + } else if (chainId == 167_009) { + lowercaseNetworkKey = "hekla"; + uppercaseNetworkKey = "HEKLA"; + } else { + revert UNSUPPORTED_CHAIN_ID(); + } + } + + function getPrivateKey() public view returns (uint256) { + string memory lookupKey = string.concat(uppercaseNetworkKey, "_PRIVATE_KEY"); + return vm.envUint(lookupKey); + } + + function getAddress() public view returns (address) { + string memory lookupKey = string.concat(uppercaseNetworkKey, "_ADDRESS"); + return vm.envAddress(lookupKey); + } + + function getContractJsonLocation() public view returns (string memory) { + string memory root = vm.projectRoot(); + return + string.concat(root, "/deployments/trailblazers-badges/", lowercaseNetworkKey, ".json"); + } + + function getBlacklist() public view returns (IMinimalBlacklist blacklistAddress) { + if (block.chainid == 167_000) { + // mainnet blacklist address + blacklistAddress = IMinimalBlacklist(vm.envAddress("BLACKLIST_ADDRESS")); + } else { + // deploy a mock blacklist otherwise + blacklistAddress = IMinimalBlacklist(0xbdEd0D2bf404bdcBa897a74E6657f1f12e5C6fb6); + } + + return blacklistAddress; + } + + function run() public { } +} diff --git a/packages/nfts/script/trailblazers-airdrop/Deploy.s.sol b/packages/nfts/script/trailblazers-airdrop/Deploy.s.sol new file mode 100644 index 00000000000..f291a8c3deb --- /dev/null +++ b/packages/nfts/script/trailblazers-airdrop/Deploy.s.sol @@ -0,0 +1,93 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.24; + +import { UtilsScript } from "./Utils.s.sol"; +import { Script, console } from "forge-std/src/Script.sol"; +import { Merkle } from "murky/Merkle.sol"; +import { ERC1967Proxy } from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; +import { TrailblazersBadges } from "../../contracts/trailblazers-badges/TrailblazersBadges.sol"; +import { IMinimalBlacklist } from "@taiko/blacklist/IMinimalBlacklist.sol"; +import { ERC20Airdrop } from "../../contracts/trailblazers-airdrop/ERC20Airdrop.sol"; +import { ERC20Mock } from "../../test/util/MockTokens.sol"; +import "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol"; +import { MockBlacklist } from "../../test/util/Blacklist.sol"; + +contract DeployScript is Script { + UtilsScript public utils; + string public jsonLocation; + uint256 public deployerPrivateKey; + address public deployerAddress; + + // only used for production + IMinimalBlacklist blacklist = IMinimalBlacklist(0xfA5EA6f9A13532cd64e805996a941F101CCaAc9a); + + ERC20Airdrop public airdrop; + uint256 constant TOTAL_AVAILABLE_FUNDS = 1000 ether; + + // hekla test root + bytes32 public merkleRoot = 0xbe8ec647626f95185f551887b3eee43ea9e8965c7baf558a9f8cb22b020597f0; + + // rewards token + ERC20Upgradeable public erc20 = ERC20Upgradeable(0xA9d23408b9bA935c230493c40C73824Df71A0975); + ERC20Mock public mockERC20; + // start and end times for the claim + uint64 constant CLAIM_DURATION = 30 days; + // uint64 public CLAIM_START = uint64(block.timestamp); + uint64 public CLAIM_START = 1_728_683_700; // 2024-06-10 23:55:00 UTC + uint64 public CLAIM_END = CLAIM_START + CLAIM_DURATION; + + function setUp() public { + utils = new UtilsScript(); + utils.setUp(); + + jsonLocation = utils.getContractJsonLocation(); + deployerPrivateKey = utils.getPrivateKey(); + deployerAddress = utils.getAddress(); + + vm.startBroadcast(deployerPrivateKey); + + if (block.chainid != 167_000) { + // not mainnet, create mock contracts + blacklist = new MockBlacklist(); + mockERC20 = new ERC20Mock(); + // mint the necessary funds + erc20 = ERC20Upgradeable(address(mockERC20)); + } + + vm.stopBroadcast(); + } + + function run() public { + string memory jsonRoot = "root"; + + vm.startBroadcast(deployerPrivateKey); + + // deploy token with empty root + address impl = address(new ERC20Airdrop()); + address proxy = address( + new ERC1967Proxy( + impl, + abi.encodeCall( + ERC20Airdrop.init, + (deployerAddress, CLAIM_START, CLAIM_END, merkleRoot, erc20, address(blacklist)) + ) + ) + ); + + airdrop = ERC20Airdrop(proxy); + + // mint the necessary funds on hekla + if (block.chainid != 167_000) { + mockERC20.mint(address(airdrop), TOTAL_AVAILABLE_FUNDS); + } + console.log("ERC20 Token:", address(erc20)); + + console.log("Deployed ERC20Airdrop to:", address(airdrop)); + + vm.serializeBytes32(jsonRoot, "MerkleRoot", merkleRoot); + string memory finalJson = vm.serializeAddress(jsonRoot, "ERC20Airdrop", address(airdrop)); + vm.writeJson(finalJson, jsonLocation); + + vm.stopBroadcast(); + } +} diff --git a/packages/nfts/script/trailblazers-airdrop/Utils.s.sol b/packages/nfts/script/trailblazers-airdrop/Utils.s.sol new file mode 100644 index 00000000000..cb9b6269d5f --- /dev/null +++ b/packages/nfts/script/trailblazers-airdrop/Utils.s.sol @@ -0,0 +1,78 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.24; + +import { Script, console } from "forge-std/src/Script.sol"; +import "forge-std/src/StdJson.sol"; +import { IMinimalBlacklist } from "@taiko/blacklist/IMinimalBlacklist.sol"; +import { MockBlacklist } from "../../test/util/Blacklist.sol"; + +contract UtilsScript is Script { + using stdJson for string; + + address public nounsTokenAddress; + + uint256 public chainId; + + string public lowercaseNetworkKey; + string public uppercaseNetworkKey; + + function setUp() public { + // load all network configs + chainId = block.chainid; + + if (chainId == 31_337) { + lowercaseNetworkKey = "localhost"; + uppercaseNetworkKey = "LOCALHOST"; + } else if (chainId == 17_000) { + lowercaseNetworkKey = "holesky"; + uppercaseNetworkKey = "HOLESKY"; + } else if (chainId == 167_001) { + lowercaseNetworkKey = "devnet"; + uppercaseNetworkKey = "DEVNET"; + } else if (chainId == 11_155_111) { + lowercaseNetworkKey = "sepolia"; + uppercaseNetworkKey = "SEPOLIA"; + } else if (chainId == 167_008) { + lowercaseNetworkKey = "katla"; + uppercaseNetworkKey = "KATLA"; + } else if (chainId == 167_000) { + lowercaseNetworkKey = "mainnet"; + uppercaseNetworkKey = "MAINNET"; + } else if (chainId == 167_009) { + lowercaseNetworkKey = "hekla"; + uppercaseNetworkKey = "HEKLA"; + } else { + revert("Unsupported chainId"); + } + } + + function getPrivateKey() public view returns (uint256) { + string memory lookupKey = string.concat(uppercaseNetworkKey, "_PRIVATE_KEY"); + return vm.envUint(lookupKey); + } + + function getAddress() public view returns (address) { + string memory lookupKey = string.concat(uppercaseNetworkKey, "_ADDRESS"); + return vm.envAddress(lookupKey); + } + + function getContractJsonLocation() public view returns (string memory) { + string memory root = vm.projectRoot(); + return + string.concat(root, "/deployments/trailblazers-airdrop/", lowercaseNetworkKey, ".json"); + } + + function getBlacklist() public view returns (IMinimalBlacklist blacklistAddress) { + if (block.chainid == 167_000) { + // mainnet blacklist address + blacklistAddress = IMinimalBlacklist(vm.envAddress("BLACKLIST_ADDRESS")); + } else { + // deploy a mock blacklist otherwise + blacklistAddress = IMinimalBlacklist(0xbdEd0D2bf404bdcBa897a74E6657f1f12e5C6fb6); + } + + return blacklistAddress; + } + + function run() public { } +} diff --git a/packages/nfts/script/trailblazers-season-2/Deploy.s.sol b/packages/nfts/script/trailblazers-season-2/Deploy.s.sol new file mode 100644 index 00000000000..2775e877772 --- /dev/null +++ b/packages/nfts/script/trailblazers-season-2/Deploy.s.sol @@ -0,0 +1,163 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.24; + +import { UtilsScript, MockBlacklist } from "./Utils.s.sol"; +import { Script, console } from "forge-std/src/Script.sol"; +import { Merkle } from "murky/Merkle.sol"; +import { ERC1967Proxy } from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; +import { TrailblazersBadges } from "../../contracts/trailblazers-badges/TrailblazersBadges.sol"; +import { IMinimalBlacklist } from "@taiko/blacklist/IMinimalBlacklist.sol"; +import { TrailblazersBadgesS2 } from + "../../contracts/trailblazers-season-2/TrailblazersBadgesS2.sol"; +import { TrailblazersBadgesV4 } from + "../../contracts/trailblazers-season-2/TrailblazersS1BadgesV4.sol"; +import { BadgeRecruitment } from "../../contracts/trailblazers-season-2/BadgeRecruitment.sol"; + +contract DeployS2Script is Script { + UtilsScript public utils; + string public jsonLocation; + uint256 public deployerPrivateKey; + address public deployerAddress; + + BadgeRecruitment recruitment; + + // Taiko Mainnet Values + //address owner = 0xf8ff2AF0DC1D5BA4811f22aCb02936A1529fd2Be; + address claimMintSigner = 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266; + address recruitmentSigner = 0x9Fc8d56c7376f9b062FEe7E02BAdFA670d603248; + string baseURI = + "https://taikonfts.4everland.link/ipfs/bafybeiatuzeeeznd3hi5qiulslxcjd22ebu45t4fra2jvi3smhocr2c66a"; + IMinimalBlacklist blacklist = IMinimalBlacklist(0xfA5EA6f9A13532cd64e805996a941F101CCaAc9a); + + uint256 public MAX_INFLUENCES = 5; + uint256 public COOLDOWN_RECRUITMENT = 24 hours; + uint256 public COOLDOWN_INFLUENCE = 30 minutes; + uint256 public INFLUENCE_WEIGHT_PERCENT = 9; + uint256 public MAX_INFLUENCES_DIVIDER = 100; + uint256 public DEFAULT_CYCLE_DURATION = 7 days; + uint256 public s1EndDate = 1_734_350_400; // Dec 16th 2024, noon UTC + uint256 public S1_LOCK_DURATION = (s1EndDate - block.timestamp); + + // Hekla Testnet Values + /* + string baseURI = + "https://taikonfts.4everland.link/ipfs/bafybeiatuzeeeznd3hi5qiulslxcjd22ebu45t4fra2jvi3smhocr2c66a"; + + IMinimalBlacklist blacklist = IMinimalBlacklist(0xe61E9034b5633977eC98E302b33e321e8140F105); + address claimMintSigner = 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266; + address recruitmentSigner = 0x3cda4F2EaC3fc2FdE78B3DFFe1A1A1Eff88c68c5; + + uint256 public MAX_INFLUENCES = 5; + uint256 public COOLDOWN_RECRUITMENT = 5 minutes; + uint256 public COOLDOWN_INFLUENCE = 1 minutes; + uint256 public INFLUENCE_WEIGHT_PERCENT = 9; + uint256 public MAX_INFLUENCES_DIVIDER = 100; + uint256 public DEFAULT_CYCLE_DURATION = 7 days; + uint256 public S1_LOCK_DURATION = 365 days; + */ + + address s1Contract = 0xa20a8856e00F5ad024a55A663F06DCc419FFc4d5; + + function setUp() public { + utils = new UtilsScript(); + utils.setUp(); + + jsonLocation = utils.getContractJsonLocation(); + + deployerPrivateKey = utils.getPrivateKey(); + deployerAddress = utils.getAddress(); + } + + function run() public { + string memory jsonRoot = "root"; + address owner = deployerAddress; + require(owner != address(0), "Owner must be specified"); + + address impl; + address proxy; + TrailblazersBadgesV4 s1Token; + TrailblazersBadgesS2 s2Token; + + vm.startBroadcast(deployerPrivateKey); + + if (block.chainid == 167_000) { + // mainnet, use existing contract + s1Token = TrailblazersBadgesV4(s1Contract); + } else { + // hekla/localhost, deploy a s1 contract + impl = address(new TrailblazersBadges()); + blacklist = new MockBlacklist(); + proxy = address( + new ERC1967Proxy( + impl, + abi.encodeCall( + TrailblazersBadges.initialize, (owner, baseURI, claimMintSigner, blacklist) + ) + ) + ); + + TrailblazersBadges s1TokenV2 = TrailblazersBadges(proxy); + + // upgrade s1 contract to v4 + s1TokenV2.upgradeToAndCall( + address(new TrailblazersBadgesV4()), + abi.encodeCall(TrailblazersBadgesV4.version, ()) + ); + + s1Token = TrailblazersBadgesV4(address(s1TokenV2)); + } + + // deploy s2 contract + impl = address(new TrailblazersBadgesS2()); + proxy = address( + new ERC1967Proxy( + impl, abi.encodeCall(TrailblazersBadgesS2.initialize, (address(owner), baseURI)) + ) + ); + + s2Token = TrailblazersBadgesS2(proxy); + + // deploy the recruitment contract + + BadgeRecruitment.Config memory config = BadgeRecruitment.Config( + COOLDOWN_RECRUITMENT, + COOLDOWN_INFLUENCE, + INFLUENCE_WEIGHT_PERCENT, + MAX_INFLUENCES, + MAX_INFLUENCES_DIVIDER, + DEFAULT_CYCLE_DURATION + ); + + impl = address(new BadgeRecruitment()); + proxy = address( + new ERC1967Proxy( + impl, + abi.encodeCall( + BadgeRecruitment.initialize, + (address(s1Token), address(s2Token), recruitmentSigner, config) + ) + ) + ); + recruitment = BadgeRecruitment(proxy); + + // assign relations + s1Token.setRecruitmentContract(address(recruitment)); + s2Token.setMinter(address(recruitment)); + + // set the lock duration + s1Token.setRecruitmentLockDuration(S1_LOCK_DURATION); + + console.log("Token Base URI:", baseURI); + console.log("Deployed TrailblazersBadgesS2 to:", address(s2Token)); + console.log("Deployed BadgeRecruitment to:", address(recruitment)); + + // Register deployment + vm.serializeAddress(jsonRoot, "TrailblazersBadges", address(s1Token)); + vm.serializeAddress(jsonRoot, "TrailblazersBadgesS2", address(s2Token)); + vm.serializeAddress(jsonRoot, "BadgeRecruitment", address(recruitment)); + string memory finalJson = vm.serializeAddress(jsonRoot, "Owner", s2Token.owner()); + vm.writeJson(finalJson, jsonLocation); + + vm.stopBroadcast(); + } +} diff --git a/packages/nfts/script/trailblazers-season-2/RecruitmentUpgradeV2.s.sol b/packages/nfts/script/trailblazers-season-2/RecruitmentUpgradeV2.s.sol new file mode 100644 index 00000000000..50af179fe7c --- /dev/null +++ b/packages/nfts/script/trailblazers-season-2/RecruitmentUpgradeV2.s.sol @@ -0,0 +1,163 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.24; + +import { UtilsScript, MockBlacklist } from "./Utils.s.sol"; +import { Script, console } from "forge-std/src/Script.sol"; +import { Merkle } from "murky/Merkle.sol"; +import { ERC1967Proxy } from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; +import { TrailblazersBadges } from "../../contracts/trailblazers-badges/TrailblazersBadges.sol"; +import { IMinimalBlacklist } from "@taiko/blacklist/IMinimalBlacklist.sol"; + +import "../../contracts/trailblazers-season-2/TrailblazersBadgesS2.sol"; + +import "../../contracts/trailblazers-season-2/TrailblazersS1BadgesV5.sol"; + +contract UpgradeV2 is Script { + // setup + UtilsScript public utils; + string public jsonLocation; + uint256 public deployerPrivateKey; + address public deployerAddress; + + // deployment vars + TrailblazersBadgesV5 public tokenV5; + BadgeRecruitmentV2 public badgeRecruitmentV2; + + // mainnet config + address public s1TokenAddress = 0xa20a8856e00F5ad024a55A663F06DCc419FFc4d5; + address public badgeRecruitmentAddress = 0xa9Ceb04F3aF71fF123409d426A92BABb5124970C; +/* + // hekla config + string baseURI = + "https://taikonfts.4everland.link/ipfs/bafybeiatuzeeeznd3hi5qiulslxcjd22ebu45t4fra2jvi3smhocr2c66a"; + + IMinimalBlacklist blacklist = IMinimalBlacklist(0xe61E9034b5633977eC98E302b33e321e8140F105); + address claimMintSigner = 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266; + address recruitmentSigner = 0x3cda4F2EaC3fc2FdE78B3DFFe1A1A1Eff88c68c5; + + uint256 public MAX_INFLUENCES = 5; + uint256 public COOLDOWN_RECRUITMENT = 10 minutes; + uint256 public COOLDOWN_INFLUENCE = 5 minutes; + uint256 public INFLUENCE_WEIGHT_PERCENT = 9; + uint256 public MAX_INFLUENCES_DIVIDER = 100; + uint256 public DEFAULT_CYCLE_DURATION = 7 days; + uint256 public s1EndDate = 1_734_350_400; // Dec 16th 2024, noon UTC + uint256 public S1_LOCK_DURATION = (s1EndDate - block.timestamp); +*/ + function setUp() public { + utils = new UtilsScript(); + utils.setUp(); + + jsonLocation = utils.getContractJsonLocation(); + deployerPrivateKey = utils.getPrivateKey(); + deployerAddress = utils.getAddress(); + } + + function run() public { + vm.startBroadcast(deployerPrivateKey); + + // address impl; + // address proxy; + TrailblazersBadgesV4 s1Token; + // TrailblazersBadgesS2 s2Token; + BadgeRecruitment badgeRecruitment; + + if (block.chainid == 167_000) { + // mainnet, use existing contract + s1Token = TrailblazersBadgesV4(s1TokenAddress); + badgeRecruitment = BadgeRecruitment(badgeRecruitmentAddress); + } else { + /* + // non-mainnet, deploy contract chain + impl = address(new TrailblazersBadges()); + blacklist = new MockBlacklist(); + proxy = address( + new ERC1967Proxy( + impl, + abi.encodeCall( + TrailblazersBadges.initialize, + (deployerAddress, baseURI, claimMintSigner, blacklist) + ) + ) + ); + + TrailblazersBadges s1TokenV2 = TrailblazersBadges(proxy); + + // upgrade s1 contract to v4 + s1TokenV2.upgradeToAndCall( + address(new TrailblazersBadgesV4()), + abi.encodeCall(TrailblazersBadgesV4.version, ()) + ); + + s1Token = TrailblazersBadgesV4(address(s1TokenV2)); + + s1Token.setRecruitmentLockDuration(S1_LOCK_DURATION); + + // deploy s2 badges + impl = address(new TrailblazersBadgesS2()); + proxy = address( + new ERC1967Proxy( + impl, + abi.encodeCall(TrailblazersBadgesS2.initialize, (deployerAddress, baseURI)) + ) + ); + + s2Token = TrailblazersBadgesS2(proxy); + + // deploy recruitment contract + BadgeRecruitment.Config memory config = BadgeRecruitment.Config( + COOLDOWN_RECRUITMENT, + COOLDOWN_INFLUENCE, + INFLUENCE_WEIGHT_PERCENT, + MAX_INFLUENCES, + MAX_INFLUENCES_DIVIDER, + DEFAULT_CYCLE_DURATION + ); + impl = address(new BadgeRecruitment()); + proxy = address( + new ERC1967Proxy( + impl, + abi.encodeCall( + BadgeRecruitment.initialize, + (address(s1Token), address(s2Token), recruitmentSigner, config) + ) + ) + ); + + badgeRecruitment = BadgeRecruitment(proxy); + + // overwrite json deployment data + string memory jsonRoot = "root"; + vm.serializeAddress(jsonRoot, "TrailblazersBadges", address(s1Token)); + vm.serializeAddress(jsonRoot, "TrailblazersBadgesS2", address(s2Token)); + vm.serializeAddress(jsonRoot, "BadgeRecruitment", address(badgeRecruitment)); + string memory finalJson = vm.serializeAddress(jsonRoot, "Owner", s2Token.owner()); + vm.writeJson(finalJson, jsonLocation); + + // further setup + s1Token.setRecruitmentContract(address(badgeRecruitment)); + s2Token.setMinter(address(badgeRecruitment)); + */ + } + + // upgrade token contract + s1Token.upgradeToAndCall( + address(new TrailblazersBadgesV5()), abi.encodeCall(TrailblazersBadgesV5.version, ()) + ); + + tokenV5 = TrailblazersBadgesV5(address(s1Token)); + console.log("Upgraded TrailblazersBadgesV4 to:", address(tokenV5)); + + // upgrade recruitment contract + badgeRecruitment.upgradeToAndCall( + address(new BadgeRecruitmentV2()), abi.encodeCall(BadgeRecruitmentV2.version, ()) + ); + + badgeRecruitmentV2 = BadgeRecruitmentV2(address(badgeRecruitment)); + console.log("Upgraded BadgeRecruitment to:", address(badgeRecruitmentV2)); + + // set upgraded recruitment contract + tokenV5.setRecruitmentContractV2(address(badgeRecruitmentV2)); + console.log("Set recruitment contract to:", address(badgeRecruitmentV2)); + } +} diff --git a/packages/nfts/script/trailblazers-season-2/UpgradeV2.s.sol b/packages/nfts/script/trailblazers-season-2/UpgradeV2.s.sol new file mode 100644 index 00000000000..14c71373b27 --- /dev/null +++ b/packages/nfts/script/trailblazers-season-2/UpgradeV2.s.sol @@ -0,0 +1,50 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.24; + +import { UtilsScript } from "./Utils.s.sol"; +import { Script, console } from "forge-std/src/Script.sol"; +import { Merkle } from "murky/Merkle.sol"; +import { ERC1967Proxy } from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; +import { TrailblazersBadges } from "../../contracts/trailblazers-badges/TrailblazersBadges.sol"; +import { IMinimalBlacklist } from "@taiko/blacklist/IMinimalBlacklist.sol"; + +import { TrailblazersBadgesS2 } from + "../../contracts/trailblazers-season-2/TrailblazersBadgesS2.sol"; + +contract UpgradeV2 is Script { + UtilsScript public utils; + string public jsonLocation; + uint256 public deployerPrivateKey; + address public deployerAddress; + + address tokenAddress = 0x52A7dBeC10B404548066F59DE89484e27b4181dA; + TrailblazersBadgesS2 public token; + + function setUp() public { + utils = new UtilsScript(); + utils.setUp(); + + jsonLocation = utils.getContractJsonLocation(); + deployerPrivateKey = utils.getPrivateKey(); + deployerAddress = utils.getAddress(); + } + + function run() public { + vm.startBroadcast(deployerPrivateKey); + token = TrailblazersBadgesS2(tokenAddress); + + token.upgradeToAndCall( + address(new TrailblazersBadgesS2()), abi.encodeCall(TrailblazersBadgesS2.version, ()) + ); + + token = TrailblazersBadgesS2(address(token)); + + console.log("Upgraded TrailblazersBadgesV3 to:", address(token)); + + // update uri + token.setUri( + "https://taikonfts.4everland.link/ipfs/bafybeief7o4u6f676e6uz4yt4cv34ai4mesd7motoq6y4xxaoyjfbna5de" + ); + console.log("Updated token URI"); + } +} diff --git a/packages/nfts/script/trailblazers-season-2/Utils.s.sol b/packages/nfts/script/trailblazers-season-2/Utils.s.sol new file mode 100644 index 00000000000..f52d15f54c8 --- /dev/null +++ b/packages/nfts/script/trailblazers-season-2/Utils.s.sol @@ -0,0 +1,86 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.24; + +import { Script, console } from "forge-std/src/Script.sol"; +import "forge-std/src/StdJson.sol"; +import { IMinimalBlacklist } from "@taiko/blacklist/IMinimalBlacklist.sol"; + +contract UtilsScript is Script { + using stdJson for string; + + address public nounsTokenAddress; + + uint256 public chainId; + + string public lowercaseNetworkKey; + string public uppercaseNetworkKey; + + function setUp() public { + // load all network configs + chainId = block.chainid; + + if (chainId == 31_337) { + lowercaseNetworkKey = "localhost"; + uppercaseNetworkKey = "LOCALHOST"; + } else if (chainId == 17_000) { + lowercaseNetworkKey = "holesky"; + uppercaseNetworkKey = "HOLESKY"; + } else if (chainId == 167_001) { + lowercaseNetworkKey = "devnet"; + uppercaseNetworkKey = "DEVNET"; + } else if (chainId == 11_155_111) { + lowercaseNetworkKey = "sepolia"; + uppercaseNetworkKey = "SEPOLIA"; + } else if (chainId == 167_008) { + lowercaseNetworkKey = "katla"; + uppercaseNetworkKey = "KATLA"; + } else if (chainId == 167_000) { + lowercaseNetworkKey = "mainnet"; + uppercaseNetworkKey = "MAINNET"; + } else if (chainId == 167_009) { + lowercaseNetworkKey = "hekla"; + uppercaseNetworkKey = "HEKLA"; + } else { + revert("Unsupported chainId"); + } + } + + function getPrivateKey() public view returns (uint256) { + string memory lookupKey = string.concat(uppercaseNetworkKey, "_PRIVATE_KEY"); + return vm.envUint(lookupKey); + } + + function getAddress() public view returns (address) { + string memory lookupKey = string.concat(uppercaseNetworkKey, "_ADDRESS"); + return vm.envAddress(lookupKey); + } + + function getContractJsonLocation() public view returns (string memory) { + string memory root = vm.projectRoot(); + return + string.concat(root, "/deployments/trailblazers-season-2/", lowercaseNetworkKey, ".json"); + } + + function getBlacklist() public view returns (IMinimalBlacklist blacklistAddress) { + if (block.chainid == 167_000) { + // mainnet blacklist address + blacklistAddress = IMinimalBlacklist(vm.envAddress("BLACKLIST_ADDRESS")); + } else { + // deploy a mock blacklist otherwise + blacklistAddress = IMinimalBlacklist(0xbdEd0D2bf404bdcBa897a74E6657f1f12e5C6fb6); + } + + return blacklistAddress; + } + + function run() public { } +} + +contract MockBlacklist is IMinimalBlacklist { + function isBlacklisted(address _account) external pure returns (bool) { + if (_account == address(0)) { + return true; + } + return false; + } +} diff --git a/packages/nfts/test/party-ticket/TaikoPartyTicket.t.sol b/packages/nfts/test/party-ticket/TaikoPartyTicket.t.sol new file mode 100644 index 00000000000..8b993c7117a --- /dev/null +++ b/packages/nfts/test/party-ticket/TaikoPartyTicket.t.sol @@ -0,0 +1,285 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.24; + +import { Test } from "forge-std/src/Test.sol"; + +import { TaikoPartyTicket } from "../../contracts/party-ticket/TaikoPartyTicket.sol"; +import { Merkle } from "murky/Merkle.sol"; +import { ERC1967Proxy } from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; +import { MockBlacklist } from "../util/Blacklist.sol"; +import { IMinimalBlacklist } from "@taiko/blacklist/IMinimalBlacklist.sol"; + +contract TaikoPartyTicketV2 is TaikoPartyTicket { + function testV2() public pure returns (bool) { + return true; + } +} + +contract TaikoPartyTicketTest is Test { + TaikoPartyTicket public token; + + address public payoutWallet = vm.addr(0x5); + address public admin = vm.addr(0x6); + + address[3] public minters = [vm.addr(0x1), vm.addr(0x2), vm.addr(0x3)]; + + uint256 constant MINT_FEE = 1.1 ether; + uint256 constant INITIAL_BALANCE = 2 ether; + + MockBlacklist public blacklist; + + function setUp() public { + blacklist = new MockBlacklist(); + // create whitelist merkle tree + vm.startPrank(admin); + + address impl = address(new TaikoPartyTicket()); + address proxy = address( + new ERC1967Proxy( + impl, + abi.encodeCall( + TaikoPartyTicket.initialize, + (payoutWallet, MINT_FEE, "ipfs://baseURI", blacklist) + ) + ) + ); + + token = TaikoPartyTicket(proxy); + + // assign initial balance to all minters + for (uint256 i = 0; i < minters.length; i++) { + vm.deal(minters[i], INITIAL_BALANCE); + } + + vm.stopPrank(); + } + + function test_metadata() public view { + assertEq(token.name(), "TaikoPartyTicket"); + assertEq(token.symbol(), "TPT"); + assertEq(token.totalSupply(), 0); + } + + function test_mint() public { + vm.prank(minters[0]); + token.mint{ value: MINT_FEE }(); + assertEq(token.totalSupply(), 1); + assertEq(token.ownerOf(0), minters[0]); + assertEq(minters[0].balance, INITIAL_BALANCE - MINT_FEE); + } + + function test_mint_admin() public { + vm.prank(admin); + token.mint(minters[1]); + assertEq(token.totalSupply(), 1); + assertEq(token.ownerOf(0), minters[1]); + } + + function test_winnerFlow() public { + // have all minters mint + vm.prank(minters[0]); + token.mint{ value: MINT_FEE }(); + vm.prank(minters[1]); + token.mint{ value: MINT_FEE }(); + vm.prank(minters[2]); + token.mint{ value: MINT_FEE }(); + + // arbitrarily, minters[0] wins + uint256 winnerTokenId = 0; + + // set minters[0] as winner + vm.startPrank(admin); + uint256[] memory winners = new uint256[](1); + winners[0] = winnerTokenId; + // ability to pause the minting and set the winners later + token.pause(); + token.setWinners(winners); + vm.stopPrank(); + // check winner with both tokenId and address + assertTrue(token.isWinner(winnerTokenId)); + assertTrue(token.isWinner(minters[0])); + // and the contract is paused + assertTrue(token.paused()); + // ensure the contract's balance + assertEq(address(token).balance, MINT_FEE * minters.length); + } + + function test_payout() public { + test_winnerFlow(); + uint256 collectedEth = address(token).balance; + vm.prank(admin); + token.payout(); + assertEq(payoutWallet.balance, collectedEth); + assertEq(address(token).balance, 0); + } + + function test_ipfs_metadata() public { + // ensure URIs are "ticket" before setting winners + assertEq(token.baseURI(), "ipfs://baseURI"); + assertEq(token.tokenURI(0), "ipfs://baseURI/raffle.json"); + assertEq(token.tokenURI(1), "ipfs://baseURI/raffle.json"); + // run winner flow + test_winnerFlow(); + // ensure URIs are "winner" and "loser" after setting winners + assertEq(token.tokenURI(0), "ipfs://baseURI/winner.json"); + assertEq(token.tokenURI(1), "ipfs://baseURI/loser.json"); + } + + function test_upgrade() public { + // create the v1 instance of the token + vm.startPrank(admin); + + address impl = address(new TaikoPartyTicket()); + address proxy = address( + new ERC1967Proxy( + impl, + abi.encodeCall( + TaikoPartyTicket.initialize, + (payoutWallet, MINT_FEE, "ipfs://baseURI", blacklist) + ) + ) + ); + + TaikoPartyTicket tokenV1 = TaikoPartyTicket(proxy); + vm.stopPrank(); + + // mint some tokens + vm.prank(minters[0]); + tokenV1.mint{ value: MINT_FEE }(); + vm.prank(minters[1]); + tokenV1.mint{ value: MINT_FEE }(); + vm.prank(minters[2]); + tokenV1.mint{ value: MINT_FEE }(); + + // upgrade to v2 + vm.startPrank(admin); + + tokenV1.upgradeToAndCall( + address(new TaikoPartyTicketV2()), abi.encodeCall(TaikoPartyTicketV2.testV2, ()) + ); + + TaikoPartyTicketV2 tokenV2 = TaikoPartyTicketV2(address(tokenV1)); + + // ensure balances from v1 are still relevant + assertEq(tokenV2.totalSupply(), 3); + assertEq(tokenV2.ownerOf(0), minters[0]); + assertEq(tokenV2.ownerOf(1), minters[1]); + assertEq(tokenV2.ownerOf(2), minters[2]); + + // test the v2 mock method + assertTrue(tokenV2.testV2()); + + vm.stopPrank(); + } + + function test_upgrade_throw() public { + // create the v1 instance of the token + vm.startPrank(admin); + + address impl = address(new TaikoPartyTicket()); + address proxy = address( + new ERC1967Proxy( + impl, + abi.encodeCall( + TaikoPartyTicket.initialize, + (payoutWallet, MINT_FEE, "ipfs://baseURI", blacklist) + ) + ) + ); + + TaikoPartyTicket tokenV1 = TaikoPartyTicket(proxy); + vm.stopPrank(); + + // mint some tokens + vm.prank(minters[0]); + tokenV1.mint{ value: MINT_FEE }(); + vm.prank(minters[1]); + tokenV1.mint{ value: MINT_FEE }(); + vm.prank(minters[2]); + tokenV1.mint{ value: MINT_FEE }(); + + // attempt to upgrade as non-admin + vm.startPrank(minters[0]); + + TaikoPartyTicketV2 v2 = new TaikoPartyTicketV2(); + vm.expectRevert(); + tokenV1.upgradeToAndCall(address(v2), abi.encodeCall(TaikoPartyTicketV2.testV2, ())); + + vm.stopPrank(); + + // upgrade to v2 properly after the failed attempt + vm.startPrank(admin); + + tokenV1.upgradeToAndCall( + address(new TaikoPartyTicketV2()), abi.encodeCall(TaikoPartyTicketV2.testV2, ()) + ); + + TaikoPartyTicketV2 tokenV2 = TaikoPartyTicketV2(address(tokenV1)); + + // ensure balances from v1 are still relevant + assertEq(tokenV2.totalSupply(), 3); + assertEq(tokenV2.ownerOf(0), minters[0]); + assertEq(tokenV2.ownerOf(1), minters[1]); + assertEq(tokenV2.ownerOf(2), minters[2]); + + // test the v2 mock method + assertTrue(tokenV2.testV2()); + + vm.stopPrank(); + } + + function test_revokeWinner() public { + test_winnerFlow(); + // ensure the contract is paused + assertTrue(token.paused()); + // ensure wallet0 is winner + assertTrue(token.isWinner(minters[0])); + + uint256[] memory winnerIds = token.getWinnerTokenIds(); + assertEq(winnerIds.length, 1); + address[] memory winners = token.getWinners(); + assertEq(winners.length, 1); + + // revoke the winner + vm.prank(admin); + token.revokeWinner(winnerIds[0]); + + winnerIds = token.getWinnerTokenIds(); + assertEq(winnerIds.length, 0); + winners = token.getWinners(); + assertEq(winners.length, 0); + } + + function test_revokeAndReplaceWinner() public { + test_winnerFlow(); + // ensure the contract is paused + assertTrue(token.paused()); + + // ensure wallet0 is winner + + assertTrue(token.isWinner(minters[0])); + assertFalse(token.isWinner(minters[1])); + assertFalse(token.isWinner(minters[2])); + + uint256[] memory winnerIds = token.getWinnerTokenIds(); + assertEq(winnerIds.length, 1); + address[] memory winners = token.getWinners(); + assertEq(winners.length, 1); + + // revoke and replace with token id 2 + vm.prank(admin); + token.revokeAndReplaceWinner(winnerIds[0], 2); + + assertFalse(token.isWinner(minters[0])); + assertFalse(token.isWinner(minters[1])); + assertTrue(token.isWinner(minters[2])); + + winnerIds = token.getWinnerTokenIds(); + assertEq(winnerIds.length, 1); + + winners = token.getWinners(); + assertEq(winners.length, 1); + assertEq(winnerIds[0], 2); + assertEq(winners[0], minters[2]); + } +} diff --git a/packages/nfts/test/party-ticket/TaikoPartyTicketV2.t.sol b/packages/nfts/test/party-ticket/TaikoPartyTicketV2.t.sol new file mode 100644 index 00000000000..4eca227cef6 --- /dev/null +++ b/packages/nfts/test/party-ticket/TaikoPartyTicketV2.t.sol @@ -0,0 +1,197 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.24; + +import { Test } from "forge-std/src/Test.sol"; + +import { TaikoPartyTicket } from "../../contracts/party-ticket/TaikoPartyTicket.sol"; +import { Merkle } from "murky/Merkle.sol"; +import { ERC1967Proxy } from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; +import { MockBlacklist } from "../util/Blacklist.sol"; +import { IMinimalBlacklist } from "@taiko/blacklist/IMinimalBlacklist.sol"; +import { TaikoPartyTicketV2 } from "../../contracts/party-ticket/TaikoPartyTicketV2.sol"; + +contract TaikoPartyTicketTest is Test { + TaikoPartyTicket public tokenV1; + TaikoPartyTicketV2 public tokenV2; + + address public payoutWallet = vm.addr(0x5); + address public admin = vm.addr(0x6); + + address[3] public minters = [vm.addr(0x1), vm.addr(0x2), vm.addr(0x3)]; + + uint256 constant MINT_FEE = 1.1 ether; + uint256 constant INITIAL_BALANCE = 2 ether; + + MockBlacklist public blacklist; + + function setUp() public { + blacklist = new MockBlacklist(); + // create whitelist merkle tree + vm.startPrank(admin); + + address impl = address(new TaikoPartyTicket()); + address proxy = address( + new ERC1967Proxy( + impl, + abi.encodeCall( + TaikoPartyTicket.initialize, + (payoutWallet, MINT_FEE, "ipfs://baseURI", blacklist) + ) + ) + ); + + tokenV1 = TaikoPartyTicket(proxy); + + // deploy v2 upgrade + + tokenV1.upgradeToAndCall( + address(new TaikoPartyTicketV2()), abi.encodeCall(TaikoPartyTicketV2.version, ()) + ); + + tokenV2 = TaikoPartyTicketV2(address(tokenV1)); + + // assign initial balance to all minters + for (uint256 i = 0; i < minters.length; i++) { + vm.deal(minters[i], INITIAL_BALANCE); + } + + vm.stopPrank(); + } + + function test_metadata() public view { + assertEq(tokenV2.name(), "TaikoPartyTicket"); + assertEq(tokenV2.symbol(), "TPT"); + assertEq(tokenV2.totalSupply(), 0); + } + + function test_mint() public { + vm.prank(minters[0]); + tokenV2.mint{ value: MINT_FEE }(); + assertEq(tokenV2.totalSupply(), 1); + assertEq(tokenV2.ownerOf(0), minters[0]); + assertEq(minters[0].balance, INITIAL_BALANCE - MINT_FEE); + } + + function test_mint_admin() public { + vm.prank(admin); + tokenV2.mint(minters[1]); + assertEq(tokenV2.totalSupply(), 1); + assertEq(tokenV2.ownerOf(0), minters[1]); + } + + function test_winnerFlow() public { + // have all minters mint + vm.prank(minters[0]); + tokenV2.mint{ value: MINT_FEE }(); + vm.prank(minters[1]); + tokenV2.mint{ value: MINT_FEE }(); + vm.prank(minters[2]); + tokenV2.mint{ value: MINT_FEE }(); + + // set minters[0] as winner + vm.startPrank(admin); + uint256[] memory winners = new uint256[](2); + // assign the winners + winners[0] = 0; + winners[1] = 1; + // ability to pause the minting and set the winners later + tokenV2.pause(); + tokenV2.setWinners(winners); + vm.stopPrank(); + // check winner with both tokenId and address + assertTrue(tokenV2.isWinner(0)); + assertTrue(tokenV2.isWinner(minters[0])); + assertTrue(tokenV2.isWinner(minters[1])); + assertFalse(tokenV2.isWinner(minters[2])); + // check golden winner + assertTrue(tokenV2.isGoldenWinner(0)); + assertTrue(tokenV2.isGoldenWinner(minters[0])); + assertFalse(tokenV2.isGoldenWinner(1)); + assertFalse(tokenV2.isGoldenWinner(minters[1])); + assertFalse(tokenV2.isGoldenWinner(2)); + assertFalse(tokenV2.isGoldenWinner(minters[2])); + + // and the contract is paused + assertTrue(tokenV2.paused()); + // ensure the contract's balance + assertEq(address(tokenV2).balance, MINT_FEE * minters.length); + } + + function test_payout() public { + test_winnerFlow(); + uint256 collectedEth = address(tokenV2).balance; + vm.prank(admin); + tokenV2.payout(); + assertEq(payoutWallet.balance, collectedEth); + assertEq(address(tokenV2).balance, 0); + } + + function test_ipfs_metadata_goldenWinner() public { + // ensure URIs are "ticket" before setting winners + assertEq(tokenV2.baseURI(), "ipfs://baseURI"); + assertEq(tokenV2.tokenURI(0), "ipfs://baseURI/raffle.json"); + assertEq(tokenV2.tokenURI(1), "ipfs://baseURI/raffle.json"); + // run winner flow + test_winnerFlow(); + // ensure URIs are "winner" and "loser" after setting winners + assertEq(tokenV2.tokenURI(0), "ipfs://baseURI/golden-winner.json"); + assertEq(tokenV2.tokenURI(1), "ipfs://baseURI/winner.json"); + assertEq(tokenV2.tokenURI(2), "ipfs://baseURI/loser.json"); + } + + function test_revokeWinner() public { + test_winnerFlow(); + // ensure the contract is paused + assertTrue(tokenV2.paused()); + // ensure wallet0 is winner + assertTrue(tokenV2.isWinner(minters[0])); + + uint256[] memory winnerIds = tokenV2.getWinnerTokenIds(); + assertEq(winnerIds.length, 2); + address[] memory winners = tokenV2.getWinners(); + assertEq(winners.length, 2); + + // revoke the winner + vm.prank(admin); + tokenV2.revokeWinner(winnerIds[0]); + + winnerIds = tokenV2.getWinnerTokenIds(); + assertEq(winnerIds.length, 1); + winners = tokenV2.getWinners(); + assertEq(winners.length, 1); + } + + function test_revokeAndReplaceWinner() public { + test_winnerFlow(); + // ensure the contract is paused + assertTrue(tokenV2.paused()); + + // ensure wallet0 is winner + assertTrue(tokenV2.isWinner(minters[0])); + assertTrue(tokenV2.isWinner(minters[1])); + assertFalse(tokenV2.isWinner(minters[2])); + + uint256[] memory winnerIds = tokenV2.getWinnerTokenIds(); + assertEq(winnerIds.length, 2); + address[] memory winners = tokenV2.getWinners(); + assertEq(winners.length, 2); + + // revoke and replace with token id 2 + vm.prank(admin); + tokenV2.revokeAndReplaceWinner(winnerIds[0], 2); + + assertFalse(tokenV2.isWinner(minters[0])); + assertTrue(tokenV2.isWinner(minters[1])); + assertTrue(tokenV2.isWinner(minters[2])); + + winnerIds = tokenV2.getWinnerTokenIds(); + assertEq(winnerIds.length, 2); + + winners = tokenV2.getWinners(); + assertEq(winners.length, 2); + + assertFalse(tokenV2.isWinner(minters[0])); + assertTrue(tokenV2.isWinner(minters[1])); + assertTrue(tokenV2.isWinner(minters[2])); + } +} diff --git a/packages/nfts/test/profile/RegisterProfilePicture.t.sol b/packages/nfts/test/profile/RegisterProfilePicture.t.sol new file mode 100644 index 00000000000..4d17c1440ac --- /dev/null +++ b/packages/nfts/test/profile/RegisterProfilePicture.t.sol @@ -0,0 +1,266 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.24; + +import { Test, console } from "forge-std/src/Test.sol"; +import { RegisterProfilePicture } from "../../contracts/profile/RegisterProfilePicture.sol"; +import { ERC1967Proxy } from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; +import { ERC721Mock, ERC1155Mock, MockInvalidNFT } from "../util/MockTokens.sol"; + +contract RegisterProfilePictureTest is Test { + RegisterProfilePicture public registerProfilePicture; + ERC721Mock public erc721Mock; + ERC1155Mock public erc1155Mock; + MockInvalidNFT public invalidNFT; + + address public owner; + address public user; + address public otherUser; + + uint256 public constant ERC721_TOKEN_ID = 1; + uint256 public constant ERC1155_TOKEN_ID = 2; + + event ProfilePictureSet( + address indexed user, address indexed nftContract, uint256 indexed tokenId + ); + + function setUp() public { + owner = vm.addr(0x1); + user = vm.addr(0x2); + otherUser = vm.addr(0x3); + + vm.startBroadcast(owner); + + RegisterProfilePicture impl = new RegisterProfilePicture(); + ERC1967Proxy proxy = + new ERC1967Proxy(address(impl), abi.encodeCall(RegisterProfilePicture.initialize, ())); + registerProfilePicture = RegisterProfilePicture(address(proxy)); + + erc721Mock = new ERC721Mock(); + erc721Mock.initialize("MockERC721", "M721"); + erc721Mock.mint(user, ERC721_TOKEN_ID); + + erc1155Mock = new ERC1155Mock(); + erc1155Mock.initialize("https://token-cdn-domain/{id}.json"); + erc1155Mock.mint(user, ERC1155_TOKEN_ID, 1, ""); + + invalidNFT = new MockInvalidNFT(); + + vm.stopBroadcast(); + } + + function test_SetPFPWithERC721() public { + vm.startPrank(user); + + registerProfilePicture.setPFP(address(erc721Mock), ERC721_TOKEN_ID); + + (address nftContract, uint256 tokenId) = registerProfilePicture.profilePicture(user); + assertEq(nftContract, address(erc721Mock)); + assertEq(tokenId, ERC721_TOKEN_ID); + + vm.stopPrank(); + } + + function test_SetPFPWithERC1155() public { + vm.startPrank(user); + + registerProfilePicture.setPFP(address(erc1155Mock), ERC1155_TOKEN_ID); + + (address nftContract, uint256 tokenId) = registerProfilePicture.profilePicture(user); + assertEq(nftContract, address(erc1155Mock)); + assertEq(tokenId, ERC1155_TOKEN_ID); + + vm.stopPrank(); + } + + function test_GetProfilePictureERC721() public { + vm.startPrank(user); + registerProfilePicture.setPFP(address(erc721Mock), ERC721_TOKEN_ID); + string memory uri = registerProfilePicture.getProfilePicture(user); + assertEq(uri, erc721Mock.tokenURI(ERC721_TOKEN_ID)); + vm.stopPrank(); + } + + function test_GetProfilePictureERC1155() public { + vm.startPrank(user); + registerProfilePicture.setPFP(address(erc1155Mock), ERC1155_TOKEN_ID); + string memory uri = registerProfilePicture.getProfilePicture(user); + assertEq(uri, erc1155Mock.uri(ERC1155_TOKEN_ID)); + vm.stopPrank(); + } + + function test_CannotSetPFPWithInvalidNFTContract() public { + vm.startPrank(user); + + // Expect any kind of revert when trying to set PFP with invalid NFT contract + vm.expectRevert(); + registerProfilePicture.setPFP(address(invalidNFT), 1); + + vm.stopPrank(); + } + + function test_CannotSetPFPWithNonOwnedERC721() public { + vm.startPrank(otherUser); + + vm.expectRevert( + abi.encodeWithSignature( + "NotTokenOwner(address,uint256,address)", + address(erc721Mock), + ERC721_TOKEN_ID, + otherUser + ) + ); + registerProfilePicture.setPFP(address(erc721Mock), ERC721_TOKEN_ID); + + vm.stopPrank(); + } + + function test_CannotSetPFPWithNonOwnedERC1155() public { + vm.startPrank(otherUser); + + vm.expectRevert( + abi.encodeWithSignature( + "NotTokenOwner(address,uint256,address)", + address(erc1155Mock), + ERC1155_TOKEN_ID, + otherUser + ) + ); + registerProfilePicture.setPFP(address(erc1155Mock), ERC1155_TOKEN_ID); + + vm.stopPrank(); + } + + function test_CannotGetProfilePictureAfterTransferERC721() public { + vm.startPrank(user); + + registerProfilePicture.setPFP(address(erc721Mock), ERC721_TOKEN_ID); + erc721Mock.transferFrom(user, otherUser, ERC721_TOKEN_ID); + + vm.expectRevert( + abi.encodeWithSignature( + "NotTokenOwner(address,uint256,address)", address(erc721Mock), ERC721_TOKEN_ID, user + ) + ); + registerProfilePicture.getProfilePicture(user); + + vm.stopPrank(); + } + + function test_CannotGetProfilePictureAfterTransferERC1155() public { + vm.startPrank(user); + + registerProfilePicture.setPFP(address(erc1155Mock), ERC1155_TOKEN_ID); + erc1155Mock.safeTransferFrom(user, otherUser, ERC1155_TOKEN_ID, 1, ""); + + vm.expectRevert( + abi.encodeWithSignature( + "NotTokenOwner(address,uint256,address)", + address(erc1155Mock), + ERC1155_TOKEN_ID, + user + ) + ); + registerProfilePicture.getProfilePicture(user); + + vm.stopPrank(); + } + + function test_ChangeProfilePicture() public { + vm.startPrank(user); + + registerProfilePicture.setPFP(address(erc721Mock), ERC721_TOKEN_ID); + + registerProfilePicture.setPFP(address(erc1155Mock), ERC1155_TOKEN_ID); + + (address nftContract, uint256 tokenId) = registerProfilePicture.profilePicture(user); + assertEq(nftContract, address(erc1155Mock)); + assertEq(tokenId, ERC1155_TOKEN_ID); + + vm.stopPrank(); + } + + function test_upgrade() public { + // Step 1: Deploy the initial implementation (v1) using the proxy + vm.startPrank(owner); + + // Deploy v1 implementation and proxy pointing to v1 + address implV1 = address(new RegisterProfilePicture()); + ERC1967Proxy proxy = new ERC1967Proxy(implV1, abi.encodeWithSignature("initialize()")); + RegisterProfilePicture tokenV1 = RegisterProfilePicture(address(proxy)); + + vm.stopPrank(); + + // Step 2: Interact with v1 + vm.startPrank(user); + tokenV1.setPFP(address(erc721Mock), ERC721_TOKEN_ID); + + // Verify that the PFP was set correctly + string memory uri = tokenV1.getProfilePicture(user); + assertEq(uri, erc721Mock.tokenURI(ERC721_TOKEN_ID)); + vm.stopPrank(); + + // Step 3: Upgrade to v2 + vm.startPrank(owner); + address implV2 = address(new RegisterProfilePicture()); + tokenV1.upgradeToAndCall(implV2, ""); + + // Verify that the previous state is still relevant after the upgrade + RegisterProfilePicture tokenV2 = RegisterProfilePicture(address(proxy)); + uri = tokenV2.getProfilePicture(user); + assertEq(uri, erc721Mock.tokenURI(ERC721_TOKEN_ID)); + vm.stopPrank(); + + // Step 4: Test setting and retrieving PFP with ERC1155 after the upgrade + vm.startPrank(user); + tokenV2.setPFP(address(erc1155Mock), ERC1155_TOKEN_ID); + + uri = tokenV2.getProfilePicture(user); + assertEq(uri, erc1155Mock.uri(ERC1155_TOKEN_ID)); + vm.stopPrank(); + } + + function test_upgrade_throw() public { + // Step 1: Deploy the initial implementation (v1) using the proxy + vm.startPrank(owner); + + // Deploy v1 implementation and proxy pointing to v1 + address implV1 = address(new RegisterProfilePicture()); + ERC1967Proxy proxy = new ERC1967Proxy(implV1, abi.encodeWithSignature("initialize()")); + RegisterProfilePicture tokenV1 = RegisterProfilePicture(address(proxy)); + + vm.stopPrank(); + + // Step 2: Interact with v1 + vm.startPrank(user); + tokenV1.setPFP(address(erc721Mock), ERC721_TOKEN_ID); + + // Verify that the PFP was set correctly + string memory uri = tokenV1.getProfilePicture(user); + assertEq(uri, erc721Mock.tokenURI(ERC721_TOKEN_ID)); + + // Attempt to upgrade as a non-owner and expect a revert + address implV2 = address(new RegisterProfilePicture()); + vm.expectRevert(); + tokenV1.upgradeToAndCall(implV2, ""); + vm.stopPrank(); + + // Step 3: Upgrade to v2 by the owner + vm.startPrank(owner); + implV2 = address(new RegisterProfilePicture()); + tokenV1.upgradeToAndCall(implV2, ""); + + // Verify that the previous state is still relevant after the upgrade + RegisterProfilePicture tokenV2 = RegisterProfilePicture(address(proxy)); + uri = tokenV2.getProfilePicture(user); + assertEq(uri, erc721Mock.tokenURI(ERC721_TOKEN_ID)); + vm.stopPrank(); + + // Step 4: Test setting and retrieving PFP with ERC1155 after the upgrade + vm.startPrank(user); + tokenV2.setPFP(address(erc1155Mock), ERC1155_TOKEN_ID); + + uri = tokenV2.getProfilePicture(user); + assertEq(uri, erc1155Mock.uri(ERC1155_TOKEN_ID)); + vm.stopPrank(); + } +} diff --git a/packages/nfts/test/taikoon/Upgradeable.t.sol b/packages/nfts/test/taikoon/Upgradeable.t.sol index 5665b4d245d..4c648625dad 100644 --- a/packages/nfts/test/taikoon/Upgradeable.t.sol +++ b/packages/nfts/test/taikoon/Upgradeable.t.sol @@ -8,6 +8,10 @@ import "forge-std/src/StdJson.sol"; import { UtilsScript } from "../../script/taikoon/sol/Utils.s.sol"; import { MockBlacklist } from "../util/Blacklist.sol"; +import "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol"; +import { ITransparentUpgradeableProxy } from + "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; +import "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; import { ERC1967Proxy } from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; contract UpgradeableTest is Test { @@ -16,6 +20,7 @@ contract UpgradeableTest is Test { UtilsScript public utils; TaikoonToken public token; + TaikoonToken public tokenV2; address public owner = vm.addr(0x5); @@ -34,26 +39,50 @@ contract UpgradeableTest is Test { blacklist = new MockBlacklist(); // create whitelist merkle tree - vm.startPrank(owner); + vm.startBroadcast(owner); bytes32 root = tree.getRoot(leaves); // deploy token with empty root - address impl = address(new TaikoonToken()); - address proxy = address( - new ERC1967Proxy( - impl, - abi.encodeCall(TaikoonToken.initialize, (address(0), "ipfs://", root, blacklist)) - ) + token = new TaikoonToken(); + address impl = address(token); + + ERC1967Proxy proxy = new ERC1967Proxy( + impl, abi.encodeCall(TaikoonToken.initialize, (owner, "ipfs://", root, blacklist)) ); + token = TaikoonToken(address(proxy)); + + // mint tokens on the v1 deployment + token.mint(minters[0], 5); + + // upgrade to v2 + + token.upgradeToAndCall( + address(new TaikoonToken()), abi.encodeCall(TaikoonToken.updateBaseURI, ("ipfs://v2//")) + ); + + tokenV2 = TaikoonToken(address(proxy)); + + vm.stopBroadcast(); + } + + function test_upgraded_v2() public view { + assertEq(tokenV2.name(), token.name()); + assertEq(tokenV2.symbol(), token.symbol()); + assertEq(tokenV2.totalSupply(), token.totalSupply()); + assertEq(tokenV2.maxSupply(), token.maxSupply()); + } + + function test_tokenURI() public view { + assertEq(tokenV2.baseURI(), "ipfs://v2//"); + string memory uri = tokenV2.tokenURI(0); + assertEq(uri, "ipfs://v2///0.json"); + } + + function test_updateBaseURI() public { + vm.startBroadcast(owner); + tokenV2.updateBaseURI("ipfs://test//"); + vm.stopBroadcast(); - token = TaikoonToken(proxy); - // use the token to calculate leaves - for (uint256 i = 0; i < minters.length; i++) { - leaves[i] = token.leaf(minters[i], FREE_MINTS); - } - // update the root - root = tree.getRoot(leaves); - token.updateRoot(root); - vm.stopPrank(); + assertEq(tokenV2.baseURI(), "ipfs://test//"); } } diff --git a/packages/nfts/test/trailblazer/eventRegister/EventRegister.t.sol b/packages/nfts/test/trailblazer/eventRegister/EventRegister.t.sol new file mode 100644 index 00000000000..2176e69830a --- /dev/null +++ b/packages/nfts/test/trailblazer/eventRegister/EventRegister.t.sol @@ -0,0 +1,269 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import { Test } from "forge-std/src/Test.sol"; +import "../../../contracts/eventRegister/EventRegister.sol"; + +contract EventRegisterTest is Test { + EventRegister public eventRegister; + + address public owner = address(0x1); + address public manager = address(0x2); + address public user1 = address(0x3); + address public user2 = address(0x4); + + string public eventName1 = "Spring Season"; + string public eventName2 = "Summer Season"; + + function setUp() public { + vm.startPrank(owner); + eventRegister = new EventRegister(); + vm.stopPrank(); + + vm.startPrank(owner); + eventRegister.grantEventManagerRole(manager); + vm.stopPrank(); + } + + function testDeployerHasAdminRole() public view { + assertTrue( + eventRegister.hasRole(eventRegister.DEFAULT_ADMIN_ROLE(), owner), + "Owner should have DEFAULT_ADMIN_ROLE" + ); + } + + function testManagerHasEventManagerRole() public view { + assertTrue( + eventRegister.hasRole(eventRegister.EVENT_MANAGER_ROLE(), manager), + "Manager should have EVENT_MANAGER_ROLE" + ); + } + + function testAdminCanGrantEventManagerRole() public { + vm.startPrank(owner); + eventRegister.grantEventManagerRole(user1); + vm.stopPrank(); + + assertTrue( + eventRegister.hasRole(eventRegister.EVENT_MANAGER_ROLE(), user1), + "User1 should have EVENT_MANAGER_ROLE" + ); + } + + function testAdminCanRevokeEventManagerRole() public { + vm.startPrank(owner); + eventRegister.grantEventManagerRole(user1); + eventRegister.revokeEventManagerRole(user1); + vm.stopPrank(); + + assertFalse( + eventRegister.hasRole(eventRegister.EVENT_MANAGER_ROLE(), user1), + "User1 should not have EVENT_MANAGER_ROLE" + ); + } + + function testOnlyEventManagersCanCreateEvents() public { + vm.startPrank(user1); + vm.expectRevert(); + eventRegister.createEvent(eventName1); + vm.stopPrank(); + + vm.startPrank(manager); + eventRegister.createEvent(eventName1); + vm.stopPrank(); + + (uint256 id, string memory name, bool registrationOpen) = eventRegister.getEvent(0); + assertEq(id, 0, "Event ID should be 0"); + assertEq(name, eventName1, "Event name should match"); + assertTrue(registrationOpen, "Registration should be open"); + } + + function testOpenAndCloseRegistrations() public { + vm.startPrank(manager); + eventRegister.createEvent(eventName1); + eventRegister.closeRegistration(0); + vm.stopPrank(); + + vm.startPrank(user1); + vm.expectRevert("Registrations closed"); + eventRegister.register(0); + vm.stopPrank(); + + vm.startPrank(manager); + eventRegister.openRegistration(0); + vm.stopPrank(); + + vm.startPrank(user1); + eventRegister.register(0); + vm.stopPrank(); + + assertTrue(eventRegister.isRegistered(0, user1), "User1 should be registered"); + } + + function testOnlyEventManagersCanOpenCloseRegistrations() public { + vm.startPrank(manager); + eventRegister.createEvent(eventName1); + vm.stopPrank(); + + vm.startPrank(user1); + vm.expectRevert(); + eventRegister.closeRegistration(0); + vm.stopPrank(); + + vm.startPrank(user1); + vm.expectRevert(); + eventRegister.openRegistration(0); + vm.stopPrank(); + } + + function testUserCanRegisterForOpenEvent() public { + vm.startPrank(manager); + eventRegister.createEvent(eventName1); + vm.stopPrank(); + + vm.startPrank(user1); + eventRegister.register(0); + vm.stopPrank(); + + assertTrue(eventRegister.isRegistered(0, user1), "User1 should be registered for event 0"); + } + + function testUserCannotRegisterTwice() public { + vm.startPrank(manager); + eventRegister.createEvent(eventName1); + vm.stopPrank(); + + vm.startPrank(user1); + eventRegister.register(0); + vm.expectRevert("Already registered"); + eventRegister.register(0); + vm.stopPrank(); + } + + function testUserCannotRegisterForNonExistentEvent() public { + vm.startPrank(user1); + vm.expectRevert("Event not found"); + eventRegister.register(999); + vm.stopPrank(); + } + + function testCannotCreateEventAsNonManager() public { + vm.startPrank(user1); + vm.expectRevert(); + eventRegister.createEvent("Autumn Season"); + vm.stopPrank(); + } + + function testCannotOpenRegistrationAsNonManager() public { + vm.startPrank(manager); + eventRegister.createEvent(eventName1); + vm.stopPrank(); + + vm.startPrank(user1); + vm.expectRevert(); + eventRegister.openRegistration(0); + vm.stopPrank(); + } + + function testCannotCloseRegistrationAsNonManager() public { + vm.startPrank(manager); + eventRegister.createEvent(eventName1); + vm.stopPrank(); + + vm.startPrank(user1); + vm.expectRevert(); + eventRegister.closeRegistration(0); + vm.stopPrank(); + } + + function testMultipleEventCreation() public { + vm.startPrank(manager); + eventRegister.createEvent(eventName1); + eventRegister.createEvent(eventName2); + vm.stopPrank(); + + (uint256 id1, string memory name1, bool regOpen1) = eventRegister.getEvent(0); + assertEq(id1, 0, "First event ID should be 0"); + assertEq(name1, eventName1, "First event name should match"); + assertTrue(regOpen1, "First event registration should be open"); + + (uint256 id2, string memory name2, bool regOpen2) = eventRegister.getEvent(1); + assertEq(id2, 1, "Second event ID should be 1"); + assertEq(name2, eventName2, "Second event name should match"); + assertTrue(regOpen2, "Second event registration should be open"); + } + + function testCannotCloseAlreadyClosedRegistration() public { + vm.startPrank(manager); + eventRegister.createEvent(eventName1); + eventRegister.closeRegistration(0); + vm.expectRevert("Already closed"); + eventRegister.closeRegistration(0); + vm.stopPrank(); + } + + function testCannotOpenAlreadyOpenRegistration() public { + vm.startPrank(manager); + eventRegister.createEvent(eventName1); + vm.expectRevert("Already open"); + eventRegister.openRegistration(0); + vm.stopPrank(); + } + + function testCannotRegisterAfterClosingRegistration() public { + vm.startPrank(manager); + eventRegister.createEvent(eventName1); + eventRegister.closeRegistration(0); + vm.stopPrank(); + + vm.startPrank(user1); + vm.expectRevert("Registrations closed"); + eventRegister.register(0); + vm.stopPrank(); + } + + function testMultipleUsersRegistration() public { + vm.startPrank(manager); + eventRegister.createEvent(eventName1); + vm.stopPrank(); + + vm.startPrank(user1); + eventRegister.register(0); + vm.stopPrank(); + + vm.startPrank(user2); + eventRegister.register(0); + vm.stopPrank(); + + assertTrue(eventRegister.isRegistered(0, user1), "User1 should be registered"); + assertTrue(eventRegister.isRegistered(0, user2), "User2 should be registered"); + } + + function testGetRegisteredEvents() public { + vm.startPrank(manager); + eventRegister.createEvent(eventName1); + eventRegister.createEvent(eventName2); + vm.stopPrank(); + + vm.startPrank(user1); + eventRegister.register(0); + eventRegister.register(1); + vm.stopPrank(); + + uint256[] memory registeredEvents = eventRegister.getRegisteredEvents(user1); + assertEq(registeredEvents.length, 2, "User1 should have registered for 2 events"); + assertEq(registeredEvents[0], 0, "First event ID should be 0"); + assertEq(registeredEvents[1], 1, "Second event ID should be 1"); + } + + function testGetEventDetails() public { + vm.startPrank(manager); + eventRegister.createEvent(eventName1); + vm.stopPrank(); + + (uint256 id, string memory name, bool registrationOpen) = eventRegister.getEvent(0); + assertEq(id, 0, "Event ID should be 0"); + assertEq(name, eventName1, "Event name should match"); + assertTrue(registrationOpen, "Registration should be open"); + } +} diff --git a/packages/nfts/test/trailblazer/galxe/RegisterGalxePoints.t.sol b/packages/nfts/test/trailblazer/galxe/RegisterGalxePoints.t.sol new file mode 100644 index 00000000000..7d074bda361 --- /dev/null +++ b/packages/nfts/test/trailblazer/galxe/RegisterGalxePoints.t.sol @@ -0,0 +1,40 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.24; + +import { Test } from "forge-std/src/Test.sol"; + +import { RegisterGalxePoints } from "../../../contracts/galxe/RegisterGalxePoints.sol"; + +contract RegisterGalxePointsTest is Test { + RegisterGalxePoints public registerGalxePoints; + + address public owner = vm.addr(0x1); + + function setUp() public { + // create whitelist merkle tree + vm.startBroadcast(owner); + + registerGalxePoints = new RegisterGalxePoints(); + + vm.stopBroadcast(); + } + // Test register function on RegisterGalxePoints also test for Registered event emitted + + function testRegister() public { + vm.startPrank(owner); + vm.expectEmit(true, false, false, true); + emit RegisterGalxePoints.Registered(owner); + registerGalxePoints.register(); + + vm.stopPrank(); + } + + // Test case to check if already registered user is not allowed to register again + function testCannotRegisterTwice() public { + vm.startPrank(owner); + registerGalxePoints.register(); + vm.expectRevert("Address already registered"); + registerGalxePoints.register(); + vm.stopPrank(); + } +} diff --git a/packages/nfts/test/trailblazer/trailblazers-badges/TrailblazersBadges.t.sol b/packages/nfts/test/trailblazer/trailblazers-badges/TrailblazersBadges.t.sol new file mode 100644 index 00000000000..193ab093deb --- /dev/null +++ b/packages/nfts/test/trailblazer/trailblazers-badges/TrailblazersBadges.t.sol @@ -0,0 +1,386 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.24; + +import { Test } from "forge-std/src/Test.sol"; + +import { TrailblazersBadges } from "../../../contracts/trailblazers-badges/TrailblazersBadges.sol"; +import { Merkle } from "murky/Merkle.sol"; +import { ERC1967Proxy } from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; +import { UtilsScript } from "../../../script/taikoon/sol/Utils.s.sol"; +import { MockBlacklist } from "../../util/Blacklist.sol"; +import { ECDSA } from "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; + +contract TrailblazersBadgesTest is Test { + UtilsScript public utils; + + TrailblazersBadges public token; + + address public owner = vm.addr(0x5); + + address[3] public minters = [vm.addr(0x1), vm.addr(0x2), vm.addr(0x3)]; + + uint256 constant BADGE_ID = 5; + + MockBlacklist public blacklist; + + Merkle tree = new Merkle(); + + address mintSigner; + uint256 mintSignerPk; + + function setUp() public { + utils = new UtilsScript(); + utils.setUp(); + blacklist = new MockBlacklist(); + // create whitelist merkle tree + vm.startBroadcast(owner); + + (mintSigner, mintSignerPk) = makeAddrAndKey("mintSigner"); + + // deploy token with empty root + address impl = address(new TrailblazersBadges()); + address proxy = address( + new ERC1967Proxy( + impl, + abi.encodeCall( + TrailblazersBadges.initialize, (owner, "ipfs://", mintSigner, blacklist) + ) + ) + ); + + token = TrailblazersBadges(proxy); + + vm.stopBroadcast(); + } + + function test_metadata_badges() public view { + assertEq(token.BADGE_RAVERS(), 0); + assertEq(token.BADGE_ROBOTS(), 1); + assertEq(token.BADGE_BOUNCERS(), 2); + assertEq(token.BADGE_MASTERS(), 3); + assertEq(token.BADGE_MONKS(), 4); + assertEq(token.BADGE_DRUMMERS(), 5); + assertEq(token.BADGE_ANDROIDS(), 6); + assertEq(token.BADGE_SHINTO(), 7); + } + + function test_canMint_true() public view { + bytes32 _hash = token.getHash(minters[0], BADGE_ID); + + (uint8 v, bytes32 r, bytes32 s) = vm.sign(mintSignerPk, _hash); + + bool canMint = token.canMint(abi.encodePacked(r, s, v), minters[0], BADGE_ID); + assertTrue(canMint); + } + + // send the signature for minters[0] but check for minters[1] + function test_canMint_false() public view { + bytes32 _hash = token.getHash(minters[0], BADGE_ID); + + (uint8 v, bytes32 r, bytes32 s) = vm.sign(mintSignerPk, _hash); + + bool canMint = token.canMint(abi.encodePacked(r, s, v), minters[1], BADGE_ID); + assertFalse(canMint); + } + + function test_mint() public { + bytes32 _hash = token.getHash(minters[0], BADGE_ID); + + (uint8 v, bytes32 r, bytes32 s) = vm.sign(mintSignerPk, _hash); + + bool canMint = token.canMint(abi.encodePacked(r, s, v), minters[0], BADGE_ID); + assertTrue(canMint); + + vm.startPrank(minters[0]); + token.mint(abi.encodePacked(r, s, v), BADGE_ID); + vm.stopPrank(); + + assertEq(token.balanceOf(minters[0]), 1); + } + + function test_mint_revert_notAuthorized() public { + bytes32 _hash = token.getHash(minters[0], BADGE_ID); + + (uint8 v, bytes32 r, bytes32 s) = vm.sign(mintSignerPk, _hash); + + bool canMint = token.canMint(abi.encodePacked(r, s, v), minters[0], BADGE_ID); + assertTrue(canMint); + + vm.expectRevert(); + token.mint(abi.encodePacked(r, s, v), minters[1], BADGE_ID); + } + + function test_mint_revert_invalidBadgeId() public { + bytes32 _hash = token.getHash(minters[0], BADGE_ID); + + (uint8 v, bytes32 r, bytes32 s) = vm.sign(mintSignerPk, _hash); + + bool canMint = token.canMint(abi.encodePacked(r, s, v), minters[0], BADGE_ID); + assertTrue(canMint); + + vm.expectRevert(); + token.mint(abi.encodePacked(r, s, v), minters[0], 8); + } + + function test_mint_owner() public { + bytes32 _hash = token.getHash(minters[0], BADGE_ID); + + (uint8 v, bytes32 r, bytes32 s) = vm.sign(mintSignerPk, _hash); + + bool canMint = token.canMint(abi.encodePacked(r, s, v), minters[0], BADGE_ID); + assertTrue(canMint); + + vm.startPrank(owner); + token.mint(abi.encodePacked(r, s, v), minters[0], BADGE_ID); + vm.stopPrank(); + + assertEq(token.balanceOf(minters[0]), 1); + } + + function test_mint_revert_remintSameSignature() public { + bytes32 _hash = token.getHash(minters[0], BADGE_ID); + + (uint8 v, bytes32 r, bytes32 s) = vm.sign(mintSignerPk, _hash); + + bool canMint = token.canMint(abi.encodePacked(r, s, v), minters[0], BADGE_ID); + assertTrue(canMint); + + vm.startBroadcast(minters[0]); + token.mint(abi.encodePacked(r, s, v), BADGE_ID); + assertEq(token.balanceOf(minters[0]), 1); + + // fail re-minting + vm.expectRevert(); + token.mint(abi.encodePacked(r, s, v), BADGE_ID); + vm.stopBroadcast(); + } + + function test_setMovement_selfWallet() public { + vm.startBroadcast(minters[0]); + + token.setMovement(token.MOVEMENT_BASED()); + assertEq(token.movements(minters[0]), token.MOVEMENT_BASED()); + vm.stopBroadcast(); + } + + function test_setMovement_owner() public { + vm.startBroadcast(owner); + + token.setMovement(minters[0], token.MOVEMENT_BASED()); + assertEq(token.movements(minters[0]), token.MOVEMENT_BASED()); + vm.stopBroadcast(); + } + + function test_revert_setMovement_notOwner() public { + uint256 movement = token.MOVEMENT_BASED(); + vm.startBroadcast(minters[0]); + vm.expectRevert(); + token.setMovement(minters[0], movement); + vm.stopBroadcast(); + } + + function test_uri() public { + uint256 badgeId = token.BADGE_DRUMMERS(); + uint256 movementId = token.MOVEMENT_BASED(); + + // mint the badge + + vm.startBroadcast(owner); + bytes32 _hash = token.getHash(minters[0], badgeId); + + (uint8 v, bytes32 r, bytes32 s) = vm.sign(mintSignerPk, _hash); + + bool canMint = token.canMint(abi.encodePacked(r, s, v), minters[0], badgeId); + assertTrue(canMint); + + token.mint(abi.encodePacked(r, s, v), minters[0], badgeId); + + // set the user state to based + token.setMovement(minters[0], movementId); + + vm.stopBroadcast(); + + // check the token URI + + uint256 tokenId = token.getTokenId(minters[0], badgeId); + vm.assertEq(tokenId, 1); + + string memory uri = token.tokenURI(tokenId); + + vm.assertEq(uri, "ipfs:///1/5"); + } + + function test_badgeBalances() public { + // mint a token to minter 0 + uint256 badgeId = token.BADGE_DRUMMERS(); + + // mint the badge + + vm.startBroadcast(owner); + bytes32 _hash = token.getHash(minters[0], badgeId); + + (uint8 v, bytes32 r, bytes32 s) = vm.sign(mintSignerPk, _hash); + + bool canMint = token.canMint(abi.encodePacked(r, s, v), minters[0], badgeId); + assertTrue(canMint); + + token.mint(abi.encodePacked(r, s, v), minters[0], badgeId); + vm.stopBroadcast(); + + bool[] memory badges = token.badgeBalances(minters[0]); + // ensure only badgeId = 5 (Drummers) is true + vm.assertFalse(badges[token.BADGE_RAVERS()]); + vm.assertFalse(badges[token.BADGE_ROBOTS()]); + vm.assertFalse(badges[token.BADGE_BOUNCERS()]); + vm.assertFalse(badges[token.BADGE_MASTERS()]); + vm.assertFalse(badges[token.BADGE_MONKS()]); + vm.assertTrue(badges[token.BADGE_DRUMMERS()]); + vm.assertFalse(badges[token.BADGE_ANDROIDS()]); + vm.assertFalse(badges[token.BADGE_SHINTO()]); + } + + function test_transfer_dataConsistency() public { + // TODO: ensure the values are properly re-assigned after a transfer + + // mint the token for minters[0] + + // mint a token to minter 0 + uint256 badgeId = token.BADGE_DRUMMERS(); + + // mint the badge + + vm.startBroadcast(owner); + bytes32 _hash = token.getHash(minters[0], badgeId); + + (uint8 v, bytes32 r, bytes32 s) = vm.sign(mintSignerPk, _hash); + + bool canMint = token.canMint(abi.encodePacked(r, s, v), minters[0], badgeId); + assertTrue(canMint); + + token.mint(abi.encodePacked(r, s, v), minters[0], badgeId); + vm.stopBroadcast(); + + // transfer to minters[1] + vm.startBroadcast(minters[0]); + token.safeTransferFrom(minters[0], minters[1], 1); + + // ensure the badge balances are consistent + bool[] memory badges = token.badgeBalances(minters[1]); + + // ensure only badgeId = 5 (Drummers) is true + vm.assertFalse(badges[token.BADGE_RAVERS()]); + vm.assertFalse(badges[token.BADGE_ROBOTS()]); + vm.assertFalse(badges[token.BADGE_BOUNCERS()]); + vm.assertFalse(badges[token.BADGE_MASTERS()]); + vm.assertFalse(badges[token.BADGE_MONKS()]); + vm.assertTrue(badges[token.BADGE_DRUMMERS()]); + vm.assertFalse(badges[token.BADGE_ANDROIDS()]); + vm.assertFalse(badges[token.BADGE_SHINTO()]); + + vm.stopBroadcast(); + + // ensure wallets[0] has no badges + badges = token.badgeBalances(minters[0]); + + vm.assertFalse(badges[token.BADGE_RAVERS()]); + vm.assertFalse(badges[token.BADGE_ROBOTS()]); + vm.assertFalse(badges[token.BADGE_BOUNCERS()]); + vm.assertFalse(badges[token.BADGE_MASTERS()]); + vm.assertFalse(badges[token.BADGE_MONKS()]); + vm.assertFalse(badges[token.BADGE_DRUMMERS()]); + vm.assertFalse(badges[token.BADGE_ANDROIDS()]); + vm.assertFalse(badges[token.BADGE_SHINTO()]); + + // check the token IDs + vm.assertEq(token.getTokenId(minters[0], badgeId), 0); + vm.assertEq(token.getTokenId(minters[1], badgeId), 1); + } + + function test_transfer_dataConsistency2() public { + // mint a token to minter 0 + uint256 badgeId = token.BADGE_DRUMMERS(); + + // mint the badge + + vm.startBroadcast(owner); + bytes32 _hash = token.getHash(minters[0], badgeId); + + (uint8 v, bytes32 r, bytes32 s) = vm.sign(mintSignerPk, _hash); + + bool canMint = token.canMint(abi.encodePacked(r, s, v), minters[0], badgeId); + assertTrue(canMint); + + token.mint(abi.encodePacked(r, s, v), minters[0], badgeId); + vm.stopBroadcast(); + + // transfer to minters[1] + vm.startBroadcast(minters[0]); + token.safeTransferFrom(minters[0], minters[1], 1); + + // ensure the badge balances are consistent + bool[] memory badges = token.badgeBalancesV2(minters[1]); + + // ensure only badgeId = 5 (Drummers) is true + vm.assertFalse(badges[token.BADGE_RAVERS()]); + vm.assertFalse(badges[token.BADGE_ROBOTS()]); + vm.assertFalse(badges[token.BADGE_BOUNCERS()]); + vm.assertFalse(badges[token.BADGE_MASTERS()]); + vm.assertFalse(badges[token.BADGE_MONKS()]); + vm.assertTrue(badges[token.BADGE_DRUMMERS()]); + vm.assertFalse(badges[token.BADGE_ANDROIDS()]); + vm.assertFalse(badges[token.BADGE_SHINTO()]); + + vm.stopBroadcast(); + + // ensure wallets[0] has no badges + badges = token.badgeBalancesV2(minters[0]); + + vm.assertFalse(badges[token.BADGE_RAVERS()]); + vm.assertFalse(badges[token.BADGE_ROBOTS()]); + vm.assertFalse(badges[token.BADGE_BOUNCERS()]); + vm.assertFalse(badges[token.BADGE_MASTERS()]); + vm.assertFalse(badges[token.BADGE_MONKS()]); + vm.assertFalse(badges[token.BADGE_DRUMMERS()]); + vm.assertFalse(badges[token.BADGE_ANDROIDS()]); + vm.assertFalse(badges[token.BADGE_SHINTO()]); + + // check the token IDs + vm.assertEq(token.getTokenId(minters[0], badgeId), 0); + vm.assertEq(token.getTokenId(minters[1], badgeId), 1); + } + + function mintBadgeTo(uint256 badgeId, address minter) private { + vm.startBroadcast(owner); + bytes32 _hash = token.getHash(minter, badgeId); + (uint8 v, bytes32 r, bytes32 s) = vm.sign(mintSignerPk, _hash); + bool canMint = token.canMint(abi.encodePacked(r, s, v), minter, badgeId); + assertTrue(canMint); + + token.mint(abi.encodePacked(r, s, v), minter, badgeId); + vm.stopBroadcast(); + } + + function test_totalBadgeSupply() public { + mintBadgeTo(token.BADGE_RAVERS(), minters[0]); + mintBadgeTo(token.BADGE_ROBOTS(), minters[0]); + mintBadgeTo(token.BADGE_BOUNCERS(), minters[1]); + mintBadgeTo(token.BADGE_MASTERS(), minters[0]); + mintBadgeTo(token.BADGE_MONKS(), minters[0]); + mintBadgeTo(token.BADGE_DRUMMERS(), minters[0]); + mintBadgeTo(token.BADGE_DRUMMERS(), minters[1]); + mintBadgeTo(token.BADGE_DRUMMERS(), minters[2]); + mintBadgeTo(token.BADGE_ANDROIDS(), minters[0]); + mintBadgeTo(token.BADGE_SHINTO(), minters[0]); + + uint256[] memory badges = token.totalBadgeSupply(); + + vm.assertEq(badges[token.BADGE_RAVERS()], 1); + vm.assertEq(badges[token.BADGE_ROBOTS()], 1); + vm.assertEq(badges[token.BADGE_BOUNCERS()], 1); + vm.assertEq(badges[token.BADGE_MASTERS()], 1); + vm.assertEq(badges[token.BADGE_MONKS()], 1); + vm.assertEq(badges[token.BADGE_DRUMMERS()], 3); + vm.assertEq(badges[token.BADGE_ANDROIDS()], 1); + vm.assertEq(badges[token.BADGE_SHINTO()], 1); + } +} diff --git a/packages/nfts/test/trailblazer/trailblazers-badges/TrailblazersBadgesV3.t.sol b/packages/nfts/test/trailblazer/trailblazers-badges/TrailblazersBadgesV3.t.sol new file mode 100644 index 00000000000..cd64ea8f320 --- /dev/null +++ b/packages/nfts/test/trailblazer/trailblazers-badges/TrailblazersBadgesV3.t.sol @@ -0,0 +1,88 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.24; + +import { Test } from "forge-std/src/Test.sol"; + +import { TrailblazersBadges } from "../../../contracts/trailblazers-badges/TrailblazersBadges.sol"; +import { Merkle } from "murky/Merkle.sol"; +import { ERC1967Proxy } from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; +import { UtilsScript } from "../../../script/taikoon/sol/Utils.s.sol"; +import { MockBlacklist } from "../../util/Blacklist.sol"; +import { ECDSA } from "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; +import { TrailblazersBadgesV3 } from + "../../../contracts/trailblazers-badges/TrailblazersBadgesV3.sol"; + +contract TrailblazersBadgesV3Test is Test { + UtilsScript public utils; + + TrailblazersBadges public tokenV2; + TrailblazersBadgesV3 public tokenV3; + + address public owner = vm.addr(0x5); + + address[3] public minters = [vm.addr(0x1), vm.addr(0x2), vm.addr(0x3)]; + + uint256 constant BADGE_ID = 5; + + MockBlacklist public blacklist; + + Merkle tree = new Merkle(); + + address mintSigner; + uint256 mintSignerPk; + + function setUp() public { + utils = new UtilsScript(); + utils.setUp(); + blacklist = new MockBlacklist(); + // create whitelist merkle tree + vm.startBroadcast(owner); + + (mintSigner, mintSignerPk) = makeAddrAndKey("mintSigner"); + + // deploy token with empty root + address impl = address(new TrailblazersBadges()); + address proxy = address( + new ERC1967Proxy( + impl, + abi.encodeCall( + TrailblazersBadges.initialize, (owner, "ipfs://", mintSigner, blacklist) + ) + ) + ); + + tokenV2 = TrailblazersBadges(proxy); + // upgrade to v3 + tokenV2.upgradeToAndCall( + address(new TrailblazersBadgesV3()), abi.encodeCall(TrailblazersBadgesV3.version, ()) + ); + + tokenV3 = TrailblazersBadgesV3(address(proxy)); + vm.stopBroadcast(); + } + + function test_mint() public { + bytes32 _hash = tokenV3.getHash(minters[0], BADGE_ID); + + (uint8 v, bytes32 r, bytes32 s) = vm.sign(mintSignerPk, _hash); + + bool canMint = tokenV3.canMint(abi.encodePacked(r, s, v), minters[0], BADGE_ID); + assertTrue(canMint); + + vm.startPrank(minters[0]); + tokenV3.mint(abi.encodePacked(r, s, v), BADGE_ID); + vm.stopPrank(); + + assertEq(tokenV3.balanceOf(minters[0]), 1); + } + + function test_blacklist_mint_revert() public { + test_mint(); + assertEq(tokenV3.balanceOf(minters[0]), 1); + blacklist.add(minters[0]); + + vm.prank(minters[0]); + vm.expectRevert(); + tokenV3.transferFrom(minters[0], minters[1], BADGE_ID); + } +} diff --git a/packages/nfts/test/trailblazers-airdrop/ERC20Airdrop.t.sol b/packages/nfts/test/trailblazers-airdrop/ERC20Airdrop.t.sol new file mode 100644 index 00000000000..e255f3074a4 --- /dev/null +++ b/packages/nfts/test/trailblazers-airdrop/ERC20Airdrop.t.sol @@ -0,0 +1,151 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.24; + +import { Test } from "forge-std/src/Test.sol"; + +import { ERC20Airdrop } from "../../contracts/trailblazers-airdrop/ERC20Airdrop.sol"; +import { Merkle } from "murky/Merkle.sol"; +import { ERC1967Proxy } from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; +import { UtilsScript } from "../../script/taikoon/sol/Utils.s.sol"; +import { MockBlacklist } from "../util/Blacklist.sol"; +import { ECDSA } from "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; +import { ERC20Mock } from "../util/MockTokens.sol"; + +contract ERC20AirdropTest is Test { + UtilsScript public utils; + + ERC20Airdrop public airdrop; + + address public owner = vm.addr(0x5); + + address[3] public minters = [ + vm.addr(0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80), + vm.addr(0x59c6995e998f97a5a0044966f0945389dc9e86dae88c7a8412f4603b6b78690d), + vm.addr(0x5de4111afa1a4b94908f83103eb1f1706367c2e68ca870fc3fb9a804cdab365a) + ]; + + bytes32[] public leaves = [ + bytes32(0xbe00dd3c5d43551e03bf9a60316bee19ede94bf34486c39398c4f9f3b309d7a3), + bytes32(0xa097cea9c873bd65b34c8d7d543e90ac1e18e5ec72c17cd95dedd0b52f02022e) + ]; + + Merkle tree = new Merkle(); + + address mintSigner; + uint256 mintSignerPk; + + /////////////////////////////// + uint64 constant CLAIM_START = 100; + uint64 constant CLAIM_END = 200; + + ERC20Mock public erc20; + + MockBlacklist public blacklist; + + uint256 constant TOTAL_AVAILABLE_FUNDS = 1000 ether; + + uint256 constant CLAIM_AMOUNT = 1 ether; + + function setUp() public { + utils = new UtilsScript(); + utils.setUp(); + // create whitelist merkle tree + vm.startBroadcast(owner); + + // mock tree + bytes32 merkleRoot = tree.getRoot(leaves); + + // deploy supplementary contracts + erc20 = new ERC20Mock(); + + blacklist = new MockBlacklist(); + + // deploy airdrop with empty root + address impl = address(new ERC20Airdrop()); + address proxy = address( + new ERC1967Proxy( + impl, + abi.encodeCall( + ERC20Airdrop.init, + (owner, CLAIM_START, CLAIM_END, merkleRoot, erc20, address(blacklist)) + ) + ) + ); + + airdrop = ERC20Airdrop(proxy); + + // fund the airdrop contract + erc20.mint(owner, TOTAL_AVAILABLE_FUNDS); + erc20.transfer(address(airdrop), TOTAL_AVAILABLE_FUNDS); + + vm.stopBroadcast(); + } + + function test_revert_claim_beforeClaimStart() public { + vm.warp(CLAIM_START - 1); + address user = minters[0]; + + bytes32[] memory proof = tree.getProof(leaves, 0); + + vm.prank(user); + vm.expectRevert(); + airdrop.claim(user, CLAIM_AMOUNT, proof); + } + + function test_revert_claim_afterClaimEnd() public { + vm.warp(CLAIM_END + 1); + address user = minters[0]; + + bytes32[] memory proof = tree.getProof(leaves, 0); + + vm.prank(user); + vm.expectRevert(); + airdrop.claim(user, CLAIM_AMOUNT, proof); + } + + function test_claim() public { + vm.warp(CLAIM_START + 1); + address user = minters[0]; + + bytes32[] memory proof = tree.getProof(leaves, 0); + + vm.prank(user); + airdrop.claim(user, CLAIM_AMOUNT, proof); + + assertEq(erc20.balanceOf(user), CLAIM_AMOUNT); + assertEq(erc20.balanceOf(address(airdrop)), TOTAL_AVAILABLE_FUNDS - CLAIM_AMOUNT); + } + + function test_revert_claim_twice() public { + test_claim(); + address user = minters[0]; + + bytes32[] memory proof = tree.getProof(leaves, 0); + + vm.prank(user); + vm.expectRevert(); + airdrop.claim(user, CLAIM_AMOUNT, proof); + } + + function test_revert_blacklisted_mint() public { + vm.warp(CLAIM_START + 1); + + address user = minters[0]; + blacklist.add(user); + + bytes32[] memory proof = tree.getProof(leaves, 0); + + vm.prank(user); + vm.expectRevert(); + airdrop.claim(user, CLAIM_AMOUNT, proof); + } + + function test_transferOwnership() public { + assertEq(airdrop.owner(), owner); + vm.prank(owner); + airdrop.transferOwnership(minters[0]); + vm.prank(minters[0]); + airdrop.acceptOwnership(); + assertEq(airdrop.owner(), minters[0]); + } +} diff --git a/packages/nfts/test/trailblazers-season-2/BadgeRecruitment.t.sol b/packages/nfts/test/trailblazers-season-2/BadgeRecruitment.t.sol new file mode 100644 index 00000000000..0d1fac24ef4 --- /dev/null +++ b/packages/nfts/test/trailblazers-season-2/BadgeRecruitment.t.sol @@ -0,0 +1,493 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.24; + +import { Test } from "forge-std/src/Test.sol"; + +import { TrailblazersBadges } from "../../contracts/trailblazers-badges/TrailblazersBadges.sol"; +import { Merkle } from "murky/Merkle.sol"; +import { ERC1967Proxy } from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; +import { UtilsScript } from "../../script/taikoon/sol/Utils.s.sol"; +import { MockBlacklist } from "../util/Blacklist.sol"; +import { ECDSA } from "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; +import { TrailblazersBadgesS2 } from + "../../contracts/trailblazers-season-2/TrailblazersBadgesS2.sol"; +import { TrailblazerBadgesS1MintTo } from "../util/TrailblazerBadgesS1MintTo.sol"; +import { TrailblazersBadgesV4 } from + "../../contracts/trailblazers-season-2/TrailblazersS1BadgesV4.sol"; +import { BadgeRecruitment } from "../../contracts/trailblazers-season-2/BadgeRecruitment.sol"; + +contract BadgeRecruitmentTest is Test { + UtilsScript public utils; + + TrailblazersBadgesV4 public s1BadgesV4; + TrailblazersBadgesS2 public s2Badges; + + address public owner = vm.addr(0x5); + + address[3] public minters = [vm.addr(0x1), vm.addr(0x2), vm.addr(0x3)]; + + uint256 public BADGE_ID; + + MockBlacklist public blacklist; + + address mintSigner; + uint256 mintSignerPk; + + uint256 public MAX_INFLUENCES = 3; + uint256 public COOLDOWN_RECRUITMENT = 1 hours; + uint256 public COOLDOWN_INFLUENCE = 5 minutes; + uint256 public INFLUENCE_WEIGHT_PERCENT = 5; + uint256 public MAX_INFLUENCES_DIVIDER = 100; + uint256 public DEFAULT_CYCLE_DURATION = 7 days; + + BadgeRecruitment public recruitment; + + function setUp() public { + utils = new UtilsScript(); + utils.setUp(); + blacklist = new MockBlacklist(); + // create whitelist merkle tree + vm.startBroadcast(owner); + + (mintSigner, mintSignerPk) = makeAddrAndKey("mintSigner"); + + // deploy token with empty root + address impl = address(new TrailblazersBadges()); + address proxy = address( + new ERC1967Proxy( + impl, + abi.encodeCall( + TrailblazersBadges.initialize, (owner, "ipfs://", mintSigner, blacklist) + ) + ) + ); + + TrailblazersBadges s1BadgesV2 = TrailblazersBadges(proxy); + + // upgrade s1 badges contract to use the mock version + + s1BadgesV2.upgradeToAndCall( + address(new TrailblazerBadgesS1MintTo()), + abi.encodeCall(TrailblazerBadgesS1MintTo.call, ()) + ); + + BADGE_ID = s1BadgesV2.BADGE_RAVERS(); + + // upgrade s1 contract to v4 + s1BadgesV2.upgradeToAndCall( + address(new TrailblazersBadgesV4()), abi.encodeCall(TrailblazersBadgesV4.version, ()) + ); + + s1BadgesV4 = TrailblazersBadgesV4(address(s1BadgesV2)); + + // set cooldown recruitment + s1BadgesV4.setRecruitmentLockDuration(365 days); + + // deploy the s2 erc1155 token contract + + impl = address(new TrailblazersBadgesS2()); + proxy = address( + new ERC1967Proxy( + impl, + abi.encodeCall(TrailblazersBadgesS2.initialize, (address(recruitment), "ipfs://")) + ) + ); + s2Badges = TrailblazersBadgesS2(proxy); + + // deploy the recruitment contract + + BadgeRecruitment.Config memory config = BadgeRecruitment.Config( + COOLDOWN_RECRUITMENT, + COOLDOWN_INFLUENCE, + INFLUENCE_WEIGHT_PERCENT, + MAX_INFLUENCES, + MAX_INFLUENCES_DIVIDER, + DEFAULT_CYCLE_DURATION + ); + + impl = address(new BadgeRecruitment()); + proxy = address( + new ERC1967Proxy( + impl, + abi.encodeCall( + BadgeRecruitment.initialize, + (address(s1BadgesV2), address(s2Badges), mintSigner, config) + ) + ) + ); + recruitment = BadgeRecruitment(proxy); + s1BadgesV4.setRecruitmentContract(address(recruitment)); + s2Badges.setMinter(address(recruitment)); + // enable recruitment for BADGE_ID + uint256[] memory enabledBadgeIds = new uint256[](1); + enabledBadgeIds[0] = BADGE_ID; + recruitment.enableRecruitments(enabledBadgeIds); + + vm.stopBroadcast(); + } + + function mint_s1(address minter, uint256 badgeId) public { + bytes32 _hash = s1BadgesV4.getHash(minter, badgeId); + + (uint8 v, bytes32 r, bytes32 s) = vm.sign(mintSignerPk, _hash); + + bool canMint = s1BadgesV4.canMint(abi.encodePacked(r, s, v), minter, badgeId); + assertTrue(canMint); + + vm.startPrank(minter); + s1BadgesV4.mint(abi.encodePacked(r, s, v), badgeId); + vm.stopPrank(); + } + + function test_mint_s1() public { + mint_s1(minters[0], s1BadgesV4.BADGE_RAVERS()); + mint_s1(minters[0], s1BadgesV4.BADGE_ROBOTS()); + assertEq(s1BadgesV4.balanceOf(minters[0]), 2); + + mint_s1(minters[1], s1BadgesV4.BADGE_BOUNCERS()); + mint_s1(minters[1], s1BadgesV4.BADGE_MASTERS()); + assertEq(s1BadgesV4.balanceOf(minters[1]), 2); + + mint_s1(minters[2], s1BadgesV4.BADGE_MONKS()); + mint_s1(minters[2], s1BadgesV4.BADGE_DRUMMERS()); + assertEq(s1BadgesV4.balanceOf(minters[2]), 2); + } + + function test_startRecruitment() public { + mint_s1(minters[0], BADGE_ID); + + vm.prank(minters[0]); + wait(100); + s1BadgesV4.startRecruitment(BADGE_ID); + + uint256 tokenId = s1BadgesV4.getTokenId(minters[0], BADGE_ID); + assertEq(s1BadgesV4.balanceOf(minters[0]), 1); + assertEq(recruitment.isRecruitmentActive(minters[0]), true); + assertEq(s1BadgesV4.unlockTimestamps(tokenId), block.timestamp + 365 days); + } + + function wait(uint256 time) public { + vm.warp(block.timestamp + time); + } + + // happy-path, make 3 pink influences, and 2 purple ones + function test_influenceRecruitment() public { + test_startRecruitment(); + + vm.startPrank(minters[0]); + + uint256 points = 0; + bytes32 _hash = + recruitment.generateClaimHash(BadgeRecruitment.HashType.Influence, minters[0], points); + + (uint8 v, bytes32 r, bytes32 s) = vm.sign(mintSignerPk, _hash); + + wait(COOLDOWN_INFLUENCE); + + recruitment.influenceRecruitment( + _hash, v, r, s, points, BadgeRecruitment.InfluenceColor.Minnow + ); + wait(COOLDOWN_INFLUENCE); + + recruitment.influenceRecruitment( + _hash, v, r, s, points, BadgeRecruitment.InfluenceColor.Minnow + ); + + for (uint256 i = 0; i < MAX_INFLUENCES; i++) { + wait(COOLDOWN_INFLUENCE); + recruitment.influenceRecruitment( + _hash, v, r, s, points, BadgeRecruitment.InfluenceColor.Whale + ); + } + + vm.stopPrank(); + + assertEq(recruitment.isInfluenceActive(minters[0]), true); + assertEq(recruitment.isRecruitmentActive(minters[0]), true); + + (uint256 whaleInfluences, uint256 minnowInfluences) = + recruitment.getRecruitmentInfluences(minters[0]); + + assertEq(whaleInfluences, MAX_INFLUENCES); + assertEq(minnowInfluences, 0); + } + + function test_revert_tooManyInfluences() public { + uint256 points = 0; + bytes32 _hash = + recruitment.generateClaimHash(BadgeRecruitment.HashType.Influence, minters[0], points); + + (uint8 v, bytes32 r, bytes32 s) = vm.sign(mintSignerPk, _hash); + + test_influenceRecruitment(); + vm.startPrank(minters[0]); + vm.expectRevert(); + recruitment.influenceRecruitment( + _hash, v, r, s, points, BadgeRecruitment.InfluenceColor.Whale + ); + + vm.stopPrank(); + } + + function test_endRecruitment() public { + test_influenceRecruitment(); + + wait(COOLDOWN_INFLUENCE); + wait(COOLDOWN_RECRUITMENT); + + // generate the claim hash for the current recruitment + bytes32 claimHash = recruitment.generateClaimHash( + BadgeRecruitment.HashType.End, + minters[0], + 0 // experience points + ); + + // simulate the backend signing the hash + (uint8 v, bytes32 r, bytes32 s) = vm.sign(mintSignerPk, claimHash); + + // exercise the randomFromSignature function + + vm.prank(minters[0]); + recruitment.endRecruitment(claimHash, v, r, s, 0); + + // check for s2 state reset + assertEq(recruitment.isRecruitmentActive(minters[0]), false); + assertEq(recruitment.isInfluenceActive(minters[0]), false); + + // check for s2 mint + assertEq(s2Badges.balanceOf(minters[0], 1), 1); + } + + function test_revert_startRecruitmentTwice() public { + test_startRecruitment(); + vm.startPrank(minters[0]); + vm.expectRevert(); + s1BadgesV4.startRecruitment(BADGE_ID); + vm.stopPrank(); + } + + function test_revert_migrateDisabled() public { + uint256 badgeId = s1BadgesV4.BADGE_ROBOTS(); + mint_s1(minters[0], badgeId); + + uint256 tokenId = s1BadgesV4.tokenOfOwnerByIndex(minters[0], 0); + + vm.startPrank(minters[0]); + vm.expectRevert(); + s1BadgesV4.startRecruitment(badgeId); + vm.stopPrank(); + // ensure no values got changed/updated + assertEq(s1BadgesV4.balanceOf(minters[0]), 1); + assertEq(s1BadgesV4.balanceOf(address(s2Badges)), 0); + assertEq(s1BadgesV4.ownerOf(tokenId), minters[0]); + assertEq(recruitment.isRecruitmentActive(minters[0]), false); + } + + function test_randomFromSignature() public view { + bytes32 signatureHash = keccak256( + abi.encodePacked( + keccak256("1234567890"), // should use the block's hash + minters[0] + ) + ); + + (uint8 v, bytes32 r, bytes32 s) = vm.sign(mintSignerPk, signatureHash); + + uint256 random = recruitment.randomFromSignature(signatureHash, v, r, s); + + assertEq( + random, + 28_417_844_340_632_250_945_870_465_294_567_768_196_388_504_060_802_704_441_612_911_129_119_444_309_664 + ); + } + + function test_setConfig() public { + BadgeRecruitment.Config memory config = + BadgeRecruitment.Config(1 hours, 5 minutes, 5, 3, 100, DEFAULT_CYCLE_DURATION); + vm.prank(owner); + recruitment.setConfig(config); + + BadgeRecruitment.Config memory newConfig = recruitment.getConfig(); + + assertEq(newConfig.cooldownRecruitment, 1 hours); + assertEq(newConfig.cooldownInfluence, 5 minutes); + assertEq(newConfig.influenceWeightPercent, 5); + assertEq(newConfig.baseMaxInfluences, 3); + } + + function test_setConfig_revert__notOwner() public { + BadgeRecruitment.Config memory config = + BadgeRecruitment.Config(1 hours, 5 minutes, 5, 3, 100, DEFAULT_CYCLE_DURATION); + + vm.startPrank(minters[0]); + vm.expectRevert(); + recruitment.setConfig(config); + vm.stopPrank(); + } + + function test_rollCycle() public { + BadgeRecruitment.RecruitmentCycle memory cycle = + recruitment.getRecruitmentCycle(recruitment.recruitmentCycleId()); + assertEq(cycle.cycleId, 1); + assertEq(cycle.startTime, block.timestamp); + assertEq(cycle.endTime, block.timestamp + DEFAULT_CYCLE_DURATION); + assertEq(cycle.s1BadgeIds.length, 1); + assertEq(cycle.s1BadgeIds[0], BADGE_ID); + test_endRecruitment(); + + // close the current cycle + vm.startPrank(owner); + //recruitment.endRecruitment(); + wait(DEFAULT_CYCLE_DURATION + 1); + // launch the next cycle + uint256[] memory enabledBadgeIds = new uint256[](1); + enabledBadgeIds[0] = 2; + recruitment.enableRecruitments(enabledBadgeIds); + + // check cycle roll forward + cycle = recruitment.getRecruitmentCycle(recruitment.recruitmentCycleId()); + assertEq(cycle.cycleId, 2); + assertEq(cycle.startTime, block.timestamp); + assertEq(cycle.endTime, block.timestamp + DEFAULT_CYCLE_DURATION); + assertEq(cycle.s1BadgeIds.length, 1); + assertEq(cycle.s1BadgeIds[0], 2); + } + + function test_revertTransferAfterRecruitmentStarts() public { + test_startRecruitment(); + assertEq(s1BadgesV4.balanceOf(minters[0]), 1); + uint256 tokenId = s1BadgesV4.getTokenId(minters[0], BADGE_ID); + vm.prank(minters[0]); + vm.expectRevert(); + s1BadgesV4.transferFrom(minters[0], minters[1], tokenId); + } + + function test_startRecruitment_expBased() public { + uint256 points = 100; + bytes32 _hash = + recruitment.generateClaimHash(BadgeRecruitment.HashType.Start, minters[0], points); + + (uint8 v, bytes32 r, bytes32 s) = vm.sign(mintSignerPk, _hash); + + vm.prank(minters[0]); + recruitment.startRecruitment(_hash, v, r, s, points); + + assertEq(recruitment.isRecruitmentActive(minters[0]), true); + } + + function test_startRecruitment_expBased_revert_hashMismatch() public { + mint_s1(minters[0], BADGE_ID); + + uint256 points = 100; + bytes32 _hash = + recruitment.generateClaimHash(BadgeRecruitment.HashType.Start, minters[0], points); + + (uint8 v, bytes32 r, bytes32 s) = vm.sign(mintSignerPk, _hash); + + vm.prank(minters[0]); + vm.expectRevert(BadgeRecruitment.HASH_MISMATCH.selector); + recruitment.startRecruitment(_hash, v, s, r, points + 1); + } + + function test_startRecruitment_expBased_revert_notRandomSigner() public { + mint_s1(minters[0], BADGE_ID); + + uint256 points = 100; + bytes32 _hash = + recruitment.generateClaimHash(BadgeRecruitment.HashType.Start, minters[0], points); + (, uint256 badSignerPk) = makeAddrAndKey("badSigner"); + (uint8 v, bytes32 r, bytes32 s) = vm.sign(badSignerPk, _hash); + + vm.prank(minters[0]); + vm.expectRevert(BadgeRecruitment.NOT_RANDOM_SIGNER.selector); + recruitment.startRecruitment(_hash, v, r, s, points); + } + + function test_startRecruitment_multiCycle() public { + // start a recruitment for minters[0] and badgeId + test_endRecruitment(); + + // mint the same badge on minters[1], and transfer to minters[0] + mint_s1(minters[1], BADGE_ID); + uint256 tokenId = s1BadgesV4.getTokenId(minters[1], BADGE_ID); + vm.prank(minters[1]); + s1BadgesV4.transferFrom(minters[1], minters[0], tokenId); + assertEq(s1BadgesV4.balanceOf(minters[0]), 2); + + // ensure they can migrate via exp + test_startRecruitment_expBased(); + wait(COOLDOWN_INFLUENCE); + wait(COOLDOWN_RECRUITMENT); + + // generate the claim hash for the current recruitment + bytes32 claimHash = recruitment.generateClaimHash( + BadgeRecruitment.HashType.End, + minters[0], + 0 // experience points + ); + + // simulate the backend signing the hash + (uint8 v, bytes32 r, bytes32 s) = vm.sign(mintSignerPk, claimHash); + + // exercise the randomFromSignature function + vm.prank(minters[0]); + recruitment.endRecruitment(claimHash, v, r, s, 0); + assertEq(s2Badges.balanceOf(minters[0], 1), 1); + + // + + // ensure minters[0] cannot recruit again within this same cycle + vm.startPrank(minters[0]); + vm.expectRevert(BadgeRecruitment.ALREADY_MIGRATED_IN_CYCLE.selector); + s1BadgesV4.startRecruitment(BADGE_ID); + // ensure they can't either via exp call + uint256 points = 100; + bytes32 _hash = + recruitment.generateClaimHash(BadgeRecruitment.HashType.Start, minters[0], points); + + (v, r, s) = vm.sign(mintSignerPk, _hash); + + vm.expectRevert(BadgeRecruitment.ALREADY_MIGRATED_IN_CYCLE.selector); + recruitment.startRecruitment(_hash, v, r, s, points); + + // move the cycle forward + wait(DEFAULT_CYCLE_DURATION + 1); + + // no cycle is set, should fail to recruit + vm.startPrank(minters[0]); + vm.expectRevert(BadgeRecruitment.RECRUITMENT_NOT_ENABLED.selector); + s1BadgesV4.startRecruitment(BADGE_ID); + + // enable the next cycle + uint256[] memory enabledBadgeIds = new uint256[](1); + enabledBadgeIds[0] = BADGE_ID; + vm.startPrank(owner); + recruitment.enableRecruitments(enabledBadgeIds); + + // ensure they can recruit with the second badge + vm.startPrank(minters[0]); + s1BadgesV4.startRecruitment(BADGE_ID); + + tokenId = s1BadgesV4.getTokenId(minters[0], BADGE_ID); + assertEq(s1BadgesV4.balanceOf(minters[0]), 2); + assertEq(recruitment.isRecruitmentActive(minters[0]), true); + assertEq(s1BadgesV4.unlockTimestamps(tokenId), block.timestamp + 365 days); + + // ensure they cannot start it again + vm.expectRevert(BadgeRecruitment.RECRUITMENT_ALREADY_STARTED.selector); + s1BadgesV4.startRecruitment(BADGE_ID); + } + + function test_enableDisableRecruitment_admin() public { + // should fail to enable new recruitments + uint256[] memory enabledBadgeIds = new uint256[](1); + enabledBadgeIds[0] = BADGE_ID; + vm.startPrank(owner); + vm.expectRevert(BadgeRecruitment.CURRENT_CYCLE_NOT_OVER.selector); + recruitment.enableRecruitments(enabledBadgeIds); + // wait out the currently-open cycle + wait(DEFAULT_CYCLE_DURATION + 1); + // create a second cycle + recruitment.enableRecruitments(enabledBadgeIds); + } +} diff --git a/packages/nfts/test/trailblazers-season-2/BadgeRecruitmentV2.t.sol b/packages/nfts/test/trailblazers-season-2/BadgeRecruitmentV2.t.sol new file mode 100644 index 00000000000..9113a5fa12b --- /dev/null +++ b/packages/nfts/test/trailblazers-season-2/BadgeRecruitmentV2.t.sol @@ -0,0 +1,349 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.24; + +import { Test } from "forge-std/src/Test.sol"; + +import { TrailblazersBadges } from "../../contracts/trailblazers-badges/TrailblazersBadges.sol"; +import { Merkle } from "murky/Merkle.sol"; +import { ERC1967Proxy } from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; +import { UtilsScript } from "../../script/taikoon/sol/Utils.s.sol"; +import { MockBlacklist } from "../util/Blacklist.sol"; +import { ECDSA } from "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; +import { TrailblazersBadgesS2 } from + "../../contracts/trailblazers-season-2/TrailblazersBadgesS2.sol"; +import { TrailblazerBadgesS1MintTo } from "../util/TrailblazerBadgesS1MintTo.sol"; +import { TrailblazersBadgesV4 } from + "../../contracts/trailblazers-season-2/TrailblazersS1BadgesV4.sol"; +import { BadgeRecruitment } from "../../contracts/trailblazers-season-2/BadgeRecruitment.sol"; +import { BadgeRecruitmentV2 } from "../../contracts/trailblazers-season-2/BadgeRecruitmentV2.sol"; +import "../../contracts/trailblazers-season-2/TrailblazersS1BadgesV5.sol"; + +contract BadgeRecruitmentV2Test is Test { + UtilsScript public utils; + + TrailblazersBadgesV5 public s1BadgesV5; + TrailblazersBadgesV4 public s1BadgesV4; + TrailblazersBadgesS2 public s2Badges; + + address public owner = vm.addr(0x5); + + address[3] public minters = [vm.addr(0x1), vm.addr(0x2), vm.addr(0x3)]; + + uint256 public BADGE_ID; + + MockBlacklist public blacklist; + + address mintSigner; + uint256 mintSignerPk; + + uint256 public MAX_INFLUENCES = 3; + uint256 public COOLDOWN_RECRUITMENT = 1 hours; + uint256 public COOLDOWN_INFLUENCE = 5 minutes; + uint256 public INFLUENCE_WEIGHT_PERCENT = 5; + uint256 public MAX_INFLUENCES_DIVIDER = 100; + uint256 public DEFAULT_CYCLE_DURATION = 7 days; + + BadgeRecruitment public recruitmentV1; + BadgeRecruitmentV2 public recruitment; + + function setUp() public { + utils = new UtilsScript(); + utils.setUp(); + blacklist = new MockBlacklist(); + // create whitelist merkle tree + vm.startPrank(owner); + + (mintSigner, mintSignerPk) = makeAddrAndKey("mintSigner"); + + // deploy token with empty root + address impl = address(new TrailblazersBadges()); + address proxy = address( + new ERC1967Proxy( + impl, + abi.encodeCall( + TrailblazersBadges.initialize, (owner, "ipfs://", mintSigner, blacklist) + ) + ) + ); + + TrailblazersBadges s1BadgesV2 = TrailblazersBadges(proxy); + + // upgrade s1 badges contract to use the mock version + + s1BadgesV2.upgradeToAndCall( + address(new TrailblazerBadgesS1MintTo()), + abi.encodeCall(TrailblazerBadgesS1MintTo.call, ()) + ); + + BADGE_ID = s1BadgesV2.BADGE_RAVERS(); + + // upgrade s1 contract to v4 + s1BadgesV2.upgradeToAndCall( + address(new TrailblazersBadgesV4()), abi.encodeCall(TrailblazersBadgesV4.version, ()) + ); + + s1BadgesV4 = TrailblazersBadgesV4(address(s1BadgesV2)); + + // upgrade to v5 + s1BadgesV4.upgradeToAndCall( + address(new TrailblazersBadgesV5()), abi.encodeCall(TrailblazersBadgesV5.version, ()) + ); + + s1BadgesV5 = TrailblazersBadgesV5(address(s1BadgesV4)); + + // set cooldown recruitment + s1BadgesV5.setRecruitmentLockDuration(365 days); + + // deploy the s2 erc1155 token contract + + impl = address(new TrailblazersBadgesS2()); + proxy = address( + new ERC1967Proxy( + impl, + abi.encodeCall(TrailblazersBadgesS2.initialize, (address(recruitmentV1), "ipfs://")) + ) + ); + s2Badges = TrailblazersBadgesS2(proxy); + + // deploy the recruitment contract + BadgeRecruitment.Config memory config = BadgeRecruitment.Config( + COOLDOWN_RECRUITMENT, + COOLDOWN_INFLUENCE, + INFLUENCE_WEIGHT_PERCENT, + MAX_INFLUENCES, + MAX_INFLUENCES_DIVIDER, + DEFAULT_CYCLE_DURATION + ); + + impl = address(new BadgeRecruitment()); + proxy = address( + new ERC1967Proxy( + impl, + abi.encodeCall( + BadgeRecruitment.initialize, + (address(s1BadgesV2), address(s2Badges), mintSigner, config) + ) + ) + ); + recruitmentV1 = BadgeRecruitment(proxy); + + s1BadgesV5.setRecruitmentContract(address(recruitmentV1)); + s2Badges.setMinter(address(recruitmentV1)); + // enable recruitment for BADGE_ID + uint256[] memory enabledBadgeIds = new uint256[](1); + enabledBadgeIds[0] = BADGE_ID; + recruitmentV1.enableRecruitments(enabledBadgeIds); + + vm.stopPrank(); + } + + function wait(uint256 time) public { + vm.warp(block.timestamp + time); + } + + function test_upgradeV2() public { + vm.startPrank(owner); + recruitmentV1.upgradeToAndCall( + address(new BadgeRecruitmentV2()), abi.encodeCall(BadgeRecruitmentV2.version, ()) + ); + + recruitment = BadgeRecruitmentV2(address(recruitmentV1)); + + assertEq(recruitment.version(), "V2"); + + s1BadgesV5.setRecruitmentContractV2(address(recruitment)); + vm.stopPrank(); + } + + function test_legacy_startRecruitment_throws() public { + test_upgradeV2(); + vm.expectRevert(TrailblazersBadgesV5.NOT_IMPLEMENTED.selector); + s1BadgesV5.startRecruitment(BADGE_ID); + } + + function test_full_recruitment() public { + test_upgradeV2(); + + address minter = minters[0]; + vm.startPrank(minter); + + // mint the badge + bytes32 _hash = s1BadgesV5.getHash(minter, BADGE_ID); + (uint8 v, bytes32 r, bytes32 s) = vm.sign(mintSignerPk, _hash); + bool canMint = s1BadgesV5.canMint(abi.encodePacked(r, s, v), minter, BADGE_ID); + assertTrue(canMint); + + s1BadgesV5.mint(abi.encodePacked(r, s, v), BADGE_ID); + uint256 tokenId = s1BadgesV5.tokenOfOwnerByIndex(minter, 0); + + vm.stopPrank(); + + // mint and transfer to minter a secondary badge with id 0 + + vm.startPrank(minters[1]); + _hash = s1BadgesV5.getHash(minters[1], BADGE_ID); + (v, r, s) = vm.sign(mintSignerPk, _hash); + canMint = s1BadgesV5.canMint(abi.encodePacked(r, s, v), minters[1], BADGE_ID); + assertTrue(canMint); + + s1BadgesV5.mint(abi.encodePacked(r, s, v), BADGE_ID); + uint256 secondTokenId = s1BadgesV5.tokenOfOwnerByIndex(minters[1], 0); + + s1BadgesV5.transferFrom(minters[1], minter, secondTokenId); + + // ensure balances + assertEq(s1BadgesV5.balanceOf(minter), 2); + assertEq(s1BadgesV5.balanceOf(minters[1]), 0); + vm.stopPrank(); + + // start migration with first badge, using v1 methods + vm.startPrank(minter); + wait(100); + s1BadgesV5.startRecruitment(BADGE_ID, tokenId); + assertEq(recruitment.isRecruitmentActive(minter), true); + assertEq(s1BadgesV5.balanceOf(minter), 2); + assertEq(s1BadgesV5.unlockTimestamps(tokenId), block.timestamp + 365 days); + + // and end it + wait(COOLDOWN_INFLUENCE); + wait(COOLDOWN_RECRUITMENT); + + // generate the claim hash for the current recruitment + bytes32 claimHash = recruitment.generateClaimHash( + BadgeRecruitment.HashType.End, + minter, + 0 // experience points + ); + + // simulate the backend signing the hash + (v, r, s) = vm.sign(mintSignerPk, claimHash); + + // exercise the randomFromSignature function + recruitment.endRecruitment(claimHash, v, r, s, 0); + + // check for s2 state reset + assertEq(recruitment.isRecruitmentActive(minter), false); + assertEq(recruitment.isInfluenceActive(minter), false); + + // check for s2 mint + assertEq(s2Badges.balanceOf(minter, 1), 1); + + // open a second migration cycle + vm.stopPrank(); + vm.startPrank(owner); + + // enable recruitment for BADGE_ID + uint256[] memory enabledBadgeIds = new uint256[](1); + enabledBadgeIds[0] = BADGE_ID; + recruitment.forceDisableAllRecruitments(); + recruitment.enableRecruitments(enabledBadgeIds); + vm.stopPrank(); + + // expect legacy method to fail + vm.startPrank(minter); + wait(100); + vm.expectRevert(TrailblazersBadgesV4.BADGE_LOCKED.selector); + s1BadgesV5.startRecruitment(BADGE_ID, tokenId); + // time to start the second migration + wait(100); + + s1BadgesV5.startRecruitment(BADGE_ID, secondTokenId); + assertEq(recruitment.isRecruitmentActive(minter), true); + assertEq(s1BadgesV5.balanceOf(minter), 2); + assertEq(s1BadgesV5.unlockTimestamps(secondTokenId), block.timestamp + 365 days); + + vm.stopPrank(); + } + + function test_resetRecruitment() public { + test_full_recruitment(); + uint256 initialCycleId = recruitment.recruitmentCycleId(); + + assertEq(initialCycleId, 2); + // roll forward the cycle + vm.startPrank(owner); + + uint256[] memory enabledBadgeIds = new uint256[](1); + enabledBadgeIds[0] = BADGE_ID; + recruitment.forceDisableAllRecruitments(); + recruitment.enableRecruitments(enabledBadgeIds); + vm.stopPrank(); + + uint256 cycleId = recruitment.recruitmentCycleId(); + assertEq(cycleId, 3); + + address minter = minters[0]; + uint256 ongoingTokenId = s1BadgesV5.tokenOfOwnerByIndex(minter, 1); + uint256 completedTokenId = s1BadgesV5.tokenOfOwnerByIndex(minter, 0); + + assertEq(s2Badges.balanceOf(minter, 1), 1); + + vm.startPrank(minter); + + // expect revert from the completed migration + vm.expectRevert(TrailblazersBadgesV5.RECRUITMENT_NOT_FOUND.selector); + s1BadgesV5.resetMigration(completedTokenId, BADGE_ID, initialCycleId); + // on both cycles + vm.expectRevert(TrailblazersBadgesV5.RECRUITMENT_NOT_FOUND.selector); + s1BadgesV5.resetMigration(completedTokenId, BADGE_ID, cycleId); + // as well as for the ongoing migration on the current cycle + vm.expectRevert(TrailblazersBadgesV5.RECRUITMENT_NOT_FOUND.selector); + s1BadgesV5.resetMigration(ongoingTokenId, BADGE_ID, cycleId); + + // reset the ongoing recruitment + s1BadgesV5.resetMigration(ongoingTokenId, BADGE_ID, initialCycleId); + + // start over the ongoing migration + wait(100); + s1BadgesV5.startRecruitment(BADGE_ID, ongoingTokenId); + assertEq(recruitment.isRecruitmentActive(minter), true); + assertEq(s1BadgesV5.balanceOf(minter), 2); + assertEq(s1BadgesV5.unlockTimestamps(ongoingTokenId), block.timestamp + 365 days); + + // and end it + wait(COOLDOWN_INFLUENCE); + wait(COOLDOWN_RECRUITMENT); + + bytes32 claimHash = recruitment.generateClaimHash( + BadgeRecruitment.HashType.End, + minter, + 0 // experience points + ); + + (uint8 v, bytes32 r, bytes32 s) = vm.sign(mintSignerPk, claimHash); + recruitment.endRecruitment(claimHash, v, r, s, 0); + + // check for s2 state reset + assertEq(recruitment.isRecruitmentActive(minter), false); + assertEq(recruitment.isInfluenceActive(minter), false); + + // check for s2 mint + assertEq(s2Badges.balanceOf(minter, 2), 1); + + // fail to reset the ongoing migration + vm.expectRevert(TrailblazersBadgesV5.RECRUITMENT_NOT_FOUND.selector); + s1BadgesV5.resetMigration(ongoingTokenId, BADGE_ID, cycleId); + } + + function test_revertStartTooCloseToCycleEnd() public { + test_upgradeV2(); + address minter = minters[0]; + vm.startPrank(minter); + + // mint the badge + bytes32 _hash = s1BadgesV5.getHash(minter, BADGE_ID); + (uint8 v, bytes32 r, bytes32 s) = vm.sign(mintSignerPk, _hash); + bool canMint = s1BadgesV5.canMint(abi.encodePacked(r, s, v), minter, BADGE_ID); + assertTrue(canMint); + + s1BadgesV5.mint(abi.encodePacked(r, s, v), BADGE_ID); + uint256 tokenId = s1BadgesV5.tokenOfOwnerByIndex(minter, 0); + + // wait until almost the end + wait(DEFAULT_CYCLE_DURATION - COOLDOWN_RECRUITMENT + 1); + vm.expectRevert(BadgeRecruitmentV2.NOT_ENOUGH_TIME_LEFT.selector); + s1BadgesV5.startRecruitment(BADGE_ID, tokenId); + assertEq(recruitment.isRecruitmentActive(minter), false); + vm.stopPrank(); + } +} diff --git a/packages/nfts/test/trailblazers-season-2/TrailblazersBadgesS2.t.sol b/packages/nfts/test/trailblazers-season-2/TrailblazersBadgesS2.t.sol new file mode 100644 index 00000000000..40918273115 --- /dev/null +++ b/packages/nfts/test/trailblazers-season-2/TrailblazersBadgesS2.t.sol @@ -0,0 +1,111 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.24; + +import { Test } from "forge-std/src/Test.sol"; + +import { ERC1967Proxy } from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; +import { UtilsScript } from "../../script/taikoon/sol/Utils.s.sol"; +import { TrailblazersBadgesS2 } from + "../../contracts/trailblazers-season-2/TrailblazersBadgesS2.sol"; + +contract TrailblazersBadgesS2Test is Test { + UtilsScript public utils; + + address public owner = vm.addr(0x5); + address public authorizedMinter = vm.addr(0x6); + address[3] public minters = [vm.addr(0x1), vm.addr(0x2), vm.addr(0x3)]; + + string public uriTemplate = "ipfs://hash"; + + TrailblazersBadgesS2 public nft; + + uint256 public TOKEN_ID = 1; + + function setUp() public { + utils = new UtilsScript(); + utils.setUp(); + // create whitelist merkle tree + vm.startBroadcast(owner); + + address impl = address(new TrailblazersBadgesS2()); + address proxy = address( + new ERC1967Proxy( + impl, + abi.encodeCall(TrailblazersBadgesS2.initialize, (authorizedMinter, uriTemplate)) + ) + ); + + nft = TrailblazersBadgesS2(proxy); + + vm.stopBroadcast(); + } + + function test_mint() public { + vm.prank(authorizedMinter); + nft.mint( + minters[0], + TrailblazersBadgesS2.BadgeType.Ravers, + TrailblazersBadgesS2.MovementType.Minnow + ); + + assertEq(nft.balanceOf(minters[0], TOKEN_ID), 1); + + TrailblazersBadgesS2.Badge memory badge = nft.getBadge(TOKEN_ID); + assertEq(badge.tokenId, TOKEN_ID); + assertEq(uint8(badge.badgeType), uint8(TrailblazersBadgesS2.BadgeType.Ravers)); + assertEq(uint8(badge.movementType), uint8(TrailblazersBadgesS2.MovementType.Minnow)); + } + + function test_uri_byTokenId() public { + test_mint(); + assertEq(nft.uri(TOKEN_ID), "ipfs://hash/2/0"); + } + + function test_uri_byTypeAndMovement() public { + test_mint(); + assertEq( + nft.uri(TrailblazersBadgesS2.BadgeType.Ravers, TrailblazersBadgesS2.MovementType.Minnow), + "ipfs://hash/2/0" + ); + } + + function test_uri_full() public { + vm.startPrank(authorizedMinter); + uint8 tokenId = 1; + + TrailblazersBadgesS2.Badge memory badge; + for (uint8 i = 1; i < 3; i++) { + for (uint8 j = 0; j < 8; j++) { + nft.mint( + minters[0], + TrailblazersBadgesS2.BadgeType(j), + TrailblazersBadgesS2.MovementType(i) + ); + + badge = nft.getBadge(tokenId); + string memory badgeType = vm.toString(uint256(badge.badgeType)); + string memory movementType = vm.toString(uint256(badge.movementType)); + + string memory uri = + string(abi.encodePacked("ipfs://hash/", movementType, "/", badgeType)); + assertEq(nft.uri(tokenId), uri); + tokenId++; + } + } + } + + function test_uri_revert__tokenNotMinted() public { + vm.expectRevert(); + nft.uri(TOKEN_ID); + } + + function test_mint_revert__notAuthorizedMinter() public { + vm.prank(minters[1]); + vm.expectRevert(); + nft.mint( + minters[1], + TrailblazersBadgesS2.BadgeType.Ravers, + TrailblazersBadgesS2.MovementType.Minnow + ); + } +} diff --git a/packages/nfts/test/util/Blacklist.sol b/packages/nfts/test/util/Blacklist.sol index 890bc15aff4..f4388126949 100644 --- a/packages/nfts/test/util/Blacklist.sol +++ b/packages/nfts/test/util/Blacklist.sol @@ -24,4 +24,8 @@ contract MockBlacklist is IMinimalBlacklist { } return false; } + + function add(address _address) public { + blacklist.push(_address); + } } diff --git a/packages/nfts/test/util/MockTokens.sol b/packages/nfts/test/util/MockTokens.sol new file mode 100644 index 00000000000..6143d1b37ec --- /dev/null +++ b/packages/nfts/test/util/MockTokens.sol @@ -0,0 +1,68 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.24; + +import "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/token/ERC1155/ERC1155Upgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; + +contract ERC20Mock is Initializable, ERC20Upgradeable { + function initialize(string memory name, string memory symbol) public initializer { + __ERC20_init(name, symbol); + } + + function mint(address to, uint256 amount) public { + _mint(to, amount); + } + + function burn(address from, uint256 amount) public { + _burn(from, amount); + } +} + +contract ERC721Mock is Initializable, ERC721Upgradeable { + function initialize(string memory name, string memory symbol) public initializer { + __ERC721_init(name, symbol); + } + + function mint(address to, uint256 tokenId) public { + _mint(to, tokenId); + } + + function burn(uint256 tokenId) public { + _burn(tokenId); + } +} + +contract ERC1155Mock is Initializable, ERC1155Upgradeable { + function initialize(string memory uri) public initializer { + __ERC1155_init(uri); + } + + function mint(address to, uint256 id, uint256 amount, bytes memory data) public { + _mint(to, id, amount, data); + } + + function mintBatch( + address to, + uint256[] memory ids, + uint256[] memory amounts, + bytes memory data + ) + public + { + _mintBatch(to, ids, amounts, data); + } + + function burn(address from, uint256 id, uint256 amount) public { + _burn(from, id, amount); + } + + function burnBatch(address from, uint256[] memory ids, uint256[] memory amounts) public { + _burnBatch(from, ids, amounts); + } +} + +contract MockInvalidNFT { +// This contract doesn't implement any NFT interface +} diff --git a/packages/nfts/test/util/TrailblazerBadgesS1MintTo.sol b/packages/nfts/test/util/TrailblazerBadgesS1MintTo.sol new file mode 100644 index 00000000000..27f3697fd7c --- /dev/null +++ b/packages/nfts/test/util/TrailblazerBadgesS1MintTo.sol @@ -0,0 +1,24 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.24; + +import { Test } from "forge-std/src/Test.sol"; + +import { TrailblazersBadgesV4 } from + "../../contracts/trailblazers-season-2/TrailblazersS1BadgesV4.sol"; + +contract TrailblazerBadgesS1MintTo is TrailblazersBadgesV4 { + function mintTo(address _minter, uint256 _badgeId) public onlyOwner { + if (_badgeId > BADGE_SHINTO) revert INVALID_BADGE_ID(); + + uint256 tokenId = totalSupply() + 1; + badges[tokenId] = _badgeId; + + _mint(_minter, tokenId); + + emit BadgeCreated(tokenId, _minter, _badgeId); + } + + function call() public view returns (bool) { + return true; + } +} diff --git a/packages/protocol/.env.example b/packages/protocol/.env.example index 093b2fdede0..fa0fd36a446 100644 --- a/packages/protocol/.env.example +++ b/packages/protocol/.env.example @@ -1,4 +1,4 @@ ETHERSCAN_API_KEY=ABC123ABC123ABC123ABC123ABC123ABC1 PRIVATE_KEY=0xabc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc1 LOG_LEVEL=DEBUG -REPORT_GAS=true \ No newline at end of file +REPORT_GAS=true diff --git a/packages/protocol/.eslintignore b/packages/protocol/.eslintignore index dcb9ae39eee..1ed07294289 100644 --- a/packages/protocol/.eslintignore +++ b/packages/protocol/.eslintignore @@ -3,4 +3,6 @@ artifacts cache coverage lib -contracts/automata-attestation/ \ No newline at end of file +test/shared/thirdparty/ +contracts/layer1/automata-attestation/ +monitors/ \ No newline at end of file diff --git a/packages/protocol/.gitignore b/packages/protocol/.gitignore index a8640e16fc1..d413d569ab2 100644 --- a/packages/protocol/.gitignore +++ b/packages/protocol/.gitignore @@ -14,6 +14,7 @@ yarn-error.log* package-lock.json npm-debug.log* typechain-types +test/genesis/generate/data # Hardhat files cache @@ -33,3 +34,17 @@ broadcast lcov.info simulation/out/ +test/genesis/data/genesis.json +test/genesis/data/genesis_alloc.json +test/genesis/data/genesis_storage_layout.json + +# Serverless directories +.serverless +jspm_packages + +*.log +.DS_Store + +secrets*.yml +.defender +.platform diff --git a/packages/protocol/.solhint.json b/packages/protocol/.solhint.json index 047afd0e5b4..43f67a418ae 100644 --- a/packages/protocol/.solhint.json +++ b/packages/protocol/.solhint.json @@ -3,7 +3,7 @@ "rules": { "avoid-low-level-calls": "off", "avoid-tx-origin": "off", - "compiler-version": ["error", "0.8.24"], + "compiler-version": ["error", "^0.8.24"], "func-name-mixedcase": "off", "func-visibility": ["error", { "ignoreConstructors": true }], "max-line-length": ["error", 120], @@ -13,6 +13,8 @@ "no-global-import": "off", "no-inline-assembly": "off", "not-rely-on-time": "off", + "gas-custom-errors": "off", + "immutable-vars-naming": "off", "one-contract-per-file": "off" } } diff --git a/packages/protocol/.solhintignore b/packages/protocol/.solhintignore index b98f25593a5..fa784518089 100644 --- a/packages/protocol/.solhintignore +++ b/packages/protocol/.solhintignore @@ -1,7 +1,6 @@ node_modules/ lib/ -contracts/test/TestLibRLPReader.sol -**/contracts/thirdparty/**/*.sol -/contracts/automata-attestation/ -test/GasComparison.t.sol -test/TestLn.sol \ No newline at end of file +contracts/layer1/automata-attestation/ +contracts/layer1/preconf/avs-mvp/ +contracts/layer1/preconf/libs/LibBLS12381.sol +test/shared/thirdparty/ diff --git a/packages/protocol/CHANGELOG.md b/packages/protocol/CHANGELOG.md index 9c9146d0348..08063e60cbb 100644 --- a/packages/protocol/CHANGELOG.md +++ b/packages/protocol/CHANGELOG.md @@ -1,5 +1,597 @@ # Changelog +## [1.11.0](https://github.com/taikoxyz/taiko-mono/compare/taiko-alethia-protocol-v1.10.0...taiko-alethia-protocol-v1.11.0) (2025-01-03) + + +### Features + +* **protocol:** add `DevnetTaikoL1` ([#17900](https://github.com/taikoxyz/taiko-mono/issues/17900)) ([d864cea](https://github.com/taikoxyz/taiko-mono/commit/d864cea2eb8346127992acfbd9012e675a3400cc)) +* **protocol:** add `lastProposedIn` to slotB ([#18379](https://github.com/taikoxyz/taiko-mono/issues/18379)) ([96b380a](https://github.com/taikoxyz/taiko-mono/commit/96b380a452f1055da960146b4bf1e94c1842da73)) +* **protocol:** add `proposeBlocksV2` method to `ProverSet` ([#18115](https://github.com/taikoxyz/taiko-mono/issues/18115)) ([0743a99](https://github.com/taikoxyz/taiko-mono/commit/0743a99ee6ab403024bab5834178399fbeebb4e5)) +* **protocol:** add `proveBlocks` method to `ProverSet` ([#18025](https://github.com/taikoxyz/taiko-mono/issues/18025)) ([36a2ae5](https://github.com/taikoxyz/taiko-mono/commit/36a2ae51c21a2359179755457a8933a346ccd8b3)) +* **protocol:** add `proveBlocks` to TaikoL1.sol ([fe687b3](https://github.com/taikoxyz/taiko-mono/commit/fe687b378fcb440184fd423088432dc63cf5989e)) +* **protocol:** add `TIER_ZKVM_RISC0` tier and `HeklaTierProvider` ([#17913](https://github.com/taikoxyz/taiko-mono/issues/17913)) ([64ed666](https://github.com/taikoxyz/taiko-mono/commit/64ed66628a18cb1b3fff2c4ab5d3c0149288dfe6)) +* **protocol:** add a batch proposing block function ([#17864](https://github.com/taikoxyz/taiko-mono/issues/17864)) ([3649785](https://github.com/taikoxyz/taiko-mono/commit/36497857dd3d5edb718a5cb0057327f3cde39c02)) +* **protocol:** add aggregated sgx verify test ([#18160](https://github.com/taikoxyz/taiko-mono/issues/18160)) ([8dda47b](https://github.com/taikoxyz/taiko-mono/commit/8dda47bf9ee47faa8a0d16dde0b4398d5e7019f8)) +* **protocol:** add ComposeVerifier, TeeAnyVerifier, and ZkAnyVerifier ([ee464ca](https://github.com/taikoxyz/taiko-mono/commit/ee464caef68fdec325aa22758bb69e17dd039794)) +* **protocol:** add Hekla Ontake hardfork upgrade scripts ([#18103](https://github.com/taikoxyz/taiko-mono/issues/18103)) ([a3436e8](https://github.com/taikoxyz/taiko-mono/commit/a3436e8cafbc96ebfa5742ada995adae39c572ce)) +* **protocol:** add preconfirmation support based on https://github.com/taikoxyz/taiko-mono/pull/17654 (with some renaming) (https://github.com/taikoxyz/taiko-mono/issues/14793) ([17d67d7](https://github.com/taikoxyz/taiko-mono/commit/17d67d74c511bc11c2b7d821d8a381f74ef7b6a1)) +* **protocol:** add proposeBlock2 in TaikoL1.sol and approve2 in GuardianProver.sol ([17d67d7](https://github.com/taikoxyz/taiko-mono/commit/17d67d74c511bc11c2b7d821d8a381f74ef7b6a1)) +* **protocol:** add proposer address to getMinTier func ([#17919](https://github.com/taikoxyz/taiko-mono/issues/17919)) ([d6ea6f3](https://github.com/taikoxyz/taiko-mono/commit/d6ea6f33d6bf54cba3bd6ab153e38d09abf19912)) +* **protocol:** add SP1 verification support ([#17861](https://github.com/taikoxyz/taiko-mono/issues/17861)) ([2936312](https://github.com/taikoxyz/taiko-mono/commit/29363123233f9d2d749eb626095d0c645801e384)) +* **protocol:** adjust gas excess once the gas target has changed ([a1e217e](https://github.com/taikoxyz/taiko-mono/commit/a1e217e457546d63a89da0b02135b3b63b22d19e)) +* **protocol:** adjust the zk ratio(risc0 & sp1) ([#18613](https://github.com/taikoxyz/taiko-mono/issues/18613)) ([431435e](https://github.com/taikoxyz/taiko-mono/commit/431435e6e74799caea94f53438238c63831cf07c)) +* **protocol:** adjust zk(risc0 & sp1) ratio ([#18684](https://github.com/taikoxyz/taiko-mono/issues/18684)) ([a0c21a3](https://github.com/taikoxyz/taiko-mono/commit/a0c21a382c779de54b119a6f9b2d5cd869f47f1d)) +* **protocol:** allow `local.params.parentMetaHash` to remain as 0 ([#18451](https://github.com/taikoxyz/taiko-mono/issues/18451)) ([94185fe](https://github.com/taikoxyz/taiko-mono/commit/94185feb207b9a2e74fb05a4898d25ce2008f826)) +* **protocol:** allow a grace period (4h) to defer proof submission to reduce cost ([fe687b3](https://github.com/taikoxyz/taiko-mono/commit/fe687b378fcb440184fd423088432dc63cf5989e)) +* **protocol:** allow any address to withdraw token to the recipient address ([#17843](https://github.com/taikoxyz/taiko-mono/issues/17843)) ([3d89d24](https://github.com/taikoxyz/taiko-mono/commit/3d89d24b14fea7b9e59659e689c3011fbcf4b852)) +* **protocol:** allow any ERC20 tokens or Ether to be used as bonds ([#18380](https://github.com/taikoxyz/taiko-mono/issues/18380)) ([1920521](https://github.com/taikoxyz/taiko-mono/commit/1920521a2478d1e31745742f1ddbb296cdd98f6f)) +* **protocol:** allow contract proposers to use calldata for DA ([17d67d7](https://github.com/taikoxyz/taiko-mono/commit/17d67d74c511bc11c2b7d821d8a381f74ef7b6a1)) +* **protocol:** allow msg.sender to customize block proposer addresses ([#18048](https://github.com/taikoxyz/taiko-mono/issues/18048)) ([22055cc](https://github.com/taikoxyz/taiko-mono/commit/22055cc95e51d07b6b57ab5cb2e4ccd9a97d594a)) +* **protocol:** allow owner to update recipient in TokenUnlock ([#18184](https://github.com/taikoxyz/taiko-mono/issues/18184)) ([773ae1b](https://github.com/taikoxyz/taiko-mono/commit/773ae1b11f309ee8c4e0b1c0d22b9bfa41beae0d)) +* **protocol:** change HeklaTaikoToken's clock mode to timestamp to test the DAO ([#18597](https://github.com/taikoxyz/taiko-mono/issues/18597)) ([ccc9500](https://github.com/taikoxyz/taiko-mono/commit/ccc9500d861d5cc666f038ddb8ceed00a353ee94)) +* **protocol:** check-in `HeklaTaikoToken` ([#18189](https://github.com/taikoxyz/taiko-mono/issues/18189)) ([60c38d8](https://github.com/taikoxyz/taiko-mono/commit/60c38d8d179f2c02a0ed87f97bd34dc708b38df4)) +* **protocol:** decrease the rate of risc0 in Hekla ([#18553](https://github.com/taikoxyz/taiko-mono/issues/18553)) ([57d20db](https://github.com/taikoxyz/taiko-mono/commit/57d20db59ffa23f7038ad80a4322634cc71251ea)) +* **protocol:** enable sp1 batch aggregation ([#18199](https://github.com/taikoxyz/taiko-mono/issues/18199)) ([038cd32](https://github.com/taikoxyz/taiko-mono/commit/038cd326668b3a882798ecb4e7f9e3ecadc6dc28)) +* **protocol:** improve `getTransitions` ([#18181](https://github.com/taikoxyz/taiko-mono/issues/18181)) ([868d733](https://github.com/taikoxyz/taiko-mono/commit/868d733db962a76261036c3e583cb50feaec901f)) +* **protocol:** improve L2 basefee calculation ([920bd68](https://github.com/taikoxyz/taiko-mono/commit/920bd6873d3e9e1bbb00751fb9c0056ac85b8554)) +* **protocol:** increase risc0 frequency in Hekla ([#18407](https://github.com/taikoxyz/taiko-mono/issues/18407)) ([350264c](https://github.com/taikoxyz/taiko-mono/commit/350264c98d6a96ea11d5b1cef684a81605d3826b)) +* **protocol:** Increase the probability of sgx proof for lab proposer ([#18288](https://github.com/taikoxyz/taiko-mono/issues/18288)) ([fd0dbbb](https://github.com/taikoxyz/taiko-mono/commit/fd0dbbbb3df0db27873e0ba87e45a5165fb7c0f1)) +* **protocol:** increase zk(risc0 & sp1) rate in mainnet ([#18481](https://github.com/taikoxyz/taiko-mono/issues/18481)) ([f24a908](https://github.com/taikoxyz/taiko-mono/commit/f24a908e60c062ad789a34765de5a1037bdb1ff0)) +* **protocol:** introduce `getTransitions` in TaikoL1 ([#18154](https://github.com/taikoxyz/taiko-mono/issues/18154)) ([273bf53](https://github.com/taikoxyz/taiko-mono/commit/273bf53fad763b8504353e7cc14c8585e341f9d0)) +* **protocol:** introduce ForkManager to improve protocol fork management ([#18508](https://github.com/taikoxyz/taiko-mono/issues/18508)) ([ff5c196](https://github.com/taikoxyz/taiko-mono/commit/ff5c1964a303e21dfeb87f8f9c01fc82ef43a03e)) +* **protocol:** introduce risc0 proof ([#17877](https://github.com/taikoxyz/taiko-mono/issues/17877)) ([bcb57cb](https://github.com/taikoxyz/taiko-mono/commit/bcb57cb81d12d0c09656582ad9140b38015b3a58)) +* **protocol:** make `TaikoL2Deprecated` ABI go-ethereum compatible ([#18659](https://github.com/taikoxyz/taiko-mono/issues/18659)) ([05594cf](https://github.com/taikoxyz/taiko-mono/commit/05594cfe6fd188573f9db2de4e1f039ea7317c9b)) +* **protocol:** make sure `init()` covers logics in `init2()`, `init3()`.. ([#18292](https://github.com/taikoxyz/taiko-mono/issues/18292)) ([9d06958](https://github.com/taikoxyz/taiko-mono/commit/9d06958e713e530fdd610c439c7b93199d0dcc69)) +* **protocol:** measure gas per block using a debug event ([#18470](https://github.com/taikoxyz/taiko-mono/issues/18470)) ([e84e472](https://github.com/taikoxyz/taiko-mono/commit/e84e472e4a0479301d5ce1d4268d964705dcbbd0)) +* **protocol:** propose a batch blocks conditionally ([#18570](https://github.com/taikoxyz/taiko-mono/issues/18570)) ([e846f62](https://github.com/taikoxyz/taiko-mono/commit/e846f6289fea0b046ddcfcdfaf46f3727efbdf11)) +* **protocol:** protocol monitors ([#18002](https://github.com/taikoxyz/taiko-mono/issues/18002)) ([45b2087](https://github.com/taikoxyz/taiko-mono/commit/45b2087495d4f9e20083ebe2c61ecfe8d252e4b2)) +* **protocol:** relocate L2 base fee parameters to L1 configuration ([17d67d7](https://github.com/taikoxyz/taiko-mono/commit/17d67d74c511bc11c2b7d821d8a381f74ef7b6a1)) +* **protocol:** rename B_BLOCK_PROPOSER to B_PRECONF_REGISTRY ([#18255](https://github.com/taikoxyz/taiko-mono/issues/18255)) ([bf3caf7](https://github.com/taikoxyz/taiko-mono/commit/bf3caf7d986d7b03cf3bd0aa69ea97602bff80aa)) +* **protocol:** request zk proofs(risc0 & sp1) in mainnet ([#18467](https://github.com/taikoxyz/taiko-mono/issues/18467)) ([1fab427](https://github.com/taikoxyz/taiko-mono/commit/1fab427005708036c981f2b8fb47d9aa408e0d94)) +* **protocol:** return verification timestamp in getLastVerifiedBlock ([#17868](https://github.com/taikoxyz/taiko-mono/issues/17868)) ([1998288](https://github.com/taikoxyz/taiko-mono/commit/19982889f7f4c073d182a6076633c5e2c892c73a)) +* **protocol:** revert removing time as input for L2 base fee calculation ([a1e217e](https://github.com/taikoxyz/taiko-mono/commit/a1e217e457546d63a89da0b02135b3b63b22d19e)) +* **protocol:** script of `UpgradeRisc0Verifier` ([#17949](https://github.com/taikoxyz/taiko-mono/issues/17949)) ([fc12e04](https://github.com/taikoxyz/taiko-mono/commit/fc12e040c391e0f37c906b270743d3b57710f69d)) +* **protocol:** scripts to deploy new mainnet implementation contracts ([#18356](https://github.com/taikoxyz/taiko-mono/issues/18356)) ([269759b](https://github.com/taikoxyz/taiko-mono/commit/269759bccefba399f0aa6f45482f4a24330a5e47)) +* **protocol:** support backward-compatible batch-proof verification ([#17968](https://github.com/taikoxyz/taiko-mono/issues/17968)) ([c476aab](https://github.com/taikoxyz/taiko-mono/commit/c476aabe130d151f5678cd35fab99f258997f629)) +* **protocol:** tolerate invalid BaseFeeConfig on L2 ([#18338](https://github.com/taikoxyz/taiko-mono/issues/18338)) ([f9f5d15](https://github.com/taikoxyz/taiko-mono/commit/f9f5d156f9fef622d921f6e007ecb43ded0130ad)) +* **protocol:** update `B_TIER_ROUTER` in `RollupAddressCache` ([#18370](https://github.com/taikoxyz/taiko-mono/issues/18370)) ([9748ae5](https://github.com/taikoxyz/taiko-mono/commit/9748ae527a75124f8674bb66280b9161ce79d046)) +* **protocol:** update `HeklaTierProvider` to introduce sp1 proof ([#18022](https://github.com/taikoxyz/taiko-mono/issues/18022)) ([76b6514](https://github.com/taikoxyz/taiko-mono/commit/76b6514fd42ba7fa2124b44443728fa32304c324)) +* **protocol:** update `ontakeForkHeight` to Sep 24, 2024 ([#18046](https://github.com/taikoxyz/taiko-mono/issues/18046)) ([30c9316](https://github.com/taikoxyz/taiko-mono/commit/30c9316aea083d187617f5342fb4a955e604226b)) +* **protocol:** update `RollupAddressCache` with new `MainnetTierRouter` address ([#18619](https://github.com/taikoxyz/taiko-mono/issues/18619)) ([b2ca63c](https://github.com/taikoxyz/taiko-mono/commit/b2ca63cd4ed7eca385c317d9a6ade794bf156c79)) +* **protocol:** update Hekla `ontakeForkHeight` ([#17983](https://github.com/taikoxyz/taiko-mono/issues/17983)) ([8819e3a](https://github.com/taikoxyz/taiko-mono/commit/8819e3a5a59675dcc6a1f333620ce6e75b7d2887)) +* **protocol:** update mainnet `ontakeForkHeight` config ([#18252](https://github.com/taikoxyz/taiko-mono/issues/18252)) ([7550882](https://github.com/taikoxyz/taiko-mono/commit/75508828d3755e1a831380cdd2ab321e67fa22fc)) +* **protocol:** update ric0 & sp1 verification contract ([#18269](https://github.com/taikoxyz/taiko-mono/issues/18269)) ([684a909](https://github.com/taikoxyz/taiko-mono/commit/684a909e83705c59b2b7a0a991424b7a8e9e03ad)) +* **protocol:** update script of deploying sp1 ([#18019](https://github.com/taikoxyz/taiko-mono/issues/18019)) ([9464967](https://github.com/taikoxyz/taiko-mono/commit/94649671bdf0304d96bf83d7d18dcbe21eff6067)) +* **protocol:** update sp1 contracts ([#18097](https://github.com/taikoxyz/taiko-mono/issues/18097)) ([6f26434](https://github.com/taikoxyz/taiko-mono/commit/6f264342fe48f8d193559ac0712cc875d643b6fd)) +* **protocol:** update sp1 to 3.0.0 prod version ([#18465](https://github.com/taikoxyz/taiko-mono/issues/18465)) ([0b11101](https://github.com/taikoxyz/taiko-mono/commit/0b1110159201f94ff5a4df528eab60b306d4fb25)) +* **protocol:** upgrade script ([#18334](https://github.com/taikoxyz/taiko-mono/issues/18334)) ([2c41dd1](https://github.com/taikoxyz/taiko-mono/commit/2c41dd10989566c1b6af691c92ab2cbde734a13a)) +* **protocol:** use SP1 1.2.0-rc with more proof verification tests ([#18001](https://github.com/taikoxyz/taiko-mono/issues/18001)) ([f7bcf1d](https://github.com/taikoxyz/taiko-mono/commit/f7bcf1d63d19b641ac6b9e0e972a7f6e2ec5b38f)) +* **protocol:** user smaller cooldown windows ([#18345](https://github.com/taikoxyz/taiko-mono/issues/18345)) ([63455f9](https://github.com/taikoxyz/taiko-mono/commit/63455f91d202d88583d70bce69e799032523eb18)) + + +### Bug Fixes + +* **protocl:** check blockId in getBlock and getBlockV2 ([#18327](https://github.com/taikoxyz/taiko-mono/issues/18327)) ([4288fb6](https://github.com/taikoxyz/taiko-mono/commit/4288fb6e0c8c76651d2db866cab55f32a9a25075)) +* **protocol:** add timestamp as a new parameter to getBasefeeV2 ([#18686](https://github.com/taikoxyz/taiko-mono/issues/18686)) ([361c26a](https://github.com/taikoxyz/taiko-mono/commit/361c26adc62a6358c4d38c6a4d707274c84d7552)) +* **protocol:** avoid invocation in Bridge message processing if calldata is "" and value is 0 ([#18137](https://github.com/taikoxyz/taiko-mono/issues/18137)) ([10c2972](https://github.com/taikoxyz/taiko-mono/commit/10c29727081bd8f8b94bbfc4472b162ec552ef64)) +* **protocol:** correct the wrong router address for mainnet ([#18291](https://github.com/taikoxyz/taiko-mono/issues/18291)) ([ae0a9da](https://github.com/taikoxyz/taiko-mono/commit/ae0a9daf83ab8f323c216978724ebcb71de54cfe)) +* **protocol:** fix `chainId` in `HeklaTaikoL1` ([#17912](https://github.com/taikoxyz/taiko-mono/issues/17912)) ([8f31dd0](https://github.com/taikoxyz/taiko-mono/commit/8f31dd0ed519809f0ea0797b1e6b5937ee087108)) +* **protocol:** fix a new bug in LibProposing ([#18328](https://github.com/taikoxyz/taiko-mono/issues/18328)) ([7436bae](https://github.com/taikoxyz/taiko-mono/commit/7436bae9660cfcf1d430ca111df8c75d50908eae)) +* **protocol:** fix an issue in same transition check ([#18254](https://github.com/taikoxyz/taiko-mono/issues/18254)) ([233806e](https://github.com/taikoxyz/taiko-mono/commit/233806e4838aa12e8de436a37979ff3e614119f2)) +* **protocol:** fix BridgedERC20V2.sol initializer logic ([#17823](https://github.com/taikoxyz/taiko-mono/issues/17823)) ([d538d99](https://github.com/taikoxyz/taiko-mono/commit/d538d99f9542852821d958008d913c028629bbef)) +* **protocol:** fix bug in adjustExcess ([920bd68](https://github.com/taikoxyz/taiko-mono/commit/920bd6873d3e9e1bbb00751fb9c0056ac85b8554)) +* **protocol:** fix DCAP configuration script ([#18088](https://github.com/taikoxyz/taiko-mono/issues/18088)) ([e8618c5](https://github.com/taikoxyz/taiko-mono/commit/e8618c54a58993499e852ec2ffc2468d4f0274ba)) +* **protocol:** fix debitBond bug and add additional tests ([#18443](https://github.com/taikoxyz/taiko-mono/issues/18443)) ([75ff1f8](https://github.com/taikoxyz/taiko-mono/commit/75ff1f87412c763e6ed3431d13689a629a2dd668)) +* **protocol:** fix issue in mainnet deployment script ([#18283](https://github.com/taikoxyz/taiko-mono/issues/18283)) ([5c371a1](https://github.com/taikoxyz/taiko-mono/commit/5c371a181af444999f611e03774ec096ffbd1226)) +* **protocol:** fix LibAddress.supportsInterface to handle undecodeable return data ([#18286](https://github.com/taikoxyz/taiko-mono/issues/18286)) ([299b4c9](https://github.com/taikoxyz/taiko-mono/commit/299b4c9ecf96644c909df70a3527ae5c2e728a07)) +* **protocol:** fix permission in ComposeVerifier ([#18302](https://github.com/taikoxyz/taiko-mono/issues/18302)) ([4c45d8b](https://github.com/taikoxyz/taiko-mono/commit/4c45d8bcdb52521ac1738ca271316d82689537b0)) +* **protocol:** fix proposeBlock()'s block id check ([#18227](https://github.com/taikoxyz/taiko-mono/issues/18227)) ([3a9d6c1](https://github.com/taikoxyz/taiko-mono/commit/3a9d6c166b7c6666eb2515893b6a3fbd00f4b1ea)) +* **protocol:** fix test related to SendMessageToDelegateOwner.s.sol ([#18300](https://github.com/taikoxyz/taiko-mono/issues/18300)) ([65daa3e](https://github.com/taikoxyz/taiko-mono/commit/65daa3e631b471d17dbffb1001dab66efa67c499)) +* **protocol:** fix tier id conflicts ([#18004](https://github.com/taikoxyz/taiko-mono/issues/18004)) ([0df1ad4](https://github.com/taikoxyz/taiko-mono/commit/0df1ad4274e6ebc3db79acbbdaedbe2d519262d6)) +* **protocol:** fix wrong Bridged ERC20 address cache ([#18287](https://github.com/taikoxyz/taiko-mono/issues/18287)) ([49267ab](https://github.com/taikoxyz/taiko-mono/commit/49267abaa6d27d16fe4fb62ca0bb28d49b09d2f9)) +* **protocol:** make sure new instance is not zero address in SgxVerifier ([#17918](https://github.com/taikoxyz/taiko-mono/issues/17918)) ([d559ce8](https://github.com/taikoxyz/taiko-mono/commit/d559ce80c1314e9ddbe02798f1c61a2e8349da6e)) +* **protocol:** revert `B_TIER_OPTIMISTIC` back to `""` ([#18446](https://github.com/taikoxyz/taiko-mono/issues/18446)) ([9549e7f](https://github.com/taikoxyz/taiko-mono/commit/9549e7f3e899b22ff8c9ff7d731aa3ce250fd071)) +* **protocol:** revert a change to maintain taiko-geth compatibility ([#18331](https://github.com/taikoxyz/taiko-mono/issues/18331)) ([9d18d59](https://github.com/taikoxyz/taiko-mono/commit/9d18d598fe3e890a1f35e2d39916d554282ee4a0)) +* **protocol:** revert changes related to `proposedIn` and `proposedAt` to fix a bug ([#18333](https://github.com/taikoxyz/taiko-mono/issues/18333)) ([5cb43ab](https://github.com/taikoxyz/taiko-mono/commit/5cb43ab1e29422353de549f8386eff613291c7df)) +* **protocol:** reward non-assigned prover 7/8 liveness bond ([#18132](https://github.com/taikoxyz/taiko-mono/issues/18132)) ([9f99099](https://github.com/taikoxyz/taiko-mono/commit/9f99099ac271e6e2a0973a43084e29169386f2cd)) +* **protocol:** small fix to 1559 error check ([#18339](https://github.com/taikoxyz/taiko-mono/issues/18339)) ([4428661](https://github.com/taikoxyz/taiko-mono/commit/44286615a0e0b0a17892fe83aad96546a6b1aca1)) +* **protocol:** use block header's extraData for `basefeeSharingPctg` ([#17889](https://github.com/taikoxyz/taiko-mono/issues/17889)) ([5f3cbc9](https://github.com/taikoxyz/taiko-mono/commit/5f3cbc97cbe2636314c4a2945fdf01ef641702e7)) + + +### Chores + +* **docs:** redirect the contribution.md path ([#18316](https://github.com/taikoxyz/taiko-mono/issues/18316)) ([0607ef7](https://github.com/taikoxyz/taiko-mono/commit/0607ef718dbe34c0ffe125825b12001b36a43fc5)) +* **main:** fix misspelled ([#18581](https://github.com/taikoxyz/taiko-mono/issues/18581)) ([3687c4e](https://github.com/taikoxyz/taiko-mono/commit/3687c4e060b4b316fb185c649e9b089b97d53eda)) +* **main:** release protocol 1.10.0 ([#18077](https://github.com/taikoxyz/taiko-mono/issues/18077)) ([3d12cb2](https://github.com/taikoxyz/taiko-mono/commit/3d12cb24b16c7eede1930b928408c1462134f5a7)) +* **main:** release protocol 1.10.0 ([#18365](https://github.com/taikoxyz/taiko-mono/issues/18365)) ([9345f14](https://github.com/taikoxyz/taiko-mono/commit/9345f1419a1e5d0f975e15bb372b6101da9f0c48)) +* **main:** release protocol 1.11.0 ([#18433](https://github.com/taikoxyz/taiko-mono/issues/18433)) ([75359cc](https://github.com/taikoxyz/taiko-mono/commit/75359cc1f76151cdb2e087d0000ad9052f50e3c4)) +* **main:** release protocol 1.9.0 ([#17783](https://github.com/taikoxyz/taiko-mono/issues/17783)) ([7bfd28a](https://github.com/taikoxyz/taiko-mono/commit/7bfd28a2b332c927cd8b6358623551814260f94e)) +* **main:** release protocol 1.9.0 ([#18051](https://github.com/taikoxyz/taiko-mono/issues/18051)) ([2547ba9](https://github.com/taikoxyz/taiko-mono/commit/2547ba9409705bb759b62e59a7e5d5821349c71a)) +* **main:** release protocol 1.9.0 ([#18052](https://github.com/taikoxyz/taiko-mono/issues/18052)) ([bf45889](https://github.com/taikoxyz/taiko-mono/commit/bf45889e18e97f1186cd60fd55e1b2664dc4bf43)) +* **main:** release taiko-alethia-protocol 1.11.0 ([#18663](https://github.com/taikoxyz/taiko-mono/issues/18663)) ([42cd90d](https://github.com/taikoxyz/taiko-mono/commit/42cd90d3f0937b96095076f733f60ca26d3b5751)) +* **protocol:** add functions to ITaikoL1 for Nethermind Preconf ([#18217](https://github.com/taikoxyz/taiko-mono/issues/18217)) ([e349d22](https://github.com/taikoxyz/taiko-mono/commit/e349d2237a1830edab305b2f0eaaeb0eaf3c623f)) +* **protocol:** change bond amounts, proving windows, and cooldown windows ([#18371](https://github.com/taikoxyz/taiko-mono/issues/18371)) ([fac5c16](https://github.com/taikoxyz/taiko-mono/commit/fac5c167357f430cfb030e7ceaa41bb8e4b938d4)) +* **protocol:** change Hekla gas issuance per sec to 100000 ([#18335](https://github.com/taikoxyz/taiko-mono/issues/18335)) ([3d448d4](https://github.com/taikoxyz/taiko-mono/commit/3d448d4a78608ea7daf1d50e877c32f8d30f1e7a)) +* **protocol:** change Hekla sharingPctg to 80% & gasIssuancePerSecond to 1000000 ([#18322](https://github.com/taikoxyz/taiko-mono/issues/18322)) ([75feb5b](https://github.com/taikoxyz/taiko-mono/commit/75feb5b36560b786a54e97280352c0d70c3e2f06)) +* **protocol:** delete gas debug event ([#18620](https://github.com/taikoxyz/taiko-mono/issues/18620)) ([06128e8](https://github.com/taikoxyz/taiko-mono/commit/06128e8f64b7bf2997b70959c78ab256404ebab3)) +* **protocol:** deploy `MainnetTierRouter` and update `RollupAddressCache` ([#18359](https://github.com/taikoxyz/taiko-mono/issues/18359)) ([aa351ab](https://github.com/taikoxyz/taiko-mono/commit/aa351ab0f90e442a8b15adb8de6a48d9ae6d1c42)) +* **protocol:** fix documentation ([#18694](https://github.com/taikoxyz/taiko-mono/issues/18694)) ([c7c01a1](https://github.com/taikoxyz/taiko-mono/commit/c7c01a156e05d9126ba6fab7bd910dfa3602169a)) +* **protocol:** fix lint issue in SP1Verifier ([#18213](https://github.com/taikoxyz/taiko-mono/issues/18213)) ([7874dd3](https://github.com/taikoxyz/taiko-mono/commit/7874dd3ff8a6053da8c09377b52c83e7a506f45f)) +* **protocol:** fix typos in documentation files ([#18490](https://github.com/taikoxyz/taiko-mono/issues/18490)) ([8d1f9ea](https://github.com/taikoxyz/taiko-mono/commit/8d1f9eab8e02b1868f2e24005699a8ed1d2937fa)) +* **protocol:** improve the usage of `initializer` and `reinitializer` ([#18319](https://github.com/taikoxyz/taiko-mono/issues/18319)) ([13cc007](https://github.com/taikoxyz/taiko-mono/commit/13cc0074a2295c5939cf83e23f531cb25c43bd64)) +* **protocol:** make two state variables in TaikoL2.sol public and add `adjustExcess` ([#17891](https://github.com/taikoxyz/taiko-mono/issues/17891)) ([ba21f68](https://github.com/taikoxyz/taiko-mono/commit/ba21f6836845ea0227116b701e701815f210d56d)) +* **protocol:** move two files to simplify folder structure ([#17929](https://github.com/taikoxyz/taiko-mono/issues/17929)) ([9dca4fa](https://github.com/taikoxyz/taiko-mono/commit/9dca4faa43ad938880c8e1ac54236ab292bcce6e)) +* **protocol:** optimize Taiko L1 gas cost ([#18376](https://github.com/taikoxyz/taiko-mono/issues/18376)) ([ea0158f](https://github.com/taikoxyz/taiko-mono/commit/ea0158f0cbaa974f90f9174410c705e6cbdc48aa)) +* **protocol:** re-generate layout files with diff order for comparison with new PR ([#18067](https://github.com/taikoxyz/taiko-mono/issues/18067)) ([078d336](https://github.com/taikoxyz/taiko-mono/commit/078d3367dce86a57d71d48291537e925cb1b4b91)) +* **protocol:** remove `TIER_ZKVM_ANY` in `MainnetTierRouter` ([#18357](https://github.com/taikoxyz/taiko-mono/issues/18357)) ([500a8bb](https://github.com/taikoxyz/taiko-mono/commit/500a8bbc46a3d1962ae5cc6d7f10e990f03d07c7)) +* **protocol:** remove repetitive words in audit report ([#18584](https://github.com/taikoxyz/taiko-mono/issues/18584)) ([8092ee5](https://github.com/taikoxyz/taiko-mono/commit/8092ee56e00ed3e422471a9ed85c42fad6c19a13)) +* **protocol:** restore proving window changes ([#18368](https://github.com/taikoxyz/taiko-mono/issues/18368)) ([9182fba](https://github.com/taikoxyz/taiko-mono/commit/9182fbaf05d309f9827310f3616992c0cc88a22d)) +* **protocol:** revert `TAIKO_TOKEN` name changes in `DeployOnL1` ([#17927](https://github.com/taikoxyz/taiko-mono/issues/17927)) ([cf1a15f](https://github.com/taikoxyz/taiko-mono/commit/cf1a15f46344e60448c5fdcbcae02521fb5b7c04)) +* **protocol:** revert Hekla `baseFeeConfig` updates ([#18340](https://github.com/taikoxyz/taiko-mono/issues/18340)) ([ae8ac3c](https://github.com/taikoxyz/taiko-mono/commit/ae8ac3c2e686b136de8c68853ecb91a39260a93f)) +* **protocol:** revert releasing protocol 1.9.0 ([#17783](https://github.com/taikoxyz/taiko-mono/issues/17783)) ([#18049](https://github.com/taikoxyz/taiko-mono/issues/18049)) ([c033810](https://github.com/taikoxyz/taiko-mono/commit/c033810ecc4c80a4581a95b06ab5127747efd191)) +* **protocol:** set mainnet Ontake fork height ([#18112](https://github.com/taikoxyz/taiko-mono/issues/18112)) ([8812eb2](https://github.com/taikoxyz/taiko-mono/commit/8812eb2a8de367311b8ada6bd3587bfe5efee090)) +* **protocol:** shorten imports in solidity files ([#18221](https://github.com/taikoxyz/taiko-mono/issues/18221)) ([9b2ba6a](https://github.com/taikoxyz/taiko-mono/commit/9b2ba6a2a2fae24d1fb34e23b29b3146e96f575e)) +* **protocol:** undo 1.10.0 release ([#18363](https://github.com/taikoxyz/taiko-mono/issues/18363)) ([116578e](https://github.com/taikoxyz/taiko-mono/commit/116578ef8a4391611bd1b3c469f4068cec8a8447)) +* **protoco:** remove unused delegate owner deployment ([#18290](https://github.com/taikoxyz/taiko-mono/issues/18290)) ([63ba863](https://github.com/taikoxyz/taiko-mono/commit/63ba863dcf322b2cf04d7dcaf6d8905bf28de6bc)) +* **repo:** improve documentation and changelog ([#18489](https://github.com/taikoxyz/taiko-mono/issues/18489)) ([c7b9b4f](https://github.com/taikoxyz/taiko-mono/commit/c7b9b4f01098d4fab337b9ff456ce394cdaf3a79)) + + +### Documentation + +* **protocol:** add L2 `DelegateOwner` address in Hekla deployment docs ([#17925](https://github.com/taikoxyz/taiko-mono/issues/17925)) ([fdec8db](https://github.com/taikoxyz/taiko-mono/commit/fdec8dbe8c8aef21f71c9c4ca2213944880c1a47)) +* **protocol:** add mainnet zkVM verifiers deployment ([#18454](https://github.com/taikoxyz/taiko-mono/issues/18454)) ([3481b68](https://github.com/taikoxyz/taiko-mono/commit/3481b68e8d377c1ae6fc5a1a0e08d8411f94c613)) +* **protocol:** add Ontake fork audit report from OpenZeppelin ([#18491](https://github.com/taikoxyz/taiko-mono/issues/18491)) ([e83adc0](https://github.com/taikoxyz/taiko-mono/commit/e83adc06ac4ce8ebe7e34feaad5691176dba27e2)) +* **protocol:** fix invalid links in docs ([#18144](https://github.com/taikoxyz/taiko-mono/issues/18144)) ([c62f3f6](https://github.com/taikoxyz/taiko-mono/commit/c62f3f6b4a21f3af44f7df908fd8aac198721d5b)) +* **protocol:** update `tier_router` in hekla ([#18352](https://github.com/taikoxyz/taiko-mono/issues/18352)) ([7c91a7d](https://github.com/taikoxyz/taiko-mono/commit/7c91a7d486c22e0f1a5386978086dfca5b73cfe0)) +* **protocol:** update `tier_router`with compatibility modifications ([#18028](https://github.com/taikoxyz/taiko-mono/issues/18028)) ([c43cb0c](https://github.com/taikoxyz/taiko-mono/commit/c43cb0c05f7cbba281076568f4e72033ebbcd0f3)) +* **protocol:** update code4rena-2024-03-taiko-final-report.md ([#18062](https://github.com/taikoxyz/taiko-mono/issues/18062)) ([fd68794](https://github.com/taikoxyz/taiko-mono/commit/fd68794a2de24b7a32d2d5a1c3f52c2156b6d61a)) +* **protocol:** update hekla change log about `tier_router` ([#18023](https://github.com/taikoxyz/taiko-mono/issues/18023)) ([11e27d6](https://github.com/taikoxyz/taiko-mono/commit/11e27d60b3da9a34e07bfafadb8ec3d3223867d2)) +* **protocol:** update hekla change log about sp1 ([#18020](https://github.com/taikoxyz/taiko-mono/issues/18020)) ([434bf3c](https://github.com/taikoxyz/taiko-mono/commit/434bf3ccc1715171b8cd4e7581b282f85744ebe3)) +* **protocol:** update Hekla deployment ([#17845](https://github.com/taikoxyz/taiko-mono/issues/17845)) ([d95cc36](https://github.com/taikoxyz/taiko-mono/commit/d95cc36260ee4bf2aaf69181fa6444f419cc44af)) +* **protocol:** update Hekla deployment ([#17924](https://github.com/taikoxyz/taiko-mono/issues/17924)) ([46a3e00](https://github.com/taikoxyz/taiko-mono/commit/46a3e00659534a715fb315859463bd05bbdb65a9)) +* **protocol:** update Hekla deployments ([#17975](https://github.com/taikoxyz/taiko-mono/issues/17975)) ([c96627f](https://github.com/taikoxyz/taiko-mono/commit/c96627fcdd9ba91f26eeea2b329f0eb96dd36660)) +* **protocol:** update Hekla deployments ([#18152](https://github.com/taikoxyz/taiko-mono/issues/18152)) ([6c7ff61](https://github.com/taikoxyz/taiko-mono/commit/6c7ff617b913b21b8b12b035f0d653c068830de3)) +* **protocol:** update Hekla deployments ([#18257](https://github.com/taikoxyz/taiko-mono/issues/18257)) ([fbb1c82](https://github.com/taikoxyz/taiko-mono/commit/fbb1c824e35adb452176d988f32cf06d0c72b9bf)) +* **protocol:** update Hekla deployments ([#18598](https://github.com/taikoxyz/taiko-mono/issues/18598)) ([a095c69](https://github.com/taikoxyz/taiko-mono/commit/a095c69a240d64606b09a26f2e80ad6daf18c273)) +* **protocol:** update L1 deployment ([#18299](https://github.com/taikoxyz/taiko-mono/issues/18299)) ([f60ce3e](https://github.com/taikoxyz/taiko-mono/commit/f60ce3e78bb9a2717718c3a9d7016346d5305488)) +* **protocol:** update mainnet deployment ([#17846](https://github.com/taikoxyz/taiko-mono/issues/17846)) ([ba6bf94](https://github.com/taikoxyz/taiko-mono/commit/ba6bf942213468310c6233051a90356268dea70f)) +* **protocol:** update mainnet deployment ([#17847](https://github.com/taikoxyz/taiko-mono/issues/17847)) ([92344df](https://github.com/taikoxyz/taiko-mono/commit/92344dfb8c97bae370d722f887fb2c603f96c480)) +* **protocol:** update mainnet deployment ([#18258](https://github.com/taikoxyz/taiko-mono/issues/18258)) ([eeeb4af](https://github.com/taikoxyz/taiko-mono/commit/eeeb4afeff8572115c2cf82db149cee7a723f30c)) +* **protocol:** update mainnet deployment docs ([#18366](https://github.com/taikoxyz/taiko-mono/issues/18366)) ([bbd69ca](https://github.com/taikoxyz/taiko-mono/commit/bbd69ca583257ade30ac9ea2601509af5bc0789a)) +* **protocol:** update mainnet deployment docs ([#18482](https://github.com/taikoxyz/taiko-mono/issues/18482)) ([9da8499](https://github.com/taikoxyz/taiko-mono/commit/9da849989249072e3a03e611b9c08b00295cf42c)) +* **protocol:** update mainnet deployment docs ([#18621](https://github.com/taikoxyz/taiko-mono/issues/18621)) ([eb542bf](https://github.com/taikoxyz/taiko-mono/commit/eb542bf67dea51fd42c0f5c40ee987e5acadc3fd)) +* **protocol:** update mainnet deployment docs ([#18645](https://github.com/taikoxyz/taiko-mono/issues/18645)) ([59d4f10](https://github.com/taikoxyz/taiko-mono/commit/59d4f107edc1aaac5716067634735bad03e75269)) +* **protocol:** upgrade protocol version in hekla to 1.10.0 ([#18343](https://github.com/taikoxyz/taiko-mono/issues/18343)) ([4805024](https://github.com/taikoxyz/taiko-mono/commit/4805024c15ab63bf345dcc5f5868a4a16af0ba48)) +* **protocol:** upgrade sp1 plonk verifier 2.0.0 ([#18098](https://github.com/taikoxyz/taiko-mono/issues/18098)) ([cfd0e9e](https://github.com/taikoxyz/taiko-mono/commit/cfd0e9e4af2e42ead309e0c571b09dd20ddfe0f9)) +* **protocol:** upgrade sp1 remote verifier in Hekla ([#18469](https://github.com/taikoxyz/taiko-mono/issues/18469)) ([051b619](https://github.com/taikoxyz/taiko-mono/commit/051b619c6ce93a09c7e14dd8fafc99681c9261ad)) +* **protocol:** upgrade sp1 verifier in hekla ([#18027](https://github.com/taikoxyz/taiko-mono/issues/18027)) ([de27e6e](https://github.com/taikoxyz/taiko-mono/commit/de27e6e586e14410c309e68ce6b81504b9ba9a5b)) +* **protocol:** upgrade verifiers to support proof aggregation in Hekla ([#18453](https://github.com/taikoxyz/taiko-mono/issues/18453)) ([bfb0386](https://github.com/taikoxyz/taiko-mono/commit/bfb03864ee83ccc3bce989f3e9fd2309eb90c277)) +* **protocol:** upgrade zk verifiers in Hekla ([#18279](https://github.com/taikoxyz/taiko-mono/issues/18279)) ([e98a1d5](https://github.com/taikoxyz/taiko-mono/commit/e98a1d5cdaa14af86340081ee42ad263a41bfdb5)) +* **repo:** improve grammar and readability ([#18501](https://github.com/taikoxyz/taiko-mono/issues/18501)) ([61994ff](https://github.com/taikoxyz/taiko-mono/commit/61994ffefcf29981beb567b84a3a55706300cf13)) + + +### Code Refactoring + +* **protocol:** avoid writing `livenessBond`, `proposedAt`, and `proposedIn` to storage ([17d67d7](https://github.com/taikoxyz/taiko-mono/commit/17d67d74c511bc11c2b7d821d8a381f74ef7b6a1)) +* **protocol:** convert metadata from V2 to V1 only once ([#17842](https://github.com/taikoxyz/taiko-mono/issues/17842)) ([55ced31](https://github.com/taikoxyz/taiko-mono/commit/55ced319d68fe40fe82d1c7e0a268735c3545923)) +* **protocol:** delete packages/protocol/contracts/compiled ([#17849](https://github.com/taikoxyz/taiko-mono/issues/17849)) ([1fd907c](https://github.com/taikoxyz/taiko-mono/commit/1fd907cc81807027e730c0e27e258230670522df)) +* **protocol:** extra a new function in LibProposing ([#18456](https://github.com/taikoxyz/taiko-mono/issues/18456)) ([5b4b0cd](https://github.com/taikoxyz/taiko-mono/commit/5b4b0cd271534aa72d865afa5fc55e0ee4b16b73)) +* **protocol:** extract an IBlockHash interface from TaikoL2 ([#18045](https://github.com/taikoxyz/taiko-mono/issues/18045)) ([bff481e](https://github.com/taikoxyz/taiko-mono/commit/bff481e8a2898fab8396d368de84f8f343c532f0)) +* **protocol:** introduce BlockV2 for client-side compability ([#17935](https://github.com/taikoxyz/taiko-mono/issues/17935)) ([e46cf29](https://github.com/taikoxyz/taiko-mono/commit/e46cf294862c293b73b817574669115b85e973a7)) +* **protocol:** refactor TierProvider implementations ([ee464ca](https://github.com/taikoxyz/taiko-mono/commit/ee464caef68fdec325aa22758bb69e17dd039794)) +* **protocol:** remove ProposerAccess for easier composability ([#17994](https://github.com/taikoxyz/taiko-mono/issues/17994)) ([80176a1](https://github.com/taikoxyz/taiko-mono/commit/80176a1525c374039256c779f4a2408971759d22)) +* **protocol:** remove the receive function from TaikoL1.sol ([#17865](https://github.com/taikoxyz/taiko-mono/issues/17865)) ([3542420](https://github.com/taikoxyz/taiko-mono/commit/35424204d9f41d49f4a12869ed4410b6de7f577e)) +* **protocol:** remove uncessary init2() from TaikoL2 ([#17973](https://github.com/taikoxyz/taiko-mono/issues/17973)) ([4e08881](https://github.com/taikoxyz/taiko-mono/commit/4e0888190e172c950dc5e81a5115ee0fb6df3f11)) +* **protocol:** remove unused code post Ontake fork ([#18150](https://github.com/taikoxyz/taiko-mono/issues/18150)) ([8543cec](https://github.com/taikoxyz/taiko-mono/commit/8543cecdef9d10d038bc5a7313230006acd26e22)) +* **protocol:** restructure solidity code to match compilation targets ([#18059](https://github.com/taikoxyz/taiko-mono/issues/18059)) ([adc47f4](https://github.com/taikoxyz/taiko-mono/commit/adc47f408282c25c7a50c26e31130fc495734dcc)) +* **protocol:** simplify mainnet address caching ([ee464ca](https://github.com/taikoxyz/taiko-mono/commit/ee464caef68fdec325aa22758bb69e17dd039794)) +* **protocol:** simplify some protocol code based on OpenZeppelin's recommendation ([#18308](https://github.com/taikoxyz/taiko-mono/issues/18308)) ([fbad703](https://github.com/taikoxyz/taiko-mono/commit/fbad703739f09d4524f9d808c3bad31d0122ec2c)) +* **protocol:** slightly change defender monitors ([#18086](https://github.com/taikoxyz/taiko-mono/issues/18086)) ([b93d056](https://github.com/taikoxyz/taiko-mono/commit/b93d056479adfc4a1f557578d8b66eda48b104a9)) +* **protocol:** slightly improve EssentialContract ([#18445](https://github.com/taikoxyz/taiko-mono/issues/18445)) ([3d077f8](https://github.com/taikoxyz/taiko-mono/commit/3d077f8ee520a116028711391c323c7badd1f2c6)) +* **protocol:** use npm to manage third-party solidity dependency ([#17881](https://github.com/taikoxyz/taiko-mono/issues/17881)) ([d524e69](https://github.com/taikoxyz/taiko-mono/commit/d524e693449de9d65154471786fa4f5e8c45a381)) + + +### Tests + +* **protocol:** add test case of risc0 groth16 ([#17904](https://github.com/taikoxyz/taiko-mono/issues/17904)) ([90bc01d](https://github.com/taikoxyz/taiko-mono/commit/90bc01dfbef1129be1bd94e85c9ecd7c7b28b1da)) +* **protocol:** check LibEIP1559 function results in fuzz tests ([#18475](https://github.com/taikoxyz/taiko-mono/issues/18475)) ([06e190c](https://github.com/taikoxyz/taiko-mono/commit/06e190c01bc4c4aae25664e8c2c154d8cf46efa5)) +* **protocol:** fix another L2 test failure ([#18304](https://github.com/taikoxyz/taiko-mono/issues/18304)) ([b3dd4dc](https://github.com/taikoxyz/taiko-mono/commit/b3dd4dccd261a9ebda69325661d2941001268ec2)) +* **taiko-client:** use env names which defined in flag configs ([#17921](https://github.com/taikoxyz/taiko-mono/issues/17921)) ([196b74e](https://github.com/taikoxyz/taiko-mono/commit/196b74eb2b4498bc3e6511915e011a885fcc530f)) + + +### Workflow + +* **protocol:** make the storage layout table clearer ([#18633](https://github.com/taikoxyz/taiko-mono/issues/18633)) ([7394458](https://github.com/taikoxyz/taiko-mono/commit/73944585586686ad1ce5548ce59e9ea583c4b2ee)) +* **protocol:** revert "chore(main): release taiko-alethia-protocol 1.11.0 ([#18663](https://github.com/taikoxyz/taiko-mono/issues/18663))" ([#18688](https://github.com/taikoxyz/taiko-mono/issues/18688)) ([7e6bce4](https://github.com/taikoxyz/taiko-mono/commit/7e6bce4a0dac9e4f2984ffe2d3da2fc1277fab27)) +* **protocol:** revert releasing protocol 1.11.0 ([#18662](https://github.com/taikoxyz/taiko-mono/issues/18662)) ([29ce093](https://github.com/taikoxyz/taiko-mono/commit/29ce093100ae76b9eb51eef0f560207422496990)) +* **protocol:** trigger patch release (1.10.1) ([#18358](https://github.com/taikoxyz/taiko-mono/issues/18358)) ([f4f4796](https://github.com/taikoxyz/taiko-mono/commit/f4f4796488059b02c79d6fb15170df58dd31dc4e)) +* **protocol:** upgrade to use solc 0.8.27 ([#18037](https://github.com/taikoxyz/taiko-mono/issues/18037)) ([3a56b57](https://github.com/taikoxyz/taiko-mono/commit/3a56b5788b3e2473381429e5fddfaac2f10fa174)) + + +### Build + +* **deps:** bump github.com/stretchr/testify from 1.9.0 to 1.10.0 ([#18539](https://github.com/taikoxyz/taiko-mono/issues/18539)) ([79f3fab](https://github.com/taikoxyz/taiko-mono/commit/79f3fab5f1d1ec1bb4ee18afb9268b622e894780)) +* **deps:** bump golang.org/x/sync from 0.9.0 to 0.10.0 ([#18560](https://github.com/taikoxyz/taiko-mono/issues/18560)) ([3d51970](https://github.com/taikoxyz/taiko-mono/commit/3d51970aa0953bbfecaeebf76ea7e664c875c0e4)) +* **deps:** bump merkletreejs from 0.3.11 to 0.4.0 ([#17942](https://github.com/taikoxyz/taiko-mono/issues/17942)) ([1624b71](https://github.com/taikoxyz/taiko-mono/commit/1624b711e3fe1862f000e1d2970d6aee1b8990c9)) + +## [1.10.0](https://github.com/taikoxyz/taiko-mono/compare/protocol-v1.9.0...protocol-v1.10.0) (2024-11-01) + + +### Features + +* **protocol:** add `proposeBlocksV2` method to `ProverSet` ([#18115](https://github.com/taikoxyz/taiko-mono/issues/18115)) ([0743a99](https://github.com/taikoxyz/taiko-mono/commit/0743a99ee6ab403024bab5834178399fbeebb4e5)) +* **protocol:** add aggregated sgx verify test ([#18160](https://github.com/taikoxyz/taiko-mono/issues/18160)) ([8dda47b](https://github.com/taikoxyz/taiko-mono/commit/8dda47bf9ee47faa8a0d16dde0b4398d5e7019f8)) +* **protocol:** add Hekla Ontake hardfork upgrade scripts ([#18103](https://github.com/taikoxyz/taiko-mono/issues/18103)) ([a3436e8](https://github.com/taikoxyz/taiko-mono/commit/a3436e8cafbc96ebfa5742ada995adae39c572ce)) +* **protocol:** allow owner to update recipient in TokenUnlock ([#18184](https://github.com/taikoxyz/taiko-mono/issues/18184)) ([773ae1b](https://github.com/taikoxyz/taiko-mono/commit/773ae1b11f309ee8c4e0b1c0d22b9bfa41beae0d)) +* **protocol:** check-in `HeklaTaikoToken` ([#18189](https://github.com/taikoxyz/taiko-mono/issues/18189)) ([60c38d8](https://github.com/taikoxyz/taiko-mono/commit/60c38d8d179f2c02a0ed87f97bd34dc708b38df4)) +* **protocol:** enable sp1 batch aggregation ([#18199](https://github.com/taikoxyz/taiko-mono/issues/18199)) ([038cd32](https://github.com/taikoxyz/taiko-mono/commit/038cd326668b3a882798ecb4e7f9e3ecadc6dc28)) +* **protocol:** improve `getTransitions` ([#18181](https://github.com/taikoxyz/taiko-mono/issues/18181)) ([868d733](https://github.com/taikoxyz/taiko-mono/commit/868d733db962a76261036c3e583cb50feaec901f)) +* **protocol:** Increase the probability of sgx proof for lab proposer ([#18288](https://github.com/taikoxyz/taiko-mono/issues/18288)) ([fd0dbbb](https://github.com/taikoxyz/taiko-mono/commit/fd0dbbbb3df0db27873e0ba87e45a5165fb7c0f1)) +* **protocol:** introduce `getTransitions` in TaikoL1 ([#18154](https://github.com/taikoxyz/taiko-mono/issues/18154)) ([273bf53](https://github.com/taikoxyz/taiko-mono/commit/273bf53fad763b8504353e7cc14c8585e341f9d0)) +* **protocol:** make sure `init()` covers logics in `init2()`, `init3()`.. ([#18292](https://github.com/taikoxyz/taiko-mono/issues/18292)) ([9d06958](https://github.com/taikoxyz/taiko-mono/commit/9d06958e713e530fdd610c439c7b93199d0dcc69)) +* **protocol:** rename B_BLOCK_PROPOSER to B_PRECONF_REGISTRY ([#18255](https://github.com/taikoxyz/taiko-mono/issues/18255)) ([bf3caf7](https://github.com/taikoxyz/taiko-mono/commit/bf3caf7d986d7b03cf3bd0aa69ea97602bff80aa)) +* **protocol:** scripts to deploy new mainnet implementation contracts ([#18356](https://github.com/taikoxyz/taiko-mono/issues/18356)) ([269759b](https://github.com/taikoxyz/taiko-mono/commit/269759bccefba399f0aa6f45482f4a24330a5e47)) +* **protocol:** update mainnet `ontakeForkHeight` config ([#18252](https://github.com/taikoxyz/taiko-mono/issues/18252)) ([7550882](https://github.com/taikoxyz/taiko-mono/commit/75508828d3755e1a831380cdd2ab321e67fa22fc)) +* **protocol:** update ric0 & sp1 verification contract ([#18269](https://github.com/taikoxyz/taiko-mono/issues/18269)) ([684a909](https://github.com/taikoxyz/taiko-mono/commit/684a909e83705c59b2b7a0a991424b7a8e9e03ad)) +* **protocol:** update sp1 contracts ([#18097](https://github.com/taikoxyz/taiko-mono/issues/18097)) ([6f26434](https://github.com/taikoxyz/taiko-mono/commit/6f264342fe48f8d193559ac0712cc875d643b6fd)) +* **protocol:** upgrade script ([#18334](https://github.com/taikoxyz/taiko-mono/issues/18334)) ([2c41dd1](https://github.com/taikoxyz/taiko-mono/commit/2c41dd10989566c1b6af691c92ab2cbde734a13a)) +* **protocol:** user smaller cooldown windows ([#18345](https://github.com/taikoxyz/taiko-mono/issues/18345)) ([63455f9](https://github.com/taikoxyz/taiko-mono/commit/63455f91d202d88583d70bce69e799032523eb18)) + + +### Bug Fixes + +* **protocol:** check blockId in getBlock and getBlockV2 ([#18327](https://github.com/taikoxyz/taiko-mono/issues/18327)) ([4288fb6](https://github.com/taikoxyz/taiko-mono/commit/4288fb6e0c8c76651d2db866cab55f32a9a25075)) +* **protocol:** avoid invocation in Bridge message processing if calldata is "" and value is 0 ([#18137](https://github.com/taikoxyz/taiko-mono/issues/18137)) ([10c2972](https://github.com/taikoxyz/taiko-mono/commit/10c29727081bd8f8b94bbfc4472b162ec552ef64)) +* **protocol:** correct the wrong router address for mainnet ([#18291](https://github.com/taikoxyz/taiko-mono/issues/18291)) ([ae0a9da](https://github.com/taikoxyz/taiko-mono/commit/ae0a9daf83ab8f323c216978724ebcb71de54cfe)) +* **protocol:** fix a new bug in LibProposing ([#18328](https://github.com/taikoxyz/taiko-mono/issues/18328)) ([7436bae](https://github.com/taikoxyz/taiko-mono/commit/7436bae9660cfcf1d430ca111df8c75d50908eae)) +* **protocol:** fix an issue in same transition check ([#18254](https://github.com/taikoxyz/taiko-mono/issues/18254)) ([233806e](https://github.com/taikoxyz/taiko-mono/commit/233806e4838aa12e8de436a37979ff3e614119f2)) +* **protocol:** fix DCAP configuration script ([#18088](https://github.com/taikoxyz/taiko-mono/issues/18088)) ([e8618c5](https://github.com/taikoxyz/taiko-mono/commit/e8618c54a58993499e852ec2ffc2468d4f0274ba)) +* **protocol:** fix issue in mainnet deployment script ([#18283](https://github.com/taikoxyz/taiko-mono/issues/18283)) ([5c371a1](https://github.com/taikoxyz/taiko-mono/commit/5c371a181af444999f611e03774ec096ffbd1226)) +* **protocol:** fix LibAddress.supportsInterface to handle undecodable return data ([#18286](https://github.com/taikoxyz/taiko-mono/issues/18286)) ([299b4c9](https://github.com/taikoxyz/taiko-mono/commit/299b4c9ecf96644c909df70a3527ae5c2e728a07)) +* **protocol:** fix permission in ComposeVerifier ([#18302](https://github.com/taikoxyz/taiko-mono/issues/18302)) ([4c45d8b](https://github.com/taikoxyz/taiko-mono/commit/4c45d8bcdb52521ac1738ca271316d82689537b0)) +* **protocol:** fix proposeBlock()'s block id check ([#18227](https://github.com/taikoxyz/taiko-mono/issues/18227)) ([3a9d6c1](https://github.com/taikoxyz/taiko-mono/commit/3a9d6c166b7c6666eb2515893b6a3fbd00f4b1ea)) +* **protocol:** fix test related to SendMessageToDelegateOwner.s.sol ([#18300](https://github.com/taikoxyz/taiko-mono/issues/18300)) ([65daa3e](https://github.com/taikoxyz/taiko-mono/commit/65daa3e631b471d17dbffb1001dab66efa67c499)) +* **protocol:** fix wrong Bridged ERC20 address cache ([#18287](https://github.com/taikoxyz/taiko-mono/issues/18287)) ([49267ab](https://github.com/taikoxyz/taiko-mono/commit/49267abaa6d27d16fe4fb62ca0bb28d49b09d2f9)) +* **protocol:** revert a change to maintain taiko-geth compatibility ([#18331](https://github.com/taikoxyz/taiko-mono/issues/18331)) ([9d18d59](https://github.com/taikoxyz/taiko-mono/commit/9d18d598fe3e890a1f35e2d39916d554282ee4a0)) +* **protocol:** revert changes related to `proposedIn` and `proposedAt` to fix a bug ([#18333](https://github.com/taikoxyz/taiko-mono/issues/18333)) ([5cb43ab](https://github.com/taikoxyz/taiko-mono/commit/5cb43ab1e29422353de549f8386eff613291c7df)) +* **protocol:** reward non-assigned prover 7/8 liveness bond ([#18132](https://github.com/taikoxyz/taiko-mono/issues/18132)) ([9f99099](https://github.com/taikoxyz/taiko-mono/commit/9f99099ac271e6e2a0973a43084e29169386f2cd)) +* **protocol:** small fix to 1559 error check ([#18339](https://github.com/taikoxyz/taiko-mono/issues/18339)) ([4428661](https://github.com/taikoxyz/taiko-mono/commit/44286615a0e0b0a17892fe83aad96546a6b1aca1)) + + +### Chores + +* **docs:** redirect the contribution.md path ([#18316](https://github.com/taikoxyz/taiko-mono/issues/18316)) ([0607ef7](https://github.com/taikoxyz/taiko-mono/commit/0607ef718dbe34c0ffe125825b12001b36a43fc5)) +* **main:** release protocol 1.10.0 ([#18077](https://github.com/taikoxyz/taiko-mono/issues/18077)) ([3d12cb2](https://github.com/taikoxyz/taiko-mono/commit/3d12cb24b16c7eede1930b928408c1462134f5a7)) +* **protocol:** add functions to ITaikoL1 for Nethermind Preconf ([#18217](https://github.com/taikoxyz/taiko-mono/issues/18217)) ([e349d22](https://github.com/taikoxyz/taiko-mono/commit/e349d2237a1830edab305b2f0eaaeb0eaf3c623f)) +* **protocol:** change Hekla gas issuance per sec to 100000 ([#18335](https://github.com/taikoxyz/taiko-mono/issues/18335)) ([3d448d4](https://github.com/taikoxyz/taiko-mono/commit/3d448d4a78608ea7daf1d50e877c32f8d30f1e7a)) +* **protocol:** change Hekla sharingPctg to 80% & gasIssuancePerSecond to 1000000 ([#18322](https://github.com/taikoxyz/taiko-mono/issues/18322)) ([75feb5b](https://github.com/taikoxyz/taiko-mono/commit/75feb5b36560b786a54e97280352c0d70c3e2f06)) +* **protocol:** deploy `MainnetTierRouter` and update `RollupAddressCache` ([#18359](https://github.com/taikoxyz/taiko-mono/issues/18359)) ([aa351ab](https://github.com/taikoxyz/taiko-mono/commit/aa351ab0f90e442a8b15adb8de6a48d9ae6d1c42)) +* **protocol:** fix lint issue in SP1Verifier ([#18213](https://github.com/taikoxyz/taiko-mono/issues/18213)) ([7874dd3](https://github.com/taikoxyz/taiko-mono/commit/7874dd3ff8a6053da8c09377b52c83e7a506f45f)) +* **protocol:** improve the usage of `initializer` and `reinitializer` ([#18319](https://github.com/taikoxyz/taiko-mono/issues/18319)) ([13cc007](https://github.com/taikoxyz/taiko-mono/commit/13cc0074a2295c5939cf83e23f531cb25c43bd64)) +* **protocol:** remove `TIER_ZKVM_ANY` in `MainnetTierRouter` ([#18357](https://github.com/taikoxyz/taiko-mono/issues/18357)) ([500a8bb](https://github.com/taikoxyz/taiko-mono/commit/500a8bbc46a3d1962ae5cc6d7f10e990f03d07c7)) +* **protocol:** revert Hekla `baseFeeConfig` updates ([#18340](https://github.com/taikoxyz/taiko-mono/issues/18340)) ([ae8ac3c](https://github.com/taikoxyz/taiko-mono/commit/ae8ac3c2e686b136de8c68853ecb91a39260a93f)) +* **protocol:** set mainnet Ontake fork height ([#18112](https://github.com/taikoxyz/taiko-mono/issues/18112)) ([8812eb2](https://github.com/taikoxyz/taiko-mono/commit/8812eb2a8de367311b8ada6bd3587bfe5efee090)) +* **protocol:** shorten imports in solidity files ([#18221](https://github.com/taikoxyz/taiko-mono/issues/18221)) ([9b2ba6a](https://github.com/taikoxyz/taiko-mono/commit/9b2ba6a2a2fae24d1fb34e23b29b3146e96f575e)) +* **protocol:** undo 1.10.0 release ([#18363](https://github.com/taikoxyz/taiko-mono/issues/18363)) ([116578e](https://github.com/taikoxyz/taiko-mono/commit/116578ef8a4391611bd1b3c469f4068cec8a8447)) +* **protocol:** remove unused delegate owner deployment ([#18290](https://github.com/taikoxyz/taiko-mono/issues/18290)) ([63ba863](https://github.com/taikoxyz/taiko-mono/commit/63ba863dcf322b2cf04d7dcaf6d8905bf28de6bc)) + + +### Documentation + +* **protocol:** fix invalid links in docs ([#18144](https://github.com/taikoxyz/taiko-mono/issues/18144)) ([c62f3f6](https://github.com/taikoxyz/taiko-mono/commit/c62f3f6b4a21f3af44f7df908fd8aac198721d5b)) +* **protocol:** update `tier_router` in hekla ([#18352](https://github.com/taikoxyz/taiko-mono/issues/18352)) ([7c91a7d](https://github.com/taikoxyz/taiko-mono/commit/7c91a7d486c22e0f1a5386978086dfca5b73cfe0)) +* **protocol:** update code4rena-2024-03-taiko-final-report.md ([#18062](https://github.com/taikoxyz/taiko-mono/issues/18062)) ([fd68794](https://github.com/taikoxyz/taiko-mono/commit/fd68794a2de24b7a32d2d5a1c3f52c2156b6d61a)) +* **protocol:** update Hekla deployments ([#18152](https://github.com/taikoxyz/taiko-mono/issues/18152)) ([6c7ff61](https://github.com/taikoxyz/taiko-mono/commit/6c7ff617b913b21b8b12b035f0d653c068830de3)) +* **protocol:** update Hekla deployments ([#18257](https://github.com/taikoxyz/taiko-mono/issues/18257)) ([fbb1c82](https://github.com/taikoxyz/taiko-mono/commit/fbb1c824e35adb452176d988f32cf06d0c72b9bf)) +* **protocol:** update L1 deployment ([#18299](https://github.com/taikoxyz/taiko-mono/issues/18299)) ([f60ce3e](https://github.com/taikoxyz/taiko-mono/commit/f60ce3e78bb9a2717718c3a9d7016346d5305488)) +* **protocol:** update mainnet deployment ([#18258](https://github.com/taikoxyz/taiko-mono/issues/18258)) ([eeeb4af](https://github.com/taikoxyz/taiko-mono/commit/eeeb4afeff8572115c2cf82db149cee7a723f30c)) +* **protocol:** upgrade protocol version in hekla to 1.10.0 ([#18343](https://github.com/taikoxyz/taiko-mono/issues/18343)) ([4805024](https://github.com/taikoxyz/taiko-mono/commit/4805024c15ab63bf345dcc5f5868a4a16af0ba48)) +* **protocol:** upgrade sp1 plonk verifier 2.0.0 ([#18098](https://github.com/taikoxyz/taiko-mono/issues/18098)) ([cfd0e9e](https://github.com/taikoxyz/taiko-mono/commit/cfd0e9e4af2e42ead309e0c571b09dd20ddfe0f9)) +* **protocol:** upgrade zk verifiers in Hekla ([#18279](https://github.com/taikoxyz/taiko-mono/issues/18279)) ([e98a1d5](https://github.com/taikoxyz/taiko-mono/commit/e98a1d5cdaa14af86340081ee42ad263a41bfdb5)) + + +### Code Refactoring + +* **protocol:** simplify some protocol code based on OpenZeppelin's recommendation ([#18308](https://github.com/taikoxyz/taiko-mono/issues/18308)) ([fbad703](https://github.com/taikoxyz/taiko-mono/commit/fbad703739f09d4524f9d808c3bad31d0122ec2c)) +* **protocol:** slightly change defender monitors ([#18086](https://github.com/taikoxyz/taiko-mono/issues/18086)) ([b93d056](https://github.com/taikoxyz/taiko-mono/commit/b93d056479adfc4a1f557578d8b66eda48b104a9)) + + +### Tests + +* **protocol:** fix another L2 test failure ([#18304](https://github.com/taikoxyz/taiko-mono/issues/18304)) ([b3dd4dc](https://github.com/taikoxyz/taiko-mono/commit/b3dd4dccd261a9ebda69325661d2941001268ec2)) + + +### Workflow + +* **protocol:** trigger patch release (1.10.1) ([#18358](https://github.com/taikoxyz/taiko-mono/issues/18358)) ([f4f4796](https://github.com/taikoxyz/taiko-mono/commit/f4f4796488059b02c79d6fb15170df58dd31dc4e)) + +## [1.10.0](https://github.com/taikoxyz/taiko-mono/compare/protocol-v1.9.0...protocol-v1.10.0) (2024-10-29) + + +### Features + +* **protocol:** add `proposeBlocksV2` method to `ProverSet` ([#18115](https://github.com/taikoxyz/taiko-mono/issues/18115)) ([0743a99](https://github.com/taikoxyz/taiko-mono/commit/0743a99ee6ab403024bab5834178399fbeebb4e5)) +* **protocol:** add aggregated sgx verify test ([#18160](https://github.com/taikoxyz/taiko-mono/issues/18160)) ([8dda47b](https://github.com/taikoxyz/taiko-mono/commit/8dda47bf9ee47faa8a0d16dde0b4398d5e7019f8)) +* **protocol:** add Hekla Ontake hardfork upgrade scripts ([#18103](https://github.com/taikoxyz/taiko-mono/issues/18103)) ([a3436e8](https://github.com/taikoxyz/taiko-mono/commit/a3436e8cafbc96ebfa5742ada995adae39c572ce)) +* **protocol:** allow owner to update recipient in TokenUnlock ([#18184](https://github.com/taikoxyz/taiko-mono/issues/18184)) ([773ae1b](https://github.com/taikoxyz/taiko-mono/commit/773ae1b11f309ee8c4e0b1c0d22b9bfa41beae0d)) +* **protocol:** check-in `HeklaTaikoToken` ([#18189](https://github.com/taikoxyz/taiko-mono/issues/18189)) ([60c38d8](https://github.com/taikoxyz/taiko-mono/commit/60c38d8d179f2c02a0ed87f97bd34dc708b38df4)) +* **protocol:** enable sp1 batch aggregation ([#18199](https://github.com/taikoxyz/taiko-mono/issues/18199)) ([038cd32](https://github.com/taikoxyz/taiko-mono/commit/038cd326668b3a882798ecb4e7f9e3ecadc6dc28)) +* **protocol:** improve `getTransitions` ([#18181](https://github.com/taikoxyz/taiko-mono/issues/18181)) ([868d733](https://github.com/taikoxyz/taiko-mono/commit/868d733db962a76261036c3e583cb50feaec901f)) +* **protocol:** Increase the probability of sgx proof for lab proposer ([#18288](https://github.com/taikoxyz/taiko-mono/issues/18288)) ([fd0dbbb](https://github.com/taikoxyz/taiko-mono/commit/fd0dbbbb3df0db27873e0ba87e45a5165fb7c0f1)) +* **protocol:** introduce `getTransitions` in TaikoL1 ([#18154](https://github.com/taikoxyz/taiko-mono/issues/18154)) ([273bf53](https://github.com/taikoxyz/taiko-mono/commit/273bf53fad763b8504353e7cc14c8585e341f9d0)) +* **protocol:** make sure `init()` covers logics in `init2()`, `init3()`.. ([#18292](https://github.com/taikoxyz/taiko-mono/issues/18292)) ([9d06958](https://github.com/taikoxyz/taiko-mono/commit/9d06958e713e530fdd610c439c7b93199d0dcc69)) +* **protocol:** rename B_BLOCK_PROPOSER to B_PRECONF_REGISTRY ([#18255](https://github.com/taikoxyz/taiko-mono/issues/18255)) ([bf3caf7](https://github.com/taikoxyz/taiko-mono/commit/bf3caf7d986d7b03cf3bd0aa69ea97602bff80aa)) +* **protocol:** update mainnet `ontakeForkHeight` config ([#18252](https://github.com/taikoxyz/taiko-mono/issues/18252)) ([7550882](https://github.com/taikoxyz/taiko-mono/commit/75508828d3755e1a831380cdd2ab321e67fa22fc)) +* **protocol:** update ric0 & sp1 verification contract ([#18269](https://github.com/taikoxyz/taiko-mono/issues/18269)) ([684a909](https://github.com/taikoxyz/taiko-mono/commit/684a909e83705c59b2b7a0a991424b7a8e9e03ad)) +* **protocol:** update sp1 contracts ([#18097](https://github.com/taikoxyz/taiko-mono/issues/18097)) ([6f26434](https://github.com/taikoxyz/taiko-mono/commit/6f264342fe48f8d193559ac0712cc875d643b6fd)) + + +### Bug Fixes + +* **protocol:** check blockId in getBlock and getBlockV2 ([#18327](https://github.com/taikoxyz/taiko-mono/issues/18327)) ([4288fb6](https://github.com/taikoxyz/taiko-mono/commit/4288fb6e0c8c76651d2db866cab55f32a9a25075)) +* **protocol:** avoid invocation in Bridge message processing if calldata is "" and value is 0 ([#18137](https://github.com/taikoxyz/taiko-mono/issues/18137)) ([10c2972](https://github.com/taikoxyz/taiko-mono/commit/10c29727081bd8f8b94bbfc4472b162ec552ef64)) +* **protocol:** correct the wrong router address for mainnet ([#18291](https://github.com/taikoxyz/taiko-mono/issues/18291)) ([ae0a9da](https://github.com/taikoxyz/taiko-mono/commit/ae0a9daf83ab8f323c216978724ebcb71de54cfe)) +* **protocol:** fix a new bug in LibProposing ([#18328](https://github.com/taikoxyz/taiko-mono/issues/18328)) ([7436bae](https://github.com/taikoxyz/taiko-mono/commit/7436bae9660cfcf1d430ca111df8c75d50908eae)) +* **protocol:** fix an issue in same transition check ([#18254](https://github.com/taikoxyz/taiko-mono/issues/18254)) ([233806e](https://github.com/taikoxyz/taiko-mono/commit/233806e4838aa12e8de436a37979ff3e614119f2)) +* **protocol:** fix DCAP configuration script ([#18088](https://github.com/taikoxyz/taiko-mono/issues/18088)) ([e8618c5](https://github.com/taikoxyz/taiko-mono/commit/e8618c54a58993499e852ec2ffc2468d4f0274ba)) +* **protocol:** fix issue in mainnet deployment script ([#18283](https://github.com/taikoxyz/taiko-mono/issues/18283)) ([5c371a1](https://github.com/taikoxyz/taiko-mono/commit/5c371a181af444999f611e03774ec096ffbd1226)) +* **protocol:** fix LibAddress.supportsInterface to handle undecodeable return data ([#18286](https://github.com/taikoxyz/taiko-mono/issues/18286)) ([299b4c9](https://github.com/taikoxyz/taiko-mono/commit/299b4c9ecf96644c909df70a3527ae5c2e728a07)) +* **protocol:** fix permission in ComposeVerifier ([#18302](https://github.com/taikoxyz/taiko-mono/issues/18302)) ([4c45d8b](https://github.com/taikoxyz/taiko-mono/commit/4c45d8bcdb52521ac1738ca271316d82689537b0)) +* **protocol:** fix proposeBlock()'s block id check ([#18227](https://github.com/taikoxyz/taiko-mono/issues/18227)) ([3a9d6c1](https://github.com/taikoxyz/taiko-mono/commit/3a9d6c166b7c6666eb2515893b6a3fbd00f4b1ea)) +* **protocol:** fix test related to SendMessageToDelegateOwner.s.sol ([#18300](https://github.com/taikoxyz/taiko-mono/issues/18300)) ([65daa3e](https://github.com/taikoxyz/taiko-mono/commit/65daa3e631b471d17dbffb1001dab66efa67c499)) +* **protocol:** fix wrong Bridged ERC20 address cache ([#18287](https://github.com/taikoxyz/taiko-mono/issues/18287)) ([49267ab](https://github.com/taikoxyz/taiko-mono/commit/49267abaa6d27d16fe4fb62ca0bb28d49b09d2f9)) +* **protocol:** revert a change to maintain taiko-geth compatibility ([#18331](https://github.com/taikoxyz/taiko-mono/issues/18331)) ([9d18d59](https://github.com/taikoxyz/taiko-mono/commit/9d18d598fe3e890a1f35e2d39916d554282ee4a0)) +* **protocol:** revert changes related to `proposedIn` and `proposedAt` to fix a bug ([#18333](https://github.com/taikoxyz/taiko-mono/issues/18333)) ([5cb43ab](https://github.com/taikoxyz/taiko-mono/commit/5cb43ab1e29422353de549f8386eff613291c7df)) +* **protocol:** reward non-assigned prover 7/8 liveness bond ([#18132](https://github.com/taikoxyz/taiko-mono/issues/18132)) ([9f99099](https://github.com/taikoxyz/taiko-mono/commit/9f99099ac271e6e2a0973a43084e29169386f2cd)) +* **protocol:** small fix to 1559 error check ([#18339](https://github.com/taikoxyz/taiko-mono/issues/18339)) ([4428661](https://github.com/taikoxyz/taiko-mono/commit/44286615a0e0b0a17892fe83aad96546a6b1aca1)) + + +### Chores + +* **docs:** redirect the contribution.md path ([#18316](https://github.com/taikoxyz/taiko-mono/issues/18316)) ([0607ef7](https://github.com/taikoxyz/taiko-mono/commit/0607ef718dbe34c0ffe125825b12001b36a43fc5)) +* **protocol:** add functions to ITaikoL1 for Nethermind Preconf ([#18217](https://github.com/taikoxyz/taiko-mono/issues/18217)) ([e349d22](https://github.com/taikoxyz/taiko-mono/commit/e349d2237a1830edab305b2f0eaaeb0eaf3c623f)) +* **protocol:** change Hekla gas issuance per sec to 100000 ([#18335](https://github.com/taikoxyz/taiko-mono/issues/18335)) ([3d448d4](https://github.com/taikoxyz/taiko-mono/commit/3d448d4a78608ea7daf1d50e877c32f8d30f1e7a)) +* **protocol:** change Hekla sharingPctg to 80% & gasIssuancePerSecond to 1000000 ([#18322](https://github.com/taikoxyz/taiko-mono/issues/18322)) ([75feb5b](https://github.com/taikoxyz/taiko-mono/commit/75feb5b36560b786a54e97280352c0d70c3e2f06)) +* **protocol:** fix lint issue in SP1Verifier ([#18213](https://github.com/taikoxyz/taiko-mono/issues/18213)) ([7874dd3](https://github.com/taikoxyz/taiko-mono/commit/7874dd3ff8a6053da8c09377b52c83e7a506f45f)) +* **protocol:** improve the usage of `initializer` and `reinitializer` ([#18319](https://github.com/taikoxyz/taiko-mono/issues/18319)) ([13cc007](https://github.com/taikoxyz/taiko-mono/commit/13cc0074a2295c5939cf83e23f531cb25c43bd64)) +* **protocol:** revert Hekla `baseFeeConfig` updates ([#18340](https://github.com/taikoxyz/taiko-mono/issues/18340)) ([ae8ac3c](https://github.com/taikoxyz/taiko-mono/commit/ae8ac3c2e686b136de8c68853ecb91a39260a93f)) +* **protocol:** set mainnet Ontake fork height ([#18112](https://github.com/taikoxyz/taiko-mono/issues/18112)) ([8812eb2](https://github.com/taikoxyz/taiko-mono/commit/8812eb2a8de367311b8ada6bd3587bfe5efee090)) +* **protocol:** shorten imports in solidity files ([#18221](https://github.com/taikoxyz/taiko-mono/issues/18221)) ([9b2ba6a](https://github.com/taikoxyz/taiko-mono/commit/9b2ba6a2a2fae24d1fb34e23b29b3146e96f575e)) +* **protoco:** remove unused delegate owner deployment ([#18290](https://github.com/taikoxyz/taiko-mono/issues/18290)) ([63ba863](https://github.com/taikoxyz/taiko-mono/commit/63ba863dcf322b2cf04d7dcaf6d8905bf28de6bc)) + + +### Documentation + +* **protocol:** fix invalid links in docs ([#18144](https://github.com/taikoxyz/taiko-mono/issues/18144)) ([c62f3f6](https://github.com/taikoxyz/taiko-mono/commit/c62f3f6b4a21f3af44f7df908fd8aac198721d5b)) +* **protocol:** update code4rena-2024-03-taiko-final-report.md ([#18062](https://github.com/taikoxyz/taiko-mono/issues/18062)) ([fd68794](https://github.com/taikoxyz/taiko-mono/commit/fd68794a2de24b7a32d2d5a1c3f52c2156b6d61a)) +* **protocol:** update Hekla deployments ([#18152](https://github.com/taikoxyz/taiko-mono/issues/18152)) ([6c7ff61](https://github.com/taikoxyz/taiko-mono/commit/6c7ff617b913b21b8b12b035f0d653c068830de3)) +* **protocol:** update Hekla deployments ([#18257](https://github.com/taikoxyz/taiko-mono/issues/18257)) ([fbb1c82](https://github.com/taikoxyz/taiko-mono/commit/fbb1c824e35adb452176d988f32cf06d0c72b9bf)) +* **protocol:** update L1 deployment ([#18299](https://github.com/taikoxyz/taiko-mono/issues/18299)) ([f60ce3e](https://github.com/taikoxyz/taiko-mono/commit/f60ce3e78bb9a2717718c3a9d7016346d5305488)) +* **protocol:** update mainnet deployment ([#18258](https://github.com/taikoxyz/taiko-mono/issues/18258)) ([eeeb4af](https://github.com/taikoxyz/taiko-mono/commit/eeeb4afeff8572115c2cf82db149cee7a723f30c)) +* **protocol:** upgrade sp1 plonk verifier 2.0.0 ([#18098](https://github.com/taikoxyz/taiko-mono/issues/18098)) ([cfd0e9e](https://github.com/taikoxyz/taiko-mono/commit/cfd0e9e4af2e42ead309e0c571b09dd20ddfe0f9)) +* **protocol:** upgrade zk verifiers in Hekla ([#18279](https://github.com/taikoxyz/taiko-mono/issues/18279)) ([e98a1d5](https://github.com/taikoxyz/taiko-mono/commit/e98a1d5cdaa14af86340081ee42ad263a41bfdb5)) + + +### Code Refactoring + +* **protocol:** simplify some protocol code based on OpenZeppelin's recommendation ([#18308](https://github.com/taikoxyz/taiko-mono/issues/18308)) ([fbad703](https://github.com/taikoxyz/taiko-mono/commit/fbad703739f09d4524f9d808c3bad31d0122ec2c)) +* **protocol:** slightly change defender monitors ([#18086](https://github.com/taikoxyz/taiko-mono/issues/18086)) ([b93d056](https://github.com/taikoxyz/taiko-mono/commit/b93d056479adfc4a1f557578d8b66eda48b104a9)) + + +### Tests + +* **protocol:** fix another L2 test failure ([#18304](https://github.com/taikoxyz/taiko-mono/issues/18304)) ([b3dd4dc](https://github.com/taikoxyz/taiko-mono/commit/b3dd4dccd261a9ebda69325661d2941001268ec2)) + +## [1.9.0](https://github.com/taikoxyz/taiko-mono/compare/protocol-v1.8.0...protocol-v1.9.0) (2024-09-12) + + +### Features + +* **protocol:** add `DevnetTaikoL1` ([#17900](https://github.com/taikoxyz/taiko-mono/issues/17900)) ([d864cea](https://github.com/taikoxyz/taiko-mono/commit/d864cea2eb8346127992acfbd9012e675a3400cc)) +* **protocol:** add `proveBlocks` method to `ProverSet` ([#18025](https://github.com/taikoxyz/taiko-mono/issues/18025)) ([36a2ae5](https://github.com/taikoxyz/taiko-mono/commit/36a2ae51c21a2359179755457a8933a346ccd8b3)) +* **protocol:** add `proveBlocks` to TaikoL1.sol ([fe687b3](https://github.com/taikoxyz/taiko-mono/commit/fe687b378fcb440184fd423088432dc63cf5989e)) +* **protocol:** add `TIER_ZKVM_RISC0` tier and `HeklaTierProvider` ([#17913](https://github.com/taikoxyz/taiko-mono/issues/17913)) ([64ed666](https://github.com/taikoxyz/taiko-mono/commit/64ed66628a18cb1b3fff2c4ab5d3c0149288dfe6)) +* **protocol:** add a batch proposing block function ([#17864](https://github.com/taikoxyz/taiko-mono/issues/17864)) ([3649785](https://github.com/taikoxyz/taiko-mono/commit/36497857dd3d5edb718a5cb0057327f3cde39c02)) +* **protocol:** add ComposeVerifier, TeeAnyVerifier, and ZkAnyVerifier ([ee464ca](https://github.com/taikoxyz/taiko-mono/commit/ee464caef68fdec325aa22758bb69e17dd039794)) +* **protocol:** add EIP-2612 (permit extension) to bridged ERC20 tokens ([#17818](https://github.com/taikoxyz/taiko-mono/issues/17818)) ([185ef91](https://github.com/taikoxyz/taiko-mono/commit/185ef91d8debb0c3a88734f2552ca396c8d23a66)) +* **protocol:** add preconfirmation support based on https://github.com/taikoxyz/taiko-mono/pull/17654 (with some renaming) (https://github.com/taikoxyz/taiko-mono/issues/14793) ([17d67d7](https://github.com/taikoxyz/taiko-mono/commit/17d67d74c511bc11c2b7d821d8a381f74ef7b6a1)) +* **protocol:** add proposeBlock2 in TaikoL1.sol and approve2 in GuardianProver.sol ([17d67d7](https://github.com/taikoxyz/taiko-mono/commit/17d67d74c511bc11c2b7d821d8a381f74ef7b6a1)) +* **protocol:** add proposer address to getMinTier func ([#17919](https://github.com/taikoxyz/taiko-mono/issues/17919)) ([d6ea6f3](https://github.com/taikoxyz/taiko-mono/commit/d6ea6f33d6bf54cba3bd6ab153e38d09abf19912)) +* **protocol:** add SP1 verification support ([#17861](https://github.com/taikoxyz/taiko-mono/issues/17861)) ([2936312](https://github.com/taikoxyz/taiko-mono/commit/29363123233f9d2d749eb626095d0c645801e384)) +* **protocol:** add withdraw eth function to proverset ([#17800](https://github.com/taikoxyz/taiko-mono/issues/17800)) ([bb2abc5](https://github.com/taikoxyz/taiko-mono/commit/bb2abc510c98e62c89e0bfd9382c11720fb9edc7)) +* **protocol:** adjust gas excess once the gas target has changed ([a1e217e](https://github.com/taikoxyz/taiko-mono/commit/a1e217e457546d63a89da0b02135b3b63b22d19e)) +* **protocol:** allow a grace period (4h) to defer proof submission to reduce cost ([fe687b3](https://github.com/taikoxyz/taiko-mono/commit/fe687b378fcb440184fd423088432dc63cf5989e)) +* **protocol:** allow any address to withdraw token to the recipient address ([#17843](https://github.com/taikoxyz/taiko-mono/issues/17843)) ([3d89d24](https://github.com/taikoxyz/taiko-mono/commit/3d89d24b14fea7b9e59659e689c3011fbcf4b852)) +* **protocol:** allow contract proposers to use calldata for DA ([17d67d7](https://github.com/taikoxyz/taiko-mono/commit/17d67d74c511bc11c2b7d821d8a381f74ef7b6a1)) +* **protocol:** allow msg.sender to customize block proposer addresses ([#18048](https://github.com/taikoxyz/taiko-mono/issues/18048)) ([22055cc](https://github.com/taikoxyz/taiko-mono/commit/22055cc95e51d07b6b57ab5cb2e4ccd9a97d594a)) +* **protocol:** enhance nextTxId logics in DelegateOwner ([#17718](https://github.com/taikoxyz/taiko-mono/issues/17718)) ([85b2cad](https://github.com/taikoxyz/taiko-mono/commit/85b2cad6216d93e3811bc3523ab8b3200cdfbdd3)) +* **protocol:** improve L2 basefee calculation ([920bd68](https://github.com/taikoxyz/taiko-mono/commit/920bd6873d3e9e1bbb00751fb9c0056ac85b8554)) +* **protocol:** introduce risc0 proof ([#17877](https://github.com/taikoxyz/taiko-mono/issues/17877)) ([bcb57cb](https://github.com/taikoxyz/taiko-mono/commit/bcb57cb81d12d0c09656582ad9140b38015b3a58)) +* **protocol:** protocol monitors ([#18002](https://github.com/taikoxyz/taiko-mono/issues/18002)) ([45b2087](https://github.com/taikoxyz/taiko-mono/commit/45b2087495d4f9e20083ebe2c61ecfe8d252e4b2)) +* **protocol:** relocate L2 base fee parameters to L1 configuration ([17d67d7](https://github.com/taikoxyz/taiko-mono/commit/17d67d74c511bc11c2b7d821d8a381f74ef7b6a1)) +* **protocol:** return verification timestamp in getLastVerifiedBlock ([#17868](https://github.com/taikoxyz/taiko-mono/issues/17868)) ([1998288](https://github.com/taikoxyz/taiko-mono/commit/19982889f7f4c073d182a6076633c5e2c892c73a)) +* **protocol:** revert removing time as input for L2 base fee calculation ([a1e217e](https://github.com/taikoxyz/taiko-mono/commit/a1e217e457546d63a89da0b02135b3b63b22d19e)) +* **protocol:** script of `UpgradeRisc0Verifier` ([#17949](https://github.com/taikoxyz/taiko-mono/issues/17949)) ([fc12e04](https://github.com/taikoxyz/taiko-mono/commit/fc12e040c391e0f37c906b270743d3b57710f69d)) +* **protocol:** support backward-compatible batch-proof verification ([#17968](https://github.com/taikoxyz/taiko-mono/issues/17968)) ([c476aab](https://github.com/taikoxyz/taiko-mono/commit/c476aabe130d151f5678cd35fab99f258997f629)) +* **protocol:** update `HeklaTierProvider` to introduce sp1 proof ([#18022](https://github.com/taikoxyz/taiko-mono/issues/18022)) ([76b6514](https://github.com/taikoxyz/taiko-mono/commit/76b6514fd42ba7fa2124b44443728fa32304c324)) +* **protocol:** update `ontakeForkHeight` to Sep 24, 2024 ([#18046](https://github.com/taikoxyz/taiko-mono/issues/18046)) ([30c9316](https://github.com/taikoxyz/taiko-mono/commit/30c9316aea083d187617f5342fb4a955e604226b)) +* **protocol:** update Hekla `ontakeForkHeight` ([#17983](https://github.com/taikoxyz/taiko-mono/issues/17983)) ([8819e3a](https://github.com/taikoxyz/taiko-mono/commit/8819e3a5a59675dcc6a1f333620ce6e75b7d2887)) +* **protocol:** update Hekla deployment ([#17795](https://github.com/taikoxyz/taiko-mono/issues/17795)) ([cadaef8](https://github.com/taikoxyz/taiko-mono/commit/cadaef882c0751496809c88ee03ff818e49c4b4a)) +* **protocol:** update risc0 verifier contract to release-1.0 ([#17776](https://github.com/taikoxyz/taiko-mono/issues/17776)) ([2dd30ab](https://github.com/taikoxyz/taiko-mono/commit/2dd30ab2dc92b25105f19a4bcc1ddf7b40886039)) +* **protocol:** update script of deploying sp1 ([#18019](https://github.com/taikoxyz/taiko-mono/issues/18019)) ([9464967](https://github.com/taikoxyz/taiko-mono/commit/94649671bdf0304d96bf83d7d18dcbe21eff6067)) +* **protocol:** use SP1 1.2.0-rc with more proof verification tests ([#18001](https://github.com/taikoxyz/taiko-mono/issues/18001)) ([f7bcf1d](https://github.com/taikoxyz/taiko-mono/commit/f7bcf1d63d19b641ac6b9e0e972a7f6e2ec5b38f)) + + +### Bug Fixes + +* **protocol:** fix `chainId` in `HeklaTaikoL1` ([#17912](https://github.com/taikoxyz/taiko-mono/issues/17912)) ([8f31dd0](https://github.com/taikoxyz/taiko-mono/commit/8f31dd0ed519809f0ea0797b1e6b5937ee087108)) +* **protocol:** fix BridgedERC20V2.sol initializer logic ([#17823](https://github.com/taikoxyz/taiko-mono/issues/17823)) ([d538d99](https://github.com/taikoxyz/taiko-mono/commit/d538d99f9542852821d958008d913c028629bbef)) +* **protocol:** fix bug in adjustExcess ([920bd68](https://github.com/taikoxyz/taiko-mono/commit/920bd6873d3e9e1bbb00751fb9c0056ac85b8554)) +* **protocol:** fix tier id conflicts ([#18004](https://github.com/taikoxyz/taiko-mono/issues/18004)) ([0df1ad4](https://github.com/taikoxyz/taiko-mono/commit/0df1ad4274e6ebc3db79acbbdaedbe2d519262d6)) +* **protocol:** make sure new instance is not zero address in SgxVerifier ([#17918](https://github.com/taikoxyz/taiko-mono/issues/17918)) ([d559ce8](https://github.com/taikoxyz/taiko-mono/commit/d559ce80c1314e9ddbe02798f1c61a2e8349da6e)) +* **protocol:** reduce MainnetTaikoL1 code size ([#17792](https://github.com/taikoxyz/taiko-mono/issues/17792)) ([45281b8](https://github.com/taikoxyz/taiko-mono/commit/45281b848f3ef3c45487bfcd1bfd38b382eff4d0)) +* **protocol:** use block header's extraData for `basefeeSharingPctg` ([#17889](https://github.com/taikoxyz/taiko-mono/issues/17889)) ([5f3cbc9](https://github.com/taikoxyz/taiko-mono/commit/5f3cbc97cbe2636314c4a2945fdf01ef641702e7)) + + +### Chores + +* **main:** release protocol 1.9.0 ([#17783](https://github.com/taikoxyz/taiko-mono/issues/17783)) ([7bfd28a](https://github.com/taikoxyz/taiko-mono/commit/7bfd28a2b332c927cd8b6358623551814260f94e)) +* **main:** release protocol 1.9.0 ([#18051](https://github.com/taikoxyz/taiko-mono/issues/18051)) ([2547ba9](https://github.com/taikoxyz/taiko-mono/commit/2547ba9409705bb759b62e59a7e5d5821349c71a)) +* **protocol:** make two state variables in TaikoL2.sol public and add `adjustExcess` ([#17891](https://github.com/taikoxyz/taiko-mono/issues/17891)) ([ba21f68](https://github.com/taikoxyz/taiko-mono/commit/ba21f6836845ea0227116b701e701815f210d56d)) +* **protocol:** move two files to simplify folder structure ([#17929](https://github.com/taikoxyz/taiko-mono/issues/17929)) ([9dca4fa](https://github.com/taikoxyz/taiko-mono/commit/9dca4faa43ad938880c8e1ac54236ab292bcce6e)) +* **protocol:** re-generate layout files with diff order for comparison with new PR ([#18067](https://github.com/taikoxyz/taiko-mono/issues/18067)) ([078d336](https://github.com/taikoxyz/taiko-mono/commit/078d3367dce86a57d71d48291537e925cb1b4b91)) +* **protocol:** revert `TAIKO_TOKEN` name changes in `DeployOnL1` ([#17927](https://github.com/taikoxyz/taiko-mono/issues/17927)) ([cf1a15f](https://github.com/taikoxyz/taiko-mono/commit/cf1a15f46344e60448c5fdcbcae02521fb5b7c04)) +* **protocol:** revert releasing protocol 1.9.0 ([#17783](https://github.com/taikoxyz/taiko-mono/issues/17783)) ([#18049](https://github.com/taikoxyz/taiko-mono/issues/18049)) ([c033810](https://github.com/taikoxyz/taiko-mono/commit/c033810ecc4c80a4581a95b06ab5127747efd191)) + + +### Documentation + +* **docs-site:** address docs and scripts friction points ([#17815](https://github.com/taikoxyz/taiko-mono/issues/17815)) ([c74968b](https://github.com/taikoxyz/taiko-mono/commit/c74968b61828babf218fbc8e8ded001a853a93c3)) +* **protocol:** add L2 `DelegateOwner` address in Hekla deployment docs ([#17925](https://github.com/taikoxyz/taiko-mono/issues/17925)) ([fdec8db](https://github.com/taikoxyz/taiko-mono/commit/fdec8dbe8c8aef21f71c9c4ca2213944880c1a47)) +* **protocol:** update `tier_router`with compatibility modifications ([#18028](https://github.com/taikoxyz/taiko-mono/issues/18028)) ([c43cb0c](https://github.com/taikoxyz/taiko-mono/commit/c43cb0c05f7cbba281076568f4e72033ebbcd0f3)) +* **protocol:** update hekla change log about `tier_router` ([#18023](https://github.com/taikoxyz/taiko-mono/issues/18023)) ([11e27d6](https://github.com/taikoxyz/taiko-mono/commit/11e27d60b3da9a34e07bfafadb8ec3d3223867d2)) +* **protocol:** update hekla change log about sp1 ([#18020](https://github.com/taikoxyz/taiko-mono/issues/18020)) ([434bf3c](https://github.com/taikoxyz/taiko-mono/commit/434bf3ccc1715171b8cd4e7581b282f85744ebe3)) +* **protocol:** update Hekla deployment ([#17845](https://github.com/taikoxyz/taiko-mono/issues/17845)) ([d95cc36](https://github.com/taikoxyz/taiko-mono/commit/d95cc36260ee4bf2aaf69181fa6444f419cc44af)) +* **protocol:** update Hekla deployment ([#17924](https://github.com/taikoxyz/taiko-mono/issues/17924)) ([46a3e00](https://github.com/taikoxyz/taiko-mono/commit/46a3e00659534a715fb315859463bd05bbdb65a9)) +* **protocol:** update Hekla deployments ([#17975](https://github.com/taikoxyz/taiko-mono/issues/17975)) ([c96627f](https://github.com/taikoxyz/taiko-mono/commit/c96627fcdd9ba91f26eeea2b329f0eb96dd36660)) +* **protocol:** update L1 deployment ([#17789](https://github.com/taikoxyz/taiko-mono/issues/17789)) ([a889f1a](https://github.com/taikoxyz/taiko-mono/commit/a889f1a3e6c27b6758e873572c371ac9399a3d9a)) +* **protocol:** update L1 deployment ([#17804](https://github.com/taikoxyz/taiko-mono/issues/17804)) ([25ace9b](https://github.com/taikoxyz/taiko-mono/commit/25ace9bd2b18d91cbf165968cc27d34ccbd7067a)) +* **protocol:** update L1 deployment ([#17812](https://github.com/taikoxyz/taiko-mono/issues/17812)) ([5b43df1](https://github.com/taikoxyz/taiko-mono/commit/5b43df170b6f97cb89360e2d210d4a768d9247c3)) +* **protocol:** update L1 deployment ([#17817](https://github.com/taikoxyz/taiko-mono/issues/17817)) ([311c948](https://github.com/taikoxyz/taiko-mono/commit/311c948850e8b4d46218fd4aba92d03bc6349445)) +* **protocol:** update mainnet deployment ([#17846](https://github.com/taikoxyz/taiko-mono/issues/17846)) ([ba6bf94](https://github.com/taikoxyz/taiko-mono/commit/ba6bf942213468310c6233051a90356268dea70f)) +* **protocol:** update mainnet deployment ([#17847](https://github.com/taikoxyz/taiko-mono/issues/17847)) ([92344df](https://github.com/taikoxyz/taiko-mono/commit/92344dfb8c97bae370d722f887fb2c603f96c480)) +* **protocol:** upgrade sp1 verifier in hekla ([#18027](https://github.com/taikoxyz/taiko-mono/issues/18027)) ([de27e6e](https://github.com/taikoxyz/taiko-mono/commit/de27e6e586e14410c309e68ce6b81504b9ba9a5b)) + + +### Code Refactoring + +* **protocol:** add MainnetGuardianProver ([#17805](https://github.com/taikoxyz/taiko-mono/issues/17805)) ([6f68316](https://github.com/taikoxyz/taiko-mono/commit/6f68316e89373670cf2c58bde5e64de196b9c139)) +* **protocol:** add MainnetSgxVerifier ([#17803](https://github.com/taikoxyz/taiko-mono/issues/17803)) ([a4be247](https://github.com/taikoxyz/taiko-mono/commit/a4be247e181861300d79af6454b3fd3776100b48)) +* **protocol:** added cached version of the bridge and vaults ([#17801](https://github.com/taikoxyz/taiko-mono/issues/17801)) ([b70cc57](https://github.com/taikoxyz/taiko-mono/commit/b70cc57704d750081a62a7e8e44f68f32efdc4c1)) +* **protocol:** avoid writing `livenessBond`, `proposedAt`, and `proposedIn` to storage ([17d67d7](https://github.com/taikoxyz/taiko-mono/commit/17d67d74c511bc11c2b7d821d8a381f74ef7b6a1)) +* **protocol:** convert metadata from V2 to V1 only once ([#17842](https://github.com/taikoxyz/taiko-mono/issues/17842)) ([55ced31](https://github.com/taikoxyz/taiko-mono/commit/55ced319d68fe40fe82d1c7e0a268735c3545923)) +* **protocol:** delete packages/protocol/contracts/compiled ([#17849](https://github.com/taikoxyz/taiko-mono/issues/17849)) ([1fd907c](https://github.com/taikoxyz/taiko-mono/commit/1fd907cc81807027e730c0e27e258230670522df)) +* **protocol:** extract an IBlockHash interface from TaikoL2 ([#18045](https://github.com/taikoxyz/taiko-mono/issues/18045)) ([bff481e](https://github.com/taikoxyz/taiko-mono/commit/bff481e8a2898fab8396d368de84f8f343c532f0)) +* **protocol:** improve mainnet gas efficiency with addresses cached ([#17791](https://github.com/taikoxyz/taiko-mono/issues/17791)) ([b12227d](https://github.com/taikoxyz/taiko-mono/commit/b12227d4d2b2636fb80e04ee7ebc2dec3c17faa8)) +* **protocol:** improve MainnetSgxVerifier ([#17811](https://github.com/taikoxyz/taiko-mono/issues/17811)) ([4e7a421](https://github.com/taikoxyz/taiko-mono/commit/4e7a421967a4cea897f1ffbeeae254fbcad27117)) +* **protocol:** introduce BlockV2 for client-side compability ([#17935](https://github.com/taikoxyz/taiko-mono/issues/17935)) ([e46cf29](https://github.com/taikoxyz/taiko-mono/commit/e46cf294862c293b73b817574669115b85e973a7)) +* **protocol:** name address manager param clearer ([#17806](https://github.com/taikoxyz/taiko-mono/issues/17806)) ([1d5a6ff](https://github.com/taikoxyz/taiko-mono/commit/1d5a6ff191e8457ee12c96cb73c074560c556a2a)) +* **protocol:** refactor TierProvider implementations ([ee464ca](https://github.com/taikoxyz/taiko-mono/commit/ee464caef68fdec325aa22758bb69e17dd039794)) +* **protocol:** remove ProposerAccess for easier composability ([#17994](https://github.com/taikoxyz/taiko-mono/issues/17994)) ([80176a1](https://github.com/taikoxyz/taiko-mono/commit/80176a1525c374039256c779f4a2408971759d22)) +* **protocol:** remove the receive function from TaikoL1.sol ([#17865](https://github.com/taikoxyz/taiko-mono/issues/17865)) ([3542420](https://github.com/taikoxyz/taiko-mono/commit/35424204d9f41d49f4a12869ed4410b6de7f577e)) +* **protocol:** remove uncessary init2() from TaikoL2 ([#17973](https://github.com/taikoxyz/taiko-mono/issues/17973)) ([4e08881](https://github.com/taikoxyz/taiko-mono/commit/4e0888190e172c950dc5e81a5115ee0fb6df3f11)) +* **protocol:** restructure solidity code to match compilation targets ([#18059](https://github.com/taikoxyz/taiko-mono/issues/18059)) ([adc47f4](https://github.com/taikoxyz/taiko-mono/commit/adc47f408282c25c7a50c26e31130fc495734dcc)) +* **protocol:** simplify mainnet address caching ([ee464ca](https://github.com/taikoxyz/taiko-mono/commit/ee464caef68fdec325aa22758bb69e17dd039794)) +* **protocol:** use npm to manage third-party solidity dependency ([#17881](https://github.com/taikoxyz/taiko-mono/issues/17881)) ([d524e69](https://github.com/taikoxyz/taiko-mono/commit/d524e693449de9d65154471786fa4f5e8c45a381)) + + +### Tests + +* **protocol:** add test case of risc0 groth16 ([#17904](https://github.com/taikoxyz/taiko-mono/issues/17904)) ([90bc01d](https://github.com/taikoxyz/taiko-mono/commit/90bc01dfbef1129be1bd94e85c9ecd7c7b28b1da)) +* **taiko-client:** use env names which defined in flag configs ([#17921](https://github.com/taikoxyz/taiko-mono/issues/17921)) ([196b74e](https://github.com/taikoxyz/taiko-mono/commit/196b74eb2b4498bc3e6511915e011a885fcc530f)) + + +### Workflow + +* **protocol:** upgrade to use solc 0.8.27 ([#18037](https://github.com/taikoxyz/taiko-mono/issues/18037)) ([3a56b57](https://github.com/taikoxyz/taiko-mono/commit/3a56b5788b3e2473381429e5fddfaac2f10fa174)) + + +### Build + +* **deps:** bump merkletreejs from 0.3.11 to 0.4.0 ([#17942](https://github.com/taikoxyz/taiko-mono/issues/17942)) ([1624b71](https://github.com/taikoxyz/taiko-mono/commit/1624b711e3fe1862f000e1d2970d6aee1b8990c9)) + +## [1.8.0](https://github.com/taikoxyz/taiko-mono/compare/protocol-v1.7.0...protocol-v1.8.0) (2024-07-11) + + +### Features + +* **protocol:** allow TAIKO token bonds deposits and withdrawal ([#17725](https://github.com/taikoxyz/taiko-mono/issues/17725)) ([e505392](https://github.com/taikoxyz/taiko-mono/commit/e505392068084faa37b4b0d138ac79012256c692)) +* **protocol:** emit CalldataTxList when calldata is used for DA ([#17657](https://github.com/taikoxyz/taiko-mono/issues/17657)) ([f49aae8](https://github.com/taikoxyz/taiko-mono/commit/f49aae828e7c0695be359305c9d618977014c5af)) +* **protocol:** update `tier_router` address in `L1RollupAddressManager` ([#17717](https://github.com/taikoxyz/taiko-mono/issues/17717)) ([57c8dc0](https://github.com/taikoxyz/taiko-mono/commit/57c8dc0f0cae430b54d47b12939f1484d6c87184)) + + +### Bug Fixes + +* **protocol:** fix an issue in DelegateOwner then refactor the code ([#17633](https://github.com/taikoxyz/taiko-mono/issues/17633)) ([fbeb4e4](https://github.com/taikoxyz/taiko-mono/commit/fbeb4e49d0c183cc687a20b9b5ba7dae5af47d63)) +* **protocol:** revert Hekla ring buffer size changes ([#17779](https://github.com/taikoxyz/taiko-mono/issues/17779)) ([e18cb87](https://github.com/taikoxyz/taiko-mono/commit/e18cb8708b61ff1e0bdf2e99433328b1875b6a6c)) +* **protocol:** revert last change in TaikoToken.sol ([#17781](https://github.com/taikoxyz/taiko-mono/issues/17781)) ([7805fd3](https://github.com/taikoxyz/taiko-mono/commit/7805fd3a517beb0426848067fbe7f541b4ec6ed3)) +* **protocol:** use gasleft() in Bridge's retryMessage function ([#17708](https://github.com/taikoxyz/taiko-mono/issues/17708)) ([d86893c](https://github.com/taikoxyz/taiko-mono/commit/d86893cf0198a13f2710a701ea9c22e15c169de7)) + + +### Chores + +* **protocol:** check in data for the first token grant exercise ([#17707](https://github.com/taikoxyz/taiko-mono/issues/17707)) ([d2b00ce](https://github.com/taikoxyz/taiko-mono/commit/d2b00ce914076891c064fbbf280f363329c0f4cb)) +* **protocol:** give more slots for verified blocks in ring buffer ([#17762](https://github.com/taikoxyz/taiko-mono/issues/17762)) ([8d6d489](https://github.com/taikoxyz/taiko-mono/commit/8d6d489619996b2749147bebee60ef59d81ac040)) + + +### Documentation + +* **docs-site,protocol:** deploy proverset guide and scripts ([#17702](https://github.com/taikoxyz/taiko-mono/issues/17702)) ([a3e1cf7](https://github.com/taikoxyz/taiko-mono/commit/a3e1cf72bc4ad925d3652359a2f4d5fb466b79b0)) +* **docs-site,protocol:** streamline ProverSet deployment ([#17730](https://github.com/taikoxyz/taiko-mono/issues/17730)) ([919cb4c](https://github.com/taikoxyz/taiko-mono/commit/919cb4cd0064d1cfa994e53a30a73f98975cfe34)) +* **protocol:** add more token unlock contracts ([#17749](https://github.com/taikoxyz/taiko-mono/issues/17749)) ([8c8c7d2](https://github.com/taikoxyz/taiko-mono/commit/8c8c7d27501bdac99de055e9c9a032d60a20f75a)) +* **protocol:** deploy more token unlock contract ([#17763](https://github.com/taikoxyz/taiko-mono/issues/17763)) ([30631a9](https://github.com/taikoxyz/taiko-mono/commit/30631a97de10a61aef0938cbfb885af71c9f8dc1)) +* **protocol:** transfer Hekla ownerships ([#17766](https://github.com/taikoxyz/taiko-mono/issues/17766)) ([e524782](https://github.com/taikoxyz/taiko-mono/commit/e52478247806437f08af6324cf6097d384ada516)) +* **protocol:** update Hekla deployment ([#17646](https://github.com/taikoxyz/taiko-mono/issues/17646)) ([fc12586](https://github.com/taikoxyz/taiko-mono/commit/fc125862c6576ddcbce4d6b8b12161bd6882e304)) +* **protocol:** update Hekla deployment ([#17780](https://github.com/taikoxyz/taiko-mono/issues/17780)) ([b3331d3](https://github.com/taikoxyz/taiko-mono/commit/b3331d3fae73b6536a03ab94a42b03042b5c0676)) +* **protocol:** update L1 deployment ([#17736](https://github.com/taikoxyz/taiko-mono/issues/17736)) ([6fc318a](https://github.com/taikoxyz/taiko-mono/commit/6fc318afa044eb17d824b00d4d4a487eef2d15a0)) +* **protocol:** update L2 deployment ([#17689](https://github.com/taikoxyz/taiko-mono/issues/17689)) ([71eea3f](https://github.com/taikoxyz/taiko-mono/commit/71eea3ff4f4ba9fe7eab89c236cf0b4232294500)) + + +### Code Refactoring + +* **protocol:** delete duplicate event and error definition from TaikoL1 ([#17722](https://github.com/taikoxyz/taiko-mono/issues/17722)) ([0607b14](https://github.com/taikoxyz/taiko-mono/commit/0607b14f937b3e461ccc54a8ace21d545d2607e0)) +* **protocol:** refactor TaikoL1 contract ([#17678](https://github.com/taikoxyz/taiko-mono/issues/17678)) ([db6ccdf](https://github.com/taikoxyz/taiko-mono/commit/db6ccdfe0141452602ab79177d3c9aa7050ca46b)) +* **protocol:** remove unused tier fee in TaikoData ([#17741](https://github.com/taikoxyz/taiko-mono/issues/17741)) ([50abed1](https://github.com/taikoxyz/taiko-mono/commit/50abed1d3a543076cf334263904ba578e961dcd0)) + +## [1.7.0](https://github.com/taikoxyz/taiko-mono/compare/protocol-v1.6.0...protocol-v1.7.0) (2024-06-20) + + +### Features + +* **protocol:** add getLastVerifiedBlock and getLastSyncedBlock ([#17566](https://github.com/taikoxyz/taiko-mono/issues/17566)) ([cf0743f](https://github.com/taikoxyz/taiko-mono/commit/cf0743fcd48631dbf23cdba8a53343abfb7d5aae)) +* **protocol:** add new tcb & add test case ([#17622](https://github.com/taikoxyz/taiko-mono/issues/17622)) ([2384b7c](https://github.com/taikoxyz/taiko-mono/commit/2384b7c73c7b8814cb21ea276865fd92ac509fb1)) +* **protocol:** add new tcb & update related tests ([#17545](https://github.com/taikoxyz/taiko-mono/issues/17545)) ([97aa874](https://github.com/taikoxyz/taiko-mono/commit/97aa874e7637d29862f9b78af78e0c7a02bb424a)) +* **protocol:** change guardian prover cooldown windows ([#17590](https://github.com/taikoxyz/taiko-mono/issues/17590)) ([cc10b04](https://github.com/taikoxyz/taiko-mono/commit/cc10b04cefa90420325df3626ae22bf3b8149451)) +* **protocol:** improve DelegateOwner to have an optional L2 admin ([#17445](https://github.com/taikoxyz/taiko-mono/issues/17445)) ([1c59e8c](https://github.com/taikoxyz/taiko-mono/commit/1c59e8c42d71a900743ba6aaab8642297b29dc92)) +* **protocol:** lower liveness, validity, and contestation bonds by 50% ([#17616](https://github.com/taikoxyz/taiko-mono/issues/17616)) ([c9b8d40](https://github.com/taikoxyz/taiko-mono/commit/c9b8d407240720bcf6328569a3c57c830ea79d01)) +* **protocol:** persist and compare stateRoot only once per 16 blocks ([b7e12e3](https://github.com/taikoxyz/taiko-mono/commit/b7e12e3c36879361c1bb470e3d6132dfc63150ef)) +* **protocol:** remove hook support completely ([b7e12e3](https://github.com/taikoxyz/taiko-mono/commit/b7e12e3c36879361c1bb470e3d6132dfc63150ef)) +* **protocol:** require assigned prover to be the block proposer itself ([b7e12e3](https://github.com/taikoxyz/taiko-mono/commit/b7e12e3c36879361c1bb470e3d6132dfc63150ef)) +* **protocol:** update Hekla deployment ([#17560](https://github.com/taikoxyz/taiko-mono/issues/17560)) ([bfeadd8](https://github.com/taikoxyz/taiko-mono/commit/bfeadd8f44dc7284e6e8c81cd13e8433ec04e410)) +* **protocol:** verify blocks less frequently but more efficiently ([b7e12e3](https://github.com/taikoxyz/taiko-mono/commit/b7e12e3c36879361c1bb470e3d6132dfc63150ef)) + + +### Bug Fixes + +* **protocol:** fix an issue for `ProverSet.proposeBlock` ([#17521](https://github.com/taikoxyz/taiko-mono/issues/17521)) ([d3037ad](https://github.com/taikoxyz/taiko-mono/commit/d3037ad6551b5ae6353a360ae3677ec17cd00ec9)) +* **protocol:** fix Bridge forwarded gas check and `getMessageMinGasLimit` ([#17529](https://github.com/taikoxyz/taiko-mono/issues/17529)) ([0082c6a](https://github.com/taikoxyz/taiko-mono/commit/0082c6a5dd6e383edf13b8505712d20a86d99cba)) +* **protocol:** fix getLastSyncedBlock by writing the block's verifiedTransitionId ([6e07ab5](https://github.com/taikoxyz/taiko-mono/commit/6e07ab5089602ef552592985d230c879b5905312)) +* **protocol:** fix in vesting scripts ([#17581](https://github.com/taikoxyz/taiko-mono/issues/17581)) ([5d7b256](https://github.com/taikoxyz/taiko-mono/commit/5d7b256b00e3903ae097ecd24e6ed296a6a17828)) +* **protocol:** fix ProverSet permission issue ([#17527](https://github.com/taikoxyz/taiko-mono/issues/17527)) ([98b47d4](https://github.com/taikoxyz/taiko-mono/commit/98b47d421697694db1926486410c08adbf4a6155)) +* **protocol:** fix seemingly quota issue ([#17544](https://github.com/taikoxyz/taiko-mono/issues/17544)) ([d083eeb](https://github.com/taikoxyz/taiko-mono/commit/d083eeb29cf7610b733b978e3cfdd0df2d7461f8)) +* **protocol:** fix tip payment to L1 block builder ([6e07ab5](https://github.com/taikoxyz/taiko-mono/commit/6e07ab5089602ef552592985d230c879b5905312)) + + +### Chores + +* **protocol:** add assumption desc. for IBridgedERC20 ([#17546](https://github.com/taikoxyz/taiko-mono/issues/17546)) ([7fa3b55](https://github.com/taikoxyz/taiko-mono/commit/7fa3b55cc9322d79850bdbfb31def9c0501cf647)) +* **protocol:** update TAIKO symbol in protocol deployment logs ([#17555](https://github.com/taikoxyz/taiko-mono/issues/17555)) ([04bb81e](https://github.com/taikoxyz/taiko-mono/commit/04bb81e692348ca7a16bf92588379e047a1bf5f5)) + + +### Documentation + +* **protocol:** add open_zeppelin_taiko_protocol_audit_june_2024.pdf ([#17621](https://github.com/taikoxyz/taiko-mono/issues/17621)) ([03cff67](https://github.com/taikoxyz/taiko-mono/commit/03cff6788c3ce1b8b2979beb110336d5383847cf)) +* **protocol:** update Hekla deployment ([#17543](https://github.com/taikoxyz/taiko-mono/issues/17543)) ([98beab8](https://github.com/taikoxyz/taiko-mono/commit/98beab8a7de4f365ec76bd6fbffebfcc6fb4505d)) +* **protocol:** update Hekla deployment ([#17592](https://github.com/taikoxyz/taiko-mono/issues/17592)) ([6bcda30](https://github.com/taikoxyz/taiko-mono/commit/6bcda306792ff8a15339b3f0ff217929cb7684cf)) +* **protocol:** update L1 deployment ([#17513](https://github.com/taikoxyz/taiko-mono/issues/17513)) ([006e522](https://github.com/taikoxyz/taiko-mono/commit/006e522ea962adda0f42bde6e54d3d0e3f901d29)) + + +### Code Refactoring + +* **protocol:** avoid unnecessary Signal Service call ([#17516](https://github.com/taikoxyz/taiko-mono/issues/17516)) ([9fac584](https://github.com/taikoxyz/taiko-mono/commit/9fac584a5001d6b5246062cba3f24a374f6697fa)) +* **protocol:** optimize storage reads/writes in proveBlock ([#17532](https://github.com/taikoxyz/taiko-mono/issues/17532)) ([ba5c25b](https://github.com/taikoxyz/taiko-mono/commit/ba5c25b4060865b7c36cce8a3d0d86ad930cbc4c)) + ## [1.6.0](https://github.com/taikoxyz/taiko-mono/compare/protocol-v1.5.0...protocol-v1.6.0) (2024-06-07) diff --git a/packages/protocol/README.md b/packages/protocol/README.md index 371e99b6972..f71ac8c7eb1 100644 --- a/packages/protocol/README.md +++ b/packages/protocol/README.md @@ -1,139 +1,145 @@ # Taiko Protocol -This package contains rollup contracts on both L1 and L2, along with other assisting code. Taiko L2's chain ID is [167](https://github.com/ethereum-lists/chains/pull/1611). +This repository contains the Taiko Based Contestable Rollup (BCR) protocol and supporting tools. The project is managed using `pnpm` and `foundry`. -## Getting Started +## Prerequisites -Before compiling smart contracts, ensure all necessary dependencies are installed: +Before compiling the smart contracts, ensure the following are installed and up to date: -```sh -pnpm install +- [Foundry](https://book.getfoundry.sh/) +- [pnpm](https://pnpm.io/) + +To install dependencies: + +```bash +foundryup && pnpm install ``` -Then, compile the smart contracts: +## Compilation and Testing -```sh -pnpm compile +Taiko’s protocol is split between Layer 1 (L1) and Layer 2 (L2). The smart contracts need to be compiled and tested separately for each layer: + +### Layer 1 (Ethereum, Duncan Hardfork) + +To compile, run tests, and generate the storage layout for L1: + +```bash +pnpm compile:l1 +pnpm test:l1 +pnpm layout:l1 ``` -If you run into `Error: Unknown version provided`, you should upgrade your foundry installation by running `curl -L https://foundry.paradigm.xyz | bash`. +### Layer 2 (Taiko, Shanghai Hardfork) -## Style Guide +Similarly, for L2: + +```bash +pnpm compile:l2 +pnpm test:l2 +pnpm layout:l2 +``` + +### Compile and Test for Both Layers + +To compile and test contracts for both L1 and L2 at once: + +```bash +pnpm compile +pnpm test +pnpm layout +``` -Please see [CONTRIBUTING.md](../../CONTRIBUTING.md) for the source code style guidelines to adhere to. +## Layer 2 Genesis Block -## Generate L2 Genesis JSON's `alloc` Field +### Generating a Dummy Genesis Block -Create a `config.js` with the following structure: +To generate dummy data for the L2 genesis block, create a configuration file at `./test/genesis/data/genesis_config.js` with the following content: ```javascript module.exports = { - // Owner address of the pre-deployed L2 contracts. contractOwner: "0xDf08F82De32B8d460adbE8D72043E3a7e25A3B39", - // Chain ID of the Taiko L2 network. chainId: 167, - // Account address and pre-mint ETH amount as key-value pairs. seedAccounts: [ { "0xDf08F82De32B8d460adbE8D72043E3a7e25A3B39": 1024 }, { "0x79fcdef22feed20eddacbb2587640e45491b757f": 1024 }, ], - // Owner Chain ID, Security Council, and Timelock Controller l1ChainId: 31337, ownerSecurityCouncil: "0xDf08F82De32B8d460adbE8D72043E3a7e25A3B39", ownerTimelockController: "0xDf08F82De32B8d460adbE8D72043E3a7e25A3B39", - // L2 EIP-1559 baseFee calculation related fields. param1559: { gasExcess: 1, }, - // Option to pre-deploy an ERC-20 token. predeployERC20: true, }; ``` -Then, execute the generation script: +Then compile the L2 contracts and generate the genesis block: -```sh -pnpm compile && pnpm generate:genesis config.js +```bash +pnpm compile:l2 +pnpm genesis:gen ``` -The script will output two JSON files under `./deployments`: - -- `l2_genesis_alloc.json`: the `alloc` field which will be used in L2 genesis JSON file -- `l2_genesis_storage_layout.json`: the storage layout of those pre-deployed contracts - -## Using Foundry +This generates the following JSON files in `./test/genesis/data/`: -This project also integrates with Foundry for building and testing contracts. +- `l2_genesis_alloc.json`: Contains the `alloc` field for the L2 genesis block. Use this in a `geth` or `taiko-geth` genesis block following [this guide](https://geth.ethereum.org/docs/fundamentals/private-network#creating-genesis-block). +- `l2_genesis_storage_layout.json`: Displays the storage layout of the pre-deployed contracts. -- To compile using foundry: `forge build` or `pnpm compile` -- To run foundry tests: `forge test --gas-report -vvv` or `pnpm test:foundry` +To validate the genesis data: -## Generating and Running the L2 Genesis Block - -The generation of the L2 genesis block and obtaining its hash involves a series of steps, including constructing the genesis JSON, followed by the actual generation and retrieval of the genesis block hash. A test can be executed to comprehend this process. - -### Testing Genesis Block Creation - -To understand how the `genesis.json` is built from deployment files and how to generate the genesis block and its hash, you can use the `test:genesis` command. This test serves as a learning tool: - -```sh -pnpm test:genesis +```bash +pnpm genesis:test ``` -This test, defined in `./genesis/generate_genesis.test.sh`, compiles the contracts, generates the genesis JSON, and initiates a Geth node using Docker to simulate the deployment of the genesis block. Reviewing this script and its output can help you grasp the steps required to create and initiate a genesis block for the Taiko Protocol. - -### Generating the Actual Genesis Block - -After understanding the process from the test, proceed to generate the actual `genesis.json` and the genesis block: - -1. **Build the Genesis JSON:** Use the information learned from the `test:genesis` to build the `genesis.json` file from the files in the `/deployments/` directory. The `generate_genesis.test.sh` script contains the necessary commands to create this file. - -2. **Run Geth to Generate the Genesis Block:** You can use Geth to initialize and run a private network with the genesis block. You can start Geth with the following commands: +This runs tests using Docker and `taiko-geth` to simulate the L2 genesis block deployment, and generates a `genesis.json` file in `./test/genesis/data/`. - ```sh - geth --datadir ~/taiko-l2-network/node init /deployments/genesis.json - geth --datadir ~/taiko-l2-network/node --networkid 167 --http --http.addr 127.0.0.1 --http.port 8552 --http.corsdomain "*" - ``` +### Generating an Actual Genesis Block - For details refer to the Geth documentation on [creating a genesis block](https://geth.ethereum.org/docs/fundamentals/private-network#creating-genesis-block). +To generate the actual L2 genesis block, create a `genesis.json` file based on `l2_genesis_alloc.json`, following [this guide](https://geth.ethereum.org/docs/fundamentals/private-network#creating-genesis-block). -3. **Retrieve the Genesis Block Hash:** Connect to the Geth node using the command: +Next, initialize `taiko-geth` with the generated `genesis.json`: - ```sh - geth attach ~/taiko-l2-network/node/geth.ipc - ``` +```bash +geth --datadir ~/taiko-l2-network/node init test/layer2/genesis/data/genesis.json +geth --datadir ~/taiko-l2-network/node --networkid 167 --http --http.addr 127.0.0.1 --http.port 8552 --http.corsdomain "*" +``` - In the Geth console, use `eth.getBlock(0)` to obtain the hash of the genesis block. +You can retrieve the genesis block hash by attaching to the `geth` instance: -4. **Update `test_deploy_on_l1.sh` File:** Update the `L2_GENESIS_HASH` variable in the `test_deploy_on_l1.sh` script with the obtained genesis block hash. +```bash +geth attach ~/taiko-l2-network/node/geth.ipc +``` -By following these steps, you will successfully generate the L2 genesis block for the Taiko Protocol, retrieve its hash, and prepare for the L1 contract deployment. +Then run: -## Deploying the L1 Contracts +```bash +eth.getBlock(0) +``` -To deploy L1 contracts for Taiko Protocol, you can use any Ethereum network. This guide illustrates the process using a Hardhat local network, but it's adaptable to others. The deployment relies on `script/test_deploy_on_l1.sh`, which targets a node at `http://localhost:8545` by default. +Copy the genesis block hash and replace the `L2_GENESIS_HASH` variable in `deploy_protocol_on_l1.sh` with this value. -Here’s how you can proceed: +### Deploying Taiko BCR on Layer 1 -1. **Ensure Sufficient ETH:** Check that the address associated with the private key in `script/test_deploy_on_l1.sh` has enough ETH for deploying contracts on the Hardhat network. +To deploy Taiko BCR on L1, start a local L1 network: -2. **Update Contract Addresses:** After running the genesis block generation script (`pnpm test:genesis`), you will receive a list of pre-computed contract addresses. These addresses need to be added to the `test_deploy_on_l1.sh` file. Make sure to update this file with the correct contract addresses before proceeding with the deployment. +```bash +anvil --hardfork cancun +``` -3. **Start a Local Development Network:** While this guide uses Hardhat as an example, you can use any Ethereum network. If you choose to use Hardhat, start a local Ethereum network for development and testing: +Make sure you have sufficient ether for transactions, then deploy the contracts: -```sh -pnpm hardhat node +```bash +pnpm test:deploy:l1 ``` -4. **Deploy Contracts Using Foundry:** Once your network is running, open a new terminal window and execute the deployment scripts using Foundry: +This command runs the deployment script located at `script/deploy_protocol_on_l1.sh`, assuming L1 is accessible at `http://localhost:8545`. -```sh -pnpm test:deploy -``` +## Style Guide -This command will deploy the L1 contracts using the settings and addresses you’ve provided in the `test_deploy_on_l1.sh` script. +Refer to [CONTRIBUTING.md](../../CONTRIBUTING.md) for code style guidelines. -## Running slither +Before committing code, format and lint it using: -1. Install the latest [slither](https://github.com/crytic/slither?tab=readme-ov-file#how-to-install). -2. From `protocol/`, execute `slither . --checklist > checklist.md` to re-generate the checklist. +```bash +pnpm fmt:sol +``` diff --git a/packages/protocol/audit/code4rena-2024-03-taiko-final-report.md b/packages/protocol/audit/code4rena-2024-03-taiko-final-report.md index 4f700ec4272..1474e8f30a5 100644 --- a/packages/protocol/audit/code4rena-2024-03-taiko-final-report.md +++ b/packages/protocol/audit/code4rena-2024-03-taiko-final-report.md @@ -670,7 +670,7 @@ Notice how if the payment is in ERC20 tokens, the payee will be the variable \_m 1. proposer A approves the assignmentHook contract to spend a portion of their tokens, the allowance is set higher than the actual fee they will be paying. 2. proposer A proposes a block, and a fee is charged and payed to the assigned prover, but there remains allowance that the assignment hook contract can still use. -3. proposer B proposes a block and sets params.coinbase as the the address of proposer A. +3. proposer B proposes a block and sets params.coinbase as the address of proposer A. 4. proposer A address will be the payee of the fee for the assigned prover for the block proposed by proposer B. The scenario above describes how someone can be forced maliciously to pay fees for block proposals by other actors. @@ -1207,7 +1207,7 @@ When this function is called to un-suspend a message we set `proofReceipt[msgHas `bridge_watchdog` can therefore forge arbitrary messages and have them treated as proven by first suspending them and then un-suspending them. -`bride_watchdog` is supposed to only be able to ban and suspend messages, in the expected worst case `bridge_watchdog` is limited to DDOSing messages and bans until governance removes the the `bridge_watchdog`. +`bride_watchdog` is supposed to only be able to ban and suspend messages, in the expected worst case `bridge_watchdog` is limited to DDOSing messages and bans until governance removes the `bridge_watchdog`. With the privilege escalation shown here the role can instead drain the bridge of all ETH and tokens. @@ -2109,7 +2109,7 @@ A different bug report titled **_"No incentive for message non-owners to retryMe ### Impact -- Protocol can be gamed by a user to gain rewards while additionaly saving money by providing the least possible gas. +- Protocol can be gamed by a user to gain rewards while additionally saving money by providing the least possible gas. - There is no incentive for any external user now to ever provide more than `{gas: 10_897_060}` (approx figure). diff --git a/packages/protocol/audit/open_zeppelin_taiko_protocol_audit_june_2024.pdf b/packages/protocol/audit/open_zeppelin_taiko_protocol_audit_june_2024.pdf new file mode 100644 index 00000000000..47a48d4791d Binary files /dev/null and b/packages/protocol/audit/open_zeppelin_taiko_protocol_audit_june_2024.pdf differ diff --git a/packages/protocol/audit/open_zeppelin_taiko_protocol_ontake_audit_nov_2024.pdf.pdf b/packages/protocol/audit/open_zeppelin_taiko_protocol_ontake_audit_nov_2024.pdf.pdf new file mode 100644 index 00000000000..ffa07e75c87 Binary files /dev/null and b/packages/protocol/audit/open_zeppelin_taiko_protocol_ontake_audit_nov_2024.pdf.pdf differ diff --git a/packages/protocol/contract_layout.md b/packages/protocol/contract_layout.md deleted file mode 100644 index a195744f511..00000000000 --- a/packages/protocol/contract_layout.md +++ /dev/null @@ -1,533 +0,0 @@ -## TaikoL1 -| Name | Type | Slot | Offset | Bytes | Contract | -|----------------|------------------------|------|--------|-------|----------------------------------| -| _initialized | uint8 | 0 | 0 | 1 | contracts/L1/TaikoL1.sol:TaikoL1 | -| _initializing | bool | 0 | 1 | 1 | contracts/L1/TaikoL1.sol:TaikoL1 | -| __gap | uint256[50] | 1 | 0 | 1600 | contracts/L1/TaikoL1.sol:TaikoL1 | -| _owner | address | 51 | 0 | 20 | contracts/L1/TaikoL1.sol:TaikoL1 | -| __gap | uint256[49] | 52 | 0 | 1568 | contracts/L1/TaikoL1.sol:TaikoL1 | -| _pendingOwner | address | 101 | 0 | 20 | contracts/L1/TaikoL1.sol:TaikoL1 | -| __gap | uint256[49] | 102 | 0 | 1568 | contracts/L1/TaikoL1.sol:TaikoL1 | -| addressManager | address | 151 | 0 | 20 | contracts/L1/TaikoL1.sol:TaikoL1 | -| __gap | uint256[49] | 152 | 0 | 1568 | contracts/L1/TaikoL1.sol:TaikoL1 | -| __reentry | uint8 | 201 | 0 | 1 | contracts/L1/TaikoL1.sol:TaikoL1 | -| __paused | uint8 | 201 | 1 | 1 | contracts/L1/TaikoL1.sol:TaikoL1 | -| lastUnpausedAt | uint64 | 201 | 2 | 8 | contracts/L1/TaikoL1.sol:TaikoL1 | -| __gap | uint256[49] | 202 | 0 | 1568 | contracts/L1/TaikoL1.sol:TaikoL1 | -| state | struct TaikoData.State | 251 | 0 | 1600 | contracts/L1/TaikoL1.sol:TaikoL1 | -| __gap | uint256[50] | 301 | 0 | 1600 | contracts/L1/TaikoL1.sol:TaikoL1 | - -## TaikoL2 -| Name | Type | Slot | Offset | Bytes | Contract | -|-----------------|-----------------------------|------|--------|-------|----------------------------------| -| _initialized | uint8 | 0 | 0 | 1 | contracts/L2/TaikoL2.sol:TaikoL2 | -| _initializing | bool | 0 | 1 | 1 | contracts/L2/TaikoL2.sol:TaikoL2 | -| __gap | uint256[50] | 1 | 0 | 1600 | contracts/L2/TaikoL2.sol:TaikoL2 | -| _owner | address | 51 | 0 | 20 | contracts/L2/TaikoL2.sol:TaikoL2 | -| __gap | uint256[49] | 52 | 0 | 1568 | contracts/L2/TaikoL2.sol:TaikoL2 | -| _pendingOwner | address | 101 | 0 | 20 | contracts/L2/TaikoL2.sol:TaikoL2 | -| __gap | uint256[49] | 102 | 0 | 1568 | contracts/L2/TaikoL2.sol:TaikoL2 | -| addressManager | address | 151 | 0 | 20 | contracts/L2/TaikoL2.sol:TaikoL2 | -| __gap | uint256[49] | 152 | 0 | 1568 | contracts/L2/TaikoL2.sol:TaikoL2 | -| __reentry | uint8 | 201 | 0 | 1 | contracts/L2/TaikoL2.sol:TaikoL2 | -| __paused | uint8 | 201 | 1 | 1 | contracts/L2/TaikoL2.sol:TaikoL2 | -| lastUnpausedAt | uint64 | 201 | 2 | 8 | contracts/L2/TaikoL2.sol:TaikoL2 | -| __gap | uint256[49] | 202 | 0 | 1568 | contracts/L2/TaikoL2.sol:TaikoL2 | -| l2Hashes | mapping(uint256 => bytes32) | 251 | 0 | 32 | contracts/L2/TaikoL2.sol:TaikoL2 | -| publicInputHash | bytes32 | 252 | 0 | 32 | contracts/L2/TaikoL2.sol:TaikoL2 | -| gasExcess | uint64 | 253 | 0 | 8 | contracts/L2/TaikoL2.sol:TaikoL2 | -| lastSyncedBlock | uint64 | 253 | 8 | 8 | contracts/L2/TaikoL2.sol:TaikoL2 | -| __deprecated1 | uint64 | 253 | 16 | 8 | contracts/L2/TaikoL2.sol:TaikoL2 | -| __deprecated2 | uint64 | 253 | 24 | 8 | contracts/L2/TaikoL2.sol:TaikoL2 | -| l1ChainId | uint64 | 254 | 0 | 8 | contracts/L2/TaikoL2.sol:TaikoL2 | -| __gap | uint256[46] | 255 | 0 | 1472 | contracts/L2/TaikoL2.sol:TaikoL2 | - -## SignalService -| Name | Type | Slot | Offset | Bytes | Contract | -|----------------|-----------------------------------------------|------|--------|-------|--------------------------------------------------| -| _initialized | uint8 | 0 | 0 | 1 | contracts/signal/SignalService.sol:SignalService | -| _initializing | bool | 0 | 1 | 1 | contracts/signal/SignalService.sol:SignalService | -| __gap | uint256[50] | 1 | 0 | 1600 | contracts/signal/SignalService.sol:SignalService | -| _owner | address | 51 | 0 | 20 | contracts/signal/SignalService.sol:SignalService | -| __gap | uint256[49] | 52 | 0 | 1568 | contracts/signal/SignalService.sol:SignalService | -| _pendingOwner | address | 101 | 0 | 20 | contracts/signal/SignalService.sol:SignalService | -| __gap | uint256[49] | 102 | 0 | 1568 | contracts/signal/SignalService.sol:SignalService | -| addressManager | address | 151 | 0 | 20 | contracts/signal/SignalService.sol:SignalService | -| __gap | uint256[49] | 152 | 0 | 1568 | contracts/signal/SignalService.sol:SignalService | -| __reentry | uint8 | 201 | 0 | 1 | contracts/signal/SignalService.sol:SignalService | -| __paused | uint8 | 201 | 1 | 1 | contracts/signal/SignalService.sol:SignalService | -| lastUnpausedAt | uint64 | 201 | 2 | 8 | contracts/signal/SignalService.sol:SignalService | -| __gap | uint256[49] | 202 | 0 | 1568 | contracts/signal/SignalService.sol:SignalService | -| topBlockId | mapping(uint64 => mapping(bytes32 => uint64)) | 251 | 0 | 32 | contracts/signal/SignalService.sol:SignalService | -| isAuthorized | mapping(address => bool) | 252 | 0 | 32 | contracts/signal/SignalService.sol:SignalService | -| __gap | uint256[48] | 253 | 0 | 1536 | contracts/signal/SignalService.sol:SignalService | - -## Bridge -| Name | Type | Slot | Offset | Bytes | Contract | -|----------------|-----------------------------------------|------|--------|-------|------------------------------------| -| _initialized | uint8 | 0 | 0 | 1 | contracts/bridge/Bridge.sol:Bridge | -| _initializing | bool | 0 | 1 | 1 | contracts/bridge/Bridge.sol:Bridge | -| __gap | uint256[50] | 1 | 0 | 1600 | contracts/bridge/Bridge.sol:Bridge | -| _owner | address | 51 | 0 | 20 | contracts/bridge/Bridge.sol:Bridge | -| __gap | uint256[49] | 52 | 0 | 1568 | contracts/bridge/Bridge.sol:Bridge | -| _pendingOwner | address | 101 | 0 | 20 | contracts/bridge/Bridge.sol:Bridge | -| __gap | uint256[49] | 102 | 0 | 1568 | contracts/bridge/Bridge.sol:Bridge | -| addressManager | address | 151 | 0 | 20 | contracts/bridge/Bridge.sol:Bridge | -| __gap | uint256[49] | 152 | 0 | 1568 | contracts/bridge/Bridge.sol:Bridge | -| __reentry | uint8 | 201 | 0 | 1 | contracts/bridge/Bridge.sol:Bridge | -| __paused | uint8 | 201 | 1 | 1 | contracts/bridge/Bridge.sol:Bridge | -| lastUnpausedAt | uint64 | 201 | 2 | 8 | contracts/bridge/Bridge.sol:Bridge | -| __gap | uint256[49] | 202 | 0 | 1568 | contracts/bridge/Bridge.sol:Bridge | -| __reserved1 | uint64 | 251 | 0 | 8 | contracts/bridge/Bridge.sol:Bridge | -| nextMessageId | uint64 | 251 | 8 | 8 | contracts/bridge/Bridge.sol:Bridge | -| messageStatus | mapping(bytes32 => enum IBridge.Status) | 252 | 0 | 32 | contracts/bridge/Bridge.sol:Bridge | -| __ctx | struct IBridge.Context | 253 | 0 | 64 | contracts/bridge/Bridge.sol:Bridge | -| __reserved2 | uint256 | 255 | 0 | 32 | contracts/bridge/Bridge.sol:Bridge | -| __reserved3 | uint256 | 256 | 0 | 32 | contracts/bridge/Bridge.sol:Bridge | -| __gap | uint256[44] | 257 | 0 | 1408 | contracts/bridge/Bridge.sol:Bridge | - -## DelegateOwner -| Name | Type | Slot | Offset | Bytes | Contract | -|----------------|-------------|------|--------|-------|----------------------------------------------| -| _initialized | uint8 | 0 | 0 | 1 | contracts/L2/DelegateOwner.sol:DelegateOwner | -| _initializing | bool | 0 | 1 | 1 | contracts/L2/DelegateOwner.sol:DelegateOwner | -| __gap | uint256[50] | 1 | 0 | 1600 | contracts/L2/DelegateOwner.sol:DelegateOwner | -| _owner | address | 51 | 0 | 20 | contracts/L2/DelegateOwner.sol:DelegateOwner | -| __gap | uint256[49] | 52 | 0 | 1568 | contracts/L2/DelegateOwner.sol:DelegateOwner | -| _pendingOwner | address | 101 | 0 | 20 | contracts/L2/DelegateOwner.sol:DelegateOwner | -| __gap | uint256[49] | 102 | 0 | 1568 | contracts/L2/DelegateOwner.sol:DelegateOwner | -| addressManager | address | 151 | 0 | 20 | contracts/L2/DelegateOwner.sol:DelegateOwner | -| __gap | uint256[49] | 152 | 0 | 1568 | contracts/L2/DelegateOwner.sol:DelegateOwner | -| __reentry | uint8 | 201 | 0 | 1 | contracts/L2/DelegateOwner.sol:DelegateOwner | -| __paused | uint8 | 201 | 1 | 1 | contracts/L2/DelegateOwner.sol:DelegateOwner | -| lastUnpausedAt | uint64 | 201 | 2 | 8 | contracts/L2/DelegateOwner.sol:DelegateOwner | -| __gap | uint256[49] | 202 | 0 | 1568 | contracts/L2/DelegateOwner.sol:DelegateOwner | -| l1ChainId | uint64 | 251 | 0 | 8 | contracts/L2/DelegateOwner.sol:DelegateOwner | -| nextTxId | uint64 | 251 | 8 | 8 | contracts/L2/DelegateOwner.sol:DelegateOwner | -| realOwner | address | 252 | 0 | 20 | contracts/L2/DelegateOwner.sol:DelegateOwner | -| __gap | uint256[48] | 253 | 0 | 1536 | contracts/L2/DelegateOwner.sol:DelegateOwner | - -## GuardianProver -| Name | Type | Slot | Offset | Bytes | Contract | -|-------------------------|-------------------------------------------------|------|--------|-------|--------------------------------------------------------| -| _initialized | uint8 | 0 | 0 | 1 | contracts/L1/provers/GuardianProver.sol:GuardianProver | -| _initializing | bool | 0 | 1 | 1 | contracts/L1/provers/GuardianProver.sol:GuardianProver | -| __gap | uint256[50] | 1 | 0 | 1600 | contracts/L1/provers/GuardianProver.sol:GuardianProver | -| _owner | address | 51 | 0 | 20 | contracts/L1/provers/GuardianProver.sol:GuardianProver | -| __gap | uint256[49] | 52 | 0 | 1568 | contracts/L1/provers/GuardianProver.sol:GuardianProver | -| _pendingOwner | address | 101 | 0 | 20 | contracts/L1/provers/GuardianProver.sol:GuardianProver | -| __gap | uint256[49] | 102 | 0 | 1568 | contracts/L1/provers/GuardianProver.sol:GuardianProver | -| addressManager | address | 151 | 0 | 20 | contracts/L1/provers/GuardianProver.sol:GuardianProver | -| __gap | uint256[49] | 152 | 0 | 1568 | contracts/L1/provers/GuardianProver.sol:GuardianProver | -| __reentry | uint8 | 201 | 0 | 1 | contracts/L1/provers/GuardianProver.sol:GuardianProver | -| __paused | uint8 | 201 | 1 | 1 | contracts/L1/provers/GuardianProver.sol:GuardianProver | -| lastUnpausedAt | uint64 | 201 | 2 | 8 | contracts/L1/provers/GuardianProver.sol:GuardianProver | -| __gap | uint256[49] | 202 | 0 | 1568 | contracts/L1/provers/GuardianProver.sol:GuardianProver | -| guardianIds | mapping(address => uint256) | 251 | 0 | 32 | contracts/L1/provers/GuardianProver.sol:GuardianProver | -| approvals | mapping(uint256 => mapping(bytes32 => uint256)) | 252 | 0 | 32 | contracts/L1/provers/GuardianProver.sol:GuardianProver | -| guardians | address[] | 253 | 0 | 32 | contracts/L1/provers/GuardianProver.sol:GuardianProver | -| version | uint32 | 254 | 0 | 4 | contracts/L1/provers/GuardianProver.sol:GuardianProver | -| minGuardians | uint32 | 254 | 4 | 4 | contracts/L1/provers/GuardianProver.sol:GuardianProver | -| provingAutoPauseEnabled | bool | 254 | 8 | 1 | contracts/L1/provers/GuardianProver.sol:GuardianProver | -| latestProofHash | mapping(uint256 => mapping(uint256 => bytes32)) | 255 | 0 | 32 | contracts/L1/provers/GuardianProver.sol:GuardianProver | -| __gap | uint256[45] | 256 | 0 | 1440 | contracts/L1/provers/GuardianProver.sol:GuardianProver | - -## TaikoToken -| Name | Type | Slot | Offset | Bytes | Contract | -|-----------------------------------------------------|---------------------------------------------------------------|------|--------|-------|-----------------------------------------| -| _initialized | uint8 | 0 | 0 | 1 | contracts/tko/TaikoToken.sol:TaikoToken | -| _initializing | bool | 0 | 1 | 1 | contracts/tko/TaikoToken.sol:TaikoToken | -| __gap | uint256[50] | 1 | 0 | 1600 | contracts/tko/TaikoToken.sol:TaikoToken | -| _owner | address | 51 | 0 | 20 | contracts/tko/TaikoToken.sol:TaikoToken | -| __gap | uint256[49] | 52 | 0 | 1568 | contracts/tko/TaikoToken.sol:TaikoToken | -| _pendingOwner | address | 101 | 0 | 20 | contracts/tko/TaikoToken.sol:TaikoToken | -| __gap | uint256[49] | 102 | 0 | 1568 | contracts/tko/TaikoToken.sol:TaikoToken | -| addressManager | address | 151 | 0 | 20 | contracts/tko/TaikoToken.sol:TaikoToken | -| __gap | uint256[49] | 152 | 0 | 1568 | contracts/tko/TaikoToken.sol:TaikoToken | -| __reentry | uint8 | 201 | 0 | 1 | contracts/tko/TaikoToken.sol:TaikoToken | -| __paused | uint8 | 201 | 1 | 1 | contracts/tko/TaikoToken.sol:TaikoToken | -| lastUnpausedAt | uint64 | 201 | 2 | 8 | contracts/tko/TaikoToken.sol:TaikoToken | -| __gap | uint256[49] | 202 | 0 | 1568 | contracts/tko/TaikoToken.sol:TaikoToken | -| __slots_previously_used_by_ERC20SnapshotUpgradeable | uint256[50] | 251 | 0 | 1600 | contracts/tko/TaikoToken.sol:TaikoToken | -| _balances | mapping(address => uint256) | 301 | 0 | 32 | contracts/tko/TaikoToken.sol:TaikoToken | -| _allowances | mapping(address => mapping(address => uint256)) | 302 | 0 | 32 | contracts/tko/TaikoToken.sol:TaikoToken | -| _totalSupply | uint256 | 303 | 0 | 32 | contracts/tko/TaikoToken.sol:TaikoToken | -| _name | string | 304 | 0 | 32 | contracts/tko/TaikoToken.sol:TaikoToken | -| _symbol | string | 305 | 0 | 32 | contracts/tko/TaikoToken.sol:TaikoToken | -| __gap | uint256[45] | 306 | 0 | 1440 | contracts/tko/TaikoToken.sol:TaikoToken | -| _hashedName | bytes32 | 351 | 0 | 32 | contracts/tko/TaikoToken.sol:TaikoToken | -| _hashedVersion | bytes32 | 352 | 0 | 32 | contracts/tko/TaikoToken.sol:TaikoToken | -| _name | string | 353 | 0 | 32 | contracts/tko/TaikoToken.sol:TaikoToken | -| _version | string | 354 | 0 | 32 | contracts/tko/TaikoToken.sol:TaikoToken | -| __gap | uint256[48] | 355 | 0 | 1536 | contracts/tko/TaikoToken.sol:TaikoToken | -| _nonces | mapping(address => struct CountersUpgradeable.Counter) | 403 | 0 | 32 | contracts/tko/TaikoToken.sol:TaikoToken | -| _PERMIT_TYPEHASH_DEPRECATED_SLOT | bytes32 | 404 | 0 | 32 | contracts/tko/TaikoToken.sol:TaikoToken | -| __gap | uint256[49] | 405 | 0 | 1568 | contracts/tko/TaikoToken.sol:TaikoToken | -| _delegates | mapping(address => address) | 454 | 0 | 32 | contracts/tko/TaikoToken.sol:TaikoToken | -| _checkpoints | mapping(address => struct ERC20VotesUpgradeable.Checkpoint[]) | 455 | 0 | 32 | contracts/tko/TaikoToken.sol:TaikoToken | -| _totalSupplyCheckpoints | struct ERC20VotesUpgradeable.Checkpoint[] | 456 | 0 | 32 | contracts/tko/TaikoToken.sol:TaikoToken | -| __gap | uint256[47] | 457 | 0 | 1504 | contracts/tko/TaikoToken.sol:TaikoToken | -| __gap | uint256[50] | 504 | 0 | 1600 | contracts/tko/TaikoToken.sol:TaikoToken | - -## BridgedTaikoToken -| Name | Type | Slot | Offset | Bytes | Contract | -|-----------------------------------------------------|---------------------------------------------------------------|------|--------|-------|-------------------------------------------------------| -| _initialized | uint8 | 0 | 0 | 1 | contracts/tko/BridgedTaikoToken.sol:BridgedTaikoToken | -| _initializing | bool | 0 | 1 | 1 | contracts/tko/BridgedTaikoToken.sol:BridgedTaikoToken | -| __gap | uint256[50] | 1 | 0 | 1600 | contracts/tko/BridgedTaikoToken.sol:BridgedTaikoToken | -| _owner | address | 51 | 0 | 20 | contracts/tko/BridgedTaikoToken.sol:BridgedTaikoToken | -| __gap | uint256[49] | 52 | 0 | 1568 | contracts/tko/BridgedTaikoToken.sol:BridgedTaikoToken | -| _pendingOwner | address | 101 | 0 | 20 | contracts/tko/BridgedTaikoToken.sol:BridgedTaikoToken | -| __gap | uint256[49] | 102 | 0 | 1568 | contracts/tko/BridgedTaikoToken.sol:BridgedTaikoToken | -| addressManager | address | 151 | 0 | 20 | contracts/tko/BridgedTaikoToken.sol:BridgedTaikoToken | -| __gap | uint256[49] | 152 | 0 | 1568 | contracts/tko/BridgedTaikoToken.sol:BridgedTaikoToken | -| __reentry | uint8 | 201 | 0 | 1 | contracts/tko/BridgedTaikoToken.sol:BridgedTaikoToken | -| __paused | uint8 | 201 | 1 | 1 | contracts/tko/BridgedTaikoToken.sol:BridgedTaikoToken | -| lastUnpausedAt | uint64 | 201 | 2 | 8 | contracts/tko/BridgedTaikoToken.sol:BridgedTaikoToken | -| __gap | uint256[49] | 202 | 0 | 1568 | contracts/tko/BridgedTaikoToken.sol:BridgedTaikoToken | -| __slots_previously_used_by_ERC20SnapshotUpgradeable | uint256[50] | 251 | 0 | 1600 | contracts/tko/BridgedTaikoToken.sol:BridgedTaikoToken | -| _balances | mapping(address => uint256) | 301 | 0 | 32 | contracts/tko/BridgedTaikoToken.sol:BridgedTaikoToken | -| _allowances | mapping(address => mapping(address => uint256)) | 302 | 0 | 32 | contracts/tko/BridgedTaikoToken.sol:BridgedTaikoToken | -| _totalSupply | uint256 | 303 | 0 | 32 | contracts/tko/BridgedTaikoToken.sol:BridgedTaikoToken | -| _name | string | 304 | 0 | 32 | contracts/tko/BridgedTaikoToken.sol:BridgedTaikoToken | -| _symbol | string | 305 | 0 | 32 | contracts/tko/BridgedTaikoToken.sol:BridgedTaikoToken | -| __gap | uint256[45] | 306 | 0 | 1440 | contracts/tko/BridgedTaikoToken.sol:BridgedTaikoToken | -| _hashedName | bytes32 | 351 | 0 | 32 | contracts/tko/BridgedTaikoToken.sol:BridgedTaikoToken | -| _hashedVersion | bytes32 | 352 | 0 | 32 | contracts/tko/BridgedTaikoToken.sol:BridgedTaikoToken | -| _name | string | 353 | 0 | 32 | contracts/tko/BridgedTaikoToken.sol:BridgedTaikoToken | -| _version | string | 354 | 0 | 32 | contracts/tko/BridgedTaikoToken.sol:BridgedTaikoToken | -| __gap | uint256[48] | 355 | 0 | 1536 | contracts/tko/BridgedTaikoToken.sol:BridgedTaikoToken | -| _nonces | mapping(address => struct CountersUpgradeable.Counter) | 403 | 0 | 32 | contracts/tko/BridgedTaikoToken.sol:BridgedTaikoToken | -| _PERMIT_TYPEHASH_DEPRECATED_SLOT | bytes32 | 404 | 0 | 32 | contracts/tko/BridgedTaikoToken.sol:BridgedTaikoToken | -| __gap | uint256[49] | 405 | 0 | 1568 | contracts/tko/BridgedTaikoToken.sol:BridgedTaikoToken | -| _delegates | mapping(address => address) | 454 | 0 | 32 | contracts/tko/BridgedTaikoToken.sol:BridgedTaikoToken | -| _checkpoints | mapping(address => struct ERC20VotesUpgradeable.Checkpoint[]) | 455 | 0 | 32 | contracts/tko/BridgedTaikoToken.sol:BridgedTaikoToken | -| _totalSupplyCheckpoints | struct ERC20VotesUpgradeable.Checkpoint[] | 456 | 0 | 32 | contracts/tko/BridgedTaikoToken.sol:BridgedTaikoToken | -| __gap | uint256[47] | 457 | 0 | 1504 | contracts/tko/BridgedTaikoToken.sol:BridgedTaikoToken | -| __gap | uint256[50] | 504 | 0 | 1600 | contracts/tko/BridgedTaikoToken.sol:BridgedTaikoToken | - -## ERC20Vault -| Name | Type | Slot | Offset | Bytes | Contract | -|--------------------|------------------------------------------------------|------|--------|-------|------------------------------------------------| -| _initialized | uint8 | 0 | 0 | 1 | contracts/tokenvault/ERC20Vault.sol:ERC20Vault | -| _initializing | bool | 0 | 1 | 1 | contracts/tokenvault/ERC20Vault.sol:ERC20Vault | -| __gap | uint256[50] | 1 | 0 | 1600 | contracts/tokenvault/ERC20Vault.sol:ERC20Vault | -| _owner | address | 51 | 0 | 20 | contracts/tokenvault/ERC20Vault.sol:ERC20Vault | -| __gap | uint256[49] | 52 | 0 | 1568 | contracts/tokenvault/ERC20Vault.sol:ERC20Vault | -| _pendingOwner | address | 101 | 0 | 20 | contracts/tokenvault/ERC20Vault.sol:ERC20Vault | -| __gap | uint256[49] | 102 | 0 | 1568 | contracts/tokenvault/ERC20Vault.sol:ERC20Vault | -| addressManager | address | 151 | 0 | 20 | contracts/tokenvault/ERC20Vault.sol:ERC20Vault | -| __gap | uint256[49] | 152 | 0 | 1568 | contracts/tokenvault/ERC20Vault.sol:ERC20Vault | -| __reentry | uint8 | 201 | 0 | 1 | contracts/tokenvault/ERC20Vault.sol:ERC20Vault | -| __paused | uint8 | 201 | 1 | 1 | contracts/tokenvault/ERC20Vault.sol:ERC20Vault | -| lastUnpausedAt | uint64 | 201 | 2 | 8 | contracts/tokenvault/ERC20Vault.sol:ERC20Vault | -| __gap | uint256[49] | 202 | 0 | 1568 | contracts/tokenvault/ERC20Vault.sol:ERC20Vault | -| __gap | uint256[50] | 251 | 0 | 1600 | contracts/tokenvault/ERC20Vault.sol:ERC20Vault | -| bridgedToCanonical | mapping(address => struct ERC20Vault.CanonicalERC20) | 301 | 0 | 32 | contracts/tokenvault/ERC20Vault.sol:ERC20Vault | -| canonicalToBridged | mapping(uint256 => mapping(address => address)) | 302 | 0 | 32 | contracts/tokenvault/ERC20Vault.sol:ERC20Vault | -| btokenDenylist | mapping(address => bool) | 303 | 0 | 32 | contracts/tokenvault/ERC20Vault.sol:ERC20Vault | -| lastMigrationStart | mapping(uint256 => mapping(address => uint256)) | 304 | 0 | 32 | contracts/tokenvault/ERC20Vault.sol:ERC20Vault | -| __gap | uint256[46] | 305 | 0 | 1472 | contracts/tokenvault/ERC20Vault.sol:ERC20Vault | - -## ERC721Vault -| Name | Type | Slot | Offset | Bytes | Contract | -|--------------------|------------------------------------------------------|------|--------|-------|--------------------------------------------------| -| _initialized | uint8 | 0 | 0 | 1 | contracts/tokenvault/ERC721Vault.sol:ERC721Vault | -| _initializing | bool | 0 | 1 | 1 | contracts/tokenvault/ERC721Vault.sol:ERC721Vault | -| __gap | uint256[50] | 1 | 0 | 1600 | contracts/tokenvault/ERC721Vault.sol:ERC721Vault | -| _owner | address | 51 | 0 | 20 | contracts/tokenvault/ERC721Vault.sol:ERC721Vault | -| __gap | uint256[49] | 52 | 0 | 1568 | contracts/tokenvault/ERC721Vault.sol:ERC721Vault | -| _pendingOwner | address | 101 | 0 | 20 | contracts/tokenvault/ERC721Vault.sol:ERC721Vault | -| __gap | uint256[49] | 102 | 0 | 1568 | contracts/tokenvault/ERC721Vault.sol:ERC721Vault | -| addressManager | address | 151 | 0 | 20 | contracts/tokenvault/ERC721Vault.sol:ERC721Vault | -| __gap | uint256[49] | 152 | 0 | 1568 | contracts/tokenvault/ERC721Vault.sol:ERC721Vault | -| __reentry | uint8 | 201 | 0 | 1 | contracts/tokenvault/ERC721Vault.sol:ERC721Vault | -| __paused | uint8 | 201 | 1 | 1 | contracts/tokenvault/ERC721Vault.sol:ERC721Vault | -| lastUnpausedAt | uint64 | 201 | 2 | 8 | contracts/tokenvault/ERC721Vault.sol:ERC721Vault | -| __gap | uint256[49] | 202 | 0 | 1568 | contracts/tokenvault/ERC721Vault.sol:ERC721Vault | -| __gap | uint256[50] | 251 | 0 | 1600 | contracts/tokenvault/ERC721Vault.sol:ERC721Vault | -| bridgedToCanonical | mapping(address => struct BaseNFTVault.CanonicalNFT) | 301 | 0 | 32 | contracts/tokenvault/ERC721Vault.sol:ERC721Vault | -| canonicalToBridged | mapping(uint256 => mapping(address => address)) | 302 | 0 | 32 | contracts/tokenvault/ERC721Vault.sol:ERC721Vault | -| __gap | uint256[48] | 303 | 0 | 1536 | contracts/tokenvault/ERC721Vault.sol:ERC721Vault | -| __gap | uint256[50] | 351 | 0 | 1600 | contracts/tokenvault/ERC721Vault.sol:ERC721Vault | - -## ERC1155Vault -| Name | Type | Slot | Offset | Bytes | Contract | -|--------------------|------------------------------------------------------|------|--------|-------|----------------------------------------------------| -| _initialized | uint8 | 0 | 0 | 1 | contracts/tokenvault/ERC1155Vault.sol:ERC1155Vault | -| _initializing | bool | 0 | 1 | 1 | contracts/tokenvault/ERC1155Vault.sol:ERC1155Vault | -| __gap | uint256[50] | 1 | 0 | 1600 | contracts/tokenvault/ERC1155Vault.sol:ERC1155Vault | -| _owner | address | 51 | 0 | 20 | contracts/tokenvault/ERC1155Vault.sol:ERC1155Vault | -| __gap | uint256[49] | 52 | 0 | 1568 | contracts/tokenvault/ERC1155Vault.sol:ERC1155Vault | -| _pendingOwner | address | 101 | 0 | 20 | contracts/tokenvault/ERC1155Vault.sol:ERC1155Vault | -| __gap | uint256[49] | 102 | 0 | 1568 | contracts/tokenvault/ERC1155Vault.sol:ERC1155Vault | -| addressManager | address | 151 | 0 | 20 | contracts/tokenvault/ERC1155Vault.sol:ERC1155Vault | -| __gap | uint256[49] | 152 | 0 | 1568 | contracts/tokenvault/ERC1155Vault.sol:ERC1155Vault | -| __reentry | uint8 | 201 | 0 | 1 | contracts/tokenvault/ERC1155Vault.sol:ERC1155Vault | -| __paused | uint8 | 201 | 1 | 1 | contracts/tokenvault/ERC1155Vault.sol:ERC1155Vault | -| lastUnpausedAt | uint64 | 201 | 2 | 8 | contracts/tokenvault/ERC1155Vault.sol:ERC1155Vault | -| __gap | uint256[49] | 202 | 0 | 1568 | contracts/tokenvault/ERC1155Vault.sol:ERC1155Vault | -| __gap | uint256[50] | 251 | 0 | 1600 | contracts/tokenvault/ERC1155Vault.sol:ERC1155Vault | -| bridgedToCanonical | mapping(address => struct BaseNFTVault.CanonicalNFT) | 301 | 0 | 32 | contracts/tokenvault/ERC1155Vault.sol:ERC1155Vault | -| canonicalToBridged | mapping(uint256 => mapping(address => address)) | 302 | 0 | 32 | contracts/tokenvault/ERC1155Vault.sol:ERC1155Vault | -| __gap | uint256[48] | 303 | 0 | 1536 | contracts/tokenvault/ERC1155Vault.sol:ERC1155Vault | -| __gap | uint256[50] | 351 | 0 | 1600 | contracts/tokenvault/ERC1155Vault.sol:ERC1155Vault | -| __gap | uint256[50] | 401 | 0 | 1600 | contracts/tokenvault/ERC1155Vault.sol:ERC1155Vault | -| __gap | uint256[50] | 451 | 0 | 1600 | contracts/tokenvault/ERC1155Vault.sol:ERC1155Vault | - -## BridgedERC20 -| Name | Type | Slot | Offset | Bytes | Contract | -|------------------|-------------------------------------------------|------|--------|-------|----------------------------------------------------| -| _initialized | uint8 | 0 | 0 | 1 | contracts/tokenvault/BridgedERC20.sol:BridgedERC20 | -| _initializing | bool | 0 | 1 | 1 | contracts/tokenvault/BridgedERC20.sol:BridgedERC20 | -| __gap | uint256[50] | 1 | 0 | 1600 | contracts/tokenvault/BridgedERC20.sol:BridgedERC20 | -| _owner | address | 51 | 0 | 20 | contracts/tokenvault/BridgedERC20.sol:BridgedERC20 | -| __gap | uint256[49] | 52 | 0 | 1568 | contracts/tokenvault/BridgedERC20.sol:BridgedERC20 | -| _pendingOwner | address | 101 | 0 | 20 | contracts/tokenvault/BridgedERC20.sol:BridgedERC20 | -| __gap | uint256[49] | 102 | 0 | 1568 | contracts/tokenvault/BridgedERC20.sol:BridgedERC20 | -| addressManager | address | 151 | 0 | 20 | contracts/tokenvault/BridgedERC20.sol:BridgedERC20 | -| __gap | uint256[49] | 152 | 0 | 1568 | contracts/tokenvault/BridgedERC20.sol:BridgedERC20 | -| __reentry | uint8 | 201 | 0 | 1 | contracts/tokenvault/BridgedERC20.sol:BridgedERC20 | -| __paused | uint8 | 201 | 1 | 1 | contracts/tokenvault/BridgedERC20.sol:BridgedERC20 | -| lastUnpausedAt | uint64 | 201 | 2 | 8 | contracts/tokenvault/BridgedERC20.sol:BridgedERC20 | -| __gap | uint256[49] | 202 | 0 | 1568 | contracts/tokenvault/BridgedERC20.sol:BridgedERC20 | -| _balances | mapping(address => uint256) | 251 | 0 | 32 | contracts/tokenvault/BridgedERC20.sol:BridgedERC20 | -| _allowances | mapping(address => mapping(address => uint256)) | 252 | 0 | 32 | contracts/tokenvault/BridgedERC20.sol:BridgedERC20 | -| _totalSupply | uint256 | 253 | 0 | 32 | contracts/tokenvault/BridgedERC20.sol:BridgedERC20 | -| _name | string | 254 | 0 | 32 | contracts/tokenvault/BridgedERC20.sol:BridgedERC20 | -| _symbol | string | 255 | 0 | 32 | contracts/tokenvault/BridgedERC20.sol:BridgedERC20 | -| __gap | uint256[45] | 256 | 0 | 1440 | contracts/tokenvault/BridgedERC20.sol:BridgedERC20 | -| srcToken | address | 301 | 0 | 20 | contracts/tokenvault/BridgedERC20.sol:BridgedERC20 | -| __srcDecimals | uint8 | 301 | 20 | 1 | contracts/tokenvault/BridgedERC20.sol:BridgedERC20 | -| srcChainId | uint256 | 302 | 0 | 32 | contracts/tokenvault/BridgedERC20.sol:BridgedERC20 | -| migratingAddress | address | 303 | 0 | 20 | contracts/tokenvault/BridgedERC20.sol:BridgedERC20 | -| migratingInbound | bool | 303 | 20 | 1 | contracts/tokenvault/BridgedERC20.sol:BridgedERC20 | -| __gap | uint256[47] | 304 | 0 | 1504 | contracts/tokenvault/BridgedERC20.sol:BridgedERC20 | - -## BridgedERC721 -| Name | Type | Slot | Offset | Bytes | Contract | -|--------------------|----------------------------------------------|------|--------|-------|------------------------------------------------------| -| _initialized | uint8 | 0 | 0 | 1 | contracts/tokenvault/BridgedERC721.sol:BridgedERC721 | -| _initializing | bool | 0 | 1 | 1 | contracts/tokenvault/BridgedERC721.sol:BridgedERC721 | -| __gap | uint256[50] | 1 | 0 | 1600 | contracts/tokenvault/BridgedERC721.sol:BridgedERC721 | -| _owner | address | 51 | 0 | 20 | contracts/tokenvault/BridgedERC721.sol:BridgedERC721 | -| __gap | uint256[49] | 52 | 0 | 1568 | contracts/tokenvault/BridgedERC721.sol:BridgedERC721 | -| _pendingOwner | address | 101 | 0 | 20 | contracts/tokenvault/BridgedERC721.sol:BridgedERC721 | -| __gap | uint256[49] | 102 | 0 | 1568 | contracts/tokenvault/BridgedERC721.sol:BridgedERC721 | -| addressManager | address | 151 | 0 | 20 | contracts/tokenvault/BridgedERC721.sol:BridgedERC721 | -| __gap | uint256[49] | 152 | 0 | 1568 | contracts/tokenvault/BridgedERC721.sol:BridgedERC721 | -| __reentry | uint8 | 201 | 0 | 1 | contracts/tokenvault/BridgedERC721.sol:BridgedERC721 | -| __paused | uint8 | 201 | 1 | 1 | contracts/tokenvault/BridgedERC721.sol:BridgedERC721 | -| lastUnpausedAt | uint64 | 201 | 2 | 8 | contracts/tokenvault/BridgedERC721.sol:BridgedERC721 | -| __gap | uint256[49] | 202 | 0 | 1568 | contracts/tokenvault/BridgedERC721.sol:BridgedERC721 | -| __gap | uint256[50] | 251 | 0 | 1600 | contracts/tokenvault/BridgedERC721.sol:BridgedERC721 | -| _name | string | 301 | 0 | 32 | contracts/tokenvault/BridgedERC721.sol:BridgedERC721 | -| _symbol | string | 302 | 0 | 32 | contracts/tokenvault/BridgedERC721.sol:BridgedERC721 | -| _owners | mapping(uint256 => address) | 303 | 0 | 32 | contracts/tokenvault/BridgedERC721.sol:BridgedERC721 | -| _balances | mapping(address => uint256) | 304 | 0 | 32 | contracts/tokenvault/BridgedERC721.sol:BridgedERC721 | -| _tokenApprovals | mapping(uint256 => address) | 305 | 0 | 32 | contracts/tokenvault/BridgedERC721.sol:BridgedERC721 | -| _operatorApprovals | mapping(address => mapping(address => bool)) | 306 | 0 | 32 | contracts/tokenvault/BridgedERC721.sol:BridgedERC721 | -| __gap | uint256[44] | 307 | 0 | 1408 | contracts/tokenvault/BridgedERC721.sol:BridgedERC721 | -| srcToken | address | 351 | 0 | 20 | contracts/tokenvault/BridgedERC721.sol:BridgedERC721 | -| srcChainId | uint256 | 352 | 0 | 32 | contracts/tokenvault/BridgedERC721.sol:BridgedERC721 | -| __gap | uint256[48] | 353 | 0 | 1536 | contracts/tokenvault/BridgedERC721.sol:BridgedERC721 | - -## BridgedERC1155 -| Name | Type | Slot | Offset | Bytes | Contract | -|--------------------|-------------------------------------------------|------|--------|-------|--------------------------------------------------------| -| _initialized | uint8 | 0 | 0 | 1 | contracts/tokenvault/BridgedERC1155.sol:BridgedERC1155 | -| _initializing | bool | 0 | 1 | 1 | contracts/tokenvault/BridgedERC1155.sol:BridgedERC1155 | -| __gap | uint256[50] | 1 | 0 | 1600 | contracts/tokenvault/BridgedERC1155.sol:BridgedERC1155 | -| _owner | address | 51 | 0 | 20 | contracts/tokenvault/BridgedERC1155.sol:BridgedERC1155 | -| __gap | uint256[49] | 52 | 0 | 1568 | contracts/tokenvault/BridgedERC1155.sol:BridgedERC1155 | -| _pendingOwner | address | 101 | 0 | 20 | contracts/tokenvault/BridgedERC1155.sol:BridgedERC1155 | -| __gap | uint256[49] | 102 | 0 | 1568 | contracts/tokenvault/BridgedERC1155.sol:BridgedERC1155 | -| addressManager | address | 151 | 0 | 20 | contracts/tokenvault/BridgedERC1155.sol:BridgedERC1155 | -| __gap | uint256[49] | 152 | 0 | 1568 | contracts/tokenvault/BridgedERC1155.sol:BridgedERC1155 | -| __reentry | uint8 | 201 | 0 | 1 | contracts/tokenvault/BridgedERC1155.sol:BridgedERC1155 | -| __paused | uint8 | 201 | 1 | 1 | contracts/tokenvault/BridgedERC1155.sol:BridgedERC1155 | -| lastUnpausedAt | uint64 | 201 | 2 | 8 | contracts/tokenvault/BridgedERC1155.sol:BridgedERC1155 | -| __gap | uint256[49] | 202 | 0 | 1568 | contracts/tokenvault/BridgedERC1155.sol:BridgedERC1155 | -| __gap | uint256[50] | 251 | 0 | 1600 | contracts/tokenvault/BridgedERC1155.sol:BridgedERC1155 | -| _balances | mapping(uint256 => mapping(address => uint256)) | 301 | 0 | 32 | contracts/tokenvault/BridgedERC1155.sol:BridgedERC1155 | -| _operatorApprovals | mapping(address => mapping(address => bool)) | 302 | 0 | 32 | contracts/tokenvault/BridgedERC1155.sol:BridgedERC1155 | -| _uri | string | 303 | 0 | 32 | contracts/tokenvault/BridgedERC1155.sol:BridgedERC1155 | -| __gap | uint256[47] | 304 | 0 | 1504 | contracts/tokenvault/BridgedERC1155.sol:BridgedERC1155 | -| srcToken | address | 351 | 0 | 20 | contracts/tokenvault/BridgedERC1155.sol:BridgedERC1155 | -| srcChainId | uint256 | 352 | 0 | 32 | contracts/tokenvault/BridgedERC1155.sol:BridgedERC1155 | -| symbol | string | 353 | 0 | 32 | contracts/tokenvault/BridgedERC1155.sol:BridgedERC1155 | -| name | string | 354 | 0 | 32 | contracts/tokenvault/BridgedERC1155.sol:BridgedERC1155 | -| __gap | uint256[46] | 355 | 0 | 1472 | contracts/tokenvault/BridgedERC1155.sol:BridgedERC1155 | - -## AssignmentHook -| Name | Type | Slot | Offset | Bytes | Contract | -|----------------|-------------|------|--------|-------|------------------------------------------------------| -| _initialized | uint8 | 0 | 0 | 1 | contracts/L1/hooks/AssignmentHook.sol:AssignmentHook | -| _initializing | bool | 0 | 1 | 1 | contracts/L1/hooks/AssignmentHook.sol:AssignmentHook | -| __gap | uint256[50] | 1 | 0 | 1600 | contracts/L1/hooks/AssignmentHook.sol:AssignmentHook | -| _owner | address | 51 | 0 | 20 | contracts/L1/hooks/AssignmentHook.sol:AssignmentHook | -| __gap | uint256[49] | 52 | 0 | 1568 | contracts/L1/hooks/AssignmentHook.sol:AssignmentHook | -| _pendingOwner | address | 101 | 0 | 20 | contracts/L1/hooks/AssignmentHook.sol:AssignmentHook | -| __gap | uint256[49] | 102 | 0 | 1568 | contracts/L1/hooks/AssignmentHook.sol:AssignmentHook | -| addressManager | address | 151 | 0 | 20 | contracts/L1/hooks/AssignmentHook.sol:AssignmentHook | -| __gap | uint256[49] | 152 | 0 | 1568 | contracts/L1/hooks/AssignmentHook.sol:AssignmentHook | -| __reentry | uint8 | 201 | 0 | 1 | contracts/L1/hooks/AssignmentHook.sol:AssignmentHook | -| __paused | uint8 | 201 | 1 | 1 | contracts/L1/hooks/AssignmentHook.sol:AssignmentHook | -| lastUnpausedAt | uint64 | 201 | 2 | 8 | contracts/L1/hooks/AssignmentHook.sol:AssignmentHook | -| __gap | uint256[49] | 202 | 0 | 1568 | contracts/L1/hooks/AssignmentHook.sol:AssignmentHook | -| __gap | uint256[50] | 251 | 0 | 1600 | contracts/L1/hooks/AssignmentHook.sol:AssignmentHook | - -## ERC20Airdrop -| Name | Type | Slot | Offset | Bytes | Contract | -|----------------|--------------------------|------|--------|-------|------------------------------------------------------| -| _initialized | uint8 | 0 | 0 | 1 | contracts/team/airdrop/ERC20Airdrop.sol:ERC20Airdrop | -| _initializing | bool | 0 | 1 | 1 | contracts/team/airdrop/ERC20Airdrop.sol:ERC20Airdrop | -| __gap | uint256[50] | 1 | 0 | 1600 | contracts/team/airdrop/ERC20Airdrop.sol:ERC20Airdrop | -| _owner | address | 51 | 0 | 20 | contracts/team/airdrop/ERC20Airdrop.sol:ERC20Airdrop | -| __gap | uint256[49] | 52 | 0 | 1568 | contracts/team/airdrop/ERC20Airdrop.sol:ERC20Airdrop | -| _pendingOwner | address | 101 | 0 | 20 | contracts/team/airdrop/ERC20Airdrop.sol:ERC20Airdrop | -| __gap | uint256[49] | 102 | 0 | 1568 | contracts/team/airdrop/ERC20Airdrop.sol:ERC20Airdrop | -| addressManager | address | 151 | 0 | 20 | contracts/team/airdrop/ERC20Airdrop.sol:ERC20Airdrop | -| __gap | uint256[49] | 152 | 0 | 1568 | contracts/team/airdrop/ERC20Airdrop.sol:ERC20Airdrop | -| __reentry | uint8 | 201 | 0 | 1 | contracts/team/airdrop/ERC20Airdrop.sol:ERC20Airdrop | -| __paused | uint8 | 201 | 1 | 1 | contracts/team/airdrop/ERC20Airdrop.sol:ERC20Airdrop | -| lastUnpausedAt | uint64 | 201 | 2 | 8 | contracts/team/airdrop/ERC20Airdrop.sol:ERC20Airdrop | -| __gap | uint256[49] | 202 | 0 | 1568 | contracts/team/airdrop/ERC20Airdrop.sol:ERC20Airdrop | -| isClaimed | mapping(bytes32 => bool) | 251 | 0 | 32 | contracts/team/airdrop/ERC20Airdrop.sol:ERC20Airdrop | -| merkleRoot | bytes32 | 252 | 0 | 32 | contracts/team/airdrop/ERC20Airdrop.sol:ERC20Airdrop | -| claimStart | uint64 | 253 | 0 | 8 | contracts/team/airdrop/ERC20Airdrop.sol:ERC20Airdrop | -| claimEnd | uint64 | 253 | 8 | 8 | contracts/team/airdrop/ERC20Airdrop.sol:ERC20Airdrop | -| __gap | uint256[47] | 254 | 0 | 1504 | contracts/team/airdrop/ERC20Airdrop.sol:ERC20Airdrop | -| token | address | 301 | 0 | 20 | contracts/team/airdrop/ERC20Airdrop.sol:ERC20Airdrop | -| vault | address | 302 | 0 | 20 | contracts/team/airdrop/ERC20Airdrop.sol:ERC20Airdrop | -| __gap | uint256[48] | 303 | 0 | 1536 | contracts/team/airdrop/ERC20Airdrop.sol:ERC20Airdrop | - -## AutomataDcapV3Attestation -| Name | Type | Slot | Offset | Bytes | Contract | -|-------------------------|-------------------------------------------------|------|--------|-------|----------------------------------------------------------------------------------------| -| _initialized | uint8 | 0 | 0 | 1 | contracts/automata-attestation/AutomataDcapV3Attestation.sol:AutomataDcapV3Attestation | -| _initializing | bool | 0 | 1 | 1 | contracts/automata-attestation/AutomataDcapV3Attestation.sol:AutomataDcapV3Attestation | -| __gap | uint256[50] | 1 | 0 | 1600 | contracts/automata-attestation/AutomataDcapV3Attestation.sol:AutomataDcapV3Attestation | -| _owner | address | 51 | 0 | 20 | contracts/automata-attestation/AutomataDcapV3Attestation.sol:AutomataDcapV3Attestation | -| __gap | uint256[49] | 52 | 0 | 1568 | contracts/automata-attestation/AutomataDcapV3Attestation.sol:AutomataDcapV3Attestation | -| _pendingOwner | address | 101 | 0 | 20 | contracts/automata-attestation/AutomataDcapV3Attestation.sol:AutomataDcapV3Attestation | -| __gap | uint256[49] | 102 | 0 | 1568 | contracts/automata-attestation/AutomataDcapV3Attestation.sol:AutomataDcapV3Attestation | -| addressManager | address | 151 | 0 | 20 | contracts/automata-attestation/AutomataDcapV3Attestation.sol:AutomataDcapV3Attestation | -| __gap | uint256[49] | 152 | 0 | 1568 | contracts/automata-attestation/AutomataDcapV3Attestation.sol:AutomataDcapV3Attestation | -| __reentry | uint8 | 201 | 0 | 1 | contracts/automata-attestation/AutomataDcapV3Attestation.sol:AutomataDcapV3Attestation | -| __paused | uint8 | 201 | 1 | 1 | contracts/automata-attestation/AutomataDcapV3Attestation.sol:AutomataDcapV3Attestation | -| lastUnpausedAt | uint64 | 201 | 2 | 8 | contracts/automata-attestation/AutomataDcapV3Attestation.sol:AutomataDcapV3Attestation | -| __gap | uint256[49] | 202 | 0 | 1568 | contracts/automata-attestation/AutomataDcapV3Attestation.sol:AutomataDcapV3Attestation | -| sigVerifyLib | contract ISigVerifyLib | 251 | 0 | 20 | contracts/automata-attestation/AutomataDcapV3Attestation.sol:AutomataDcapV3Attestation | -| pemCertLib | contract IPEMCertChainLib | 252 | 0 | 20 | contracts/automata-attestation/AutomataDcapV3Attestation.sol:AutomataDcapV3Attestation | -| checkLocalEnclaveReport | bool | 252 | 20 | 1 | contracts/automata-attestation/AutomataDcapV3Attestation.sol:AutomataDcapV3Attestation | -| trustedUserMrEnclave | mapping(bytes32 => bool) | 253 | 0 | 32 | contracts/automata-attestation/AutomataDcapV3Attestation.sol:AutomataDcapV3Attestation | -| trustedUserMrSigner | mapping(bytes32 => bool) | 254 | 0 | 32 | contracts/automata-attestation/AutomataDcapV3Attestation.sol:AutomataDcapV3Attestation | -| serialNumIsRevoked | mapping(uint256 => mapping(bytes => bool)) | 255 | 0 | 32 | contracts/automata-attestation/AutomataDcapV3Attestation.sol:AutomataDcapV3Attestation | -| tcbInfo | mapping(string => struct TCBInfoStruct.TCBInfo) | 256 | 0 | 32 | contracts/automata-attestation/AutomataDcapV3Attestation.sol:AutomataDcapV3Attestation | -| qeIdentity | struct EnclaveIdStruct.EnclaveId | 257 | 0 | 128 | contracts/automata-attestation/AutomataDcapV3Attestation.sol:AutomataDcapV3Attestation | -| __gap | uint256[39] | 261 | 0 | 1248 | contracts/automata-attestation/AutomataDcapV3Attestation.sol:AutomataDcapV3Attestation | - -## SgxVerifier -| Name | Type | Slot | Offset | Bytes | Contract | -|-------------------|-------------------------------------------------|------|--------|-------|-------------------------------------------------| -| _initialized | uint8 | 0 | 0 | 1 | contracts/verifiers/SgxVerifier.sol:SgxVerifier | -| _initializing | bool | 0 | 1 | 1 | contracts/verifiers/SgxVerifier.sol:SgxVerifier | -| __gap | uint256[50] | 1 | 0 | 1600 | contracts/verifiers/SgxVerifier.sol:SgxVerifier | -| _owner | address | 51 | 0 | 20 | contracts/verifiers/SgxVerifier.sol:SgxVerifier | -| __gap | uint256[49] | 52 | 0 | 1568 | contracts/verifiers/SgxVerifier.sol:SgxVerifier | -| _pendingOwner | address | 101 | 0 | 20 | contracts/verifiers/SgxVerifier.sol:SgxVerifier | -| __gap | uint256[49] | 102 | 0 | 1568 | contracts/verifiers/SgxVerifier.sol:SgxVerifier | -| addressManager | address | 151 | 0 | 20 | contracts/verifiers/SgxVerifier.sol:SgxVerifier | -| __gap | uint256[49] | 152 | 0 | 1568 | contracts/verifiers/SgxVerifier.sol:SgxVerifier | -| __reentry | uint8 | 201 | 0 | 1 | contracts/verifiers/SgxVerifier.sol:SgxVerifier | -| __paused | uint8 | 201 | 1 | 1 | contracts/verifiers/SgxVerifier.sol:SgxVerifier | -| lastUnpausedAt | uint64 | 201 | 2 | 8 | contracts/verifiers/SgxVerifier.sol:SgxVerifier | -| __gap | uint256[49] | 202 | 0 | 1568 | contracts/verifiers/SgxVerifier.sol:SgxVerifier | -| nextInstanceId | uint256 | 251 | 0 | 32 | contracts/verifiers/SgxVerifier.sol:SgxVerifier | -| instances | mapping(uint256 => struct SgxVerifier.Instance) | 252 | 0 | 32 | contracts/verifiers/SgxVerifier.sol:SgxVerifier | -| addressRegistered | mapping(address => bool) | 253 | 0 | 32 | contracts/verifiers/SgxVerifier.sol:SgxVerifier | -| __gap | uint256[47] | 254 | 0 | 1504 | contracts/verifiers/SgxVerifier.sol:SgxVerifier | - -## RiscZeroVerifier -| Name | Type | Slot | Offset | Bytes | Contract | -|-----------------|-----------------------------------|------|--------|-------|-----------------------------------------------------------| -| _initialized | uint8 | 0 | 0 | 1 | contracts/verifiers/RiscZeroVerifier.sol:RiscZeroVerifier | -| _initializing | bool | 0 | 1 | 1 | contracts/verifiers/RiscZeroVerifier.sol:RiscZeroVerifier | -| __gap | uint256[50] | 1 | 0 | 1600 | contracts/verifiers/RiscZeroVerifier.sol:RiscZeroVerifier | -| _owner | address | 51 | 0 | 20 | contracts/verifiers/RiscZeroVerifier.sol:RiscZeroVerifier | -| __gap | uint256[49] | 52 | 0 | 1568 | contracts/verifiers/RiscZeroVerifier.sol:RiscZeroVerifier | -| _pendingOwner | address | 101 | 0 | 20 | contracts/verifiers/RiscZeroVerifier.sol:RiscZeroVerifier | -| __gap | uint256[49] | 102 | 0 | 1568 | contracts/verifiers/RiscZeroVerifier.sol:RiscZeroVerifier | -| addressManager | address | 151 | 0 | 20 | contracts/verifiers/RiscZeroVerifier.sol:RiscZeroVerifier | -| __gap | uint256[49] | 152 | 0 | 1568 | contracts/verifiers/RiscZeroVerifier.sol:RiscZeroVerifier | -| __reentry | uint8 | 201 | 0 | 1 | contracts/verifiers/RiscZeroVerifier.sol:RiscZeroVerifier | -| __paused | uint8 | 201 | 1 | 1 | contracts/verifiers/RiscZeroVerifier.sol:RiscZeroVerifier | -| lastUnpausedAt | uint64 | 201 | 2 | 8 | contracts/verifiers/RiscZeroVerifier.sol:RiscZeroVerifier | -| __gap | uint256[49] | 202 | 0 | 1568 | contracts/verifiers/RiscZeroVerifier.sol:RiscZeroVerifier | -| receiptVerifier | contract IRiscZeroReceiptVerifier | 251 | 0 | 20 | contracts/verifiers/RiscZeroVerifier.sol:RiscZeroVerifier | -| isImageTrusted | mapping(bytes32 => bool) | 252 | 0 | 32 | contracts/verifiers/RiscZeroVerifier.sol:RiscZeroVerifier | -| __gap | uint256[48] | 253 | 0 | 1536 | contracts/verifiers/RiscZeroVerifier.sol:RiscZeroVerifier | - -## QuotaManager -| Name | Type | Slot | Offset | Bytes | Contract | -|----------------|-----------------------------------------------|------|--------|-------|------------------------------------------------| -| _initialized | uint8 | 0 | 0 | 1 | contracts/bridge/QuotaManager.sol:QuotaManager | -| _initializing | bool | 0 | 1 | 1 | contracts/bridge/QuotaManager.sol:QuotaManager | -| __gap | uint256[50] | 1 | 0 | 1600 | contracts/bridge/QuotaManager.sol:QuotaManager | -| _owner | address | 51 | 0 | 20 | contracts/bridge/QuotaManager.sol:QuotaManager | -| __gap | uint256[49] | 52 | 0 | 1568 | contracts/bridge/QuotaManager.sol:QuotaManager | -| _pendingOwner | address | 101 | 0 | 20 | contracts/bridge/QuotaManager.sol:QuotaManager | -| __gap | uint256[49] | 102 | 0 | 1568 | contracts/bridge/QuotaManager.sol:QuotaManager | -| addressManager | address | 151 | 0 | 20 | contracts/bridge/QuotaManager.sol:QuotaManager | -| __gap | uint256[49] | 152 | 0 | 1568 | contracts/bridge/QuotaManager.sol:QuotaManager | -| __reentry | uint8 | 201 | 0 | 1 | contracts/bridge/QuotaManager.sol:QuotaManager | -| __paused | uint8 | 201 | 1 | 1 | contracts/bridge/QuotaManager.sol:QuotaManager | -| lastUnpausedAt | uint64 | 201 | 2 | 8 | contracts/bridge/QuotaManager.sol:QuotaManager | -| __gap | uint256[49] | 202 | 0 | 1568 | contracts/bridge/QuotaManager.sol:QuotaManager | -| tokenQuota | mapping(address => struct QuotaManager.Quota) | 251 | 0 | 32 | contracts/bridge/QuotaManager.sol:QuotaManager | -| quotaPeriod | uint24 | 252 | 0 | 3 | contracts/bridge/QuotaManager.sol:QuotaManager | -| __gap | uint256[48] | 253 | 0 | 1536 | contracts/bridge/QuotaManager.sol:QuotaManager | - -## ProverSet -| Name | Type | Slot | Offset | Bytes | Contract | -|----------------|--------------------------|------|--------|-------|------------------------------------------------| -| _initialized | uint8 | 0 | 0 | 1 | contracts/team/proving/ProverSet.sol:ProverSet | -| _initializing | bool | 0 | 1 | 1 | contracts/team/proving/ProverSet.sol:ProverSet | -| __gap | uint256[50] | 1 | 0 | 1600 | contracts/team/proving/ProverSet.sol:ProverSet | -| _owner | address | 51 | 0 | 20 | contracts/team/proving/ProverSet.sol:ProverSet | -| __gap | uint256[49] | 52 | 0 | 1568 | contracts/team/proving/ProverSet.sol:ProverSet | -| _pendingOwner | address | 101 | 0 | 20 | contracts/team/proving/ProverSet.sol:ProverSet | -| __gap | uint256[49] | 102 | 0 | 1568 | contracts/team/proving/ProverSet.sol:ProverSet | -| addressManager | address | 151 | 0 | 20 | contracts/team/proving/ProverSet.sol:ProverSet | -| __gap | uint256[49] | 152 | 0 | 1568 | contracts/team/proving/ProverSet.sol:ProverSet | -| __reentry | uint8 | 201 | 0 | 1 | contracts/team/proving/ProverSet.sol:ProverSet | -| __paused | uint8 | 201 | 1 | 1 | contracts/team/proving/ProverSet.sol:ProverSet | -| lastUnpausedAt | uint64 | 201 | 2 | 8 | contracts/team/proving/ProverSet.sol:ProverSet | -| __gap | uint256[49] | 202 | 0 | 1568 | contracts/team/proving/ProverSet.sol:ProverSet | -| isProver | mapping(address => bool) | 251 | 0 | 32 | contracts/team/proving/ProverSet.sol:ProverSet | -| admin | address | 252 | 0 | 20 | contracts/team/proving/ProverSet.sol:ProverSet | -| __gap | uint256[48] | 253 | 0 | 1536 | contracts/team/proving/ProverSet.sol:ProverSet | - -## TokenUnlock -| Name | Type | Slot | Offset | Bytes | Contract | -|----------------|--------------------------|------|--------|-------|--------------------------------------------------------| -| _initialized | uint8 | 0 | 0 | 1 | contracts/team/tokenunlock/TokenUnlock.sol:TokenUnlock | -| _initializing | bool | 0 | 1 | 1 | contracts/team/tokenunlock/TokenUnlock.sol:TokenUnlock | -| __gap | uint256[50] | 1 | 0 | 1600 | contracts/team/tokenunlock/TokenUnlock.sol:TokenUnlock | -| _owner | address | 51 | 0 | 20 | contracts/team/tokenunlock/TokenUnlock.sol:TokenUnlock | -| __gap | uint256[49] | 52 | 0 | 1568 | contracts/team/tokenunlock/TokenUnlock.sol:TokenUnlock | -| _pendingOwner | address | 101 | 0 | 20 | contracts/team/tokenunlock/TokenUnlock.sol:TokenUnlock | -| __gap | uint256[49] | 102 | 0 | 1568 | contracts/team/tokenunlock/TokenUnlock.sol:TokenUnlock | -| addressManager | address | 151 | 0 | 20 | contracts/team/tokenunlock/TokenUnlock.sol:TokenUnlock | -| __gap | uint256[49] | 152 | 0 | 1568 | contracts/team/tokenunlock/TokenUnlock.sol:TokenUnlock | -| __reentry | uint8 | 201 | 0 | 1 | contracts/team/tokenunlock/TokenUnlock.sol:TokenUnlock | -| __paused | uint8 | 201 | 1 | 1 | contracts/team/tokenunlock/TokenUnlock.sol:TokenUnlock | -| lastUnpausedAt | uint64 | 201 | 2 | 8 | contracts/team/tokenunlock/TokenUnlock.sol:TokenUnlock | -| __gap | uint256[49] | 202 | 0 | 1568 | contracts/team/tokenunlock/TokenUnlock.sol:TokenUnlock | -| amountVested | uint256 | 251 | 0 | 32 | contracts/team/tokenunlock/TokenUnlock.sol:TokenUnlock | -| recipient | address | 252 | 0 | 20 | contracts/team/tokenunlock/TokenUnlock.sol:TokenUnlock | -| tgeTimestamp | uint64 | 252 | 20 | 8 | contracts/team/tokenunlock/TokenUnlock.sol:TokenUnlock | -| isProverSet | mapping(address => bool) | 253 | 0 | 32 | contracts/team/tokenunlock/TokenUnlock.sol:TokenUnlock | -| __gap | uint256[47] | 254 | 0 | 1504 | contracts/team/tokenunlock/TokenUnlock.sol:TokenUnlock | - diff --git a/packages/protocol/contract_layout_layer1.md b/packages/protocol/contract_layout_layer1.md new file mode 100644 index 00000000000..c5392a2e241 --- /dev/null +++ b/packages/protocol/contract_layout_layer1.md @@ -0,0 +1,1828 @@ +## ERC1155Vault + +╭--------------------+------------------------------------------------------+------+--------+-------+-----------------------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++===============================================================================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| **gap | uint256[50] | 1 | 0 | 1600 | +| +| \_owner | address | 51 | 0 | 20 | +| +| **gap | uint256[49] | 52 | 0 | 1568 | +| +| \_pendingOwner | address | 101 | 0 | 20 | +| +| **gap | uint256[49] | 102 | 0 | 1568 | +| +| addressManager | address | 151 | 0 | 20 | +| +| **gap | uint256[49] | 152 | 0 | 1568 | +| +| **reentry | uint8 | 201 | 0 | 1 | +| +| **paused | uint8 | 201 | 1 | 1 | +| +| **lastUnpausedAt | uint64 | 201 | 2 | 8 | +| +| **gap | uint256[49] | 202 | 0 | 1568 | +| +| **gap | uint256[50] | 251 | 0 | 1600 | +| +| bridgedToCanonical | mapping(address => struct BaseNFTVault.CanonicalNFT) | 301 | 0 | 32 | +| +| canonicalToBridged | mapping(uint256 => mapping(address => address)) | 302 | 0 | 32 | +| +| **gap | uint256[48] | 303 | 0 | 1536 | +| +| **gap | uint256[50] | 351 | 0 | 1600 | +| +| **gap | uint256[50] | 401 | 0 | 1600 | +| +| \_\_gap | uint256[50] | 451 | 0 | 1600 | +╰--------------------+------------------------------------------------------+------+--------+-------+-----------------------------------------------------------╯ + +## ERC20Vault + +╭--------------------+------------------------------------------------------+------+--------+-------+-------------------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++===========================================================================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| **gap | uint256[50] | 1 | 0 | 1600 | +| +| \_owner | address | 51 | 0 | 20 | +| +| **gap | uint256[49] | 52 | 0 | 1568 | +| +| \_pendingOwner | address | 101 | 0 | 20 | +| +| **gap | uint256[49] | 102 | 0 | 1568 | +| +| addressManager | address | 151 | 0 | 20 | +| +| **gap | uint256[49] | 152 | 0 | 1568 | +| +| **reentry | uint8 | 201 | 0 | 1 | +| +| **paused | uint8 | 201 | 1 | 1 | +| +| **lastUnpausedAt | uint64 | 201 | 2 | 8 | +| +| **gap | uint256[49] | 202 | 0 | 1568 | +| +| **gap | uint256[50] | 251 | 0 | 1600 | +| +| bridgedToCanonical | mapping(address => struct ERC20Vault.CanonicalERC20) | 301 | 0 | 32 | +| +| canonicalToBridged | mapping(uint256 => mapping(address => address)) | 302 | 0 | 32 | +| +| btokenDenylist | mapping(address => bool) | 303 | 0 | 32 | +| +| lastMigrationStart | mapping(uint256 => mapping(address => uint256)) | 304 | 0 | 32 | +| +| **gap | uint256[46] | 305 | 0 | 1472 | +╰--------------------+------------------------------------------------------+------+--------+-------+-------------------------------------------------------╯ + +## ERC721Vault + +╭--------------------+------------------------------------------------------+------+--------+-------+---------------------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++=============================================================================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| **gap | uint256[50] | 1 | 0 | 1600 | +| +| \_owner | address | 51 | 0 | 20 | +| +| **gap | uint256[49] | 52 | 0 | 1568 | +| +| \_pendingOwner | address | 101 | 0 | 20 | +| +| **gap | uint256[49] | 102 | 0 | 1568 | +| +| addressManager | address | 151 | 0 | 20 | +| +| **gap | uint256[49] | 152 | 0 | 1568 | +| +| **reentry | uint8 | 201 | 0 | 1 | +| +| **paused | uint8 | 201 | 1 | 1 | +| +| **lastUnpausedAt | uint64 | 201 | 2 | 8 | +| +| **gap | uint256[49] | 202 | 0 | 1568 | +| +| **gap | uint256[50] | 251 | 0 | 1600 | +| +| bridgedToCanonical | mapping(address => struct BaseNFTVault.CanonicalNFT) | 301 | 0 | 32 | +| +| canonicalToBridged | mapping(uint256 => mapping(address => address)) | 302 | 0 | 32 | +| +| **gap | uint256[48] | 303 | 0 | 1536 | +| +| \_\_gap | uint256[50] | 351 | 0 | 1600 | +╰--------------------+------------------------------------------------------+------+--------+-------+---------------------------------------------------------╯ + +## BridgedERC20 + +╭------------------+-------------------------------------------------+------+--------+-------+-----------------------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++========================================================================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| **gap | uint256[50] | 1 | 0 | 1600 | +| +| \_owner | address | 51 | 0 | 20 | +| +| **gap | uint256[49] | 52 | 0 | 1568 | +| +| \_pendingOwner | address | 101 | 0 | 20 | +| +| **gap | uint256[49] | 102 | 0 | 1568 | +| +| addressManager | address | 151 | 0 | 20 | +| +| **gap | uint256[49] | 152 | 0 | 1568 | +| +| **reentry | uint8 | 201 | 0 | 1 | +| +| **paused | uint8 | 201 | 1 | 1 | +| +| **lastUnpausedAt | uint64 | 201 | 2 | 8 | +| +| **gap | uint256[49] | 202 | 0 | 1568 | +| +| \_balances | mapping(address => uint256) | 251 | 0 | 32 | +| +| \_allowances | mapping(address => mapping(address => uint256)) | 252 | 0 | 32 | +| +| \_totalSupply | uint256 | 253 | 0 | 32 | +| +| \_name | string | 254 | 0 | 32 | +| +| \_symbol | string | 255 | 0 | 32 | +| +| **gap | uint256[45] | 256 | 0 | 1440 | +| +| srcToken | address | 301 | 0 | 20 | +| +| **srcDecimals | uint8 | 301 | 20 | 1 | +| +| srcChainId | uint256 | 302 | 0 | 32 | +| +| migratingAddress | address | 303 | 0 | 20 | +| +| migratingInbound | bool | 303 | 20 | 1 | +| +| \_\_gap | uint256[47] | 304 | 0 | 1504 | +╰------------------+-------------------------------------------------+------+--------+-------+-----------------------------------------------------------╯ + +## BridgedERC20V2 + +╭------------------+--------------------------------------------------------+------+--------+-------+---------------------------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++===================================================================================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| **gap | uint256[50] | 1 | 0 | 1600 | +| +| \_owner | address | 51 | 0 | 20 | +| +| **gap | uint256[49] | 52 | 0 | 1568 | +| +| \_pendingOwner | address | 101 | 0 | 20 | +| +| **gap | uint256[49] | 102 | 0 | 1568 | +| +| addressManager | address | 151 | 0 | 20 | +| +| **gap | uint256[49] | 152 | 0 | 1568 | +| +| **reentry | uint8 | 201 | 0 | 1 | +| +| **paused | uint8 | 201 | 1 | 1 | +| +| **lastUnpausedAt | uint64 | 201 | 2 | 8 | +| +| **gap | uint256[49] | 202 | 0 | 1568 | +| +| \_balances | mapping(address => uint256) | 251 | 0 | 32 | +| +| \_allowances | mapping(address => mapping(address => uint256)) | 252 | 0 | 32 | +| +| \_totalSupply | uint256 | 253 | 0 | 32 | +| +| \_name | string | 254 | 0 | 32 | +| +| \_symbol | string | 255 | 0 | 32 | +| +| **gap | uint256[45] | 256 | 0 | 1440 | +| +| srcToken | address | 301 | 0 | 20 | +| +| **srcDecimals | uint8 | 301 | 20 | 1 | +| +| srcChainId | uint256 | 302 | 0 | 32 | +| +| migratingAddress | address | 303 | 0 | 20 | +| +| migratingInbound | bool | 303 | 20 | 1 | +| +| **gap | uint256[47] | 304 | 0 | 1504 | +| +| \_hashedName | bytes32 | 351 | 0 | 32 | +| +| \_hashedVersion | bytes32 | 352 | 0 | 32 | +| +| \_name | string | 353 | 0 | 32 | +| +| \_version | string | 354 | 0 | 32 | +| +| **gap | uint256[48] | 355 | 0 | 1536 | +| +| \_nonces | mapping(address => struct CountersUpgradeable.Counter) | 403 | 0 | 32 | +| +| \_\_gap | uint256[49] | 404 | 0 | 1568 | +╰------------------+--------------------------------------------------------+------+--------+-------+---------------------------------------------------------------╯ + +## BridgedERC721 + +╭--------------------+----------------------------------------------+------+--------+-------+-------------------------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++=========================================================================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| **gap | uint256[50] | 1 | 0 | 1600 | +| +| \_owner | address | 51 | 0 | 20 | +| +| **gap | uint256[49] | 52 | 0 | 1568 | +| +| \_pendingOwner | address | 101 | 0 | 20 | +| +| **gap | uint256[49] | 102 | 0 | 1568 | +| +| addressManager | address | 151 | 0 | 20 | +| +| **gap | uint256[49] | 152 | 0 | 1568 | +| +| **reentry | uint8 | 201 | 0 | 1 | +| +| **paused | uint8 | 201 | 1 | 1 | +| +| **lastUnpausedAt | uint64 | 201 | 2 | 8 | +| +| **gap | uint256[49] | 202 | 0 | 1568 | +| +| **gap | uint256[50] | 251 | 0 | 1600 | +| +| \_name | string | 301 | 0 | 32 | +| +| \_symbol | string | 302 | 0 | 32 | +| +| \_owners | mapping(uint256 => address) | 303 | 0 | 32 | +| +| \_balances | mapping(address => uint256) | 304 | 0 | 32 | +| +| \_tokenApprovals | mapping(uint256 => address) | 305 | 0 | 32 | +| +| \_operatorApprovals | mapping(address => mapping(address => bool)) | 306 | 0 | 32 | +| +| **gap | uint256[44] | 307 | 0 | 1408 | +| +| srcToken | address | 351 | 0 | 20 | +| +| srcChainId | uint256 | 352 | 0 | 32 | +| +| \_\_gap | uint256[48] | 353 | 0 | 1536 | +╰--------------------+----------------------------------------------+------+--------+-------+-------------------------------------------------------------╯ + +## BridgedERC1155 + +╭--------------------+-------------------------------------------------+------+--------+-------+---------------------------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++==============================================================================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| **gap | uint256[50] | 1 | 0 | 1600 | +| +| \_owner | address | 51 | 0 | 20 | +| +| **gap | uint256[49] | 52 | 0 | 1568 | +| +| \_pendingOwner | address | 101 | 0 | 20 | +| +| **gap | uint256[49] | 102 | 0 | 1568 | +| +| addressManager | address | 151 | 0 | 20 | +| +| **gap | uint256[49] | 152 | 0 | 1568 | +| +| **reentry | uint8 | 201 | 0 | 1 | +| +| **paused | uint8 | 201 | 1 | 1 | +| +| **lastUnpausedAt | uint64 | 201 | 2 | 8 | +| +| **gap | uint256[49] | 202 | 0 | 1568 | +| +| **gap | uint256[50] | 251 | 0 | 1600 | +| +| \_balances | mapping(uint256 => mapping(address => uint256)) | 301 | 0 | 32 | +| +| \_operatorApprovals | mapping(address => mapping(address => bool)) | 302 | 0 | 32 | +| +| \_uri | string | 303 | 0 | 32 | +| +| **gap | uint256[47] | 304 | 0 | 1504 | +| +| srcToken | address | 351 | 0 | 20 | +| +| srcChainId | uint256 | 352 | 0 | 32 | +| +| symbol | string | 353 | 0 | 32 | +| +| name | string | 354 | 0 | 32 | +| +| \_\_gap | uint256[46] | 355 | 0 | 1472 | +╰--------------------+-------------------------------------------------+------+--------+-------+---------------------------------------------------------------╯ + +## Bridge + +╭------------------+-----------------------------------------+------+--------+-------+-------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++================================================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| **gap | uint256[50] | 1 | 0 | 1600 | +| +| \_owner | address | 51 | 0 | 20 | +| +| **gap | uint256[49] | 52 | 0 | 1568 | +| +| \_pendingOwner | address | 101 | 0 | 20 | +| +| **gap | uint256[49] | 102 | 0 | 1568 | +| +| addressManager | address | 151 | 0 | 20 | +| +| **gap | uint256[49] | 152 | 0 | 1568 | +| +| **reentry | uint8 | 201 | 0 | 1 | +| +| **paused | uint8 | 201 | 1 | 1 | +| +| **lastUnpausedAt | uint64 | 201 | 2 | 8 | +| +| **gap | uint256[49] | 202 | 0 | 1568 | +| +| **reserved1 | uint64 | 251 | 0 | 8 | +| +| nextMessageId | uint64 | 251 | 8 | 8 | +| +| messageStatus | mapping(bytes32 => enum IBridge.Status) | 252 | 0 | 32 | +| +| **ctx | struct IBridge.Context | 253 | 0 | 64 | +| +| **reserved2 | uint256 | 255 | 0 | 32 | +| +| **reserved3 | uint256 | 256 | 0 | 32 | +| +| \_\_gap | uint256[44] | 257 | 0 | 1408 | +╰------------------+-----------------------------------------+------+--------+-------+-------------------------------------------╯ + +## QuotaManager + +╭------------------+-----------------------------------------------+------+--------+-------+-------------------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++==================================================================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| **gap | uint256[50] | 1 | 0 | 1600 | +| +| \_owner | address | 51 | 0 | 20 | +| +| **gap | uint256[49] | 52 | 0 | 1568 | +| +| \_pendingOwner | address | 101 | 0 | 20 | +| +| **gap | uint256[49] | 102 | 0 | 1568 | +| +| addressManager | address | 151 | 0 | 20 | +| +| **gap | uint256[49] | 152 | 0 | 1568 | +| +| **reentry | uint8 | 201 | 0 | 1 | +| +| **paused | uint8 | 201 | 1 | 1 | +| +| **lastUnpausedAt | uint64 | 201 | 2 | 8 | +| +| **gap | uint256[49] | 202 | 0 | 1568 | +| +| tokenQuota | mapping(address => struct QuotaManager.Quota) | 251 | 0 | 32 | +| +| quotaPeriod | uint24 | 252 | 0 | 3 | +| +| \_\_gap | uint256[48] | 253 | 0 | 1536 | +╰------------------+-----------------------------------------------+------+--------+-------+-------------------------------------------------------╯ + +## AddressManager + +╭------------------+-------------------------------------------------+------+--------+-------+-----------------------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++========================================================================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| **gap | uint256[50] | 1 | 0 | 1600 | +| +| \_owner | address | 51 | 0 | 20 | +| +| **gap | uint256[49] | 52 | 0 | 1568 | +| +| \_pendingOwner | address | 101 | 0 | 20 | +| +| **gap | uint256[49] | 102 | 0 | 1568 | +| +| addressManager | address | 151 | 0 | 20 | +| +| **gap | uint256[49] | 152 | 0 | 1568 | +| +| **reentry | uint8 | 201 | 0 | 1 | +| +| **paused | uint8 | 201 | 1 | 1 | +| +| **lastUnpausedAt | uint64 | 201 | 2 | 8 | +| +| **gap | uint256[49] | 202 | 0 | 1568 | +| +| **addresses | mapping(uint256 => mapping(bytes32 => address)) | 251 | 0 | 32 | +| +| **gap | uint256[49] | 252 | 0 | 1568 | +╰------------------+-------------------------------------------------+------+--------+-------+-----------------------------------------------------------╯ + +## AddressResolver + +╭----------------+-------------+------+--------+-------+-------------------------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++====================================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| addressManager | address | 0 | 2 | 20 | +| +| \_\_gap | uint256[49] | 1 | 0 | 1568 | +╰----------------+-------------+------+--------+-------+-------------------------------------------------------------╯ + +## EssentialContract + +╭------------------+-------------+------+--------+-------+-----------------------------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++==========================================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| **gap | uint256[50] | 1 | 0 | 1600 | +| +| \_owner | address | 51 | 0 | 20 | +| +| **gap | uint256[49] | 52 | 0 | 1568 | +| +| \_pendingOwner | address | 101 | 0 | 20 | +| +| **gap | uint256[49] | 102 | 0 | 1568 | +| +| addressManager | address | 151 | 0 | 20 | +| +| **gap | uint256[49] | 152 | 0 | 1568 | +| +| **reentry | uint8 | 201 | 0 | 1 | +| +| **paused | uint8 | 201 | 1 | 1 | +| +| **lastUnpausedAt | uint64 | 201 | 2 | 8 | +| +| **gap | uint256[49] | 202 | 0 | 1568 | +╰------------------+-------------+------+--------+-------+-----------------------------------------------------------------╯ + +## SignalService + +╭------------------+-----------------------------------------------+------+--------+-------+---------------------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++====================================================================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| **gap | uint256[50] | 1 | 0 | 1600 | +| +| \_owner | address | 51 | 0 | 20 | +| +| **gap | uint256[49] | 52 | 0 | 1568 | +| +| \_pendingOwner | address | 101 | 0 | 20 | +| +| **gap | uint256[49] | 102 | 0 | 1568 | +| +| addressManager | address | 151 | 0 | 20 | +| +| **gap | uint256[49] | 152 | 0 | 1568 | +| +| **reentry | uint8 | 201 | 0 | 1 | +| +| **paused | uint8 | 201 | 1 | 1 | +| +| **lastUnpausedAt | uint64 | 201 | 2 | 8 | +| +| **gap | uint256[49] | 202 | 0 | 1568 | +| +| topBlockId | mapping(uint64 => mapping(bytes32 => uint64)) | 251 | 0 | 32 | +| +| isAuthorized | mapping(address => bool) | 252 | 0 | 32 | +| +| \_\_gap | uint256[48] | 253 | 0 | 1536 | +╰------------------+-----------------------------------------------+------+--------+-------+---------------------------------------------------------╯ + +## TaikoToken + +╭-----------------------------------------------------+---------------------------------------------------------------+------+--------+-------+--------------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++================================================================================================================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| **gap | uint256[50] | 1 | 0 | 1600 | +| +| \_owner | address | 51 | 0 | 20 | +| +| **gap | uint256[49] | 52 | 0 | 1568 | +| +| \_pendingOwner | address | 101 | 0 | 20 | +| +| **gap | uint256[49] | 102 | 0 | 1568 | +| +| addressManager | address | 151 | 0 | 20 | +| +| **gap | uint256[49] | 152 | 0 | 1568 | +| +| **reentry | uint8 | 201 | 0 | 1 | +| +| **paused | uint8 | 201 | 1 | 1 | +| +| **lastUnpausedAt | uint64 | 201 | 2 | 8 | +| +| **gap | uint256[49] | 202 | 0 | 1568 | +| +| **slots_previously_used_by_ERC20SnapshotUpgradeable | uint256[50] | 251 | 0 | 1600 | +| +| \_balances | mapping(address => uint256) | 301 | 0 | 32 | +| +| \_allowances | mapping(address => mapping(address => uint256)) | 302 | 0 | 32 | +| +| \_totalSupply | uint256 | 303 | 0 | 32 | +| +| \_name | string | 304 | 0 | 32 | +| +| \_symbol | string | 305 | 0 | 32 | +| +| **gap | uint256[45] | 306 | 0 | 1440 | +| +| \_hashedName | bytes32 | 351 | 0 | 32 | +| +| \_hashedVersion | bytes32 | 352 | 0 | 32 | +| +| \_name | string | 353 | 0 | 32 | +| +| \_version | string | 354 | 0 | 32 | +| +| **gap | uint256[48] | 355 | 0 | 1536 | +| +| \_nonces | mapping(address => struct CountersUpgradeable.Counter) | 403 | 0 | 32 | +| +| \_PERMIT_TYPEHASH_DEPRECATED_SLOT | bytes32 | 404 | 0 | 32 | +| +| **gap | uint256[49] | 405 | 0 | 1568 | +| +| \_delegates | mapping(address => address) | 454 | 0 | 32 | +| +| \_checkpoints | mapping(address => struct ERC20VotesUpgradeable.Checkpoint[]) | 455 | 0 | 32 | +| +| \_totalSupplyCheckpoints | struct ERC20VotesUpgradeable.Checkpoint[] | 456 | 0 | 32 | +| +| **gap | uint256[47] | 457 | 0 | 1504 | +| +| **gap | uint256[50] | 504 | 0 | 1600 | +╰-----------------------------------------------------+---------------------------------------------------------------+------+--------+-------+--------------------------------------------------╯ + +## ComposeVerifier + +╭------------------+-------------+------+--------+-------+------------------------------------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++=================================================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| **gap | uint256[50] | 1 | 0 | 1600 | +| +| \_owner | address | 51 | 0 | 20 | +| +| **gap | uint256[49] | 52 | 0 | 1568 | +| +| \_pendingOwner | address | 101 | 0 | 20 | +| +| **gap | uint256[49] | 102 | 0 | 1568 | +| +| addressManager | address | 151 | 0 | 20 | +| +| **gap | uint256[49] | 152 | 0 | 1568 | +| +| **reentry | uint8 | 201 | 0 | 1 | +| +| **paused | uint8 | 201 | 1 | 1 | +| +| **lastUnpausedAt | uint64 | 201 | 2 | 8 | +| +| **gap | uint256[49] | 202 | 0 | 1568 | +| +| \_\_gap | uint256[50] | 251 | 0 | 1600 | +╰------------------+-------------+------+--------+-------+------------------------------------------------------------------------╯ + +## TeeAnyVerifier + +╭------------------+-------------+------+--------+-------+----------------------------------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++===============================================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| **gap | uint256[50] | 1 | 0 | 1600 | +| +| \_owner | address | 51 | 0 | 20 | +| +| **gap | uint256[49] | 52 | 0 | 1568 | +| +| \_pendingOwner | address | 101 | 0 | 20 | +| +| **gap | uint256[49] | 102 | 0 | 1568 | +| +| addressManager | address | 151 | 0 | 20 | +| +| **gap | uint256[49] | 152 | 0 | 1568 | +| +| **reentry | uint8 | 201 | 0 | 1 | +| +| **paused | uint8 | 201 | 1 | 1 | +| +| **lastUnpausedAt | uint64 | 201 | 2 | 8 | +| +| **gap | uint256[49] | 202 | 0 | 1568 | +| +| **gap | uint256[50] | 251 | 0 | 1600 | +| +| **gap | uint256[50] | 301 | 0 | 1600 | +╰------------------+-------------+------+--------+-------+----------------------------------------------------------------------╯ + +## ZkAndTeeVerifier + +╭------------------+-------------+------+--------+-------+--------------------------------------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++===================================================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| **gap | uint256[50] | 1 | 0 | 1600 | +| +| \_owner | address | 51 | 0 | 20 | +| +| **gap | uint256[49] | 52 | 0 | 1568 | +| +| \_pendingOwner | address | 101 | 0 | 20 | +| +| **gap | uint256[49] | 102 | 0 | 1568 | +| +| addressManager | address | 151 | 0 | 20 | +| +| **gap | uint256[49] | 152 | 0 | 1568 | +| +| **reentry | uint8 | 201 | 0 | 1 | +| +| **paused | uint8 | 201 | 1 | 1 | +| +| **lastUnpausedAt | uint64 | 201 | 2 | 8 | +| +| **gap | uint256[49] | 202 | 0 | 1568 | +| +| **gap | uint256[50] | 251 | 0 | 1600 | +| +| **gap | uint256[50] | 301 | 0 | 1600 | +╰------------------+-------------+------+--------+-------+--------------------------------------------------------------------------╯ + +## ZkAnyVerifier + +╭------------------+-------------+------+--------+-------+--------------------------------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++=============================================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| **gap | uint256[50] | 1 | 0 | 1600 | +| +| \_owner | address | 51 | 0 | 20 | +| +| **gap | uint256[49] | 52 | 0 | 1568 | +| +| \_pendingOwner | address | 101 | 0 | 20 | +| +| **gap | uint256[49] | 102 | 0 | 1568 | +| +| addressManager | address | 151 | 0 | 20 | +| +| **gap | uint256[49] | 152 | 0 | 1568 | +| +| **reentry | uint8 | 201 | 0 | 1 | +| +| **paused | uint8 | 201 | 1 | 1 | +| +| **lastUnpausedAt | uint64 | 201 | 2 | 8 | +| +| **gap | uint256[49] | 202 | 0 | 1568 | +| +| **gap | uint256[50] | 251 | 0 | 1600 | +| +| **gap | uint256[50] | 301 | 0 | 1600 | +╰------------------+-------------+------+--------+-------+--------------------------------------------------------------------╯ + +## Risc0Verifier + +╭------------------+--------------------------+------+--------+-------+------------------------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++==================================================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| **gap | uint256[50] | 1 | 0 | 1600 | +| +| \_owner | address | 51 | 0 | 20 | +| +| **gap | uint256[49] | 52 | 0 | 1568 | +| +| \_pendingOwner | address | 101 | 0 | 20 | +| +| **gap | uint256[49] | 102 | 0 | 1568 | +| +| addressManager | address | 151 | 0 | 20 | +| +| **gap | uint256[49] | 152 | 0 | 1568 | +| +| **reentry | uint8 | 201 | 0 | 1 | +| +| **paused | uint8 | 201 | 1 | 1 | +| +| **lastUnpausedAt | uint64 | 201 | 2 | 8 | +| +| **gap | uint256[49] | 202 | 0 | 1568 | +| +| isImageTrusted | mapping(bytes32 => bool) | 251 | 0 | 32 | +| +| \_\_gap | uint256[49] | 252 | 0 | 1568 | +╰------------------+--------------------------+------+--------+-------+------------------------------------------------------------╯ + +## SP1Verifier + +╭------------------+--------------------------+------+--------+-------+--------------------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++==============================================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| **gap | uint256[50] | 1 | 0 | 1600 | +| +| \_owner | address | 51 | 0 | 20 | +| +| **gap | uint256[49] | 52 | 0 | 1568 | +| +| \_pendingOwner | address | 101 | 0 | 20 | +| +| **gap | uint256[49] | 102 | 0 | 1568 | +| +| addressManager | address | 151 | 0 | 20 | +| +| **gap | uint256[49] | 152 | 0 | 1568 | +| +| **reentry | uint8 | 201 | 0 | 1 | +| +| **paused | uint8 | 201 | 1 | 1 | +| +| **lastUnpausedAt | uint64 | 201 | 2 | 8 | +| +| **gap | uint256[49] | 202 | 0 | 1568 | +| +| isProgramTrusted | mapping(bytes32 => bool) | 251 | 0 | 32 | +| +| \_\_gap | uint256[49] | 252 | 0 | 1568 | +╰------------------+--------------------------+------+--------+-------+--------------------------------------------------------╯ + +## SgxVerifier + +╭-------------------+-------------------------------------------------+------+--------+-------+--------------------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++======================================================================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| **gap | uint256[50] | 1 | 0 | 1600 | +| +| \_owner | address | 51 | 0 | 20 | +| +| **gap | uint256[49] | 52 | 0 | 1568 | +| +| \_pendingOwner | address | 101 | 0 | 20 | +| +| **gap | uint256[49] | 102 | 0 | 1568 | +| +| addressManager | address | 151 | 0 | 20 | +| +| **gap | uint256[49] | 152 | 0 | 1568 | +| +| **reentry | uint8 | 201 | 0 | 1 | +| +| **paused | uint8 | 201 | 1 | 1 | +| +| **lastUnpausedAt | uint64 | 201 | 2 | 8 | +| +| **gap | uint256[49] | 202 | 0 | 1568 | +| +| nextInstanceId | uint256 | 251 | 0 | 32 | +| +| instances | mapping(uint256 => struct SgxVerifier.Instance) | 252 | 0 | 32 | +| +| addressRegistered | mapping(address => bool) | 253 | 0 | 32 | +| +| \_\_gap | uint256[47] | 254 | 0 | 1504 | +╰-------------------+-------------------------------------------------+------+--------+-------+--------------------------------------------------------╯ + +## AutomataDcapV3Attestation + +╭-------------------------+-------------------------------------------------+------+--------+-------+-----------------------------------------------------------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++===================================================================================================================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| **gap | uint256[50] | 1 | 0 | 1600 | +| +| \_owner | address | 51 | 0 | 20 | +| +| **gap | uint256[49] | 52 | 0 | 1568 | +| +| \_pendingOwner | address | 101 | 0 | 20 | +| +| **gap | uint256[49] | 102 | 0 | 1568 | +| +| addressManager | address | 151 | 0 | 20 | +| +| **gap | uint256[49] | 152 | 0 | 1568 | +| +| **reentry | uint8 | 201 | 0 | 1 | +| +| **paused | uint8 | 201 | 1 | 1 | +| +| **lastUnpausedAt | uint64 | 201 | 2 | 8 | +| +| **gap | uint256[49] | 202 | 0 | 1568 | +| +| sigVerifyLib | contract ISigVerifyLib | 251 | 0 | 20 | +| +| pemCertLib | contract IPEMCertChainLib | 252 | 0 | 20 | +| +| checkLocalEnclaveReport | bool | 252 | 20 | 1 | +| +| trustedUserMrEnclave | mapping(bytes32 => bool) | 253 | 0 | 32 | +| +| trustedUserMrSigner | mapping(bytes32 => bool) | 254 | 0 | 32 | +| +| serialNumIsRevoked | mapping(uint256 => mapping(bytes => bool)) | 255 | 0 | 32 | +| +| tcbInfo | mapping(string => struct TCBInfoStruct.TCBInfo) | 256 | 0 | 32 | +| +| qeIdentity | struct EnclaveIdStruct.EnclaveId | 257 | 0 | 128 | +| +| \_\_gap | uint256[39] | 261 | 0 | 1248 | +╰-------------------------+-------------------------------------------------+------+--------+-------+-----------------------------------------------------------------------------------------------╯ + +## TaikoL1 + +╭------------------+------------------------+------+--------+-------+--------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++================================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| **gap | uint256[50] | 1 | 0 | 1600 | +| +| \_owner | address | 51 | 0 | 20 | +| +| **gap | uint256[49] | 52 | 0 | 1568 | +| +| \_pendingOwner | address | 101 | 0 | 20 | +| +| **gap | uint256[49] | 102 | 0 | 1568 | +| +| addressManager | address | 151 | 0 | 20 | +| +| **gap | uint256[49] | 152 | 0 | 1568 | +| +| **reentry | uint8 | 201 | 0 | 1 | +| +| **paused | uint8 | 201 | 1 | 1 | +| +| **lastUnpausedAt | uint64 | 201 | 2 | 8 | +| +| **gap | uint256[49] | 202 | 0 | 1568 | +| +| state | struct TaikoData.State | 251 | 0 | 1600 | +| +| \_\_gap | uint256[50] | 301 | 0 | 1600 | +╰------------------+------------------------+------+--------+-------+--------------------------------------------╯ + +## HeklaTaikoL1 + +╭------------------+------------------------+------+--------+-------+------------------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++==========================================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| **gap | uint256[50] | 1 | 0 | 1600 | +| +| \_owner | address | 51 | 0 | 20 | +| +| **gap | uint256[49] | 52 | 0 | 1568 | +| +| \_pendingOwner | address | 101 | 0 | 20 | +| +| **gap | uint256[49] | 102 | 0 | 1568 | +| +| addressManager | address | 151 | 0 | 20 | +| +| **gap | uint256[49] | 152 | 0 | 1568 | +| +| **reentry | uint8 | 201 | 0 | 1 | +| +| **paused | uint8 | 201 | 1 | 1 | +| +| **lastUnpausedAt | uint64 | 201 | 2 | 8 | +| +| **gap | uint256[49] | 202 | 0 | 1568 | +| +| state | struct TaikoData.State | 251 | 0 | 1600 | +| +| \_\_gap | uint256[50] | 301 | 0 | 1600 | +╰------------------+------------------------+------+--------+-------+------------------------------------------------------╯ + +## HeklaTierRouter + +╭------+------+------+--------+-------+----------╮ +| Name | Type | Slot | Offset | Bytes | ++================================================+ +╰------+------+------+--------+-------+----------╯ + +## MainnetBridge + +╭------------------+-----------------------------------------+------+--------+-------+----------------------------------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++===========================================================================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| **gap | uint256[50] | 1 | 0 | 1600 | +| +| \_owner | address | 51 | 0 | 20 | +| +| **gap | uint256[49] | 52 | 0 | 1568 | +| +| \_pendingOwner | address | 101 | 0 | 20 | +| +| **gap | uint256[49] | 102 | 0 | 1568 | +| +| addressManager | address | 151 | 0 | 20 | +| +| **gap | uint256[49] | 152 | 0 | 1568 | +| +| **reentry | uint8 | 201 | 0 | 1 | +| +| **paused | uint8 | 201 | 1 | 1 | +| +| **lastUnpausedAt | uint64 | 201 | 2 | 8 | +| +| **gap | uint256[49] | 202 | 0 | 1568 | +| +| **reserved1 | uint64 | 251 | 0 | 8 | +| +| nextMessageId | uint64 | 251 | 8 | 8 | +| +| messageStatus | mapping(bytes32 => enum IBridge.Status) | 252 | 0 | 32 | +| +| **ctx | struct IBridge.Context | 253 | 0 | 64 | +| +| **reserved2 | uint256 | 255 | 0 | 32 | +| +| **reserved3 | uint256 | 256 | 0 | 32 | +| +| \_\_gap | uint256[44] | 257 | 0 | 1408 | +╰------------------+-----------------------------------------+------+--------+-------+----------------------------------------------------------------------╯ + +## MainnetSignalService + +╭------------------+-----------------------------------------------+------+--------+-------+------------------------------------------------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++===============================================================================================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| **gap | uint256[50] | 1 | 0 | 1600 | +| +| \_owner | address | 51 | 0 | 20 | +| +| **gap | uint256[49] | 52 | 0 | 1568 | +| +| \_pendingOwner | address | 101 | 0 | 20 | +| +| **gap | uint256[49] | 102 | 0 | 1568 | +| +| addressManager | address | 151 | 0 | 20 | +| +| **gap | uint256[49] | 152 | 0 | 1568 | +| +| **reentry | uint8 | 201 | 0 | 1 | +| +| **paused | uint8 | 201 | 1 | 1 | +| +| **lastUnpausedAt | uint64 | 201 | 2 | 8 | +| +| **gap | uint256[49] | 202 | 0 | 1568 | +| +| topBlockId | mapping(uint64 => mapping(bytes32 => uint64)) | 251 | 0 | 32 | +| +| isAuthorized | mapping(address => bool) | 252 | 0 | 32 | +| +| \_\_gap | uint256[48] | 253 | 0 | 1536 | +╰------------------+-----------------------------------------------+------+--------+-------+------------------------------------------------------------------------------------╯ + +## MainnetERC20Vault + +╭--------------------+------------------------------------------------------+------+--------+-------+------------------------------------------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++==================================================================================================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| **gap | uint256[50] | 1 | 0 | 1600 | +| +| \_owner | address | 51 | 0 | 20 | +| +| **gap | uint256[49] | 52 | 0 | 1568 | +| +| \_pendingOwner | address | 101 | 0 | 20 | +| +| **gap | uint256[49] | 102 | 0 | 1568 | +| +| addressManager | address | 151 | 0 | 20 | +| +| **gap | uint256[49] | 152 | 0 | 1568 | +| +| **reentry | uint8 | 201 | 0 | 1 | +| +| **paused | uint8 | 201 | 1 | 1 | +| +| **lastUnpausedAt | uint64 | 201 | 2 | 8 | +| +| **gap | uint256[49] | 202 | 0 | 1568 | +| +| **gap | uint256[50] | 251 | 0 | 1600 | +| +| bridgedToCanonical | mapping(address => struct ERC20Vault.CanonicalERC20) | 301 | 0 | 32 | +| +| canonicalToBridged | mapping(uint256 => mapping(address => address)) | 302 | 0 | 32 | +| +| btokenDenylist | mapping(address => bool) | 303 | 0 | 32 | +| +| lastMigrationStart | mapping(uint256 => mapping(address => uint256)) | 304 | 0 | 32 | +| +| **gap | uint256[46] | 305 | 0 | 1472 | +╰--------------------+------------------------------------------------------+------+--------+-------+------------------------------------------------------------------------------╯ + +## MainnetERC1155Vault + +╭--------------------+------------------------------------------------------+------+--------+-------+----------------------------------------------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++======================================================================================================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| **gap | uint256[50] | 1 | 0 | 1600 | +| +| \_owner | address | 51 | 0 | 20 | +| +| **gap | uint256[49] | 52 | 0 | 1568 | +| +| \_pendingOwner | address | 101 | 0 | 20 | +| +| **gap | uint256[49] | 102 | 0 | 1568 | +| +| addressManager | address | 151 | 0 | 20 | +| +| **gap | uint256[49] | 152 | 0 | 1568 | +| +| **reentry | uint8 | 201 | 0 | 1 | +| +| **paused | uint8 | 201 | 1 | 1 | +| +| **lastUnpausedAt | uint64 | 201 | 2 | 8 | +| +| **gap | uint256[49] | 202 | 0 | 1568 | +| +| **gap | uint256[50] | 251 | 0 | 1600 | +| +| bridgedToCanonical | mapping(address => struct BaseNFTVault.CanonicalNFT) | 301 | 0 | 32 | +| +| canonicalToBridged | mapping(uint256 => mapping(address => address)) | 302 | 0 | 32 | +| +| **gap | uint256[48] | 303 | 0 | 1536 | +| +| **gap | uint256[50] | 351 | 0 | 1600 | +| +| **gap | uint256[50] | 401 | 0 | 1600 | +| +| \_\_gap | uint256[50] | 451 | 0 | 1600 | +╰--------------------+------------------------------------------------------+------+--------+-------+----------------------------------------------------------------------------------╯ + +## MainnetERC721Vault + +╭--------------------+------------------------------------------------------+------+--------+-------+--------------------------------------------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++====================================================================================================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| **gap | uint256[50] | 1 | 0 | 1600 | +| +| \_owner | address | 51 | 0 | 20 | +| +| **gap | uint256[49] | 52 | 0 | 1568 | +| +| \_pendingOwner | address | 101 | 0 | 20 | +| +| **gap | uint256[49] | 102 | 0 | 1568 | +| +| addressManager | address | 151 | 0 | 20 | +| +| **gap | uint256[49] | 152 | 0 | 1568 | +| +| **reentry | uint8 | 201 | 0 | 1 | +| +| **paused | uint8 | 201 | 1 | 1 | +| +| **lastUnpausedAt | uint64 | 201 | 2 | 8 | +| +| **gap | uint256[49] | 202 | 0 | 1568 | +| +| **gap | uint256[50] | 251 | 0 | 1600 | +| +| bridgedToCanonical | mapping(address => struct BaseNFTVault.CanonicalNFT) | 301 | 0 | 32 | +| +| canonicalToBridged | mapping(uint256 => mapping(address => address)) | 302 | 0 | 32 | +| +| **gap | uint256[48] | 303 | 0 | 1536 | +| +| \_\_gap | uint256[50] | 351 | 0 | 1600 | +╰--------------------+------------------------------------------------------+------+--------+-------+--------------------------------------------------------------------------------╯ + +## MainnetSharedAddressManager + +╭------------------+-------------------------------------------------+------+--------+-------+--------------------------------------------------------------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++===============================================================================================================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| **gap | uint256[50] | 1 | 0 | 1600 | +| +| \_owner | address | 51 | 0 | 20 | +| +| **gap | uint256[49] | 52 | 0 | 1568 | +| +| \_pendingOwner | address | 101 | 0 | 20 | +| +| **gap | uint256[49] | 102 | 0 | 1568 | +| +| addressManager | address | 151 | 0 | 20 | +| +| **gap | uint256[49] | 152 | 0 | 1568 | +| +| **reentry | uint8 | 201 | 0 | 1 | +| +| **paused | uint8 | 201 | 1 | 1 | +| +| **lastUnpausedAt | uint64 | 201 | 2 | 8 | +| +| **gap | uint256[49] | 202 | 0 | 1568 | +| +| **addresses | mapping(uint256 => mapping(bytes32 => address)) | 251 | 0 | 32 | +| +| **gap | uint256[49] | 252 | 0 | 1568 | +╰------------------+-------------------------------------------------+------+--------+-------+--------------------------------------------------------------------------------------------------╯ + +## RollupAddressCache + +╭------+------+------+--------+-------+----------╮ +| Name | Type | Slot | Offset | Bytes | ++================================================+ +╰------+------+------+--------+-------+----------╯ + +## SharedAddressCache + +╭------+------+------+--------+-------+----------╮ +| Name | Type | Slot | Offset | Bytes | ++================================================+ +╰------+------+------+--------+-------+----------╯ + +## AddressCache + +╭------+------+------+--------+-------+----------╮ +| Name | Type | Slot | Offset | Bytes | ++================================================+ +╰------+------+------+--------+-------+----------╯ + +## MainnetSgxVerifier + +╭-------------------+-------------------------------------------------+------+--------+-------+-------------------------------------------------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++===================================================================================================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| **gap | uint256[50] | 1 | 0 | 1600 | +| +| \_owner | address | 51 | 0 | 20 | +| +| **gap | uint256[49] | 52 | 0 | 1568 | +| +| \_pendingOwner | address | 101 | 0 | 20 | +| +| **gap | uint256[49] | 102 | 0 | 1568 | +| +| addressManager | address | 151 | 0 | 20 | +| +| **gap | uint256[49] | 152 | 0 | 1568 | +| +| **reentry | uint8 | 201 | 0 | 1 | +| +| **paused | uint8 | 201 | 1 | 1 | +| +| **lastUnpausedAt | uint64 | 201 | 2 | 8 | +| +| **gap | uint256[49] | 202 | 0 | 1568 | +| +| nextInstanceId | uint256 | 251 | 0 | 32 | +| +| instances | mapping(uint256 => struct SgxVerifier.Instance) | 252 | 0 | 32 | +| +| addressRegistered | mapping(address => bool) | 253 | 0 | 32 | +| +| \_\_gap | uint256[47] | 254 | 0 | 1504 | +╰-------------------+-------------------------------------------------+------+--------+-------+-------------------------------------------------------------------------------------╯ + +## MainnetSP1Verifier + +╭------------------+--------------------------+------+--------+-------+-------------------------------------------------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++===========================================================================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| **gap | uint256[50] | 1 | 0 | 1600 | +| +| \_owner | address | 51 | 0 | 20 | +| +| **gap | uint256[49] | 52 | 0 | 1568 | +| +| \_pendingOwner | address | 101 | 0 | 20 | +| +| **gap | uint256[49] | 102 | 0 | 1568 | +| +| addressManager | address | 151 | 0 | 20 | +| +| **gap | uint256[49] | 152 | 0 | 1568 | +| +| **reentry | uint8 | 201 | 0 | 1 | +| +| **paused | uint8 | 201 | 1 | 1 | +| +| **lastUnpausedAt | uint64 | 201 | 2 | 8 | +| +| **gap | uint256[49] | 202 | 0 | 1568 | +| +| isProgramTrusted | mapping(bytes32 => bool) | 251 | 0 | 32 | +| +| \_\_gap | uint256[49] | 252 | 0 | 1568 | +╰------------------+--------------------------+------+--------+-------+-------------------------------------------------------------------------------------╯ + +## MainnetZkAnyVerifier + +╭------------------+-------------+------+--------+-------+-----------------------------------------------------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++==================================================================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| **gap | uint256[50] | 1 | 0 | 1600 | +| +| \_owner | address | 51 | 0 | 20 | +| +| **gap | uint256[49] | 52 | 0 | 1568 | +| +| \_pendingOwner | address | 101 | 0 | 20 | +| +| **gap | uint256[49] | 102 | 0 | 1568 | +| +| addressManager | address | 151 | 0 | 20 | +| +| **gap | uint256[49] | 152 | 0 | 1568 | +| +| **reentry | uint8 | 201 | 0 | 1 | +| +| **paused | uint8 | 201 | 1 | 1 | +| +| **lastUnpausedAt | uint64 | 201 | 2 | 8 | +| +| **gap | uint256[49] | 202 | 0 | 1568 | +| +| **gap | uint256[50] | 251 | 0 | 1600 | +| +| **gap | uint256[50] | 301 | 0 | 1600 | +╰------------------+-------------+------+--------+-------+-----------------------------------------------------------------------------------------╯ + +## MainnetRisc0Verifier + +╭------------------+--------------------------+------+--------+-------+-----------------------------------------------------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++===============================================================================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| **gap | uint256[50] | 1 | 0 | 1600 | +| +| \_owner | address | 51 | 0 | 20 | +| +| **gap | uint256[49] | 52 | 0 | 1568 | +| +| \_pendingOwner | address | 101 | 0 | 20 | +| +| **gap | uint256[49] | 102 | 0 | 1568 | +| +| addressManager | address | 151 | 0 | 20 | +| +| **gap | uint256[49] | 152 | 0 | 1568 | +| +| **reentry | uint8 | 201 | 0 | 1 | +| +| **paused | uint8 | 201 | 1 | 1 | +| +| **lastUnpausedAt | uint64 | 201 | 2 | 8 | +| +| **gap | uint256[49] | 202 | 0 | 1568 | +| +| isImageTrusted | mapping(bytes32 => bool) | 251 | 0 | 32 | +| +| \_\_gap | uint256[49] | 252 | 0 | 1568 | +╰------------------+--------------------------+------+--------+-------+-----------------------------------------------------------------------------------------╯ + +## MainnetZkAndTeeVerifier + +╭------------------+-------------+------+--------+-------+-----------------------------------------------------------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++========================================================================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| **gap | uint256[50] | 1 | 0 | 1600 | +| +| \_owner | address | 51 | 0 | 20 | +| +| **gap | uint256[49] | 52 | 0 | 1568 | +| +| \_pendingOwner | address | 101 | 0 | 20 | +| +| **gap | uint256[49] | 102 | 0 | 1568 | +| +| addressManager | address | 151 | 0 | 20 | +| +| **gap | uint256[49] | 152 | 0 | 1568 | +| +| **reentry | uint8 | 201 | 0 | 1 | +| +| **paused | uint8 | 201 | 1 | 1 | +| +| **lastUnpausedAt | uint64 | 201 | 2 | 8 | +| +| **gap | uint256[49] | 202 | 0 | 1568 | +| +| **gap | uint256[50] | 251 | 0 | 1600 | +| +| **gap | uint256[50] | 301 | 0 | 1600 | +╰------------------+-------------+------+--------+-------+-----------------------------------------------------------------------------------------------╯ + +## MainnetTeeAnyVerifier + +╭------------------+-------------+------+--------+-------+-------------------------------------------------------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++====================================================================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| **gap | uint256[50] | 1 | 0 | 1600 | +| +| \_owner | address | 51 | 0 | 20 | +| +| **gap | uint256[49] | 52 | 0 | 1568 | +| +| \_pendingOwner | address | 101 | 0 | 20 | +| +| **gap | uint256[49] | 102 | 0 | 1568 | +| +| addressManager | address | 151 | 0 | 20 | +| +| **gap | uint256[49] | 152 | 0 | 1568 | +| +| **reentry | uint8 | 201 | 0 | 1 | +| +| **paused | uint8 | 201 | 1 | 1 | +| +| **lastUnpausedAt | uint64 | 201 | 2 | 8 | +| +| **gap | uint256[49] | 202 | 0 | 1568 | +| +| **gap | uint256[50] | 251 | 0 | 1600 | +| +| **gap | uint256[50] | 301 | 0 | 1600 | +╰------------------+-------------+------+--------+-------+-------------------------------------------------------------------------------------------╯ + +## MainnetGuardianProver + +╭-------------------------+-------------------------------------------------+------+--------+-------+---------------------------------------------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++=====================================================================================================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| **gap | uint256[50] | 1 | 0 | 1600 | +| +| \_owner | address | 51 | 0 | 20 | +| +| **gap | uint256[49] | 52 | 0 | 1568 | +| +| \_pendingOwner | address | 101 | 0 | 20 | +| +| **gap | uint256[49] | 102 | 0 | 1568 | +| +| addressManager | address | 151 | 0 | 20 | +| +| **gap | uint256[49] | 152 | 0 | 1568 | +| +| **reentry | uint8 | 201 | 0 | 1 | +| +| **paused | uint8 | 201 | 1 | 1 | +| +| **lastUnpausedAt | uint64 | 201 | 2 | 8 | +| +| **gap | uint256[49] | 202 | 0 | 1568 | +| +| guardianIds | mapping(address => uint256) | 251 | 0 | 32 | +| +| approvals | mapping(uint256 => mapping(bytes32 => uint256)) | 252 | 0 | 32 | +| +| guardians | address[] | 253 | 0 | 32 | +| +| version | uint32 | 254 | 0 | 4 | +| +| minGuardians | uint32 | 254 | 4 | 4 | +| +| provingAutoPauseEnabled | bool | 254 | 8 | 1 | +| +| latestProofHash | mapping(uint256 => mapping(uint256 => bytes32)) | 255 | 0 | 32 | +| +| \_\_gap | uint256[45] | 256 | 0 | 1440 | +╰-------------------------+-------------------------------------------------+------+--------+-------+---------------------------------------------------------------------------------╯ + +## MainnetTaikoL1 + +╭------------------+------------------------+------+--------+-------+-------------------------------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++=======================================================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| **gap | uint256[50] | 1 | 0 | 1600 | +| +| \_owner | address | 51 | 0 | 20 | +| +| **gap | uint256[49] | 52 | 0 | 1568 | +| +| \_pendingOwner | address | 101 | 0 | 20 | +| +| **gap | uint256[49] | 102 | 0 | 1568 | +| +| addressManager | address | 151 | 0 | 20 | +| +| **gap | uint256[49] | 152 | 0 | 1568 | +| +| **reentry | uint8 | 201 | 0 | 1 | +| +| **paused | uint8 | 201 | 1 | 1 | +| +| **lastUnpausedAt | uint64 | 201 | 2 | 8 | +| +| **gap | uint256[49] | 202 | 0 | 1568 | +| +| state | struct TaikoData.State | 251 | 0 | 1600 | +| +| \_\_gap | uint256[50] | 301 | 0 | 1600 | +╰------------------+------------------------+------+--------+-------+-------------------------------------------------------------------╯ + +## MainnetRollupAddressManager + +╭------------------+-------------------------------------------------+------+--------+-------+---------------------------------------------------------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++==========================================================================================================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| **gap | uint256[50] | 1 | 0 | 1600 | +| +| \_owner | address | 51 | 0 | 20 | +| +| **gap | uint256[49] | 52 | 0 | 1568 | +| +| \_pendingOwner | address | 101 | 0 | 20 | +| +| **gap | uint256[49] | 102 | 0 | 1568 | +| +| addressManager | address | 151 | 0 | 20 | +| +| **gap | uint256[49] | 152 | 0 | 1568 | +| +| **reentry | uint8 | 201 | 0 | 1 | +| +| **paused | uint8 | 201 | 1 | 1 | +| +| **lastUnpausedAt | uint64 | 201 | 2 | 8 | +| +| **gap | uint256[49] | 202 | 0 | 1568 | +| +| **addresses | mapping(uint256 => mapping(bytes32 => address)) | 251 | 0 | 32 | +| +| **gap | uint256[49] | 252 | 0 | 1568 | +╰------------------+-------------------------------------------------+------+--------+-------+---------------------------------------------------------------------------------------------╯ + +## MainnetTierRouter + +╭------+------+------+--------+-------+----------╮ +| Name | Type | Slot | Offset | Bytes | ++================================================+ +╰------+------+------+--------+-------+----------╯ + +## MainnetProverSet + +╭------------------+--------------------------+------+--------+-------+-----------------------------------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++=============================================================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| **gap | uint256[50] | 1 | 0 | 1600 | +| +| \_owner | address | 51 | 0 | 20 | +| +| **gap | uint256[49] | 52 | 0 | 1568 | +| +| \_pendingOwner | address | 101 | 0 | 20 | +| +| **gap | uint256[49] | 102 | 0 | 1568 | +| +| addressManager | address | 151 | 0 | 20 | +| +| **gap | uint256[49] | 152 | 0 | 1568 | +| +| **reentry | uint8 | 201 | 0 | 1 | +| +| **paused | uint8 | 201 | 1 | 1 | +| +| **lastUnpausedAt | uint64 | 201 | 2 | 8 | +| +| **gap | uint256[49] | 202 | 0 | 1568 | +| +| isProver | mapping(address => bool) | 251 | 0 | 32 | +| +| admin | address | 252 | 0 | 20 | +| +| \_\_gap | uint256[48] | 253 | 0 | 1536 | +╰------------------+--------------------------+------+--------+-------+-----------------------------------------------------------------------╯ + +## TokenUnlock + +╭------------------+--------------------------+------+--------+-------+---------------------------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++=====================================================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| **gap | uint256[50] | 1 | 0 | 1600 | +| +| \_owner | address | 51 | 0 | 20 | +| +| **gap | uint256[49] | 52 | 0 | 1568 | +| +| \_pendingOwner | address | 101 | 0 | 20 | +| +| **gap | uint256[49] | 102 | 0 | 1568 | +| +| addressManager | address | 151 | 0 | 20 | +| +| **gap | uint256[49] | 152 | 0 | 1568 | +| +| **reentry | uint8 | 201 | 0 | 1 | +| +| **paused | uint8 | 201 | 1 | 1 | +| +| **lastUnpausedAt | uint64 | 201 | 2 | 8 | +| +| **gap | uint256[49] | 202 | 0 | 1568 | +| +| amountVested | uint256 | 251 | 0 | 32 | +| +| recipient | address | 252 | 0 | 20 | +| +| tgeTimestamp | uint64 | 252 | 20 | 8 | +| +| isProverSet | mapping(address => bool) | 253 | 0 | 32 | +| +| \_\_gap | uint256[47] | 254 | 0 | 1504 | +╰------------------+--------------------------+------+--------+-------+---------------------------------------------------------------╯ + +## ProverSet + +╭------------------+--------------------------+------+--------+-------+--------------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++========================================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| **gap | uint256[50] | 1 | 0 | 1600 | +| +| \_owner | address | 51 | 0 | 20 | +| +| **gap | uint256[49] | 52 | 0 | 1568 | +| +| \_pendingOwner | address | 101 | 0 | 20 | +| +| **gap | uint256[49] | 102 | 0 | 1568 | +| +| addressManager | address | 151 | 0 | 20 | +| +| **gap | uint256[49] | 152 | 0 | 1568 | +| +| **reentry | uint8 | 201 | 0 | 1 | +| +| **paused | uint8 | 201 | 1 | 1 | +| +| **lastUnpausedAt | uint64 | 201 | 2 | 8 | +| +| **gap | uint256[49] | 202 | 0 | 1568 | +| +| isProver | mapping(address => bool) | 251 | 0 | 32 | +| +| admin | address | 252 | 0 | 20 | +| +| \_\_gap | uint256[48] | 253 | 0 | 1536 | +╰------------------+--------------------------+------+--------+-------+--------------------------------------------------╯ + +## GuardianProver + +╭-------------------------+-------------------------------------------------+------+--------+-------+------------------------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++================================================================================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| **gap | uint256[50] | 1 | 0 | 1600 | +| +| \_owner | address | 51 | 0 | 20 | +| +| **gap | uint256[49] | 52 | 0 | 1568 | +| +| \_pendingOwner | address | 101 | 0 | 20 | +| +| **gap | uint256[49] | 102 | 0 | 1568 | +| +| addressManager | address | 151 | 0 | 20 | +| +| **gap | uint256[49] | 152 | 0 | 1568 | +| +| **reentry | uint8 | 201 | 0 | 1 | +| +| **paused | uint8 | 201 | 1 | 1 | +| +| **lastUnpausedAt | uint64 | 201 | 2 | 8 | +| +| **gap | uint256[49] | 202 | 0 | 1568 | +| +| guardianIds | mapping(address => uint256) | 251 | 0 | 32 | +| +| approvals | mapping(uint256 => mapping(bytes32 => uint256)) | 252 | 0 | 32 | +| +| guardians | address[] | 253 | 0 | 32 | +| +| version | uint32 | 254 | 0 | 4 | +| +| minGuardians | uint32 | 254 | 4 | 4 | +| +| provingAutoPauseEnabled | bool | 254 | 8 | 1 | +| +| latestProofHash | mapping(uint256 => mapping(uint256 => bytes32)) | 255 | 0 | 32 | +| +| \_\_gap | uint256[45] | 256 | 0 | 1440 | +╰-------------------------+-------------------------------------------------+------+--------+-------+------------------------------------------------------------╯ + +## ForkManager + +╭---------------+-------------+------+--------+-------+---------------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++=========================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| **gap | uint256[50] | 1 | 0 | 1600 | +| +| \_owner | address | 51 | 0 | 20 | +| +| **gap | uint256[49] | 52 | 0 | 1568 | +| +| \_pendingOwner | address | 101 | 0 | 20 | +| +| \_\_gap | uint256[49] | 102 | 0 | 1568 | +╰---------------+-------------+------+--------+-------+---------------------------------------------------╯ diff --git a/packages/protocol/contract_layout_layer2.md b/packages/protocol/contract_layout_layer2.md new file mode 100644 index 00000000000..d71e2364207 --- /dev/null +++ b/packages/protocol/contract_layout_layer2.md @@ -0,0 +1,825 @@ +## ERC1155Vault + +╭--------------------+------------------------------------------------------+------+--------+-------+-----------------------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++===============================================================================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| **gap | uint256[50] | 1 | 0 | 1600 | +| +| \_owner | address | 51 | 0 | 20 | +| +| **gap | uint256[49] | 52 | 0 | 1568 | +| +| \_pendingOwner | address | 101 | 0 | 20 | +| +| **gap | uint256[49] | 102 | 0 | 1568 | +| +| addressManager | address | 151 | 0 | 20 | +| +| **gap | uint256[49] | 152 | 0 | 1568 | +| +| **reentry | uint8 | 201 | 0 | 1 | +| +| **paused | uint8 | 201 | 1 | 1 | +| +| **lastUnpausedAt | uint64 | 201 | 2 | 8 | +| +| **gap | uint256[49] | 202 | 0 | 1568 | +| +| **gap | uint256[50] | 251 | 0 | 1600 | +| +| bridgedToCanonical | mapping(address => struct BaseNFTVault.CanonicalNFT) | 301 | 0 | 32 | +| +| canonicalToBridged | mapping(uint256 => mapping(address => address)) | 302 | 0 | 32 | +| +| **gap | uint256[48] | 303 | 0 | 1536 | +| +| **gap | uint256[50] | 351 | 0 | 1600 | +| +| **gap | uint256[50] | 401 | 0 | 1600 | +| +| \_\_gap | uint256[50] | 451 | 0 | 1600 | +╰--------------------+------------------------------------------------------+------+--------+-------+-----------------------------------------------------------╯ + +## ERC20Vault + +╭--------------------+------------------------------------------------------+------+--------+-------+-------------------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++===========================================================================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| **gap | uint256[50] | 1 | 0 | 1600 | +| +| \_owner | address | 51 | 0 | 20 | +| +| **gap | uint256[49] | 52 | 0 | 1568 | +| +| \_pendingOwner | address | 101 | 0 | 20 | +| +| **gap | uint256[49] | 102 | 0 | 1568 | +| +| addressManager | address | 151 | 0 | 20 | +| +| **gap | uint256[49] | 152 | 0 | 1568 | +| +| **reentry | uint8 | 201 | 0 | 1 | +| +| **paused | uint8 | 201 | 1 | 1 | +| +| **lastUnpausedAt | uint64 | 201 | 2 | 8 | +| +| **gap | uint256[49] | 202 | 0 | 1568 | +| +| **gap | uint256[50] | 251 | 0 | 1600 | +| +| bridgedToCanonical | mapping(address => struct ERC20Vault.CanonicalERC20) | 301 | 0 | 32 | +| +| canonicalToBridged | mapping(uint256 => mapping(address => address)) | 302 | 0 | 32 | +| +| btokenDenylist | mapping(address => bool) | 303 | 0 | 32 | +| +| lastMigrationStart | mapping(uint256 => mapping(address => uint256)) | 304 | 0 | 32 | +| +| **gap | uint256[46] | 305 | 0 | 1472 | +╰--------------------+------------------------------------------------------+------+--------+-------+-------------------------------------------------------╯ + +## ERC721Vault + +╭--------------------+------------------------------------------------------+------+--------+-------+---------------------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++=============================================================================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| **gap | uint256[50] | 1 | 0 | 1600 | +| +| \_owner | address | 51 | 0 | 20 | +| +| **gap | uint256[49] | 52 | 0 | 1568 | +| +| \_pendingOwner | address | 101 | 0 | 20 | +| +| **gap | uint256[49] | 102 | 0 | 1568 | +| +| addressManager | address | 151 | 0 | 20 | +| +| **gap | uint256[49] | 152 | 0 | 1568 | +| +| **reentry | uint8 | 201 | 0 | 1 | +| +| **paused | uint8 | 201 | 1 | 1 | +| +| **lastUnpausedAt | uint64 | 201 | 2 | 8 | +| +| **gap | uint256[49] | 202 | 0 | 1568 | +| +| **gap | uint256[50] | 251 | 0 | 1600 | +| +| bridgedToCanonical | mapping(address => struct BaseNFTVault.CanonicalNFT) | 301 | 0 | 32 | +| +| canonicalToBridged | mapping(uint256 => mapping(address => address)) | 302 | 0 | 32 | +| +| **gap | uint256[48] | 303 | 0 | 1536 | +| +| \_\_gap | uint256[50] | 351 | 0 | 1600 | +╰--------------------+------------------------------------------------------+------+--------+-------+---------------------------------------------------------╯ + +## BridgedERC20 + +╭------------------+-------------------------------------------------+------+--------+-------+-----------------------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++========================================================================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| **gap | uint256[50] | 1 | 0 | 1600 | +| +| \_owner | address | 51 | 0 | 20 | +| +| **gap | uint256[49] | 52 | 0 | 1568 | +| +| \_pendingOwner | address | 101 | 0 | 20 | +| +| **gap | uint256[49] | 102 | 0 | 1568 | +| +| addressManager | address | 151 | 0 | 20 | +| +| **gap | uint256[49] | 152 | 0 | 1568 | +| +| **reentry | uint8 | 201 | 0 | 1 | +| +| **paused | uint8 | 201 | 1 | 1 | +| +| **lastUnpausedAt | uint64 | 201 | 2 | 8 | +| +| **gap | uint256[49] | 202 | 0 | 1568 | +| +| \_balances | mapping(address => uint256) | 251 | 0 | 32 | +| +| \_allowances | mapping(address => mapping(address => uint256)) | 252 | 0 | 32 | +| +| \_totalSupply | uint256 | 253 | 0 | 32 | +| +| \_name | string | 254 | 0 | 32 | +| +| \_symbol | string | 255 | 0 | 32 | +| +| **gap | uint256[45] | 256 | 0 | 1440 | +| +| srcToken | address | 301 | 0 | 20 | +| +| **srcDecimals | uint8 | 301 | 20 | 1 | +| +| srcChainId | uint256 | 302 | 0 | 32 | +| +| migratingAddress | address | 303 | 0 | 20 | +| +| migratingInbound | bool | 303 | 20 | 1 | +| +| \_\_gap | uint256[47] | 304 | 0 | 1504 | +╰------------------+-------------------------------------------------+------+--------+-------+-----------------------------------------------------------╯ + +## BridgedERC20V2 + +╭------------------+--------------------------------------------------------+------+--------+-------+---------------------------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++===================================================================================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| **gap | uint256[50] | 1 | 0 | 1600 | +| +| \_owner | address | 51 | 0 | 20 | +| +| **gap | uint256[49] | 52 | 0 | 1568 | +| +| \_pendingOwner | address | 101 | 0 | 20 | +| +| **gap | uint256[49] | 102 | 0 | 1568 | +| +| addressManager | address | 151 | 0 | 20 | +| +| **gap | uint256[49] | 152 | 0 | 1568 | +| +| **reentry | uint8 | 201 | 0 | 1 | +| +| **paused | uint8 | 201 | 1 | 1 | +| +| **lastUnpausedAt | uint64 | 201 | 2 | 8 | +| +| **gap | uint256[49] | 202 | 0 | 1568 | +| +| \_balances | mapping(address => uint256) | 251 | 0 | 32 | +| +| \_allowances | mapping(address => mapping(address => uint256)) | 252 | 0 | 32 | +| +| \_totalSupply | uint256 | 253 | 0 | 32 | +| +| \_name | string | 254 | 0 | 32 | +| +| \_symbol | string | 255 | 0 | 32 | +| +| **gap | uint256[45] | 256 | 0 | 1440 | +| +| srcToken | address | 301 | 0 | 20 | +| +| **srcDecimals | uint8 | 301 | 20 | 1 | +| +| srcChainId | uint256 | 302 | 0 | 32 | +| +| migratingAddress | address | 303 | 0 | 20 | +| +| migratingInbound | bool | 303 | 20 | 1 | +| +| **gap | uint256[47] | 304 | 0 | 1504 | +| +| \_hashedName | bytes32 | 351 | 0 | 32 | +| +| \_hashedVersion | bytes32 | 352 | 0 | 32 | +| +| \_name | string | 353 | 0 | 32 | +| +| \_version | string | 354 | 0 | 32 | +| +| **gap | uint256[48] | 355 | 0 | 1536 | +| +| \_nonces | mapping(address => struct CountersUpgradeable.Counter) | 403 | 0 | 32 | +| +| \_\_gap | uint256[49] | 404 | 0 | 1568 | +╰------------------+--------------------------------------------------------+------+--------+-------+---------------------------------------------------------------╯ + +## BridgedERC721 + +╭--------------------+----------------------------------------------+------+--------+-------+-------------------------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++=========================================================================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| **gap | uint256[50] | 1 | 0 | 1600 | +| +| \_owner | address | 51 | 0 | 20 | +| +| **gap | uint256[49] | 52 | 0 | 1568 | +| +| \_pendingOwner | address | 101 | 0 | 20 | +| +| **gap | uint256[49] | 102 | 0 | 1568 | +| +| addressManager | address | 151 | 0 | 20 | +| +| **gap | uint256[49] | 152 | 0 | 1568 | +| +| **reentry | uint8 | 201 | 0 | 1 | +| +| **paused | uint8 | 201 | 1 | 1 | +| +| **lastUnpausedAt | uint64 | 201 | 2 | 8 | +| +| **gap | uint256[49] | 202 | 0 | 1568 | +| +| **gap | uint256[50] | 251 | 0 | 1600 | +| +| \_name | string | 301 | 0 | 32 | +| +| \_symbol | string | 302 | 0 | 32 | +| +| \_owners | mapping(uint256 => address) | 303 | 0 | 32 | +| +| \_balances | mapping(address => uint256) | 304 | 0 | 32 | +| +| \_tokenApprovals | mapping(uint256 => address) | 305 | 0 | 32 | +| +| \_operatorApprovals | mapping(address => mapping(address => bool)) | 306 | 0 | 32 | +| +| **gap | uint256[44] | 307 | 0 | 1408 | +| +| srcToken | address | 351 | 0 | 20 | +| +| srcChainId | uint256 | 352 | 0 | 32 | +| +| \_\_gap | uint256[48] | 353 | 0 | 1536 | +╰--------------------+----------------------------------------------+------+--------+-------+-------------------------------------------------------------╯ + +## BridgedERC1155 + +╭--------------------+-------------------------------------------------+------+--------+-------+---------------------------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++==============================================================================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| **gap | uint256[50] | 1 | 0 | 1600 | +| +| \_owner | address | 51 | 0 | 20 | +| +| **gap | uint256[49] | 52 | 0 | 1568 | +| +| \_pendingOwner | address | 101 | 0 | 20 | +| +| **gap | uint256[49] | 102 | 0 | 1568 | +| +| addressManager | address | 151 | 0 | 20 | +| +| **gap | uint256[49] | 152 | 0 | 1568 | +| +| **reentry | uint8 | 201 | 0 | 1 | +| +| **paused | uint8 | 201 | 1 | 1 | +| +| **lastUnpausedAt | uint64 | 201 | 2 | 8 | +| +| **gap | uint256[49] | 202 | 0 | 1568 | +| +| **gap | uint256[50] | 251 | 0 | 1600 | +| +| \_balances | mapping(uint256 => mapping(address => uint256)) | 301 | 0 | 32 | +| +| \_operatorApprovals | mapping(address => mapping(address => bool)) | 302 | 0 | 32 | +| +| \_uri | string | 303 | 0 | 32 | +| +| **gap | uint256[47] | 304 | 0 | 1504 | +| +| srcToken | address | 351 | 0 | 20 | +| +| srcChainId | uint256 | 352 | 0 | 32 | +| +| symbol | string | 353 | 0 | 32 | +| +| name | string | 354 | 0 | 32 | +| +| \_\_gap | uint256[46] | 355 | 0 | 1472 | +╰--------------------+-------------------------------------------------+------+--------+-------+---------------------------------------------------------------╯ + +## Bridge + +╭------------------+-----------------------------------------+------+--------+-------+-------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++================================================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| **gap | uint256[50] | 1 | 0 | 1600 | +| +| \_owner | address | 51 | 0 | 20 | +| +| **gap | uint256[49] | 52 | 0 | 1568 | +| +| \_pendingOwner | address | 101 | 0 | 20 | +| +| **gap | uint256[49] | 102 | 0 | 1568 | +| +| addressManager | address | 151 | 0 | 20 | +| +| **gap | uint256[49] | 152 | 0 | 1568 | +| +| **reentry | uint8 | 201 | 0 | 1 | +| +| **paused | uint8 | 201 | 1 | 1 | +| +| **lastUnpausedAt | uint64 | 201 | 2 | 8 | +| +| **gap | uint256[49] | 202 | 0 | 1568 | +| +| **reserved1 | uint64 | 251 | 0 | 8 | +| +| nextMessageId | uint64 | 251 | 8 | 8 | +| +| messageStatus | mapping(bytes32 => enum IBridge.Status) | 252 | 0 | 32 | +| +| **ctx | struct IBridge.Context | 253 | 0 | 64 | +| +| **reserved2 | uint256 | 255 | 0 | 32 | +| +| **reserved3 | uint256 | 256 | 0 | 32 | +| +| \_\_gap | uint256[44] | 257 | 0 | 1408 | +╰------------------+-----------------------------------------+------+--------+-------+-------------------------------------------╯ + +## QuotaManager + +╭------------------+-----------------------------------------------+------+--------+-------+-------------------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++==================================================================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| **gap | uint256[50] | 1 | 0 | 1600 | +| +| \_owner | address | 51 | 0 | 20 | +| +| **gap | uint256[49] | 52 | 0 | 1568 | +| +| \_pendingOwner | address | 101 | 0 | 20 | +| +| **gap | uint256[49] | 102 | 0 | 1568 | +| +| addressManager | address | 151 | 0 | 20 | +| +| **gap | uint256[49] | 152 | 0 | 1568 | +| +| **reentry | uint8 | 201 | 0 | 1 | +| +| **paused | uint8 | 201 | 1 | 1 | +| +| **lastUnpausedAt | uint64 | 201 | 2 | 8 | +| +| **gap | uint256[49] | 202 | 0 | 1568 | +| +| tokenQuota | mapping(address => struct QuotaManager.Quota) | 251 | 0 | 32 | +| +| quotaPeriod | uint24 | 252 | 0 | 3 | +| +| \_\_gap | uint256[48] | 253 | 0 | 1536 | +╰------------------+-----------------------------------------------+------+--------+-------+-------------------------------------------------------╯ + +## AddressManager + +╭------------------+-------------------------------------------------+------+--------+-------+-----------------------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++========================================================================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| **gap | uint256[50] | 1 | 0 | 1600 | +| +| \_owner | address | 51 | 0 | 20 | +| +| **gap | uint256[49] | 52 | 0 | 1568 | +| +| \_pendingOwner | address | 101 | 0 | 20 | +| +| **gap | uint256[49] | 102 | 0 | 1568 | +| +| addressManager | address | 151 | 0 | 20 | +| +| **gap | uint256[49] | 152 | 0 | 1568 | +| +| **reentry | uint8 | 201 | 0 | 1 | +| +| **paused | uint8 | 201 | 1 | 1 | +| +| **lastUnpausedAt | uint64 | 201 | 2 | 8 | +| +| **gap | uint256[49] | 202 | 0 | 1568 | +| +| **addresses | mapping(uint256 => mapping(bytes32 => address)) | 251 | 0 | 32 | +| +| **gap | uint256[49] | 252 | 0 | 1568 | +╰------------------+-------------------------------------------------+------+--------+-------+-----------------------------------------------------------╯ + +## AddressResolver + +╭----------------+-------------+------+--------+-------+-------------------------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++====================================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| addressManager | address | 0 | 2 | 20 | +| +| \_\_gap | uint256[49] | 1 | 0 | 1568 | +╰----------------+-------------+------+--------+-------+-------------------------------------------------------------╯ + +## EssentialContract + +╭------------------+-------------+------+--------+-------+-----------------------------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++==========================================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| **gap | uint256[50] | 1 | 0 | 1600 | +| +| \_owner | address | 51 | 0 | 20 | +| +| **gap | uint256[49] | 52 | 0 | 1568 | +| +| \_pendingOwner | address | 101 | 0 | 20 | +| +| **gap | uint256[49] | 102 | 0 | 1568 | +| +| addressManager | address | 151 | 0 | 20 | +| +| **gap | uint256[49] | 152 | 0 | 1568 | +| +| **reentry | uint8 | 201 | 0 | 1 | +| +| **paused | uint8 | 201 | 1 | 1 | +| +| **lastUnpausedAt | uint64 | 201 | 2 | 8 | +| +| **gap | uint256[49] | 202 | 0 | 1568 | +╰------------------+-------------+------+--------+-------+-----------------------------------------------------------------╯ + +## SignalService + +╭------------------+-----------------------------------------------+------+--------+-------+---------------------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++====================================================================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| **gap | uint256[50] | 1 | 0 | 1600 | +| +| \_owner | address | 51 | 0 | 20 | +| +| **gap | uint256[49] | 52 | 0 | 1568 | +| +| \_pendingOwner | address | 101 | 0 | 20 | +| +| **gap | uint256[49] | 102 | 0 | 1568 | +| +| addressManager | address | 151 | 0 | 20 | +| +| **gap | uint256[49] | 152 | 0 | 1568 | +| +| **reentry | uint8 | 201 | 0 | 1 | +| +| **paused | uint8 | 201 | 1 | 1 | +| +| **lastUnpausedAt | uint64 | 201 | 2 | 8 | +| +| **gap | uint256[49] | 202 | 0 | 1568 | +| +| topBlockId | mapping(uint64 => mapping(bytes32 => uint64)) | 251 | 0 | 32 | +| +| isAuthorized | mapping(address => bool) | 252 | 0 | 32 | +| +| \_\_gap | uint256[48] | 253 | 0 | 1536 | +╰------------------+-----------------------------------------------+------+--------+-------+---------------------------------------------------------╯ + +## BridgedTaikoToken + +╭-----------------------------------------------------+---------------------------------------------------------------+------+--------+-------+----------------------------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++==============================================================================================================================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| **gap | uint256[50] | 1 | 0 | 1600 | +| +| \_owner | address | 51 | 0 | 20 | +| +| **gap | uint256[49] | 52 | 0 | 1568 | +| +| \_pendingOwner | address | 101 | 0 | 20 | +| +| **gap | uint256[49] | 102 | 0 | 1568 | +| +| addressManager | address | 151 | 0 | 20 | +| +| **gap | uint256[49] | 152 | 0 | 1568 | +| +| **reentry | uint8 | 201 | 0 | 1 | +| +| **paused | uint8 | 201 | 1 | 1 | +| +| **lastUnpausedAt | uint64 | 201 | 2 | 8 | +| +| **gap | uint256[49] | 202 | 0 | 1568 | +| +| **slots_previously_used_by_ERC20SnapshotUpgradeable | uint256[50] | 251 | 0 | 1600 | +| +| \_balances | mapping(address => uint256) | 301 | 0 | 32 | +| +| \_allowances | mapping(address => mapping(address => uint256)) | 302 | 0 | 32 | +| +| \_totalSupply | uint256 | 303 | 0 | 32 | +| +| \_name | string | 304 | 0 | 32 | +| +| \_symbol | string | 305 | 0 | 32 | +| +| **gap | uint256[45] | 306 | 0 | 1440 | +| +| \_hashedName | bytes32 | 351 | 0 | 32 | +| +| \_hashedVersion | bytes32 | 352 | 0 | 32 | +| +| \_name | string | 353 | 0 | 32 | +| +| \_version | string | 354 | 0 | 32 | +| +| **gap | uint256[48] | 355 | 0 | 1536 | +| +| \_nonces | mapping(address => struct CountersUpgradeable.Counter) | 403 | 0 | 32 | +| +| \_PERMIT_TYPEHASH_DEPRECATED_SLOT | bytes32 | 404 | 0 | 32 | +| +| **gap | uint256[49] | 405 | 0 | 1568 | +| +| \_delegates | mapping(address => address) | 454 | 0 | 32 | +| +| \_checkpoints | mapping(address => struct ERC20VotesUpgradeable.Checkpoint[]) | 455 | 0 | 32 | +| +| \_totalSupplyCheckpoints | struct ERC20VotesUpgradeable.Checkpoint[] | 456 | 0 | 32 | +| +| **gap | uint256[47] | 457 | 0 | 1504 | +| +| **gap | uint256[50] | 504 | 0 | 1600 | +╰-----------------------------------------------------+---------------------------------------------------------------+------+--------+-------+----------------------------------------------------------------╯ + +## DelegateOwner + +╭------------------+-------------+------+--------+-------+--------------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++===========================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| **gap | uint256[50] | 1 | 0 | 1600 | +| +| \_owner | address | 51 | 0 | 20 | +| +| **gap | uint256[49] | 52 | 0 | 1568 | +| +| \_pendingOwner | address | 101 | 0 | 20 | +| +| **gap | uint256[49] | 102 | 0 | 1568 | +| +| addressManager | address | 151 | 0 | 20 | +| +| **gap | uint256[49] | 152 | 0 | 1568 | +| +| **reentry | uint8 | 201 | 0 | 1 | +| +| **paused | uint8 | 201 | 1 | 1 | +| +| **lastUnpausedAt | uint64 | 201 | 2 | 8 | +| +| **gap | uint256[49] | 202 | 0 | 1568 | +| +| remoteChainId | uint64 | 251 | 0 | 8 | +| +| admin | address | 251 | 8 | 20 | +| +| nextTxId | uint64 | 252 | 0 | 8 | +| +| remoteOwner | address | 252 | 8 | 20 | +| +| \_\_gap | uint256[48] | 253 | 0 | 1536 | +╰------------------+-------------+------+--------+-------+--------------------------------------------------╯ + +## TaikoL2 + +╭------------------+-----------------------------+------+--------+-------+--------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++=====================================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| **gap | uint256[50] | 1 | 0 | 1600 | +| +| \_owner | address | 51 | 0 | 20 | +| +| **gap | uint256[49] | 52 | 0 | 1568 | +| +| \_pendingOwner | address | 101 | 0 | 20 | +| +| **gap | uint256[49] | 102 | 0 | 1568 | +| +| addressManager | address | 151 | 0 | 20 | +| +| **gap | uint256[49] | 152 | 0 | 1568 | +| +| **reentry | uint8 | 201 | 0 | 1 | +| +| **paused | uint8 | 201 | 1 | 1 | +| +| **lastUnpausedAt | uint64 | 201 | 2 | 8 | +| +| **gap | uint256[49] | 202 | 0 | 1568 | +| +| \_blockhashes | mapping(uint256 => bytes32) | 251 | 0 | 32 | +| +| publicInputHash | bytes32 | 252 | 0 | 32 | +| +| parentGasExcess | uint64 | 253 | 0 | 8 | +| +| lastSyncedBlock | uint64 | 253 | 8 | 8 | +| +| parentTimestamp | uint64 | 253 | 16 | 8 | +| +| parentGasTarget | uint64 | 253 | 24 | 8 | +| +| l1ChainId | uint64 | 254 | 0 | 8 | +| +| \_\_gap | uint256[46] | 255 | 0 | 1472 | +╰------------------+-----------------------------+------+--------+-------+--------------------------------------------╯ + +## HeklaTaikoL2 + +╭------------------+-----------------------------+------+--------+-------+------------------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++===============================================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| **gap | uint256[50] | 1 | 0 | 1600 | +| +| \_owner | address | 51 | 0 | 20 | +| +| **gap | uint256[49] | 52 | 0 | 1568 | +| +| \_pendingOwner | address | 101 | 0 | 20 | +| +| **gap | uint256[49] | 102 | 0 | 1568 | +| +| addressManager | address | 151 | 0 | 20 | +| +| **gap | uint256[49] | 152 | 0 | 1568 | +| +| **reentry | uint8 | 201 | 0 | 1 | +| +| **paused | uint8 | 201 | 1 | 1 | +| +| **lastUnpausedAt | uint64 | 201 | 2 | 8 | +| +| **gap | uint256[49] | 202 | 0 | 1568 | +| +| \_blockhashes | mapping(uint256 => bytes32) | 251 | 0 | 32 | +| +| publicInputHash | bytes32 | 252 | 0 | 32 | +| +| parentGasExcess | uint64 | 253 | 0 | 8 | +| +| lastSyncedBlock | uint64 | 253 | 8 | 8 | +| +| parentTimestamp | uint64 | 253 | 16 | 8 | +| +| parentGasTarget | uint64 | 253 | 24 | 8 | +| +| l1ChainId | uint64 | 254 | 0 | 8 | +| +| \_\_gap | uint256[46] | 255 | 0 | 1472 | +╰------------------+-----------------------------+------+--------+-------+------------------------------------------------------╯ + +## MainnetTaikoL2 + +╭------------------+-----------------------------+------+--------+-------+------------------------------------------------------------╮ +| Name | Type | Slot | Offset | Bytes | ++=====================================================================================================================================+ +| \_initialized | uint8 | 0 | 0 | 1 | +| +| \_initializing | bool | 0 | 1 | 1 | +| +| **gap | uint256[50] | 1 | 0 | 1600 | +| +| \_owner | address | 51 | 0 | 20 | +| +| **gap | uint256[49] | 52 | 0 | 1568 | +| +| \_pendingOwner | address | 101 | 0 | 20 | +| +| **gap | uint256[49] | 102 | 0 | 1568 | +| +| addressManager | address | 151 | 0 | 20 | +| +| **gap | uint256[49] | 152 | 0 | 1568 | +| +| **reentry | uint8 | 201 | 0 | 1 | +| +| **paused | uint8 | 201 | 1 | 1 | +| +| **lastUnpausedAt | uint64 | 201 | 2 | 8 | +| +| **gap | uint256[49] | 202 | 0 | 1568 | +| +| \_blockhashes | mapping(uint256 => bytes32) | 251 | 0 | 32 | +| +| publicInputHash | bytes32 | 252 | 0 | 32 | +| +| parentGasExcess | uint64 | 253 | 0 | 8 | +| +| lastSyncedBlock | uint64 | 253 | 8 | 8 | +| +| parentTimestamp | uint64 | 253 | 16 | 8 | +| +| parentGasTarget | uint64 | 253 | 24 | 8 | +| +| l1ChainId | uint64 | 254 | 0 | 8 | +| +| \_\_gap | uint256[46] | 255 | 0 | 1472 | +╰------------------+-----------------------------+------+--------+-------+------------------------------------------------------------╯ diff --git a/packages/protocol/contracts/L1/ITaikoL1.sol b/packages/protocol/contracts/L1/ITaikoL1.sol deleted file mode 100644 index 2663c8b532e..00000000000 --- a/packages/protocol/contracts/L1/ITaikoL1.sol +++ /dev/null @@ -1,40 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.24; - -import "./TaikoData.sol"; - -/// @title ITaikoL1 -/// @custom:security-contact security@taiko.xyz -interface ITaikoL1 { - /// @notice Proposes a Taiko L2 block. - /// @param _params Block parameters, currently an encoded BlockParams object. - /// @param _txList txList data if calldata is used for DA. - /// @return meta_ The metadata of the proposed L2 block. - /// @return deposits_ The Ether deposits processed. - function proposeBlock( - bytes calldata _params, - bytes calldata _txList - ) - external - payable - returns (TaikoData.BlockMetadata memory meta_, TaikoData.EthDeposit[] memory deposits_); - - /// @notice Proves or contests a block transition. - /// @param _blockId The index of the block to prove. This is also used to - /// select the right implementation version. - /// @param _input An abi-encoded (TaikoData.BlockMetadata, TaikoData.Transition, - /// TaikoData.TierProof) tuple. - function proveBlock(uint64 _blockId, bytes calldata _input) external; - - /// @notice Verifies up to a certain number of blocks. - /// @param _maxBlocksToVerify Max number of blocks to verify. - function verifyBlocks(uint64 _maxBlocksToVerify) external; - - /// @notice Pause block proving. - /// @param _pause True if paused. - function pauseProving(bool _pause) external; - - /// @notice Gets the configuration of the TaikoL1 contract. - /// @return Config struct containing configuration parameters. - function getConfig() external view returns (TaikoData.Config memory); -} diff --git a/packages/protocol/contracts/L1/TaikoData.sol b/packages/protocol/contracts/L1/TaikoData.sol deleted file mode 100644 index 9e93278828c..00000000000 --- a/packages/protocol/contracts/L1/TaikoData.sol +++ /dev/null @@ -1,173 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.24; - -/// @title TaikoData -/// @notice This library defines various data structures used in the Taiko -/// protocol. -/// @custom:security-contact security@taiko.xyz -library TaikoData { - /// @dev Struct holding Taiko configuration parameters. See {TaikoConfig}. - struct Config { - // --------------------------------------------------------------------- - // Group 1: General configs - // --------------------------------------------------------------------- - // The chain ID of the network where Taiko contracts are deployed. - uint64 chainId; - // --------------------------------------------------------------------- - // Group 2: Block level configs - // --------------------------------------------------------------------- - // The maximum number of proposals allowed in a single block. - uint64 blockMaxProposals; - // Size of the block ring buffer, allowing extra space for proposals. - uint64 blockRingBufferSize; - // The maximum number of verifications allowed when a block is proposed. - uint64 maxBlocksToVerifyPerProposal; - // The maximum gas limit allowed for a block. - uint32 blockMaxGasLimit; - // --------------------------------------------------------------------- - // Group 3: Proof related configs - // --------------------------------------------------------------------- - // The amount of Taiko token as a prover liveness bond - uint96 livenessBond; - // --------------------------------------------------------------------- - // Group 4: Cross-chain sync - // --------------------------------------------------------------------- - // The max number of L2 blocks that can stay unsynced on L1 - uint8 blockSyncThreshold; - bool checkEOAForCalldataDA; - } - - /// @dev Struct representing prover fees per given tier - struct TierFee { - uint16 tier; - uint128 fee; - } - - /// @dev A proof and the tier of proof it belongs to - struct TierProof { - uint16 tier; - bytes data; - } - - /// @dev Hook and it's data (currently used only during proposeBlock) - struct HookCall { - address hook; - bytes data; - } - - /// @dev Represents proposeBlock's _data input parameter - struct BlockParams { - address assignedProver; - address coinbase; - bytes32 extraData; - bytes32 parentMetaHash; - HookCall[] hookCalls; - bytes signature; - } - - /// @dev Struct containing data only required for proving a block - /// Note: On L2, `block.difficulty` is the pseudo name of - /// `block.prevrandao`, which returns a random number provided by the layer - /// 1 chain. - struct BlockMetadata { - bytes32 l1Hash; - bytes32 difficulty; - bytes32 blobHash; //or txListHash (if Blob not yet supported) - bytes32 extraData; - bytes32 depositsHash; - address coinbase; // L2 coinbase, - uint64 id; - uint32 gasLimit; - uint64 timestamp; - uint64 l1Height; - uint16 minTier; - bool blobUsed; - bytes32 parentMetaHash; - address sender; // a.k.a proposer - } - - /// @dev Struct representing transition to be proven. - struct Transition { - bytes32 parentHash; - bytes32 blockHash; - bytes32 stateRoot; - bytes32 graffiti; // Arbitrary data that the prover can use for various purposes. - } - - /// @dev Struct representing state transition data. - /// 10 slots reserved for upgradability, 6 slots used. - struct TransitionState { - bytes32 key; // slot 1, only written/read for the 1st state transition. - bytes32 blockHash; // slot 2 - bytes32 stateRoot; // slot 3 - address prover; // slot 4 - uint96 validityBond; - address contester; // slot 5 - uint96 contestBond; - uint64 timestamp; // slot 6 (90 bits) - uint16 tier; - uint8 __reserved1; - } - - /// @dev Struct containing data required for verifying a block. - /// 3 slots used. - struct Block { - bytes32 metaHash; // slot 1 - address assignedProver; // slot 2 - uint96 livenessBond; - uint64 blockId; // slot 3 - uint64 proposedAt; // timestamp - uint64 proposedIn; // L1 block number, required/used by node/client. - uint32 nextTransitionId; - uint32 verifiedTransitionId; - } - - /// @dev Struct representing an Ethereum deposit. - /// 2 slot used. Currently removed from protocol, but to be backwards compatible, the struct and - /// return values stayed for now. - struct EthDeposit { - address recipient; - uint96 amount; - uint64 id; - } - - /// @dev Forge is only able to run coverage in case the contracts by default - /// capable of compiling without any optimization (neither optimizer runs, - /// no compiling --via-ir flag). - /// In order to resolve stack too deep without optimizations, we needed to - /// introduce outsourcing vars into structs below. - struct SlotA { - uint64 genesisHeight; - uint64 genesisTimestamp; - uint64 lastSyncedBlockId; - uint64 lastSynecdAt; // typo! - } - - struct SlotB { - uint64 numBlocks; - uint64 lastVerifiedBlockId; - bool provingPaused; - uint8 __reservedB1; - uint16 __reservedB2; - uint32 __reservedB3; - uint64 lastUnpausedAt; - } - - /// @dev Struct holding the state variables for the {TaikoL1} contract. - struct State { - // Ring buffer for proposed blocks and a some recent verified blocks. - mapping(uint64 blockId_mod_blockRingBufferSize => Block blk) blocks; - // Indexing to transition ids (ring buffer not possible) - mapping(uint64 blockId => mapping(bytes32 parentHash => uint32 transitionId)) transitionIds; - // Ring buffer for transitions - mapping( - uint64 blockId_mod_blockRingBufferSize - => mapping(uint32 transitionId => TransitionState ts) - ) transitions; - // Ring buffer for Ether deposits - bytes32 __reserve1; - SlotA slotA; // slot 5 - SlotB slotB; // slot 6 - uint256[44] __gap; - } -} diff --git a/packages/protocol/contracts/L1/TaikoErrors.sol b/packages/protocol/contracts/L1/TaikoErrors.sol deleted file mode 100644 index b5779fe8472..00000000000 --- a/packages/protocol/contracts/L1/TaikoErrors.sol +++ /dev/null @@ -1,39 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.24; - -/// @title TaikoErrors -/// @notice This abstract contract provides custom error declarations used in -/// the Taiko protocol. Each error corresponds to specific situations where -/// exceptions might be thrown. -/// @dev The errors defined here must match the definitions in the corresponding -/// L1 libraries. -/// @custom:security-contact security@taiko.xyz -abstract contract TaikoErrors { - error L1_ALREADY_CONTESTED(); - error L1_ALREADY_PROVED(); - error L1_BLOB_NOT_AVAILABLE(); - error L1_BLOB_NOT_FOUND(); - error L1_BLOCK_MISMATCH(); - error L1_CANNOT_CONTEST(); - error L1_INVALID_BLOCK_ID(); - error L1_INVALID_CONFIG(); - error L1_INVALID_GENESIS_HASH(); - error L1_INVALID_HOOK(); - error L1_INVALID_PARAM(); - error L1_INVALID_PAUSE_STATUS(); - error L1_INVALID_PROVER(); - error L1_INVALID_SIG(); - error L1_INVALID_TIER(); - error L1_INVALID_TRANSITION(); - error L1_LIVENESS_BOND_NOT_RECEIVED(); - error L1_NOT_ASSIGNED_PROVER(); - error L1_NO_HOOKS(); - error L1_PROVING_PAUSED(); - error L1_RECEIVE_DISABLED(); - error L1_TOO_LATE(); - error L1_TOO_MANY_BLOCKS(); - error L1_TRANSITION_ID_ZERO(); - error L1_TRANSITION_NOT_FOUND(); - error L1_UNEXPECTED_PARENT(); - error L1_UNEXPECTED_TRANSITION_ID(); -} diff --git a/packages/protocol/contracts/L1/TaikoEvents.sol b/packages/protocol/contracts/L1/TaikoEvents.sol deleted file mode 100644 index 454c621f3e6..00000000000 --- a/packages/protocol/contracts/L1/TaikoEvents.sol +++ /dev/null @@ -1,79 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.24; - -import "./TaikoData.sol"; - -/// @title TaikoEvents -/// @notice This abstract contract provides event declarations for the Taiko -/// protocol, which are emitted during block proposal, proof, verification, and -/// Ethereum deposit processes. -/// @dev The events defined here must match the definitions in the corresponding -/// L1 libraries. -/// @custom:security-contact security@taiko.xyz -abstract contract TaikoEvents { - /// @dev Emitted when a block is proposed. - /// @param blockId The ID of the proposed block. - /// @param assignedProver The block's assigned prover. - /// @param livenessBond The bond in Taiko token from the assigned prover. - /// @param meta The block metadata containing information about the proposed - /// block. - /// @param depositsProcessed Ether deposits processed. - event BlockProposed( - uint256 indexed blockId, - address indexed assignedProver, - uint96 livenessBond, - TaikoData.BlockMetadata meta, - TaikoData.EthDeposit[] depositsProcessed - ); - /// @dev Emitted when a block is verified. - /// @param blockId The ID of the verified block. - /// @param prover The prover whose transition is used for verifying the - /// block. - /// @param blockHash The hash of the verified block. - /// @param stateRoot The block's state root. - /// @param tier The tier ID of the proof. - event BlockVerified( - uint256 indexed blockId, - address indexed prover, - bytes32 blockHash, - bytes32 stateRoot, - uint16 tier - ); - - /// @notice Emitted when some state variable values changed. - /// @dev This event is currently used by Taiko node/client for block proposal/proving. - /// @param slotB The SlotB data structure. - event StateVariablesUpdated(TaikoData.SlotB slotB); - - /// @dev Emitted when a block transition is proved or re-proved. - /// @param blockId The ID of the proven block. - /// @param tran The verified transition. - /// @param prover The prover address. - /// @param validityBond The validity bond amount. - /// @param tier The tier ID of the proof. - event TransitionProved( - uint256 indexed blockId, - TaikoData.Transition tran, - address prover, - uint96 validityBond, - uint16 tier - ); - - /// @dev Emitted when a block transition is contested. - /// @param blockId The ID of the proven block. - /// @param tran The verified transition. - /// @param contester The contester address. - /// @param contestBond The contesting bond amount. - /// @param tier The tier ID of the proof. - event TransitionContested( - uint256 indexed blockId, - TaikoData.Transition tran, - address contester, - uint96 contestBond, - uint16 tier - ); - - /// @dev Emitted when proving has been paused - /// @param paused True if paused, false if unpaused. - event ProvingPaused(bool paused); -} diff --git a/packages/protocol/contracts/L1/TaikoL1.sol b/packages/protocol/contracts/L1/TaikoL1.sol deleted file mode 100644 index 7f68cafc9fb..00000000000 --- a/packages/protocol/contracts/L1/TaikoL1.sol +++ /dev/null @@ -1,248 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.24; - -import "../common/EssentialContract.sol"; -import "./libs/LibProposing.sol"; -import "./libs/LibProving.sol"; -import "./libs/LibVerifying.sol"; -import "./ITaikoL1.sol"; -import "./TaikoErrors.sol"; -import "./TaikoEvents.sol"; - -/// @title TaikoL1 -/// @notice This contract serves as the "base layer contract" of the Taiko protocol, providing -/// functionalities for proposing, proving, and verifying blocks. The term "base layer contract" -/// means that although this is usually deployed on L1, it can also be deployed on L2s to create -/// L3 "inception layers". The contract also handles the deposit and withdrawal of Taiko tokens -/// and Ether. Additionally, this contract doesn't hold any Ether. Ether deposited to L2 are held -/// by the Bridge contract. -/// @dev Labeled in AddressResolver as "taiko" -/// @custom:security-contact security@taiko.xyz -contract TaikoL1 is EssentialContract, ITaikoL1, TaikoEvents, TaikoErrors { - /// @notice The TaikoL1 state. - TaikoData.State public state; - - uint256[50] private __gap; - - modifier whenProvingNotPaused() { - if (state.slotB.provingPaused) revert L1_PROVING_PAUSED(); - _; - } - - modifier emitEventForClient() { - _; - LibVerifying.emitEventForClient(state); - } - - /// @dev Allows for receiving Ether from Hooks - receive() external payable { - if (!inNonReentrant()) revert L1_RECEIVE_DISABLED(); - } - - /// @notice Initializes the contract. - /// @param _owner The owner of this contract. msg.sender will be used if this value is zero. - /// @param _addressManager The address of the {AddressManager} contract. - /// @param _genesisBlockHash The block hash of the genesis block. - /// @param _toPause true to pause the contract by default. - function init( - address _owner, - address _addressManager, - bytes32 _genesisBlockHash, - bool _toPause - ) - external - initializer - { - __Essential_init(_owner, _addressManager); - LibVerifying.init(state, getConfig(), _genesisBlockHash); - if (_toPause) _pause(); - } - - function init2() external onlyOwner reinitializer(2) { - // reset some previously used slots for future reuse - state.slotB.__reservedB1 = 0; - state.slotB.__reservedB2 = 0; - state.slotB.__reservedB3 = 0; - state.__reserve1 = 0; - } - - function resetGenesisHash(bytes32 _genesisBlockHash) external onlyOwner { - LibVerifying.resetGenesisHash(state, _genesisBlockHash); - } - - /// @inheritdoc ITaikoL1 - function proposeBlock( - bytes calldata _params, - bytes calldata _txList - ) - external - payable - whenNotPaused - nonReentrant - emitEventForClient - returns (TaikoData.BlockMetadata memory meta_, TaikoData.EthDeposit[] memory deposits_) - { - TaikoData.Config memory config = getConfig(); - IERC20 tko = IERC20(resolve(LibStrings.B_TAIKO_TOKEN, false)); - - (meta_, deposits_) = LibProposing.proposeBlock(state, tko, config, this, _params, _txList); - - if (!state.slotB.provingPaused) { - LibVerifying.verifyBlocks(state, tko, config, this, config.maxBlocksToVerifyPerProposal); - } - } - - /// @inheritdoc ITaikoL1 - function proveBlock( - uint64 _blockId, - bytes calldata _input - ) - external - whenNotPaused - whenProvingNotPaused - nonReentrant - emitEventForClient - { - ( - TaikoData.BlockMetadata memory meta, - TaikoData.Transition memory tran, - TaikoData.TierProof memory proof - ) = abi.decode(_input, (TaikoData.BlockMetadata, TaikoData.Transition, TaikoData.TierProof)); - - if (_blockId != meta.id) revert L1_INVALID_BLOCK_ID(); - - TaikoData.Config memory config = getConfig(); - IERC20 tko = IERC20(resolve(LibStrings.B_TAIKO_TOKEN, false)); - - uint8 maxBlocksToVerify = LibProving.proveBlock(state, tko, config, this, meta, tran, proof); - LibVerifying.verifyBlocks(state, tko, config, this, maxBlocksToVerify); - } - - /// @inheritdoc ITaikoL1 - function verifyBlocks(uint64 _maxBlocksToVerify) - external - whenNotPaused - whenProvingNotPaused - nonReentrant - emitEventForClient - { - LibVerifying.verifyBlocks( - state, - IERC20(resolve(LibStrings.B_TAIKO_TOKEN, false)), - getConfig(), - this, - _maxBlocksToVerify - ); - } - - /// @inheritdoc ITaikoL1 - function pauseProving(bool _pause) external { - _authorizePause(msg.sender, _pause); - LibProving.pauseProving(state, _pause); - } - - /// @inheritdoc EssentialContract - function unpause() public override { - super.unpause(); // permission checked inside - state.slotB.lastUnpausedAt = uint64(block.timestamp); - } - - /// @notice Gets the details of a block. - /// @param _blockId Index of the block. - /// @return blk_ The block. - function getBlock(uint64 _blockId) public view returns (TaikoData.Block memory blk_) { - (blk_,) = LibUtils.getBlock(state, getConfig(), _blockId); - } - - /// @notice Gets the state transition for a specific block. - /// @param _blockId Index of the block. - /// @param _parentHash Parent hash of the block. - /// @return The state transition data of the block. - function getTransition( - uint64 _blockId, - bytes32 _parentHash - ) - public - view - returns (TaikoData.TransitionState memory) - { - return LibUtils.getTransition(state, getConfig(), _blockId, _parentHash); - } - - /// @notice Gets the state transition for a specific block. - /// @param _blockId Index of the block. - /// @param _tid The transition id. - /// @return The state transition data of the block. - function getTransition( - uint64 _blockId, - uint32 _tid - ) - public - view - returns (TaikoData.TransitionState memory) - { - return LibUtils.getTransition(state, getConfig(), _blockId, _tid); - } - /// @notice Gets the state variables of the TaikoL1 contract. - /// @dev This method can be deleted once node/client stops using it. - /// @return State variables stored at SlotA. - /// @return State variables stored at SlotB. - - function getStateVariables() - public - view - returns (TaikoData.SlotA memory, TaikoData.SlotB memory) - { - return (state.slotA, state.slotB); - } - - /// @notice Gets SlotA - /// @return State variables stored at SlotA. - function slotA() public view returns (TaikoData.SlotA memory) { - return state.slotA; - } - - /// @notice Gets SlotB - /// @return State variables stored at SlotB. - function slotB() public view returns (TaikoData.SlotB memory) { - return state.slotB; - } - - /// @inheritdoc ITaikoL1 - function getConfig() public view virtual override returns (TaikoData.Config memory) { - // All hard-coded configurations: - // - treasury: the actual TaikoL2 address. - // - anchorGasLimit: 250_000 (based on internal devnet, its ~220_000 - // after 256 L2 blocks) - return TaikoData.Config({ - chainId: LibNetwork.TAIKO, - // Assume the block time is 3s, the protocol will allow ~90 days of - // new blocks without any verification. - blockMaxProposals: 324_000, // = 45*86400/12, 45 days, 12 seconds avg block time - blockRingBufferSize: 324_512, - // Can be overridden by the tier config. - maxBlocksToVerifyPerProposal: 10, - // This value is set based on `gasTargetPerL1Block = 15_000_000 * 4` in TaikoL2. - // We use 8x rather than 4x here to handle the scenario where the average number of - // Taiko blocks proposed per Ethereum block is smaller than 1. - // There is 250_000 additional gas for the anchor tx. Therefore, on explorers, you'll - // read Taiko's gas limit to be 240_250_000. - blockMaxGasLimit: 240_000_000, - livenessBond: 250e18, // 250 Taiko token - blockSyncThreshold: 16, - checkEOAForCalldataDA: true - }); - } - - /// @dev chain_pauser is supposed to be a cold wallet. - function _authorizePause( - address, - bool - ) - internal - view - virtual - override - onlyFromOwnerOrNamed(LibStrings.B_CHAIN_WATCHDOG) - { } -} diff --git a/packages/protocol/contracts/L1/hooks/AssignmentHook.sol b/packages/protocol/contracts/L1/hooks/AssignmentHook.sol deleted file mode 100644 index adef51ea434..00000000000 --- a/packages/protocol/contracts/L1/hooks/AssignmentHook.sol +++ /dev/null @@ -1,194 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.24; - -import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; -import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; -import "@openzeppelin/contracts/utils/cryptography/SignatureChecker.sol"; -import "../../common/EssentialContract.sol"; -import "../../common/LibStrings.sol"; -import "../../libs/LibAddress.sol"; -import "../ITaikoL1.sol"; -import "./IHook.sol"; - -/// @title AssignmentHook -/// @notice A hook that handles prover assignment verification and fee processing. -/// @custom:security-contact security@taiko.xyz -contract AssignmentHook is EssentialContract, IHook { - using LibAddress for address; - using SignatureChecker for address; - using SafeERC20 for IERC20; - - struct ProverAssignment { - address feeToken; - uint64 expiry; - uint64 maxBlockId; - uint64 maxProposedIn; - bytes32 metaHash; - bytes32 parentMetaHash; - TaikoData.TierFee[] tierFees; - bytes signature; - } - - struct Input { - ProverAssignment assignment; - uint256 tip; // A tip to L1 block builder - } - - event EtherPaymentFailed(address to, uint256 maxGas); - - /// @notice Max gas paying the prover. - /// @dev This should be large enough to prevent the worst cases for the prover. - /// To assure a trustless relationship between the proposer and the prover it's - /// the prover's job to make sure it can get paid within this limit. - uint256 public constant MAX_GAS_PAYING_PROVER = 50_000; - - uint256[50] private __gap; - - error HOOK_ASSIGNMENT_EXPIRED(); - error HOOK_ASSIGNMENT_INVALID_SIG(); - error HOOK_TIER_NOT_FOUND(); - - /// @notice Initializes the contract. - /// @param _owner The owner of this contract. msg.sender will be used if this value is zero. - /// @param _addressManager The address of the {AddressManager} contract. - function init(address _owner, address _addressManager) external initializer { - __Essential_init(_owner, _addressManager); - } - - /// @inheritdoc IHook - function onBlockProposed( - TaikoData.Block calldata _blk, - TaikoData.BlockMetadata calldata _meta, - bytes calldata _data - ) - external - payable - onlyFromNamed(LibStrings.B_TAIKO) - nonReentrant - { - // Note that - // - 'msg.sender' is the TaikoL1 contract address - // - 'block.coinbase' is the L1 block builder - // - 'meta.coinbase' is the L2 block proposer (chosen by block's proposer) - - Input memory input = abi.decode(_data, (Input)); - ProverAssignment memory assignment = input.assignment; - - // Check assignment validity - if ( - block.timestamp > assignment.expiry - || assignment.metaHash != 0 && _blk.metaHash != assignment.metaHash - || assignment.parentMetaHash != 0 && _meta.parentMetaHash != assignment.parentMetaHash - || assignment.maxBlockId != 0 && _meta.id > assignment.maxBlockId - || assignment.maxProposedIn != 0 && block.number > assignment.maxProposedIn - ) { - revert HOOK_ASSIGNMENT_EXPIRED(); - } - - // Hash the assignment with the blobHash, this hash will be signed by - // the prover, therefore, we add a string as a prefix. - - // msg.sender is taikoL1Address - bytes32 hash = hashAssignment( - assignment, msg.sender, _meta.sender, _blk.assignedProver, _meta.blobHash - ); - - if (!_blk.assignedProver.isValidSignatureNow(hash, assignment.signature)) { - revert HOOK_ASSIGNMENT_INVALID_SIG(); - } - - // Send the liveness bond to the Taiko contract - IERC20 tko = IERC20(resolve(LibStrings.B_TAIKO_TOKEN, false)); - - // Note that we don't have to worry about - // https://github.com/crytic/slither/wiki/Detector-Documentation#arbitrary-from-in-transferfrom - // as `assignedProver` has provided a signature above to authorize this hook. - tko.safeTransferFrom(_blk.assignedProver, msg.sender, _blk.livenessBond); - - // Find the prover fee using the minimal tier - uint256 proverFee = _getProverFee(assignment.tierFees, _meta.minTier); - - // The proposer irrevocably pays a fee to the assigned prover, either in - // Ether or ERC20 tokens. - if (assignment.feeToken == address(0)) { - // Paying Ether even when proverFee is 0 to trigger a potential receive() function call. - // Note that this payment may fail if it cost more gas - bool success = _blk.assignedProver.sendEther(proverFee, MAX_GAS_PAYING_PROVER, ""); - if (!success) emit EtherPaymentFailed(_blk.assignedProver, MAX_GAS_PAYING_PROVER); - } else if (proverFee != 0 && _meta.sender != _blk.assignedProver) { - // Paying ERC20 tokens - IERC20(assignment.feeToken).safeTransferFrom( - _meta.sender, _blk.assignedProver, proverFee - ); - } - - // block.coinbase can be address(0) in tests - if (input.tip != 0 && block.coinbase != address(0)) { - address(block.coinbase).sendEtherAndVerify(input.tip); - } - - // Send all remaining Ether back to TaikoL1 contract - if (address(this).balance != 0) { - msg.sender.sendEtherAndVerify(address(this).balance); - } - } - - /// @notice Hashes the prover assignment. - /// @param _assignment The prover assignment. - /// @param _taikoL1Address The address of the TaikoL1 contract. - /// @param _blockProposer The block proposer address. - /// @param _assignedProver The assigned prover address. - /// @param _blobHash The blob hash. - /// @return The hash of the prover assignment. - function hashAssignment( - ProverAssignment memory _assignment, - address _taikoL1Address, - address _blockProposer, - address _assignedProver, - bytes32 _blobHash - ) - public - view - returns (bytes32) - { - // split up into two parts otherwise stack is too deep - bytes32 hash = keccak256( - abi.encode( - _assignment.metaHash, - _assignment.parentMetaHash, - _assignment.feeToken, - _assignment.expiry, - _assignment.maxBlockId, - _assignment.maxProposedIn, - _assignment.tierFees - ) - ); - - return keccak256( - abi.encodePacked( - LibStrings.B_PROVER_ASSIGNMENT, - ITaikoL1(_taikoL1Address).getConfig().chainId, - _taikoL1Address, - _blockProposer, - _assignedProver, - _blobHash, - hash, - address(this) - ) - ); - } - - function _getProverFee( - TaikoData.TierFee[] memory _tierFees, - uint16 _tierId - ) - private - pure - returns (uint256) - { - for (uint256 i; i < _tierFees.length; ++i) { - if (_tierFees[i].tier == _tierId) return _tierFees[i].fee; - } - revert HOOK_TIER_NOT_FOUND(); - } -} diff --git a/packages/protocol/contracts/L1/hooks/IHook.sol b/packages/protocol/contracts/L1/hooks/IHook.sol deleted file mode 100644 index d78109f5447..00000000000 --- a/packages/protocol/contracts/L1/hooks/IHook.sol +++ /dev/null @@ -1,20 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.24; - -import "../TaikoData.sol"; - -/// @title IHook -/// @custom:security-contact security@taiko.xyz -interface IHook { - /// @notice Called when a block is proposed. - /// @param _blk The proposed block. - /// @param _meta The metadata of the proposed block. - /// @param _data The data of the proposed block. - function onBlockProposed( - TaikoData.Block calldata _blk, - TaikoData.BlockMetadata calldata _meta, - bytes calldata _data - ) - external - payable; -} diff --git a/packages/protocol/contracts/L1/libs/LibProposing.sol b/packages/protocol/contracts/L1/libs/LibProposing.sol deleted file mode 100644 index 9c8244e3439..00000000000 --- a/packages/protocol/contracts/L1/libs/LibProposing.sol +++ /dev/null @@ -1,233 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.24; - -import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; -import "../../libs/LibAddress.sol"; -import "../../libs/LibNetwork.sol"; -import "../hooks/IHook.sol"; -import "./LibUtils.sol"; - -/// @title LibProposing -/// @notice A library for handling block proposals in the Taiko protocol. -/// @custom:security-contact security@taiko.xyz -library LibProposing { - using LibAddress for address; - - // = keccak256(abi.encode(new TaikoData.EthDeposit[](0))) - bytes32 private constant _EMPTY_ETH_DEPOSIT_HASH = - 0x569e75fc77c1a856f6daaf9e69d8a9566ca34aa47f9133711ce065a571af0cfd; - - // Warning: Any events defined here must also be defined in TaikoEvents.sol. - /// @notice Emitted when a block is proposed. - /// @param blockId The ID of the proposed block. - /// @param assignedProver The address of the assigned prover. - /// @param livenessBond The liveness bond of the proposed block. - /// @param meta The metadata of the proposed block. - /// @param depositsProcessed The EthDeposit array about processed deposits in this proposed - /// block. - event BlockProposed( - uint256 indexed blockId, - address indexed assignedProver, - uint96 livenessBond, - TaikoData.BlockMetadata meta, - TaikoData.EthDeposit[] depositsProcessed - ); - - // Warning: Any errors defined here must also be defined in TaikoErrors.sol. - error L1_BLOB_NOT_AVAILABLE(); - error L1_BLOB_NOT_FOUND(); - error L1_INVALID_HOOK(); - error L1_INVALID_PROVER(); - error L1_INVALID_SIG(); - error L1_LIVENESS_BOND_NOT_RECEIVED(); - error L1_NOT_SAME_ADDRESS(); - error L1_TOO_MANY_BLOCKS(); - error L1_UNEXPECTED_PARENT(); - - /// @dev Proposes a Taiko L2 block. - /// @param _state Current TaikoData.State. - /// @param _tko The taiko token. - /// @param _config Actual TaikoData.Config. - /// @param _resolver Address resolver interface. - /// @param _data Encoded data bytes containing the block params. - /// @param _txList Transaction list bytes (if not blob). - /// @return meta_ The constructed block's metadata. - function proposeBlock( - TaikoData.State storage _state, - IERC20 _tko, - TaikoData.Config memory _config, - IAddressResolver _resolver, - bytes calldata _data, - bytes calldata _txList - ) - internal - returns (TaikoData.BlockMetadata memory meta_, TaikoData.EthDeposit[] memory deposits_) - { - TaikoData.BlockParams memory params = abi.decode(_data, (TaikoData.BlockParams)); - - // We need a prover that will submit proofs after the block has been submitted - if (params.assignedProver == address(0)) { - revert L1_INVALID_PROVER(); - } - - if (params.coinbase == address(0)) { - params.coinbase = msg.sender; - } - - // Taiko, as a Based Rollup, enables permissionless block proposals. - TaikoData.SlotB memory b = _state.slotB; - - // It's essential to ensure that the ring buffer for proposed blocks - // still has space for at least one more block. - if (b.numBlocks >= b.lastVerifiedBlockId + _config.blockMaxProposals + 1) { - revert L1_TOO_MANY_BLOCKS(); - } - - bytes32 parentMetaHash = - _state.blocks[(b.numBlocks - 1) % _config.blockRingBufferSize].metaHash; - // assert(parentMetaHash != 0); - - // Check if parent block has the right meta hash. This is to allow the proposer to make sure - // the block builds on the expected latest chain state. - if (params.parentMetaHash != 0 && parentMetaHash != params.parentMetaHash) { - revert L1_UNEXPECTED_PARENT(); - } - - // Initialize metadata to compute a metaHash, which forms a part of - // the block data to be stored on-chain for future integrity checks. - // If we choose to persist all data fields in the metadata, it will - // require additional storage slots. - unchecked { - meta_ = TaikoData.BlockMetadata({ - l1Hash: blockhash(block.number - 1), - difficulty: 0, // to be initialized below - blobHash: 0, // to be initialized below - extraData: params.extraData, - depositsHash: _EMPTY_ETH_DEPOSIT_HASH, - coinbase: params.coinbase, - id: b.numBlocks, - gasLimit: _config.blockMaxGasLimit, - timestamp: uint64(block.timestamp), - l1Height: uint64(block.number - 1), - minTier: 0, // to be initialized below - blobUsed: _txList.length == 0, - parentMetaHash: parentMetaHash, - sender: msg.sender - }); - } - - // Update certain meta fields - if (meta_.blobUsed) { - if (!LibNetwork.isDencunSupported(block.chainid)) revert L1_BLOB_NOT_AVAILABLE(); - - // Always use the first blob in this transaction. If the - // proposeBlock functions are called more than once in the same - // L1 transaction, these multiple L2 blocks will share the same - // blob. - meta_.blobHash = blobhash(0); - if (meta_.blobHash == 0) revert L1_BLOB_NOT_FOUND(); - } else { - meta_.blobHash = keccak256(_txList); - - // This function must be called as the outmost transaction (not an internal one) for - // the node to extract the calldata easily. - // We cannot rely on `msg.sender != tx.origin` for EOA check, as it will break after EIP - // 7645: Alias ORIGIN to SENDER - if ( - _config.checkEOAForCalldataDA - && ECDSA.recover(meta_.blobHash, params.signature) != msg.sender - ) { - revert L1_INVALID_SIG(); - } - } - - // Following the Merge, the L1 mixHash incorporates the - // prevrandao value from the beacon chain. Given the possibility - // of multiple Taiko blocks being proposed within a single - // Ethereum block, we choose to introduce a salt to this random - // number as the L2 mixHash. - meta_.difficulty = keccak256(abi.encodePacked(block.prevrandao, b.numBlocks, block.number)); - - { - ITierRouter tierRouter = ITierRouter(_resolver.resolve(LibStrings.B_TIER_ROUTER, false)); - ITierProvider tierProvider = ITierProvider(tierRouter.getProvider(b.numBlocks)); - - // Use the difficulty as a random number - meta_.minTier = tierProvider.getMinTier(uint256(meta_.difficulty)); - } - - // Create the block that will be stored onchain - TaikoData.Block memory blk = TaikoData.Block({ - metaHash: keccak256(abi.encode(meta_)), - // Safeguard the liveness bond to ensure its preservation, - // particularly in scenarios where it might be altered after the - // block's proposal but before it has been proven or verified. - livenessBond: _config.livenessBond, - blockId: b.numBlocks, - proposedAt: meta_.timestamp, - proposedIn: uint64(block.number), - // For a new block, the next transition ID is always 1, not 0. - nextTransitionId: 1, - // For unverified block, its verifiedTransitionId is always 0. - verifiedTransitionId: 0, - assignedProver: params.assignedProver - }); - - // Store the block in the ring buffer - _state.blocks[b.numBlocks % _config.blockRingBufferSize] = blk; - - // Increment the counter (cursor) by 1. - unchecked { - ++_state.slotB.numBlocks; - } - - if (params.hookCalls.length == 0) { - if (params.assignedProver != msg.sender) revert L1_NOT_SAME_ADDRESS(); - _tko.transferFrom(msg.sender, address(this), _config.livenessBond); - } else { - uint256 tkoBalance = _tko.balanceOf(address(this)); - - // Run all hooks. - // Note that address(this).balance has been updated with msg.value, - // prior to any code in this function has been executed. - address prevHook; - for (uint256 i; i < params.hookCalls.length; ++i) { - if (uint160(prevHook) >= uint160(params.hookCalls[i].hook)) { - revert L1_INVALID_HOOK(); - } - - // When a hook is called, all ether in this contract will be sent to the hook. - // If the ether sent to the hook is not used entirely, the hook shall send the Ether - // back to this contract for the next hook to use. - // Proposers shall choose to use extra hooks wisely. - IHook(params.hookCalls[i].hook).onBlockProposed{ value: address(this).balance }( - blk, meta_, params.hookCalls[i].data - ); - - prevHook = params.hookCalls[i].hook; - } - - // Check that after hooks, the Taiko Token balance of this contract - // have increased by the same amount as _config.livenessBond (to prevent) - // multiple draining payments by a malicious proposer nesting the same - // hook. - if (_tko.balanceOf(address(this)) != tkoBalance + _config.livenessBond) { - revert L1_LIVENESS_BOND_NOT_RECEIVED(); - } - } - - // Refund Ether - if (address(this).balance != 0) { - msg.sender.sendEtherAndVerify(address(this).balance); - } - - deposits_ = new TaikoData.EthDeposit[](0); - emit BlockProposed({ - blockId: blk.blockId, - assignedProver: blk.assignedProver, - livenessBond: _config.livenessBond, - meta: meta_, - depositsProcessed: deposits_ - }); - } -} diff --git a/packages/protocol/contracts/L1/libs/LibProving.sol b/packages/protocol/contracts/L1/libs/LibProving.sol deleted file mode 100644 index 210525f7ddb..00000000000 --- a/packages/protocol/contracts/L1/libs/LibProving.sol +++ /dev/null @@ -1,468 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.24; - -import "../../verifiers/IVerifier.sol"; -import "./LibUtils.sol"; - -/// @title LibProving -/// @notice A library for handling block contestation and proving in the Taiko -/// protocol. -/// @custom:security-contact security@taiko.xyz -library LibProving { - using LibMath for uint256; - - // A struct to get around stack too deep issue and to cache state variables for multiple reads. - struct Local { - TaikoData.SlotB b; - ITierProvider.Tier tier; - ITierProvider.Tier minTier; - bytes32 metaHash; - address assignedProver; - uint64 slot; - uint64 blockId; - uint32 tid; - bool lastUnpausedAt; - bool isTopTier; - bool inProvingWindow; - bool sameTransition; - } - - // Warning: Any events defined here must also be defined in TaikoEvents.sol. - /// @notice Emitted when a transition is proved. - /// @param blockId The block ID. - /// @param tran The transition data. - /// @param prover The prover's address. - /// @param validityBond The validity bond amount. - /// @param tier The tier of the proof. - event TransitionProved( - uint256 indexed blockId, - TaikoData.Transition tran, - address prover, - uint96 validityBond, - uint16 tier - ); - - /// @notice Emitted when a transition is contested. - /// @param blockId The block ID. - /// @param tran The transition data. - /// @param contester The contester's address. - /// @param contestBond The contest bond amount. - /// @param tier The tier of the proof. - event TransitionContested( - uint256 indexed blockId, - TaikoData.Transition tran, - address contester, - uint96 contestBond, - uint16 tier - ); - - /// @notice Emitted when proving is paused or unpaused. - /// @param paused The pause status. - event ProvingPaused(bool paused); - - // Warning: Any errors defined here must also be defined in TaikoErrors.sol. - error L1_ALREADY_CONTESTED(); - error L1_ALREADY_PROVED(); - error L1_BLOCK_MISMATCH(); - error L1_CANNOT_CONTEST(); - error L1_INVALID_BLOCK_ID(); - error L1_INVALID_PAUSE_STATUS(); - error L1_INVALID_TIER(); - error L1_INVALID_TRANSITION(); - error L1_NOT_ASSIGNED_PROVER(); - - /// @notice Pauses or unpauses the proving process. - /// @param _state Current TaikoData.State. - /// @param _pause The pause status. - function pauseProving(TaikoData.State storage _state, bool _pause) internal { - if (_state.slotB.provingPaused == _pause) revert L1_INVALID_PAUSE_STATUS(); - _state.slotB.provingPaused = _pause; - - if (!_pause) { - _state.slotB.lastUnpausedAt = uint64(block.timestamp); - } - emit ProvingPaused(_pause); - } - - /// @dev Proves or contests a block transition. - /// @param _state Current TaikoData.State. - /// @param _tko The taiko token. - /// @param _config Actual TaikoData.Config. - /// @param _resolver Address resolver interface. - /// @param _meta The block's metadata. - /// @param _tran The transition data. - /// @param _proof The proof. - /// @return The number of blocks to be verified with this transaction. - function proveBlock( - TaikoData.State storage _state, - IERC20 _tko, - TaikoData.Config memory _config, - IAddressResolver _resolver, - TaikoData.BlockMetadata memory _meta, - TaikoData.Transition memory _tran, - TaikoData.TierProof memory _proof - ) - internal - returns (uint8) - { - // Make sure parentHash is not zero - // To contest an existing transition, simply use any non-zero value as - // the blockHash and stateRoot. - if (_tran.parentHash == 0 || _tran.blockHash == 0 || _tran.stateRoot == 0) { - revert L1_INVALID_TRANSITION(); - } - - Local memory local; - local.b = _state.slotB; - - // Check that the block has been proposed but has not yet been verified. - if (_meta.id <= local.b.lastVerifiedBlockId || _meta.id >= local.b.numBlocks) { - revert L1_INVALID_BLOCK_ID(); - } - - local.slot = _meta.id % _config.blockRingBufferSize; - TaikoData.Block storage blk = _state.blocks[local.slot]; - - local.blockId = blk.blockId; - local.assignedProver = blk.assignedProver; - local.metaHash = blk.metaHash; - - // Check the integrity of the block data. It's worth noting that in - // theory, this check may be skipped, but it's included for added - // caution. - if (local.blockId != _meta.id || local.metaHash != keccak256(abi.encode(_meta))) { - revert L1_BLOCK_MISMATCH(); - } - - // Each transition is uniquely identified by the parentHash, with the - // blockHash and stateRoot open for later updates as higher-tier proofs - // become available. In cases where a transition with the specified - // parentHash does not exist, the transition ID (tid) will be set to 0. - TaikoData.TransitionState storage ts; - (local.tid, ts) = _fetchOrCreateTransition(_state, blk, _tran, local); - - // The new proof must meet or exceed the minimum tier required by the - // block or the previous proof; it cannot be on a lower tier. - if (_proof.tier == 0 || _proof.tier < _meta.minTier || _proof.tier < ts.tier) { - revert L1_INVALID_TIER(); - } - - // Retrieve the tier configurations. If the tier is not supported, the - // subsequent action will result in a revert. - { - ITierRouter tierRouter = ITierRouter(_resolver.resolve(LibStrings.B_TIER_ROUTER, false)); - ITierProvider tierProvider = ITierProvider(tierRouter.getProvider(local.blockId)); - - local.tier = tierProvider.getTier(_proof.tier); - local.minTier = tierProvider.getTier(_meta.minTier); - } - - local.inProvingWindow = !LibUtils.isPostDeadline({ - _tsTimestamp: ts.timestamp, - _lastUnpausedAt: local.b.lastUnpausedAt, - _windowMinutes: local.minTier.provingWindow - }); - - // Checks if only the assigned prover is permissioned to prove the block. - // The assigned prover is granted exclusive permission to prove only the first - // transition. - if ( - local.tier.contestBond != 0 && ts.contester == address(0) && local.tid == 1 - && ts.tier == 0 && local.inProvingWindow - ) { - if (msg.sender != local.assignedProver) revert L1_NOT_ASSIGNED_PROVER(); - } - // We must verify the proof, and any failure in proof verification will - // result in a revert. - // - // It's crucial to emphasize that the proof can be assessed in two - // potential modes: "proving mode" and "contesting mode." However, the - // precise verification logic is defined within each tier's IVerifier - // contract implementation. We simply specify to the verifier contract - // which mode it should utilize - if the new tier is higher than the - // previous tier, we employ the proving mode; otherwise, we employ the - // contesting mode (the new tier cannot be lower than the previous tier, - // this has been checked above). - // - // It's obvious that proof verification is entirely decoupled from - // Taiko's core protocol. - if (local.tier.verifierName != "") { - address verifier = _resolver.resolve(local.tier.verifierName, false); - bool isContesting = _proof.tier == ts.tier && local.tier.contestBond != 0; - - IVerifier.Context memory ctx = IVerifier.Context({ - metaHash: local.metaHash, - blobHash: _meta.blobHash, - // Separate msgSender to allow the prover to be any address in the future. - prover: msg.sender, - msgSender: msg.sender, - blockId: local.blockId, - isContesting: isContesting, - blobUsed: _meta.blobUsed - }); - - IVerifier(verifier).verifyProof(ctx, _tran, _proof); - } - - local.isTopTier = local.tier.contestBond == 0; - local.sameTransition = _tran.blockHash == ts.blockHash && _tran.stateRoot == ts.stateRoot; - - if (_proof.tier > ts.tier) { - // Handles the case when an incoming tier is higher than the current transition's tier. - // Reverts when the incoming proof tries to prove the same transition - // (L1_ALREADY_PROVED). - _overrideWithHigherProof(blk, ts, _tran, _proof, local, _tko); - - emit TransitionProved({ - blockId: local.blockId, - tran: _tran, - prover: msg.sender, - validityBond: local.tier.validityBond, - tier: _proof.tier - }); - } else { - // New transition and old transition on the same tier - and if this transaction tries to - // prove the same, it reverts - if (local.sameTransition) revert L1_ALREADY_PROVED(); - - if (local.isTopTier) { - // The top tier prover re-proves. - assert(local.tier.validityBond == 0); - assert(ts.validityBond == 0 && ts.contester == address(0)); - - ts.prover = msg.sender; - ts.blockHash = _tran.blockHash; - ts.stateRoot = _tran.stateRoot; - - emit TransitionProved({ - blockId: local.blockId, - tran: _tran, - prover: msg.sender, - validityBond: 0, - tier: _proof.tier - }); - } else { - // Contesting but not on the highest tier - if (ts.contester != address(0)) revert L1_ALREADY_CONTESTED(); - - // Making it a non-sliding window, relative when ts.timestamp was registered (or to - // lastUnpaused if that one is bigger) - if ( - LibUtils.isPostDeadline( - ts.timestamp, local.b.lastUnpausedAt, local.tier.cooldownWindow - ) - ) { - revert L1_CANNOT_CONTEST(); - } - - // _checkIfContestable(/*_state,*/ tier.cooldownWindow, ts.timestamp); - // Burn the contest bond from the prover. - _tko.transferFrom(msg.sender, address(this), local.tier.contestBond); - - // We retain the contest bond within the transition, just in - // case this configuration is altered to a different value - // before the contest is resolved. - // - // It's worth noting that the previous value of ts.contestBond - // doesn't have any significance. - ts.contestBond = local.tier.contestBond; - ts.contester = msg.sender; - - emit TransitionContested({ - blockId: local.blockId, - tran: _tran, - contester: msg.sender, - contestBond: local.tier.contestBond, - tier: _proof.tier - }); - } - } - - ts.timestamp = uint64(block.timestamp); - return local.tier.maxBlocksToVerifyPerProof; - } - - /// @dev Handle the transition initialization logic - function _fetchOrCreateTransition( - TaikoData.State storage _state, - TaikoData.Block storage _blk, - TaikoData.Transition memory _tran, - Local memory _local - ) - private - returns (uint32 tid_, TaikoData.TransitionState storage ts_) - { - tid_ = LibUtils.getTransitionId(_state, _blk, _local.slot, _tran.parentHash); - - if (tid_ == 0) { - // In cases where a transition with the provided parentHash is not - // found, we must essentially "create" one and set it to its initial - // state. This initial state can be viewed as a special transition - // on tier-0. - // - // Subsequently, we transform this tier-0 transition into a - // non-zero-tier transition with a proof. This approach ensures that - // the same logic is applicable for both 0-to-non-zero transition - // updates and non-zero-to-non-zero transition updates. - unchecked { - // Unchecked is safe: Not realistic 2**32 different fork choice - // per block will be proven and none of them is valid - tid_ = _blk.nextTransitionId++; - } - - // Keep in mind that state.transitions are also reusable storage - // slots, so it's necessary to reinitialize all transition fields - // below. - ts_ = _state.transitions[_local.slot][tid_]; - ts_.blockHash = 0; - ts_.stateRoot = 0; - ts_.validityBond = 0; - ts_.contester = address(0); - ts_.contestBond = 1; // to save gas - ts_.timestamp = _blk.proposedAt; - ts_.tier = 0; - ts_.__reserved1 = 0; - - if (tid_ == 1) { - // This approach serves as a cost-saving technique for the - // majority of blocks, where the first transition is expected to - // be the correct one. Writing to `transitions` is more economical - // since it resides in the ring buffer, whereas writing to - // `transitionIds` is not as cost-effective. - ts_.key = _tran.parentHash; - - // In the case of this first transition, the block's assigned - // prover has the privilege to re-prove it, but only when the - // assigned prover matches the previous prover. To ensure this, - // we establish the transition's prover as the block's assigned - // prover. Consequently, when we carry out a 0-to-non-zero - // transition update, the previous prover will consistently be - // the block's assigned prover. - // - // While alternative implementations are possible, introducing - // such changes would require additional if-else logic. - ts_.prover = _local.assignedProver; - } else { - // In scenarios where this transition is not the first one, we - // straightforwardly reset the transition prover to address - // zero. - ts_.prover = address(0); - - // Furthermore, we index the transition for future retrieval. - // It's worth emphasizing that this mapping for indexing is not - // reusable. However, given that the majority of blocks will - // only possess one transition — the correct one — we don't need - // to be concerned about the cost in this case. - _state.transitionIds[_local.blockId][_tran.parentHash] = tid_; - - // There is no need to initialize ts.key here because it's only used when tid == 1 - } - } else { - // A transition with the provided parentHash has been located. - ts_ = _state.transitions[_local.slot][tid_]; - } - } - - /// @dev Handles what happens when either the first transition is being proven or there is a - /// higher tier proof incoming - /// - /// Assume Alice is the initial prover, Bob is the contester, and Cindy is the subsequent - /// prover. The validity bond `V` is set at 100, and the contestation bond `C` at 500. If Bob - /// successfully contests, he receives a reward of 65.625, calculated as 3/4 of 7/8 of 100. Cindy - /// receives 21.875, which is 1/4 of 7/8 of 100, while the protocol retains 12.5 as friction. - /// Bob's Return on Investment (ROI) is 13.125%, calculated from 65.625 divided by 500. - // To establish the expected ROI `r` for valid contestations, where the contestation bond `C` to - // validity bond `V` ratio is `C/V = 21/(32*r)`, and if `r` set at 10%, the C/V ratio will be - // 6.5625. - function _overrideWithHigherProof( - TaikoData.Block storage _blk, - TaikoData.TransitionState storage _ts, - TaikoData.Transition memory _tran, - TaikoData.TierProof memory _proof, - Local memory _local, - IERC20 _tko - ) - private - { - // Higher tier proof overwriting lower tier proof - uint256 reward; // reward to the new (current) prover - - if (_ts.contester != address(0)) { - // assert(_blk.livenessBond == 0); - - if (_local.sameTransition) { - // The contested transition is proven to be valid, contester loses the game - reward = _rewardAfterFriction(_ts.contestBond); - - // We return the validity bond back, but the original prover doesn't get any reward. - _tko.transfer(_ts.prover, _ts.validityBond); - } else { - // The contested transition is proven to be invalid, contester wins the game. - // Contester gets 3/4 of reward, the new prover gets 1/4. - reward = _rewardAfterFriction(_ts.validityBond) >> 2; - - _tko.transfer(_ts.contester, _ts.contestBond + reward * 3); - } - } else { - if (_local.sameTransition) revert L1_ALREADY_PROVED(); - - // The code below will be executed if - // - 1) the transition is proved for the fist time, or - // - 2) the transition is contested. - reward = _rewardAfterFriction(_ts.validityBond); - - uint256 livenessBond = _blk.livenessBond; - if (livenessBond != 0) { - // After the first proof, the block's liveness bond will always be reset to 0. - // This means liveness bond will be handled only once for any given block. - _blk.livenessBond = 0; - - if (_returnLivenessBond(_local, _proof.data)) { - if (_blk.assignedProver == msg.sender) { - reward += livenessBond; - } else { - _tko.transfer(_blk.assignedProver, livenessBond); - } - } - } - } - - unchecked { - if (reward > _local.tier.validityBond) { - _tko.transfer(msg.sender, reward - _local.tier.validityBond); - } else if (reward < _local.tier.validityBond) { - _tko.transferFrom(msg.sender, address(this), _local.tier.validityBond - reward); - } - } - - _ts.validityBond = _local.tier.validityBond; - _ts.contestBond = 1; // to save gas - _ts.contester = address(0); - _ts.prover = msg.sender; - _ts.tier = _proof.tier; - - if (!_local.sameTransition) { - _ts.blockHash = _tran.blockHash; - _ts.stateRoot = _tran.stateRoot; - } - } - - /// @dev Returns the reward after applying 12.5% friction. - function _rewardAfterFriction(uint256 _amount) private pure returns (uint256) { - return _amount == 0 ? 0 : (_amount * 7) >> 3; - } - - /// @dev Returns if the liveness bond shall be returned. - function _returnLivenessBond( - Local memory _local, - bytes memory _proofData - ) - private - pure - returns (bool) - { - return _local.inProvingWindow && _local.tid == 1 - || _local.isTopTier && _proofData.length == 32 - && bytes32(_proofData) == LibStrings.H_RETURN_LIVENESS_BOND; - } -} diff --git a/packages/protocol/contracts/L1/libs/LibUtils.sol b/packages/protocol/contracts/L1/libs/LibUtils.sol deleted file mode 100644 index 1d033cd00ba..00000000000 --- a/packages/protocol/contracts/L1/libs/LibUtils.sol +++ /dev/null @@ -1,126 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.24; - -import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; - -import "../../common/IAddressResolver.sol"; -import "../../common/LibStrings.sol"; -import "../../libs/LibMath.sol"; -import "../tiers/ITierProvider.sol"; -import "../tiers/ITierRouter.sol"; -import "../TaikoData.sol"; - -/// @title LibUtils -/// @notice A library that offers helper functions. -/// @custom:security-contact security@taiko.xyz -library LibUtils { - using LibMath for uint256; - - // Warning: Any errors defined here must also be defined in TaikoErrors.sol. - error L1_BLOCK_MISMATCH(); - error L1_INVALID_BLOCK_ID(); - error L1_TRANSITION_NOT_FOUND(); - error L1_UNEXPECTED_TRANSITION_ID(); - - /// @notice This function will revert if the transition is not found. - /// @dev Retrieves the transition with a given parentHash. - /// @param _state Current TaikoData.State. - /// @param _config Actual TaikoData.Config. - /// @param _blockId Id of the block. - /// @param _parentHash Parent hash of the block. - /// @return The state transition data of the block. - function getTransition( - TaikoData.State storage _state, - TaikoData.Config memory _config, - uint64 _blockId, - bytes32 _parentHash - ) - internal - view - returns (TaikoData.TransitionState storage) - { - (TaikoData.Block storage blk, uint64 slot) = getBlock(_state, _config, _blockId); - - uint32 tid = getTransitionId(_state, blk, slot, _parentHash); - if (tid == 0) revert L1_TRANSITION_NOT_FOUND(); - - return _state.transitions[slot][tid]; - } - - /// @notice This function will revert if the transition is not found. - /// @dev Retrieves the transition with a given parentHash. - /// @param _state Current TaikoData.State. - /// @param _config Actual TaikoData.Config. - /// @param _blockId Id of the block. - /// @param _tid The transition id. - /// @return The state transition data of the block. - function getTransition( - TaikoData.State storage _state, - TaikoData.Config memory _config, - uint64 _blockId, - uint32 _tid - ) - internal - view - returns (TaikoData.TransitionState storage) - { - (TaikoData.Block storage blk, uint64 slot) = getBlock(_state, _config, _blockId); - - if (_tid == 0 || _tid >= blk.nextTransitionId) revert L1_TRANSITION_NOT_FOUND(); - return _state.transitions[slot][_tid]; - } - - /// @dev Retrieves a block based on its ID. - /// @param _state Current TaikoData.State. - /// @param _config Actual TaikoData.Config. - /// @param _blockId Id of the block. - function getBlock( - TaikoData.State storage _state, - TaikoData.Config memory _config, - uint64 _blockId - ) - internal - view - returns (TaikoData.Block storage blk_, uint64 slot_) - { - slot_ = _blockId % _config.blockRingBufferSize; - blk_ = _state.blocks[slot_]; - if (blk_.blockId != _blockId) revert L1_INVALID_BLOCK_ID(); - } - - /// @dev Retrieves the ID of the transition with a given parentHash. - /// This function will return 0 if the transition is not found. - function getTransitionId( - TaikoData.State storage _state, - TaikoData.Block storage _blk, - uint64 _slot, - bytes32 _parentHash - ) - internal - view - returns (uint32 tid_) - { - if (_state.transitions[_slot][1].key == _parentHash) { - tid_ = 1; - if (tid_ >= _blk.nextTransitionId) revert L1_UNEXPECTED_TRANSITION_ID(); - } else { - tid_ = _state.transitionIds[_blk.blockId][_parentHash]; - if (tid_ != 0 && tid_ >= _blk.nextTransitionId) revert L1_UNEXPECTED_TRANSITION_ID(); - } - } - - function isPostDeadline( - uint256 _tsTimestamp, - uint256 _lastUnpausedAt, - uint256 _windowMinutes - ) - internal - view - returns (bool) - { - unchecked { - uint256 deadline = _tsTimestamp.max(_lastUnpausedAt) + _windowMinutes * 60; - return block.timestamp >= deadline; - } - } -} diff --git a/packages/protocol/contracts/L1/libs/LibVerifying.sol b/packages/protocol/contracts/L1/libs/LibVerifying.sol deleted file mode 100644 index 69ac3bcfe17..00000000000 --- a/packages/protocol/contracts/L1/libs/LibVerifying.sol +++ /dev/null @@ -1,262 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.24; - -import "../../signal/ISignalService.sol"; -import "./LibUtils.sol"; - -/// @title LibVerifying -/// @notice A library for handling block verification in the Taiko protocol. -/// @custom:security-contact security@taiko.xyz -library LibVerifying { - using LibMath for uint256; - - // Warning: Any events defined here must also be defined in TaikoEvents.sol. - /// @notice Emitted when a block is verified. - /// @param blockId The block ID. - /// @param prover The actual prover of the block. - /// @param blockHash The block hash. - /// @param stateRoot The state root. - /// @param tier The tier of the transition used for verification. - event BlockVerified( - uint256 indexed blockId, - address indexed prover, - bytes32 blockHash, - bytes32 stateRoot, - uint16 tier - ); - - /// @notice Emitted when some state variable values changed. - /// @dev This event is currently used by Taiko node/client for block proposal/proving. - /// @param slotB The SlotB data structure. - event StateVariablesUpdated(TaikoData.SlotB slotB); - - // Warning: Any errors defined here must also be defined in TaikoErrors.sol. - error L1_BLOCK_MISMATCH(); - error L1_INVALID_CONFIG(); - error L1_INVALID_GENESIS_HASH(); - error L1_TRANSITION_ID_ZERO(); - error L1_TOO_LATE(); - - /// @notice Initializes the Taiko protocol state. - /// @param _state The state to initialize. - /// @param _config The configuration for the Taiko protocol. - /// @param _genesisBlockHash The block hash of the genesis block. - function init( - TaikoData.State storage _state, - TaikoData.Config memory _config, - bytes32 _genesisBlockHash - ) - internal - { - if (!_isConfigValid(_config)) revert L1_INVALID_CONFIG(); - - _setupGenesisBlock(_state, _genesisBlockHash); - } - - function resetGenesisHash(TaikoData.State storage _state, bytes32 _genesisBlockHash) internal { - if (_state.slotB.numBlocks != 1) revert L1_TOO_LATE(); - - _setupGenesisBlock(_state, _genesisBlockHash); - } - - /// @dev Verifies up to N blocks. - function verifyBlocks( - TaikoData.State storage _state, - IERC20 _tko, - TaikoData.Config memory _config, - IAddressResolver _resolver, - uint64 _maxBlocksToVerify - ) - internal - { - if (_maxBlocksToVerify == 0) { - return; - } - - // Retrieve the latest verified block and the associated transition used - // for its verification. - TaikoData.SlotB memory b = _state.slotB; - uint64 blockId = b.lastVerifiedBlockId; - - uint64 slot = blockId % _config.blockRingBufferSize; - - TaikoData.Block storage blk = _state.blocks[slot]; - if (blk.blockId != blockId) revert L1_BLOCK_MISMATCH(); - - uint32 tid = blk.verifiedTransitionId; - - // The following scenario should never occur but is included as a - // precaution. - if (tid == 0) revert L1_TRANSITION_ID_ZERO(); - - // The `blockHash` variable represents the most recently trusted - // blockHash on L2. - bytes32 blockHash = _state.transitions[slot][tid].blockHash; - bytes32 stateRoot; - uint64 numBlocksVerified; - ITierRouter tierRouter; - - // Unchecked is safe: - // - assignment is within ranges - // - blockId and numBlocksVerified values incremented will still be OK in the - // next 584K years if we verifying one block per every second - unchecked { - ++blockId; - - while (blockId < b.numBlocks && numBlocksVerified < _maxBlocksToVerify) { - slot = blockId % _config.blockRingBufferSize; - - blk = _state.blocks[slot]; - if (blk.blockId != blockId) revert L1_BLOCK_MISMATCH(); - - tid = LibUtils.getTransitionId(_state, blk, slot, blockHash); - // When `tid` is 0, it indicates that there is no proven - // transition with its parentHash equal to the blockHash of the - // most recently verified block. - if (tid == 0) break; - - // A transition with the correct `parentHash` has been located. - TaikoData.TransitionState storage ts = _state.transitions[slot][tid]; - - // It's not possible to verify this block if either the - // transition is contested and awaiting higher-tier proof or if - // the transition is still within its cooldown period. - uint16 tier = ts.tier; - - if (ts.contester != address(0)) { - break; - } else { - if (tierRouter == ITierRouter(address(0))) { - tierRouter = ITierRouter(_resolver.resolve(LibStrings.B_TIER_ROUTER, false)); - } - - if ( - !LibUtils.isPostDeadline( - ts.timestamp, - b.lastUnpausedAt, - ITierProvider(tierRouter.getProvider(blockId)).getTier(tier) - .cooldownWindow - ) - ) { - // If cooldownWindow is 0, the block can theoretically - // be proved and verified within the same L1 block. - break; - } - } - - // Mark this block as verified - blk.verifiedTransitionId = tid; - - // Update variables - blockHash = ts.blockHash; - stateRoot = ts.stateRoot; - - address prover = ts.prover; - _tko.transfer(prover, ts.validityBond); - - // Note: We exclusively address the bonds linked to the - // transition used for verification. While there may exist - // other transitions for this block, we disregard them entirely. - // The bonds for these other transitions are burned (more precisely held in custody) - // either when the transitions are generated or proven. In such cases, both the - // provers and contesters of those transitions forfeit their bonds. - - emit BlockVerified({ - blockId: blockId, - prover: prover, - blockHash: blockHash, - stateRoot: stateRoot, - tier: tier - }); - - ++blockId; - ++numBlocksVerified; - } - - if (numBlocksVerified != 0) { - uint64 lastVerifiedBlockId = b.lastVerifiedBlockId + numBlocksVerified; - - // Update protocol level state variables - _state.slotB.lastVerifiedBlockId = lastVerifiedBlockId; - - // Sync chain data - _syncChainData(_state, _config, _resolver, lastVerifiedBlockId, stateRoot); - } - } - } - - /// @notice Emit events used by client/node. - function emitEventForClient(TaikoData.State storage _state) internal { - emit StateVariablesUpdated({ slotB: _state.slotB }); - } - - function _setupGenesisBlock( - TaikoData.State storage _state, - bytes32 _genesisBlockHash - ) - private - { - if (_genesisBlockHash == 0) revert L1_INVALID_GENESIS_HASH(); - // Init state - _state.slotA.genesisHeight = uint64(block.number); - _state.slotA.genesisTimestamp = uint64(block.timestamp); - _state.slotB.numBlocks = 1; - - // Init the genesis block - TaikoData.Block storage blk = _state.blocks[0]; - blk.nextTransitionId = 2; - blk.proposedAt = uint64(block.timestamp); - blk.verifiedTransitionId = 1; - blk.metaHash = bytes32(uint256(1)); // Give the genesis metahash a non-zero value. - - // Init the first state transition - TaikoData.TransitionState storage ts = _state.transitions[0][1]; - ts.blockHash = _genesisBlockHash; - ts.prover = address(0); - ts.timestamp = uint64(block.timestamp); - - emit BlockVerified({ - blockId: 0, - prover: address(0), - blockHash: _genesisBlockHash, - stateRoot: 0, - tier: 0 - }); - } - - function _syncChainData( - TaikoData.State storage _state, - TaikoData.Config memory _config, - IAddressResolver _resolver, - uint64 _lastVerifiedBlockId, - bytes32 _stateRoot - ) - private - { - ISignalService signalService = - ISignalService(_resolver.resolve(LibStrings.B_SIGNAL_SERVICE, false)); - - uint64 lastSyncedBlock = - signalService.getSyncedChainHeight(_config.chainId, LibStrings.H_STATE_ROOT); - - if (_lastVerifiedBlockId > lastSyncedBlock + _config.blockSyncThreshold) { - _state.slotA.lastSyncedBlockId = _lastVerifiedBlockId; - _state.slotA.lastSynecdAt = uint64(block.timestamp); - - signalService.syncChainData( - _config.chainId, LibStrings.H_STATE_ROOT, _lastVerifiedBlockId, _stateRoot - ); - } - } - - function _isConfigValid(TaikoData.Config memory _config) private view returns (bool) { - if ( - _config.chainId <= 1 || _config.chainId == block.chainid // - || _config.blockMaxProposals <= 1 - || _config.blockRingBufferSize <= _config.blockMaxProposals + 1 - || _config.blockMaxGasLimit == 0 || _config.livenessBond == 0 - ) return false; - - return true; - } -} diff --git a/packages/protocol/contracts/L1/tiers/TierProviderBase.sol b/packages/protocol/contracts/L1/tiers/TierProviderBase.sol deleted file mode 100644 index 00d457c735c..00000000000 --- a/packages/protocol/contracts/L1/tiers/TierProviderBase.sol +++ /dev/null @@ -1,75 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.24; - -import "../../common/LibStrings.sol"; -import "./ITierProvider.sol"; - -/// @title TierProviderBase -/// @custom:security-contact security@taiko.xyz -abstract contract TierProviderBase is ITierProvider { - /// @inheritdoc ITierProvider - function getTier(uint16 _tierId) - public - pure - virtual - override - returns (ITierProvider.Tier memory) - { - if (_tierId == LibTiers.TIER_OPTIMISTIC) { - return ITierProvider.Tier({ - verifierName: "", - validityBond: 250 ether, // TKO - contestBond: 500 ether, // TKO - cooldownWindow: 1440, //24 hours - provingWindow: 30, // 0.5 hours - maxBlocksToVerifyPerProof: 16 - }); - } - - if (_tierId == LibTiers.TIER_SGX) { - return ITierProvider.Tier({ - verifierName: LibStrings.B_TIER_SGX, - validityBond: 250 ether, // TKO - contestBond: 1640 ether, // =250TKO * 6.5625 - cooldownWindow: 1440, //24 hours - provingWindow: 60, // 1 hours - maxBlocksToVerifyPerProof: 8 - }); - } - - if (_tierId == LibTiers.TIER_SGX_ZKVM) { - return ITierProvider.Tier({ - verifierName: LibStrings.B_TIER_SGX_ZKVM, - validityBond: 500 ether, // TKO - contestBond: 3280 ether, // =500TKO * 6.5625 - cooldownWindow: 1440, //24 hours - provingWindow: 240, // 4 hours - maxBlocksToVerifyPerProof: 4 - }); - } - - if (_tierId == LibTiers.TIER_GUARDIAN_MINORITY) { - return ITierProvider.Tier({ - verifierName: LibStrings.B_TIER_GUARDIAN_MINORITY, - validityBond: 500 ether, // TKO - contestBond: 3280 ether, // =500TKO * 6.5625 - cooldownWindow: 1440, //24 hours - provingWindow: 2880, // 48 hours - maxBlocksToVerifyPerProof: 16 - }); - } - - if (_tierId == LibTiers.TIER_GUARDIAN) { - return ITierProvider.Tier({ - verifierName: LibStrings.B_TIER_GUARDIAN, - validityBond: 0, // must be 0 for top tier - contestBond: 0, // must be 0 for top tier - cooldownWindow: 60, //1 hours - provingWindow: 2880, // 48 hours - maxBlocksToVerifyPerProof: 16 - }); - } - - revert TIER_NOT_FOUND(); - } -} diff --git a/packages/protocol/contracts/L1/tiers/TierProviderV2.sol b/packages/protocol/contracts/L1/tiers/TierProviderV2.sol deleted file mode 100644 index bab18f51823..00000000000 --- a/packages/protocol/contracts/L1/tiers/TierProviderV2.sol +++ /dev/null @@ -1,21 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.24; - -import "./TierProviderBase.sol"; - -/// @title TierProviderV2 -/// @custom:security-contact security@taiko.xyz -contract TierProviderV2 is TierProviderBase { - /// @inheritdoc ITierProvider - function getTierIds() public pure override returns (uint16[] memory tiers_) { - tiers_ = new uint16[](3); - tiers_[0] = LibTiers.TIER_SGX; - tiers_[1] = LibTiers.TIER_GUARDIAN_MINORITY; - tiers_[2] = LibTiers.TIER_GUARDIAN; - } - - /// @inheritdoc ITierProvider - function getMinTier(uint256) public pure override returns (uint16) { - return LibTiers.TIER_SGX; - } -} diff --git a/packages/protocol/contracts/L1/tiers/TierProviderV3.sol b/packages/protocol/contracts/L1/tiers/TierProviderV3.sol deleted file mode 100644 index d8e6555a65b..00000000000 --- a/packages/protocol/contracts/L1/tiers/TierProviderV3.sol +++ /dev/null @@ -1,24 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.24; - -import "./TierProviderBase.sol"; - -/// @title TierProviderV3 -/// @custom:security-contact security@taiko.xyz -contract TierProviderV3 is TierProviderBase { - /// @inheritdoc ITierProvider - function getTierIds() public pure override returns (uint16[] memory tiers_) { - tiers_ = new uint16[](4); - tiers_[0] = LibTiers.TIER_SGX; - tiers_[1] = LibTiers.TIER_SGX_ZKVM; - tiers_[2] = LibTiers.TIER_GUARDIAN_MINORITY; - tiers_[3] = LibTiers.TIER_GUARDIAN; - } - - /// @inheritdoc ITierProvider - function getMinTier(uint256 _rand) public pure override returns (uint16) { - // 0.1% require SGX + ZKVM; all others require SGX - if (_rand % 1000 == 0) return LibTiers.TIER_SGX_ZKVM; - else return LibTiers.TIER_SGX; - } -} diff --git a/packages/protocol/contracts/L1/tiers/TierRouter.sol b/packages/protocol/contracts/L1/tiers/TierRouter.sol deleted file mode 100644 index aa4c68033c1..00000000000 --- a/packages/protocol/contracts/L1/tiers/TierRouter.sol +++ /dev/null @@ -1,14 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.24; - -import "./ITierRouter.sol"; - -/// @title TierRouter -/// @dev Labeled in AddressResolver as "tier_router" -/// @custom:security-contact security@taiko.xyz -contract TierRouter is ITierRouter { - /// @inheritdoc ITierRouter - function getProvider(uint256 /*_blockId*/ ) external pure returns (address) { - return 0x4cffe56C947E26D07C14020499776DB3e9AE3a23; - } -} diff --git a/packages/protocol/contracts/L2/DelegateOwner.sol b/packages/protocol/contracts/L2/DelegateOwner.sol deleted file mode 100644 index fafff269dc6..00000000000 --- a/packages/protocol/contracts/L2/DelegateOwner.sol +++ /dev/null @@ -1,118 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.24; - -import "../common/EssentialContract.sol"; -import "../common/LibStrings.sol"; -import "../libs/LibAddress.sol"; -import "../libs/LibBytes.sol"; -import "../bridge/IBridge.sol"; - -/// @title DelegateOwner -/// @notice This contract will be the owner of all essential contracts deployed on the L2 chain. -/// @dev Notice that when sending the message on the owner chain, the gas limit of the message must -/// not be zero, so on this chain, some EOA can help execute this transaction. -/// @custom:security-contact security@taiko.xyz -contract DelegateOwner is EssentialContract, IMessageInvocable { - /// @notice The owner chain ID. - uint64 public l1ChainId; - - /// @notice The next transaction ID. - uint64 public nextTxId; - - /// @notice The real owner on L1, supposedly the DAO. - address public realOwner; - - uint256[48] private __gap; - - struct Call { - uint64 txId; - address target; - bool isDelegateCall; - bytes txdata; - } - - /// @notice Emitted when a message is invoked. - /// @param txId The transaction ID. - /// @param target The target address. - /// @param isDelegateCall True if the call is a `delegatecall`. - /// @param selector The function selector. - event MessageInvoked( - uint64 indexed txId, address indexed target, bool isDelegateCall, bytes4 indexed selector - ); - - error DO_DRYRUN_SUCCEEDED(); - error DO_INVALID_PARAM(); - error DO_INVALID_TARGET(); - error DO_INVALID_TX_ID(); - error DO_PERMISSION_DENIED(); - - /// @notice Initializes the contract. - /// @param _realOwner The real owner on L1 that can send a cross-chain message to invoke - /// `onMessageInvocation`. - /// @param _addressManager The address of the {AddressManager} contract. - /// @param _l1ChainId The L1 chain's ID. - function init( - address _realOwner, - address _addressManager, - uint64 _l1ChainId - ) - external - initializer - { - // This contract's owner will be itself. - __Essential_init(address(this), _addressManager); - - if (_realOwner == address(0) || _l1ChainId == 0 || _l1ChainId == block.chainid) { - revert DO_INVALID_PARAM(); - } - - realOwner = _realOwner; - l1ChainId = _l1ChainId; - } - - /// @inheritdoc IMessageInvocable - function onMessageInvocation(bytes calldata _data) - external - payable - onlyFromNamed(LibStrings.B_BRIDGE) - { - IBridge.Context memory ctx = IBridge(msg.sender).context(); - if (ctx.srcChainId != l1ChainId || ctx.from != realOwner) { - revert DO_PERMISSION_DENIED(); - } - _invokeCall(_data, true); - } - - /// @notice Dryruns a message invocation but always revert. - /// If this tx is reverted with DO_TRY_RUN_SUCCEEDED, the try run is successful. - /// Note that this function shall not be used in transaction and is designed for offchain - /// simulation only. - function dryrunMessageInvocation(bytes calldata _data) external payable { - _invokeCall(_data, false); - revert DO_DRYRUN_SUCCEEDED(); - } - - function acceptOwnership(address target) external { - Ownable2StepUpgradeable(target).acceptOwnership(); - } - - function transferOwnership(address) public pure override notImplemented { } - - function _authorizePause(address, bool) internal pure override notImplemented { } - - function _invokeCall(bytes calldata _data, bool _verifyTxId) internal { - Call memory call = abi.decode(_data, (Call)); - - if (_verifyTxId && call.txId != nextTxId++) revert DO_INVALID_TX_ID(); - - // By design, the target must be a contract address if the txdata is not empty - if (call.txdata.length != 0 && !Address.isContract(call.target)) revert DO_INVALID_TARGET(); - - (bool success, bytes memory result) = call.isDelegateCall // - ? call.target.delegatecall(call.txdata) - : call.target.call{ value: msg.value }(call.txdata); - - if (!success) LibBytes.revertWithExtractedError(result); - emit MessageInvoked(call.txId, call.target, call.isDelegateCall, bytes4(call.txdata)); - } -} diff --git a/packages/protocol/contracts/L2/Lib1559Math.sol b/packages/protocol/contracts/L2/Lib1559Math.sol deleted file mode 100644 index 4b5316c28f6..00000000000 --- a/packages/protocol/contracts/L2/Lib1559Math.sol +++ /dev/null @@ -1,76 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.24; - -import "../thirdparty/solmate/LibFixedPointMath.sol"; -import "../libs/LibMath.sol"; - -/// @title Lib1559Math -/// @notice Implements e^(x) based bonding curve for EIP-1559 -/// @dev See https://ethresear.ch/t/make-eip-1559-more-like-an-amm-curve/9082 but some minor -/// difference as stated in docs/eip1559_on_l2.md. -/// @custom:security-contact security@taiko.xyz -library Lib1559Math { - using LibMath for uint256; - - error EIP1559_INVALID_PARAMS(); - - function calc1559BaseFee( - uint32 _gasTargetPerL1Block, - uint8 _adjustmentQuotient, - uint64 _gasExcess, - uint64 _gasIssuance, - uint32 _parentGasUsed - ) - internal - pure - returns (uint256 basefee_, uint64 gasExcess_) - { - // We always add the gas used by parent block to the gas excess - // value as this has already happened - uint256 excess = uint256(_gasExcess) + _parentGasUsed; - excess = excess > _gasIssuance ? excess - _gasIssuance : 1; - gasExcess_ = uint64(excess.min(type(uint64).max)); - - // The base fee per gas used by this block is the spot price at the - // bonding curve, regardless the actual amount of gas used by this - // block, however, this block's gas used will affect the next - // block's base fee. - basefee_ = basefee(gasExcess_, uint256(_adjustmentQuotient) * _gasTargetPerL1Block); - - // Always make sure basefee is nonzero, this is required by the node. - if (basefee_ == 0) basefee_ = 1; - } - - /// @dev eth_qty(excess_gas_issued) / (TARGET * ADJUSTMENT_QUOTIENT) - /// @param _gasExcess The gas excess value - /// @param _adjustmentFactor The product of gasTarget and adjustmentQuotient - function basefee( - uint256 _gasExcess, - uint256 _adjustmentFactor - ) - internal - pure - returns (uint256) - { - if (_adjustmentFactor == 0) { - revert EIP1559_INVALID_PARAMS(); - } - return _ethQty(_gasExcess, _adjustmentFactor) / LibFixedPointMath.SCALING_FACTOR; - } - - /// @dev exp(gas_qty / TARGET / ADJUSTMENT_QUOTIENT) - function _ethQty( - uint256 _gasExcess, - uint256 _adjustmentFactor - ) - private - pure - returns (uint256) - { - uint256 input = _gasExcess * LibFixedPointMath.SCALING_FACTOR / _adjustmentFactor; - if (input > LibFixedPointMath.MAX_EXP_INPUT) { - input = LibFixedPointMath.MAX_EXP_INPUT; - } - return uint256(LibFixedPointMath.exp(int256(input))); - } -} diff --git a/packages/protocol/contracts/L2/TaikoL2.sol b/packages/protocol/contracts/L2/TaikoL2.sol deleted file mode 100644 index 896376c1bdc..00000000000 --- a/packages/protocol/contracts/L2/TaikoL2.sol +++ /dev/null @@ -1,263 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.24; - -import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; -import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; - -import "../common/EssentialContract.sol"; -import "../common/LibStrings.sol"; -import "../libs/LibAddress.sol"; -import "../signal/ISignalService.sol"; -import "./Lib1559Math.sol"; -import "./LibL2Config.sol"; - -/// @title TaikoL2 -/// @notice Taiko L2 is a smart contract that handles cross-layer message -/// verification and manages EIP-1559 gas pricing for Layer 2 (L2) operations. -/// It is used to anchor the latest L1 block details to L2 for cross-layer -/// communication, manage EIP-1559 parameters for gas pricing, and store -/// verified L1 block information. -/// @custom:security-contact security@taiko.xyz -contract TaikoL2 is EssentialContract { - using LibAddress for address; - using SafeERC20 for IERC20; - - /// @notice Golden touch address is the only address that can do the anchor transaction. - address public constant GOLDEN_TOUCH_ADDRESS = 0x0000777735367b36bC9B61C50022d9D0700dB4Ec; - - /// @notice Mapping from L2 block numbers to their block hashes. All L2 block hashes will - /// be saved in this mapping. - mapping(uint256 blockId => bytes32 blockHash) public l2Hashes; - - /// @notice A hash to check the integrity of public inputs. - /// @dev Slot 2. - bytes32 public publicInputHash; - - /// @notice The gas excess value used to calculate the base fee. - /// @dev Slot 3. - uint64 public gasExcess; - - /// @notice The last synced L1 block height. - uint64 public lastSyncedBlock; - - uint64 private __deprecated1; // was parentTimestamp - uint64 private __deprecated2; // was __currentBlockTimestamp - - /// @notice The L1's chain ID. - uint64 public l1ChainId; - - uint256[46] private __gap; - - /// @notice Emitted when the latest L1 block details are anchored to L2. - /// @param parentHash The hash of the parent block. - /// @param gasExcess The gas excess value used to calculate the base fee. - event Anchored(bytes32 parentHash, uint64 gasExcess); - - error L2_BASEFEE_MISMATCH(); - error L2_INVALID_L1_CHAIN_ID(); - error L2_INVALID_L2_CHAIN_ID(); - error L2_INVALID_PARAM(); - error L2_INVALID_SENDER(); - error L2_PUBLIC_INPUT_HASH_MISMATCH(); - error L2_TOO_LATE(); - - /// @notice Initializes the contract. - /// @param _owner The owner of this contract. msg.sender will be used if this value is zero. - /// @param _addressManager The address of the {AddressManager} contract. - /// @param _l1ChainId The ID of the base layer. - /// @param _gasExcess The initial gasExcess. - function init( - address _owner, - address _addressManager, - uint64 _l1ChainId, - uint64 _gasExcess - ) - external - initializer - { - __Essential_init(_owner, _addressManager); - - if (_l1ChainId == 0 || _l1ChainId == block.chainid) { - revert L2_INVALID_L1_CHAIN_ID(); - } - if (block.chainid <= 1 || block.chainid > type(uint64).max) { - revert L2_INVALID_L2_CHAIN_ID(); - } - - if (block.number == 0) { - // This is the case in real L2 genesis - } else if (block.number == 1) { - // This is the case in tests - uint256 parentHeight = block.number - 1; - l2Hashes[parentHeight] = blockhash(parentHeight); - } else { - revert L2_TOO_LATE(); - } - - l1ChainId = _l1ChainId; - gasExcess = _gasExcess; - (publicInputHash,) = _calcPublicInputHash(block.number); - } - - /// @notice Anchors the latest L1 block details to L2 for cross-layer - /// message verification. - /// @dev This function can be called freely as the golden touch private key is publicly known, - /// but the Taiko node guarantees the first transaction of each block is always this anchor - /// transaction, and any subsequent calls will revert with L2_PUBLIC_INPUT_HASH_MISMATCH. - /// @param _l1BlockHash The latest L1 block hash when this block was - /// proposed. - /// @param _l1StateRoot The latest L1 block's state root. - /// @param _l1BlockId The latest L1 block height when this block was proposed. - /// @param _parentGasUsed The gas used in the parent block. - function anchor( - bytes32 _l1BlockHash, - bytes32 _l1StateRoot, - uint64 _l1BlockId, - uint32 _parentGasUsed - ) - external - nonReentrant - { - if ( - _l1BlockHash == 0 || _l1StateRoot == 0 || _l1BlockId == 0 - || (block.number != 1 && _parentGasUsed == 0) - ) { - revert L2_INVALID_PARAM(); - } - - if (msg.sender != GOLDEN_TOUCH_ADDRESS) revert L2_INVALID_SENDER(); - - uint256 parentId; - unchecked { - parentId = block.number - 1; - } - - // Verify ancestor hashes - (bytes32 publicInputHashOld, bytes32 publicInputHashNew) = _calcPublicInputHash(parentId); - if (publicInputHash != publicInputHashOld) { - revert L2_PUBLIC_INPUT_HASH_MISMATCH(); - } - - // Verify the base fee per gas is correct - (uint256 _basefee, uint64 _gasExcess) = getBasefee(_l1BlockId, _parentGasUsed); - - if (!skipFeeCheck() && block.basefee != _basefee) { - revert L2_BASEFEE_MISMATCH(); - } - - if (_l1BlockId > lastSyncedBlock) { - // Store the L1's state root as a signal to the local signal service to - // allow for multi-hop bridging. - ISignalService(resolve(LibStrings.B_SIGNAL_SERVICE, false)).syncChainData( - l1ChainId, LibStrings.H_STATE_ROOT, _l1BlockId, _l1StateRoot - ); - - lastSyncedBlock = _l1BlockId; - } - - // Update state variables - bytes32 _parentHash = blockhash(parentId); - l2Hashes[parentId] = _parentHash; - publicInputHash = publicInputHashNew; - gasExcess = _gasExcess; - - emit Anchored(_parentHash, _gasExcess); - } - - /// @notice Withdraw token or Ether from this address - /// @param _token Token address or address(0) if Ether. - /// @param _to Withdraw to address. - function withdraw( - address _token, - address _to - ) - external - whenNotPaused - onlyFromOwnerOrNamed(LibStrings.B_WITHDRAWER) - nonReentrant - { - if (_to == address(0)) revert L2_INVALID_PARAM(); - if (_token == address(0)) { - _to.sendEtherAndVerify(address(this).balance); - } else { - IERC20(_token).safeTransfer(_to, IERC20(_token).balanceOf(address(this))); - } - } - - /// @notice Gets the basefee and gas excess using EIP-1559 configuration for - /// the given parameters. - /// @param _l1BlockId The synced L1 height in the next Taiko block - /// @param _parentGasUsed Gas used in the parent block. - /// @return basefee_ The calculated EIP-1559 base fee per gas. - /// @return gasExcess_ The new gasExcess value. - function getBasefee( - uint64 _l1BlockId, - uint32 _parentGasUsed - ) - public - view - returns (uint256 basefee_, uint64 gasExcess_) - { - LibL2Config.Config memory config = getConfig(); - uint64 gasIssuance = uint64(_l1BlockId - lastSyncedBlock) * config.gasTargetPerL1Block; - - (basefee_, gasExcess_) = Lib1559Math.calc1559BaseFee( - config.gasTargetPerL1Block, - config.basefeeAdjustmentQuotient, - gasExcess, - gasIssuance, - _parentGasUsed - ); - } - - /// @notice Retrieves the block hash for the given L2 block number. - /// @param _blockId The L2 block number to retrieve the block hash for. - /// @return The block hash for the specified L2 block id, or zero if the - /// block id is greater than or equal to the current block number. - function getBlockHash(uint64 _blockId) public view returns (bytes32) { - if (_blockId >= block.number) return 0; - if (_blockId + 256 >= block.number) return blockhash(_blockId); - return l2Hashes[_blockId]; - } - - /// @notice Returns EIP1559 related configurations. - /// @return config_ struct containing configuration parameters. - function getConfig() public view virtual returns (LibL2Config.Config memory) { - return LibL2Config.get(); - } - - /// @notice Tells if we need to validate basefee (for simulation). - /// @return Returns true to skip checking basefee mismatch. - function skipFeeCheck() public pure virtual returns (bool) { - return false; - } - - function _calcPublicInputHash(uint256 _blockId) - private - view - returns (bytes32 publicInputHashOld, bytes32 publicInputHashNew) - { - bytes32[256] memory inputs; - - // Unchecked is safe because it cannot overflow. - unchecked { - // Put the previous 255 blockhashes (excluding the parent's) into a - // ring buffer. - for (uint256 i; i < 255 && _blockId >= i + 1; ++i) { - uint256 j = _blockId - i - 1; - inputs[j % 255] = blockhash(j); - } - } - - inputs[255] = bytes32(block.chainid); - - assembly { - publicInputHashOld := keccak256(inputs, 8192 /*mul(256, 32)*/ ) - } - - inputs[_blockId % 255] = blockhash(_blockId); - assembly { - publicInputHashNew := keccak256(inputs, 8192 /*mul(256, 32)*/ ) - } - } -} diff --git a/packages/protocol/contracts/automata-attestation/README.md b/packages/protocol/contracts/automata-attestation/README.md deleted file mode 100644 index 13f897ca957..00000000000 --- a/packages/protocol/contracts/automata-attestation/README.md +++ /dev/null @@ -1,4 +0,0 @@ -# Readme - -Original code (main branch) forked from https://github.com/automata-network/automata-dcap-v3-attestation and applied some gas optimizations here: https://github.com/smtmfft/automata-dcap-v3-attestation/tree/parse-quote-offline, which then got merged into taiko-mono. -The corresponding upstream PR is: https://github.com/automata-network/automata-dcap-v3-attestation/pull/6, waiting to be merged. diff --git a/packages/protocol/contracts/compiled/FiatTokenProxy.json b/packages/protocol/contracts/compiled/FiatTokenProxy.json deleted file mode 100644 index cebc9f3ceca..00000000000 --- a/packages/protocol/contracts/compiled/FiatTokenProxy.json +++ /dev/null @@ -1,552 +0,0 @@ -{ - "abi": [ - { - "inputs": [ - { - "internalType": "address", - "name": "implementationContract", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "address", - "name": "previousAdmin", - "type": "address" - }, - { - "indexed": false, - "internalType": "address", - "name": "newAdmin", - "type": "address" - } - ], - "name": "AdminChanged", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "address", - "name": "implementation", - "type": "address" - } - ], - "name": "Upgraded", - "type": "event" - }, - { - "stateMutability": "payable", - "type": "fallback" - }, - { - "inputs": [], - "name": "admin", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "newAdmin", - "type": "address" - } - ], - "name": "changeAdmin", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "implementation", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "newImplementation", - "type": "address" - } - ], - "name": "upgradeTo", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "newImplementation", - "type": "address" - }, - { - "internalType": "bytes", - "name": "data", - "type": "bytes" - } - ], - "name": "upgradeToAndCall", - "outputs": [], - "stateMutability": "payable", - "type": "function" - } - ], - "bytecode": { - "object": "0x608060405234801561001057600080fd5b506040516108a93803806108a98339818101604052602081101561003357600080fd5b5051808061004081610051565b5061004a336100c3565b5050610123565b610064816100e760201b61042a1760201c565b61009f5760405162461bcd60e51b815260040180806020018281038252603b81526020018061086e603b913960400191505060405180910390fd5b7f7050c9e0f4ca769c69bd3a8ef740bc37934f8e2c036e5a723fd8ee048ed3f8c355565b7f10d6a54a4754c8869d6886b5f5d7fbfa5b4522237ea5c60d11bc4e7a1ff9390b55565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081811480159061011b57508115155b949350505050565b61073c806101326000396000f3fe60806040526004361061005a5760003560e01c80635c60da1b116100435780635c60da1b146101315780638f2839701461016f578063f851a440146101af5761005a565b80633659cfe6146100645780634f1ef286146100a4575b6100626101c4565b005b34801561007057600080fd5b506100626004803603602081101561008757600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166101de565b610062600480360360408110156100ba57600080fd5b73ffffffffffffffffffffffffffffffffffffffff82351691908101906040810160208201356401000000008111156100f257600080fd5b82018360208201111561010457600080fd5b8035906020019184600183028401116401000000008311171561012657600080fd5b509092509050610232565b34801561013d57600080fd5b50610146610309565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b34801561017b57600080fd5b506100626004803603602081101561019257600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610318565b3480156101bb57600080fd5b50610146610420565b6101cc610466565b6101dc6101d76104fa565b61051f565b565b6101e6610543565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614156102275761022281610568565b61022f565b61022f6101c4565b50565b61023a610543565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614156102fc5761027683610568565b60003073ffffffffffffffffffffffffffffffffffffffff16348484604051808383808284376040519201945060009350909150508083038185875af1925050503d80600081146102e3576040519150601f19603f3d011682016040523d82523d6000602084013e6102e8565b606091505b50509050806102f657600080fd5b50610304565b6103046101c4565b505050565b60006103136104fa565b905090565b610320610543565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614156102275773ffffffffffffffffffffffffffffffffffffffff81166103bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260368152602001806106966036913960400191505060405180910390fd5b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6103e8610543565b6040805173ffffffffffffffffffffffffffffffffffffffff928316815291841660208301528051918290030190a1610222816105bd565b6000610313610543565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081811480159061045e57508115155b949350505050565b61046e610543565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614156104f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001806106646032913960400191505060405180910390fd5b6101dc6101dc565b7f7050c9e0f4ca769c69bd3a8ef740bc37934f8e2c036e5a723fd8ee048ed3f8c35490565b3660008037600080366000845af43d6000803e80801561053e573d6000f35b3d6000fd5b7f10d6a54a4754c8869d6886b5f5d7fbfa5b4522237ea5c60d11bc4e7a1ff9390b5490565b610571816105e1565b6040805173ffffffffffffffffffffffffffffffffffffffff8316815290517fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b9181900360200190a150565b7f10d6a54a4754c8869d6886b5f5d7fbfa5b4522237ea5c60d11bc4e7a1ff9390b55565b6105ea8161042a565b61063f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603b8152602001806106cc603b913960400191505060405180910390fd5b7f7050c9e0f4ca769c69bd3a8ef740bc37934f8e2c036e5a723fd8ee048ed3f8c35556fe43616e6e6f742063616c6c2066616c6c6261636b2066756e6374696f6e2066726f6d207468652070726f78792061646d696e43616e6e6f74206368616e6765207468652061646d696e206f6620612070726f787920746f20746865207a65726f206164647265737343616e6e6f742073657420612070726f787920696d706c656d656e746174696f6e20746f2061206e6f6e2d636f6e74726163742061646472657373a264697066735822122001b610efbebc57927addec087895f40a32b15707f9bbcd4d028e2ffcc8cd241f64736f6c634300060c003343616e6e6f742073657420612070726f787920696d706c656d656e746174696f6e20746f2061206e6f6e2d636f6e74726163742061646472657373", - "sourceMap": "1385:182:20:-:0;;;1443:122;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1443:122:20;;;2686:42:19;2705:22;2686:18;:42::i;:::-;-1:-1:-1;3044:21:17::1;3054:10;3044:9;:21::i;:::-;2847:225:::0;1443:122:20;1385:182;;3492:342:19;3586:37;3605:17;3586:18;;;;;:37;;:::i;:::-;3565:143;;;;-1:-1:-1;;;3565:143:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2298:66;3787:31;3773:55::o;5448:153:17:-;2256:66;5563:22;5549:46::o;718:610:21:-;778:4;1239:20;;1084:66;1278:23;;;;;;:42;;-1:-1:-1;1305:15:21;;;1278:42;1270:51;718:610;-1:-1:-1;;;;718:610:21:o;1385:182:20:-;;;;;;;", - "linkReferences": {} - }, - "deployedBytecode": { - "object": "0x60806040526004361061005a5760003560e01c80635c60da1b116100435780635c60da1b146101315780638f2839701461016f578063f851a440146101af5761005a565b80633659cfe6146100645780634f1ef286146100a4575b6100626101c4565b005b34801561007057600080fd5b506100626004803603602081101561008757600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166101de565b610062600480360360408110156100ba57600080fd5b73ffffffffffffffffffffffffffffffffffffffff82351691908101906040810160208201356401000000008111156100f257600080fd5b82018360208201111561010457600080fd5b8035906020019184600183028401116401000000008311171561012657600080fd5b509092509050610232565b34801561013d57600080fd5b50610146610309565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b34801561017b57600080fd5b506100626004803603602081101561019257600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610318565b3480156101bb57600080fd5b50610146610420565b6101cc610466565b6101dc6101d76104fa565b61051f565b565b6101e6610543565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614156102275761022281610568565b61022f565b61022f6101c4565b50565b61023a610543565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614156102fc5761027683610568565b60003073ffffffffffffffffffffffffffffffffffffffff16348484604051808383808284376040519201945060009350909150508083038185875af1925050503d80600081146102e3576040519150601f19603f3d011682016040523d82523d6000602084013e6102e8565b606091505b50509050806102f657600080fd5b50610304565b6103046101c4565b505050565b60006103136104fa565b905090565b610320610543565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614156102275773ffffffffffffffffffffffffffffffffffffffff81166103bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260368152602001806106966036913960400191505060405180910390fd5b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6103e8610543565b6040805173ffffffffffffffffffffffffffffffffffffffff928316815291841660208301528051918290030190a1610222816105bd565b6000610313610543565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081811480159061045e57508115155b949350505050565b61046e610543565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614156104f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001806106646032913960400191505060405180910390fd5b6101dc6101dc565b7f7050c9e0f4ca769c69bd3a8ef740bc37934f8e2c036e5a723fd8ee048ed3f8c35490565b3660008037600080366000845af43d6000803e80801561053e573d6000f35b3d6000fd5b7f10d6a54a4754c8869d6886b5f5d7fbfa5b4522237ea5c60d11bc4e7a1ff9390b5490565b610571816105e1565b6040805173ffffffffffffffffffffffffffffffffffffffff8316815290517fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b9181900360200190a150565b7f10d6a54a4754c8869d6886b5f5d7fbfa5b4522237ea5c60d11bc4e7a1ff9390b55565b6105ea8161042a565b61063f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603b8152602001806106cc603b913960400191505060405180910390fd5b7f7050c9e0f4ca769c69bd3a8ef740bc37934f8e2c036e5a723fd8ee048ed3f8c35556fe43616e6e6f742063616c6c2066616c6c6261636b2066756e6374696f6e2066726f6d207468652070726f78792061646d696e43616e6e6f74206368616e6765207468652061646d696e206f6620612070726f787920746f20746865207a65726f206164647265737343616e6e6f742073657420612070726f787920696d706c656d656e746174696f6e20746f2061206e6f6e2d636f6e74726163742061646472657373a264697066735822122001b610efbebc57927addec087895f40a32b15707f9bbcd4d028e2ffcc8cd241f64736f6c634300060c0033", - "sourceMap": "1385:182:20:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1836:11:18;:9;:11::i;:::-;1385:182:20;4049:109:17;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4049:109:17;;;;:::i;4702:406::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4702:406:17;;-1:-1:-1;4702:406:17;-1:-1:-1;4702:406:17;:::i;3294:99::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;3581:272;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3581:272:17;;;;:::i;3141:81::-;;;;;;;;;;;;;:::i;3688:100:18:-;3728:15;:13;:15::i;:::-;3753:28;3763:17;:15;:17::i;:::-;3753:9;:28::i;:::-;3688:100::o;4049:109:17:-;2571:8;:6;:8::i;:::-;2557:22;;:10;:22;;;2553:96;;;4122:29:::1;4133:17;4122:10;:29::i;:::-;2553:96:::0;;;2627:11;:9;:11::i;:::-;4049:109;:::o;4702:406::-;2571:8;:6;:8::i;:::-;2557:22;;:10;:22;;;2553:96;;;4839:29:::1;4850:17;4839:10;:29::i;:::-;4965:12;4990:4;4982:18;;5008:9;5019:4;;4982:42;;;;;;;;;;::::0;;::::1;::::0;-1:-1:-1;4982:42:17::1;::::0;-1:-1:-1;4982:42:17;;-1:-1:-1;;4982:42:17;;::::1;::::0;;;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4964:60;;;5093:7;5085:16;;;::::0;::::1;;2595:1;2553:96:::0;;;2627:11;:9;:11::i;:::-;4702:406;;;:::o;3294:99::-;3343:7;3369:17;:15;:17::i;:::-;3362:24;;3294:99;:::o;3581:272::-;2571:8;:6;:8::i;:::-;2557:22;;:10;:22;;;2553:96;;;3668:22:::1;::::0;::::1;3647:123;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3785:32;3798:8;:6;:8::i;:::-;3785:32;::::0;;::::1;::::0;;::::1;::::0;;;;::::1;;::::0;::::1;::::0;;;;;;;;;::::1;3827:19;3837:8;3827:9;:19::i;3141:81::-:0;3181:7;3207:8;:6;:8::i;718:610:21:-;778:4;1239:20;;1084:66;1278:23;;;;;;:42;;-1:-1:-1;1305:15:21;;;1278:42;1270:51;718:610;-1:-1:-1;;;;718:610:21:o;5684:210:17:-;5772:8;:6;:8::i;:::-;5758:22;;:10;:22;;;;5737:119;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5866:21;:19;:21::i;2863:185:19:-;2298:66;3021:11;;2999:43::o;2293:1025:18:-;2623:14;2620:1;2617;2604:34;2934:1;2915;2883:14;2864:1;2832:14;2809:5;2779:170;3023:16;3020:1;3017;3002:38;3061:6;3136:74;;;;3267:16;3264:1;3257:27;3136:74;3175:16;3172:1;3165:27;5165:157:17;2256:66;5295:11;;5274:42::o;3193:152:19:-;3259:37;3278:17;3259:18;:37::i;:::-;3311:27;;;;;;;;;;;;;;;;;;;3193:152;:::o;5448:153:17:-;2256:66;5563:22;5549:46::o;3492:342:19:-;3586:37;3605:17;3586:18;:37::i;:::-;3565:143;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2298:66;3787:31;3773:55::o", - "linkReferences": {} - }, - "methodIdentifiers": { - "admin()": "f851a440", - "changeAdmin(address)": "8f283970", - "implementation()": "5c60da1b", - "upgradeTo(address)": "3659cfe6", - "upgradeToAndCall(address,bytes)": "4f1ef286" - }, - "rawMetadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"implementationContract\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"previousAdmin\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"AdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"}],\"name\":\"Upgraded\",\"type\":\"event\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"inputs\":[],\"name\":\"admin\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"changeAdmin\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"implementation\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"}],\"name\":\"upgradeTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"upgradeToAndCall\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This contract proxies FiatToken calls and enables FiatToken upgrades\",\"kind\":\"dev\",\"methods\":{\"admin()\":{\"returns\":{\"_0\":\"The address of the proxy admin.\"}},\"changeAdmin(address)\":{\"details\":\"Changes the admin of the proxy. Only the current admin can call this function.\",\"params\":{\"newAdmin\":\"Address to transfer proxy administration to.\"}},\"implementation()\":{\"returns\":{\"_0\":\"The address of the implementation.\"}},\"upgradeTo(address)\":{\"details\":\"Upgrade the backing implementation of the proxy. Only the admin can call this function.\",\"params\":{\"newImplementation\":\"Address of the new implementation.\"}},\"upgradeToAndCall(address,bytes)\":{\"details\":\"Upgrade the backing implementation of the proxy and call a function on the new implementation. This is useful to initialize the proxied contract.\",\"params\":{\"data\":\"Data to send as msg.data in the low level call. It should include the signature and the parameters of the function to be called, as described in https://solidity.readthedocs.io/en/develop/abi-spec.html#function-selector-and-argument-encoding.\",\"newImplementation\":\"Address of the new implementation.\"}}},\"title\":\"FiatTokenProxy\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/FiatTokenProxy/centre-tokens/contracts/v1/FiatTokenProxy.sol\":\"FiatTokenProxy\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":10000000},\"remappings\":[\":ds-test/=lib/forge-std/lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\"]},\"sources\":{\"src/FiatTokenProxy/centre-tokens/contracts/upgradeability/AdminUpgradeabilityProxy.sol\":{\"keccak256\":\"0xc93cb352d8b777ea96e743124af5386eeee32a9fdef0b2fbd89623988e66caad\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://d0407b40cd936bdf6f6ae141fef3da54824a786affc9a459cd6cd83478043683\",\"dweb:/ipfs/QmQh2LjAVdU2HKc7w1fXxuPEfFvTcBifHiYzgdrZtDB9rk\"]},\"src/FiatTokenProxy/centre-tokens/contracts/upgradeability/Proxy.sol\":{\"keccak256\":\"0x6cc252e2b80c8ecaf6d29b950ba3591e4366caf06c3ccba89a8f9cbd2ee807e3\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://d60d210ae173d21b90b989e69c50789fb09dc27ccb0736b41907471248ee3087\",\"dweb:/ipfs/QmQbijUGm48UDyqnefEJExWsxBViKj1M5TAWY82Jn6sJW7\"]},\"src/FiatTokenProxy/centre-tokens/contracts/upgradeability/UpgradeabilityProxy.sol\":{\"keccak256\":\"0x3086b8904fb474eb3d8d701f8ec6991796c5e8a7345ace9c3aabc140973f6c85\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://cde7d942bb42ee3fb09ed643751151bc192522a1dc9ccb5d28aff7fdadf8b9e6\",\"dweb:/ipfs/QmQBVbxYcZjRFH66R1ZByXx8rQym3Sx7jjFtFKRWhLXxdg\"]},\"src/FiatTokenProxy/centre-tokens/contracts/v1/FiatTokenProxy.sol\":{\"keccak256\":\"0x7e640892ac0fd6efafe4a9dc08cbc7ba5e825dafe8a6a8ebf717e7026b8fb69f\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://2e84a985f3271652e16eec4df9be1829f042a98b5723db5b87aeeb8eadc9c207\",\"dweb:/ipfs/QmU4JWGMzd3rA64BiDVejhnapKRJG4WHLuw3g866hFPLTx\"]},\"src/FiatTokenProxy/openzeppelin/contracts/utils/Address.sol\":{\"keccak256\":\"0xdfb4f812600ba4ce6738c35584ceb8c9433472583051b48ba5b1f66cb758a498\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://df02dffe1c1de089d9b4f6192f0dcf464526f2230f420b3deec4645e0cdd2bff\",\"dweb:/ipfs/QmcqXGAU3KJqwrgUVoGJ2W8osomhSJ4R5kdsRpbuW3fELS\"]}},\"version\":1}", - "metadata": { - "compiler": { - "version": "0.6.12+commit.27d51765" - }, - "language": "Solidity", - "output": { - "abi": [ - { - "inputs": [ - { - "internalType": "address", - "name": "implementationContract", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "previousAdmin", - "type": "address", - "indexed": false - }, - { - "internalType": "address", - "name": "newAdmin", - "type": "address", - "indexed": false - } - ], - "type": "event", - "name": "AdminChanged", - "anonymous": false - }, - { - "inputs": [ - { - "internalType": "address", - "name": "implementation", - "type": "address", - "indexed": false - } - ], - "type": "event", - "name": "Upgraded", - "anonymous": false - }, - { - "inputs": [], - "stateMutability": "payable", - "type": "fallback" - }, - { - "inputs": [], - "stateMutability": "view", - "type": "function", - "name": "admin", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ] - }, - { - "inputs": [ - { - "internalType": "address", - "name": "newAdmin", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "function", - "name": "changeAdmin" - }, - { - "inputs": [], - "stateMutability": "view", - "type": "function", - "name": "implementation", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ] - }, - { - "inputs": [ - { - "internalType": "address", - "name": "newImplementation", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "function", - "name": "upgradeTo" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "newImplementation", - "type": "address" - }, - { - "internalType": "bytes", - "name": "data", - "type": "bytes" - } - ], - "stateMutability": "payable", - "type": "function", - "name": "upgradeToAndCall" - } - ], - "devdoc": { - "kind": "dev", - "methods": { - "admin()": { - "returns": { - "_0": "The address of the proxy admin." - } - }, - "changeAdmin(address)": { - "details": "Changes the admin of the proxy. Only the current admin can call this function.", - "params": { - "newAdmin": "Address to transfer proxy administration to." - } - }, - "implementation()": { - "returns": { - "_0": "The address of the implementation." - } - }, - "upgradeTo(address)": { - "details": "Upgrade the backing implementation of the proxy. Only the admin can call this function.", - "params": { - "newImplementation": "Address of the new implementation." - } - }, - "upgradeToAndCall(address,bytes)": { - "details": "Upgrade the backing implementation of the proxy and call a function on the new implementation. This is useful to initialize the proxied contract.", - "params": { - "data": "Data to send as msg.data in the low level call. It should include the signature and the parameters of the function to be called, as described in https://solidity.readthedocs.io/en/develop/abi-spec.html#function-selector-and-argument-encoding.", - "newImplementation": "Address of the new implementation." - } - } - }, - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": {}, - "version": 1 - } - }, - "settings": { - "remappings": [ - "ds-test/=lib/forge-std/lib/ds-test/src/", - "forge-std/=lib/forge-std/src/" - ], - "optimizer": { - "enabled": true, - "runs": 10000000 - }, - "metadata": { - "bytecodeHash": "ipfs" - }, - "compilationTarget": { - "src/FiatTokenProxy/centre-tokens/contracts/v1/FiatTokenProxy.sol": "FiatTokenProxy" - }, - "libraries": {} - }, - "sources": { - "src/FiatTokenProxy/centre-tokens/contracts/upgradeability/AdminUpgradeabilityProxy.sol": { - "keccak256": "0xc93cb352d8b777ea96e743124af5386eeee32a9fdef0b2fbd89623988e66caad", - "urls": [ - "bzz-raw://d0407b40cd936bdf6f6ae141fef3da54824a786affc9a459cd6cd83478043683", - "dweb:/ipfs/QmQh2LjAVdU2HKc7w1fXxuPEfFvTcBifHiYzgdrZtDB9rk" - ], - "license": "MIT" - }, - "src/FiatTokenProxy/centre-tokens/contracts/upgradeability/Proxy.sol": { - "keccak256": "0x6cc252e2b80c8ecaf6d29b950ba3591e4366caf06c3ccba89a8f9cbd2ee807e3", - "urls": [ - "bzz-raw://d60d210ae173d21b90b989e69c50789fb09dc27ccb0736b41907471248ee3087", - "dweb:/ipfs/QmQbijUGm48UDyqnefEJExWsxBViKj1M5TAWY82Jn6sJW7" - ], - "license": "MIT" - }, - "src/FiatTokenProxy/centre-tokens/contracts/upgradeability/UpgradeabilityProxy.sol": { - "keccak256": "0x3086b8904fb474eb3d8d701f8ec6991796c5e8a7345ace9c3aabc140973f6c85", - "urls": [ - "bzz-raw://cde7d942bb42ee3fb09ed643751151bc192522a1dc9ccb5d28aff7fdadf8b9e6", - "dweb:/ipfs/QmQBVbxYcZjRFH66R1ZByXx8rQym3Sx7jjFtFKRWhLXxdg" - ], - "license": "MIT" - }, - "src/FiatTokenProxy/centre-tokens/contracts/v1/FiatTokenProxy.sol": { - "keccak256": "0x7e640892ac0fd6efafe4a9dc08cbc7ba5e825dafe8a6a8ebf717e7026b8fb69f", - "urls": [ - "bzz-raw://2e84a985f3271652e16eec4df9be1829f042a98b5723db5b87aeeb8eadc9c207", - "dweb:/ipfs/QmU4JWGMzd3rA64BiDVejhnapKRJG4WHLuw3g866hFPLTx" - ], - "license": "MIT" - }, - "src/FiatTokenProxy/openzeppelin/contracts/utils/Address.sol": { - "keccak256": "0xdfb4f812600ba4ce6738c35584ceb8c9433472583051b48ba5b1f66cb758a498", - "urls": [ - "bzz-raw://df02dffe1c1de089d9b4f6192f0dcf464526f2230f420b3deec4645e0cdd2bff", - "dweb:/ipfs/QmcqXGAU3KJqwrgUVoGJ2W8osomhSJ4R5kdsRpbuW3fELS" - ], - "license": "MIT" - } - }, - "version": 1 - }, - "ast": { - "absolutePath": "src/FiatTokenProxy/centre-tokens/contracts/v1/FiatTokenProxy.sol", - "id": 40713, - "exportedSymbols": { - "FiatTokenProxy": [40712] - }, - "nodeType": "SourceUnit", - "src": "1154:414:20", - "nodes": [ - { - "id": 40697, - "nodeType": "PragmaDirective", - "src": "1154:23:20", - "nodes": [], - "literals": ["solidity", "0.6", ".12"] - }, - { - "id": 40699, - "nodeType": "ImportDirective", - "src": "1179:94:20", - "nodes": [], - "absolutePath": "src/FiatTokenProxy/centre-tokens/contracts/upgradeability/AdminUpgradeabilityProxy.sol", - "file": "../upgradeability/AdminUpgradeabilityProxy.sol", - "scope": 40713, - "sourceUnit": 40566, - "symbolAliases": [ - { - "foreign": { - "argumentTypes": null, - "id": 40698, - "name": "AdminUpgradeabilityProxy", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": null, - "src": "1192:24:20", - "typeDescriptions": { - "typeIdentifier": null, - "typeString": null - } - }, - "local": null - } - ], - "unitAlias": "" - }, - { - "id": 40712, - "nodeType": "ContractDefinition", - "src": "1385:182:20", - "nodes": [ - { - "id": 40711, - "nodeType": "FunctionDefinition", - "src": "1443:122:20", - "nodes": [], - "body": { - "id": 40710, - "nodeType": "Block", - "src": "1563:2:20", - "nodes": [], - "statements": [] - }, - "documentation": null, - "implemented": true, - "kind": "constructor", - "modifiers": [ - { - "arguments": [ - { - "argumentTypes": null, - "id": 40707, - "name": "implementationContract", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 40704, - "src": "1535:22:20", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - } - ], - "id": 40708, - "modifierName": { - "argumentTypes": null, - "id": 40706, - "name": "AdminUpgradeabilityProxy", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 40565, - "src": "1510:24:20", - "typeDescriptions": { - "typeIdentifier": "t_type$_t_contract$_AdminUpgradeabilityProxy_$40565_$", - "typeString": "type(contract AdminUpgradeabilityProxy)" - } - }, - "nodeType": "ModifierInvocation", - "src": "1510:48:20" - } - ], - "name": "", - "overrides": null, - "parameters": { - "id": 40705, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 40704, - "mutability": "mutable", - "name": "implementationContract", - "nodeType": "VariableDeclaration", - "overrides": null, - "scope": 40711, - "src": "1455:30:20", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 40703, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "1455:7:20", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "1454:32:20" - }, - "returnParameters": { - "id": 40709, - "nodeType": "ParameterList", - "parameters": [], - "src": "1563:0:20" - }, - "scope": 40712, - "stateMutability": "nonpayable", - "virtual": false, - "visibility": "public" - } - ], - "abstract": false, - "baseContracts": [ - { - "arguments": null, - "baseName": { - "contractScope": null, - "id": 40701, - "name": "AdminUpgradeabilityProxy", - "nodeType": "UserDefinedTypeName", - "referencedDeclaration": 40565, - "src": "1412:24:20", - "typeDescriptions": { - "typeIdentifier": "t_contract$_AdminUpgradeabilityProxy_$40565", - "typeString": "contract AdminUpgradeabilityProxy" - } - }, - "id": 40702, - "nodeType": "InheritanceSpecifier", - "src": "1412:24:20" - } - ], - "contractDependencies": [40565, 40609, 40695], - "contractKind": "contract", - "documentation": { - "id": 40700, - "nodeType": "StructuredDocumentation", - "src": "1275:109:20", - "text": " @title FiatTokenProxy\n @dev This contract proxies FiatToken calls and enables FiatToken upgrades" - }, - "fullyImplemented": true, - "linearizedBaseContracts": [40712, 40565, 40695, 40609], - "name": "FiatTokenProxy", - "scope": 40713 - } - ], - "license": "MIT" - }, - "id": 20 -} diff --git a/packages/protocol/contracts/compiled/FiatTokenV2_1.json b/packages/protocol/contracts/compiled/FiatTokenV2_1.json deleted file mode 100644 index ecde2cf6579..00000000000 --- a/packages/protocol/contracts/compiled/FiatTokenV2_1.json +++ /dev/null @@ -1,3852 +0,0 @@ -{ - "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": "value", - "type": "uint256" - } - ], - "name": "Approval", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "authorizer", - "type": "address" - }, - { - "indexed": true, - "internalType": "bytes32", - "name": "nonce", - "type": "bytes32" - } - ], - "name": "AuthorizationCanceled", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "authorizer", - "type": "address" - }, - { - "indexed": true, - "internalType": "bytes32", - "name": "nonce", - "type": "bytes32" - } - ], - "name": "AuthorizationUsed", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "_account", - "type": "address" - } - ], - "name": "Blacklisted", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "newBlacklister", - "type": "address" - } - ], - "name": "BlacklisterChanged", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "burner", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "Burn", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "newMasterMinter", - "type": "address" - } - ], - "name": "MasterMinterChanged", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "minter", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "Mint", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "minter", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "minterAllowedAmount", - "type": "uint256" - } - ], - "name": "MinterConfigured", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "oldMinter", - "type": "address" - } - ], - "name": "MinterRemoved", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "address", - "name": "previousOwner", - "type": "address" - }, - { - "indexed": false, - "internalType": "address", - "name": "newOwner", - "type": "address" - } - ], - "name": "OwnershipTransferred", - "type": "event" - }, - { - "anonymous": false, - "inputs": [], - "name": "Pause", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "newAddress", - "type": "address" - } - ], - "name": "PauserChanged", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "newRescuer", - "type": "address" - } - ], - "name": "RescuerChanged", - "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" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "_account", - "type": "address" - } - ], - "name": "UnBlacklisted", - "type": "event" - }, - { - "anonymous": false, - "inputs": [], - "name": "Unpause", - "type": "event" - }, - { - "inputs": [], - "name": "CANCEL_AUTHORIZATION_TYPEHASH", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "DOMAIN_SEPARATOR", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "PERMIT_TYPEHASH", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "RECEIVE_WITH_AUTHORIZATION_TYPEHASH", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "TRANSFER_WITH_AUTHORIZATION_TYPEHASH", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "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": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "approve", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "authorizer", - "type": "address" - }, - { - "internalType": "bytes32", - "name": "nonce", - "type": "bytes32" - } - ], - "name": "authorizationState", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "balanceOf", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_account", - "type": "address" - } - ], - "name": "blacklist", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "blacklister", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" - } - ], - "name": "burn", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "authorizer", - "type": "address" - }, - { - "internalType": "bytes32", - "name": "nonce", - "type": "bytes32" - }, - { - "internalType": "uint8", - "name": "v", - "type": "uint8" - }, - { - "internalType": "bytes32", - "name": "r", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "s", - "type": "bytes32" - } - ], - "name": "cancelAuthorization", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "minter", - "type": "address" - }, - { - "internalType": "uint256", - "name": "minterAllowedAmount", - "type": "uint256" - } - ], - "name": "configureMinter", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "currency", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "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": "decrement", - "type": "uint256" - } - ], - "name": "decreaseAllowance", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "internalType": "uint256", - "name": "increment", - "type": "uint256" - } - ], - "name": "increaseAllowance", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "string", - "name": "tokenName", - "type": "string" - }, - { - "internalType": "string", - "name": "tokenSymbol", - "type": "string" - }, - { - "internalType": "string", - "name": "tokenCurrency", - "type": "string" - }, - { - "internalType": "uint8", - "name": "tokenDecimals", - "type": "uint8" - }, - { - "internalType": "address", - "name": "newMasterMinter", - "type": "address" - }, - { - "internalType": "address", - "name": "newPauser", - "type": "address" - }, - { - "internalType": "address", - "name": "newBlacklister", - "type": "address" - }, - { - "internalType": "address", - "name": "newOwner", - "type": "address" - } - ], - "name": "initialize", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "string", - "name": "newName", - "type": "string" - } - ], - "name": "initializeV2", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "lostAndFound", - "type": "address" - } - ], - "name": "initializeV2_1", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_account", - "type": "address" - } - ], - "name": "isBlacklisted", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "isMinter", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "masterMinter", - "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": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "minter", - "type": "address" - } - ], - "name": "minterAllowance", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "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": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "owner", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "pause", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "paused", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "pauser", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "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": "value", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "validAfter", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "validBefore", - "type": "uint256" - }, - { - "internalType": "bytes32", - "name": "nonce", - "type": "bytes32" - }, - { - "internalType": "uint8", - "name": "v", - "type": "uint8" - }, - { - "internalType": "bytes32", - "name": "r", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "s", - "type": "bytes32" - } - ], - "name": "receiveWithAuthorization", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "minter", - "type": "address" - } - ], - "name": "removeMinter", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "contract IERC20", - "name": "tokenContract", - "type": "address" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "rescueERC20", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "rescuer", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "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": "value", - "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": "value", - "type": "uint256" - } - ], - "name": "transferFrom", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "newOwner", - "type": "address" - } - ], - "name": "transferOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "validAfter", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "validBefore", - "type": "uint256" - }, - { - "internalType": "bytes32", - "name": "nonce", - "type": "bytes32" - }, - { - "internalType": "uint8", - "name": "v", - "type": "uint8" - }, - { - "internalType": "bytes32", - "name": "r", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "s", - "type": "bytes32" - } - ], - "name": "transferWithAuthorization", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_account", - "type": "address" - } - ], - "name": "unBlacklist", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "unpause", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_newBlacklister", - "type": "address" - } - ], - "name": "updateBlacklister", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_newMasterMinter", - "type": "address" - } - ], - "name": "updateMasterMinter", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_newPauser", - "type": "address" - } - ], - "name": "updatePauser", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "newRescuer", - "type": "address" - } - ], - "name": "updateRescuer", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "version", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "stateMutability": "view", - "type": "function" - } - ], - "bytecode": { - "object": "0x60806040526001805460ff60a01b191690556000600b553480156200002357600080fd5b506200002f3362000035565b62000057565b600080546001600160a01b0319166001600160a01b0392909216919091179055565b6153eb80620000676000396000f3fe608060405234801561001057600080fd5b50600436106103365760003560e01c80637f2eecc3116101b2578063b2118a8d116100f9578063e3ee160e116100a2578063ef55bec61161007c578063ef55bec614610cc1578063f2fde38b14610d2d578063f9f92be414610d60578063fe575a8714610d9357610336565b8063e3ee160e14610c14578063e5a6b10f14610c80578063e94a010214610c8857610336565b8063d608ea64116100d3578063d608ea6414610b61578063d916948714610bd1578063dd62ed3e14610bd957610336565b8063b2118a8d14610ab8578063bd10243014610afb578063d505accf14610b0357610336565b8063a0cc6a681161015b578063aa20e1e411610135578063aa20e1e414610a1f578063aa271e1a14610a52578063ad38bf2214610a8557610336565b8063a0cc6a68146109a5578063a457c2d7146109ad578063a9059cbb146109e657610336565b80638da5cb5b1161018c5780638da5cb5b1461098d57806395d89b41146109955780639fd0506d1461099d57610336565b80637f2eecc31461094a5780638456cb59146109525780638a6db9c31461095a57610336565b80633644e515116102815780634e44d9561161022a5780635a049a70116102045780635a049a701461088e5780635c975abb146108dc57806370a08231146108e45780637ecebe001461091757610336565b80634e44d9561461081a57806354fd4d5014610853578063554bab3c1461085b57610336565b80633f4ba83a1161025b5780633f4ba83a146107bc57806340c10f19146107c457806342966c68146107fd57610336565b80633644e5151461077357806338a631831461077b578063395093511461078357610336565b80632fc81e09116102e3578063313ce567116102bd578063313ce567146105385780633357162b1461055657806335d99f351461074257610336565b80632fc81e09146104ca5780633092afd5146104fd57806330adf81f1461053057610336565b80631a895266116103145780631a8952661461041f57806323b872dd146104545780632ab600451461049757610336565b806306fdde031461033b578063095ea7b3146103b857806318160ddd14610405575b600080fd5b610343610dc6565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561037d578181015183820152602001610365565b50505050905090810190601f1680156103aa5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6103f1600480360360408110156103ce57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610e72565b604080519115158252519081900360200190f35b61040d610fff565b60408051918252519081900360200190f35b6104526004803603602081101561043557600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611005565b005b6103f16004803603606081101561046a57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013590911690604001356110e9565b610452600480360360208110156104ad57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166113ef565b610452600480360360208110156104e057600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611550565b6103f16004803603602081101561051357600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166115ce565b61040d6116c7565b6105406116eb565b6040805160ff9092168252519081900360200190f35b610452600480360361010081101561056d57600080fd5b81019060208101813564010000000081111561058857600080fd5b82018360208201111561059a57600080fd5b803590602001918460018302840111640100000000831117156105bc57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929594936020810193503591505064010000000081111561060f57600080fd5b82018360208201111561062157600080fd5b8035906020019184600183028401116401000000008311171561064357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929594936020810193503591505064010000000081111561069657600080fd5b8201836020820111156106a857600080fd5b803590602001918460018302840111640100000000831117156106ca57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295505050813560ff16925050602081013573ffffffffffffffffffffffffffffffffffffffff908116916040810135821691606082013581169160800135166116f4565b61074a611a36565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b61040d611a52565b61074a611a58565b6103f16004803603604081101561079957600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135611a74565b610452611bf6565b6103f1600480360360408110156107da57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135611cb9565b6104526004803603602081101561081357600080fd5b50356120ee565b6103f16004803603604081101561083057600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81351690602001356123a8565b61034361253b565b6104526004803603602081101561087157600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16612572565b610452600480360360a08110156108a457600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060208101359060ff60408201351690606081013590608001356126d9565b6103f1612777565b61040d600480360360208110156108fa57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16612798565b61040d6004803603602081101561092d57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166127c0565b61040d6127e8565b61045261280c565b61040d6004803603602081101561097057600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166128e6565b61074a61290e565b61034361292a565b61074a6129a3565b61040d6129bf565b6103f1600480360360408110156109c357600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81351690602001356129e3565b6103f1600480360360408110156109fc57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135612b65565b61045260048036036020811015610a3557600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16612ce7565b6103f160048036036020811015610a6857600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16612e4e565b61045260048036036020811015610a9b57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16612e79565b61045260048036036060811015610ace57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160208101359091169060400135612fe0565b61074a613076565b610452600480360360e0811015610b1957600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160208101359091169060408101359060608101359060ff6080820135169060a08101359060c00135613092565b61045260048036036020811015610b7757600080fd5b810190602081018135640100000000811115610b9257600080fd5b820183602082011115610ba457600080fd5b80359060200191846001830284011164010000000083111715610bc657600080fd5b509092509050613238565b61040d613321565b61040d60048036036040811015610bef57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020013516613345565b6104526004803603610120811015610c2b57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160208101359091169060408101359060608101359060808101359060a08101359060ff60c0820135169060e081013590610100013561337d565b610343613527565b6103f160048036036040811015610c9e57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81351690602001356135a0565b6104526004803603610120811015610cd857600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160208101359091169060408101359060608101359060808101359060a08101359060ff60c0820135169060e08101359061010001356135d8565b61045260048036036020811015610d4357600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16613775565b61045260048036036020811015610d7657600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166138c8565b6103f160048036036020811015610da957600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166139af565b6004805460408051602060026001851615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f81018490048402820184019092528181529291830182828015610e6a5780601f10610e3f57610100808354040283529160200191610e6a565b820191906000526020600020905b815481529060010190602001808311610e4d57829003601f168201915b505050505081565b60015460009074010000000000000000000000000000000000000000900460ff1615610eff57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b3360008181526003602052604090205460ff1615610f68576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806153476025913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8416600090815260036020526040902054849060ff1615610fe9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806153476025913960400191505060405180910390fd5b610ff43386866139da565b506001949350505050565b600b5490565b60025473ffffffffffffffffffffffffffffffffffffffff163314611075576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c81526020018061506b602c913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff811660008181526003602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055517f117e3210bb9aa7d9baff172026820255c6f6c30ba8999d1c2fd88e2848137c4e9190a250565b60015460009074010000000000000000000000000000000000000000900460ff161561117657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b3360008181526003602052604090205460ff16156111df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806153476025913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8516600090815260036020526040902054859060ff1615611260576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806153476025913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8516600090815260036020526040902054859060ff16156112e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806153476025913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff87166000908152600a6020908152604080832033845290915290205485111561136a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806151316028913960400191505060405180910390fd5b611375878787613b21565b73ffffffffffffffffffffffffffffffffffffffff87166000908152600a602090815260408083203384529091529020546113b09086613d4c565b73ffffffffffffffffffffffffffffffffffffffff88166000908152600a60209081526040808320338452909152902055600193505050509392505050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461147557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff81166114e1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180614fc9602a913960400191505060405180910390fd5b600e80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517fe475e580d85111348e40d8ca33cfdd74c30fe1655c2d8537a13abc10065ffa5a90600090a250565b60125460ff1660011461156257600080fd5b30600090815260096020526040902054801561158357611583308383613b21565b505030600090815260036020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00908116600117909155601280549091166002179055565b60085460009073ffffffffffffffffffffffffffffffffffffffff163314611641576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806150426029913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff82166000818152600c6020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600d909152808220829055517fe94479a9f7e1952cc78f2d6baab678adc1b772d936c6583def489e524cb666929190a2506001919050565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60065460ff1681565b60085474010000000000000000000000000000000000000000900460ff1615611768576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a8152602001806151ac602a913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff84166117d4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f8152602001806150de602f913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8316611840576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526029815260200180614fa06029913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff82166118ac576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180615159602e913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8116611918576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806152bf6028913960400191505060405180910390fd5b875161192b9060049060208b0190614d50565b50865161193f9060059060208a0190614d50565b508551611953906007906020890190614d50565b50600680547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff8716179055600880547fffffffffffffffffffffffff000000000000000000000000000000000000000090811673ffffffffffffffffffffffffffffffffffffffff87811691909117909255600180548216868416179055600280549091169184169190911790556119ed81613d95565b5050600880547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1674010000000000000000000000000000000000000000179055505050505050565b60085473ffffffffffffffffffffffffffffffffffffffff1681565b600f5481565b600e5473ffffffffffffffffffffffffffffffffffffffff1690565b60015460009074010000000000000000000000000000000000000000900460ff1615611b0157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b3360008181526003602052604090205460ff1615611b6a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806153476025913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8416600090815260036020526040902054849060ff1615611beb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806153476025913960400191505060405180910390fd5b610ff4338686613ddc565b60015473ffffffffffffffffffffffffffffffffffffffff163314611c66576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602281526020018061524d6022913960400191505060405180910390fd5b600180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690556040517f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3390600090a1565b60015460009074010000000000000000000000000000000000000000900460ff1615611d4657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b336000908152600c602052604090205460ff16611dae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806150bd6021913960400191505060405180910390fd5b3360008181526003602052604090205460ff1615611e17576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806153476025913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8416600090815260036020526040902054849060ff1615611e98576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806153476025913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8516611f04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180614f0f6023913960400191505060405180910390fd5b60008411611f5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526029815260200180614ff36029913960400191505060405180910390fd5b336000908152600d602052604090205480851115611fc6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e81526020018061521f602e913960400191505060405180910390fd5b600b54611fd39086613e26565b600b5573ffffffffffffffffffffffffffffffffffffffff86166000908152600960205260409020546120069086613e26565b73ffffffffffffffffffffffffffffffffffffffff87166000908152600960205260409020556120368186613d4c565b336000818152600d6020908152604091829020939093558051888152905173ffffffffffffffffffffffffffffffffffffffff8a16937fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f8928290030190a360408051868152905173ffffffffffffffffffffffffffffffffffffffff8816916000917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a350600195945050505050565b60015474010000000000000000000000000000000000000000900460ff161561217857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b336000908152600c602052604090205460ff166121e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806150bd6021913960400191505060405180910390fd5b3360008181526003602052604090205460ff1615612249576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806153476025913960400191505060405180910390fd5b33600090815260096020526040902054826122af576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526029815260200180614ee66029913960400191505060405180910390fd5b82811015612308576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806150976026913960400191505060405180910390fd5b600b546123159084613d4c565b600b556123228184613d4c565b33600081815260096020908152604091829020939093558051868152905191927fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca592918290030190a260408051848152905160009133917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a3505050565b60015460009074010000000000000000000000000000000000000000900460ff161561243557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b60085473ffffffffffffffffffffffffffffffffffffffff1633146124a5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806150426029913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff83166000818152600c6020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055600d825291829020859055815185815291517f46980fca912ef9bcdbd36877427b6b90e860769f604e89c0e67720cece530d209281900390910190a250600192915050565b60408051808201909152600181527f3200000000000000000000000000000000000000000000000000000000000000602082015290565b60005473ffffffffffffffffffffffffffffffffffffffff1633146125f857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8116612664576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526028815260200180614e936028913960400191505060405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691909117918290556040519116907fb80482a293ca2e013eda8683c9bd7fc8347cfdaeea5ede58cba46df502c2a60490600090a250565b60015474010000000000000000000000000000000000000000900460ff161561276357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b6127708585858585613e9a565b5050505050565b60015474010000000000000000000000000000000000000000900460ff1681565b73ffffffffffffffffffffffffffffffffffffffff1660009081526009602052604090205490565b73ffffffffffffffffffffffffffffffffffffffff1660009081526011602052604090205490565b7fd099cc98ef71107a616c4f0f941f04c322d8e254fe26b3c6668db87aae413de881565b60015473ffffffffffffffffffffffffffffffffffffffff16331461287c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602281526020018061524d6022913960400191505060405180910390fd5b600180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790556040517f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62590600090a1565b73ffffffffffffffffffffffffffffffffffffffff166000908152600d602052604090205490565b60005473ffffffffffffffffffffffffffffffffffffffff1690565b6005805460408051602060026001851615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f81018490048402820184019092528181529291830182828015610e6a5780601f10610e3f57610100808354040283529160200191610e6a565b60015473ffffffffffffffffffffffffffffffffffffffff1681565b7f7c7c6cdb67a18743f49ec6fa9b35f50d52ed05cbed4cc592e13b44501c1a226781565b60015460009074010000000000000000000000000000000000000000900460ff1615612a7057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b3360008181526003602052604090205460ff1615612ad9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806153476025913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8416600090815260036020526040902054849060ff1615612b5a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806153476025913960400191505060405180910390fd5b610ff4338686614023565b60015460009074010000000000000000000000000000000000000000900460ff1615612bf257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b3360008181526003602052604090205460ff1615612c5b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806153476025913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8416600090815260036020526040902054849060ff1615612cdc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806153476025913960400191505060405180910390fd5b610ff4338686613b21565b60005473ffffffffffffffffffffffffffffffffffffffff163314612d6d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8116612dd9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f8152602001806150de602f913960400191505060405180910390fd5b600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691909117918290556040519116907fdb66dfa9c6b8f5226fe9aac7e51897ae8ee94ac31dc70bb6c9900b2574b707e690600090a250565b73ffffffffffffffffffffffffffffffffffffffff166000908152600c602052604090205460ff1690565b60005473ffffffffffffffffffffffffffffffffffffffff163314612eff57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8116612f6b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001806153156032913960400191505060405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691909117918290556040519116907fc67398012c111ce95ecb7429b933096c977380ee6c421175a71a4a4c6c88c06e90600090a250565b600e5473ffffffffffffffffffffffffffffffffffffffff163314613050576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602481526020018061510d6024913960400191505060405180910390fd5b61307173ffffffffffffffffffffffffffffffffffffffff8416838361407f565b505050565b60025473ffffffffffffffffffffffffffffffffffffffff1681565b60015474010000000000000000000000000000000000000000900460ff161561311c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8716600090815260036020526040902054879060ff161561319d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806153476025913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8716600090815260036020526040902054879060ff161561321e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806153476025913960400191505060405180910390fd5b61322d8989898989898961410c565b505050505050505050565b60085474010000000000000000000000000000000000000000900460ff168015613265575060125460ff16155b61326e57600080fd5b61327a60048383614dce565b506132ef82828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600181527f3200000000000000000000000000000000000000000000000000000000000000602082015291506142b59050565b600f555050601280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b7f158b0a9edf7a828aad02f63cd515c68ef2f50ba807396f6d12842833a159742981565b73ffffffffffffffffffffffffffffffffffffffff9182166000908152600a6020908152604080832093909416825291909152205490565b60015474010000000000000000000000000000000000000000900460ff161561340757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8916600090815260036020526040902054899060ff1615613488576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806153476025913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8916600090815260036020526040902054899060ff1615613509576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806153476025913960400191505060405180910390fd5b61351a8b8b8b8b8b8b8b8b8b614327565b5050505050505050505050565b6007805460408051602060026001851615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f81018490048402820184019092528181529291830182828015610e6a5780601f10610e3f57610100808354040283529160200191610e6a565b73ffffffffffffffffffffffffffffffffffffffff919091166000908152601060209081526040808320938352929052205460ff1690565b60015474010000000000000000000000000000000000000000900460ff161561366257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8916600090815260036020526040902054899060ff16156136e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806153476025913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8916600090815260036020526040902054899060ff1615613764576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806153476025913960400191505060405180910390fd5b61351a8b8b8b8b8b8b8b8b8b614469565b60005473ffffffffffffffffffffffffffffffffffffffff1633146137fb57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8116613867576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180614f586026913960400191505060405180910390fd5b6000546040805173ffffffffffffffffffffffffffffffffffffffff9283168152918316602083015280517f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09281900390910190a16138c581613d95565b50565b60025473ffffffffffffffffffffffffffffffffffffffff163314613938576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c81526020018061506b602c913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff811660008181526003602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055517fffa4e6181777692565cf28528fc88fd1516ea86b56da075235fa575af6a4b8559190a250565b73ffffffffffffffffffffffffffffffffffffffff1660009081526003602052604090205460ff1690565b73ffffffffffffffffffffffffffffffffffffffff8316613a46576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806151fb6024913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8216613ab2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180614f7e6022913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8084166000818152600a6020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b73ffffffffffffffffffffffffffffffffffffffff8316613b8d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806151d66025913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8216613bf9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180614e706023913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8316600090815260096020526040902054811115613c77576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602681526020018061501c6026913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8316600090815260096020526040902054613ca79082613d4c565b73ffffffffffffffffffffffffffffffffffffffff8085166000908152600960205260408082209390935590841681522054613ce39082613e26565b73ffffffffffffffffffffffffffffffffffffffff80841660008181526009602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b6000613d8e83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250614576565b9392505050565b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b73ffffffffffffffffffffffffffffffffffffffff8084166000908152600a60209081526040808320938616835292905220546130719084908490613e219085613e26565b6139da565b600082820183811015613d8e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b613ea48585614627565b604080517f158b0a9edf7a828aad02f63cd515c68ef2f50ba807396f6d12842833a1597429602082015273ffffffffffffffffffffffffffffffffffffffff87168183018190526060828101889052835180840390910181526080909201909252600f54909190613f1890868686866146b5565b73ffffffffffffffffffffffffffffffffffffffff1614613f9a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f46696174546f6b656e56323a20696e76616c6964207369676e61747572650000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8616600081815260106020908152604080832089845290915280822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055518792917f1cdd46ff242716cdaa72d159d339a485b3438398348d68f09d7c8c0a59353d8191a3505050505050565b6130718383613e21846040518060600160405280602581526020016153916025913973ffffffffffffffffffffffffffffffffffffffff808a166000908152600a60209081526040808320938c16835292905220549190614576565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052613071908490614727565b4284101561417b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f46696174546f6b656e56323a207065726d697420697320657870697265640000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff80881660008181526011602090815260409182902080546001810190915582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c992810192909252818301849052938a1660608201526080810189905260a081019390935260c08084018890528151808503909101815260e09093019052600f5461421e90868686866146b5565b73ffffffffffffffffffffffffffffffffffffffff16146142a057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f454950323631323a20696e76616c6964207369676e6174757265000000000000604482015290519081900360640190fd5b6142ab8888886139da565b5050505050505050565b8151602092830120815191830191909120604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818601528082019390935260608301919091524660808301523060a0808401919091528151808403909101815260c09092019052805191012090565b614333898588886147ff565b604080517f7c7c6cdb67a18743f49ec6fa9b35f50d52ed05cbed4cc592e13b44501c1a2267602082015273ffffffffffffffffffffffffffffffffffffffff808c16828401819052908b166060830152608082018a905260a0820189905260c0820188905260e080830188905283518084039091018152610100909201909252600f549091906143c690868686866146b5565b73ffffffffffffffffffffffffffffffffffffffff161461444857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f46696174546f6b656e56323a20696e76616c6964207369676e61747572650000604482015290519081900360640190fd5b6144528a866148bf565b61445d8a8a8a613b21565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff881633146144d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806151876025913960400191505060405180910390fd5b6144e3898588886147ff565b604080517fd099cc98ef71107a616c4f0f941f04c322d8e254fe26b3c6668db87aae413de8602082015273ffffffffffffffffffffffffffffffffffffffff808c16828401819052908b166060830152608082018a905260a0820189905260c0820188905260e080830188905283518084039091018152610100909201909252600f549091906143c690868686866146b5565b6000818484111561461f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156145e45781810151838201526020016145cc565b50505050905090810190601f1680156146115780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260106020908152604080832084845290915290205460ff16156146b1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e8152602001806152e7602e913960400191505060405180910390fd5b5050565b8051602080830191909120604080517f19010000000000000000000000000000000000000000000000000000000000008185015260228101899052604280820193909352815180820390930183526062019052805191012060009061471c81878787614944565b979650505050505050565b6060614789826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16614b419092919063ffffffff16565b805190915015613071578080602001905160208110156147a857600080fd5b5051613071576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180615295602a913960400191505060405180910390fd5b814211614857576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b815260200180614ebb602b913960400191505060405180910390fd5b8042106148af576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602581526020018061536c6025913960400191505060405180910390fd5b6148b98484614627565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8216600081815260106020908152604080832085845290915280822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055518392917f98de503528ee59b575ef0c0a2576a82497bfc029a5685b209e9ec333479b10a591a35050565b60007f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08211156149bf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602681526020018061526f6026913960400191505060405180910390fd5b8360ff16601b141580156149d757508360ff16601c14155b15614a2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180614f326026913960400191505060405180910390fd5b600060018686868660405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015614a89573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116614b3657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f45435265636f7665723a20696e76616c6964207369676e617475726500000000604482015290519081900360640190fd5b90505b949350505050565b6060614b3984846000856060614b5685614d17565b614bc157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b60208310614c2b57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101614bee565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114614c8d576040519150601f19603f3d011682016040523d82523d6000602084013e614c92565b606091505b50915091508115614ca6579150614b399050565b805115614cb65780518082602001fd5b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482018181528651602484015286518793919283926044019190850190808383600083156145e45781810151838201526020016145cc565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590614b39575050151592915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10614d9157805160ff1916838001178555614dbe565b82800160010185558215614dbe579182015b82811115614dbe578251825591602001919060010190614da3565b50614dca929150614e5a565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10614e2d578280017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00823516178555614dbe565b82800160010185558215614dbe579182015b82811115614dbe578235825591602001919060010190614e3f565b5b80821115614dca5760008155600101614e5b56fe45524332303a207472616e7366657220746f20746865207a65726f20616464726573735061757361626c653a206e65772070617573657220697320746865207a65726f206164647265737346696174546f6b656e56323a20617574686f72697a6174696f6e206973206e6f74207965742076616c696446696174546f6b656e3a206275726e20616d6f756e74206e6f742067726561746572207468616e203046696174546f6b656e3a206d696e7420746f20746865207a65726f206164647265737345435265636f7665723a20696e76616c6964207369676e6174757265202776272076616c75654f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f206164647265737346696174546f6b656e3a206e65772070617573657220697320746865207a65726f2061646472657373526573637561626c653a206e6577207265736375657220697320746865207a65726f206164647265737346696174546f6b656e3a206d696e7420616d6f756e74206e6f742067726561746572207468616e203045524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636546696174546f6b656e3a2063616c6c6572206973206e6f7420746865206d61737465724d696e746572426c61636b6c69737461626c653a2063616c6c6572206973206e6f742074686520626c61636b6c697374657246696174546f6b656e3a206275726e20616d6f756e7420657863656564732062616c616e636546696174546f6b656e3a2063616c6c6572206973206e6f742061206d696e74657246696174546f6b656e3a206e6577206d61737465724d696e74657220697320746865207a65726f2061646472657373526573637561626c653a2063616c6c6572206973206e6f7420746865207265736375657245524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636546696174546f6b656e3a206e657720626c61636b6c697374657220697320746865207a65726f206164647265737346696174546f6b656e56323a2063616c6c6572206d7573742062652074686520706179656546696174546f6b656e3a20636f6e747261637420697320616c726561647920696e697469616c697a656445524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737346696174546f6b656e3a206d696e7420616d6f756e742065786365656473206d696e746572416c6c6f77616e63655061757361626c653a2063616c6c6572206973206e6f74207468652070617573657245435265636f7665723a20696e76616c6964207369676e6174757265202773272076616c75655361666545524332303a204552433230206f7065726174696f6e20646964206e6f74207375636365656446696174546f6b656e3a206e6577206f776e657220697320746865207a65726f206164647265737346696174546f6b656e56323a20617574686f72697a6174696f6e2069732075736564206f722063616e63656c6564426c61636b6c69737461626c653a206e657720626c61636b6c697374657220697320746865207a65726f2061646472657373426c61636b6c69737461626c653a206163636f756e7420697320626c61636b6c697374656446696174546f6b656e56323a20617574686f72697a6174696f6e206973206578706972656445524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212203ccc7055acd0820f4e7d094fa75ff2d3b0c27bdd446079aeef6bd6d02c56938e64736f6c634300060c0033", - "sourceMap": "1362:764:41:-:0;;;2106:26:35;;;-1:-1:-1;2106:26:35;;;-1:-1:-1;1940:33:33;;1362:764:41;;;;;;;;;-1:-1:-1;2223:20:34;2232:10;2223:8;:20::i;:::-;1362:764:41;;2493:79:34;2548:6;:17;;-1:-1:-1;2548:17:34;-1:-1:-1;2548:17:34;;;;;;;;;;2493:79::o;1362:764:41:-;;;;;;;", - "linkReferences": {} - }, - "deployedBytecode": { - "object": "0x608060405234801561001057600080fd5b50600436106103365760003560e01c80637f2eecc3116101b2578063b2118a8d116100f9578063e3ee160e116100a2578063ef55bec61161007c578063ef55bec614610cc1578063f2fde38b14610d2d578063f9f92be414610d60578063fe575a8714610d9357610336565b8063e3ee160e14610c14578063e5a6b10f14610c80578063e94a010214610c8857610336565b8063d608ea64116100d3578063d608ea6414610b61578063d916948714610bd1578063dd62ed3e14610bd957610336565b8063b2118a8d14610ab8578063bd10243014610afb578063d505accf14610b0357610336565b8063a0cc6a681161015b578063aa20e1e411610135578063aa20e1e414610a1f578063aa271e1a14610a52578063ad38bf2214610a8557610336565b8063a0cc6a68146109a5578063a457c2d7146109ad578063a9059cbb146109e657610336565b80638da5cb5b1161018c5780638da5cb5b1461098d57806395d89b41146109955780639fd0506d1461099d57610336565b80637f2eecc31461094a5780638456cb59146109525780638a6db9c31461095a57610336565b80633644e515116102815780634e44d9561161022a5780635a049a70116102045780635a049a701461088e5780635c975abb146108dc57806370a08231146108e45780637ecebe001461091757610336565b80634e44d9561461081a57806354fd4d5014610853578063554bab3c1461085b57610336565b80633f4ba83a1161025b5780633f4ba83a146107bc57806340c10f19146107c457806342966c68146107fd57610336565b80633644e5151461077357806338a631831461077b578063395093511461078357610336565b80632fc81e09116102e3578063313ce567116102bd578063313ce567146105385780633357162b1461055657806335d99f351461074257610336565b80632fc81e09146104ca5780633092afd5146104fd57806330adf81f1461053057610336565b80631a895266116103145780631a8952661461041f57806323b872dd146104545780632ab600451461049757610336565b806306fdde031461033b578063095ea7b3146103b857806318160ddd14610405575b600080fd5b610343610dc6565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561037d578181015183820152602001610365565b50505050905090810190601f1680156103aa5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6103f1600480360360408110156103ce57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610e72565b604080519115158252519081900360200190f35b61040d610fff565b60408051918252519081900360200190f35b6104526004803603602081101561043557600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611005565b005b6103f16004803603606081101561046a57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013590911690604001356110e9565b610452600480360360208110156104ad57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166113ef565b610452600480360360208110156104e057600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611550565b6103f16004803603602081101561051357600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166115ce565b61040d6116c7565b6105406116eb565b6040805160ff9092168252519081900360200190f35b610452600480360361010081101561056d57600080fd5b81019060208101813564010000000081111561058857600080fd5b82018360208201111561059a57600080fd5b803590602001918460018302840111640100000000831117156105bc57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929594936020810193503591505064010000000081111561060f57600080fd5b82018360208201111561062157600080fd5b8035906020019184600183028401116401000000008311171561064357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929594936020810193503591505064010000000081111561069657600080fd5b8201836020820111156106a857600080fd5b803590602001918460018302840111640100000000831117156106ca57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295505050813560ff16925050602081013573ffffffffffffffffffffffffffffffffffffffff908116916040810135821691606082013581169160800135166116f4565b61074a611a36565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b61040d611a52565b61074a611a58565b6103f16004803603604081101561079957600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135611a74565b610452611bf6565b6103f1600480360360408110156107da57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135611cb9565b6104526004803603602081101561081357600080fd5b50356120ee565b6103f16004803603604081101561083057600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81351690602001356123a8565b61034361253b565b6104526004803603602081101561087157600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16612572565b610452600480360360a08110156108a457600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060208101359060ff60408201351690606081013590608001356126d9565b6103f1612777565b61040d600480360360208110156108fa57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16612798565b61040d6004803603602081101561092d57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166127c0565b61040d6127e8565b61045261280c565b61040d6004803603602081101561097057600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166128e6565b61074a61290e565b61034361292a565b61074a6129a3565b61040d6129bf565b6103f1600480360360408110156109c357600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81351690602001356129e3565b6103f1600480360360408110156109fc57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135612b65565b61045260048036036020811015610a3557600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16612ce7565b6103f160048036036020811015610a6857600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16612e4e565b61045260048036036020811015610a9b57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16612e79565b61045260048036036060811015610ace57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160208101359091169060400135612fe0565b61074a613076565b610452600480360360e0811015610b1957600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160208101359091169060408101359060608101359060ff6080820135169060a08101359060c00135613092565b61045260048036036020811015610b7757600080fd5b810190602081018135640100000000811115610b9257600080fd5b820183602082011115610ba457600080fd5b80359060200191846001830284011164010000000083111715610bc657600080fd5b509092509050613238565b61040d613321565b61040d60048036036040811015610bef57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020013516613345565b6104526004803603610120811015610c2b57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160208101359091169060408101359060608101359060808101359060a08101359060ff60c0820135169060e081013590610100013561337d565b610343613527565b6103f160048036036040811015610c9e57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81351690602001356135a0565b6104526004803603610120811015610cd857600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160208101359091169060408101359060608101359060808101359060a08101359060ff60c0820135169060e08101359061010001356135d8565b61045260048036036020811015610d4357600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16613775565b61045260048036036020811015610d7657600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166138c8565b6103f160048036036020811015610da957600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166139af565b6004805460408051602060026001851615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f81018490048402820184019092528181529291830182828015610e6a5780601f10610e3f57610100808354040283529160200191610e6a565b820191906000526020600020905b815481529060010190602001808311610e4d57829003601f168201915b505050505081565b60015460009074010000000000000000000000000000000000000000900460ff1615610eff57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b3360008181526003602052604090205460ff1615610f68576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806153476025913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8416600090815260036020526040902054849060ff1615610fe9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806153476025913960400191505060405180910390fd5b610ff43386866139da565b506001949350505050565b600b5490565b60025473ffffffffffffffffffffffffffffffffffffffff163314611075576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c81526020018061506b602c913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff811660008181526003602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055517f117e3210bb9aa7d9baff172026820255c6f6c30ba8999d1c2fd88e2848137c4e9190a250565b60015460009074010000000000000000000000000000000000000000900460ff161561117657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b3360008181526003602052604090205460ff16156111df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806153476025913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8516600090815260036020526040902054859060ff1615611260576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806153476025913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8516600090815260036020526040902054859060ff16156112e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806153476025913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff87166000908152600a6020908152604080832033845290915290205485111561136a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806151316028913960400191505060405180910390fd5b611375878787613b21565b73ffffffffffffffffffffffffffffffffffffffff87166000908152600a602090815260408083203384529091529020546113b09086613d4c565b73ffffffffffffffffffffffffffffffffffffffff88166000908152600a60209081526040808320338452909152902055600193505050509392505050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461147557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff81166114e1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180614fc9602a913960400191505060405180910390fd5b600e80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517fe475e580d85111348e40d8ca33cfdd74c30fe1655c2d8537a13abc10065ffa5a90600090a250565b60125460ff1660011461156257600080fd5b30600090815260096020526040902054801561158357611583308383613b21565b505030600090815260036020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00908116600117909155601280549091166002179055565b60085460009073ffffffffffffffffffffffffffffffffffffffff163314611641576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806150426029913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff82166000818152600c6020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600d909152808220829055517fe94479a9f7e1952cc78f2d6baab678adc1b772d936c6583def489e524cb666929190a2506001919050565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60065460ff1681565b60085474010000000000000000000000000000000000000000900460ff1615611768576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a8152602001806151ac602a913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff84166117d4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f8152602001806150de602f913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8316611840576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526029815260200180614fa06029913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff82166118ac576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180615159602e913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8116611918576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806152bf6028913960400191505060405180910390fd5b875161192b9060049060208b0190614d50565b50865161193f9060059060208a0190614d50565b508551611953906007906020890190614d50565b50600680547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff8716179055600880547fffffffffffffffffffffffff000000000000000000000000000000000000000090811673ffffffffffffffffffffffffffffffffffffffff87811691909117909255600180548216868416179055600280549091169184169190911790556119ed81613d95565b5050600880547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1674010000000000000000000000000000000000000000179055505050505050565b60085473ffffffffffffffffffffffffffffffffffffffff1681565b600f5481565b600e5473ffffffffffffffffffffffffffffffffffffffff1690565b60015460009074010000000000000000000000000000000000000000900460ff1615611b0157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b3360008181526003602052604090205460ff1615611b6a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806153476025913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8416600090815260036020526040902054849060ff1615611beb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806153476025913960400191505060405180910390fd5b610ff4338686613ddc565b60015473ffffffffffffffffffffffffffffffffffffffff163314611c66576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602281526020018061524d6022913960400191505060405180910390fd5b600180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690556040517f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3390600090a1565b60015460009074010000000000000000000000000000000000000000900460ff1615611d4657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b336000908152600c602052604090205460ff16611dae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806150bd6021913960400191505060405180910390fd5b3360008181526003602052604090205460ff1615611e17576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806153476025913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8416600090815260036020526040902054849060ff1615611e98576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806153476025913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8516611f04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180614f0f6023913960400191505060405180910390fd5b60008411611f5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526029815260200180614ff36029913960400191505060405180910390fd5b336000908152600d602052604090205480851115611fc6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e81526020018061521f602e913960400191505060405180910390fd5b600b54611fd39086613e26565b600b5573ffffffffffffffffffffffffffffffffffffffff86166000908152600960205260409020546120069086613e26565b73ffffffffffffffffffffffffffffffffffffffff87166000908152600960205260409020556120368186613d4c565b336000818152600d6020908152604091829020939093558051888152905173ffffffffffffffffffffffffffffffffffffffff8a16937fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f8928290030190a360408051868152905173ffffffffffffffffffffffffffffffffffffffff8816916000917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a350600195945050505050565b60015474010000000000000000000000000000000000000000900460ff161561217857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b336000908152600c602052604090205460ff166121e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806150bd6021913960400191505060405180910390fd5b3360008181526003602052604090205460ff1615612249576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806153476025913960400191505060405180910390fd5b33600090815260096020526040902054826122af576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526029815260200180614ee66029913960400191505060405180910390fd5b82811015612308576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806150976026913960400191505060405180910390fd5b600b546123159084613d4c565b600b556123228184613d4c565b33600081815260096020908152604091829020939093558051868152905191927fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca592918290030190a260408051848152905160009133917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a3505050565b60015460009074010000000000000000000000000000000000000000900460ff161561243557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b60085473ffffffffffffffffffffffffffffffffffffffff1633146124a5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806150426029913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff83166000818152600c6020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055600d825291829020859055815185815291517f46980fca912ef9bcdbd36877427b6b90e860769f604e89c0e67720cece530d209281900390910190a250600192915050565b60408051808201909152600181527f3200000000000000000000000000000000000000000000000000000000000000602082015290565b60005473ffffffffffffffffffffffffffffffffffffffff1633146125f857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8116612664576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526028815260200180614e936028913960400191505060405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691909117918290556040519116907fb80482a293ca2e013eda8683c9bd7fc8347cfdaeea5ede58cba46df502c2a60490600090a250565b60015474010000000000000000000000000000000000000000900460ff161561276357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b6127708585858585613e9a565b5050505050565b60015474010000000000000000000000000000000000000000900460ff1681565b73ffffffffffffffffffffffffffffffffffffffff1660009081526009602052604090205490565b73ffffffffffffffffffffffffffffffffffffffff1660009081526011602052604090205490565b7fd099cc98ef71107a616c4f0f941f04c322d8e254fe26b3c6668db87aae413de881565b60015473ffffffffffffffffffffffffffffffffffffffff16331461287c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602281526020018061524d6022913960400191505060405180910390fd5b600180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790556040517f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62590600090a1565b73ffffffffffffffffffffffffffffffffffffffff166000908152600d602052604090205490565b60005473ffffffffffffffffffffffffffffffffffffffff1690565b6005805460408051602060026001851615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f81018490048402820184019092528181529291830182828015610e6a5780601f10610e3f57610100808354040283529160200191610e6a565b60015473ffffffffffffffffffffffffffffffffffffffff1681565b7f7c7c6cdb67a18743f49ec6fa9b35f50d52ed05cbed4cc592e13b44501c1a226781565b60015460009074010000000000000000000000000000000000000000900460ff1615612a7057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b3360008181526003602052604090205460ff1615612ad9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806153476025913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8416600090815260036020526040902054849060ff1615612b5a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806153476025913960400191505060405180910390fd5b610ff4338686614023565b60015460009074010000000000000000000000000000000000000000900460ff1615612bf257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b3360008181526003602052604090205460ff1615612c5b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806153476025913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8416600090815260036020526040902054849060ff1615612cdc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806153476025913960400191505060405180910390fd5b610ff4338686613b21565b60005473ffffffffffffffffffffffffffffffffffffffff163314612d6d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8116612dd9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f8152602001806150de602f913960400191505060405180910390fd5b600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691909117918290556040519116907fdb66dfa9c6b8f5226fe9aac7e51897ae8ee94ac31dc70bb6c9900b2574b707e690600090a250565b73ffffffffffffffffffffffffffffffffffffffff166000908152600c602052604090205460ff1690565b60005473ffffffffffffffffffffffffffffffffffffffff163314612eff57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8116612f6b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001806153156032913960400191505060405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691909117918290556040519116907fc67398012c111ce95ecb7429b933096c977380ee6c421175a71a4a4c6c88c06e90600090a250565b600e5473ffffffffffffffffffffffffffffffffffffffff163314613050576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602481526020018061510d6024913960400191505060405180910390fd5b61307173ffffffffffffffffffffffffffffffffffffffff8416838361407f565b505050565b60025473ffffffffffffffffffffffffffffffffffffffff1681565b60015474010000000000000000000000000000000000000000900460ff161561311c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8716600090815260036020526040902054879060ff161561319d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806153476025913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8716600090815260036020526040902054879060ff161561321e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806153476025913960400191505060405180910390fd5b61322d8989898989898961410c565b505050505050505050565b60085474010000000000000000000000000000000000000000900460ff168015613265575060125460ff16155b61326e57600080fd5b61327a60048383614dce565b506132ef82828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600181527f3200000000000000000000000000000000000000000000000000000000000000602082015291506142b59050565b600f555050601280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b7f158b0a9edf7a828aad02f63cd515c68ef2f50ba807396f6d12842833a159742981565b73ffffffffffffffffffffffffffffffffffffffff9182166000908152600a6020908152604080832093909416825291909152205490565b60015474010000000000000000000000000000000000000000900460ff161561340757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8916600090815260036020526040902054899060ff1615613488576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806153476025913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8916600090815260036020526040902054899060ff1615613509576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806153476025913960400191505060405180910390fd5b61351a8b8b8b8b8b8b8b8b8b614327565b5050505050505050505050565b6007805460408051602060026001851615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f81018490048402820184019092528181529291830182828015610e6a5780601f10610e3f57610100808354040283529160200191610e6a565b73ffffffffffffffffffffffffffffffffffffffff919091166000908152601060209081526040808320938352929052205460ff1690565b60015474010000000000000000000000000000000000000000900460ff161561366257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8916600090815260036020526040902054899060ff16156136e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806153476025913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8916600090815260036020526040902054899060ff1615613764576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806153476025913960400191505060405180910390fd5b61351a8b8b8b8b8b8b8b8b8b614469565b60005473ffffffffffffffffffffffffffffffffffffffff1633146137fb57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8116613867576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180614f586026913960400191505060405180910390fd5b6000546040805173ffffffffffffffffffffffffffffffffffffffff9283168152918316602083015280517f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09281900390910190a16138c581613d95565b50565b60025473ffffffffffffffffffffffffffffffffffffffff163314613938576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c81526020018061506b602c913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff811660008181526003602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055517fffa4e6181777692565cf28528fc88fd1516ea86b56da075235fa575af6a4b8559190a250565b73ffffffffffffffffffffffffffffffffffffffff1660009081526003602052604090205460ff1690565b73ffffffffffffffffffffffffffffffffffffffff8316613a46576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806151fb6024913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8216613ab2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180614f7e6022913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8084166000818152600a6020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b73ffffffffffffffffffffffffffffffffffffffff8316613b8d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806151d66025913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8216613bf9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180614e706023913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8316600090815260096020526040902054811115613c77576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602681526020018061501c6026913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8316600090815260096020526040902054613ca79082613d4c565b73ffffffffffffffffffffffffffffffffffffffff8085166000908152600960205260408082209390935590841681522054613ce39082613e26565b73ffffffffffffffffffffffffffffffffffffffff80841660008181526009602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b6000613d8e83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250614576565b9392505050565b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b73ffffffffffffffffffffffffffffffffffffffff8084166000908152600a60209081526040808320938616835292905220546130719084908490613e219085613e26565b6139da565b600082820183811015613d8e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b613ea48585614627565b604080517f158b0a9edf7a828aad02f63cd515c68ef2f50ba807396f6d12842833a1597429602082015273ffffffffffffffffffffffffffffffffffffffff87168183018190526060828101889052835180840390910181526080909201909252600f54909190613f1890868686866146b5565b73ffffffffffffffffffffffffffffffffffffffff1614613f9a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f46696174546f6b656e56323a20696e76616c6964207369676e61747572650000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8616600081815260106020908152604080832089845290915280822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055518792917f1cdd46ff242716cdaa72d159d339a485b3438398348d68f09d7c8c0a59353d8191a3505050505050565b6130718383613e21846040518060600160405280602581526020016153916025913973ffffffffffffffffffffffffffffffffffffffff808a166000908152600a60209081526040808320938c16835292905220549190614576565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052613071908490614727565b4284101561417b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f46696174546f6b656e56323a207065726d697420697320657870697265640000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff80881660008181526011602090815260409182902080546001810190915582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c992810192909252818301849052938a1660608201526080810189905260a081019390935260c08084018890528151808503909101815260e09093019052600f5461421e90868686866146b5565b73ffffffffffffffffffffffffffffffffffffffff16146142a057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f454950323631323a20696e76616c6964207369676e6174757265000000000000604482015290519081900360640190fd5b6142ab8888886139da565b5050505050505050565b8151602092830120815191830191909120604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818601528082019390935260608301919091524660808301523060a0808401919091528151808403909101815260c09092019052805191012090565b614333898588886147ff565b604080517f7c7c6cdb67a18743f49ec6fa9b35f50d52ed05cbed4cc592e13b44501c1a2267602082015273ffffffffffffffffffffffffffffffffffffffff808c16828401819052908b166060830152608082018a905260a0820189905260c0820188905260e080830188905283518084039091018152610100909201909252600f549091906143c690868686866146b5565b73ffffffffffffffffffffffffffffffffffffffff161461444857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f46696174546f6b656e56323a20696e76616c6964207369676e61747572650000604482015290519081900360640190fd5b6144528a866148bf565b61445d8a8a8a613b21565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff881633146144d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806151876025913960400191505060405180910390fd5b6144e3898588886147ff565b604080517fd099cc98ef71107a616c4f0f941f04c322d8e254fe26b3c6668db87aae413de8602082015273ffffffffffffffffffffffffffffffffffffffff808c16828401819052908b166060830152608082018a905260a0820189905260c0820188905260e080830188905283518084039091018152610100909201909252600f549091906143c690868686866146b5565b6000818484111561461f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156145e45781810151838201526020016145cc565b50505050905090810190601f1680156146115780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260106020908152604080832084845290915290205460ff16156146b1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e8152602001806152e7602e913960400191505060405180910390fd5b5050565b8051602080830191909120604080517f19010000000000000000000000000000000000000000000000000000000000008185015260228101899052604280820193909352815180820390930183526062019052805191012060009061471c81878787614944565b979650505050505050565b6060614789826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16614b419092919063ffffffff16565b805190915015613071578080602001905160208110156147a857600080fd5b5051613071576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180615295602a913960400191505060405180910390fd5b814211614857576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b815260200180614ebb602b913960400191505060405180910390fd5b8042106148af576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602581526020018061536c6025913960400191505060405180910390fd5b6148b98484614627565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8216600081815260106020908152604080832085845290915280822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055518392917f98de503528ee59b575ef0c0a2576a82497bfc029a5685b209e9ec333479b10a591a35050565b60007f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08211156149bf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602681526020018061526f6026913960400191505060405180910390fd5b8360ff16601b141580156149d757508360ff16601c14155b15614a2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180614f326026913960400191505060405180910390fd5b600060018686868660405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015614a89573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116614b3657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f45435265636f7665723a20696e76616c6964207369676e617475726500000000604482015290519081900360640190fd5b90505b949350505050565b6060614b3984846000856060614b5685614d17565b614bc157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b60208310614c2b57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101614bee565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114614c8d576040519150601f19603f3d011682016040523d82523d6000602084013e614c92565b606091505b50915091508115614ca6579150614b399050565b805115614cb65780518082602001fd5b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482018181528651602484015286518793919283926044019190850190808383600083156145e45781810151838201526020016145cc565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590614b39575050151592915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10614d9157805160ff1916838001178555614dbe565b82800160010185558215614dbe579182015b82811115614dbe578251825591602001919060010190614da3565b50614dca929150614e5a565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10614e2d578280017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00823516178555614dbe565b82800160010185558215614dbe579182015b82811115614dbe578235825591602001919060010190614e3f565b5b80821115614dca5760008155600101614e5b56fe45524332303a207472616e7366657220746f20746865207a65726f20616464726573735061757361626c653a206e65772070617573657220697320746865207a65726f206164647265737346696174546f6b656e56323a20617574686f72697a6174696f6e206973206e6f74207965742076616c696446696174546f6b656e3a206275726e20616d6f756e74206e6f742067726561746572207468616e203046696174546f6b656e3a206d696e7420746f20746865207a65726f206164647265737345435265636f7665723a20696e76616c6964207369676e6174757265202776272076616c75654f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f206164647265737346696174546f6b656e3a206e65772070617573657220697320746865207a65726f2061646472657373526573637561626c653a206e6577207265736375657220697320746865207a65726f206164647265737346696174546f6b656e3a206d696e7420616d6f756e74206e6f742067726561746572207468616e203045524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636546696174546f6b656e3a2063616c6c6572206973206e6f7420746865206d61737465724d696e746572426c61636b6c69737461626c653a2063616c6c6572206973206e6f742074686520626c61636b6c697374657246696174546f6b656e3a206275726e20616d6f756e7420657863656564732062616c616e636546696174546f6b656e3a2063616c6c6572206973206e6f742061206d696e74657246696174546f6b656e3a206e6577206d61737465724d696e74657220697320746865207a65726f2061646472657373526573637561626c653a2063616c6c6572206973206e6f7420746865207265736375657245524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636546696174546f6b656e3a206e657720626c61636b6c697374657220697320746865207a65726f206164647265737346696174546f6b656e56323a2063616c6c6572206d7573742062652074686520706179656546696174546f6b656e3a20636f6e747261637420697320616c726561647920696e697469616c697a656445524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737346696174546f6b656e3a206d696e7420616d6f756e742065786365656473206d696e746572416c6c6f77616e63655061757361626c653a2063616c6c6572206973206e6f74207468652070617573657245435265636f7665723a20696e76616c6964207369676e6174757265202773272076616c75655361666545524332303a204552433230206f7065726174696f6e20646964206e6f74207375636365656446696174546f6b656e3a206e6577206f776e657220697320746865207a65726f206164647265737346696174546f6b656e56323a20617574686f72697a6174696f6e2069732075736564206f722063616e63656c6564426c61636b6c69737461626c653a206e657720626c61636b6c697374657220697320746865207a65726f2061646472657373426c61636b6c69737461626c653a206163636f756e7420697320626c61636b6c697374656446696174546f6b656e56323a20617574686f72697a6174696f6e206973206578706972656445524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212203ccc7055acd0820f4e7d094fa75ff2d3b0c27bdd446079aeef6bd6d02c56938e64736f6c634300060c0033", - "sourceMap": "1362:764:41:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1649:18:33;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6725:273;;;;;;;;;;;;;;;;-1:-1:-1;6725:273:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;6132:100;;;:::i;:::-;;;;;;;;;;;;;;;;2772:148:32;;;;;;;;;;;;;;;;-1:-1:-1;2772:148:32;;;;:::i;:::-;;7776:536:33;;;;;;;;;;;;;;;;-1:-1:-1;7776:536:33;;;;;;;;;;;;;;;;;;:::i;2466:264:30:-;;;;;;;;;;;;;;;;-1:-1:-1;2466:264:30;;;;:::i;1528:398:41:-;;;;;;;;;;;;;;;;-1:-1:-1;1528:398:41;;;;:::i;10209:239:33:-;;;;;;;;;;;;;;;;-1:-1:-1;10209:239:33;;;;:::i;1612:116:37:-;;;:::i;1699:21:33:-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;2413:1160;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2413:1160:33;;;;;;;;-1:-1:-1;2413:1160:33;;-1:-1:-1;;2413:1160:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2413:1160:33;;;;;;;;-1:-1:-1;2413:1160:33;;-1:-1:-1;;2413:1160:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2413:1160:33;;-1:-1:-1;;;2413:1160:33;;;;;-1:-1:-1;;2413:1160:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;1754:27::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1291:31:39;;;:::i;1636:83:30:-;;;:::i;2269:284:40:-;;;;;;;;;;;;;;;;-1:-1:-1;2269:284:40;;;;;;;;;:::i;2802:94:35:-;;;:::i;4097:840:33:-;;;;;;;;;;;;;;;;-1:-1:-1;4097:840:33;;;;;;;;;:::i;10737:538::-;;;;;;;;;;;;;;;;-1:-1:-1;10737:538:33;;:::i;9703:334::-;;;;;;;;;;;;;;;;-1:-1:-1;9703:334:33;;;;;;;;;:::i;2040:84:41:-;;;:::i;2953:254:35:-;;;;;;;;;;;;;;;;-1:-1:-1;2953:254:35;;;;:::i;5782:229:40:-;;;;;;;;;;;;;;;;-1:-1:-1;5782:229:40;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;2106:26:35:-;;;:::i;6340:154:33:-;;;;;;;;;;;;;;;;-1:-1:-1;6340:154:33;;;;:::i;1921:107:37:-;;;;;;;;;;;;;;;;-1:-1:-1;1921:107:37;;;;:::i;2068:136:38:-;;;:::i;2623:89:35:-;;;:::i;5318:118:33:-;;;;;;;;;;;;;;;;-1:-1:-1;5318:118:33;;;;:::i;2355:79:34:-;;;:::i;1673:20:33:-;;;:::i;2079:21:35:-;;;:::i;1787:137:38:-;;;:::i;2766:284:40:-;;;;;;;;;;;;;;;;-1:-1:-1;2766:284:40;;;;;;;;;:::i;8487:260:33:-;;;;;;;;;;;;;;;;-1:-1:-1;8487:260:33;;;;;;;;;:::i;11281:303::-;;;;;;;;;;;;;;;;-1:-1:-1;11281:303:33;;;;:::i;5543:104::-;;;;;;;;;;;;;;;;-1:-1:-1;5543:104:33;;;;:::i;2926:299:32:-;;;;;;;;;;;;;;;;-1:-1:-1;2926:299:32;;;;:::i;2161:177:30:-;;;;;;;;;;;;;;;;-1:-1:-1;2161:177:30;;;;;;;;;;;;;;;;;;:::i;1365:26:32:-;;;:::i;6439:309:40:-;;;;;;;;;;;;;;;;-1:-1:-1;6439:309:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;1758:298::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1758:298:40;;-1:-1:-1;1758:298:40;-1:-1:-1;1758:298:40;:::i;2285:130:38:-;;;:::i;5898:175:33:-;;;;;;;;;;;;;;;;-1:-1:-1;5898:175:33;;;;;;;;;;;:::i;3621:523:40:-;;;;;;;;;;;;;;;;-1:-1:-1;3621:523:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;1726:22:33:-;;;:::i;3088:183:38:-;;;;;;;;;;;;;;;;-1:-1:-1;3088:183:38;;;;;;;;;:::i;4883:521:40:-;;;;;;;;;;;;;;;;-1:-1:-1;4883:521:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;2945:269:34:-;;;;;;;;;;;;;;;;-1:-1:-1;2945:269:34;;;;:::i;2500:143:32:-;;;;;;;;;;;;;;;;-1:-1:-1;2500:143:32;;;;:::i;2277:115::-;;;;;;;;;;;;;;;;-1:-1:-1;2277:115:32;;;;:::i;1649:18:33:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;6725:273::-;2286:6:35;;6914:4:33;;2286:6:35;;;;;2285:7;2277:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6853:10:33::1;2064:21:32;::::0;;;:11:::1;:21;::::0;;;;;::::1;;2063:22;2042:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2064:21:::2;::::0;::::2;;::::0;;;:11:::2;:21;::::0;;;;;6888:7:33;;2064:21:32::2;;2063:22;2042:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6934:36:33::3;6943:10;6955:7;6964:5;6934:8;:36::i;:::-;-1:-1:-1::0;6987:4:33::3;::::0;6725:273;-1:-1:-1;;;;6725:273:33:o;6132:100::-;6213:12;;6132:100;:::o;2772:148:32:-;1771:11;;;;1757:10;:25;1736:116;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2846:21:::1;::::0;::::1;2870:5;2846:21:::0;;;:11:::1;:21;::::0;;;;;:29;;;::::1;::::0;;2890:23;::::1;::::0;2870:5;2890:23:::1;2772:148:::0;:::o;7776:536:33:-;2286:6:35;;8033:4:33;;2286:6:35;;;;;2285:7;2277:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7948:10:33::1;2064:21:32;::::0;;;:11:::1;:21;::::0;;;;;::::1;;2063:22;2042:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2064:21:::2;::::0;::::2;;::::0;;;:11:::2;:21;::::0;;;;;7983:4:33;;2064:21:32::2;;2063:22;2042:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2064:21:::3;::::0;::::3;;::::0;;;:11:::3;:21;::::0;;;;;8012:2:33;;2064:21:32::3;;2063:22;2042:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8083:13:33::4;::::0;::::4;;::::0;;;:7:::4;:13;::::0;;;;;;;8097:10:::4;8083:25:::0;;;;;;;;8074:34;::::4;;8053:121;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8184:26;8194:4;8200:2;8204:5;8184:9;:26::i;:::-;8248:13;::::0;::::4;;::::0;;;:7:::4;:13;::::0;;;;;;;8262:10:::4;8248:25:::0;;;;;;;;:36:::4;::::0;8278:5;8248:29:::4;:36::i;:::-;8220:13;::::0;::::4;;::::0;;;:7:::4;:13;::::0;;;;;;;8234:10:::4;8220:25:::0;;;;;;;:64;8301:4:::4;::::0;-1:-1:-1;2158:1:32::3;::::2;2323::35::1;7776:536:33::0;;;;;:::o;2466:264:30:-;2713:6:34;;;;2699:10;:20;2691:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2559:24:30::1;::::0;::::1;2538:113;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2661:8;:21:::0;;;::::1;;::::0;::::1;::::0;;::::1;::::0;;;2697:26:::1;::::0;::::1;::::0;-1:-1:-1;;2697:26:30::1;2466:264:::0;:::o;1528:398:41:-;1652:19;;;;;:24;1644:33;;;;;;1728:4;1688:20;1711:23;;;:8;:23;;;;;;1748:16;;1744:99;;1780:52;1798:4;1805:12;1819;1780:9;:52::i;:::-;-1:-1:-1;;1872:4:41;1852:26;;;;:11;:26;;;;;:33;;;;;;1881:4;1852:33;;;;1896:19;:23;;;;;1918:1;1896:23;;;1528:398::o;10209:239:33:-;5104:12;;10306:4;;5104:12;;5090:10;:26;5069:114;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10326:15:::1;::::0;::::1;10344:5;10326:15:::0;;;:7:::1;:15;::::0;;;;;;;:23;;;::::1;::::0;;10359:13:::1;:21:::0;;;;;;:25;;;10399:21;::::1;::::0;10344:5;10399:21:::1;-1:-1:-1::0;10437:4:33::1;10209:239:::0;;;:::o;1612:116:37:-;1662:66;1612:116;:::o;1699:21:33:-;;;;;;:::o;2413:1160::-;2717:11;;;;;;;2716:12;2708:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2806:29;;;2785:123;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2939:23;;;2918:111;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3060:28;;;3039:121;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3191:22;;;3170:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3290:16;;;;:4;;:16;;;;;:::i;:::-;-1:-1:-1;3316:20:33;;;;:6;;:20;;;;;:::i;:::-;-1:-1:-1;3346:24:33;;;;:8;;:24;;;;;:::i;:::-;-1:-1:-1;3380:8:33;:24;;;;;;;;;;3414:12;:30;;;;;;;;;;;;;;;;;-1:-1:-1;3454:18:33;;;;;;;;;;3482:11;:28;;;;;;;;;;;;;;3520:18;3529:8;3520;:18::i;:::-;-1:-1:-1;;3548:11:33;:18;;;;;;;;-1:-1:-1;;;;;;2413:1160:33:o;1754:27::-;;;;;;:::o;1291:31:39:-;;;;:::o;1636:83:30:-;1704:8;;;;1636:83;:::o;2269:284:40:-;2286:6:35;;2455:4:40;;2286:6:35;;;;;2285:7;2277:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2394:10:40::1;2064:21:32;::::0;;;:11:::1;:21;::::0;;;;;::::1;;2063:22;2042:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2064:21:::2;::::0;::::2;;::::0;;;:11:::2;:21;::::0;;;;;2429:7:40;;2064:21:32::2;;2063:22;2042:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2475:50:40::3;2494:10;2506:7;2515:9;2475:18;:50::i;2802:94:35:-:0;2473:6;;;;2459:10;:20;2451:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2851:6:::1;:14:::0;;;::::1;::::0;;2880:9:::1;::::0;::::1;::::0;2860:5:::1;::::0;2880:9:::1;2802:94::o:0;4097:840:33:-;2286:6:35;;4280:4:33;;2286:6:35;;;;;2285:7;2277:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3708:10:33::1;3700:19;::::0;;;:7:::1;:19;::::0;;;;;::::1;;3692:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4223:10:::2;2064:21:32;::::0;;;:11:::2;:21;::::0;;;;;::::2;;2063:22;2042:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2064:21:::3;::::0;::::3;;::::0;;;:11:::3;:21;::::0;;;;;4258:3:33;;2064:21:32::3;;2063:22;2042:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4308:17:33::4;::::0;::::4;4300:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4393:1;4383:7;:11;4375:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4496:10;4451:28;4482:25:::0;;;:13:::4;:25;::::0;;;;;4538:31;;::::4;;4517:124;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4667:12;::::0;:25:::4;::::0;4684:7;4667:16:::4;:25::i;:::-;4652:12;:40:::0;4718:13:::4;::::0;::::4;;::::0;;;:8:::4;:13;::::0;;;;;:26:::4;::::0;4736:7;4718:17:::4;:26::i;:::-;4702:13;::::0;::::4;;::::0;;;:8:::4;:13;::::0;;;;:42;4782:33:::4;:20:::0;4807:7;4782:24:::4;:33::i;:::-;4768:10;4754:25;::::0;;;:13:::4;:25;::::0;;;;;;;;:61;;;;4830:30;;;;;;;4754:25:::4;4830:30:::0;::::4;::::0;::::4;::::0;;;;;;::::4;4875:34;::::0;;;;;;;::::4;::::0;::::4;::::0;4892:1:::4;::::0;4875:34:::4;::::0;;;;::::4;::::0;;::::4;-1:-1:-1::0;4926:4:33::4;::::0;4097:840;-1:-1:-1;;;;;4097:840:33:o;10737:538::-;2286:6:35;;;;;;;2285:7;2277:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3708:10:33::1;3700:19;::::0;;;:7:::1;:19;::::0;;;;;::::1;;3692:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10850:10:::2;2064:21:32;::::0;;;:11:::2;:21;::::0;;;;;::::2;;2063:22;2042:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10903:10:33::3;10876:15;10894:20:::0;;;:8:::3;:20;::::0;;;;;10932:11;10924:65:::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11018:7;11007;:18;;10999:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11094:12;::::0;:25:::3;::::0;11111:7;11094:16:::3;:25::i;:::-;11079:12;:40:::0;11152:20:::3;:7:::0;11164;11152:11:::3;:20::i;:::-;11138:10;11129:20;::::0;;;:8:::3;:20;::::0;;;;;;;;:43;;;;11187:25;;;;;;;11138:10;;11187:25:::3;::::0;;;;;;;::::3;11227:41;::::0;;;;;;;11256:1:::3;::::0;11236:10:::3;::::0;11227:41:::3;::::0;;;;::::3;::::0;;::::3;2158:1:32;3767::33::2;10737:538:::0;:::o;9703:334::-;2286:6:35;;9854:4:33;;2286:6:35;;;;;2285:7;2277:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5104:12:33::1;::::0;::::1;;5090:10;:26;5069:114;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9874:15:::2;::::0;::::2;;::::0;;;:7:::2;:15;::::0;;;;;;;:22;;;::::2;9892:4;9874:22;::::0;;9906:13:::2;:21:::0;;;;;;:43;;;9964:45;;;;;;;::::2;::::0;;;;;;;;::::2;-1:-1:-1::0;10026:4:33::2;9703:334:::0;;;;:::o;2040:84:41:-;2107:10;;;;;;;;;;;;;;;;;2040:84;:::o;2953:254:35:-;2713:6:34;;;;2699:10;:20;2691:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3045:24:35::1;::::0;::::1;3024:111;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3145:6;:19:::0;;;::::1;;::::0;;::::1;::::0;;;::::1;::::0;;;;3179:21:::1;::::0;3193:6;::::1;::::0;3179:21:::1;::::0;-1:-1:-1;;3179:21:35::1;2953:254:::0;:::o;5782:229:40:-;2286:6:35;;;;;;;2285:7;2277:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5956:48:40::1;5977:10;5989:5;5996:1;5999;6002;5956:20;:48::i;:::-;5782:229:::0;;;;;:::o;2106:26:35:-;;;;;;;;;:::o;6340:154:33:-;6470:17;;6440:7;6470:17;;;:8;:17;;;;;;;6340:154::o;1921:107:37:-;2001:20;;1975:7;2001:20;;;:13;:20;;;;;;;1921:107::o;2068:136:38:-;2138:66;2068:136;:::o;2623:89:35:-;2473:6;;;;2459:10;:20;2451:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2679:4:::1;2670:13:::0;;;::::1;::::0;::::1;::::0;;2698:7:::1;::::0;::::1;::::0;2670:13;;2698:7:::1;2623:89::o:0;5318:118:33:-;5408:21;;5382:7;5408:21;;;:13;:21;;;;;;;5318:118::o;2355:79:34:-;2395:7;2421:6;;;2355:79;:::o;1673:20:33:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2079:21:35;;;;;;:::o;1787:137:38:-;1858:66;1787:137;:::o;2766:284:40:-;2286:6:35;;2952:4:40;;2286:6:35;;;;;2285:7;2277:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2891:10:40::1;2064:21:32;::::0;;;:11:::1;:21;::::0;;;;;::::1;;2063:22;2042:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2064:21:::2;::::0;::::2;;::::0;;;:11:::2;:21;::::0;;;;;2926:7:40;;2064:21:32::2;;2063:22;2042:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2972:50:40::3;2991:10;3003:7;3012:9;2972:18;:50::i;8487:260:33:-:0;2286:6:35;;8667:4:33;;2286:6:35;;;;;2285:7;2277:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8611:10:33::1;2064:21:32;::::0;;;:11:::1;:21;::::0;;;;;::::1;;2063:22;2042:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2064:21:::2;::::0;::::2;;::::0;;;:11:::2;:21;::::0;;;;;8646:2:33;;2064:21:32::2;;2063:22;2042:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8687:32:33::3;8697:10;8709:2;8713:5;8687:9;:32::i;11281:303::-:0;2713:6:34;;;;2699:10;:20;2691:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11385:30:33::1;::::0;::::1;11364:124;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11498:12;:31:::0;;;::::1;;::::0;;::::1;::::0;;;::::1;::::0;;;;11544:33:::1;::::0;11564:12;::::1;::::0;11544:33:::1;::::0;-1:-1:-1;;11544:33:33::1;11281:303:::0;:::o;5543:104::-;5624:16;;5601:4;5624:16;;;:7;:16;;;;;;;;;5543:104::o;2926:299:32:-;2713:6:34;;;;2699:10;:20;2691:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3028:29:32::1;::::0;::::1;3007:126;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3143:11;:29:::0;;;::::1;;::::0;;::::1;::::0;;;::::1;::::0;;;;3187:31:::1;::::0;3206:11;::::1;::::0;3187:31:::1;::::0;-1:-1:-1;;3187:31:32::1;2926:299:::0;:::o;2161:177:30:-;1867:8;;;;1853:10;:22;1845:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2293:38:::1;:26;::::0;::::1;2320:2:::0;2324:6;2293:26:::1;:38::i;:::-;2161:177:::0;;;:::o;1365:26:32:-;;;;;;:::o;6439:309:40:-;2286:6:35;;;;;;;2285:7;2277:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2064:21:32::1;::::0;::::1;;::::0;;;:11:::1;:21;::::0;;;;;6651:5:40;;2064:21:32::1;;2063:22;2042:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2064:21:::2;::::0;::::2;;::::0;;;:11:::2;:21;::::0;;;;;6673:7:40;;2064:21:32::2;;2063:22;2042:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6692:49:40::3;6700:5;6707:7;6716:5;6723:8;6733:1;6736;6739;6692:7;:49::i;:::-;2158:1:32::2;2323::35::1;6439:309:40::0;;;;;;;:::o;1758:298::-;1883:11;;;;;;;:39;;;;-1:-1:-1;1898:19:40;;;;:24;1883:39;1875:48;;;;;;1933:14;:4;1940:7;;1933:14;:::i;:::-;;1976:40;2003:7;;1976:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1976:40:40;;;;;;;;;;;;;;;;;;-1:-1:-1;1976:26:40;;-1:-1:-1;1976:40:40:i;:::-;1957:16;:59;-1:-1:-1;;2026:19:40;:23;;;;2048:1;2026:23;;;1758:298::o;2285:130:38:-;2349:66;2285:130;:::o;5898:175:33:-;6043:14;;;;6013:7;6043:14;;;:7;:14;;;;;;;;:23;;;;;;;;;;;;;5898:175::o;3621:523:40:-;2286:6:35;;;;;;;2285:7;2277:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2064:21:32::1;::::0;::::1;;::::0;;;:11:::1;:21;::::0;;;;;3900:4:40;;2064:21:32::1;;2063:22;2042:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2064:21:::2;::::0;::::2;;::::0;;;:11:::2;:21;::::0;;;;;3921:2:40;;2064:21:32::2;;2063:22;2042:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3935:202:40::3;3975:4;3993:2;4009:5;4028:10;4052:11;4077:5;4096:1;4111;4126;3935:26;:202::i;:::-;2158:1:32::2;2323::35::1;3621:523:40::0;;;;;;;;;:::o;1726:22:33:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3088:183:38;3225:32;;;;;3198:4;3225:32;;;:20;:32;;;;;;;;:39;;;;;;;;;;;3088:183::o;4883:521:40:-;2286:6:35;;;;;;;2285:7;2277:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2064:21:32::1;::::0;::::1;;::::0;;;:11:::1;:21;::::0;;;;;5161:4:40;;2064:21:32::1;;2063:22;2042:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2064:21:::2;::::0;::::2;;::::0;;;:11:::2;:21;::::0;;;;;5182:2:40;;2064:21:32::2;;2063:22;2042:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5196:201:40::3;5235:4;5253:2;5269:5;5288:10;5312:11;5337:5;5356:1;5371;5386;5196:25;:201::i;2945:269:34:-:0;2713:6;;;;2699:10;:20;2691:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3040:22:::1;::::0;::::1;3019:107;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3162:6;::::0;3141:38:::1;::::0;;3162:6:::1;::::0;;::::1;3141:38:::0;;;;::::1;;::::0;::::1;::::0;;;::::1;::::0;;;;;;;;::::1;3189:18;3198:8;3189;:18::i;:::-;2945:269:::0;:::o;2500:143:32:-;1771:11;;;;1757:10;:25;1736:116;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2572:21:::1;::::0;::::1;;::::0;;;:11:::1;:21;::::0;;;;;:28;;;::::1;2596:4;2572:28;::::0;;2615:21;::::1;::::0;2572;2615::::1;2500:143:::0;:::o;2277:115::-;2364:21;;2341:4;2364:21;;;:11;:21;;;;;;;;;2277:115::o;7196:363:33:-;7327:19;;;7319:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7405:21;;;7397:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7475:14;;;;;;;;:7;:14;;;;;;;;:23;;;;;;;;;;;;;:31;;;7521;;;;;;;;;;;;;;;;;7196:363;;;:::o;8931:526::-;9057:18;;;9049:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9135:16;;;9127:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9231:14;;;;;;;:8;:14;;;;;;9222:23;;;9201:108;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9337:14;;;;;;;:8;:14;;;;;;:25;;9356:5;9337:18;:25::i;:::-;9320:14;;;;;;;;:8;:14;;;;;;:42;;;;9387:12;;;;;;;:23;;9404:5;9387:16;:23::i;:::-;9372:12;;;;;;;;:8;:12;;;;;;;;;:38;;;;9425:25;;;;;;;9372:12;;9425:25;;;;;;;;;;;;;8931:526;;;:::o;1321:134:42:-;1379:7;1405:43;1409:1;1412;1405:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;1398:50;1321:134;-1:-1:-1;;;1321:134:42:o;2493:79:34:-;2548:6;:17;;;;;;;;;;;;;;;2493:79::o;6981:208:40:-;7143:14;;;;;;;;:7;:14;;;;;;;;:23;;;;;;;;;;7118:64;;7127:5;;7134:7;;7143:38;;7171:9;7143:27;:38::i;:::-;7118:8;:64::i;874:176:42:-;932:7;963:5;;;986:6;;;;978:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6532:611:38;6693:46;6721:10;6733:5;6693:27;:46::i;:::-;6770:106;;;2349:66;6770:106;;;;;;;;;;;;;6750:17;6770:106;;;;;;;;;;;;;;;;;;;;;;;6922:16;;6770:106;;;6907:47;;6940:1;6943;6946;6770:106;6907:14;:47::i;:::-;:61;;;6886:138;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7035:32;;;;;;;:20;:32;;;;;;;;:39;;;;;;;;;:46;;;;7077:4;7035:46;;;7096:40;7068:5;;7035:32;7096:40;;;6532:611;;;;;;:::o;7422:341:40:-;7559:197;7581:5;7600:7;7621:125;7666:9;7621:125;;;;;;;;;;;;;;;;;:14;;;;;;;;:7;:14;;;;;;;;:23;;;;;;;;;;;:125;:27;:125::i;696:175:44:-;805:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;828:23;805:58;;;778:86;;798:5;;778:19;:86::i;2459:637:37:-;2673:3;2661:8;:15;;2653:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2854:20;;;;2766:15;2854:20;;;:13;:20;;;;;;;;;:22;;;;;;;;2742:166;;1662:66;2742:166;;;;;;;;;;;;;;;;2722:17;2742:166;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2954:16;;2939:47;;2972:1;2975;2978;2742:166;2939:14;:47::i;:::-;:56;;;2918:129;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3058:31;3067:5;3074:7;3083:5;3058:8;:31::i;:::-;2459:637;;;;;;;;:::o;1501:686:28:-;2015:22;;;;;;;2059:25;;;;;;;;;1776:390;;;1927:66;1776:390;;;;;;;;;;;;;;;;;;1702:9;1776:390;;;;2143:4;1776:390;;;;;;;;;;;;;;;;;;;;;;;;1749:431;;;;;;1501:686::o;3842:780:38:-;4103:64;4130:4;4136:5;4143:10;4155:11;4103:26;:64::i;:::-;4198:191;;;1858:66;4198:191;;;;;;;;;;;;;;;;;4178:17;4198:191;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4435:16;;4198:191;;;4420:47;;4453:1;4456;4459;4198:191;4420:14;:47::i;:::-;:55;;;4399:132;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4542:37;4567:4;4573:5;4542:24;:37::i;:::-;4589:26;4599:4;4605:2;4609:5;4589:9;:26::i;:::-;3842:780;;;;;;;;;;:::o;5361:854::-;5629:16;;;5635:10;5629:16;5621:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5697:64;5724:4;5730:5;5737:10;5749:11;5697:26;:64::i;:::-;5792:190;;;2138:66;5792:190;;;;;;;;;;;;;;;;;5772:17;5792:190;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6028:16;;5792:190;;;6013:47;;6046:1;6049;6052;5792:190;6013:14;:47::i;1746:187:42:-;1832:7;1867:12;1859:6;;;;1851:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1902:5:42;;;1746:187::o;7322:255:38:-;7459:32;;;;;;;:20;:32;;;;;;;;:39;;;;;;;;;;;7458:40;7437:133;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7322:255;;:::o;2572:434:28:-;2898:26;;;;;;;;;;2803:135;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2780:168;;;;;2744:7;;2965:34;2780:168;2991:1;2994;2997;2965:17;:34::i;:::-;2958:41;2572:434;-1:-1:-1;;;;;;;2572:434:28:o;2959:751:44:-;3378:23;3404:69;3432:4;3404:69;;;;;;;;;;;;;;;;;3412:5;3404:27;;;;:69;;;;;:::i;:::-;3487:17;;3378:95;;-1:-1:-1;3487:21:44;3483:221;;3627:10;3616:30;;;;;;;;;;;;;;;-1:-1:-1;3616:30:44;3608:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7903:419:38;8103:10;8097:3;:16;8076:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8206:11;8200:3;:17;8192:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8269:46;8297:10;8309:5;8269:27;:46::i;:::-;7903:419;;;;:::o;8493:203::-;8592:32;;;;;;;:20;:32;;;;;;;;:39;;;;;;;;;:46;;;;8634:4;8592:46;;;8653:36;8625:5;;8592:32;8653:36;;;8493:203;;:::o;1872:1556:27:-;1997:7;2932:66;2907:91;;2890:192;;;3023:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2890:192;3096:1;:7;;3101:2;3096:7;;:18;;;;;3107:1;:7;;3112:2;3107:7;;3096:18;3092:97;;;3130:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3092:97;3283:14;3300:26;3310:6;3318:1;3321;3324;3300:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;3300:26:27;;;;;;-1:-1:-1;;3344:20:27;;;3336:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3415:6;-1:-1:-1;1872:1556:27;;;;;;;:::o;3770:194:45:-;3873:12;3904:53;3927:6;3935:4;3941:1;3944:12;5247;5279:18;5290:6;5279:10;:18::i;:::-;5271:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5402:12;5416:23;5443:6;:11;;5463:8;5474:4;5443:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5401:78;;;;5493:7;5489:580;;;5523:10;-1:-1:-1;5516:17:45;;-1:-1:-1;5516:17:45;5489:580;5634:17;;:21;5630:429;;5892:10;5886:17;5952:15;5939:10;5935:2;5931:19;5924:44;5841:145;6024:20;;;;;;;;;;;;;;;;;;;;6031:12;;6024:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;718:610;778:4;1239:20;;1084:66;1278:23;;;;;;:42;;-1:-1:-1;;1305:15:45;;;1270:51;-1:-1:-1;;718:610:45:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;", - "linkReferences": {} - }, - "methodIdentifiers": { - "CANCEL_AUTHORIZATION_TYPEHASH()": "d9169487", - "DOMAIN_SEPARATOR()": "3644e515", - "PERMIT_TYPEHASH()": "30adf81f", - "RECEIVE_WITH_AUTHORIZATION_TYPEHASH()": "7f2eecc3", - "TRANSFER_WITH_AUTHORIZATION_TYPEHASH()": "a0cc6a68", - "allowance(address,address)": "dd62ed3e", - "approve(address,uint256)": "095ea7b3", - "authorizationState(address,bytes32)": "e94a0102", - "balanceOf(address)": "70a08231", - "blacklist(address)": "f9f92be4", - "blacklister()": "bd102430", - "burn(uint256)": "42966c68", - "cancelAuthorization(address,bytes32,uint8,bytes32,bytes32)": "5a049a70", - "configureMinter(address,uint256)": "4e44d956", - "currency()": "e5a6b10f", - "decimals()": "313ce567", - "decreaseAllowance(address,uint256)": "a457c2d7", - "increaseAllowance(address,uint256)": "39509351", - "initialize(string,string,string,uint8,address,address,address,address)": "3357162b", - "initializeV2(string)": "d608ea64", - "initializeV2_1(address)": "2fc81e09", - "isBlacklisted(address)": "fe575a87", - "isMinter(address)": "aa271e1a", - "masterMinter()": "35d99f35", - "mint(address,uint256)": "40c10f19", - "minterAllowance(address)": "8a6db9c3", - "name()": "06fdde03", - "nonces(address)": "7ecebe00", - "owner()": "8da5cb5b", - "pause()": "8456cb59", - "paused()": "5c975abb", - "pauser()": "9fd0506d", - "permit(address,address,uint256,uint256,uint8,bytes32,bytes32)": "d505accf", - "receiveWithAuthorization(address,address,uint256,uint256,uint256,bytes32,uint8,bytes32,bytes32)": "ef55bec6", - "removeMinter(address)": "3092afd5", - "rescueERC20(address,address,uint256)": "b2118a8d", - "rescuer()": "38a63183", - "symbol()": "95d89b41", - "totalSupply()": "18160ddd", - "transfer(address,uint256)": "a9059cbb", - "transferFrom(address,address,uint256)": "23b872dd", - "transferOwnership(address)": "f2fde38b", - "transferWithAuthorization(address,address,uint256,uint256,uint256,bytes32,uint8,bytes32,bytes32)": "e3ee160e", - "unBlacklist(address)": "1a895266", - "unpause()": "3f4ba83a", - "updateBlacklister(address)": "ad38bf22", - "updateMasterMinter(address)": "aa20e1e4", - "updatePauser(address)": "554bab3c", - "updateRescuer(address)": "2ab60045", - "version()": "54fd4d50" - }, - "rawMetadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"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\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"authorizer\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"nonce\",\"type\":\"bytes32\"}],\"name\":\"AuthorizationCanceled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"authorizer\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"nonce\",\"type\":\"bytes32\"}],\"name\":\"AuthorizationUsed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"}],\"name\":\"Blacklisted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newBlacklister\",\"type\":\"address\"}],\"name\":\"BlacklisterChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"burner\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Burn\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newMasterMinter\",\"type\":\"address\"}],\"name\":\"MasterMinterChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"minter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Mint\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"minter\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"minterAllowedAmount\",\"type\":\"uint256\"}],\"name\":\"MinterConfigured\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldMinter\",\"type\":\"address\"}],\"name\":\"MinterRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"Pause\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newAddress\",\"type\":\"address\"}],\"name\":\"PauserChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newRescuer\",\"type\":\"address\"}],\"name\":\"RescuerChanged\",\"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\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"}],\"name\":\"UnBlacklisted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"Unpause\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"CANCEL_AUTHORIZATION_TYPEHASH\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"DOMAIN_SEPARATOR\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"PERMIT_TYPEHASH\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"RECEIVE_WITH_AUTHORIZATION_TYPEHASH\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"TRANSFER_WITH_AUTHORIZATION_TYPEHASH\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"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\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"authorizer\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"nonce\",\"type\":\"bytes32\"}],\"name\":\"authorizationState\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"}],\"name\":\"blacklist\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"blacklister\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"authorizer\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"nonce\",\"type\":\"bytes32\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"cancelAuthorization\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"minter\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"minterAllowedAmount\",\"type\":\"uint256\"}],\"name\":\"configureMinter\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"currency\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"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\":\"decrement\",\"type\":\"uint256\"}],\"name\":\"decreaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"increment\",\"type\":\"uint256\"}],\"name\":\"increaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"tokenName\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"tokenSymbol\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"tokenCurrency\",\"type\":\"string\"},{\"internalType\":\"uint8\",\"name\":\"tokenDecimals\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"newMasterMinter\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"newPauser\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"newBlacklister\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"newName\",\"type\":\"string\"}],\"name\":\"initializeV2\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"lostAndFound\",\"type\":\"address\"}],\"name\":\"initializeV2_1\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"}],\"name\":\"isBlacklisted\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"isMinter\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"masterMinter\",\"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\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"minter\",\"type\":\"address\"}],\"name\":\"minterAllowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"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\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pauser\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"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\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"validAfter\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"validBefore\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"nonce\",\"type\":\"bytes32\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"receiveWithAuthorization\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"minter\",\"type\":\"address\"}],\"name\":\"removeMinter\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"tokenContract\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"rescueERC20\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rescuer\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"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\":\"value\",\"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\":\"value\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"validAfter\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"validBefore\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"nonce\",\"type\":\"bytes32\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"transferWithAuthorization\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"}],\"name\":\"unBlacklist\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unpause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_newBlacklister\",\"type\":\"address\"}],\"name\":\"updateBlacklister\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_newMasterMinter\",\"type\":\"address\"}],\"name\":\"updateMasterMinter\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_newPauser\",\"type\":\"address\"}],\"name\":\"updatePauser\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newRescuer\",\"type\":\"address\"}],\"name\":\"updateRescuer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"version\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"allowance(address,address)\":{\"params\":{\"owner\":\"Token owner's address\",\"spender\":\"Spender's address\"},\"returns\":{\"_0\":\"Allowance amount\"}},\"approve(address,uint256)\":{\"params\":{\"spender\":\"Spender's address\",\"value\":\"Allowance amount\"},\"returns\":{\"_0\":\"True if successful\"}},\"authorizationState(address,bytes32)\":{\"details\":\"Nonces are randomly generated 32-byte data unique to the authorizer's address\",\"params\":{\"authorizer\":\"Authorizer's address\",\"nonce\":\"Nonce of the authorization\"},\"returns\":{\"_0\":\"True if the nonce is used\"}},\"balanceOf(address)\":{\"details\":\"Get token balance of an account\",\"params\":{\"account\":\"address The account\"}},\"blacklist(address)\":{\"details\":\"Adds account to blacklist\",\"params\":{\"_account\":\"The address to blacklist\"}},\"burn(uint256)\":{\"details\":\"allows a minter to burn some of its own tokens Validates that caller is a minter and that sender is not blacklisted amount is less than or equal to the minter's account balance\",\"params\":{\"_amount\":\"uint256 the amount of tokens to be burned\"}},\"cancelAuthorization(address,bytes32,uint8,bytes32,bytes32)\":{\"details\":\"Works only if the authorization is not yet used.\",\"params\":{\"authorizer\":\"Authorizer's address\",\"nonce\":\"Nonce of the authorization\",\"r\":\"r of the signature\",\"s\":\"s of the signature\",\"v\":\"v of the signature\"}},\"configureMinter(address,uint256)\":{\"details\":\"Function to add/update a new minter\",\"params\":{\"minter\":\"The address of the minter\",\"minterAllowedAmount\":\"The minting amount allowed for the minter\"},\"returns\":{\"_0\":\"True if the operation was successful.\"}},\"decreaseAllowance(address,uint256)\":{\"params\":{\"decrement\":\"Amount of decrease in allowance\",\"spender\":\"Spender's address\"},\"returns\":{\"_0\":\"True if successful\"}},\"increaseAllowance(address,uint256)\":{\"params\":{\"increment\":\"Amount of increase in allowance\",\"spender\":\"Spender's address\"},\"returns\":{\"_0\":\"True if successful\"}},\"initializeV2(string)\":{\"params\":{\"newName\":\"New token name\"}},\"initializeV2_1(address)\":{\"params\":{\"lostAndFound\":\"The address to which the locked funds are sent\"}},\"isBlacklisted(address)\":{\"details\":\"Checks if account is blacklisted\",\"params\":{\"_account\":\"The address to check\"}},\"isMinter(address)\":{\"details\":\"Checks if account is a minter\",\"params\":{\"account\":\"The address to check\"}},\"mint(address,uint256)\":{\"details\":\"Function to mint tokens\",\"params\":{\"_amount\":\"The amount of tokens to mint. Must be less than or equal to the minterAllowance of the caller.\",\"_to\":\"The address that will receive the minted tokens.\"},\"returns\":{\"_0\":\"A boolean that indicates if the operation was successful.\"}},\"minterAllowance(address)\":{\"details\":\"Get minter allowance for an account\",\"params\":{\"minter\":\"The address of the minter\"}},\"nonces(address)\":{\"params\":{\"owner\":\"Token owner's address (Authorizer)\"},\"returns\":{\"_0\":\"Next nonce\"}},\"owner()\":{\"details\":\"Tells the address of the owner\",\"returns\":{\"_0\":\"the address of the owner\"}},\"pause()\":{\"details\":\"called by the owner to pause, triggers stopped state\"},\"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)\":{\"params\":{\"deadline\":\"Expiration time, seconds since the epoch\",\"owner\":\"Token owner's address (Authorizer)\",\"r\":\"r of the signature\",\"s\":\"s of the signature\",\"spender\":\"Spender's address\",\"v\":\"v of the signature\",\"value\":\"Amount of allowance\"}},\"receiveWithAuthorization(address,address,uint256,uint256,uint256,bytes32,uint8,bytes32,bytes32)\":{\"details\":\"This has an additional check to ensure that the payee's address matches the caller of this function to prevent front-running attacks.\",\"params\":{\"from\":\"Payer's address (Authorizer)\",\"nonce\":\"Unique nonce\",\"r\":\"r of the signature\",\"s\":\"s of the signature\",\"to\":\"Payee's address\",\"v\":\"v of the signature\",\"validAfter\":\"The time after which this is valid (unix time)\",\"validBefore\":\"The time before which this is valid (unix time)\",\"value\":\"Amount to be transferred\"}},\"removeMinter(address)\":{\"details\":\"Function to remove a minter\",\"params\":{\"minter\":\"The address of the minter to remove\"},\"returns\":{\"_0\":\"True if the operation was successful.\"}},\"rescueERC20(address,address,uint256)\":{\"params\":{\"amount\":\"Amount to withdraw\",\"to\":\"Recipient address\",\"tokenContract\":\"ERC20 token contract address\"}},\"rescuer()\":{\"returns\":{\"_0\":\"Rescuer's address\"}},\"totalSupply()\":{\"details\":\"Get totalSupply of token\"},\"transfer(address,uint256)\":{\"params\":{\"to\":\"Payee's address\",\"value\":\"Transfer amount\"},\"returns\":{\"_0\":\"True if successful\"}},\"transferFrom(address,address,uint256)\":{\"params\":{\"from\":\"Payer's address\",\"to\":\"Payee's address\",\"value\":\"Transfer amount\"},\"returns\":{\"_0\":\"True if successful\"}},\"transferOwnership(address)\":{\"details\":\"Allows the current owner to transfer control of the contract to a newOwner.\",\"params\":{\"newOwner\":\"The address to transfer ownership to.\"}},\"transferWithAuthorization(address,address,uint256,uint256,uint256,bytes32,uint8,bytes32,bytes32)\":{\"params\":{\"from\":\"Payer's address (Authorizer)\",\"nonce\":\"Unique nonce\",\"r\":\"r of the signature\",\"s\":\"s of the signature\",\"to\":\"Payee's address\",\"v\":\"v of the signature\",\"validAfter\":\"The time after which this is valid (unix time)\",\"validBefore\":\"The time before which this is valid (unix time)\",\"value\":\"Amount to be transferred\"}},\"unBlacklist(address)\":{\"details\":\"Removes account from blacklist\",\"params\":{\"_account\":\"The address to remove from the blacklist\"}},\"unpause()\":{\"details\":\"called by the owner to unpause, returns to normal state\"},\"updatePauser(address)\":{\"details\":\"update the pauser role\"},\"updateRescuer(address)\":{\"params\":{\"newRescuer\":\"New rescuer's address\"}},\"version()\":{\"returns\":{\"_0\":\"Version string\"}}},\"title\":\"FiatToken V2.1\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"allowance(address,address)\":{\"notice\":\"Amount of remaining tokens spender is allowed to transfer on behalf of the token owner\"},\"approve(address,uint256)\":{\"notice\":\"Set spender's allowance over the caller's tokens to be a given value.\"},\"authorizationState(address,bytes32)\":{\"notice\":\"Returns the state of an authorization\"},\"cancelAuthorization(address,bytes32,uint8,bytes32,bytes32)\":{\"notice\":\"Attempt to cancel an authorization\"},\"decreaseAllowance(address,uint256)\":{\"notice\":\"Decrease the allowance by a given decrement\"},\"increaseAllowance(address,uint256)\":{\"notice\":\"Increase the allowance by a given increment\"},\"initializeV2(string)\":{\"notice\":\"Initialize v2\"},\"initializeV2_1(address)\":{\"notice\":\"Initialize v2.1\"},\"nonces(address)\":{\"notice\":\"Nonces for permit\"},\"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)\":{\"notice\":\"Update allowance with a signed permit\"},\"receiveWithAuthorization(address,address,uint256,uint256,uint256,bytes32,uint8,bytes32,bytes32)\":{\"notice\":\"Receive a transfer with a signed authorization from the payer\"},\"rescueERC20(address,address,uint256)\":{\"notice\":\"Rescue ERC20 tokens locked up in this contract.\"},\"rescuer()\":{\"notice\":\"Returns current rescuer\"},\"transfer(address,uint256)\":{\"notice\":\"Transfer tokens from the caller\"},\"transferFrom(address,address,uint256)\":{\"notice\":\"Transfer tokens by spending allowance\"},\"transferWithAuthorization(address,address,uint256,uint256,uint256,bytes32,uint8,bytes32,bytes32)\":{\"notice\":\"Execute a transfer with a signed authorization\"},\"updateRescuer(address)\":{\"notice\":\"Assign the rescuer role to a given address.\"},\"version()\":{\"notice\":\"Version string for the EIP712 domain separator\"}},\"notice\":\"ERC20 Token backed by fiat reserves, version 2.1\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/FiatTokenV2_1/centre-tokens/contracts/v2/FiatTokenV2_1.sol\":\"FiatTokenV2_1\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":10000000},\"remappings\":[\":ds-test/=lib/forge-std/lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\"]},\"sources\":{\"src/FiatTokenV2_1/centre-tokens/contracts/util/ECRecover.sol\":{\"keccak256\":\"0xb4e623304daaf25e40292e60a814ae60a60745d10003f1881a36be763dbc09aa\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://d6ef83bd777bfb13b0968b9cadd971216a95150427fa5d6b50f984e4b7268d31\",\"dweb:/ipfs/QmZS5TeT6n7tM36PBdYZNJW3wgYgAZE9zMcouNs4FuEDKj\"]},\"src/FiatTokenV2_1/centre-tokens/contracts/util/EIP712.sol\":{\"keccak256\":\"0x39319612a776e16f355d5ab71575b68c427a058839544f032733df228b5debd1\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://d5ac6450e881a4275f4b5baf7b5d6e15c0a0c7c2039edf39f106e0b821c9829d\",\"dweb:/ipfs/QmShHneDasAXQzjA8iKWXk3sbZgxbQGPiMQ1MUpJGF64N8\"]},\"src/FiatTokenV2_1/centre-tokens/contracts/v1.1/FiatTokenV1_1.sol\":{\"keccak256\":\"0xa5f8fc4b5e739ddcafe52dd76ebb7605e09eb9d52a5c1d77e48dd88e83106308\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://24543f05d3eb4768ee9798768cb6c9ce8b88d30606a5def83118ad1ba9382ac8\",\"dweb:/ipfs/QmYREtrAvoxn6DKXehJPP1pbs8vciqMvRHVk2eFKLtmKVT\"]},\"src/FiatTokenV2_1/centre-tokens/contracts/v1.1/Rescuable.sol\":{\"keccak256\":\"0x8c02b979e06aa4133c93e47c743ebebd56d120dd10aeaf56b2da2a36f06b68b1\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://9d73d6f98bd494500a414ca616eabe9ad6e99f283e00a471bddd7f8ac5825334\",\"dweb:/ipfs/QmXesAuMcXJiG3r2og7adeT5wBcY6ntFncVUFjNPfEhJC9\"]},\"src/FiatTokenV2_1/centre-tokens/contracts/v1/AbstractFiatTokenV1.sol\":{\"keccak256\":\"0xb81ae053cff8eced79f29c3542b7693763ed2bfdd9a25d6b150439d21b3fa57d\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://e16ce40aef6188334cd0dbc2e3aead22c1f89101d782df821821061d5efa891b\",\"dweb:/ipfs/QmW2WnaMTzpUityk5Mpv7FFdKCh2CeueJaDneoABGVowVm\"]},\"src/FiatTokenV2_1/centre-tokens/contracts/v1/Blacklistable.sol\":{\"keccak256\":\"0xc4ff3bfe34c8ecf9f2c333f8373c111fdd4640ed15677c4891bb9cf3cbff9554\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://91cfc583d47eda58f356783698a130c1c6adf797c4ba55461598c0bac8159f33\",\"dweb:/ipfs/QmeWfmhcwUE7H5Ge8TVhWkJ4kDwDY8a4kExMaufukLqsh1\"]},\"src/FiatTokenV2_1/centre-tokens/contracts/v1/FiatTokenV1.sol\":{\"keccak256\":\"0xaed130ecb4b0714a887dccaaff61321915f2afbf0839ee8af10673507a010471\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://3961d2ed8f4f2c69cc4ce0fdb2346b8bd5c09d644627704181fa03b82231ff31\",\"dweb:/ipfs/Qmb7sdix44isYUaD4TD4QsVmR8d86NN4koiFE6SsjRagGQ\"]},\"src/FiatTokenV2_1/centre-tokens/contracts/v1/Ownable.sol\":{\"keccak256\":\"0x654e645d6d09616fde908eba4d29abf318fede7e8cc3e31705203fc1d2599217\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://fce1ff1458e817aaa5f87d3ef4207fbbdeb25e548d460f47d9cca4fb80175390\",\"dweb:/ipfs/QmfY7E5xfTyeiuU2nDXEdYfy5LKjGRh69fuKK4HV6YTv9v\"]},\"src/FiatTokenV2_1/centre-tokens/contracts/v1/Pausable.sol\":{\"keccak256\":\"0x873ce4f17eb8694cd0420ef6682c2da54290fe6e243f21ead37e90f211ac91b6\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://7df712210c8bb5fc08e0ff7b684ee4035530cd67b21f20d81766a17407606a3c\",\"dweb:/ipfs/QmYPFYAw4W8VdcBdknLhqfNfiUuGhGJD3ZZ7rAjrKjhtXd\"]},\"src/FiatTokenV2_1/centre-tokens/contracts/v2/AbstractFiatTokenV2.sol\":{\"keccak256\":\"0x5d393663d48e4bbb730630c117c2b703dd3c9968833e66dbbb18c92eab207afe\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b0ce642b7ab095d970e3e5d031e5de6b2a98a7ddd20fd94123a42ed81e21757e\",\"dweb:/ipfs/QmbPixwbbpHS7zBRcJV1idzhaSd1SPRm3LjpywxFnXxR8A\"]},\"src/FiatTokenV2_1/centre-tokens/contracts/v2/EIP2612.sol\":{\"keccak256\":\"0x8ed169be2f6423b8e7002241857d719e9eb9545f5dbad5209a8f6445132bdbe0\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://0646f70d57d072c0569ccbd9b02c922bbb183e6052f94c241c4fef9a267e73bc\",\"dweb:/ipfs/QmZK3D3qqTMenkdc5EpZSiyxETMpTVpRke61uuRH75ctVk\"]},\"src/FiatTokenV2_1/centre-tokens/contracts/v2/EIP3009.sol\":{\"keccak256\":\"0x74a81d5b1682cb6716f60c27254e8a15463797e1772b37c884390eb9c7985070\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://1d3a6e220c2b8aab8c5070312cc9320ce2b79955b0bddafd99e5feec13851016\",\"dweb:/ipfs/QmQwc2nZtMKyDcGT8Scnv1R4ThP2Va9trUHnRiqMz4G2WN\"]},\"src/FiatTokenV2_1/centre-tokens/contracts/v2/EIP712Domain.sol\":{\"keccak256\":\"0x56d8c0259e7f0baa5bb0d0d94810f25d001fb2dbe4eaf54dbe369ba0f1b8fd2b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://9356cfa1d42bfb8c4f84a3db535ab75b2088975bfbda30834d79c3eb678047ea\",\"dweb:/ipfs/QmSBeiLwNGEC4vnr82EWQinGZFZemxKwxvwLZ9bu48FWF2\"]},\"src/FiatTokenV2_1/centre-tokens/contracts/v2/FiatTokenV2.sol\":{\"keccak256\":\"0x59654e02023dd9d712bb160545854eae6cba80d707a547f6abfaadcd830af2e7\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://e22c43b71ea393e9910bd91a355f711803d6971be25e9dabc702aaefac2a597f\",\"dweb:/ipfs/QmRjopnHgyKh1mXBDETBaXaom3NJSaacGEJweB5b28BdSE\"]},\"src/FiatTokenV2_1/centre-tokens/contracts/v2/FiatTokenV2_1.sol\":{\"keccak256\":\"0x6328091a86a3ab02471fba7ff3bf44200f6daf9f0ff3b61fe4043ee14cc1a4f0\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://4fed880853c249f6f812ddfa37bf99633b688f0bfd734e03372e4523f6cd2af9\",\"dweb:/ipfs/QmUMD1SvykvTJ8jmAjnsW13Yo3Wt6KH5dfKRPKCRogLki8\"]},\"src/FiatTokenV2_1/openzeppelin/contracts/math/SafeMath.sol\":{\"keccak256\":\"0x9a9cf02622cd7a64261b10534fc3260449da25c98c9e96d1b4ae8110a20e5806\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://2df142592d1dc267d9549049ee3317fa190d2f87eaa565f86ab05ec83f7ab8f5\",\"dweb:/ipfs/QmSkJtcfWo7c42KnL5hho6GFxK6HRNV91XABx1P7xDtfLV\"]},\"src/FiatTokenV2_1/openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0x5c26b39d26f7ed489e555d955dcd3e01872972e71fdd1528e93ec164e4f23385\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://efdc632af6960cf865dbc113665ea1f5b90eab75cc40ec062b2f6ae6da582017\",\"dweb:/ipfs/QmfAZFDuG62vxmAN9DnXApv7e7PMzPqi4RkqqZHLMSQiY5\"]},\"src/FiatTokenV2_1/openzeppelin/contracts/token/ERC20/SafeERC20.sol\":{\"keccak256\":\"0xf3b30f8a49631420635a8c35daacfcaa338012755f18a76fdd118730256f9a27\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://0d7de652204c2ee291a61aa984103dfc7ae4392d651fbbc44a0079caee7c69a3\",\"dweb:/ipfs/Qmcw1cQnq9eWDnrCBwU3TNyqLfTMUFg5YKpYUkELoMPuUE\"]},\"src/FiatTokenV2_1/openzeppelin/contracts/utils/Address.sol\":{\"keccak256\":\"0xdfb4f812600ba4ce6738c35584ceb8c9433472583051b48ba5b1f66cb758a498\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://df02dffe1c1de089d9b4f6192f0dcf464526f2230f420b3deec4645e0cdd2bff\",\"dweb:/ipfs/QmcqXGAU3KJqwrgUVoGJ2W8osomhSJ4R5kdsRpbuW3fELS\"]}},\"version\":1}", - "metadata": { - "compiler": { - "version": "0.6.12+commit.27d51765" - }, - "language": "Solidity", - "output": { - "abi": [ - { - "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": "authorizer", - "type": "address", - "indexed": true - }, - { - "internalType": "bytes32", - "name": "nonce", - "type": "bytes32", - "indexed": true - } - ], - "type": "event", - "name": "AuthorizationCanceled", - "anonymous": false - }, - { - "inputs": [ - { - "internalType": "address", - "name": "authorizer", - "type": "address", - "indexed": true - }, - { - "internalType": "bytes32", - "name": "nonce", - "type": "bytes32", - "indexed": true - } - ], - "type": "event", - "name": "AuthorizationUsed", - "anonymous": false - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_account", - "type": "address", - "indexed": true - } - ], - "type": "event", - "name": "Blacklisted", - "anonymous": false - }, - { - "inputs": [ - { - "internalType": "address", - "name": "newBlacklister", - "type": "address", - "indexed": true - } - ], - "type": "event", - "name": "BlacklisterChanged", - "anonymous": false - }, - { - "inputs": [ - { - "internalType": "address", - "name": "burner", - "type": "address", - "indexed": true - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256", - "indexed": false - } - ], - "type": "event", - "name": "Burn", - "anonymous": false - }, - { - "inputs": [ - { - "internalType": "address", - "name": "newMasterMinter", - "type": "address", - "indexed": true - } - ], - "type": "event", - "name": "MasterMinterChanged", - "anonymous": false - }, - { - "inputs": [ - { - "internalType": "address", - "name": "minter", - "type": "address", - "indexed": true - }, - { - "internalType": "address", - "name": "to", - "type": "address", - "indexed": true - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256", - "indexed": false - } - ], - "type": "event", - "name": "Mint", - "anonymous": false - }, - { - "inputs": [ - { - "internalType": "address", - "name": "minter", - "type": "address", - "indexed": true - }, - { - "internalType": "uint256", - "name": "minterAllowedAmount", - "type": "uint256", - "indexed": false - } - ], - "type": "event", - "name": "MinterConfigured", - "anonymous": false - }, - { - "inputs": [ - { - "internalType": "address", - "name": "oldMinter", - "type": "address", - "indexed": true - } - ], - "type": "event", - "name": "MinterRemoved", - "anonymous": false - }, - { - "inputs": [ - { - "internalType": "address", - "name": "previousOwner", - "type": "address", - "indexed": false - }, - { - "internalType": "address", - "name": "newOwner", - "type": "address", - "indexed": false - } - ], - "type": "event", - "name": "OwnershipTransferred", - "anonymous": false - }, - { - "inputs": [], - "type": "event", - "name": "Pause", - "anonymous": false - }, - { - "inputs": [ - { - "internalType": "address", - "name": "newAddress", - "type": "address", - "indexed": true - } - ], - "type": "event", - "name": "PauserChanged", - "anonymous": false - }, - { - "inputs": [ - { - "internalType": "address", - "name": "newRescuer", - "type": "address", - "indexed": true - } - ], - "type": "event", - "name": "RescuerChanged", - "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": "_account", - "type": "address", - "indexed": true - } - ], - "type": "event", - "name": "UnBlacklisted", - "anonymous": false - }, - { - "inputs": [], - "type": "event", - "name": "Unpause", - "anonymous": false - }, - { - "inputs": [], - "stateMutability": "view", - "type": "function", - "name": "CANCEL_AUTHORIZATION_TYPEHASH", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ] - }, - { - "inputs": [], - "stateMutability": "view", - "type": "function", - "name": "DOMAIN_SEPARATOR", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ] - }, - { - "inputs": [], - "stateMutability": "view", - "type": "function", - "name": "PERMIT_TYPEHASH", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ] - }, - { - "inputs": [], - "stateMutability": "view", - "type": "function", - "name": "RECEIVE_WITH_AUTHORIZATION_TYPEHASH", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ] - }, - { - "inputs": [], - "stateMutability": "view", - "type": "function", - "name": "TRANSFER_WITH_AUTHORIZATION_TYPEHASH", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ] - }, - { - "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": "value", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function", - "name": "approve", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ] - }, - { - "inputs": [ - { - "internalType": "address", - "name": "authorizer", - "type": "address" - }, - { - "internalType": "bytes32", - "name": "nonce", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function", - "name": "authorizationState", - "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": [ - { - "internalType": "address", - "name": "_account", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "function", - "name": "blacklist" - }, - { - "inputs": [], - "stateMutability": "view", - "type": "function", - "name": "blacklister", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ] - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function", - "name": "burn" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "authorizer", - "type": "address" - }, - { - "internalType": "bytes32", - "name": "nonce", - "type": "bytes32" - }, - { - "internalType": "uint8", - "name": "v", - "type": "uint8" - }, - { - "internalType": "bytes32", - "name": "r", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "s", - "type": "bytes32" - } - ], - "stateMutability": "nonpayable", - "type": "function", - "name": "cancelAuthorization" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "minter", - "type": "address" - }, - { - "internalType": "uint256", - "name": "minterAllowedAmount", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function", - "name": "configureMinter", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ] - }, - { - "inputs": [], - "stateMutability": "view", - "type": "function", - "name": "currency", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ] - }, - { - "inputs": [], - "stateMutability": "view", - "type": "function", - "name": "decimals", - "outputs": [ - { - "internalType": "uint8", - "name": "", - "type": "uint8" - } - ] - }, - { - "inputs": [ - { - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "internalType": "uint256", - "name": "decrement", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function", - "name": "decreaseAllowance", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ] - }, - { - "inputs": [ - { - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "internalType": "uint256", - "name": "increment", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function", - "name": "increaseAllowance", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ] - }, - { - "inputs": [ - { - "internalType": "string", - "name": "tokenName", - "type": "string" - }, - { - "internalType": "string", - "name": "tokenSymbol", - "type": "string" - }, - { - "internalType": "string", - "name": "tokenCurrency", - "type": "string" - }, - { - "internalType": "uint8", - "name": "tokenDecimals", - "type": "uint8" - }, - { - "internalType": "address", - "name": "newMasterMinter", - "type": "address" - }, - { - "internalType": "address", - "name": "newPauser", - "type": "address" - }, - { - "internalType": "address", - "name": "newBlacklister", - "type": "address" - }, - { - "internalType": "address", - "name": "newOwner", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "function", - "name": "initialize" - }, - { - "inputs": [ - { - "internalType": "string", - "name": "newName", - "type": "string" - } - ], - "stateMutability": "nonpayable", - "type": "function", - "name": "initializeV2" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "lostAndFound", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "function", - "name": "initializeV2_1" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_account", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function", - "name": "isBlacklisted", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ] - }, - { - "inputs": [ - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function", - "name": "isMinter", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ] - }, - { - "inputs": [], - "stateMutability": "view", - "type": "function", - "name": "masterMinter", - "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", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ] - }, - { - "inputs": [ - { - "internalType": "address", - "name": "minter", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function", - "name": "minterAllowance", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ] - }, - { - "inputs": [], - "stateMutability": "view", - "type": "function", - "name": "name", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ] - }, - { - "inputs": [ - { - "internalType": "address", - "name": "owner", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function", - "name": "nonces", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ] - }, - { - "inputs": [], - "stateMutability": "view", - "type": "function", - "name": "owner", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ] - }, - { - "inputs": [], - "stateMutability": "nonpayable", - "type": "function", - "name": "pause" - }, - { - "inputs": [], - "stateMutability": "view", - "type": "function", - "name": "paused", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ] - }, - { - "inputs": [], - "stateMutability": "view", - "type": "function", - "name": "pauser", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ] - }, - { - "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": [ - { - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "validAfter", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "validBefore", - "type": "uint256" - }, - { - "internalType": "bytes32", - "name": "nonce", - "type": "bytes32" - }, - { - "internalType": "uint8", - "name": "v", - "type": "uint8" - }, - { - "internalType": "bytes32", - "name": "r", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "s", - "type": "bytes32" - } - ], - "stateMutability": "nonpayable", - "type": "function", - "name": "receiveWithAuthorization" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "minter", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "function", - "name": "removeMinter", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ] - }, - { - "inputs": [ - { - "internalType": "contract IERC20", - "name": "tokenContract", - "type": "address" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function", - "name": "rescueERC20" - }, - { - "inputs": [], - "stateMutability": "view", - "type": "function", - "name": "rescuer", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ] - }, - { - "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": "value", - "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": "value", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function", - "name": "transferFrom", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ] - }, - { - "inputs": [ - { - "internalType": "address", - "name": "newOwner", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "function", - "name": "transferOwnership" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "validAfter", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "validBefore", - "type": "uint256" - }, - { - "internalType": "bytes32", - "name": "nonce", - "type": "bytes32" - }, - { - "internalType": "uint8", - "name": "v", - "type": "uint8" - }, - { - "internalType": "bytes32", - "name": "r", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "s", - "type": "bytes32" - } - ], - "stateMutability": "nonpayable", - "type": "function", - "name": "transferWithAuthorization" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_account", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "function", - "name": "unBlacklist" - }, - { - "inputs": [], - "stateMutability": "nonpayable", - "type": "function", - "name": "unpause" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_newBlacklister", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "function", - "name": "updateBlacklister" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_newMasterMinter", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "function", - "name": "updateMasterMinter" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_newPauser", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "function", - "name": "updatePauser" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "newRescuer", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "function", - "name": "updateRescuer" - }, - { - "inputs": [], - "stateMutability": "view", - "type": "function", - "name": "version", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ] - } - ], - "devdoc": { - "kind": "dev", - "methods": { - "allowance(address,address)": { - "params": { - "owner": "Token owner's address", - "spender": "Spender's address" - }, - "returns": { - "_0": "Allowance amount" - } - }, - "approve(address,uint256)": { - "params": { - "spender": "Spender's address", - "value": "Allowance amount" - }, - "returns": { - "_0": "True if successful" - } - }, - "authorizationState(address,bytes32)": { - "details": "Nonces are randomly generated 32-byte data unique to the authorizer's address", - "params": { - "authorizer": "Authorizer's address", - "nonce": "Nonce of the authorization" - }, - "returns": { - "_0": "True if the nonce is used" - } - }, - "balanceOf(address)": { - "details": "Get token balance of an account", - "params": { - "account": "address The account" - } - }, - "blacklist(address)": { - "details": "Adds account to blacklist", - "params": { - "_account": "The address to blacklist" - } - }, - "burn(uint256)": { - "details": "allows a minter to burn some of its own tokens Validates that caller is a minter and that sender is not blacklisted amount is less than or equal to the minter's account balance", - "params": { - "_amount": "uint256 the amount of tokens to be burned" - } - }, - "cancelAuthorization(address,bytes32,uint8,bytes32,bytes32)": { - "details": "Works only if the authorization is not yet used.", - "params": { - "authorizer": "Authorizer's address", - "nonce": "Nonce of the authorization", - "r": "r of the signature", - "s": "s of the signature", - "v": "v of the signature" - } - }, - "configureMinter(address,uint256)": { - "details": "Function to add/update a new minter", - "params": { - "minter": "The address of the minter", - "minterAllowedAmount": "The minting amount allowed for the minter" - }, - "returns": { - "_0": "True if the operation was successful." - } - }, - "decreaseAllowance(address,uint256)": { - "params": { - "decrement": "Amount of decrease in allowance", - "spender": "Spender's address" - }, - "returns": { - "_0": "True if successful" - } - }, - "increaseAllowance(address,uint256)": { - "params": { - "increment": "Amount of increase in allowance", - "spender": "Spender's address" - }, - "returns": { - "_0": "True if successful" - } - }, - "initializeV2(string)": { - "params": { - "newName": "New token name" - } - }, - "initializeV2_1(address)": { - "params": { - "lostAndFound": "The address to which the locked funds are sent" - } - }, - "isBlacklisted(address)": { - "details": "Checks if account is blacklisted", - "params": { - "_account": "The address to check" - } - }, - "isMinter(address)": { - "details": "Checks if account is a minter", - "params": { - "account": "The address to check" - } - }, - "mint(address,uint256)": { - "details": "Function to mint tokens", - "params": { - "_amount": "The amount of tokens to mint. Must be less than or equal to the minterAllowance of the caller.", - "_to": "The address that will receive the minted tokens." - }, - "returns": { - "_0": "A boolean that indicates if the operation was successful." - } - }, - "minterAllowance(address)": { - "details": "Get minter allowance for an account", - "params": { - "minter": "The address of the minter" - } - }, - "nonces(address)": { - "params": { - "owner": "Token owner's address (Authorizer)" - }, - "returns": { - "_0": "Next nonce" - } - }, - "owner()": { - "details": "Tells the address of the owner", - "returns": { - "_0": "the address of the owner" - } - }, - "pause()": { - "details": "called by the owner to pause, triggers stopped state" - }, - "permit(address,address,uint256,uint256,uint8,bytes32,bytes32)": { - "params": { - "deadline": "Expiration time, seconds since the epoch", - "owner": "Token owner's address (Authorizer)", - "r": "r of the signature", - "s": "s of the signature", - "spender": "Spender's address", - "v": "v of the signature", - "value": "Amount of allowance" - } - }, - "receiveWithAuthorization(address,address,uint256,uint256,uint256,bytes32,uint8,bytes32,bytes32)": { - "details": "This has an additional check to ensure that the payee's address matches the caller of this function to prevent front-running attacks.", - "params": { - "from": "Payer's address (Authorizer)", - "nonce": "Unique nonce", - "r": "r of the signature", - "s": "s of the signature", - "to": "Payee's address", - "v": "v of the signature", - "validAfter": "The time after which this is valid (unix time)", - "validBefore": "The time before which this is valid (unix time)", - "value": "Amount to be transferred" - } - }, - "removeMinter(address)": { - "details": "Function to remove a minter", - "params": { - "minter": "The address of the minter to remove" - }, - "returns": { - "_0": "True if the operation was successful." - } - }, - "rescueERC20(address,address,uint256)": { - "params": { - "amount": "Amount to withdraw", - "to": "Recipient address", - "tokenContract": "ERC20 token contract address" - } - }, - "rescuer()": { - "returns": { - "_0": "Rescuer's address" - } - }, - "totalSupply()": { - "details": "Get totalSupply of token" - }, - "transfer(address,uint256)": { - "params": { - "to": "Payee's address", - "value": "Transfer amount" - }, - "returns": { - "_0": "True if successful" - } - }, - "transferFrom(address,address,uint256)": { - "params": { - "from": "Payer's address", - "to": "Payee's address", - "value": "Transfer amount" - }, - "returns": { - "_0": "True if successful" - } - }, - "transferOwnership(address)": { - "details": "Allows the current owner to transfer control of the contract to a newOwner.", - "params": { - "newOwner": "The address to transfer ownership to." - } - }, - "transferWithAuthorization(address,address,uint256,uint256,uint256,bytes32,uint8,bytes32,bytes32)": { - "params": { - "from": "Payer's address (Authorizer)", - "nonce": "Unique nonce", - "r": "r of the signature", - "s": "s of the signature", - "to": "Payee's address", - "v": "v of the signature", - "validAfter": "The time after which this is valid (unix time)", - "validBefore": "The time before which this is valid (unix time)", - "value": "Amount to be transferred" - } - }, - "unBlacklist(address)": { - "details": "Removes account from blacklist", - "params": { - "_account": "The address to remove from the blacklist" - } - }, - "unpause()": { - "details": "called by the owner to unpause, returns to normal state" - }, - "updatePauser(address)": { - "details": "update the pauser role" - }, - "updateRescuer(address)": { - "params": { - "newRescuer": "New rescuer's address" - } - }, - "version()": { - "returns": { - "_0": "Version string" - } - } - }, - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": { - "allowance(address,address)": { - "notice": "Amount of remaining tokens spender is allowed to transfer on behalf of the token owner" - }, - "approve(address,uint256)": { - "notice": "Set spender's allowance over the caller's tokens to be a given value." - }, - "authorizationState(address,bytes32)": { - "notice": "Returns the state of an authorization" - }, - "cancelAuthorization(address,bytes32,uint8,bytes32,bytes32)": { - "notice": "Attempt to cancel an authorization" - }, - "decreaseAllowance(address,uint256)": { - "notice": "Decrease the allowance by a given decrement" - }, - "increaseAllowance(address,uint256)": { - "notice": "Increase the allowance by a given increment" - }, - "initializeV2(string)": { - "notice": "Initialize v2" - }, - "initializeV2_1(address)": { - "notice": "Initialize v2.1" - }, - "nonces(address)": { - "notice": "Nonces for permit" - }, - "permit(address,address,uint256,uint256,uint8,bytes32,bytes32)": { - "notice": "Update allowance with a signed permit" - }, - "receiveWithAuthorization(address,address,uint256,uint256,uint256,bytes32,uint8,bytes32,bytes32)": { - "notice": "Receive a transfer with a signed authorization from the payer" - }, - "rescueERC20(address,address,uint256)": { - "notice": "Rescue ERC20 tokens locked up in this contract." - }, - "rescuer()": { - "notice": "Returns current rescuer" - }, - "transfer(address,uint256)": { - "notice": "Transfer tokens from the caller" - }, - "transferFrom(address,address,uint256)": { - "notice": "Transfer tokens by spending allowance" - }, - "transferWithAuthorization(address,address,uint256,uint256,uint256,bytes32,uint8,bytes32,bytes32)": { - "notice": "Execute a transfer with a signed authorization" - }, - "updateRescuer(address)": { - "notice": "Assign the rescuer role to a given address." - }, - "version()": { - "notice": "Version string for the EIP712 domain separator" - } - }, - "version": 1 - } - }, - "settings": { - "remappings": [ - "ds-test/=lib/forge-std/lib/ds-test/src/", - "forge-std/=lib/forge-std/src/" - ], - "optimizer": { - "enabled": true, - "runs": 10000000 - }, - "metadata": { - "bytecodeHash": "ipfs" - }, - "compilationTarget": { - "src/FiatTokenV2_1/centre-tokens/contracts/v2/FiatTokenV2_1.sol": "FiatTokenV2_1" - }, - "libraries": {} - }, - "sources": { - "src/FiatTokenV2_1/centre-tokens/contracts/util/ECRecover.sol": { - "keccak256": "0xb4e623304daaf25e40292e60a814ae60a60745d10003f1881a36be763dbc09aa", - "urls": [ - "bzz-raw://d6ef83bd777bfb13b0968b9cadd971216a95150427fa5d6b50f984e4b7268d31", - "dweb:/ipfs/QmZS5TeT6n7tM36PBdYZNJW3wgYgAZE9zMcouNs4FuEDKj" - ], - "license": "MIT" - }, - "src/FiatTokenV2_1/centre-tokens/contracts/util/EIP712.sol": { - "keccak256": "0x39319612a776e16f355d5ab71575b68c427a058839544f032733df228b5debd1", - "urls": [ - "bzz-raw://d5ac6450e881a4275f4b5baf7b5d6e15c0a0c7c2039edf39f106e0b821c9829d", - "dweb:/ipfs/QmShHneDasAXQzjA8iKWXk3sbZgxbQGPiMQ1MUpJGF64N8" - ], - "license": "MIT" - }, - "src/FiatTokenV2_1/centre-tokens/contracts/v1.1/FiatTokenV1_1.sol": { - "keccak256": "0xa5f8fc4b5e739ddcafe52dd76ebb7605e09eb9d52a5c1d77e48dd88e83106308", - "urls": [ - "bzz-raw://24543f05d3eb4768ee9798768cb6c9ce8b88d30606a5def83118ad1ba9382ac8", - "dweb:/ipfs/QmYREtrAvoxn6DKXehJPP1pbs8vciqMvRHVk2eFKLtmKVT" - ], - "license": "MIT" - }, - "src/FiatTokenV2_1/centre-tokens/contracts/v1.1/Rescuable.sol": { - "keccak256": "0x8c02b979e06aa4133c93e47c743ebebd56d120dd10aeaf56b2da2a36f06b68b1", - "urls": [ - "bzz-raw://9d73d6f98bd494500a414ca616eabe9ad6e99f283e00a471bddd7f8ac5825334", - "dweb:/ipfs/QmXesAuMcXJiG3r2og7adeT5wBcY6ntFncVUFjNPfEhJC9" - ], - "license": "MIT" - }, - "src/FiatTokenV2_1/centre-tokens/contracts/v1/AbstractFiatTokenV1.sol": { - "keccak256": "0xb81ae053cff8eced79f29c3542b7693763ed2bfdd9a25d6b150439d21b3fa57d", - "urls": [ - "bzz-raw://e16ce40aef6188334cd0dbc2e3aead22c1f89101d782df821821061d5efa891b", - "dweb:/ipfs/QmW2WnaMTzpUityk5Mpv7FFdKCh2CeueJaDneoABGVowVm" - ], - "license": "MIT" - }, - "src/FiatTokenV2_1/centre-tokens/contracts/v1/Blacklistable.sol": { - "keccak256": "0xc4ff3bfe34c8ecf9f2c333f8373c111fdd4640ed15677c4891bb9cf3cbff9554", - "urls": [ - "bzz-raw://91cfc583d47eda58f356783698a130c1c6adf797c4ba55461598c0bac8159f33", - "dweb:/ipfs/QmeWfmhcwUE7H5Ge8TVhWkJ4kDwDY8a4kExMaufukLqsh1" - ], - "license": "MIT" - }, - "src/FiatTokenV2_1/centre-tokens/contracts/v1/FiatTokenV1.sol": { - "keccak256": "0xaed130ecb4b0714a887dccaaff61321915f2afbf0839ee8af10673507a010471", - "urls": [ - "bzz-raw://3961d2ed8f4f2c69cc4ce0fdb2346b8bd5c09d644627704181fa03b82231ff31", - "dweb:/ipfs/Qmb7sdix44isYUaD4TD4QsVmR8d86NN4koiFE6SsjRagGQ" - ], - "license": "MIT" - }, - "src/FiatTokenV2_1/centre-tokens/contracts/v1/Ownable.sol": { - "keccak256": "0x654e645d6d09616fde908eba4d29abf318fede7e8cc3e31705203fc1d2599217", - "urls": [ - "bzz-raw://fce1ff1458e817aaa5f87d3ef4207fbbdeb25e548d460f47d9cca4fb80175390", - "dweb:/ipfs/QmfY7E5xfTyeiuU2nDXEdYfy5LKjGRh69fuKK4HV6YTv9v" - ], - "license": "MIT" - }, - "src/FiatTokenV2_1/centre-tokens/contracts/v1/Pausable.sol": { - "keccak256": "0x873ce4f17eb8694cd0420ef6682c2da54290fe6e243f21ead37e90f211ac91b6", - "urls": [ - "bzz-raw://7df712210c8bb5fc08e0ff7b684ee4035530cd67b21f20d81766a17407606a3c", - "dweb:/ipfs/QmYPFYAw4W8VdcBdknLhqfNfiUuGhGJD3ZZ7rAjrKjhtXd" - ], - "license": "MIT" - }, - "src/FiatTokenV2_1/centre-tokens/contracts/v2/AbstractFiatTokenV2.sol": { - "keccak256": "0x5d393663d48e4bbb730630c117c2b703dd3c9968833e66dbbb18c92eab207afe", - "urls": [ - "bzz-raw://b0ce642b7ab095d970e3e5d031e5de6b2a98a7ddd20fd94123a42ed81e21757e", - "dweb:/ipfs/QmbPixwbbpHS7zBRcJV1idzhaSd1SPRm3LjpywxFnXxR8A" - ], - "license": "MIT" - }, - "src/FiatTokenV2_1/centre-tokens/contracts/v2/EIP2612.sol": { - "keccak256": "0x8ed169be2f6423b8e7002241857d719e9eb9545f5dbad5209a8f6445132bdbe0", - "urls": [ - "bzz-raw://0646f70d57d072c0569ccbd9b02c922bbb183e6052f94c241c4fef9a267e73bc", - "dweb:/ipfs/QmZK3D3qqTMenkdc5EpZSiyxETMpTVpRke61uuRH75ctVk" - ], - "license": "MIT" - }, - "src/FiatTokenV2_1/centre-tokens/contracts/v2/EIP3009.sol": { - "keccak256": "0x74a81d5b1682cb6716f60c27254e8a15463797e1772b37c884390eb9c7985070", - "urls": [ - "bzz-raw://1d3a6e220c2b8aab8c5070312cc9320ce2b79955b0bddafd99e5feec13851016", - "dweb:/ipfs/QmQwc2nZtMKyDcGT8Scnv1R4ThP2Va9trUHnRiqMz4G2WN" - ], - "license": "MIT" - }, - "src/FiatTokenV2_1/centre-tokens/contracts/v2/EIP712Domain.sol": { - "keccak256": "0x56d8c0259e7f0baa5bb0d0d94810f25d001fb2dbe4eaf54dbe369ba0f1b8fd2b", - "urls": [ - "bzz-raw://9356cfa1d42bfb8c4f84a3db535ab75b2088975bfbda30834d79c3eb678047ea", - "dweb:/ipfs/QmSBeiLwNGEC4vnr82EWQinGZFZemxKwxvwLZ9bu48FWF2" - ], - "license": "MIT" - }, - "src/FiatTokenV2_1/centre-tokens/contracts/v2/FiatTokenV2.sol": { - "keccak256": "0x59654e02023dd9d712bb160545854eae6cba80d707a547f6abfaadcd830af2e7", - "urls": [ - "bzz-raw://e22c43b71ea393e9910bd91a355f711803d6971be25e9dabc702aaefac2a597f", - "dweb:/ipfs/QmRjopnHgyKh1mXBDETBaXaom3NJSaacGEJweB5b28BdSE" - ], - "license": "MIT" - }, - "src/FiatTokenV2_1/centre-tokens/contracts/v2/FiatTokenV2_1.sol": { - "keccak256": "0x6328091a86a3ab02471fba7ff3bf44200f6daf9f0ff3b61fe4043ee14cc1a4f0", - "urls": [ - "bzz-raw://4fed880853c249f6f812ddfa37bf99633b688f0bfd734e03372e4523f6cd2af9", - "dweb:/ipfs/QmUMD1SvykvTJ8jmAjnsW13Yo3Wt6KH5dfKRPKCRogLki8" - ], - "license": "MIT" - }, - "src/FiatTokenV2_1/openzeppelin/contracts/math/SafeMath.sol": { - "keccak256": "0x9a9cf02622cd7a64261b10534fc3260449da25c98c9e96d1b4ae8110a20e5806", - "urls": [ - "bzz-raw://2df142592d1dc267d9549049ee3317fa190d2f87eaa565f86ab05ec83f7ab8f5", - "dweb:/ipfs/QmSkJtcfWo7c42KnL5hho6GFxK6HRNV91XABx1P7xDtfLV" - ], - "license": "MIT" - }, - "src/FiatTokenV2_1/openzeppelin/contracts/token/ERC20/IERC20.sol": { - "keccak256": "0x5c26b39d26f7ed489e555d955dcd3e01872972e71fdd1528e93ec164e4f23385", - "urls": [ - "bzz-raw://efdc632af6960cf865dbc113665ea1f5b90eab75cc40ec062b2f6ae6da582017", - "dweb:/ipfs/QmfAZFDuG62vxmAN9DnXApv7e7PMzPqi4RkqqZHLMSQiY5" - ], - "license": "MIT" - }, - "src/FiatTokenV2_1/openzeppelin/contracts/token/ERC20/SafeERC20.sol": { - "keccak256": "0xf3b30f8a49631420635a8c35daacfcaa338012755f18a76fdd118730256f9a27", - "urls": [ - "bzz-raw://0d7de652204c2ee291a61aa984103dfc7ae4392d651fbbc44a0079caee7c69a3", - "dweb:/ipfs/Qmcw1cQnq9eWDnrCBwU3TNyqLfTMUFg5YKpYUkELoMPuUE" - ], - "license": "MIT" - }, - "src/FiatTokenV2_1/openzeppelin/contracts/utils/Address.sol": { - "keccak256": "0xdfb4f812600ba4ce6738c35584ceb8c9433472583051b48ba5b1f66cb758a498", - "urls": [ - "bzz-raw://df02dffe1c1de089d9b4f6192f0dcf464526f2230f420b3deec4645e0cdd2bff", - "dweb:/ipfs/QmcqXGAU3KJqwrgUVoGJ2W8osomhSJ4R5kdsRpbuW3fELS" - ], - "license": "MIT" - } - }, - "version": 1 - }, - "ast": { - "absolutePath": "src/FiatTokenV2_1/centre-tokens/contracts/v2/FiatTokenV2_1.sol", - "id": 47381, - "exportedSymbols": { - "FiatTokenV2_1": [47380] - }, - "nodeType": "SourceUnit", - "src": "1154:973:41", - "nodes": [ - { - "id": 47316, - "nodeType": "PragmaDirective", - "src": "1154:23:41", - "nodes": [], - "literals": ["solidity", "0.6", ".12"] - }, - { - "id": 47318, - "nodeType": "ImportDirective", - "src": "1179:48:41", - "nodes": [], - "absolutePath": "src/FiatTokenV2_1/centre-tokens/contracts/v2/FiatTokenV2.sol", - "file": "./FiatTokenV2.sol", - "scope": 47381, - "sourceUnit": 47315, - "symbolAliases": [ - { - "foreign": { - "argumentTypes": null, - "id": 47317, - "name": "FiatTokenV2", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": null, - "src": "1188:11:41", - "typeDescriptions": { - "typeIdentifier": null, - "typeString": null - } - }, - "local": null - } - ], - "unitAlias": "" - }, - { - "id": 47380, - "nodeType": "ContractDefinition", - "src": "1362:764:41", - "nodes": [ - { - "id": 47370, - "nodeType": "FunctionDefinition", - "src": "1528:398:41", - "nodes": [], - "body": { - "id": 47369, - "nodeType": "Block", - "src": "1583:343:41", - "nodes": [], - "statements": [ - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_uint8", - "typeString": "uint8" - }, - "id": 47330, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "id": 47328, - "name": "_initializedVersion", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 47025, - "src": "1652:19:41", - "typeDescriptions": { - "typeIdentifier": "t_uint8", - "typeString": "uint8" - } - }, - "nodeType": "BinaryOperation", - "operator": "==", - "rightExpression": { - "argumentTypes": null, - "hexValue": "31", - "id": 47329, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "1675:1:41", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_1_by_1", - "typeString": "int_const 1" - }, - "value": "1" - }, - "src": "1652:24:41", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - ], - "id": 47327, - "name": "require", - "nodeType": "Identifier", - "overloadedDeclarations": [-18, -18], - "referencedDeclaration": -18, - "src": "1644:7:41", - "typeDescriptions": { - "typeIdentifier": "t_function_require_pure$_t_bool_$returns$__$", - "typeString": "function (bool) pure" - } - }, - "id": 47331, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "1644:33:41", - "tryCall": false, - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 47332, - "nodeType": "ExpressionStatement", - "src": "1644:33:41" - }, - { - "assignments": [47334], - "declarations": [ - { - "constant": false, - "id": 47334, - "mutability": "mutable", - "name": "lockedAmount", - "nodeType": "VariableDeclaration", - "overrides": null, - "scope": 47369, - "src": "1688:20:41", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 47333, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "1688:7:41", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 47341, - "initialValue": { - "argumentTypes": null, - "baseExpression": { - "argumentTypes": null, - "id": 47335, - "name": "balances", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 45622, - "src": "1711:8:41", - "typeDescriptions": { - "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$", - "typeString": "mapping(address => uint256)" - } - }, - "id": 47340, - "indexExpression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 47338, - "name": "this", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": -28, - "src": "1728:4:41", - "typeDescriptions": { - "typeIdentifier": "t_contract$_FiatTokenV2_1_$47380", - "typeString": "contract FiatTokenV2_1" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_contract$_FiatTokenV2_1_$47380", - "typeString": "contract FiatTokenV2_1" - } - ], - "id": 47337, - "isConstant": false, - "isLValue": false, - "isPure": true, - "lValueRequested": false, - "nodeType": "ElementaryTypeNameExpression", - "src": "1720:7:41", - "typeDescriptions": { - "typeIdentifier": "t_type$_t_address_$", - "typeString": "type(address)" - }, - "typeName": { - "id": 47336, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "1720:7:41", - "typeDescriptions": { - "typeIdentifier": null, - "typeString": null - } - } - }, - "id": 47339, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "typeConversion", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "1720:13:41", - "tryCall": false, - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "nodeType": "IndexAccess", - "src": "1711:23:41", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "1688:46:41" - }, - { - "condition": { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "id": 47344, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "id": 47342, - "name": "lockedAmount", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 47334, - "src": "1748:12:41", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "BinaryOperation", - "operator": ">", - "rightExpression": { - "argumentTypes": null, - "hexValue": "30", - "id": 47343, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "1763:1:41", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_0_by_1", - "typeString": "int_const 0" - }, - "value": "0" - }, - "src": "1748:16:41", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "falseBody": null, - "id": 47355, - "nodeType": "IfStatement", - "src": "1744:99:41", - "trueBody": { - "id": 47354, - "nodeType": "Block", - "src": "1766:77:41", - "statements": [ - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 47348, - "name": "this", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": -28, - "src": "1798:4:41", - "typeDescriptions": { - "typeIdentifier": "t_contract$_FiatTokenV2_1_$47380", - "typeString": "contract FiatTokenV2_1" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_contract$_FiatTokenV2_1_$47380", - "typeString": "contract FiatTokenV2_1" - } - ], - "id": 47347, - "isConstant": false, - "isLValue": false, - "isPure": true, - "lValueRequested": false, - "nodeType": "ElementaryTypeNameExpression", - "src": "1790:7:41", - "typeDescriptions": { - "typeIdentifier": "t_type$_t_address_$", - "typeString": "type(address)" - }, - "typeName": { - "id": 47346, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "1790:7:41", - "typeDescriptions": { - "typeIdentifier": null, - "typeString": null - } - } - }, - "id": 47349, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "typeConversion", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "1790:13:41", - "tryCall": false, - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - { - "argumentTypes": null, - "id": 47350, - "name": "lostAndFound", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 47324, - "src": "1805:12:41", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - { - "argumentTypes": null, - "id": 47351, - "name": "lockedAmount", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 47334, - "src": "1819:12:41", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_address", - "typeString": "address" - }, - { - "typeIdentifier": "t_address", - "typeString": "address" - }, - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "id": 47345, - "name": "_transfer", - "nodeType": "Identifier", - "overloadedDeclarations": [46200], - "referencedDeclaration": 46200, - "src": "1780:9:41", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$", - "typeString": "function (address,address,uint256)" - } - }, - "id": 47352, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "1780:52:41", - "tryCall": false, - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 47353, - "nodeType": "ExpressionStatement", - "src": "1780:52:41" - } - ] - } - }, - { - "expression": { - "argumentTypes": null, - "id": 47363, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftHandSide": { - "argumentTypes": null, - "baseExpression": { - "argumentTypes": null, - "id": 47356, - "name": "blacklisted", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 45464, - "src": "1852:11:41", - "typeDescriptions": { - "typeIdentifier": "t_mapping$_t_address_$_t_bool_$", - "typeString": "mapping(address => bool)" - } - }, - "id": 47361, - "indexExpression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 47359, - "name": "this", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": -28, - "src": "1872:4:41", - "typeDescriptions": { - "typeIdentifier": "t_contract$_FiatTokenV2_1_$47380", - "typeString": "contract FiatTokenV2_1" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_contract$_FiatTokenV2_1_$47380", - "typeString": "contract FiatTokenV2_1" - } - ], - "id": 47358, - "isConstant": false, - "isLValue": false, - "isPure": true, - "lValueRequested": false, - "nodeType": "ElementaryTypeNameExpression", - "src": "1864:7:41", - "typeDescriptions": { - "typeIdentifier": "t_type$_t_address_$", - "typeString": "type(address)" - }, - "typeName": { - "id": 47357, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "1864:7:41", - "typeDescriptions": { - "typeIdentifier": null, - "typeString": null - } - } - }, - "id": 47360, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "typeConversion", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "1864:13:41", - "tryCall": false, - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": true, - "nodeType": "IndexAccess", - "src": "1852:26:41", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "nodeType": "Assignment", - "operator": "=", - "rightHandSide": { - "argumentTypes": null, - "hexValue": "74727565", - "id": 47362, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "bool", - "lValueRequested": false, - "nodeType": "Literal", - "src": "1881:4:41", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - "value": "true" - }, - "src": "1852:33:41", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "id": 47364, - "nodeType": "ExpressionStatement", - "src": "1852:33:41" - }, - { - "expression": { - "argumentTypes": null, - "id": 47367, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftHandSide": { - "argumentTypes": null, - "id": 47365, - "name": "_initializedVersion", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 47025, - "src": "1896:19:41", - "typeDescriptions": { - "typeIdentifier": "t_uint8", - "typeString": "uint8" - } - }, - "nodeType": "Assignment", - "operator": "=", - "rightHandSide": { - "argumentTypes": null, - "hexValue": "32", - "id": 47366, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "1918:1:41", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_2_by_1", - "typeString": "int_const 2" - }, - "value": "2" - }, - "src": "1896:23:41", - "typeDescriptions": { - "typeIdentifier": "t_uint8", - "typeString": "uint8" - } - }, - "id": 47368, - "nodeType": "ExpressionStatement", - "src": "1896:23:41" - } - ] - }, - "documentation": { - "id": 47322, - "nodeType": "StructuredDocumentation", - "src": "1406:117:41", - "text": " @notice Initialize v2.1\n @param lostAndFound The address to which the locked funds are sent" - }, - "functionSelector": "2fc81e09", - "implemented": true, - "kind": "function", - "modifiers": [], - "name": "initializeV2_1", - "overrides": null, - "parameters": { - "id": 47325, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 47324, - "mutability": "mutable", - "name": "lostAndFound", - "nodeType": "VariableDeclaration", - "overrides": null, - "scope": 47370, - "src": "1552:20:41", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 47323, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "1552:7:41", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "1551:22:41" - }, - "returnParameters": { - "id": 47326, - "nodeType": "ParameterList", - "parameters": [], - "src": "1583:0:41" - }, - "scope": 47380, - "stateMutability": "nonpayable", - "virtual": false, - "visibility": "external" - }, - { - "id": 47379, - "nodeType": "FunctionDefinition", - "src": "2040:84:41", - "nodes": [], - "body": { - "id": 47378, - "nodeType": "Block", - "src": "2097:27:41", - "nodes": [], - "statements": [ - { - "expression": { - "argumentTypes": null, - "hexValue": "32", - "id": 47376, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "string", - "lValueRequested": false, - "nodeType": "Literal", - "src": "2114:3:41", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_stringliteral_ad7c5bef027816a800da1736444fb58a807ef4c9603b7848673f7e3a68eb14a5", - "typeString": "literal_string \"2\"" - }, - "value": "2" - }, - "functionReturnParameters": 47375, - "id": 47377, - "nodeType": "Return", - "src": "2107:10:41" - } - ] - }, - "documentation": { - "id": 47371, - "nodeType": "StructuredDocumentation", - "src": "1932:103:41", - "text": " @notice Version string for the EIP712 domain separator\n @return Version string" - }, - "functionSelector": "54fd4d50", - "implemented": true, - "kind": "function", - "modifiers": [], - "name": "version", - "overrides": null, - "parameters": { - "id": 47372, - "nodeType": "ParameterList", - "parameters": [], - "src": "2056:2:41" - }, - "returnParameters": { - "id": 47375, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 47374, - "mutability": "mutable", - "name": "", - "nodeType": "VariableDeclaration", - "overrides": null, - "scope": 47379, - "src": "2082:13:41", - "stateVariable": false, - "storageLocation": "memory", - "typeDescriptions": { - "typeIdentifier": "t_string_memory_ptr", - "typeString": "string" - }, - "typeName": { - "id": 47373, - "name": "string", - "nodeType": "ElementaryTypeName", - "src": "2082:6:41", - "typeDescriptions": { - "typeIdentifier": "t_string_storage_ptr", - "typeString": "string" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "2081:15:41" - }, - "scope": 47380, - "stateMutability": "view", - "virtual": false, - "visibility": "external" - } - ], - "abstract": false, - "baseContracts": [ - { - "arguments": null, - "baseName": { - "contractScope": null, - "id": 47320, - "name": "FiatTokenV2", - "nodeType": "UserDefinedTypeName", - "referencedDeclaration": 47314, - "src": "1388:11:41", - "typeDescriptions": { - "typeIdentifier": "t_contract$_FiatTokenV2_$47314", - "typeString": "contract FiatTokenV2" - } - }, - "id": 47321, - "nodeType": "InheritanceSpecifier", - "src": "1388:11:41" - } - ], - "contractDependencies": [ - 45337, 45426, 45451, 45582, 46359, 46443, 46543, 46568, 46663, 46995, - 47002, 47314, 47654 - ], - "contractKind": "contract", - "documentation": { - "id": 47319, - "nodeType": "StructuredDocumentation", - "src": "1269:92:41", - "text": " @title FiatToken V2.1\n @notice ERC20 Token backed by fiat reserves, version 2.1" - }, - "fullyImplemented": true, - "linearizedBaseContracts": [ - 47380, 47314, 46663, 46995, 47002, 46568, 45337, 45426, 46359, 45582, - 46543, 46443, 45451, 47654 - ], - "name": "FiatTokenV2_1", - "scope": 47381 - } - ], - "license": "MIT" - }, - "id": 41 -} diff --git a/packages/protocol/contracts/compiled/README.md b/packages/protocol/contracts/compiled/README.md deleted file mode 100644 index f8767494803..00000000000 --- a/packages/protocol/contracts/compiled/README.md +++ /dev/null @@ -1,24 +0,0 @@ -## About the compiled contracts - -Following Circle's recommendation for native token support (USDC, EURC), one needs to follow the standard proposed below: - -https://github.com/circlefin/stablecoin-evm/blob/master/doc/bridged_USDC_standard.md - -According to this document: - -> The third-party team’s bridged USDC token contract is expected to be identical to native USDC token contracts on other EVM blockchains. USDC uses a proxy pattern, so the standard applies to both the implementation contract code and the token proxy. -> -> Using identical code facilitates trustless contract verification by Circle and supports a seamless integration with existing USDC services. To facilitate this, the third-party team may choose one of the following: -> -> Copy previously deployed bytecode from a recent, native USDC token contract deployment (both proxy and implementation) on an EVM blockchain, for example Arbitrum, Base, OP Mainnet, or Polygon PoS Note that you must supply different constructor and initializer parameters where needed. -> -> Build the FiatToken contracts from source. In this case, the compiler metadata must be published or made available to support full contract verification. Various suggested compiler settings that Circle uses can be found here, which will allow the third-party team to reach the same bytecode if followed consistently. - -Following the recommendations the contracts were built with the same compiler settings (version + optimization) and they have bytecode equivalence with the other contracts (mentioned in the doc, and can be found on links below (Arbitrum, Scroll, Polygon, etc.)). - -For reference, here are Arbitrum's proxy + token contracts: - -- Proxy: https://arbiscan.io/token/0xaf88d065e77c8cc2239327c5edb3a432268e5831#code -- Implementation: https://arbiscan.io/address/0x0f4fb9474303d10905AB86aA8d5A65FE44b6E04A#code - -As a cross-reference, one can compare the bytecode of the ones present on arbiscan and here in the .json files (under bytcode key), the additional (meta)data could be helpful for contracts verification. diff --git a/packages/protocol/contracts/automata-attestation/AutomataDcapV3Attestation.sol b/packages/protocol/contracts/layer1/automata-attestation/AutomataDcapV3Attestation.sol similarity index 95% rename from packages/protocol/contracts/automata-attestation/AutomataDcapV3Attestation.sol rename to packages/protocol/contracts/layer1/automata-attestation/AutomataDcapV3Attestation.sol index 900ade36002..4b019c4723c 100644 --- a/packages/protocol/contracts/automata-attestation/AutomataDcapV3Attestation.sol +++ b/packages/protocol/contracts/layer1/automata-attestation/AutomataDcapV3Attestation.sol @@ -1,23 +1,18 @@ //SPDX-License-Identifier: MIT -pragma solidity 0.8.24; - -import { V3Struct } from "./lib/QuoteV3Auth/V3Struct.sol"; -import { V3Parser } from "./lib/QuoteV3Auth/V3Parser.sol"; -import { IPEMCertChainLib } from "./lib/interfaces/IPEMCertChainLib.sol"; -import { PEMCertChainLib } from "./lib/PEMCertChainLib.sol"; -import { TCBInfoStruct } from "./lib/TCBInfoStruct.sol"; -import { EnclaveIdStruct } from "./lib/EnclaveIdStruct.sol"; -import { IAttestation } from "./interfaces/IAttestation.sol"; - -// Internal Libraries -import { Base64 } from "solady/src/utils/Base64.sol"; -import { LibString } from "solady/src/utils/LibString.sol"; -import { BytesUtils } from "./utils/BytesUtils.sol"; - -// External Libraries -import { ISigVerifyLib } from "./interfaces/ISigVerifyLib.sol"; - -import { EssentialContract } from "../common/EssentialContract.sol"; +pragma solidity ^0.8.24; + +import "solady/src/utils/Base64.sol"; +import "solady/src/utils/LibString.sol"; +import "src/shared/common/EssentialContract.sol"; +import "./lib/QuoteV3Auth/V3Struct.sol"; +import "./lib/QuoteV3Auth/V3Parser.sol"; +import "./lib/interfaces/IPEMCertChainLib.sol"; +import "./lib/PEMCertChainLib.sol"; +import "./lib/TCBInfoStruct.sol"; +import "./lib/EnclaveIdStruct.sol"; +import "./interfaces/IAttestation.sol"; +import "./utils/BytesUtils.sol"; +import "./interfaces/ISigVerifyLib.sol"; /// @title AutomataDcapV3Attestation /// @custom:security-contact security@taiko.xyz diff --git a/packages/protocol/contracts/layer1/automata-attestation/README.md b/packages/protocol/contracts/layer1/automata-attestation/README.md new file mode 100644 index 00000000000..473a73033de --- /dev/null +++ b/packages/protocol/contracts/layer1/automata-attestation/README.md @@ -0,0 +1,4 @@ +# Readme + +Original code (main branch) forked from https://github.com/automata-network/automata-dcap-v3-attestation and applying some gas optimizations here: https://github.com/smtmfft/automata-dcap-v3-attestation/tree/parse-quote-offline, which then was merged into taiko-mono. +The corresponding upstream PR is: https://github.com/automata-network/automata-dcap-v3-attestation/pull/6, waiting to be merged. diff --git a/packages/protocol/contracts/automata-attestation/interfaces/IAttestation.sol b/packages/protocol/contracts/layer1/automata-attestation/interfaces/IAttestation.sol similarity index 80% rename from packages/protocol/contracts/automata-attestation/interfaces/IAttestation.sol rename to packages/protocol/contracts/layer1/automata-attestation/interfaces/IAttestation.sol index 7f918de6e2c..8059b9216b3 100644 --- a/packages/protocol/contracts/automata-attestation/interfaces/IAttestation.sol +++ b/packages/protocol/contracts/layer1/automata-attestation/interfaces/IAttestation.sol @@ -1,7 +1,7 @@ //SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; -import { V3Struct } from "../lib/QuoteV3Auth/V3Struct.sol"; +import "../lib/QuoteV3Auth/V3Struct.sol"; /// @title IAttestation /// @custom:security-contact security@taiko.xyz diff --git a/packages/protocol/contracts/automata-attestation/interfaces/ISigVerifyLib.sol b/packages/protocol/contracts/layer1/automata-attestation/interfaces/ISigVerifyLib.sol similarity index 92% rename from packages/protocol/contracts/automata-attestation/interfaces/ISigVerifyLib.sol rename to packages/protocol/contracts/layer1/automata-attestation/interfaces/ISigVerifyLib.sol index 5f407625cad..3170d0649a9 100644 --- a/packages/protocol/contracts/automata-attestation/interfaces/ISigVerifyLib.sol +++ b/packages/protocol/contracts/layer1/automata-attestation/interfaces/ISigVerifyLib.sol @@ -1,5 +1,5 @@ //SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; /// @title ISigVerifyLib /// @custom:security-contact security@taiko.xyz diff --git a/packages/protocol/contracts/automata-attestation/lib/EnclaveIdStruct.sol b/packages/protocol/contracts/layer1/automata-attestation/lib/EnclaveIdStruct.sol similarity index 96% rename from packages/protocol/contracts/automata-attestation/lib/EnclaveIdStruct.sol rename to packages/protocol/contracts/layer1/automata-attestation/lib/EnclaveIdStruct.sol index 3e889e084e5..d41be6d9671 100644 --- a/packages/protocol/contracts/automata-attestation/lib/EnclaveIdStruct.sol +++ b/packages/protocol/contracts/layer1/automata-attestation/lib/EnclaveIdStruct.sol @@ -1,5 +1,5 @@ //SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; /// @title EnclaveIdStruct /// @custom:security-contact security@taiko.xyz diff --git a/packages/protocol/contracts/automata-attestation/lib/PEMCertChainLib.sol b/packages/protocol/contracts/layer1/automata-attestation/lib/PEMCertChainLib.sol similarity index 97% rename from packages/protocol/contracts/automata-attestation/lib/PEMCertChainLib.sol rename to packages/protocol/contracts/layer1/automata-attestation/lib/PEMCertChainLib.sol index f69c3e0200c..768861942e0 100644 --- a/packages/protocol/contracts/automata-attestation/lib/PEMCertChainLib.sol +++ b/packages/protocol/contracts/layer1/automata-attestation/lib/PEMCertChainLib.sol @@ -1,11 +1,11 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; -import { LibString } from "solady/src/utils/LibString.sol"; -import { Asn1Decode, NodePtr } from "../utils/Asn1Decode.sol"; -import { BytesUtils } from "../utils/BytesUtils.sol"; -import { X509DateUtils } from "../utils/X509DateUtils.sol"; -import { IPEMCertChainLib } from "./interfaces/IPEMCertChainLib.sol"; +import "solady/src/utils/LibString.sol"; +import "../utils/Asn1Decode.sol"; +import "../utils/BytesUtils.sol"; +import "../utils/X509DateUtils.sol"; +import "./interfaces/IPEMCertChainLib.sol"; /// @title PEMCertChainLib /// @custom:security-contact security@taiko.xyz diff --git a/packages/protocol/contracts/automata-attestation/lib/QuoteV3Auth/V3Parser.sol b/packages/protocol/contracts/layer1/automata-attestation/lib/QuoteV3Auth/V3Parser.sol similarity index 97% rename from packages/protocol/contracts/automata-attestation/lib/QuoteV3Auth/V3Parser.sol rename to packages/protocol/contracts/layer1/automata-attestation/lib/QuoteV3Auth/V3Parser.sol index 4e574b7eec9..773c07d551c 100644 --- a/packages/protocol/contracts/automata-attestation/lib/QuoteV3Auth/V3Parser.sol +++ b/packages/protocol/contracts/layer1/automata-attestation/lib/QuoteV3Auth/V3Parser.sol @@ -1,10 +1,10 @@ //SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; -import { Base64 } from "solady/src/utils/Base64.sol"; -import { BytesUtils } from "../../utils/BytesUtils.sol"; -import { IPEMCertChainLib, PEMCertChainLib } from "../../lib/PEMCertChainLib.sol"; -import { V3Struct } from "./V3Struct.sol"; +import "solady/src/utils/Base64.sol"; +import "../../utils/BytesUtils.sol"; +import "../../lib/PEMCertChainLib.sol"; +import "./V3Struct.sol"; /// @title V3Parser /// @custom:security-contact security@taiko.xyz diff --git a/packages/protocol/contracts/automata-attestation/lib/QuoteV3Auth/V3Struct.sol b/packages/protocol/contracts/layer1/automata-attestation/lib/QuoteV3Auth/V3Struct.sol similarity index 98% rename from packages/protocol/contracts/automata-attestation/lib/QuoteV3Auth/V3Struct.sol rename to packages/protocol/contracts/layer1/automata-attestation/lib/QuoteV3Auth/V3Struct.sol index 3fbf799c8fc..9ecb7572947 100644 --- a/packages/protocol/contracts/automata-attestation/lib/QuoteV3Auth/V3Struct.sol +++ b/packages/protocol/contracts/layer1/automata-attestation/lib/QuoteV3Auth/V3Struct.sol @@ -1,5 +1,5 @@ //SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; /// @title V3Struct /// @custom:security-contact security@taiko.xyz diff --git a/packages/protocol/contracts/automata-attestation/lib/TCBInfoStruct.sol b/packages/protocol/contracts/layer1/automata-attestation/lib/TCBInfoStruct.sol similarity index 96% rename from packages/protocol/contracts/automata-attestation/lib/TCBInfoStruct.sol rename to packages/protocol/contracts/layer1/automata-attestation/lib/TCBInfoStruct.sol index f40c05bdef5..b450853c5b4 100644 --- a/packages/protocol/contracts/automata-attestation/lib/TCBInfoStruct.sol +++ b/packages/protocol/contracts/layer1/automata-attestation/lib/TCBInfoStruct.sol @@ -1,5 +1,5 @@ //SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; /// @title TCBInfoStruct /// @custom:security-contact security@taiko.xyz diff --git a/packages/protocol/contracts/automata-attestation/lib/interfaces/IPEMCertChainLib.sol b/packages/protocol/contracts/layer1/automata-attestation/lib/interfaces/IPEMCertChainLib.sol similarity index 97% rename from packages/protocol/contracts/automata-attestation/lib/interfaces/IPEMCertChainLib.sol rename to packages/protocol/contracts/layer1/automata-attestation/lib/interfaces/IPEMCertChainLib.sol index 7f728558bda..eeca3b92947 100644 --- a/packages/protocol/contracts/automata-attestation/lib/interfaces/IPEMCertChainLib.sol +++ b/packages/protocol/contracts/layer1/automata-attestation/lib/interfaces/IPEMCertChainLib.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; /// @title IPEMCertChainLib /// @custom:security-contact security@taiko.xyz diff --git a/packages/protocol/contracts/automata-attestation/utils/Asn1Decode.sol b/packages/protocol/contracts/layer1/automata-attestation/utils/Asn1Decode.sol similarity index 99% rename from packages/protocol/contracts/automata-attestation/utils/Asn1Decode.sol rename to packages/protocol/contracts/layer1/automata-attestation/utils/Asn1Decode.sol index 94b165c6c76..30edd958e7f 100644 --- a/packages/protocol/contracts/automata-attestation/utils/Asn1Decode.sol +++ b/packages/protocol/contracts/layer1/automata-attestation/utils/Asn1Decode.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT // Original source: https://github.com/JonahGroendal/asn1-decode -pragma solidity 0.8.24; +pragma solidity ^0.8.24; // Inspired by PufferFinance/rave - Apache-2.0 license // https://github.com/JonahGroendal/asn1-decode/blob/5c2d1469fc678513753786acb441e597969192ec/contracts/Asn1Decode.sol diff --git a/packages/protocol/contracts/automata-attestation/utils/BytesUtils.sol b/packages/protocol/contracts/layer1/automata-attestation/utils/BytesUtils.sol similarity index 99% rename from packages/protocol/contracts/automata-attestation/utils/BytesUtils.sol rename to packages/protocol/contracts/layer1/automata-attestation/utils/BytesUtils.sol index f1711842248..22469685e0d 100644 --- a/packages/protocol/contracts/automata-attestation/utils/BytesUtils.sol +++ b/packages/protocol/contracts/layer1/automata-attestation/utils/BytesUtils.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BSD 2-Clause License -pragma solidity 0.8.24; +pragma solidity ^0.8.24; // Inspired by ensdomains/dnssec-oracle - BSD-2-Clause license // https://github.com/ensdomains/dnssec-oracle/blob/master/contracts/BytesUtils.sol diff --git a/packages/protocol/contracts/automata-attestation/utils/SHA1.sol b/packages/protocol/contracts/layer1/automata-attestation/utils/SHA1.sol similarity index 99% rename from packages/protocol/contracts/automata-attestation/utils/SHA1.sol rename to packages/protocol/contracts/layer1/automata-attestation/utils/SHA1.sol index 856e841f90a..6c39a7d25dc 100644 --- a/packages/protocol/contracts/automata-attestation/utils/SHA1.sol +++ b/packages/protocol/contracts/layer1/automata-attestation/utils/SHA1.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: BSD 2-Clause License -pragma solidity 0.8.24; +pragma solidity ^0.8.24; // Inspired by ensdomains/solsha1 - BSD 2-Clause License // https://github.com/ensdomains/solsha1/blob/master/contracts/SHA1.sol diff --git a/packages/protocol/contracts/automata-attestation/utils/SigVerifyLib.sol b/packages/protocol/contracts/layer1/automata-attestation/utils/SigVerifyLib.sol similarity index 98% rename from packages/protocol/contracts/automata-attestation/utils/SigVerifyLib.sol rename to packages/protocol/contracts/layer1/automata-attestation/utils/SigVerifyLib.sol index 80c99cb0b9e..85bae00b99d 100644 --- a/packages/protocol/contracts/automata-attestation/utils/SigVerifyLib.sol +++ b/packages/protocol/contracts/layer1/automata-attestation/utils/SigVerifyLib.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: GPL-3.0 -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import "../interfaces/ISigVerifyLib.sol"; import "./BytesUtils.sol"; diff --git a/packages/protocol/contracts/automata-attestation/utils/X509DateUtils.sol b/packages/protocol/contracts/layer1/automata-attestation/utils/X509DateUtils.sol similarity index 99% rename from packages/protocol/contracts/automata-attestation/utils/X509DateUtils.sol rename to packages/protocol/contracts/layer1/automata-attestation/utils/X509DateUtils.sol index dbbcb44ae71..ac7ef6bc961 100644 --- a/packages/protocol/contracts/automata-attestation/utils/X509DateUtils.sol +++ b/packages/protocol/contracts/layer1/automata-attestation/utils/X509DateUtils.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; /// @title X509DateUtils /// @custom:security-contact security@taiko.xyz diff --git a/packages/protocol/contracts/layer1/based/ITaikoL1.sol b/packages/protocol/contracts/layer1/based/ITaikoL1.sol new file mode 100644 index 00000000000..a3d1d02e660 --- /dev/null +++ b/packages/protocol/contracts/layer1/based/ITaikoL1.sol @@ -0,0 +1,97 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "./TaikoData.sol"; + +/// @title ITaikoL1 +/// @custom:security-contact security@taiko.xyz +interface ITaikoL1 { + /// @notice Proposes a Taiko L2 block (version 2) + /// @param _params Block parameters, an encoded BlockParamsV2 object. + /// @param _txList txList data if calldata is used for DA. + /// @return meta_ The metadata of the proposed L2 block. + function proposeBlockV2( + bytes calldata _params, + bytes calldata _txList + ) + external + returns (TaikoData.BlockMetadataV2 memory meta_); + + /// @notice Proposes multiple Taiko L2 blocks (version 2) + /// @param _paramsArr A list of encoded BlockParamsV2 objects. + /// @param _txListArr A list of txList. + /// @return metaArr_ The metadata objects of the proposed L2 blocks. + function proposeBlocksV2( + bytes[] calldata _paramsArr, + bytes[] calldata _txListArr + ) + external + returns (TaikoData.BlockMetadataV2[] memory metaArr_); + + /// @notice Proves or contests a block transition. + /// @param _blockId Index of the block to prove. This is also used to select the right + /// implementation version. + /// @param _input ABI-encoded (TaikoData.BlockMetadata, TaikoData.Transition, + /// TaikoData.TierProof) tuple. + function proveBlock(uint64 _blockId, bytes calldata _input) external; + + /// @notice Proves or contests multiple block transitions (version 2) + /// @param _blockIds The indices of the blocks to prove. + /// @param _inputs An list of abi-encoded (TaikoData.BlockMetadata, TaikoData.Transition, + /// TaikoData.TierProof) tuples. + /// @param _batchProof An abi-encoded TaikoData.TierProof that contains the batch/aggregated + /// proof for the given blocks. + function proveBlocks( + uint64[] calldata _blockIds, + bytes[] calldata _inputs, + bytes calldata _batchProof + ) + external; + + /// @notice Verifies up to a specified number of blocks. + /// @param _maxBlocksToVerify Maximum number of blocks to verify. + function verifyBlocks(uint64 _maxBlocksToVerify) external; + + /// @notice Pauses or unpauses block proving. + /// @param _pause True to pause, false to unpause. + function pauseProving(bool _pause) external; + + /// @notice Deposits bond ERC20 token or Ether. + /// @param _amount The amount of Taiko token to deposit. + function depositBond(uint256 _amount) external payable; + + /// @notice Withdraws bond ERC20 token or Ether. + /// @param _amount Amount of Taiko tokens to withdraw. + function withdrawBond(uint256 _amount) external; + + /// @notice Gets the prover that actually proved a verified block. + /// @param _blockId Index of the block. + /// @return The prover's address. If the block is not verified yet, address(0) will be returned. + function getVerifiedBlockProver(uint64 _blockId) external view returns (address); + + /// @notice Gets the details of a block. + /// @param _blockId Index of the block. + /// @return blk_ The block. + function getBlockV2(uint64 _blockId) external view returns (TaikoData.BlockV2 memory blk_); + + /// @notice Gets the state transition for a specific block. + /// @param _blockId Index of the block. + /// @param _tid The transition id. + /// @return The state transition data of the block. The transition's state root will be zero if + /// the block is not a sync-block. + function getTransition( + uint64 _blockId, + uint32 _tid + ) + external + view + returns (TaikoData.TransitionState memory); + + /// @notice Retrieves the ID of the L1 block where the most recent L2 block was proposed. + /// @return The ID of the Li block where the most recent block was proposed. + function lastProposedIn() external view returns (uint56); + + /// @notice Gets the configuration of the TaikoL1 contract. + /// @return Config struct containing configuration parameters. + function getConfig() external pure returns (TaikoData.Config memory); +} diff --git a/packages/protocol/contracts/layer1/based/LibBonds.sol b/packages/protocol/contracts/layer1/based/LibBonds.sol new file mode 100644 index 00000000000..64aceb36e94 --- /dev/null +++ b/packages/protocol/contracts/layer1/based/LibBonds.sol @@ -0,0 +1,164 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; + +import "src/shared/common/IAddressResolver.sol"; +import "src/shared/common/LibAddress.sol"; +import "src/shared/common/LibStrings.sol"; +import "./TaikoData.sol"; + +/// @title LibBonds +/// @notice A library that offers helper functions to handle bonds. +/// @custom:security-contact security@taiko.xyz +library LibBonds { + /// @dev Emitted when tokens are deposited into a user's bond balance. + /// @param user The address of the user who deposited the tokens. + /// @param amount The amount of tokens deposited. + event BondDeposited(address indexed user, uint256 amount); + + /// @dev Emitted when tokens are withdrawn from a user's bond balance. + /// @param user The address of the user who withdrew the tokens. + /// @param amount The amount of tokens withdrawn. + event BondWithdrawn(address indexed user, uint256 amount); + + /// @dev Emitted when a token is credited back to a user's bond balance. + /// @param user The address of the user whose bond balance is credited. + /// @param blockId The ID of the block to credit for. + /// @param amount The amount of tokens credited. + event BondCredited(address indexed user, uint256 blockId, uint256 amount); + + /// @dev Emitted when a token is debited from a user's bond balance. + /// @param user The address of the user whose bond balance is debited. + /// @param blockId The ID of the block to debit for. + /// @param amount The amount of tokens debited. + event BondDebited(address indexed user, uint256 blockId, uint256 amount); + + error L1_INVALID_MSG_VALUE(); + error L1_ETH_NOT_PAID_AS_BOND(); + + /// @dev Deposits TAIKO tokens to be used as bonds. + /// @param _state Pointer to the protocol's storage. + /// @param _resolver The address resolver. + /// @param _amount The amount of tokens to deposit. + function depositBond( + TaikoData.State storage _state, + IAddressResolver _resolver, + uint256 _amount + ) + public + { + _state.bondBalance[msg.sender] += _amount; + _handleDeposit(_resolver, msg.sender, _amount); + } + + /// @dev Withdraws TAIKO tokens. + /// @param _state Pointer to the protocol's storage. + /// @param _resolver The address resolver. + /// @param _amount The amount of tokens to withdraw. + function withdrawBond( + TaikoData.State storage _state, + IAddressResolver _resolver, + uint256 _amount + ) + public + { + emit BondWithdrawn(msg.sender, _amount); + _state.bondBalance[msg.sender] -= _amount; + + address bondToken = _bondToken(_resolver); + if (bondToken != address(0)) { + IERC20(bondToken).transfer(msg.sender, _amount); + } else { + LibAddress.sendEtherAndVerify(msg.sender, _amount); + } + } + + /// @dev Gets a user's current TAIKO token bond balance. + /// @param _state Pointer to the protocol's storage. + /// @param _user The address of the user. + /// @return The current token balance. + function bondBalanceOf( + TaikoData.State storage _state, + address _user + ) + public + view + returns (uint256) + { + return _state.bondBalance[_user]; + } + + /// @dev Debits TAIKO tokens as bonds. + /// @param _state Pointer to the protocol's storage. + /// @param _resolver The address resolver. + /// @param _user The address of the user to debit. + /// @param _blockId The ID of the block to debit for. + /// @param _amount The amount of tokens to debit. + function debitBond( + TaikoData.State storage _state, + IAddressResolver _resolver, + address _user, + uint256 _blockId, + uint256 _amount + ) + internal + { + if (_amount == 0) return; + + uint256 balance = _state.bondBalance[_user]; + if (balance >= _amount) { + unchecked { + _state.bondBalance[_user] = balance - _amount; + } + } else { + // Note that the following function call will revert if bond asset is Ether. + _handleDeposit(_resolver, _user, _amount); + } + emit BondDebited(_user, _blockId, _amount); + } + + /// @dev Credits TAIKO tokens to a user's bond balance. + /// @param _state Pointer to the protocol's storage. + /// @param _user The address of the user to credit. + /// @param _blockId The ID of the block to credit for. + /// @param _amount The amount of tokens to credit. + function creditBond( + TaikoData.State storage _state, + address _user, + uint256 _blockId, + uint256 _amount + ) + internal + { + if (_amount == 0) return; + unchecked { + _state.bondBalance[_user] += _amount; + } + emit BondCredited(_user, _blockId, _amount); + } + + /// @dev Handles the deposit of bond tokens or Ether. + /// @param _resolver The address resolver. + /// @param _user The user who made the deposit + /// @param _amount The amount of tokens or Ether to deposit. + function _handleDeposit(IAddressResolver _resolver, address _user, uint256 _amount) private { + address bondToken = _bondToken(_resolver); + + if (bondToken != address(0)) { + require(msg.value == 0, L1_INVALID_MSG_VALUE()); + IERC20(bondToken).transferFrom(_user, address(this), _amount); + } else { + require(msg.value == _amount, L1_ETH_NOT_PAID_AS_BOND()); + } + emit BondDeposited(_user, _amount); + } + + /// @dev Resolves the bond token address using the address resolver, returns address(0) if Ether + /// is used as bond asset. + /// @param _resolver The address resolver. + /// @return The IERC20 interface of the TAIKO token. + function _bondToken(IAddressResolver _resolver) private view returns (address) { + return _resolver.resolve(LibStrings.B_BOND_TOKEN, true); + } +} diff --git a/packages/protocol/contracts/layer1/based/LibData.sol b/packages/protocol/contracts/layer1/based/LibData.sol new file mode 100644 index 00000000000..c6881f67a49 --- /dev/null +++ b/packages/protocol/contracts/layer1/based/LibData.sol @@ -0,0 +1,49 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "../verifiers/IVerifier.sol"; +import "./TaikoData.sol"; + +/// @title LibData +/// @notice A library that offers helper functions for data conversion. +/// @custom:security-contact security@taiko.xyz +library LibData { + /// @dev Converts a BlockV2 struct to a Block struct. + /// @param _v2 The BlockV2 struct to convert. + /// @return The converted Block struct. + function blockV2ToV1(TaikoData.BlockV2 memory _v2) + public + pure + returns (TaikoData.Block memory) + { + return TaikoData.Block({ + metaHash: _v2.metaHash, + assignedProver: address(0), // assigned prover is now meta.proposer. + livenessBond: 0, // liveness bond is now meta.livenessBond + blockId: _v2.blockId, + proposedAt: 0, + proposedIn: 0, + nextTransitionId: _v2.nextTransitionId, + verifiedTransitionId: _v2.verifiedTransitionId + }); + } + + /// @dev Converts a ContextV2 struct to a Context struct. + /// @param _v2 The ContextV2 struct to convert. + /// @return The converted Context struct. + function verifierContextV2ToV1(IVerifier.ContextV2 memory _v2) + internal + pure + returns (IVerifier.Context memory) + { + return IVerifier.Context({ + metaHash: _v2.metaHash, + blobHash: _v2.blobHash, + prover: _v2.prover, + blockId: _v2.blockId, + isContesting: _v2.isContesting, + blobUsed: _v2.blobUsed, + msgSender: _v2.msgSender + }); + } +} diff --git a/packages/protocol/contracts/layer1/based/LibProposing.sol b/packages/protocol/contracts/layer1/based/LibProposing.sol new file mode 100644 index 00000000000..4f6788a480b --- /dev/null +++ b/packages/protocol/contracts/layer1/based/LibProposing.sol @@ -0,0 +1,312 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "src/shared/common/LibAddress.sol"; +import "src/shared/common/LibNetwork.sol"; +import "./LibBonds.sol"; +import "./LibData.sol"; +import "./LibUtils.sol"; +import "./LibVerifying.sol"; + +/// @title LibProposing +/// @notice A library that offers helper functions for block proposals. +/// @custom:security-contact security@taiko.xyz +library LibProposing { + using LibAddress for address; + + uint256 internal constant SECONDS_PER_BLOCK = 12; + + struct Local { + TaikoData.SlotB b; + TaikoData.BlockParamsV2 params; + ITierProvider tierProvider; + bytes32 parentMetaHash; + bool allowCustomProposer; + } + + /// @dev Emitted when a block is proposed. + /// @param blockId The ID of the proposed block. + /// @param meta The metadata of the proposed block. + event BlockProposedV2(uint256 indexed blockId, TaikoData.BlockMetadataV2 meta); + + /// @dev Emitted when a block's txList is in the calldata. + /// @param blockId The ID of the proposed block. + /// @param txList The txList. + event CalldataTxList(uint256 indexed blockId, bytes txList); + + error L1_BLOB_NOT_AVAILABLE(); + error L1_BLOB_NOT_FOUND(); + error L1_FORK_HEIGHT_ERROR(); + error L1_INVALID_ANCHOR_BLOCK(); + error L1_INVALID_CUSTOM_PROPOSER(); + error L1_INVALID_PARAMS(); + error L1_INVALID_PROPOSER(); + error L1_INVALID_TIMESTAMP(); + error L1_TOO_MANY_BLOCKS(); + error L1_UNEXPECTED_PARENT(); + + /// @dev Proposes multiple Taiko L2 blocks. + /// @param _state Pointer to the protocol's storage. + /// @param _config The configuration parameters for the Taiko protocol. + /// @param _resolver The address resolver. + /// @param _paramsArr An array of encoded data bytes containing the block parameters. + /// @param _txListArr An array of transaction list bytes (if not blob). + /// @return metas_ An array of metadata objects for the proposed L2 blocks (version 2). + function proposeBlocks( + TaikoData.State storage _state, + TaikoData.Config memory _config, + IAddressResolver _resolver, + bytes[] calldata _paramsArr, + bytes[] calldata _txListArr + ) + internal + returns (TaikoData.BlockMetadataV2[] memory metas_) + { + if (_paramsArr.length == 0 || _paramsArr.length != _txListArr.length) { + revert L1_INVALID_PARAMS(); + } + + metas_ = new TaikoData.BlockMetadataV2[](_paramsArr.length); + + for (uint256 i; i < _paramsArr.length; ++i) { + metas_[i] = _proposeBlock(_state, _config, _resolver, _paramsArr[i], _txListArr[i]); + } + + if (!_state.slotB.provingPaused) { + for (uint256 i; i < _paramsArr.length; ++i) { + if (LibUtils.shouldVerifyBlocks(_config, metas_[i].id, false)) { + LibVerifying.verifyBlocks(_state, _config, _resolver, _config.maxBlocksToVerify); + } + } + } + } + + /// @dev Proposes a single Taiko L2 block. + /// @param _state Pointer to the protocol's storage. + /// @param _config The configuration parameters for the Taiko protocol. + /// @param _resolver The address resolver. + /// @param _params Encoded data bytes containing the block parameters. + /// @param _txList Transaction list bytes (if not blob). + /// @return meta_ The metadata of the proposed block (version 2). + function proposeBlock( + TaikoData.State storage _state, + TaikoData.Config memory _config, + IAddressResolver _resolver, + bytes calldata _params, + bytes calldata _txList + ) + internal + returns (TaikoData.BlockMetadataV2 memory meta_) + { + meta_ = _proposeBlock(_state, _config, _resolver, _params, _txList); + + if (!_state.slotB.provingPaused) { + if (LibUtils.shouldVerifyBlocks(_config, meta_.id, false)) { + LibVerifying.verifyBlocks(_state, _config, _resolver, _config.maxBlocksToVerify); + } + } + } + + /// @dev Proposes a single Taiko L2 block. + /// @param _state Pointer to the protocol's storage. + /// @param _config The configuration parameters for the Taiko protocol. + /// @param _resolver The address resolver. + /// @param _params Encoded data bytes containing the block parameters. + /// @param _txList Transaction list bytes (if not blob). + /// @return meta_ The metadata of the proposed block (version 2). + function _proposeBlock( + TaikoData.State storage _state, + TaikoData.Config memory _config, + IAddressResolver _resolver, + bytes calldata _params, + bytes calldata _txList + ) + private + returns (TaikoData.BlockMetadataV2 memory meta_) + { + // Checks proposer access. + Local memory local; + local.b = _state.slotB; + + // It's essential to ensure that the ring buffer for proposed blocks still has space for at + // least one more block. + require(local.b.numBlocks >= _config.ontakeForkHeight, L1_FORK_HEIGHT_ERROR()); + + unchecked { + require( + local.b.numBlocks < local.b.lastVerifiedBlockId + _config.blockMaxProposals + 1, + L1_TOO_MANY_BLOCKS() + ); + } + + address preconfTaskManager = _resolver.resolve(LibStrings.B_PRECONF_TASK_MANAGER, true); + if (preconfTaskManager != address(0)) { + require(preconfTaskManager == msg.sender, L1_INVALID_PROPOSER()); + local.allowCustomProposer = true; + } + + if (_params.length != 0) { + local.params = abi.decode(_params, (TaikoData.BlockParamsV2)); + } + + _validateParams(_state, _config, local); + + // Initialize metadata to compute a metaHash, which forms a part of the block data to be + // stored on-chain for future integrity checks. If we choose to persist all data fields in + // the metadata, it will require additional storage slots. + meta_ = TaikoData.BlockMetadataV2({ + anchorBlockHash: blockhash(local.params.anchorBlockId), + difficulty: keccak256(abi.encode("TAIKO_DIFFICULTY", local.b.numBlocks)), + blobHash: 0, // to be initialized below + // Encode _config.baseFeeConfig into extraData to allow L2 block execution without + // metadata. Metadata might be unavailable until the block is proposed on-chain. In + // preconfirmation scenarios, multiple blocks may be built but not yet proposed, making + // metadata unavailable. + extraData: _encodeBaseFeeConfig(_config.baseFeeConfig), + coinbase: local.params.coinbase, + id: local.b.numBlocks, + gasLimit: _config.blockMaxGasLimit, + timestamp: local.params.timestamp, + anchorBlockId: local.params.anchorBlockId, + minTier: 0, // to be initialized below + blobUsed: _txList.length == 0, + parentMetaHash: local.params.parentMetaHash, + proposer: local.params.proposer, + livenessBond: _config.livenessBond, + proposedAt: uint64(block.timestamp), + proposedIn: uint64(block.number), + blobTxListOffset: local.params.blobTxListOffset, + blobTxListLength: local.params.blobTxListLength, + blobIndex: local.params.blobIndex, + baseFeeConfig: _config.baseFeeConfig + }); + + // Update certain meta fields + if (meta_.blobUsed) { + require(LibNetwork.isDencunSupported(block.chainid), L1_BLOB_NOT_AVAILABLE()); + meta_.blobHash = blobhash(local.params.blobIndex); + require(meta_.blobHash != 0, L1_BLOB_NOT_FOUND()); + } else { + meta_.blobHash = keccak256(_txList); + emit CalldataTxList(meta_.id, _txList); + } + + local.tierProvider = ITierProvider( + ITierRouter(_resolver.resolve(LibStrings.B_TIER_ROUTER, false)).getProvider( + local.b.numBlocks + ) + ); + + // Use the difficulty as a random number + meta_.minTier = local.tierProvider.getMinTier(meta_.proposer, uint256(meta_.difficulty)); + + // Create the block that will be stored onchain + TaikoData.BlockV2 memory blk = TaikoData.BlockV2({ + metaHash: keccak256(abi.encode(meta_)), + assignedProver: address(0), + livenessBond: 0, + blockId: local.b.numBlocks, + proposedAt: local.params.timestamp, // = params.timestamp post Ontake + proposedIn: local.params.anchorBlockId, // = params.anchorBlockId post Ontake + nextTransitionId: 1, // For a new block, the next transition ID is always 1, not 0. + livenessBondReturned: false, + // For unverified block, its verifiedTransitionId is always 0. + verifiedTransitionId: 0 + }); + + // Store the block in the ring buffer + _state.blocks[local.b.numBlocks % _config.blockRingBufferSize] = blk; + + // Increment the counter (cursor) by 1. + unchecked { + ++_state.slotB.numBlocks; + } + _state.slotB.lastProposedIn = uint56(block.number); + + LibBonds.debitBond(_state, _resolver, local.params.proposer, meta_.id, _config.livenessBond); + + emit BlockProposedV2(meta_.id, meta_); + } + + /// @dev Validates the parameters for proposing a block. + /// @param _state Pointer to the protocol's storage. + /// @param _config The configuration parameters for the Taiko protocol. + /// @param _local The local struct. + function _validateParams( + TaikoData.State storage _state, + TaikoData.Config memory _config, + Local memory _local + ) + private + view + { + unchecked { + if (_local.params.proposer == address(0)) { + _local.params.proposer = msg.sender; + } else { + require( + _local.params.proposer == msg.sender || _local.allowCustomProposer, + L1_INVALID_CUSTOM_PROPOSER() + ); + } + + if (_local.params.coinbase == address(0)) { + _local.params.coinbase = _local.params.proposer; + } + + if (_local.params.anchorBlockId == 0) { + _local.params.anchorBlockId = uint64(block.number - 1); + } + + if (_local.params.timestamp == 0) { + _local.params.timestamp = uint64(block.timestamp); + } + } + + // Verify params against the parent block. + TaikoData.BlockV2 storage parentBlk; + unchecked { + parentBlk = _state.blocks[(_local.b.numBlocks - 1) % _config.blockRingBufferSize]; + } + + // Verify the passed in L1 state block number to anchor. + require( + _local.params.anchorBlockId + _config.maxAnchorHeightOffset >= block.number, + L1_INVALID_ANCHOR_BLOCK() + ); + require(_local.params.anchorBlockId < block.number, L1_INVALID_ANCHOR_BLOCK()); + + // parentBlk.proposedIn is actually parent's params.anchorBlockId + require(_local.params.anchorBlockId >= parentBlk.proposedIn, L1_INVALID_ANCHOR_BLOCK()); + + // Verify the provided timestamp to anchor. Note that local.params.anchorBlockId and + // local.params.timestamp may not correspond to the same L1 block. + require( + _local.params.timestamp + _config.maxAnchorHeightOffset * SECONDS_PER_BLOCK + >= block.timestamp, + L1_INVALID_TIMESTAMP() + ); + require(_local.params.timestamp <= block.timestamp, L1_INVALID_TIMESTAMP()); + + // parentBlk.proposedAt is actually parent's params.timestamp + require(_local.params.timestamp >= parentBlk.proposedAt, L1_INVALID_TIMESTAMP()); + + // Check if parent block has the right meta hash. This is to allow the proposer to make sure + // the block builds on the expected latest chain state. + require( + _local.params.parentMetaHash == 0 || _local.params.parentMetaHash == parentBlk.metaHash, + L1_UNEXPECTED_PARENT() + ); + } + + /// @dev Encodes the base fee configuration into a bytes32. + /// @param _baseFeeConfig The base fee configuration. + /// @return The encoded base fee configuration. + function _encodeBaseFeeConfig(LibSharedData.BaseFeeConfig memory _baseFeeConfig) + private + pure + returns (bytes32) + { + return bytes32(uint256(_baseFeeConfig.sharingPctg)); + } +} diff --git a/packages/protocol/contracts/layer1/based/LibProving.sol b/packages/protocol/contracts/layer1/based/LibProving.sol new file mode 100644 index 00000000000..d5b26727daf --- /dev/null +++ b/packages/protocol/contracts/layer1/based/LibProving.sol @@ -0,0 +1,575 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "../verifiers/IVerifier.sol"; +import "./LibBonds.sol"; +import "./LibData.sol"; +import "./LibUtils.sol"; +import "./LibVerifying.sol"; + +/// @title LibProving +/// @notice A library that offers helper functions for proving and contesting block transitions. +/// @custom:security-contact security@taiko.xyz +library LibProving { + using LibMath for uint256; + + // A struct to get around stack too deep issue and to cache state variables for multiple reads. + struct Local { + TaikoData.SlotB b; + ITierProvider.Tier tier; + ITierProvider.Tier minTier; + TaikoData.BlockMetadataV2 meta; + TaikoData.TierProof proof; + bytes32 metaHash; + uint64 slot; + uint64 blockId; + uint24 tid; + bool lastUnpausedAt; + bool isTopTier; + bool inProvingWindow; + bool sameTransition; + } + + /// @dev Emitted when a transition is proved. + /// @param blockId The block ID. + /// @param tran The transition data. + /// @param prover The prover's address. + /// @param validityBond The validity bond amount. + /// @param tier The tier of the proof. + /// @param proposedIn The L1 block in which a transition is proved. + event TransitionProvedV2( + uint256 indexed blockId, + TaikoData.Transition tran, + address prover, + uint96 validityBond, + uint16 tier, + uint64 proposedIn + ); + + /// @dev Emitted when a transition is contested. + /// @param blockId The block ID. + /// @param tran The transition data. + /// @param contester The contester's address. + /// @param contestBond The contest bond amount. + /// @param tier The tier of the proof. + /// @param proposedIn The L1 block in which this L2 block is proposed. + event TransitionContestedV2( + uint256 indexed blockId, + TaikoData.Transition tran, + address contester, + uint96 contestBond, + uint16 tier, + uint64 proposedIn + ); + + /// @dev Emitted when proving is paused or unpaused. + /// @param paused The pause status. + event ProvingPaused(bool paused); + + error L1_ALREADY_CONTESTED(); + error L1_ALREADY_PROVED(); + error L1_BLOCK_MISMATCH(); + error L1_CANNOT_CONTEST(); + error L1_DIFF_VERIFIER(); + error L1_INVALID_BLOCK_ID(); + error L1_INVALID_PARAMS(); + error L1_INVALID_PAUSE_STATUS(); + error L1_INVALID_TIER(); + error L1_INVALID_TRANSITION(); + error L1_NOT_ASSIGNED_PROVER(); + error L1_PROVING_PAUSED(); + + /// @dev Pauses or unpauses the proving process. + /// @param _state Pointer to the protocol's storage. + /// @param _pause The pause status. + function pauseProving(TaikoData.State storage _state, bool _pause) public { + require(_state.slotB.provingPaused != _pause, L1_INVALID_PAUSE_STATUS()); + _state.slotB.provingPaused = _pause; + + if (!_pause) { + _state.slotB.lastUnpausedAt = uint64(block.timestamp); + } + emit ProvingPaused(_pause); + } + + /// @dev Proves or contests multiple Taiko L2 blocks. + /// @param _state Pointer to the protocol's storage. + /// @param _config The protocol's configuration. + /// @param _resolver The address resolver. + /// @param _blockIds The index of the block to prove. This is also used to select the right + /// implementation version. + /// @param _inputs A list of abi-encoded (TaikoData.BlockMetadataV2, TaikoData.Transition, + /// TaikoData.TierProof) tuple. + /// @param _batchProof A list of abi-encoded TaikoData.TierProof that contains the + /// batch/aggregated proof for the given blocks. + function proveBlocks( + TaikoData.State storage _state, + TaikoData.Config memory _config, + IAddressResolver _resolver, + uint64[] calldata _blockIds, + bytes[] calldata _inputs, + bytes calldata _batchProof + ) + public // Will reach contract size limit if changed to `internal` + { + require(_blockIds.length != 0, L1_INVALID_PARAMS()); + require(_blockIds.length == _inputs.length, L1_INVALID_PARAMS()); + + TaikoData.TierProof memory batchProof; + if (_batchProof.length != 0) { + batchProof = abi.decode(_batchProof, (TaikoData.TierProof)); + require(batchProof.tier != 0, L1_INVALID_TIER()); + } + + IVerifier.ContextV2[] memory ctxs = new IVerifier.ContextV2[](_blockIds.length); + bytes32 batchVerifierName; + bool batchVerifierNameSet; + + // This loop iterates over each block ID in the _blockIds array. For each block ID, it calls + // the _proveBlock function to get the context and verifier. + for (uint256 i; i < _blockIds.length; ++i) { + bytes32 _verifierName; + (ctxs[i], _verifierName) = + _proveBlock(_state, _config, _resolver, _blockIds[i], _inputs[i], batchProof); + + // Verify that if batchProof is used, the verifier is the same for all blocks. + if (batchProof.tier != 0) { + if (!batchVerifierNameSet) { + batchVerifierNameSet = true; + batchVerifierName = _verifierName; + } else { + require(batchVerifierName == _verifierName, L1_DIFF_VERIFIER()); + } + } + } + + // If batch verifier name is not empty, verify the batch proof. + if (batchVerifierName != LibStrings.B_TIER_OPTIMISTIC) { + IVerifier(_resolver.resolve(batchVerifierName, false)).verifyBatchProof( + ctxs, batchProof + ); + } + } + + /// @dev Proves or contests a single Taiko L2 block. + /// @param _state Pointer to the protocol's storage. + /// @param _config The protocol's configuration. + /// @param _resolver The address resolver. + /// @param _blockId The index of the block to prove. This is also used to select the right + /// implementation version. + /// @param _input An abi-encoded (TaikoData.BlockMetadataV2, TaikoData.Transition, + /// TaikoData.TierProof) tuple. + function proveBlock( + TaikoData.State storage _state, + TaikoData.Config memory _config, + IAddressResolver _resolver, + uint64 _blockId, + bytes calldata _input + ) + public // Will reach contract size limit if changed to `internal` + { + TaikoData.TierProof memory noBatchProof; + _proveBlock(_state, _config, _resolver, _blockId, _input, noBatchProof); + } + + /// @dev Proves or contests a single Taiko L2 block. + /// @param _state Pointer to the protocol's storage. + /// @param _config The protocol's configuration. + /// @param _resolver The address resolver. + /// @param _blockId The index of the block to prove. This is also used to select the right + /// implementation version. + /// @param _input An abi-encoded (TaikoData.BlockMetadataV2, TaikoData.Transition, + /// TaikoData.TierProof) tuple. + /// @param _batchProof An abi-encoded TaikoData.TierProof that contains the batch/aggregated + /// proof for the given blocks. + /// @return ctx_ The context of the verifier. + /// @return verifierName_ The name of the verifier. + function _proveBlock( + TaikoData.State storage _state, + TaikoData.Config memory _config, + IAddressResolver _resolver, + uint64 _blockId, + bytes calldata _input, + TaikoData.TierProof memory _batchProof + ) + private + returns (IVerifier.ContextV2 memory ctx_, bytes32 verifierName_) + { + Local memory local; + local.b = _state.slotB; + local.blockId = _blockId; + + if (_batchProof.tier == 0) { + // No batch proof is available, each transition is proving using a separate proof. + (local.meta, ctx_.tran, local.proof) = abi.decode( + _input, (TaikoData.BlockMetadataV2, TaikoData.Transition, TaikoData.TierProof) + ); + } else { + // All transitions are proving using the batch proof. + (local.meta, ctx_.tran) = + abi.decode(_input, (TaikoData.BlockMetadataV2, TaikoData.Transition)); + local.proof = _batchProof; + } + + require(ctx_.tran.parentHash != 0, L1_INVALID_TRANSITION()); + require(ctx_.tran.blockHash != 0, L1_INVALID_TRANSITION()); + require(ctx_.tran.stateRoot != 0, L1_INVALID_TRANSITION()); + + // Check that the block has been proposed but has not yet been verified. + require(_blockId == local.meta.id, L1_INVALID_BLOCK_ID()); + require(local.meta.id > local.b.lastVerifiedBlockId, L1_INVALID_BLOCK_ID()); + require(local.meta.id < local.b.numBlocks, L1_INVALID_BLOCK_ID()); + + local.slot = local.meta.id % _config.blockRingBufferSize; + TaikoData.BlockV2 storage blk = _state.blocks[local.slot]; + + local.metaHash = blk.metaHash; + + // Check the integrity of the block data. It's worth noting that in theory, this check may + // be skipped, but it's included for added caution. + require(local.metaHash == keccak256(abi.encode(local.meta)), L1_BLOCK_MISMATCH()); + + // Each transition is uniquely identified by the parentHash, with the blockHash and + // stateRoot open for later updates as higher-tier proofs become available. In cases where a + // transition with the specified parentHash does not exist, a new transition will be + // created. + TaikoData.TransitionState memory ts; + (local.tid, ts) = _fetchOrCreateTransition(_state, blk, ctx_.tran, local); + + // Reset a deprecated field. + ts.__reserved1 = 0; + + // The new proof must meet or exceed the minimum tier required by the block or the previous + // proof; it cannot be on a lower tier. + require(local.proof.tier != 0, L1_INVALID_TIER()); + require(local.proof.tier >= local.meta.minTier, L1_INVALID_TIER()); + require(local.proof.tier >= ts.tier, L1_INVALID_TIER()); + + // Retrieve the tier configurations. If the tier is not supported, the subsequent action + // will result in a revert. + { + ITierRouter tierRouter = ITierRouter(_resolver.resolve(LibStrings.B_TIER_ROUTER, false)); + ITierProvider tierProvider = ITierProvider(tierRouter.getProvider(local.blockId)); + + local.tier = tierProvider.getTier(local.proof.tier); + local.minTier = tierProvider.getTier(local.meta.minTier); + local.isTopTier = local.tier.contestBond == 0; + } + + local.inProvingWindow = !LibUtils.isPostDeadline({ + _tsTimestamp: ts.timestamp, + _lastUnpausedAt: local.b.lastUnpausedAt, + _windowMinutes: local.minTier.provingWindow + }); + + // Checks if only the assigned prover is permissioned to prove the block. The assigned + // prover is granted exclusive permission to prove only the first transition. + if ( + !local.isTopTier && ts.contester == address(0) && local.tid == 1 && ts.tier == 0 + && local.inProvingWindow + ) { + require(msg.sender == local.meta.proposer, L1_NOT_ASSIGNED_PROVER()); + } + // We must verify the proof, and any failure in proof verification will result in a revert. + // It's crucial to emphasize that the proof can be assessed in two potential modes: "proving + // mode" and "contesting mode." However, the precise verification logic is defined within + // each tier's IVerifier contract implementation. We simply specify to the verifier contract + // which mode it should utilize - if the new tier is higher than the previous tier, we + // employ the proving mode; otherwise, we employ the contesting mode (the new tier cannot be + // lower than the previous tier, this has been checked above). It's obvious that proof + // verification is entirely decoupled from Taiko's core protocol. + if (local.tier.verifierName != "") { + ctx_ = IVerifier.ContextV2({ + metaHash: local.metaHash, + blobHash: local.meta.blobHash, + // Separate msgSender to allow the prover to be any address in the future. + prover: msg.sender, + msgSender: msg.sender, + blockId: local.blockId, + isContesting: local.proof.tier == ts.tier && !local.isTopTier, + blobUsed: local.meta.blobUsed, + tran: ctx_.tran + }); + + verifierName_ = local.tier.verifierName; + + if (_batchProof.tier == 0) { + // In the case of per-transition proof, we verify the proof. + IVerifier(_resolver.resolve(local.tier.verifierName, false)).verifyProof( + LibData.verifierContextV2ToV1(ctx_), ctx_.tran, local.proof + ); + } + } + + if (LibUtils.isSyncBlock(_config.stateRootSyncInternal, local.blockId)) { + local.sameTransition = + ctx_.tran.blockHash == ts.blockHash && ctx_.tran.stateRoot == ts.stateRoot; + } else { + local.sameTransition = ctx_.tran.blockHash == ts.blockHash; + + // For non sync-block, we set the stateRoot to 0 before emitting it in events + ctx_.tran.stateRoot = 0; + } + + if (local.proof.tier > ts.tier) { + // Handles the case when an incoming tier is higher than the current transition's tier. + // Reverts when the incoming proof tries to prove the same transition + // (L1_ALREADY_PROVED). + _overrideWithHigherProof(_state, _resolver, blk, ts, ctx_.tran, local.proof, local); + + emit TransitionProvedV2({ + blockId: local.blockId, + tran: ctx_.tran, + prover: msg.sender, + validityBond: local.tier.validityBond, + tier: local.proof.tier, + proposedIn: local.meta.proposedIn + }); + } else { + // New transition and old transition on the same tier - and if this transaction tries to + // prove the same, it reverts + require(!local.sameTransition, L1_ALREADY_PROVED()); + + if (local.isTopTier) { + // The top tier prover re-proves. + assert(local.tier.validityBond == 0); + assert(ts.validityBond == 0 && ts.contester == address(0)); + + ts.prover = msg.sender; + ts.blockHash = ctx_.tran.blockHash; + ts.stateRoot = ctx_.tran.stateRoot; + + emit TransitionProvedV2({ + blockId: local.blockId, + tran: ctx_.tran, + prover: msg.sender, + validityBond: 0, + tier: local.proof.tier, + proposedIn: local.meta.proposedIn + }); + } else { + // Contesting but not on the highest tier + require(ts.contester == address(0), L1_ALREADY_CONTESTED()); + + // Making it a non-sliding window, relative when ts.timestamp was registered (or to + // lastUnpaused if that one is bigger) + require( + !LibUtils.isPostDeadline( + ts.timestamp, local.b.lastUnpausedAt, local.tier.cooldownWindow + ), + L1_CANNOT_CONTEST() + ); + + // Burn the contest bond from the prover. + LibBonds.debitBond( + _state, _resolver, msg.sender, local.blockId, local.tier.contestBond + ); + + // We retain the contest bond within the transition, just in case this configuration + // is altered to a different value before the contest is resolved. It's worth noting + // that the previous value of ts.contestBond doesn't have any significance. + ts.contestBond = local.tier.contestBond; + ts.contester = msg.sender; + + emit TransitionContestedV2({ + blockId: local.blockId, + tran: ctx_.tran, + contester: msg.sender, + contestBond: local.tier.contestBond, + tier: local.proof.tier, + proposedIn: local.meta.proposedIn + }); + } + } + + ts.timestamp = uint64(block.timestamp); + _state.transitions[local.slot][local.tid] = ts; + + if ( + !_state.slotB.provingPaused && LibUtils.shouldVerifyBlocks(_config, local.meta.id, true) + ) { + LibVerifying.verifyBlocks(_state, _config, _resolver, _config.maxBlocksToVerify); + } + } + + /// @dev Handle the transition initialization logic. + /// @param _state Pointer to the protocol's storage. + /// @param _blk Current TaikoData.BlockV2. + /// @param _tran Current TaikoData.Transition. + /// @param _local Current Local struct. + /// @return tid_ The transition ID. + /// @return ts_ The transition state. + function _fetchOrCreateTransition( + TaikoData.State storage _state, + TaikoData.BlockV2 storage _blk, + TaikoData.Transition memory _tran, + Local memory _local + ) + private + returns (uint24 tid_, TaikoData.TransitionState memory ts_) + { + tid_ = LibUtils.getTransitionId(_state, _blk, _local.slot, _tran.parentHash); + + if (tid_ == 0) { + // In cases where a transition with the provided parentHash is not found, we must + // essentially "create" one and set it to its initial state. This initial state can be + // viewed as a special transition on tier-0. Subsequently, we transform this tier-0 + // transition into a non-zero-tier transition with a proof. This approach ensures that + // the same logic is applicable for both 0-to-non-zero transition updates and + // non-zero-to-non-zero transition updates. + unchecked { + // Unchecked is safe: Not realistic 2**32 different fork choice per block will be + // proven and none of them is valid + tid_ = _blk.nextTransitionId++; + } + + // Keep in mind that state.transitions are also reusable storage slots, so it's + // necessary to reinitialize all transition fields below. + ts_.timestamp = _local.meta.proposedAt; + + if (tid_ == 1) { + // This approach serves as a cost-saving technique for the majority of blocks, where + // the first transition is expected to be the correct one. Writing to `transitions` + // is more economical since it resides in the ring buffer, whereas writing to + // `transitionIds` is not as cost-effective. + ts_.key = _tran.parentHash; + + // In the case of this first transition, the block's assigned prover has the + // privilege to re-prove it, but only when the assigned prover matches the previous + // prover. To ensure this, we establish the transition's prover as the block's + // assigned prover. Consequently, when we carry out a 0-to-non-zero transition + // update, the previous prover will consistently be the block's assigned prover. + // While alternative implementations are possible, introducing such changes would + // require additional if-else logic. + ts_.prover = _local.meta.proposer; + } else { + // Furthermore, we index the transition for future retrieval. It's worth emphasizing + // that this mapping for indexing is not reusable. However, given that the majority + // of blocks will only possess one transition — the correct one — we don't need + // to be concerned about the cost in this case. + + // There is no need to initialize ts.key here because it's only used when tid == 1 + _state.transitionIds[_local.blockId][_tran.parentHash] = tid_; + } + } else { + // A transition with the provided parentHash has been located. + ts_ = _state.transitions[_local.slot][tid_]; + } + } + + /// @dev Handles what happens when either the first transition is being proven or there is a + /// higher tier proof incoming. + /// @param _state Pointer to the protocol's storage. + /// @param _resolver The address resolver. + /// @param _blk Current TaikoData.BlockV2. + /// @param _ts Current TaikoData.TransitionState. + /// @param _tran Current TaikoData.Transition. + /// @param _proof Current TaikoData.TierProof. + /// @param _local Current Local struct. + function _overrideWithHigherProof( + TaikoData.State storage _state, + IAddressResolver _resolver, + TaikoData.BlockV2 storage _blk, + TaikoData.TransitionState memory _ts, + TaikoData.Transition memory _tran, + TaikoData.TierProof memory _proof, + Local memory _local + ) + private + { + // Higher tier proof overwriting lower tier proof + uint256 reward; // reward to the new (current) prover + + if (_ts.contester != address(0)) { + if (_local.sameTransition) { + // The contested transition is proven to be valid, contester loses the game + reward = _rewardAfterFriction(_ts.contestBond); + + // We return the validity bond back, but the original prover doesn't get any reward. + LibBonds.creditBond(_state, _ts.prover, _local.blockId, _ts.validityBond); + } else { + // The contested transition is proven to be invalid, contester wins the game. + // Contester gets 3/4 of reward, the new prover gets 1/4. + reward = _rewardAfterFriction(_ts.validityBond) >> 2; + unchecked { + LibBonds.creditBond( + _state, _ts.contester, _local.blockId, _ts.contestBond + reward * 3 + ); + } + } + } else { + require(!_local.sameTransition, L1_ALREADY_PROVED()); + + // The code below will be executed if 1) the transition is proved for the first time + // or 2) the transition is contested. + reward = _rewardAfterFriction(_ts.validityBond); + + if (!_blk.livenessBondReturned) { + _blk.livenessBondReturned = true; + + if (_returnLivenessBond(_local, _proof.data)) { + if (_local.meta.proposer == msg.sender) { + unchecked { + reward += _local.meta.livenessBond; + } + } else { + LibBonds.creditBond( + _state, _local.meta.proposer, _local.blockId, _local.meta.livenessBond + ); + } + } else { + // Reward a majority of liveness bond to the actual prover + unchecked { + reward += _rewardAfterFriction(_local.meta.livenessBond); + } + } + } + } + + unchecked { + if (reward > _local.tier.validityBond) { + LibBonds.creditBond( + _state, msg.sender, _local.blockId, reward - _local.tier.validityBond + ); + } else if (reward < _local.tier.validityBond) { + LibBonds.debitBond( + _state, _resolver, msg.sender, _local.blockId, _local.tier.validityBond - reward + ); + } + } + + _ts.validityBond = _local.tier.validityBond; + _ts.contester = address(0); + _ts.prover = msg.sender; + _ts.tier = _proof.tier; + + if (!_local.sameTransition) { + _ts.blockHash = _tran.blockHash; + _ts.stateRoot = _tran.stateRoot; + } + } + + /// @dev Returns the reward after applying 12.5% friction. + /// @param _amount The amount to apply friction to. + /// @return The reward after applying friction. + function _rewardAfterFriction(uint256 _amount) private pure returns (uint256) { + return (_amount * 7) >> 3; + } + + /// @dev Returns if the liveness bond shall be returned. + /// @param _local Current Local struct. + /// @param _proofData The proof data. + /// @return True if the liveness bond shall be returned, false otherwise. + function _returnLivenessBond( + Local memory _local, + bytes memory _proofData + ) + private + pure + returns (bool) + { + return _local.inProvingWindow && _local.tid == 1 + || _local.isTopTier && _proofData.length == 32 + && bytes32(_proofData) == LibStrings.H_RETURN_LIVENESS_BOND; + } +} diff --git a/packages/protocol/contracts/layer1/based/LibUtils.sol b/packages/protocol/contracts/layer1/based/LibUtils.sol new file mode 100644 index 00000000000..def7f9ca00c --- /dev/null +++ b/packages/protocol/contracts/layer1/based/LibUtils.sol @@ -0,0 +1,285 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "src/shared/common/IAddressResolver.sol"; +import "src/shared/common/LibStrings.sol"; +import "src/shared/common/LibMath.sol"; +import "../tiers/ITierProvider.sol"; +import "../tiers/ITierRouter.sol"; +import "./TaikoData.sol"; + +/// @title LibUtils +/// @notice A library that offers utility helper functions. +/// @custom:security-contact security@taiko.xyz +library LibUtils { + using LibMath for uint256; + + uint256 internal constant SECONDS_IN_MINUTE = 60; + + /// @dev Emitted when a block is verified. + /// @param blockId The ID of the verified block. + /// @param prover The prover whose transition is used for verifying the block. + /// @param blockHash The hash of the verified block. + /// @param tier The tier ID of the proof. + event BlockVerifiedV2( + uint256 indexed blockId, address indexed prover, bytes32 blockHash, uint16 tier + ); + + error L1_INVALID_BLOCK_ID(); + error L1_INVALID_PARAMS(); + error L1_INVALID_GENESIS_HASH(); + error L1_TRANSITION_NOT_FOUND(); + error L1_UNEXPECTED_TRANSITION_ID(); + + /// @dev Initializes the Taiko protocol state. + /// @param _state The state to initialize. + /// @param _genesisBlockHash The block hash of the genesis block. + function init(TaikoData.State storage _state, bytes32 _genesisBlockHash) public { + require(_genesisBlockHash != 0, L1_INVALID_GENESIS_HASH()); + // Init state + _state.slotA.genesisHeight = uint64(block.number); + _state.slotA.genesisTimestamp = uint64(block.timestamp); + _state.slotB.numBlocks = 1; + + // Init the genesis block + TaikoData.BlockV2 storage blk = _state.blocks[0]; + blk.nextTransitionId = 2; + blk.proposedAt = uint64(block.timestamp); + blk.proposedIn = uint64(block.number); + blk.verifiedTransitionId = 1; + blk.metaHash = bytes32(uint256(1)); // Give the genesis metahash a non-zero value. + + // Init the first state transition + TaikoData.TransitionState storage ts = _state.transitions[0][1]; + ts.blockHash = _genesisBlockHash; + ts.prover = address(0); + ts.timestamp = uint64(block.timestamp); + + emit BlockVerifiedV2({ + blockId: 0, + prover: address(0), + blockHash: _genesisBlockHash, + tier: 0 + }); + } + + /// @dev Retrieves a block's block hash and state root. + /// @param _state Pointer to the protocol's storage. + /// @param _config The protocol's configuration. + /// @param _blockId Id of the block. + /// @return blockHash_ The block's block hash. + /// @return stateRoot_ The block's storage root. + /// @return verifiedAt_ The timestamp when the block was proven at. + function getBlockInfo( + TaikoData.State storage _state, + TaikoData.Config memory _config, + uint64 _blockId + ) + public + view + returns (bytes32 blockHash_, bytes32 stateRoot_, uint64 verifiedAt_) + { + (TaikoData.BlockV2 storage blk, uint64 slot) = getBlock(_state, _config, _blockId); + + if (blk.verifiedTransitionId != 0) { + TaikoData.TransitionState storage transition = + _state.transitions[slot][blk.verifiedTransitionId]; + + blockHash_ = transition.blockHash; + stateRoot_ = transition.stateRoot; + verifiedAt_ = transition.timestamp; + } + } + + /// @dev Gets the state transitions for a batch of block. For transition that doesn't exist, the + /// corresponding transition state will be empty. + /// @param _state Pointer to the protocol's storage. + /// @param _config The protocol's configuration. + /// @param _blockIds Id array of the blocks. + /// @param _parentHashes Parent hashes of the blocks. + /// @return transitions_ The state transition pointer array. + function getTransitions( + TaikoData.State storage _state, + TaikoData.Config memory _config, + uint64[] calldata _blockIds, + bytes32[] calldata _parentHashes + ) + public + view + returns (TaikoData.TransitionState[] memory transitions_) + { + require(_blockIds.length != 0, L1_INVALID_PARAMS()); + require(_blockIds.length == _parentHashes.length, L1_INVALID_PARAMS()); + transitions_ = new TaikoData.TransitionState[](_blockIds.length); + for (uint256 i; i < _blockIds.length; ++i) { + (TaikoData.BlockV2 storage blk, uint64 slot) = getBlock(_state, _config, _blockIds[i]); + uint24 tid = getTransitionId(_state, blk, slot, _parentHashes[i]); + if (tid != 0) { + transitions_[i] = _state.transitions[slot][tid]; + } + } + } + + /// @dev Retrieves the transition with a given parentHash. + /// @dev This function will revert if the transition is not found. + /// @param _state Pointer to the protocol's storage. + /// @param _config The protocol's configuration. + /// @param _blockId Id of the block. + /// @param _parentHash Parent hash of the block. + /// @return The state transition pointer. + function getTransitionByParentHash( + TaikoData.State storage _state, + TaikoData.Config memory _config, + uint64 _blockId, + bytes32 _parentHash + ) + public + view + returns (TaikoData.TransitionState storage) + { + (TaikoData.BlockV2 storage blk, uint64 slot) = getBlock(_state, _config, _blockId); + + uint24 tid = getTransitionId(_state, blk, slot, _parentHash); + require(tid != 0, L1_TRANSITION_NOT_FOUND()); + + return _state.transitions[slot][tid]; + } + + /// @dev Retrieves a block based on its ID. + /// @param _state Pointer to the protocol's storage. + /// @param _config The protocol's configuration. + /// @param _blockId Id of the block. + /// @return blk_ The block storage pointer. + /// @return slot_ The slot value. + function getBlock( + TaikoData.State storage _state, + TaikoData.Config memory _config, + uint64 _blockId + ) + internal + view + returns (TaikoData.BlockV2 storage blk_, uint64 slot_) + { + slot_ = _blockId % _config.blockRingBufferSize; + blk_ = _state.blocks[slot_]; + require(blk_.blockId == _blockId, L1_INVALID_BLOCK_ID()); + } + + /// @dev Retrieves the transition with a transition ID. + /// @dev This function will revert if the transition is not found. + /// @param _state Pointer to the protocol's storage. + /// @param _config The protocol's configuration. + /// @param _blockId Id of the block. + /// @param _tid The transition id. + /// @return The state transition pointer. + function getTransitionById( + TaikoData.State storage _state, + TaikoData.Config memory _config, + uint64 _blockId, + uint24 _tid + ) + internal + view + returns (TaikoData.TransitionState storage) + { + (TaikoData.BlockV2 storage blk, uint64 slot) = getBlock(_state, _config, _blockId); + + require(_tid != 0, L1_TRANSITION_NOT_FOUND()); + require(_tid < blk.nextTransitionId, L1_TRANSITION_NOT_FOUND()); + return _state.transitions[slot][_tid]; + } + + /// @dev Retrieves the ID of the transition with a given parentHash. This function will return 0 + /// if the transition is not found. + /// @param _state Pointer to the protocol's storage. + /// @param _blk The block storage pointer. + /// @param _slot The slot value. + /// @param _parentHash The parent hash of the block. + /// @return tid_ The transition ID. + function getTransitionId( + TaikoData.State storage _state, + TaikoData.BlockV2 storage _blk, + uint64 _slot, + bytes32 _parentHash + ) + internal + view + returns (uint24 tid_) + { + if (_state.transitions[_slot][1].key == _parentHash) { + tid_ = 1; + require(tid_ < _blk.nextTransitionId, L1_UNEXPECTED_TRANSITION_ID()); + } else { + tid_ = _state.transitionIds[_blk.blockId][_parentHash]; + require(tid_ == 0 || tid_ < _blk.nextTransitionId, L1_UNEXPECTED_TRANSITION_ID()); + } + } + + /// @dev Checks if the current timestamp is past the deadline. + /// @param _tsTimestamp The timestamp to check. + /// @param _lastUnpausedAt The last unpaused timestamp. + /// @param _windowMinutes The window in minutes. + /// @return True if the current timestamp is past the deadline, false otherwise. + function isPostDeadline( + uint256 _tsTimestamp, + uint256 _lastUnpausedAt, + uint256 _windowMinutes + ) + internal + view + returns (bool) + { + unchecked { + uint256 deadline = + _tsTimestamp.max(_lastUnpausedAt) + _windowMinutes * SECONDS_IN_MINUTE; + return block.timestamp >= deadline; + } + } + + /// @dev Determines if blocks should be verified based on the configuration and block ID. + /// @param _config The TaikoData.Config. + /// @param _blockId The ID of the block. + /// @param _isBlockProposed Whether the block is proposed. + /// @return True if blocks should be verified, false otherwise. + function shouldVerifyBlocks( + TaikoData.Config memory _config, + uint64 _blockId, + bool _isBlockProposed + ) + internal + pure + returns (bool) + { + if (_config.maxBlocksToVerify == 0) return false; + // If maxBlocksToVerify = 16, segmentSize = 8, verification will be triggered by + // proposeBlock(s) for blocks 0, 8, 16, 24, ..., and by proveBlock(s) for blocks 4, 12, 20, + // 28, ... + uint256 segmentSize = _config.maxBlocksToVerify >> 1; + + if (segmentSize <= 1) return true; + + return _blockId % segmentSize == (_isBlockProposed ? 0 : segmentSize >> 1); + } + + /// @dev Determines if the state root should be synchronized based on the configuration and + /// block ID. + /// @param _stateRootSyncInternal The state root sync interval. + /// @param _blockId The ID of the block. + /// @return True if the state root should be synchronized, false otherwise. + function isSyncBlock( + uint256 _stateRootSyncInternal, + uint256 _blockId + ) + internal + pure + returns (bool) + { + if (_stateRootSyncInternal <= 1) return true; + unchecked { + // We could use `_blockId % _stateRootSyncInternal == 0`, but this will break many unit + // tests as in most of these tests, we test block#1, so by setting + // config._stateRootSyncInternal = 2, we can keep the tests unchanged. + return _blockId % _stateRootSyncInternal == _stateRootSyncInternal - 1; + } + } +} diff --git a/packages/protocol/contracts/layer1/based/LibVerifying.sol b/packages/protocol/contracts/layer1/based/LibVerifying.sol new file mode 100644 index 00000000000..a4a8833f0aa --- /dev/null +++ b/packages/protocol/contracts/layer1/based/LibVerifying.sol @@ -0,0 +1,198 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "src/shared/signal/ISignalService.sol"; +import "./LibBonds.sol"; +import "./LibUtils.sol"; + +/// @title LibVerifying +/// @notice A library that offers helper functions for verifying blocks. +/// @custom:security-contact security@taiko.xyz +library LibVerifying { + using LibMath for uint256; + + struct Local { + TaikoData.SlotB b; + uint64 blockId; + uint64 slot; + uint64 numBlocksVerified; + uint24 tid; + uint24 lastVerifiedTransitionId; + uint16 tier; + bytes32 blockHash; + bytes32 syncStateRoot; + uint64 syncBlockId; + uint24 syncTransitionId; + address prover; + ITierRouter tierRouter; + } + + error L1_BLOCK_MISMATCH(); + error L1_TRANSITION_ID_ZERO(); + + /// @dev Verifies up to N blocks. + /// @param _state Pointer to the protocol's storage. + /// @param _config The protocol's configuration. + /// @param _resolver The address resolver. + /// @param _maxBlocksToVerify The maximum number of blocks to verify. + function verifyBlocks( + TaikoData.State storage _state, + TaikoData.Config memory _config, + IAddressResolver _resolver, + uint64 _maxBlocksToVerify + ) + internal + { + if (_maxBlocksToVerify == 0) { + return; + } + + Local memory local; + local.b = _state.slotB; + local.blockId = local.b.lastVerifiedBlockId; + local.slot = local.blockId % _config.blockRingBufferSize; + + TaikoData.BlockV2 storage blk = _state.blocks[local.slot]; + require(blk.blockId == local.blockId, L1_BLOCK_MISMATCH()); + + local.lastVerifiedTransitionId = blk.verifiedTransitionId; + local.tid = local.lastVerifiedTransitionId; + + // The following scenario should never occur but is included as a precaution. + require(local.tid != 0, L1_TRANSITION_ID_ZERO()); + + // The `blockHash` variable represents the most recently trusted blockHash on L2. + local.blockHash = _state.transitions[local.slot][local.tid].blockHash; + + // Unchecked is safe: - assignment is within ranges - blockId and numBlocksVerified values + // incremented will still be OK in the next 584K years if we verify one block per every + // second + unchecked { + ++local.blockId; + + while ( + local.blockId < local.b.numBlocks && local.numBlocksVerified < _maxBlocksToVerify + ) { + local.slot = local.blockId % _config.blockRingBufferSize; + + blk = _state.blocks[local.slot]; + require(blk.blockId == local.blockId, L1_BLOCK_MISMATCH()); + + local.tid = LibUtils.getTransitionId(_state, blk, local.slot, local.blockHash); + // When `tid` is 0, it indicates that there is no proven transition with its + // parentHash equal to the blockHash of the most recently verified block. + if (local.tid == 0) break; + + // A transition with the correct `parentHash` has been located. + TaikoData.TransitionState storage ts = _state.transitions[local.slot][local.tid]; + + // It's not possible to verify this block if either the transition is contested and + // awaiting higher-tier proof or if the transition is still within its cooldown + // period. + local.tier = ts.tier; + + if (ts.contester != address(0)) { + break; + } + + if (local.tierRouter == ITierRouter(address(0))) { + local.tierRouter = + ITierRouter(_resolver.resolve(LibStrings.B_TIER_ROUTER, false)); + } + + uint24 cooldown = ITierProvider(local.tierRouter.getProvider(local.blockId)).getTier( + local.tier + ).cooldownWindow; + + if (!LibUtils.isPostDeadline(ts.timestamp, local.b.lastUnpausedAt, cooldown)) { + // If cooldownWindow is 0, the block can theoretically be proved and verified + // within the same L1 block. + break; + } + + // Update variables + local.lastVerifiedTransitionId = local.tid; + local.blockHash = ts.blockHash; + local.prover = ts.prover; + + LibBonds.creditBond(_state, local.prover, local.blockId, ts.validityBond); + + // Note: We exclusively address the bonds linked to the transition used for + // verification. While there may exist other transitions for this block, we + // disregard them entirely. The bonds for these other transitions are burned (more + // precisely held in custody) either when the transitions are generated or proven. In + // such cases, both the provers and contesters of those transitions forfeit their + // bonds. + + emit LibUtils.BlockVerifiedV2({ + blockId: local.blockId, + prover: local.prover, + blockHash: local.blockHash, + tier: local.tier + }); + + if (LibUtils.isSyncBlock(_config.stateRootSyncInternal, local.blockId)) { + bytes32 stateRoot = ts.stateRoot; + if (stateRoot != 0) { + local.syncStateRoot = stateRoot; + local.syncBlockId = local.blockId; + local.syncTransitionId = local.tid; + } + } + + ++local.blockId; + ++local.numBlocksVerified; + } + + if (local.numBlocksVerified != 0) { + uint64 lastVerifiedBlockId = local.b.lastVerifiedBlockId + local.numBlocksVerified; + local.slot = lastVerifiedBlockId % _config.blockRingBufferSize; + + _state.slotB.lastVerifiedBlockId = lastVerifiedBlockId; + _state.blocks[local.slot].verifiedTransitionId = local.lastVerifiedTransitionId; + + if (local.syncStateRoot != 0) { + _state.slotA.lastSyncedBlockId = local.syncBlockId; + _state.slotA.lastSynecdAt = uint64(block.timestamp); + + // We write the synced block's verifiedTransitionId to storage + if (local.syncBlockId != lastVerifiedBlockId) { + local.slot = local.syncBlockId % _config.blockRingBufferSize; + _state.blocks[local.slot].verifiedTransitionId = local.syncTransitionId; + } + + // Ask signal service to write cross chain signal + ISignalService(_resolver.resolve(LibStrings.B_SIGNAL_SERVICE, false)) + .syncChainData( + _config.chainId, + LibStrings.H_STATE_ROOT, + local.syncBlockId, + local.syncStateRoot + ); + } + } + } + } + + /// @dev Retrieves the prover of a verified block. + /// @param _state Pointer to the protocol's storage. + /// @param _config The protocol's configuration. + /// @param _blockId The ID of the block. + /// @return The address of the prover. + function getVerifiedBlockProver( + TaikoData.State storage _state, + TaikoData.Config memory _config, + uint64 _blockId + ) + internal + view + returns (address) + { + (TaikoData.BlockV2 storage blk,) = LibUtils.getBlock(_state, _config, _blockId); + + uint24 tid = blk.verifiedTransitionId; + if (tid == 0) return address(0); + + return LibUtils.getTransitionById(_state, _config, _blockId, tid).prover; + } +} diff --git a/packages/protocol/contracts/layer1/based/TaikoData.sol b/packages/protocol/contracts/layer1/based/TaikoData.sol new file mode 100644 index 00000000000..893e6c7cb3c --- /dev/null +++ b/packages/protocol/contracts/layer1/based/TaikoData.sol @@ -0,0 +1,215 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "src/shared/data/LibSharedData.sol"; + +/// @title TaikoData +/// @notice This library defines various data structures used in the Taiko protocol. +/// @custom:security-contact security@taiko.xyz +library TaikoData { + /// @notice Struct holding Taiko configuration parameters. See {TaikoConfig}. + struct Config { + /// @notice The chain ID of the network where Taiko contracts are deployed. + uint64 chainId; + /// @notice The maximum number of verifications allowed when a block is proposed or proved. + uint64 blockMaxProposals; + /// @notice Size of the block ring buffer, allowing extra space for proposals. + uint64 blockRingBufferSize; + /// @notice The maximum number of verifications allowed when a block is proposed or proved. + uint64 maxBlocksToVerify; + /// @notice The maximum gas limit allowed for a block. + uint32 blockMaxGasLimit; + /// @notice The amount of Taiko token as a prover liveness bond. + uint96 livenessBond; + /// @notice The number of L2 blocks between each L2-to-L1 state root sync. + uint8 stateRootSyncInternal; + /// @notice The max differences of the anchor height and the current block number. + uint64 maxAnchorHeightOffset; + /// @notice Base fee configuration + LibSharedData.BaseFeeConfig baseFeeConfig; + /// @notie The Ontake fork height on L2. + uint64 ontakeForkHeight; + } + + /// @notice DEPRECATED but used by node/client for syncing old blocks + /// @notice A proof and the tier of proof it belongs to. + struct TierProof { + uint16 tier; + bytes data; + } + + /// @notice DEPRECATED but used by node/client for syncing old blocks + /// @notice Hook and its data (currently used only during proposeBlock) + struct HookCall { + address hook; + bytes data; + } + + /// @notice DEPRECATED but used by node/client for syncing old blocks + /// @notice Represents proposeBlock's _data input parameter + struct BlockParams { + address assignedProver; // DEPRECATED, value ignored. + address coinbase; + bytes32 extraData; + bytes32 parentMetaHash; + HookCall[] hookCalls; // DEPRECATED, value ignored. + bytes signature; // DEPRECATED, value ignored. + } + + struct BlockParamsV2 { + address proposer; + address coinbase; + bytes32 parentMetaHash; + uint64 anchorBlockId; // NEW + uint64 timestamp; // NEW + uint32 blobTxListOffset; // NEW + uint32 blobTxListLength; // NEW + uint8 blobIndex; // NEW + } + + /// @notice DEPRECATED but used by node/client for syncing old blocks + /// @notice Struct containing data only required for proving a block + /// @notice Note: On L2, `block.difficulty` is the pseudo name of `block.prevrandao`, which + /// returns a random number provided by the layer 1 chain. + struct BlockMetadata { + bytes32 l1Hash; + bytes32 difficulty; + bytes32 blobHash; //or txListHash (if Blob not yet supported) + bytes32 extraData; + bytes32 depositsHash; + address coinbase; // L2 coinbase, + uint64 id; + uint32 gasLimit; + uint64 timestamp; + uint64 l1Height; + uint16 minTier; + bool blobUsed; + bytes32 parentMetaHash; + address sender; // a.k.a proposer + } + + struct BlockMetadataV2 { + bytes32 anchorBlockHash; // `_l1BlockHash` in TaikoL2's anchor tx. + bytes32 difficulty; + bytes32 blobHash; + bytes32 extraData; + address coinbase; + uint64 id; + uint32 gasLimit; + uint64 timestamp; + uint64 anchorBlockId; // `_l1BlockId` in TaikoL2's anchor tx. + uint16 minTier; + bool blobUsed; + bytes32 parentMetaHash; + address proposer; + uint96 livenessBond; + uint64 proposedAt; // Used by node/client post block proposal. + uint64 proposedIn; // Used by node/client post block proposal. + uint32 blobTxListOffset; + uint32 blobTxListLength; + uint8 blobIndex; + LibSharedData.BaseFeeConfig baseFeeConfig; + } + + /// @notice Struct representing transition to be proven. + struct Transition { + bytes32 parentHash; + bytes32 blockHash; + bytes32 stateRoot; + bytes32 graffiti; // Arbitrary data that the prover can use for various purposes. + } + + /// @notice Struct representing state transition data. + /// @notice 6 slots used. + struct TransitionState { + bytes32 key; // slot 1, only written/read for the 1st state transition. + bytes32 blockHash; // slot 2 + bytes32 stateRoot; // slot 3 + address prover; // slot 4 + uint96 validityBond; + address contester; // slot 5 + uint96 contestBond; + uint64 timestamp; // slot 6 (88 bits) + uint16 tier; + uint8 __reserved1; + } + + /// @notice DEPRECATED but used by node/client for syncing old blocks + /// @notice Struct containing data required for verifying a block. + /// @notice 3 slots used. + struct Block { + bytes32 metaHash; // slot 1 + address assignedProver; + uint96 livenessBond; + uint64 blockId; // slot 3 + uint64 proposedAt; + uint64 proposedIn; + uint32 nextTransitionId; + // The ID of the transaction that is used to verify this block. However, if this block is + // not verified as the last block in a batch, verifiedTransitionId will remain zero. + uint32 verifiedTransitionId; + } + + /// @notice Struct containing data required for verifying a block. + /// @notice 3 slots used. + struct BlockV2 { + bytes32 metaHash; // slot 1 + address assignedProver; // DEPRECATED!!! + uint96 livenessBond; // DEPRECATED!!! + uint64 blockId; // slot 3 + uint64 proposedAt; // Now represents L2 block's timestamp + uint64 proposedIn; // Now represents L2 block's anchorBlockId + uint24 nextTransitionId; + bool livenessBondReturned; + // The ID of the transaction that is used to verify this block. However, if this block is + // not verified as the last block in a batch, verifiedTransitionId will remain zero. + uint24 verifiedTransitionId; + } + + /// @notice DEPRECATED but used by node/client for syncing old blocks + /// @notice Struct representing an Ethereum deposit. + /// @notice 2 slot used. Currently removed from protocol, but to be backwards compatible, the + /// struct and return values stayed for now. + struct EthDeposit { + address recipient; + uint96 amount; + uint64 id; + } + + /// @notice Forge is only able to run coverage in case the contracts by default capable of + /// compiling without any optimization (neither optimizer runs, no compiling --via-ir flag). + /// @notice In order to resolve stack too deep without optimizations, we needed to introduce + /// outsourcing vars into structs below. + struct SlotA { + uint64 genesisHeight; + uint64 genesisTimestamp; + uint64 lastSyncedBlockId; + uint64 lastSynecdAt; // known typo (lastSyncedAt) + } + + struct SlotB { + uint64 numBlocks; + uint64 lastVerifiedBlockId; + bool provingPaused; + uint56 lastProposedIn; + uint64 lastUnpausedAt; + } + + /// @notice Struct holding the state variables for the {TaikoL1} contract. + struct State { + // Ring buffer for proposed blocks and a some recent verified blocks. + mapping(uint64 blockId_mod_blockRingBufferSize => BlockV2 blk) blocks; + // Indexing to transition ids (ring buffer not possible) + mapping(uint64 blockId => mapping(bytes32 parentHash => uint24 transitionId)) transitionIds; + // Ring buffer for transitions + mapping( + uint64 blockId_mod_blockRingBufferSize + => mapping(uint24 transitionId => TransitionState ts) + ) transitions; + bytes32 __reserve1; // Used as a ring buffer for Ether deposits + SlotA slotA; // slot 5 + SlotB slotB; // slot 6 + mapping(address account => uint256 bond) bondBalance; + uint256[43] __gap; + } +} diff --git a/packages/protocol/contracts/layer1/based/TaikoEvents.sol b/packages/protocol/contracts/layer1/based/TaikoEvents.sol new file mode 100644 index 00000000000..9abfb9d6888 --- /dev/null +++ b/packages/protocol/contracts/layer1/based/TaikoEvents.sol @@ -0,0 +1,154 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "./TaikoData.sol"; + +/// @title TaikoEvents +/// @notice This abstract contract provides event declarations for the Taiko protocol, which are +/// emitted during block proposal, proof, verification, and Ethereum deposit processes. +/// @dev The events defined here must match the definitions in the corresponding L1 libraries. +/// @custom:security-contact security@taiko.xyz +abstract contract TaikoEvents { + /// @notice Emitted when tokens are deposited into a user's bond balance. + /// @param user The address of the user who deposited the tokens. + /// @param amount The amount of tokens deposited. + event BondDeposited(address indexed user, uint256 amount); + + /// @notice Emitted when tokens are withdrawn from a user's bond balance. + /// @param user The address of the user who withdrew the tokens. + /// @param amount The amount of tokens withdrawn. + event BondWithdrawn(address indexed user, uint256 amount); + + /// @notice Emitted when a token is credited back to a user's bond balance. + /// @param user The address of the user whose bond balance is credited. + /// @param blockId The ID of the block to credit for. + /// @param amount The amount of tokens credited. + event BondCredited(address indexed user, uint256 blockId, uint256 amount); + + /// @notice Emitted when a token is debited from a user's bond balance. + /// @param user The address of the user whose bond balance is debited. + /// @param blockId The ID of the block to debit for. + /// @param amount The amount of tokens debited. + event BondDebited(address indexed user, uint256 blockId, uint256 amount); + + /// @notice DEPRECATED but used by node/client for syncing old blocks. Emitted when a block is + /// proposed. + /// @param blockId The ID of the proposed block. + /// @param assignedProver The address of the assigned prover. + /// @param livenessBond The liveness bond of the proposed block. + /// @param meta The metadata of the proposed block. + /// @param depositsProcessed The EthDeposit array about processed deposits in this proposed + /// block. + event BlockProposed( + uint256 indexed blockId, + address indexed assignedProver, + uint96 livenessBond, + TaikoData.BlockMetadata meta, + TaikoData.EthDeposit[] depositsProcessed + ); + + /// @notice Emitted when a block is proposed. + /// @param blockId The ID of the proposed block. + /// @param meta The metadata of the proposed block. + event BlockProposedV2(uint256 indexed blockId, TaikoData.BlockMetadataV2 meta); + + /// @notice Emitted when a block's txList is in the calldata. + /// @param blockId The ID of the proposed block. + /// @param txList The txList. + event CalldataTxList(uint256 indexed blockId, bytes txList); + + /// @notice DEPRECATED but used by node/client for syncing old blocks. Emitted when a transition + /// is proved. + /// @param blockId The block ID. + /// @param tran The transition data. + /// @param prover The prover's address. + /// @param validityBond The validity bond amount. + /// @param tier The tier of the proof. + event TransitionProved( + uint256 indexed blockId, + TaikoData.Transition tran, + address prover, + uint96 validityBond, + uint16 tier + ); + + /// @notice Emitted when a transition is proved. + /// @param blockId The block ID. + /// @param tran The transition data. + /// @param prover The prover's address. + /// @param validityBond The validity bond amount. + /// @param tier The tier of the proof. + /// @param proposedIn The L1 block in which a transition is proved. + event TransitionProvedV2( + uint256 indexed blockId, + TaikoData.Transition tran, + address prover, + uint96 validityBond, + uint16 tier, + uint64 proposedIn + ); + + /// @notice DEPRECATED but used by node/client for syncing old blocks. Emitted when a transition + /// is contested. + /// @param blockId The block ID. + /// @param tran The transition data. + /// @param contester The contester's address. + /// @param contestBond The contest bond amount. + /// @param tier The tier of the proof. + event TransitionContested( + uint256 indexed blockId, + TaikoData.Transition tran, + address contester, + uint96 contestBond, + uint16 tier + ); + + /// @notice Emitted when a transition is contested. + /// @param blockId The block ID. + /// @param tran The transition data. + /// @param contester The contester's address. + /// @param contestBond The contest bond amount. + /// @param tier The tier of the proof. + /// @param proposedIn The L1 block in which this L2 block is proposed. + event TransitionContestedV2( + uint256 indexed blockId, + TaikoData.Transition tran, + address contester, + uint96 contestBond, + uint16 tier, + uint64 proposedIn + ); + + /// @notice Emitted when proving is paused or unpaused. + /// @param paused The pause status. + event ProvingPaused(bool paused); + + /// @notice DEPRECATED but used by node/client for syncing old blocks. Emitted when a block is + /// verified. + /// @param blockId The ID of the verified block. + /// @param prover The prover whose transition is used for verifying the block. + /// @param blockHash The hash of the verified block. + /// @param stateRoot Deprecated and is always zero. + /// @param tier The tier ID of the proof. + event BlockVerified( + uint256 indexed blockId, + address indexed prover, + bytes32 blockHash, + bytes32 stateRoot, + uint16 tier + ); + + /// @notice Emitted when a block is verified. + /// @param blockId The ID of the verified block. + /// @param prover The prover whose transition is used for verifying the block. + /// @param blockHash The hash of the verified block. + /// @param tier The tier ID of the proof. + event BlockVerifiedV2( + uint256 indexed blockId, address indexed prover, bytes32 blockHash, uint16 tier + ); + + /// @notice Emitted when some state variable values changed. + /// @dev This event is currently used by Taiko node/client for block proposal/proving. + /// @param slotB The SlotB data structure. + event StateVariablesUpdated(TaikoData.SlotB slotB); +} diff --git a/packages/protocol/contracts/layer1/based/TaikoL1.sol b/packages/protocol/contracts/layer1/based/TaikoL1.sol new file mode 100644 index 00000000000..0a1175e5fce --- /dev/null +++ b/packages/protocol/contracts/layer1/based/TaikoL1.sol @@ -0,0 +1,325 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "@openzeppelin/contracts-upgradeable/utils/math/SafeCastUpgradeable.sol"; +import "src/shared/common/EssentialContract.sol"; +import "./LibData.sol"; +import "./LibProposing.sol"; +import "./LibProving.sol"; +import "./LibVerifying.sol"; +import "./TaikoEvents.sol"; +import "./ITaikoL1.sol"; + +/// @title TaikoL1 +/// @notice This contract serves as the "base layer contract" of the Taiko protocol, providing +/// functionalities for proposing, proving, and verifying blocks. The term "base layer contract" +/// means that although this is usually deployed on L1, it can also be deployed on L2s to create +/// L3s. The contract also handles the deposit and withdrawal of Taiko tokens and Ether. +/// Additionally, this contract doesn't hold any Ether. Ether deposited to L2 are held by the Bridge +/// contract. +/// @dev Labeled in AddressResolver as "taiko" +/// @custom:security-contact security@taiko.xyz +contract TaikoL1 is EssentialContract, ITaikoL1, TaikoEvents { + /// @notice The TaikoL1 state. + TaikoData.State public state; + + uint256[50] private __gap; + + error L1_FORK_HEIGHT_ERROR(); + + modifier whenProvingNotPaused() { + require(!state.slotB.provingPaused, LibProving.L1_PROVING_PAUSED()); + _; + } + + modifier emitEventForClient() { + _; + emit StateVariablesUpdated(state.slotB); + } + + /// @notice Initializes the contract. + /// @param _owner The owner of this contract. msg.sender will be used if this value is zero. + /// @param _rollupAddressManager The address of the {AddressManager} contract. + /// @param _genesisBlockHash The block hash of the genesis block. + /// @param _toPause true to pause the contract by default. + function init( + address _owner, + address _rollupAddressManager, + bytes32 _genesisBlockHash, + bool _toPause + ) + external + initializer + { + __Essential_init(_owner, _rollupAddressManager); + LibUtils.init(state, _genesisBlockHash); + if (_toPause) _pause(); + } + + /// @notice This function shall be called by previously deployed contracts. + function init2() external onlyOwner reinitializer(2) { + state.__reserve1 = 0; + } + + /// @notice This function shall be called by previously deployed contracts. + function init3() external onlyOwner reinitializer(3) { + // this value from EssentialContract is no longer used. + __lastUnpausedAt = 0; + } + + /// @inheritdoc ITaikoL1 + function proposeBlockV2( + bytes calldata _params, + bytes calldata _txList + ) + external + whenNotPaused + nonReentrant + emitEventForClient + returns (TaikoData.BlockMetadataV2 memory meta_) + { + TaikoData.Config memory config = getConfig(); + return LibProposing.proposeBlock(state, config, this, _params, _txList); + } + + /// @inheritdoc ITaikoL1 + function proposeBlocksV2( + bytes[] calldata _paramsArr, + bytes[] calldata _txListArr + ) + external + whenNotPaused + nonReentrant + emitEventForClient + returns (TaikoData.BlockMetadataV2[] memory metaArr_) + { + TaikoData.Config memory config = getConfig(); + return LibProposing.proposeBlocks(state, config, this, _paramsArr, _txListArr); + } + + /// @inheritdoc ITaikoL1 + function proveBlock( + uint64 _blockId, + bytes calldata _input + ) + external + whenNotPaused + whenProvingNotPaused + nonReentrant + emitEventForClient + { + LibProving.proveBlock(state, getConfig(), this, _blockId, _input); + } + + /// @inheritdoc ITaikoL1 + function proveBlocks( + uint64[] calldata _blockIds, + bytes[] calldata _inputs, + bytes calldata _batchProof + ) + external + whenNotPaused + whenProvingNotPaused + nonReentrant + emitEventForClient + { + LibProving.proveBlocks(state, getConfig(), this, _blockIds, _inputs, _batchProof); + } + + /// @inheritdoc ITaikoL1 + function verifyBlocks(uint64 _maxBlocksToVerify) + external + whenNotPaused + whenProvingNotPaused + nonReentrant + emitEventForClient + { + LibVerifying.verifyBlocks(state, getConfig(), this, _maxBlocksToVerify); + } + + /// @inheritdoc ITaikoL1 + function pauseProving(bool _pause) external { + _authorizePause(msg.sender, _pause); + LibProving.pauseProving(state, _pause); + } + + /// @inheritdoc ITaikoL1 + function depositBond(uint256 _amount) external payable whenNotPaused { + LibBonds.depositBond(state, this, _amount); + } + + /// @inheritdoc ITaikoL1 + function withdrawBond(uint256 _amount) external whenNotPaused { + LibBonds.withdrawBond(state, this, _amount); + } + + /// @notice Unpauses the contract. + function unpause() public override whenPaused { + _authorizePause(msg.sender, false); + __paused = _FALSE; + state.slotB.lastUnpausedAt = uint64(block.timestamp); + emit Unpaused(msg.sender); + } + + /// @notice Gets the current bond balance of a given address. + /// @param _user The address of the user. + /// @return The current bond balance. + function bondBalanceOf(address _user) external view returns (uint256) { + return LibBonds.bondBalanceOf(state, _user); + } + + /// @inheritdoc ITaikoL1 + function getVerifiedBlockProver(uint64 _blockId) external view returns (address prover_) { + return LibVerifying.getVerifiedBlockProver(state, getConfig(), _blockId); + } + + /// @notice Gets the details of a block. + /// @param _blockId Index of the block. + /// @return blk_ The block. + function getBlock(uint64 _blockId) external view returns (TaikoData.Block memory blk_) { + require(_blockId < getConfig().ontakeForkHeight, L1_FORK_HEIGHT_ERROR()); + + (TaikoData.BlockV2 memory blk,) = LibUtils.getBlock(state, getConfig(), _blockId); + blk_ = LibData.blockV2ToV1(blk); + } + + /// @inheritdoc ITaikoL1 + function getBlockV2(uint64 _blockId) external view returns (TaikoData.BlockV2 memory blk_) { + require(_blockId >= getConfig().ontakeForkHeight, L1_FORK_HEIGHT_ERROR()); + + (blk_,) = LibUtils.getBlock(state, getConfig(), _blockId); + } + + /// @notice This function will revert if the transition is not found. This function will revert + /// if the transition is not found. + /// @param _blockId Index of the block. + /// @param _parentHash Parent hash of the block. + /// @return The state transition data of the block. + function getTransition( + uint64 _blockId, + bytes32 _parentHash + ) + external + view + returns (TaikoData.TransitionState memory) + { + return LibUtils.getTransitionByParentHash(state, getConfig(), _blockId, _parentHash); + } + + /// @notice Gets the state transitions for a batch of block. For transition that doesn't exist, + /// the corresponding transition state will be empty. + /// @param _blockIds Index of the blocks. + /// @param _parentHashes Parent hashes of the blocks. + /// @return The state transition array of the blocks. Note that a transition's state root will + /// be zero if the block is not a sync-block. + function getTransitions( + uint64[] calldata _blockIds, + bytes32[] calldata _parentHashes + ) + external + view + returns (TaikoData.TransitionState[] memory) + { + return LibUtils.getTransitions(state, getConfig(), _blockIds, _parentHashes); + } + + /// @inheritdoc ITaikoL1 + function getTransition( + uint64 _blockId, + uint32 _tid + ) + external + view + returns (TaikoData.TransitionState memory) + { + return LibUtils.getTransitionById( + state, getConfig(), _blockId, SafeCastUpgradeable.toUint24(_tid) + ); + } + + /// @notice Returns information about the last verified block. + /// @return blockId_ The last verified block's ID. + /// @return blockHash_ The last verified block's blockHash. + /// @return stateRoot_ The last verified block's stateRoot. + /// @return verifiedAt_ The timestamp this block is proven at. + function getLastVerifiedBlock() + external + view + returns (uint64 blockId_, bytes32 blockHash_, bytes32 stateRoot_, uint64 verifiedAt_) + { + blockId_ = state.slotB.lastVerifiedBlockId; + (blockHash_, stateRoot_, verifiedAt_) = LibUtils.getBlockInfo(state, getConfig(), blockId_); + } + + /// @notice Returns information about the last synchronized block. + /// @return blockId_ The last verified block's ID. + /// @return blockHash_ The last verified block's blockHash. + /// @return stateRoot_ The last verified block's stateRoot. + /// @return verifiedAt_ The timestamp this block is proven at. + function getLastSyncedBlock() + external + view + returns (uint64 blockId_, bytes32 blockHash_, bytes32 stateRoot_, uint64 verifiedAt_) + { + blockId_ = state.slotA.lastSyncedBlockId; + (blockHash_, stateRoot_, verifiedAt_) = LibUtils.getBlockInfo(state, getConfig(), blockId_); + } + + /// @notice Gets the state variables of the TaikoL1 contract. + /// @dev This method can be deleted once node/client stops using it. + /// @return State variables stored at SlotA. + /// @return State variables stored at SlotB. + function getStateVariables() + external + view + returns (TaikoData.SlotA memory, TaikoData.SlotB memory) + { + return (state.slotA, state.slotB); + } + + /// @notice Returns the timestamp of the last unpaused state. + /// @return The timestamp of the last unpaused state. + function lastUnpausedAt() public view override returns (uint64) { + return state.slotB.lastUnpausedAt; + } + + /// @notice Retrieves the ID of the L1 block where the most recent L2 block was proposed. + /// @return The ID of the Li block where the most recent block was proposed. + function lastProposedIn() external view returns (uint56) { + return state.slotB.lastProposedIn; + } + + /// @inheritdoc ITaikoL1 + function getConfig() public pure virtual returns (TaikoData.Config memory) { + return TaikoData.Config({ + chainId: LibNetwork.TAIKO_MAINNET, + blockMaxProposals: 324_000, // = 7200 * 45 + blockRingBufferSize: 360_000, // = 7200 * 50 + maxBlocksToVerify: 16, + blockMaxGasLimit: 240_000_000, + livenessBond: 125e18, // 125 Taiko token + stateRootSyncInternal: 16, + maxAnchorHeightOffset: 64, + baseFeeConfig: LibSharedData.BaseFeeConfig({ + adjustmentQuotient: 8, + sharingPctg: 75, + gasIssuancePerSecond: 5_000_000, + minGasExcess: 1_340_000_000, + maxGasIssuancePerBlock: 600_000_000 // two minutes + }), + ontakeForkHeight: 0 + }); + } + + /// @dev chain watchdog is supposed to be a cold wallet. + function _authorizePause( + address, + bool + ) + internal + view + virtual + override + onlyFromOwnerOrNamed(LibStrings.B_CHAIN_WATCHDOG) + { } +} diff --git a/packages/protocol/contracts/layer1/devnet/DevnetTaikoL1.sol b/packages/protocol/contracts/layer1/devnet/DevnetTaikoL1.sol new file mode 100644 index 00000000000..f5f7ce2b21b --- /dev/null +++ b/packages/protocol/contracts/layer1/devnet/DevnetTaikoL1.sol @@ -0,0 +1,31 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "../based/TaikoL1.sol"; + +/// @title DevnetTaikoL1 +/// @dev Labeled in AddressResolver as "taiko" +/// @custom:security-contact security@taiko.xyz +contract DevnetTaikoL1 is TaikoL1 { + /// @inheritdoc ITaikoL1 + function getConfig() public pure override returns (TaikoData.Config memory) { + return TaikoData.Config({ + chainId: 167_001, + blockMaxProposals: 324_000, + blockRingBufferSize: 360_000, + maxBlocksToVerify: 16, + blockMaxGasLimit: 240_000_000, + livenessBond: 125e18, // 125 Taiko token + stateRootSyncInternal: 16, + maxAnchorHeightOffset: 64, + baseFeeConfig: LibSharedData.BaseFeeConfig({ + adjustmentQuotient: 8, + sharingPctg: 75, + gasIssuancePerSecond: 5_000_000, + minGasExcess: 1_340_000_000, + maxGasIssuancePerBlock: 600_000_000 + }), + ontakeForkHeight: 0 + }); + } +} diff --git a/packages/protocol/contracts/L1/tiers/DevnetTierProvider.sol b/packages/protocol/contracts/layer1/devnet/DevnetTierRouter.sol similarity index 60% rename from packages/protocol/contracts/L1/tiers/DevnetTierProvider.sol rename to packages/protocol/contracts/layer1/devnet/DevnetTierRouter.sol index 3f89772d41e..134265349a6 100644 --- a/packages/protocol/contracts/L1/tiers/DevnetTierProvider.sol +++ b/packages/protocol/contracts/layer1/devnet/DevnetTierRouter.sol @@ -1,19 +1,19 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; -import "./TierProviderBase.sol"; -import "./ITierRouter.sol"; +import "../tiers/TierProviderBase.sol"; +import "../tiers/ITierRouter.sol"; -/// @title DevnetTierProvider +/// @title DevnetTierRouter /// @custom:security-contact security@taiko.xyz -contract DevnetTierProvider is TierProviderBase, ITierRouter { +contract DevnetTierRouter is TierProviderBase, ITierRouter { /// @inheritdoc ITierRouter function getProvider(uint256) external view returns (address) { return address(this); } /// @inheritdoc ITierProvider - function getTierIds() public pure override returns (uint16[] memory tiers_) { + function getTierIds() external pure returns (uint16[] memory tiers_) { tiers_ = new uint16[](3); tiers_[0] = LibTiers.TIER_OPTIMISTIC; tiers_[1] = LibTiers.TIER_GUARDIAN_MINORITY; @@ -21,7 +21,7 @@ contract DevnetTierProvider is TierProviderBase, ITierRouter { } /// @inheritdoc ITierProvider - function getMinTier(uint256) public pure override returns (uint16) { + function getMinTier(address, uint256) public pure override returns (uint16) { return LibTiers.TIER_OPTIMISTIC; } } diff --git a/packages/protocol/contracts/layer1/fork/ForkManager.sol b/packages/protocol/contracts/layer1/fork/ForkManager.sol new file mode 100644 index 00000000000..3dd21f882ba --- /dev/null +++ b/packages/protocol/contracts/layer1/fork/ForkManager.sol @@ -0,0 +1,70 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol"; + +/// @title ForkManager +/// @custom:security-contact security@taiko.xyz +/// @notice This contract serves as a base contract for managing up to two forks within the Taiko +/// protocol. By default, all function calls are routed to the newFork address. +/// Sub-contracts should override the shouldRouteToOldFork function to route specific function calls +/// to the old fork address. +/// These sub-contracts should be placed between a proxy and the actual fork implementations. When +/// calling upgradeTo, the proxy should always upgrade to a new ForkManager implementation, not an +/// actual fork implementation. +/// It is strongly advised to name functions differently for the same functionality across the two +/// forks, as it is not possible to route the same function to two different forks. +/// +/// +--> newFork +/// PROXY -> FORK_MANAGER --| +/// +--> oldFork +contract ForkManager is UUPSUpgradeable, Ownable2StepUpgradeable { + address public immutable oldFork; + address public immutable newFork; + + error ForkAddressIsZero(); + error InvalidParams(); + + constructor(address _oldFork, address _currFork) { + require(_currFork != address(0) && _currFork != _oldFork, InvalidParams()); + oldFork = _oldFork; + newFork = _currFork; + } + + fallback() external payable virtual { + _fallback(); + } + + receive() external payable virtual { + _fallback(); + } + + function isForkManager() public pure returns (bool) { + return true; + } + + function _fallback() internal virtual { + address fork = shouldRouteToOldFork(msg.sig) ? oldFork : newFork; + require(fork != address(0), ForkAddressIsZero()); + + assembly { + calldatacopy(0, 0, calldatasize()) + let result := delegatecall(gas(), fork, 0, calldatasize(), 0, 0) + returndatacopy(0, 0, returndatasize()) + + switch result + case 0 { revert(0, returndatasize()) } + default { return(0, returndatasize()) } + } + } + + function _authorizeUpgrade(address) internal virtual override onlyOwner { } + + /// @notice Determines if the call should be routed to the old fork. + /// @dev This function is intended to be overridden in derived contracts to provide custom + /// routing logic. + /// @param _selector The function selector of the call. + /// @return A boolean value indicating whether the call should be routed to the old fork. + function shouldRouteToOldFork(bytes4 _selector) internal pure virtual returns (bool) { } +} diff --git a/packages/protocol/contracts/layer1/hekla/HeklaTaikoL1.sol b/packages/protocol/contracts/layer1/hekla/HeklaTaikoL1.sol new file mode 100644 index 00000000000..162ca9e930c --- /dev/null +++ b/packages/protocol/contracts/layer1/hekla/HeklaTaikoL1.sol @@ -0,0 +1,33 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "../based/TaikoL1.sol"; + +/// @title HeklaTaikoL1 +/// @dev Labeled in AddressResolver as "taiko" +/// @custom:security-contact security@taiko.xyz +contract HeklaTaikoL1 is TaikoL1 { + /// @inheritdoc ITaikoL1 + function getConfig() public pure override returns (TaikoData.Config memory) { + return TaikoData.Config({ + chainId: LibNetwork.TAIKO_HEKLA, + // Never change this value as ring buffer is being reused!!! + blockMaxProposals: 324_000, + // Never change this value as ring buffer is being reused!!! + blockRingBufferSize: 324_512, + maxBlocksToVerify: 16, + blockMaxGasLimit: 240_000_000, + livenessBond: 125e18, // 125 Taiko token + stateRootSyncInternal: 16, + maxAnchorHeightOffset: 64, + baseFeeConfig: LibSharedData.BaseFeeConfig({ + adjustmentQuotient: 8, + sharingPctg: 75, + gasIssuancePerSecond: 5_000_000, + minGasExcess: 1_340_000_000, + maxGasIssuancePerBlock: 600_000_000 // two minutes + }), + ontakeForkHeight: 840_512 + }); + } +} diff --git a/packages/protocol/contracts/layer1/hekla/HeklaTaikoToken.sol b/packages/protocol/contracts/layer1/hekla/HeklaTaikoToken.sol new file mode 100644 index 00000000000..bd8eff2892a --- /dev/null +++ b/packages/protocol/contracts/layer1/hekla/HeklaTaikoToken.sol @@ -0,0 +1,163 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20SnapshotUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20VotesUpgradeable.sol"; +import "src/shared/common/EssentialContract.sol"; + +/// @title HeklaTaikoToken +/// @notice Taiko token for Taiko Hekla testnet. +/// @dev Labeled in AddressResolver as "taiko_token". +/// @dev Due to historical reasons, the Taiko Token on Hekla has a different storage layout compared +/// to the mainnet token contract. Therefore, we need to maintain this file. +/// @custom:security-contact security@taiko.xyz +contract HeklaTaikoToken is EssentialContract, ERC20SnapshotUpgradeable, ERC20VotesUpgradeable { + uint256[50] private __gap; + + error TKO_INVALID_ADDR(); + error TT_INVALID_PARAM(); + + /// @notice Initializes the contract. + /// @param _owner The owner of this contract. msg.sender will be used if this value is zero. + /// @param _name The name of the token. + /// @param _symbol The symbol of the token. + /// @param _recipient The address to receive initial token minting. + /// @param _addressManager The AddressManager address. + function init( + address _owner, + string calldata _name, + string calldata _symbol, + address _recipient, + address _addressManager + ) + public + initializer + { + __Essential_init(_owner, _addressManager); + __ERC20_init(_name, _symbol); + __ERC20Snapshot_init(); + __ERC20Votes_init(); + __ERC20Permit_init(_name); + + // Mint 1 billion tokens + _mint(_recipient, 1_000_000_000 ether); + } + + /// @notice Burns tokens from the specified address. + /// @param _from The address to burn tokens from. + /// @param _amount The amount of tokens to burn. + function burn(address _from, uint256 _amount) public onlyOwner { + return _burn(_from, _amount); + } + + /// @notice Creates a new token snapshot. + function snapshot() public onlyFromOwnerOrNamed("snapshooter") returns (uint256) { + return _snapshot(); + } + + /// @notice Transfers tokens to a specified address. + /// @param _to The address to transfer tokens to. + /// @param _amount The amount of tokens to transfer. + /// @return A boolean indicating whether the transfer was successful or not. + function transfer(address _to, uint256 _amount) public override returns (bool) { + if (_to == address(this)) revert TKO_INVALID_ADDR(); + return super.transfer(_to, _amount); + } + + /// @notice Transfers tokens from one address to another. + /// @param _from The address to transfer tokens from. + /// @param _to The address to transfer tokens to. + /// @param _amount The amount of tokens to transfer. + /// @return A boolean indicating whether the transfer was successful or not. + function transferFrom( + address _from, + address _to, + uint256 _amount + ) + public + override + returns (bool) + { + if (_to == address(this)) revert TKO_INVALID_ADDR(); + return super.transferFrom(_from, _to, _amount); + } + + function clock() public view override returns (uint48) { + return SafeCastUpgradeable.toUint48(block.timestamp); + } + + // solhint-disable-next-line func-name-mixedcase + function CLOCK_MODE() public pure override returns (string memory) { + // See https://eips.ethereum.org/EIPS/eip-6372 + return "mode=timestamp"; + } + + function name() public pure override returns (string memory) { + return "Taiko Token"; + } + + function symbol() public pure override returns (string memory) { + return "TAIKO"; + } + + function _beforeTokenTransfer( + address _from, + address _to, + uint256 _amount + ) + internal + override(ERC20Upgradeable, ERC20SnapshotUpgradeable) + { + return super._beforeTokenTransfer(_from, _to, _amount); + } + + function _afterTokenTransfer( + address _from, + address _to, + uint256 _amount + ) + internal + override(ERC20Upgradeable, ERC20VotesUpgradeable) + { + return super._afterTokenTransfer(_from, _to, _amount); + } + + function _mint( + address _to, + uint256 _amount + ) + internal + override(ERC20Upgradeable, ERC20VotesUpgradeable) + { + return super._mint(_to, _amount); + } + + function _burn( + address _from, + uint256 _amount + ) + internal + override(ERC20Upgradeable, ERC20VotesUpgradeable) + { + return super._burn(_from, _amount); + } + + /// @notice Batch transfers tokens + /// @param recipients The list of addresses to transfer tokens to. + /// @param amounts The list of amounts for transfer. + /// @return true if the transfer is successful. + function batchTransfer( + address[] calldata recipients, + uint256[] calldata amounts + ) + external + returns (bool) + { + if (recipients.length != amounts.length) revert TT_INVALID_PARAM(); + for (uint256 i; i < recipients.length; ++i) { + _transfer(msg.sender, recipients[i], amounts[i]); + } + return true; + } +} diff --git a/packages/protocol/contracts/layer1/hekla/HeklaTierRouter.sol b/packages/protocol/contracts/layer1/hekla/HeklaTierRouter.sol new file mode 100644 index 00000000000..2c77b524c95 --- /dev/null +++ b/packages/protocol/contracts/layer1/hekla/HeklaTierRouter.sol @@ -0,0 +1,45 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "../tiers/TierProviderBase.sol"; +import "../tiers/ITierRouter.sol"; + +/// @title HeklaTierRouter +/// @dev Any changes to the configuration in this file must be announced and documented on our site. +/// Ensure all modifications are reviewed by the devrel team. +/// @custom:security-contact security@taiko.xyz +contract HeklaTierRouter is TierProviderBase, ITierRouter { + address public immutable DAO_FALLBACK_PROPOSER; + + constructor(address _daoFallbackProposer) { + // 0xD3f681bD6B49887A48cC9C9953720903967E9DC0 + DAO_FALLBACK_PROPOSER = _daoFallbackProposer; + } + + /// @inheritdoc ITierRouter + function getProvider(uint256) external view returns (address) { + return address(this); + } + + /// @inheritdoc ITierProvider + function getTierIds() external pure returns (uint16[] memory tiers_) { + tiers_ = new uint16[](6); + tiers_[0] = LibTiers.TIER_OPTIMISTIC; + tiers_[1] = LibTiers.TIER_SGX; + tiers_[2] = LibTiers.TIER_ZKVM_RISC0; + tiers_[3] = LibTiers.TIER_ZKVM_SP1; + tiers_[4] = LibTiers.TIER_GUARDIAN_MINORITY; + tiers_[5] = LibTiers.TIER_GUARDIAN; + } + + /// @inheritdoc ITierProvider + function getMinTier(address _proposer, uint256 _rand) public view override returns (uint16) { + if (_proposer == DAO_FALLBACK_PROPOSER) { + if (_rand % 1000 == 0) return LibTiers.TIER_ZKVM_RISC0; + else if (_rand % 1000 == 1) return LibTiers.TIER_ZKVM_SP1; + else return LibTiers.TIER_SGX; + } + + return _rand % 2 == 0 ? LibTiers.TIER_SGX : LibTiers.TIER_OPTIMISTIC; + } +} diff --git a/packages/protocol/contracts/layer1/mainnet/README.md b/packages/protocol/contracts/layer1/mainnet/README.md new file mode 100644 index 00000000000..1f73bd10883 --- /dev/null +++ b/packages/protocol/contracts/layer1/mainnet/README.md @@ -0,0 +1,5 @@ +# Optimized Smart Contracts for Taiko Mainnet + +## Overview + +This directory contains optimized versions of smart contracts for deployment on Ethereum for Taiko mainnet. While some of these contracts may be used on Taiko L2, deployment on Layer 2 is not recommended due to lack of testing. diff --git a/packages/protocol/contracts/layer1/mainnet/addrcache/AddressCache.sol b/packages/protocol/contracts/layer1/mainnet/addrcache/AddressCache.sol new file mode 100644 index 00000000000..6dfc98aae8e --- /dev/null +++ b/packages/protocol/contracts/layer1/mainnet/addrcache/AddressCache.sol @@ -0,0 +1,43 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +/// @title AddressCache +/// @custom:security-contact security@taiko.xyz +abstract contract AddressCache { + /// @notice This function retrieves the address associated with a given chain ID and name. + /// If the address is not found in the cache, it falls back to the provided function. + /// @param _chainId The chain ID for which the address is to be retrieved. + /// @param _name The name associated with the address to be retrieved. + /// @param _fallbackFunc The fallback function to be used if the address is not found in the + /// cache. + /// @return The address associated with the given chain ID and name. + function getAddress( + uint64 _chainId, + bytes32 _name, + function (uint64, bytes32) view returns (address) _fallbackFunc + ) + internal + view + returns (address) + { + (bool found, address addr) = getCachedAddress(_chainId, _name); + return found ? addr : _fallbackFunc(_chainId, _name); + } + + /// @notice This function retrieves the cached address associated with a given chain ID and + /// name. + /// @dev This function is virtual and should be overridden in derived contracts. + /// @param _chainId The chain ID for which the address is to be retrieved. + /// @param _name The name associated with the address to be retrieved. + /// @return found_ A boolean indicating whether the address was found in the cache. + /// @return addr_ The address associated with the given chain ID and name, if found in the + /// cache. + function getCachedAddress( + uint64 _chainId, + bytes32 _name + ) + internal + pure + virtual + returns (bool found_, address addr_); +} diff --git a/packages/protocol/contracts/layer1/mainnet/addrcache/RollupAddressCache.sol b/packages/protocol/contracts/layer1/mainnet/addrcache/RollupAddressCache.sol new file mode 100644 index 00000000000..003cc333e52 --- /dev/null +++ b/packages/protocol/contracts/layer1/mainnet/addrcache/RollupAddressCache.sol @@ -0,0 +1,62 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "src/shared/common/LibStrings.sol"; +import "src/shared/common/LibNetwork.sol"; +import "./AddressCache.sol"; + +/// @title RollupAddressCache +/// @custom:security-contact security@taiko.xyz +contract RollupAddressCache is AddressCache { + function getCachedAddress( + uint64 _chainId, + bytes32 _name + ) + internal + pure + override + returns (bool found, address addr) + { + if (_chainId != LibNetwork.ETHEREUM_MAINNET) { + return (false, address(0)); + } + + if (_name == LibStrings.B_BOND_TOKEN) { + return (true, 0x10dea67478c5F8C5E2D90e5E9B26dBe60c54d800); + } + if (_name == LibStrings.B_TAIKO_TOKEN) { + return (true, 0x10dea67478c5F8C5E2D90e5E9B26dBe60c54d800); + } + if (_name == LibStrings.B_SIGNAL_SERVICE) { + return (true, 0x9e0a24964e5397B566c1ed39258e21aB5E35C77C); + } + if (_name == LibStrings.B_BRIDGE) { + return (true, 0xd60247c6848B7Ca29eDdF63AA924E53dB6Ddd8EC); + } + if (_name == LibStrings.B_TAIKO) { + return (true, 0x06a9Ab27c7e2255df1815E6CC0168d7755Feb19a); + } + if (_name == LibStrings.B_TIER_ROUTER) { + return (true, 0x8a4c692F12d3a9750E744A4CE24a1d351bE52E66); + } + if (_name == LibStrings.B_TIER_SGX) { + return (true, 0xb0f3186FC1963f774f52ff455DC86aEdD0b31F81); + } + if (_name == LibStrings.B_TIER_GUARDIAN_MINORITY) { + return (true, 0x579A8d63a2Db646284CBFE31FE5082c9989E985c); + } + if (_name == LibStrings.B_TIER_GUARDIAN) { + return (true, 0xE3D777143Ea25A6E031d1e921F396750885f43aC); + } + if (_name == LibStrings.B_AUTOMATA_DCAP_ATTESTATION) { + return (true, 0x8d7C954960a36a7596d7eA4945dDf891967ca8A3); + } + if (_name == LibStrings.B_PRECONF_TASK_MANAGER) { + return (true, address(0)); + } + if (_name == LibStrings.B_CHAIN_WATCHDOG) { + return (true, 0xE3D777143Ea25A6E031d1e921F396750885f43aC); + } + return (false, address(0)); + } +} diff --git a/packages/protocol/contracts/layer1/mainnet/addrcache/SharedAddressCache.sol b/packages/protocol/contracts/layer1/mainnet/addrcache/SharedAddressCache.sol new file mode 100644 index 00000000000..b870f54aeeb --- /dev/null +++ b/packages/protocol/contracts/layer1/mainnet/addrcache/SharedAddressCache.sol @@ -0,0 +1,71 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "src/shared/common/LibStrings.sol"; +import "src/shared/common/LibNetwork.sol"; +import "./AddressCache.sol"; + +/// @title SharedAddressCache +/// @custom:security-contact security@taiko.xyz +contract SharedAddressCache is AddressCache { + function getCachedAddress( + uint64 _chainId, + bytes32 _name + ) + internal + pure + override + returns (bool found, address addr) + { + if (_chainId == LibNetwork.ETHEREUM_MAINNET) { + if (_name == LibStrings.B_TAIKO_TOKEN) { + return (true, 0x10dea67478c5F8C5E2D90e5E9B26dBe60c54d800); + } + if (_name == LibStrings.B_QUOTA_MANAGER) { + return (true, 0x91f67118DD47d502B1f0C354D0611997B022f29E); + } + if (_name == LibStrings.B_BRIDGE) { + return (true, 0xd60247c6848B7Ca29eDdF63AA924E53dB6Ddd8EC); + } + if (_name == LibStrings.B_BRIDGED_ERC20) { + return (true, 0x65666141a541423606365123Ed280AB16a09A2e1); + } + if (_name == LibStrings.B_BRIDGED_ERC721) { + return (true, 0xC3310905E2BC9Cfb198695B75EF3e5B69C6A1Bf7); + } + if (_name == LibStrings.B_BRIDGED_ERC1155) { + return (true, 0x3c90963cFBa436400B0F9C46Aa9224cB379c2c40); + } + if (_name == LibStrings.B_ERC20_VAULT) { + return (true, 0x996282cA11E5DEb6B5D122CC3B9A1FcAAD4415Ab); + } + if (_name == LibStrings.B_ERC721_VAULT) { + return (true, 0x0b470dd3A0e1C41228856Fb319649E7c08f419Aa); + } + if (_name == LibStrings.B_ERC1155_VAULT) { + return (true, 0xaf145913EA4a56BE22E120ED9C24589659881702); + } + if (_name == LibStrings.B_SIGNAL_SERVICE) { + return (true, 0x9e0a24964e5397B566c1ed39258e21aB5E35C77C); + } + } else if (_chainId == LibNetwork.TAIKO_MAINNET) { + if (_name == LibStrings.B_BRIDGE) { + return (true, 0x1670000000000000000000000000000000000001); + } + if (_name == LibStrings.B_ERC20_VAULT) { + return (true, 0x1670000000000000000000000000000000000002); + } + if (_name == LibStrings.B_ERC721_VAULT) { + return (true, 0x1670000000000000000000000000000000000003); + } + if (_name == LibStrings.B_ERC1155_VAULT) { + return (true, 0x1670000000000000000000000000000000000004); + } + if (_name == LibStrings.B_SIGNAL_SERVICE) { + return (true, 0x1670000000000000000000000000000000000005); + } + } + + return (false, address(0)); + } +} diff --git a/packages/protocol/contracts/layer1/mainnet/multirollup/MainnetBridge.sol b/packages/protocol/contracts/layer1/mainnet/multirollup/MainnetBridge.sol new file mode 100644 index 00000000000..bc7877c5660 --- /dev/null +++ b/packages/protocol/contracts/layer1/mainnet/multirollup/MainnetBridge.sol @@ -0,0 +1,53 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "src/shared/bridge/Bridge.sol"; +import "../addrcache/SharedAddressCache.sol"; +import "../reentrylock/LibFasterReentryLock.sol"; + +/// @title MainnetBridge +/// @dev This contract shall be deployed to replace its parent contract on Ethereum for Taiko +/// mainnet to reduce gas cost. In theory, the contract can also be deplyed on Taiko L2 but this is +/// not well testee nor necessary. +/// @notice See the documentation in {Bridge}. +/// @custom:security-contact security@taiko.xyz +contract MainnetBridge is Bridge, SharedAddressCache { + /// @dev The slot in transient storage of the call context. This is the keccak256 hash + /// of "bridge.ctx_slot" + bytes32 private constant _CTX_SLOT = + 0xe4ece82196de19aabe639620d7f716c433d1348f96ce727c9989a982dbadc2b9; + + function _getAddress(uint64 _chainId, bytes32 _name) internal view override returns (address) { + return getAddress(_chainId, _name, super._getAddress); + } + + function _storeReentryLock(uint8 _reentry) internal override { + LibFasterReentryLock.storeReentryLock(_reentry); + } + + function _loadReentryLock() internal view override returns (uint8) { + return LibFasterReentryLock.loadReentryLock(); + } + + /// @inheritdoc Bridge + function _storeContext(bytes32 _msgHash, address _from, uint64 _srcChainId) internal override { + assembly { + tstore(_CTX_SLOT, _msgHash) + tstore(add(_CTX_SLOT, 1), _from) + tstore(add(_CTX_SLOT, 2), _srcChainId) + } + } + + /// @inheritdoc Bridge + function _loadContext() internal view override returns (Context memory) { + bytes32 msgHash; + address from; + uint64 srcChainId; + assembly { + msgHash := tload(_CTX_SLOT) + from := tload(add(_CTX_SLOT, 1)) + srcChainId := tload(add(_CTX_SLOT, 2)) + } + return Context(msgHash, from, srcChainId); + } +} diff --git a/packages/protocol/contracts/layer1/mainnet/multirollup/MainnetERC1155Vault.sol b/packages/protocol/contracts/layer1/mainnet/multirollup/MainnetERC1155Vault.sol new file mode 100644 index 00000000000..e44b1efb69c --- /dev/null +++ b/packages/protocol/contracts/layer1/mainnet/multirollup/MainnetERC1155Vault.sol @@ -0,0 +1,26 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "src/shared/tokenvault/ERC1155Vault.sol"; +import "../addrcache/SharedAddressCache.sol"; +import "../reentrylock/LibFasterReentryLock.sol"; + +/// @title MainnetERC1155Vault +/// @dev This contract shall be deployed to replace its parent contract on Ethereum for Taiko +/// mainnet to reduce gas cost. In theory, the contract can also be deplyed on Taiko L2 but this is +/// not well testee nor necessary. +/// @notice See the documentation in {ER1155Vault}. +/// @custom:security-contact security@taiko.xyz +contract MainnetERC1155Vault is ERC1155Vault, SharedAddressCache { + function _getAddress(uint64 _chainId, bytes32 _name) internal view override returns (address) { + return getAddress(_chainId, _name, super._getAddress); + } + + function _storeReentryLock(uint8 _reentry) internal override { + LibFasterReentryLock.storeReentryLock(_reentry); + } + + function _loadReentryLock() internal view override returns (uint8) { + return LibFasterReentryLock.loadReentryLock(); + } +} diff --git a/packages/protocol/contracts/layer1/mainnet/multirollup/MainnetERC20Vault.sol b/packages/protocol/contracts/layer1/mainnet/multirollup/MainnetERC20Vault.sol new file mode 100644 index 00000000000..605b40932b5 --- /dev/null +++ b/packages/protocol/contracts/layer1/mainnet/multirollup/MainnetERC20Vault.sol @@ -0,0 +1,26 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "src/shared/tokenvault/ERC20Vault.sol"; +import "../addrcache/SharedAddressCache.sol"; +import "../reentrylock/LibFasterReentryLock.sol"; + +/// @title MainnetERC20Vault +/// @dev This contract shall be deployed to replace its parent contract on Ethereum for Taiko +/// mainnet to reduce gas cost. In theory, the contract can also be deplyed on Taiko L2 but this is +/// not well testee nor necessary. +/// @notice See the documentation in {ER20Vault}. +/// @custom:security-contact security@taiko.xyz +contract MainnetERC20Vault is ERC20Vault, SharedAddressCache { + function _getAddress(uint64 _chainId, bytes32 _name) internal view override returns (address) { + return getAddress(_chainId, _name, super._getAddress); + } + + function _storeReentryLock(uint8 _reentry) internal override { + LibFasterReentryLock.storeReentryLock(_reentry); + } + + function _loadReentryLock() internal view override returns (uint8) { + return LibFasterReentryLock.loadReentryLock(); + } +} diff --git a/packages/protocol/contracts/layer1/mainnet/multirollup/MainnetERC721Vault.sol b/packages/protocol/contracts/layer1/mainnet/multirollup/MainnetERC721Vault.sol new file mode 100644 index 00000000000..f4ab9bec3a3 --- /dev/null +++ b/packages/protocol/contracts/layer1/mainnet/multirollup/MainnetERC721Vault.sol @@ -0,0 +1,26 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "src/shared/tokenvault/ERC721Vault.sol"; +import "../addrcache/SharedAddressCache.sol"; +import "../reentrylock/LibFasterReentryLock.sol"; + +/// @title MainnetERC721Vault +/// @dev This contract shall be deployed to replace its parent contract on Ethereum for Taiko +/// mainnet to reduce gas cost. In theory, the contract can also be deplyed on Taiko L2 but this is +/// not well testee nor necessary. +/// @notice See the documentation in {ER721Vault}. +/// @custom:security-contact security@taiko.xyz +contract MainnetERC721Vault is ERC721Vault, SharedAddressCache { + function _getAddress(uint64 _chainId, bytes32 _name) internal view override returns (address) { + return getAddress(_chainId, _name, super._getAddress); + } + + function _storeReentryLock(uint8 _reentry) internal override { + LibFasterReentryLock.storeReentryLock(_reentry); + } + + function _loadReentryLock() internal view override returns (uint8) { + return LibFasterReentryLock.loadReentryLock(); + } +} diff --git a/packages/protocol/contracts/layer1/mainnet/multirollup/MainnetSharedAddressManager.sol b/packages/protocol/contracts/layer1/mainnet/multirollup/MainnetSharedAddressManager.sol new file mode 100644 index 00000000000..9a2c3cfa3f8 --- /dev/null +++ b/packages/protocol/contracts/layer1/mainnet/multirollup/MainnetSharedAddressManager.sol @@ -0,0 +1,26 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "src/shared/common/AddressManager.sol"; +import "src/shared/common/LibStrings.sol"; +import "../addrcache/SharedAddressCache.sol"; +import "../reentrylock/LibFasterReentryLock.sol"; + +/// @title MainnetSharedAddressManager +/// @dev This contract shall be deployed to replace its parent contract on Ethereum for Taiko +/// mainnet to reduce gas cost. +/// @notice See the documentation in {IAddressManager}. +/// @custom:security-contact security@taiko.xyz +contract MainnetSharedAddressManager is AddressManager, SharedAddressCache { + function _getAddress(uint64 _chainId, bytes32 _name) internal view override returns (address) { + return getAddress(_chainId, _name, super._getAddress); + } + + function _storeReentryLock(uint8 _reentry) internal override { + LibFasterReentryLock.storeReentryLock(_reentry); + } + + function _loadReentryLock() internal view override returns (uint8) { + return LibFasterReentryLock.loadReentryLock(); + } +} diff --git a/packages/protocol/contracts/layer1/mainnet/multirollup/MainnetSignalService.sol b/packages/protocol/contracts/layer1/mainnet/multirollup/MainnetSignalService.sol new file mode 100644 index 00000000000..b5958753f14 --- /dev/null +++ b/packages/protocol/contracts/layer1/mainnet/multirollup/MainnetSignalService.sol @@ -0,0 +1,26 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "src/shared/signal/SignalService.sol"; +import "../addrcache/SharedAddressCache.sol"; +import "../reentrylock/LibFasterReentryLock.sol"; + +/// @title MainnetSignalService +/// @dev This contract shall be deployed to replace its parent contract on Ethereum for Taiko +/// mainnet to reduce gas cost. In theory, the contract can also be deplyed on Taiko L2 but this is +/// not well testee nor necessary. +/// @notice See the documentation in {SignalService}. +/// @custom:security-contact security@taiko.xyz +contract MainnetSignalService is SignalService, SharedAddressCache { + function _getAddress(uint64 _chainId, bytes32 _name) internal view override returns (address) { + return getAddress(_chainId, _name, super._getAddress); + } + + function _storeReentryLock(uint8 _reentry) internal override { + LibFasterReentryLock.storeReentryLock(_reentry); + } + + function _loadReentryLock() internal view override returns (uint8) { + return LibFasterReentryLock.loadReentryLock(); + } +} diff --git a/packages/protocol/contracts/layer1/mainnet/reentrylock/LibFasterReentryLock.sol b/packages/protocol/contracts/layer1/mainnet/reentrylock/LibFasterReentryLock.sol new file mode 100644 index 00000000000..cfa3d7c066e --- /dev/null +++ b/packages/protocol/contracts/layer1/mainnet/reentrylock/LibFasterReentryLock.sol @@ -0,0 +1,26 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +/// @title LibFasterReentryLock +/// @custom:security-contact security@taiko.xyz +library LibFasterReentryLock { + /// @dev The slot in transient storage of the reentry lock. + /// This is the result of keccak256("ownerUUPS.reentry_slot") plus 1. The addition aims to + /// prevent hash collisions with slots defined in EIP-1967, where slots are derived by + /// keccak256("something") - 1, and with slots in SignalService, calculated directly with + /// keccak256("something"). + bytes32 private constant _REENTRY_SLOT = + 0xa5054f728453d3dbe953bdc43e4d0cb97e662ea32d7958190f3dc2da31d9721b; + + function storeReentryLock(uint8 _reentry) internal { + assembly { + tstore(_REENTRY_SLOT, _reentry) + } + } + + function loadReentryLock() internal view returns (uint8 reentry_) { + assembly { + reentry_ := tload(_REENTRY_SLOT) + } + } +} diff --git a/packages/protocol/contracts/layer1/mainnet/rollup/MainnetGuardianProver.sol b/packages/protocol/contracts/layer1/mainnet/rollup/MainnetGuardianProver.sol new file mode 100644 index 00000000000..baf50487d03 --- /dev/null +++ b/packages/protocol/contracts/layer1/mainnet/rollup/MainnetGuardianProver.sol @@ -0,0 +1,25 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "src/layer1/provers/GuardianProver.sol"; +import "../addrcache/RollupAddressCache.sol"; +import "../reentrylock/LibFasterReentryLock.sol"; +/// @title MainnetGuardianProver +/// @dev This contract shall be deployed to replace its parent contract on Ethereum for Taiko +/// mainnet to reduce gas cost. +/// @notice See the documentation in {GuardianProver}. +/// @custom:security-contact security@taiko.xyz + +contract MainnetGuardianProver is GuardianProver, RollupAddressCache { + function _getAddress(uint64 _chainId, bytes32 _name) internal view override returns (address) { + return getAddress(_chainId, _name, super._getAddress); + } + + function _storeReentryLock(uint8 _reentry) internal override { + LibFasterReentryLock.storeReentryLock(_reentry); + } + + function _loadReentryLock() internal view override returns (uint8) { + return LibFasterReentryLock.loadReentryLock(); + } +} diff --git a/packages/protocol/contracts/layer1/mainnet/rollup/MainnetProverSet.sol b/packages/protocol/contracts/layer1/mainnet/rollup/MainnetProverSet.sol new file mode 100644 index 00000000000..27c0de89bf2 --- /dev/null +++ b/packages/protocol/contracts/layer1/mainnet/rollup/MainnetProverSet.sol @@ -0,0 +1,26 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "src/layer1/provers/ProverSet.sol"; +import "../addrcache/RollupAddressCache.sol"; +import "../reentrylock/LibFasterReentryLock.sol"; + +/// @title MainnetProverSet +/// @dev This contract shall be deployed to replace its parent contract on Ethereum for Taiko +/// mainnet to reduce gas cost. In theory, the contract can also be deplyed on Taiko L2 but this is +/// not well testee nor necessary. +/// @notice See the documentation in {ProverSet}. +/// @custom:security-contact security@taiko.xyz +contract MainnetProverSet is ProverSet, RollupAddressCache { + function _getAddress(uint64 _chainId, bytes32 _name) internal view override returns (address) { + return getAddress(_chainId, _name, super._getAddress); + } + + function _storeReentryLock(uint8 _reentry) internal override { + LibFasterReentryLock.storeReentryLock(_reentry); + } + + function _loadReentryLock() internal view override returns (uint8) { + return LibFasterReentryLock.loadReentryLock(); + } +} diff --git a/packages/protocol/contracts/layer1/mainnet/rollup/MainnetRollupAddressManager.sol b/packages/protocol/contracts/layer1/mainnet/rollup/MainnetRollupAddressManager.sol new file mode 100644 index 00000000000..74728ba20a5 --- /dev/null +++ b/packages/protocol/contracts/layer1/mainnet/rollup/MainnetRollupAddressManager.sol @@ -0,0 +1,26 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "src/shared/common/AddressManager.sol"; +import "src/shared/common/LibStrings.sol"; +import "../addrcache/RollupAddressCache.sol"; +import "../reentrylock/LibFasterReentryLock.sol"; + +/// @title MainnetRollupAddressManager +/// @dev This contract shall be deployed to replace its parent contract on Ethereum for Taiko +/// mainnet to reduce gas cost. +/// @notice See the documentation in {IAddressManager}. +/// @custom:security-contact security@taiko.xyz +contract MainnetRollupAddressManager is AddressManager, RollupAddressCache { + function _getAddress(uint64 _chainId, bytes32 _name) internal view override returns (address) { + return getAddress(_chainId, _name, super._getAddress); + } + + function _storeReentryLock(uint8 _reentry) internal override { + LibFasterReentryLock.storeReentryLock(_reentry); + } + + function _loadReentryLock() internal view override returns (uint8) { + return LibFasterReentryLock.loadReentryLock(); + } +} diff --git a/packages/protocol/contracts/layer1/mainnet/rollup/MainnetTaikoL1.sol b/packages/protocol/contracts/layer1/mainnet/rollup/MainnetTaikoL1.sol new file mode 100644 index 00000000000..8c43054d500 --- /dev/null +++ b/packages/protocol/contracts/layer1/mainnet/rollup/MainnetTaikoL1.sol @@ -0,0 +1,53 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "src/layer1/based/TaikoL1.sol"; +import "../addrcache/RollupAddressCache.sol"; +import "../reentrylock/LibFasterReentryLock.sol"; + +/// @title MainnetTaikoL1 +/// @dev This contract shall be deployed to replace its parent contract on Ethereum for Taiko +/// mainnet to reduce gas cost. +/// @notice See the documentation in {TaikoL1}. +/// @custom:security-contact security@taiko.xyz +contract MainnetTaikoL1 is TaikoL1, RollupAddressCache { + /// @inheritdoc ITaikoL1 + function getConfig() public pure override returns (TaikoData.Config memory) { + // All hard-coded configurations: + // - treasury: the actual TaikoL2 address. + // - anchorGasLimit: 250_000 (based on internal devnet, its ~220_000 + // after 256 L2 blocks) + return TaikoData.Config({ + chainId: LibNetwork.TAIKO_MAINNET, + // Ring buffers are being reused on the mainnet, therefore the following two + // configuration values must NEVER be changed!!! + blockMaxProposals: 324_000, // DO NOT CHANGE!!! + blockRingBufferSize: 360_000, // DO NOT CHANGE!!! + maxBlocksToVerify: 16, + blockMaxGasLimit: 240_000_000, + livenessBond: 125e18, // 125 Taiko token + stateRootSyncInternal: 16, + maxAnchorHeightOffset: 64, + baseFeeConfig: LibSharedData.BaseFeeConfig({ + adjustmentQuotient: 8, + sharingPctg: 75, + gasIssuancePerSecond: 5_000_000, + minGasExcess: 1_340_000_000, // correspond to 0.008847185 gwei basefee + maxGasIssuancePerBlock: 600_000_000 // two minutes: 5_000_000 * 120 + }), + ontakeForkHeight: 538_304 + }); + } + + function _getAddress(uint64 _chainId, bytes32 _name) internal view override returns (address) { + return getAddress(_chainId, _name, super._getAddress); + } + + function _storeReentryLock(uint8 _reentry) internal override { + LibFasterReentryLock.storeReentryLock(_reentry); + } + + function _loadReentryLock() internal view override returns (uint8) { + return LibFasterReentryLock.loadReentryLock(); + } +} diff --git a/packages/protocol/contracts/layer1/mainnet/rollup/MainnetTierRouter.sol b/packages/protocol/contracts/layer1/mainnet/rollup/MainnetTierRouter.sol new file mode 100644 index 00000000000..282d65e8342 --- /dev/null +++ b/packages/protocol/contracts/layer1/mainnet/rollup/MainnetTierRouter.sol @@ -0,0 +1,44 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "src/layer1/tiers/ITierRouter.sol"; +import "src/layer1/tiers/TierProviderBase.sol"; + +/// @title MainnetTierRouter +/// @dev Any changes to the configuration in this file must be announced and documented on our site. +/// Ensure all modifications are reviewed by the devrel team. +/// @dev Labeled in AddressResolver as "tier_router" +/// @custom:security-contact security@taiko.xyz +contract MainnetTierRouter is ITierRouter, TierProviderBase { + address public immutable DAO_FALLBACK_PROPOSER; + + constructor(address _daoFallbackProposer) { + // 0x68d30f47F19c07bCCEf4Ac7FAE2Dc12FCa3e0dC9 + DAO_FALLBACK_PROPOSER = _daoFallbackProposer; + } + + /// @inheritdoc ITierRouter + function getProvider(uint256) external view returns (address) { + return address(this); + } + + /// @inheritdoc ITierProvider + function getTierIds() external pure returns (uint16[] memory tiers_) { + tiers_ = new uint16[](5); + tiers_[0] = LibTiers.TIER_SGX; + tiers_[1] = LibTiers.TIER_ZKVM_RISC0; + tiers_[2] = LibTiers.TIER_ZKVM_SP1; + tiers_[3] = LibTiers.TIER_GUARDIAN_MINORITY; + tiers_[4] = LibTiers.TIER_GUARDIAN; + } + + /// @inheritdoc ITierProvider + function getMinTier(address _proposer, uint256 _rand) public view override returns (uint16) { + if (_proposer == DAO_FALLBACK_PROPOSER) { + if (_rand % 1000 == 0) return LibTiers.TIER_ZKVM_RISC0; + else if (_rand % 1000 < 29) return LibTiers.TIER_ZKVM_SP1; + else return LibTiers.TIER_SGX; + } + return LibTiers.TIER_SGX; + } +} diff --git a/packages/protocol/contracts/layer1/mainnet/rollup/verifiers/MainnetRisc0Verifier.sol b/packages/protocol/contracts/layer1/mainnet/rollup/verifiers/MainnetRisc0Verifier.sol new file mode 100644 index 00000000000..538831547d3 --- /dev/null +++ b/packages/protocol/contracts/layer1/mainnet/rollup/verifiers/MainnetRisc0Verifier.sol @@ -0,0 +1,25 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "src/layer1/verifiers/Risc0Verifier.sol"; +import "src/layer1/mainnet/addrcache/RollupAddressCache.sol"; +import "src/layer1/mainnet/reentrylock/LibFasterReentryLock.sol"; + +/// @title MainnetRisc0Verifier +/// @dev This contract shall be deployed to replace its parent contract on Ethereum for Taiko +/// mainnet to reduce gas cost. +/// @notice See the documentation in {Risc0Verifier}. +/// @custom:security-contact security@taiko.xyz +contract MainnetRisc0Verifier is Risc0Verifier, RollupAddressCache { + function _getAddress(uint64 _chainId, bytes32 _name) internal view override returns (address) { + return getAddress(_chainId, _name, super._getAddress); + } + + function _storeReentryLock(uint8 _reentry) internal override { + LibFasterReentryLock.storeReentryLock(_reentry); + } + + function _loadReentryLock() internal view override returns (uint8) { + return LibFasterReentryLock.loadReentryLock(); + } +} diff --git a/packages/protocol/contracts/layer1/mainnet/rollup/verifiers/MainnetSP1Verifier.sol b/packages/protocol/contracts/layer1/mainnet/rollup/verifiers/MainnetSP1Verifier.sol new file mode 100644 index 00000000000..2954d8dc3b7 --- /dev/null +++ b/packages/protocol/contracts/layer1/mainnet/rollup/verifiers/MainnetSP1Verifier.sol @@ -0,0 +1,29 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "src/layer1/verifiers/SP1Verifier.sol"; +import "src/layer1/mainnet/addrcache/RollupAddressCache.sol"; +import "src/layer1/mainnet/reentrylock/LibFasterReentryLock.sol"; + +/// @title MainnetSP1Verifier +/// @dev This contract shall be deployed to replace its parent contract on Ethereum for Taiko +/// mainnet to reduce gas cost. +/// @notice See the documentation in {RiscZeroVerifier}. +/// @custom:security-contact security@taiko.xyz +contract MainnetSP1Verifier is SP1Verifier, RollupAddressCache { + function _getAddress(uint64 _chainId, bytes32 _name) internal view override returns (address) { + return getAddress(_chainId, _name, super._getAddress); + } + + function _storeReentryLock(uint8 _reentry) internal override { + LibFasterReentryLock.storeReentryLock(_reentry); + } + + function _loadReentryLock() internal view override returns (uint8) { + return LibFasterReentryLock.loadReentryLock(); + } + + function taikoChainId() internal pure override returns (uint64) { + return LibNetwork.TAIKO_MAINNET; + } +} diff --git a/packages/protocol/contracts/layer1/mainnet/rollup/verifiers/MainnetSgxVerifier.sol b/packages/protocol/contracts/layer1/mainnet/rollup/verifiers/MainnetSgxVerifier.sol new file mode 100644 index 00000000000..4d57e8a596e --- /dev/null +++ b/packages/protocol/contracts/layer1/mainnet/rollup/verifiers/MainnetSgxVerifier.sol @@ -0,0 +1,25 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "src/layer1/verifiers/SgxVerifier.sol"; +import "src/layer1/mainnet/addrcache/RollupAddressCache.sol"; +import "src/layer1/mainnet/reentrylock/LibFasterReentryLock.sol"; + +/// @title MainnetSgxVerifier +/// @dev This contract shall be deployed to replace its parent contract on Ethereum for Taiko +/// mainnet to reduce gas cost. +/// @notice See the documentation in {SgxVerifier}. +/// @custom:security-contact security@taiko.xyz +contract MainnetSgxVerifier is SgxVerifier, RollupAddressCache { + function _getAddress(uint64 _chainId, bytes32 _name) internal view override returns (address) { + return getAddress(_chainId, _name, super._getAddress); + } + + function _storeReentryLock(uint8 _reentry) internal override { + LibFasterReentryLock.storeReentryLock(_reentry); + } + + function _loadReentryLock() internal view override returns (uint8) { + return LibFasterReentryLock.loadReentryLock(); + } +} diff --git a/packages/protocol/contracts/layer1/mainnet/rollup/verifiers/MainnetTeeAnyVerifier.sol b/packages/protocol/contracts/layer1/mainnet/rollup/verifiers/MainnetTeeAnyVerifier.sol new file mode 100644 index 00000000000..48e69932402 --- /dev/null +++ b/packages/protocol/contracts/layer1/mainnet/rollup/verifiers/MainnetTeeAnyVerifier.sol @@ -0,0 +1,24 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "src/layer1/verifiers/compose/TeeAnyVerifier.sol"; +import "src/layer1/mainnet/addrcache/RollupAddressCache.sol"; +import "src/layer1/mainnet/reentrylock/LibFasterReentryLock.sol"; + +/// @title MainnetTeeAnyVerifier +/// @dev This contract shall be deployed to replace its parent contract on Ethereum for Taiko +/// mainnet to reduce gas cost. +/// @custom:security-contact security@taiko.xyz +contract MainnetTeeAnyVerifier is TeeAnyVerifier, RollupAddressCache { + function _getAddress(uint64 _chainId, bytes32 _name) internal view override returns (address) { + return getAddress(_chainId, _name, super._getAddress); + } + + function _storeReentryLock(uint8 _reentry) internal override { + LibFasterReentryLock.storeReentryLock(_reentry); + } + + function _loadReentryLock() internal view override returns (uint8) { + return LibFasterReentryLock.loadReentryLock(); + } +} diff --git a/packages/protocol/contracts/layer1/mainnet/rollup/verifiers/MainnetZkAndTeeVerifier.sol b/packages/protocol/contracts/layer1/mainnet/rollup/verifiers/MainnetZkAndTeeVerifier.sol new file mode 100644 index 00000000000..609789ba250 --- /dev/null +++ b/packages/protocol/contracts/layer1/mainnet/rollup/verifiers/MainnetZkAndTeeVerifier.sol @@ -0,0 +1,24 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "src/layer1/verifiers/compose/ZkAndTeeVerifier.sol"; +import "src/layer1/mainnet/addrcache/RollupAddressCache.sol"; +import "src/layer1/mainnet/reentrylock/LibFasterReentryLock.sol"; + +/// @title MainnetZkAndTeeVerifier +/// @dev This contract shall be deployed to replace its parent contract on Ethereum for Taiko +/// mainnet to reduce gas cost. +/// @custom:security-contact security@taiko.xyz +contract MainnetZkAndTeeVerifier is ZkAndTeeVerifier, RollupAddressCache { + function _getAddress(uint64 _chainId, bytes32 _name) internal view override returns (address) { + return getAddress(_chainId, _name, super._getAddress); + } + + function _storeReentryLock(uint8 _reentry) internal override { + LibFasterReentryLock.storeReentryLock(_reentry); + } + + function _loadReentryLock() internal view override returns (uint8) { + return LibFasterReentryLock.loadReentryLock(); + } +} diff --git a/packages/protocol/contracts/layer1/mainnet/rollup/verifiers/MainnetZkAnyVerifier.sol b/packages/protocol/contracts/layer1/mainnet/rollup/verifiers/MainnetZkAnyVerifier.sol new file mode 100644 index 00000000000..bbb107268d8 --- /dev/null +++ b/packages/protocol/contracts/layer1/mainnet/rollup/verifiers/MainnetZkAnyVerifier.sol @@ -0,0 +1,24 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "src/layer1/verifiers/compose/ZkAnyVerifier.sol"; +import "src/layer1/mainnet/addrcache/RollupAddressCache.sol"; +import "src/layer1/mainnet/reentrylock/LibFasterReentryLock.sol"; + +/// @title MainnetZkAnyVerifier +/// @dev This contract shall be deployed to replace its parent contract on Ethereum for Taiko +/// mainnet to reduce gas cost. +/// @custom:security-contact security@taiko.xyz +contract MainnetZkAnyVerifier is ZkAnyVerifier, RollupAddressCache { + function _getAddress(uint64 _chainId, bytes32 _name) internal view override returns (address) { + return getAddress(_chainId, _name, super._getAddress); + } + + function _storeReentryLock(uint8 _reentry) internal override { + LibFasterReentryLock.storeReentryLock(_reentry); + } + + function _loadReentryLock() internal view override returns (uint8) { + return LibFasterReentryLock.loadReentryLock(); + } +} diff --git a/packages/protocol/contracts/layer1/preconf/README.md b/packages/protocol/contracts/layer1/preconf/README.md new file mode 100644 index 00000000000..ea72bc235bf --- /dev/null +++ b/packages/protocol/contracts/layer1/preconf/README.md @@ -0,0 +1,3 @@ +# README + +This folder contains the contracts migrated from github.com/NethermindEth/Taiko-Preconf-AVS diff --git a/packages/protocol/contracts/layer1/preconf/avs-mvp/PreconfServiceManager.sol b/packages/protocol/contracts/layer1/preconf/avs-mvp/PreconfServiceManager.sol new file mode 100644 index 00000000000..f49db7dfa20 --- /dev/null +++ b/packages/protocol/contracts/layer1/preconf/avs-mvp/PreconfServiceManager.sol @@ -0,0 +1,88 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "@openzeppelin/contracts/security/ReentrancyGuard.sol"; +import "../iface/IPreconfServiceManager.sol"; +import "./iface/ISlasher.sol"; +import "./iface/IAVSDirectory.sol"; + +/// @title PreconfServiceManager +/// @dev This contract would serve as the address of the AVS w.r.t the restaking platform being +/// used. Currently, this is based on a mock version of Eigenlayer that we have created solely for a +/// POC. +/// @custom:security-contact security@taiko.xyz +contract PreconfServiceManager is IPreconfServiceManager, ReentrancyGuard { + address internal immutable preconfRegistry; + address internal immutable preconfTaskManager; + IAVSDirectory internal immutable avsDirectory; + ISlasher internal immutable slasher; + + /// @dev This is currently just a flag and not actually being used to lock the stake. + mapping(address operator => uint256 timestamp) public stakeLockedUntil; + + uint256[49] private __gap; // 50 - 1 + + constructor( + address _preconfRegistry, + address _preconfTaskManager, + IAVSDirectory _avsDirectory, + ISlasher _slasher + ) { + preconfRegistry = _preconfRegistry; + preconfTaskManager = _preconfTaskManager; + avsDirectory = _avsDirectory; + slasher = _slasher; + } + + modifier onlyCallableBy(address allowedSender) { + require(msg.sender == allowedSender, SenderIsNotAllowed()); + _; + } + + /// @dev Simply relays the call to the AVS directory + function registerOperatorToAVS( + address operator, + bytes calldata operatorSignature + ) + external + nonReentrant + onlyCallableBy(preconfRegistry) + { + IAVSDirectory.SignatureWithSaltAndExpiry memory sig = + abi.decode(operatorSignature, (IAVSDirectory.SignatureWithSaltAndExpiry)); + avsDirectory.registerOperatorToAVS(operator, sig); + } + + /// @dev Simply relays the call to the AVS directory + function deregisterOperatorFromAVS(address operator) + external + nonReentrant + onlyCallableBy(preconfRegistry) + { + avsDirectory.deregisterOperatorFromAVS(operator); + } + + /// @dev This not completely functional until Eigenlayer decides the logic of their Slasher. + /// for now this simply sets a value in the storage and releases an event. + function lockStakeUntil( + address operator, + uint256 timestamp + ) + external + nonReentrant + onlyCallableBy(preconfTaskManager) + { + stakeLockedUntil[operator] = timestamp; + emit StakeLockedUntil(operator, timestamp); + } + + /// @dev This not completely functional until Eigenlayer decides the logic of their Slasher. + function slashOperator(address operator) + external + nonReentrant + onlyCallableBy(preconfTaskManager) + { + require(!slasher.isOperatorSlashed(operator), OperatorAlreadySlashed()); + slasher.slashOperator(operator); + } +} diff --git a/packages/protocol/contracts/layer1/preconf/avs-mvp/iface/IAVSDirectory.sol b/packages/protocol/contracts/layer1/preconf/avs-mvp/iface/IAVSDirectory.sol new file mode 100644 index 00000000000..ad4922b5174 --- /dev/null +++ b/packages/protocol/contracts/layer1/preconf/avs-mvp/iface/IAVSDirectory.sol @@ -0,0 +1,38 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +/// @title IAVSDirectory +/// @custom:security-contact security@taiko.xyz +interface IAVSDirectory { + struct SignatureWithSaltAndExpiry { + // the signature itself, formatted as a single bytes object + bytes signature; + // the salt used to generate the signature + bytes32 salt; + // the expiration timestamp (UTC) of the signature + uint256 expiry; + } + + /// @dev This function will be left without implementation in the MVP + function registerOperatorToAVS( + address operator, + SignatureWithSaltAndExpiry memory operatorSignature + ) + external; + + /// @dev This function will be left without implementation in the MVP + function deregisterOperatorFromAVS(address operator) external; + + /// @dev This function will have the implementation in the MVP so that the node can pull the + /// message + /// to be signed + function calculateOperatorAVSRegistrationDigestHash( + address operator, + address avs, + bytes32 salt, + uint256 expiry + ) + external + view + returns (bytes32); +} diff --git a/packages/protocol/contracts/layer1/preconf/avs-mvp/iface/IDelegationManager.sol b/packages/protocol/contracts/layer1/preconf/avs-mvp/iface/IDelegationManager.sol new file mode 100644 index 00000000000..d786a0d7537 --- /dev/null +++ b/packages/protocol/contracts/layer1/preconf/avs-mvp/iface/IDelegationManager.sol @@ -0,0 +1,22 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +/// @title IDelegationManager +/// @custom:security-contact security@taiko.xyz +interface IDelegationManager { + event OperatorSharesIncreased( + address indexed operator, address staker, address strategy, uint256 shares + ); + + /// @dev Called internally in EL by Strategy Manager + function increaseDelegatedShares(address operator, address strategy, uint256 shares) external; + + /// @dev Called by the AVS Stake Registry + function getOperatorShares( + address operator, + address[] memory strategies + ) + external + view + returns (uint256[] memory); +} diff --git a/packages/protocol/contracts/layer1/preconf/avs-mvp/iface/ISlasher.sol b/packages/protocol/contracts/layer1/preconf/avs-mvp/iface/ISlasher.sol new file mode 100644 index 00000000000..5e399835e54 --- /dev/null +++ b/packages/protocol/contracts/layer1/preconf/avs-mvp/iface/ISlasher.sol @@ -0,0 +1,18 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +/// @title ISlasher +/// @custom:security-contact security@taiko.xyz +interface ISlasher { + event OperatorSlashed(address indexed operator, address indexed avs); + event OptedIntoSlashing(address indexed operator, address indexed avs); + + /// @dev Called externally by the AVS operator client to allow AVS to slash the operator in the + /// future + function optIntoSlashing(address avs) external; + + /// @dev Called internally by the AVS (specifically the Service Manager) to slash the operator + function slashOperator(address operator) external; + + function isOperatorSlashed(address operator) external view returns (bool); +} diff --git a/packages/protocol/contracts/layer1/preconf/avs-mvp/iface/IStrategyManager.sol b/packages/protocol/contracts/layer1/preconf/avs-mvp/iface/IStrategyManager.sol new file mode 100644 index 00000000000..dda27f58ce1 --- /dev/null +++ b/packages/protocol/contracts/layer1/preconf/avs-mvp/iface/IStrategyManager.sol @@ -0,0 +1,18 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +/// @title IStrategyManager +/// @custom:security-contact security@taiko.xyz +interface IStrategyManager { + event Deposit(address staker, address token, address strategy, uint256 shares); + + /// @dev In EL this function is non-payable and solely for staking ERC20 tokens + function depositIntoStrategy( + address strategy, + address token, + uint256 amount + ) + external + payable + returns (uint256 shares); +} diff --git a/packages/protocol/contracts/layer1/preconf/avs-mvp/impl/AVSDirectory.sol b/packages/protocol/contracts/layer1/preconf/avs-mvp/impl/AVSDirectory.sol new file mode 100644 index 00000000000..3b24d2b8fdc --- /dev/null +++ b/packages/protocol/contracts/layer1/preconf/avs-mvp/impl/AVSDirectory.sol @@ -0,0 +1,48 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "../iface/IAVSDirectory.sol"; + +contract AVSDirectory is IAVSDirectory { + bytes32 private constant DOMAIN_TYPEHASH = + keccak256("EIP712Domain(string name,uint256 chainId,address verifyingContract)"); + bytes32 private constant OPERATOR_AVS_REGISTRATION_TYPEHASH = keccak256( + "OperatorAVSRegistration(address operator,address avs,bytes32 salt,uint256 expiry)" + ); + + function registerOperatorToAVS( + address operator, + IAVSDirectory.SignatureWithSaltAndExpiry memory operatorSignature + ) + external + { } + + function deregisterOperatorFromAVS(address operator) external { } + + function calculateOperatorAVSRegistrationDigestHash( + address operator, + address avs, + bytes32 salt, + uint256 expiry + ) + public + view + returns (bytes32) + { + // calculate the struct hash + bytes32 structHash = + keccak256(abi.encode(OPERATOR_AVS_REGISTRATION_TYPEHASH, operator, avs, salt, expiry)); + // calculate the digest hash + bytes32 digestHash = + keccak256(abi.encodePacked("\x19\x01", _calculateDomainSeparator(), structHash)); + return digestHash; + } + + function _calculateDomainSeparator() internal view returns (bytes32) { + return keccak256( + abi.encode( + DOMAIN_TYPEHASH, keccak256(bytes("EigenLayer")), block.chainid, address(this) + ) + ); + } +} diff --git a/packages/protocol/contracts/layer1/preconf/avs-mvp/impl/DelegationManager.sol b/packages/protocol/contracts/layer1/preconf/avs-mvp/impl/DelegationManager.sol new file mode 100644 index 00000000000..06fc8d9fe6f --- /dev/null +++ b/packages/protocol/contracts/layer1/preconf/avs-mvp/impl/DelegationManager.sol @@ -0,0 +1,55 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "../iface/IDelegationManager.sol"; +import "../iface/IStrategyManager.sol"; + +contract DelegationManager is IDelegationManager { + IStrategyManager internal immutable strategyManager; + + mapping(address operator => uint256 shares) internal operatorShares; + + constructor(IStrategyManager _strategyManager) { + strategyManager = _strategyManager; + } + + modifier onlyStrategyManager() { + require( + msg.sender == address(strategyManager), + "DelegationManager: Only Strategy Manager allowed" + ); + _; + } + + /// @dev In this MVP, operator and staker are used interchangeably + function increaseDelegatedShares( + address operator, + address strategy, + uint256 shares + ) + external + onlyStrategyManager + { + require(strategy == address(0), "DelegationManager: Only ETH strategy supported"); + operatorShares[operator] += shares; + emit OperatorSharesIncreased(operator, operator, strategy, shares); + } + + /// @dev This has been modified from the original EL implementation to accommodate for slashing + function getOperatorShares( + address operator, + address[] memory strategies + ) + external + view + returns (uint256[] memory) + { + uint256[] memory shares = new uint256[](strategies.length); + + for (uint256 i; i < strategies.length; ++i) { + require(strategies[i] == address(0), "DelegationManager: Only ETH strategy supported"); + shares[i] = operatorShares[operator]; + } + return shares; + } +} diff --git a/packages/protocol/contracts/layer1/preconf/avs-mvp/impl/Slasher.sol b/packages/protocol/contracts/layer1/preconf/avs-mvp/impl/Slasher.sol new file mode 100644 index 00000000000..94a668fa4df --- /dev/null +++ b/packages/protocol/contracts/layer1/preconf/avs-mvp/impl/Slasher.sol @@ -0,0 +1,31 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "../iface/ISlasher.sol"; + +contract Slasher is ISlasher { + mapping(address operator => mapping(address avs => bool canSlash)) internal slashingAllowed; + mapping(address operator => bool slashed) internal isSlashed; + + modifier onlyIfSlashingAllowed(address operator, address caller) { + require( + slashingAllowed[operator][caller], + "Slasher: Caller is not allowed to slash the operator" + ); + _; + } + + function optIntoSlashing(address avs) external { + slashingAllowed[msg.sender][avs] = true; + emit OptedIntoSlashing(msg.sender, avs); + } + + function slashOperator(address operator) external onlyIfSlashingAllowed(operator, msg.sender) { + isSlashed[operator] = true; + emit OperatorSlashed(operator, msg.sender); + } + + function isOperatorSlashed(address operator) external view returns (bool) { + return isSlashed[operator]; + } +} diff --git a/packages/protocol/contracts/layer1/preconf/avs-mvp/impl/StrategyManager.sol b/packages/protocol/contracts/layer1/preconf/avs-mvp/impl/StrategyManager.sol new file mode 100644 index 00000000000..307e3d4815e --- /dev/null +++ b/packages/protocol/contracts/layer1/preconf/avs-mvp/impl/StrategyManager.sol @@ -0,0 +1,39 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "../iface/IStrategyManager.sol"; +import "../iface/IDelegationManager.sol"; + +contract StrategyManager is IStrategyManager { + IDelegationManager internal immutable delegation; + + uint256 internal constant ETH_DEPOSIT = 1 ether; + + constructor(IDelegationManager _delegation) { + delegation = _delegation; + } + + function depositIntoStrategy( + address strategy, + address token, + uint256 amount + ) + external + payable + returns (uint256 shares) + { + require(strategy == address(0), "StrategyManager: Only ETH strategy supported"); + require(token == address(0), "StrategyManager: Only ETH deposits supported"); + require( + msg.value == ETH_DEPOSIT && amount == ETH_DEPOSIT, + "StrategyManager: Invalid ETH deposit" + ); + + // In the MVP, the shares equal the sent amount as we do not have any form of reward accrual + shares = amount; + + delegation.increaseDelegatedShares(msg.sender, strategy, shares); + + emit Deposit(msg.sender, token, strategy, shares); + } +} diff --git a/packages/protocol/contracts/layer1/preconf/eigenlayer/PreconfServiceManager.sol b/packages/protocol/contracts/layer1/preconf/eigenlayer/PreconfServiceManager.sol new file mode 100644 index 00000000000..c25da59facb --- /dev/null +++ b/packages/protocol/contracts/layer1/preconf/eigenlayer/PreconfServiceManager.sol @@ -0,0 +1,10 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "@openzeppelin/contracts/security/ReentrancyGuard.sol"; +import "../iface/IPreconfServiceManager.sol"; + +/// @title PreconfServiceManager +/// @dev An implementation of IPreconfServiceManager on top of Eigenlayer restaking. +/// @custom:security-contact security@taiko.xyz +abstract contract PreconfServiceManager is IPreconfServiceManager, ReentrancyGuard { } diff --git a/packages/protocol/contracts/layer1/preconf/iface/IPreconfRegistry.sol b/packages/protocol/contracts/layer1/preconf/iface/IPreconfRegistry.sol new file mode 100644 index 00000000000..cfafe4081f6 --- /dev/null +++ b/packages/protocol/contracts/layer1/preconf/iface/IPreconfRegistry.sol @@ -0,0 +1,91 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "../libs/LibBLS12381.sol"; + +/// @title IPreconfRegistry +/// @custom:security-contact security@taiko.xyz +interface IPreconfRegistry { + struct Validator { + // Preconfer that the validator proposer blocks for + address preconfer; + // Timestamp at which the preconfer may start proposing for the preconfer + // 2 epochs from validator addition timestamp + uint40 startProposingAt; + // Timestamp at which the preconfer must stop proposing for the preconfer + // 2 epochs from validator removal timestamp + uint40 stopProposingAt; + } + // ^ Note: 40 bits are enough for UNIX timestamp. This way we also compress the data to a single + // slot. + + struct AddValidatorParam { + // The public key of the validator + LibBLS12381.G1Point pubkey; + // The signature of the validator + LibBLS12381.G2Point signature; + // The timestamp at which the above signature expires + uint256 signatureExpiry; + } + + struct RemoveValidatorParam { + // The public key of the validator + LibBLS12381.G1Point pubkey; + // The signature of the validator + LibBLS12381.G2Point signature; + // The timestamp at which the above signature expires + uint256 signatureExpiry; + } + + enum ValidatorOp { + REMOVE, + ADD + } + + event PreconferRegistered(address indexed preconfer); + event PreconferDeregistered(address indexed preconfer); + event ValidatorAdded(bytes32 indexed pubKeyHash, address indexed preconfer); + event ValidatorRemoved(bytes32 indexed pubKeyHash, address indexed preconfer); + + error PreconferAlreadyRegistered(); + error PreconferNotRegistered(); + error InvalidValidatorSignature(); + error ValidatorSignatureExpired(); + error ValidatorAlreadyActive(); + error ValidatorAlreadyInactive(); + + /// @dev Registers a preconfer by giving them a non-zero registry index + function registerPreconfer(bytes calldata operatorSignature) external; + + /// @dev Deregisters a preconfer from the registry + function deregisterPreconfer() external; + + /// @dev Adds consensus layer validators to the system by assigning preconfers to them + function addValidators(AddValidatorParam[] calldata addValidatorParams) external; + + /// @dev Removes active validators who are proposing for a preconfer + function removeValidators(RemoveValidatorParam[] calldata removeValidatorParams) external; + + /// @dev Returns the message that the validator must sign to add or remove themselves from a + /// preconfer + function getMessageToSign( + ValidatorOp validatorOp, + uint256 expiry, + address preconfer + ) + external + view + returns (bytes memory); + + /// @dev Returns the index of the next preconfer + function getNextPreconferIndex() external view returns (uint256); + + /// @dev Returns the index of the preconfer + function getPreconferIndex(address preconfer) external view returns (uint256); + + /// @dev Returns the preconfer at the given index + function getPreconferAtIndex(uint256 index) external view returns (address); + + /// @dev Returns a validator who is proposing for a registered preconfer + function getValidator(bytes32 pubKeyHash) external view returns (Validator memory); +} diff --git a/packages/protocol/contracts/layer1/preconf/iface/IPreconfServiceManager.sol b/packages/protocol/contracts/layer1/preconf/iface/IPreconfServiceManager.sol new file mode 100644 index 00000000000..d47951d76e5 --- /dev/null +++ b/packages/protocol/contracts/layer1/preconf/iface/IPreconfServiceManager.sol @@ -0,0 +1,25 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +/// @title IPreconfServiceManager +/// @custom:security-contact security@taiko.xyz +interface IPreconfServiceManager { + event StakeLockedUntil(address indexed operator, uint256 timestamp); + + error SenderIsNotAllowed(); + error OperatorAlreadySlashed(); + + /// @dev Only callable by the registry + function registerOperatorToAVS(address operator, bytes calldata operatorSignature) external; + + /// @dev Only callable by the registry + function deregisterOperatorFromAVS(address operator) external; + + /// @dev Only Callable by PreconfTaskManager to prevent withdrawals of stake during preconf or + /// lookahead dispute period + function lockStakeUntil(address operator, uint256 timestamp) external; + + /// @dev Only Callable by PreconfTaskManager to slash an operator for incorrect lookahead or + /// preconfirmation + function slashOperator(address operator) external; +} diff --git a/packages/protocol/contracts/layer1/preconf/iface/IPreconfTaskManager.sol b/packages/protocol/contracts/layer1/preconf/iface/IPreconfTaskManager.sol new file mode 100644 index 00000000000..c381b71f34b --- /dev/null +++ b/packages/protocol/contracts/layer1/preconf/iface/IPreconfTaskManager.sol @@ -0,0 +1,127 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "../libs/LibEIP4788.sol"; + +/// @title IPreconfTaskManager +/// @custom:security-contact security@taiko.xyz +interface IPreconfTaskManager { + struct LookaheadBufferEntry { + // True when the preconfer is randomly selected + bool isFallback; + // Timestamp of the slot at which the provided preconfer is the L1 validator + uint40 timestamp; + // Timestamp of the last slot that had a valid preconfer + uint40 prevTimestamp; + // Address of the preconfer who is also the L1 validator + // The preconfer will have rights to propose a block in the range (prevTimestamp, timestamp] + address preconfer; + } + + struct LookaheadSetParam { + // The timestamp of the slot + uint256 timestamp; + // The AVS operator who is also the L1 validator for the slot and will preconf L2 + // transactions + address preconfer; + } + + event LookaheadUpdated(LookaheadSetParam[]); + + event ProvedIncorrectLookahead( + address indexed poster, uint256 indexed timestamp, address indexed disputer + ); + + /// @dev The current (or provided) timestamp does not fall in the range provided by the + /// lookahead pointer + error InvalidLookaheadPointer(); + /// @dev The block proposer is not the assigned preconfer for the current slot/timestamp + error SenderIsNotThePreconfer(); + /// @dev Preconfer is not present in the registry + error PreconferNotRegistered(); + /// @dev Epoch timestamp is incorrect + error InvalidEpochTimestamp(); + /// @dev The timestamp in the lookahead is not of a valid future slot in the present epoch + error InvalidSlotTimestamp(); + /// @dev The chain id on which the preconfirmation was signed is different from the current + /// chain's id + error PreconfirmationChainIdMismatch(); + /// @dev The dispute window for proving incorrectc lookahead or preconfirmation is over + error MissedDisputeWindow(); + /// @dev The lookahead poster for the epoch has already been slashed or there is no lookahead + /// for epoch + error PosterAlreadySlashedOrLookaheadIsEmpty(); + /// @dev The lookahead preconfer matches the one the actual validator is proposing for + error LookaheadEntryIsCorrect(); + /// @dev Cannot force push a lookahead since it is not lagging behind + error LookaheadIsNotRequired(); + /// @dev The registry does not have a single registered preconfer + error NoRegisteredPreconfer(); + + /// @dev Accepts block proposal by an operator and forwards it to TaikoL1 contract + function newBlockProposals( + bytes[] calldata blockParamsArr, + bytes[] calldata txListArr, + uint256 lookaheadPointer, + LookaheadSetParam[] calldata lookaheadSetParams + ) + external; + + /// @dev Slashes a preconfer if the validator lookahead pushed by them has an incorrect entry + function proveIncorrectLookahead( + uint256 lookaheadPointer, + uint256 slotTimestamp, + bytes calldata validatorBLSPubKey, + LibEIP4788.InclusionProof calldata validatorInclusionProof + ) + external; + + /// @dev Forces the lookahead to be set for the next epoch if it is lagging behind + function forcePushLookahead(LookaheadSetParam[] calldata lookaheadSetParams) external; + + /// @dev Returns the fallback preconfer for the given epoch + function getFallbackPreconfer(uint256 epochTimestamp) external view returns (address); + + /// @dev Returns the full 32 slot preconfer lookahead for the epoch + function getLookaheadForEpoch(uint256 epochTimestamp) + external + view + returns (address[32] memory); + + /// @dev Return the parameters required for the lookahead to be set for the given epoch + function getLookaheadParamsForEpoch( + uint256 epochTimestamp, + bytes[32] calldata validatorBLSPubKeys + ) + external + view + returns (LookaheadSetParam[] memory); + + /// @dev Returns true is a lookahead is not posted for an epoch + /// @dev In the event that a lookahead was posted but later invalidated, this returns false + function isLookaheadRequired() external view returns (bool); + + /// @dev Returns the current lookahead tail + function getLookaheadTail() external view returns (uint256); + + /// @dev Returns the entire lookahead buffer + function getLookaheadBuffer() external view returns (LookaheadBufferEntry[128] memory); + + /// @dev Returns the lookahead poster for an epoch + function getLookaheadPoster(uint256 epochTimestamp) external view returns (address); + + /// @dev Returns the preconf service manager contract address + function getPreconfServiceManager() external view returns (address); + + /// @dev Returns the preconf registry contract address + function getPreconfRegistry() external view returns (address); + + /// @dev Returns the Taiko L1 contract address + function getTaikoL1() external view returns (address); + + /// @dev Returns the beacon genesis timestamp + function getBeaconGenesis() external view returns (uint256); + + /// @dev Returns the beacon block root contract address + function getBeaconBlockRootContract() external view returns (address); +} diff --git a/packages/protocol/contracts/layer1/preconf/impl/LibPreconfConstants.sol b/packages/protocol/contracts/layer1/preconf/impl/LibPreconfConstants.sol new file mode 100644 index 00000000000..12e408bb38a --- /dev/null +++ b/packages/protocol/contracts/layer1/preconf/impl/LibPreconfConstants.sol @@ -0,0 +1,12 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +/// @title LibPreconfConstants +/// @custom:security-contact security@taiko.xyz +library LibPreconfConstants { + uint256 internal constant MAINNET_BEACON_GENESIS = 1_606_824_023; + uint256 internal constant SECONDS_IN_SLOT = 12; + uint256 internal constant SECONDS_IN_EPOCH = SECONDS_IN_SLOT * 32; + uint256 internal constant TWO_EPOCHS = 2 * SECONDS_IN_EPOCH; + uint256 internal constant DISPUTE_PERIOD = 2 * SECONDS_IN_EPOCH; +} diff --git a/packages/protocol/contracts/layer1/preconf/impl/PreconfRegistry.sol b/packages/protocol/contracts/layer1/preconf/impl/PreconfRegistry.sol new file mode 100644 index 00000000000..e3ad403436f --- /dev/null +++ b/packages/protocol/contracts/layer1/preconf/impl/PreconfRegistry.sol @@ -0,0 +1,246 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; +import "../iface/IPreconfRegistry.sol"; +import "../iface/IPreconfServiceManager.sol"; +import "../libs/LibBLSSignature.sol"; +import "./LibPreconfConstants.sol"; + +/// @title PreconfRegistry +/// @custom:security-contact security@taiko.xyz +contract PreconfRegistry is IPreconfRegistry, Initializable { + using LibBLS12381 for LibBLS12381.G1Point; + + IPreconfServiceManager internal immutable preconfServiceManager; + + uint256 internal nextPreconferIndex; + + // Maps the preconfer's address to an index that may change over the lifetime of a preconfer + mapping(address preconfer => uint256 index) internal preconferToIndex; + + // Maps an index to the preconfer's address + // We need this mapping to deregister a preconfer in O(1) time. + // While it may also be done by just using the above map and sending a "witness" that is + // calculated offchain, + // we ideally do not want the node to maintain historical state. + mapping(uint256 index => address preconfer) internal indexToPreconfer; + + // Maps a validator's BLS pub key hash to the validator's details + mapping(bytes32 publicKeyHash => Validator validator) internal validators; + + uint256[46] private __gap; // = 50 - 4 + + constructor(IPreconfServiceManager _preconfServiceManager) { + preconfServiceManager = _preconfServiceManager; + } + + function init() external initializer { + nextPreconferIndex = 1; + } + + /** + * @notice Registers a preconfer in the registry by giving it a non-zero index + * @dev This function internally accesses the restaking platform via the AVS service manager + * @param operatorSignature The signature of the operator in the format expected by the + * restaking platform + */ + function registerPreconfer(bytes calldata operatorSignature) external { + // Preconfer must not have registered already + require(preconferToIndex[msg.sender] == 0, PreconferAlreadyRegistered()); + + uint256 _nextPreconferIndex = nextPreconferIndex; + + preconferToIndex[msg.sender] = _nextPreconferIndex; + indexToPreconfer[_nextPreconferIndex] = msg.sender; + + unchecked { + nextPreconferIndex = _nextPreconferIndex + 1; + } + + emit PreconferRegistered(msg.sender); + + preconfServiceManager.registerOperatorToAVS(msg.sender, operatorSignature); + } + + /** + * @notice Deregisters a preconfer from the registry by setting its index to zero + * @dev It assigns the index of the last preconfer to the preconfer being removed and + * decrements the global index counter. + */ + function deregisterPreconfer() external { + // Preconfer must have registered already + uint256 removedPreconferIndex = preconferToIndex[msg.sender]; + require(removedPreconferIndex != 0, PreconferNotRegistered()); + + // Remove the preconfer and exchange its index with the last preconfer + preconferToIndex[msg.sender] = 0; + + unchecked { + // Update to the decremented index to account for the removed preconfer + uint256 lastPreconferIndex = nextPreconferIndex - 1; + nextPreconferIndex = lastPreconferIndex; + + if (removedPreconferIndex == lastPreconferIndex) { + indexToPreconfer[removedPreconferIndex] = address(0); + } else { + address lastPreconfer = indexToPreconfer[lastPreconferIndex]; + preconferToIndex[lastPreconfer] = removedPreconferIndex; + indexToPreconfer[removedPreconferIndex] = lastPreconfer; + } + } + + emit PreconferDeregistered(msg.sender); + + preconfServiceManager.deregisterOperatorFromAVS(msg.sender); + } + + /** + * @notice Assigns a validator to a preconfer + * @dev This function verifies BLS signatures which is a very expensive operation costing about + * ~350K units of gas per signature. + * @param addValidatorParams Contains the public key, signature, expiry, and preconfer + */ + function addValidators(AddValidatorParam[] calldata addValidatorParams) external { + for (uint256 i; i < addValidatorParams.length; ++i) { + // Revert if preconfer is not registered + require(preconferToIndex[msg.sender] != 0, PreconferNotRegistered()); + + // Note: BLS signature checks are commented out for the POC + + // bytes memory message = _createMessage(ValidatorOp.ADD, + // addValidatorParams[i].signatureExpiry, msg.sender); + + // Revert if any signature is invalid + // if (!verifySignature(message, addValidatorParams[i].signature, + // addValidatorParams[i].pubkey)) { + // revert InvalidValidatorSignature(); + // } + + // Revert if the signature has expired + // if (block.timestamp > addValidatorParams[i].signatureExpiry) { + // revert ValidatorSignatureExpired(); + // } + + bytes32 pubKeyHash = _hashBLSPubKey(addValidatorParams[i].pubkey); + Validator memory validator = validators[pubKeyHash]; + + // Update the validator if it has no preconfer assigned, or if it has stopped proposing + // for the former preconfer + require( + validator.preconfer == address(0) + || (validator.stopProposingAt != 0 && block.timestamp > validator.stopProposingAt), + ValidatorAlreadyActive() + ); + + unchecked { + validators[pubKeyHash] = Validator({ + preconfer: msg.sender, + // The delay is crucial in order to not contradict the lookahead + startProposingAt: uint40(block.timestamp + LibPreconfConstants.TWO_EPOCHS), + stopProposingAt: uint40(0) + }); + } + + emit ValidatorAdded(pubKeyHash, msg.sender); + } + } + + /** + * @notice Unassigns a validator from a preconfer + * @dev Instead of removing the validator immediately, we delay the removal by two epochs, + * & set the `stopProposingAt` timestamp. + * @param removeValidatorParams Contains the public key, signature and expiry + */ + function removeValidators(RemoveValidatorParam[] calldata removeValidatorParams) external { + for (uint256 i; i < removeValidatorParams.length; ++i) { + bytes32 pubKeyHash = _hashBLSPubKey(removeValidatorParams[i].pubkey); + Validator memory validator = validators[pubKeyHash]; + + // Revert if the validator is not active (or already removed, but waiting to stop + // proposing) + require(validator.preconfer != address(0), ValidatorAlreadyInactive()); + require(validator.stopProposingAt == 0, ValidatorAlreadyInactive()); + + // Note: BLS signature checks have been commented out + // Todo: It would be reasonable to remove BLS checks altogether for validator removals. + + // bytes memory message = + // _createMessage(ValidatorOp.REMOVE, removeValidatorParams[i].signatureExpiry, + // validator.preconfer); + + // // Revert if any signature is invalid + // if (!verifySignature(message, removeValidatorParams[i].signature, + // removeValidatorParams[i].pubkey)) { + // revert InvalidValidatorSignature(); + // } + + // // Revert if the signature has expired + // if (block.timestamp > removeValidatorParams[i].signatureExpiry) { + // revert ValidatorSignatureExpired(); + // } + + unchecked { + // We also need to delay the removal by two epochs to avoid contradicting the + // lookahead + validators[pubKeyHash].stopProposingAt = + uint40(block.timestamp + LibPreconfConstants.TWO_EPOCHS); + } + + emit ValidatorRemoved(pubKeyHash, validator.preconfer); + } + } + + //======= + // Views + //======= + + function getMessageToSign( + ValidatorOp validatorOp, + uint256 expiry, + address preconfer + ) + external + view + returns (bytes memory) + { + return _createMessage(validatorOp, expiry, preconfer); + } + + function getNextPreconferIndex() external view returns (uint256) { + return nextPreconferIndex; + } + + function getPreconferIndex(address preconfer) external view returns (uint256) { + return preconferToIndex[preconfer]; + } + + function getPreconferAtIndex(uint256 index) external view returns (address) { + return indexToPreconfer[index]; + } + + function getValidator(bytes32 pubKeyHash) external view returns (Validator memory) { + return validators[pubKeyHash]; + } + + //========= + // Helpers + //========= + + function _createMessage( + ValidatorOp validatorOp, + uint256 expiry, + address preconfer + ) + internal + view + returns (bytes memory) + { + return abi.encodePacked(block.chainid, validatorOp, expiry, preconfer); + } + + function _hashBLSPubKey(LibBLS12381.G1Point calldata pubkey) internal pure returns (bytes32) { + uint256[2] memory compressedPubKey = pubkey.compress(); + return keccak256(abi.encodePacked(compressedPubKey)); + } +} diff --git a/packages/protocol/contracts/layer1/preconf/impl/PreconfTaskManager.sol b/packages/protocol/contracts/layer1/preconf/impl/PreconfTaskManager.sol new file mode 100644 index 00000000000..c44bede30c5 --- /dev/null +++ b/packages/protocol/contracts/layer1/preconf/impl/PreconfTaskManager.sol @@ -0,0 +1,637 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; +import "src/layer1/based/ITaikoL1.sol"; +import "../iface/IPreconfTaskManager.sol"; +import "../iface/IPreconfServiceManager.sol"; +import "../iface/IPreconfRegistry.sol"; +import "../libs/LibEIP4788.sol"; +import "./LibPreconfConstants.sol"; + +/// @title PreconfTaskManager +/// @custom:security-contact security@taiko.xyz +contract PreconfTaskManager is IPreconfTaskManager, Initializable { + // Cannot be kept in `LibPreconfConstants` file because solidity expects array sizes + // to be stored in the main contract file itself. + uint256 internal constant SLOTS_IN_EPOCH = 32; + uint256 internal constant LOOKAHEAD_BUFFER_SIZE = 128; + uint256 internal constant POSTER_BUFFER_SIZE = LibPreconfConstants.SECONDS_IN_EPOCH * 16; + + struct Poster { + // Address of lookahead poster + address addr; + // Start timestamp of the epoch for which the lookahead was posted + uint64 epochTimestamp; + } + + IPreconfServiceManager internal immutable preconfServiceManager; + IPreconfRegistry internal immutable preconfRegistry; + ITaikoL1 internal immutable taikoL1; + + // EIP-4788 + uint256 internal immutable beaconGenesis; + address internal immutable beaconBlockRootContract; + + // A ring buffer of upcoming preconfers (who are also the L1 validators) + uint256 internal lookaheadTail; + mapping( + uint256 lookaheadIndex_mod_LOOKAHEAD_BUFFER_SIZE + => LookaheadBufferEntry lookaheadBufferEntry + ) internal lookahead; + + // A ring buffer that maps beginning timestamp of an epoch to the lookahead poster for that + // epoch. + // If the lookahead poster has been slashed or the lookahead is not yet posted, the poster is + // the 0-address. + mapping(uint256 epochTimestamp_mod_POSTER_BUFFER_SIZE => Poster poster) internal + lookaheadPosters; + + uint256[47] private __gap; // = 50 - 3 + + constructor( + IPreconfServiceManager _serviceManager, + IPreconfRegistry _registry, + ITaikoL1 _taikoL1, + uint256 _beaconGenesis, + address _beaconBlockRootContract + ) { + preconfServiceManager = _serviceManager; + preconfRegistry = _registry; + taikoL1 = _taikoL1; + beaconGenesis = _beaconGenesis; + beaconBlockRootContract = _beaconBlockRootContract; + } + + function init(IERC20 _taikoToken) external initializer { + _taikoToken.approve(address(taikoL1), type(uint256).max); + } + + /** + * @notice Proposes a new Taiko L2 block. + * @dev The first caller in every epoch is expected to pass along the lookahead entries for the + * next epoch. + * The function reverts if the lookahead is lagging behind. This is possible if it is + * the first block proposal of the system or no lookahead was posted for the current epoch due + * to missed proposals. + * In this case, `forcePushLookahead` must be called in order to update the lookahead for the + * next epoch. + * @param blockParamsArr A list of block parameters expected by TaikoL1 contract + * @param txListArr A list of RLP encoded transaction list expected by TaikoL1 contract + * @param lookaheadPointer A pointer to the lookahead entry that may prove that the sender is + * the preconfer + * for the slot. + * @param lookaheadSetParams Collection of timestamps and preconfer addresses to be inserted in + * the lookahead + */ + function newBlockProposals( + bytes[] calldata blockParamsArr, + bytes[] calldata txListArr, + uint256 lookaheadPointer, + LookaheadSetParam[] calldata lookaheadSetParams + ) + external + { + LookaheadBufferEntry memory lookaheadEntry = _getLookaheadEntry(lookaheadPointer); + + uint256 epochTimestamp = _getEpochTimestamp(block.timestamp); + + // The current L1 block's timestamp must be within the range retrieved from the lookahead + // entry. + // The preconfer is allowed to propose a block in advanced if there are no other entries in + // the + // lookahead between the present slot and the preconfer's own slot. + // + // ------[Last slot with an entry]---[X]---[X]----[X]----[Preconfer]------- + // ------[ prevTimestamp ]---[ ]---[ ]----[ ]----[timestamp]------- + // + require(block.timestamp > lookaheadEntry.prevTimestamp, InvalidLookaheadPointer()); + require(block.timestamp <= lookaheadEntry.timestamp, InvalidLookaheadPointer()); + require(msg.sender == lookaheadEntry.preconfer, SenderIsNotThePreconfer()); + + uint256 nextEpochTimestamp = epochTimestamp + LibPreconfConstants.SECONDS_IN_EPOCH; + + // Update the lookahead for the next epoch. + // Only called during the first block proposal of the current epoch. + if (_isLookaheadRequired(epochTimestamp, nextEpochTimestamp)) { + _updateLookahead(nextEpochTimestamp, lookaheadSetParams); + } + + // Block the preconfer from withdrawing stake from the restaking service during the dispute + // window + preconfServiceManager.lockStakeUntil( + msg.sender, block.timestamp + LibPreconfConstants.DISPUTE_PERIOD + ); + + // Forward the block to Taiko's L1 contract + taikoL1.proposeBlocksV2(blockParamsArr, txListArr); + } + + /** + * @notice Proves that the lookahead for a specific slot was incorrect + * @dev The logic in this function only works once the lookahead slot has passed. This is + * because + * we pull the proposer from a past beacon block and verify if it is associated with the + * preconfer. + * @param lookaheadPointer The pointer to the lookahead entry that represents the incorrect slot + * @param slotTimestamp The timestamp of the slot for which the lookahead was incorrect + * @param validatorBLSPubKey The BLS public key of the validator who is proposed the block in + * the slot + * @param validatorInclusionProof The inclusion proof of the above validator in the Beacon state + */ + function proveIncorrectLookahead( + uint256 lookaheadPointer, + uint256 slotTimestamp, + bytes calldata validatorBLSPubKey, + LibEIP4788.InclusionProof calldata validatorInclusionProof + ) + external + { + uint256 epochTimestamp = _getEpochTimestamp(slotTimestamp); + + address poster = getLookaheadPoster(epochTimestamp); + + // Poster must not have been slashed + require(poster != address(0), PosterAlreadySlashedOrLookaheadIsEmpty()); + + // Must not have missed dispute period + require( + block.timestamp <= slotTimestamp + LibPreconfConstants.DISPUTE_PERIOD, + MissedDisputeWindow() + ); + + // Verify that the sent validator is the one in Beacon state + LibEIP4788.verifyValidator( + validatorBLSPubKey, _getBeaconBlockRoot(slotTimestamp), validatorInclusionProof + ); + + LookaheadBufferEntry memory lookaheadEntry = _getLookaheadEntry(lookaheadPointer); + + // Validate lookahead pointer + require(slotTimestamp <= lookaheadEntry.timestamp, InvalidLookaheadPointer()); + require(slotTimestamp > lookaheadEntry.prevTimestamp, InvalidLookaheadPointer()); + + // We pull the preconfer present at the required slot timestamp in the lookahead. + // If no preconfer is present for a slot, we simply use the 0-address to denote the + // preconfer. + address preconferInLookahead; + if (lookaheadEntry.timestamp == slotTimestamp && !lookaheadEntry.isFallback) { + // The slot was dedicated to a specific preconfer + preconferInLookahead = lookaheadEntry.preconfer; + } + + // Reduce validator's BLS pub key to the pub key hash expected by the registry + bytes32 validatorPubKeyHash = _getValidatorPubKeyHash(validatorBLSPubKey); + + // Retrieve the validator object + IPreconfRegistry.Validator memory validatorInRegistry = + preconfRegistry.getValidator(validatorPubKeyHash); + + // Fetch the preconfer associated with the validator from the registry + address preconferInRegistry = validatorInRegistry.preconfer; + if ( + slotTimestamp < validatorInRegistry.startProposingAt + || ( + validatorInRegistry.stopProposingAt != 0 + && slotTimestamp >= validatorInRegistry.stopProposingAt + ) + ) { + // The validator is no longer allowed to propose for the former preconfer + preconferInRegistry = address(0); + } + + // Revert if the lookahead preconfer matches the one that the validator pulled from beacon + // state + // is proposing for + require(preconferInLookahead != preconferInRegistry, LookaheadEntryIsCorrect()); + + uint256 epochEndTimestamp = epochTimestamp + LibPreconfConstants.SECONDS_IN_EPOCH; + + // If it is the current epoch's lookahead being proved incorrect then insert a fallback + // preconfer + if (block.timestamp < epochEndTimestamp) { + uint256 _lookaheadTail = lookaheadTail; + + uint256 lastSlotTimestamp = epochEndTimestamp - LibPreconfConstants.SECONDS_IN_SLOT; + + // If the lookahead for next epoch is available + if (_getLookaheadEntry(_lookaheadTail).timestamp >= epochEndTimestamp) { + // Get to the entry in the next epoch that connects to a slot in the current epoch + while (_getLookaheadEntry(_lookaheadTail).prevTimestamp >= epochEndTimestamp) { + _lookaheadTail -= 1; + } + + // Switch the connection to the last slot of the current epoch + lookahead[_lookaheadTail % LOOKAHEAD_BUFFER_SIZE].prevTimestamp = + uint40(lastSlotTimestamp); + + // Head to the last entry in current epoch + _lookaheadTail -= 1; + } + + _setLookaheadEntry( + _lookaheadTail, + LookaheadBufferEntry({ + isFallback: true, + timestamp: uint40(lastSlotTimestamp), + prevTimestamp: uint40(epochTimestamp - LibPreconfConstants.SECONDS_IN_SLOT), + preconfer: getFallbackPreconfer(epochTimestamp) + }) + ); + + _lookaheadTail -= 1; + + // Nullify the rest of the lookahead entries for this epoch + while (_getLookaheadEntry(_lookaheadTail).timestamp >= epochTimestamp) { + _setLookaheadEntry( + _lookaheadTail, + LookaheadBufferEntry({ + isFallback: false, + timestamp: 0, + prevTimestamp: 0, + preconfer: address(0) + }) + ); + _lookaheadTail -= 1; + } + } + + // Slash the poster + lookaheadPosters[epochTimestamp % POSTER_BUFFER_SIZE].addr = address(0); + preconfServiceManager.slashOperator(poster); + + emit ProvedIncorrectLookahead(poster, slotTimestamp, msg.sender); + } + + /** + * @notice Forces the lookahead to be set for the next epoch if it is not already set. + * @dev This is called once when the system starts up to push the first lookahead, and later + * anytime + * when the lookahead is lagging due to missed proposals. + * @param lookaheadSetParams Collection of timestamps and preconfer addresses to be inserted in + * the lookahead + */ + function forcePushLookahead(LookaheadSetParam[] calldata lookaheadSetParams) external { + // Sender must be a preconfer + require(preconfRegistry.getPreconferIndex(msg.sender) != 0, PreconferNotRegistered()); + + // Lookahead must be missing + uint256 epochTimestamp = _getEpochTimestamp(block.timestamp); + uint256 nextEpochTimestamp = epochTimestamp + LibPreconfConstants.SECONDS_IN_EPOCH; + require(_isLookaheadRequired(epochTimestamp, nextEpochTimestamp), LookaheadIsNotRequired()); + + // Update the lookahead for next epoch + _updateLookahead(nextEpochTimestamp, lookaheadSetParams); + + // Block the preconfer from withdrawing stake from Eigenlayer during the dispute window + preconfServiceManager.lockStakeUntil( + msg.sender, block.timestamp + LibPreconfConstants.DISPUTE_PERIOD + ); + } + + //========= + // Helpers + //========= + + /// @dev Updates the lookahead for an epoch + function _updateLookahead( + uint256 epochTimestamp, + LookaheadSetParam[] calldata lookaheadSetParams + ) + private + { + uint256 epochEndTimestamp = epochTimestamp + LibPreconfConstants.SECONDS_IN_EPOCH; + + // The tail of the lookahead is tracked and connected to the first new lookahead entry so + // that when no more preconfers are present in the remaining slots of the current epoch, + // the next epoch's preconfer may start preconfing in advanced. + // + // --[]--[]--[p1]--[]--[]---|---[]--[]--[P2]--[]--[] + // 1 2 3 4 5 6 7 8 9 10 + // Epoch 1 Epoch 2 + // + // Here, P2 may start preconfing and proposing blocks from slot 4 itself + // + uint256 _lookaheadTail = lookaheadTail; + uint256 prevSlotTimestamp = _getLookaheadEntry(_lookaheadTail).timestamp; + + if (lookaheadSetParams.length == 0) { + // If no preconfers are present in the lookahead, we use the fallback preconfer for the + // entire epoch + address fallbackPreconfer = getFallbackPreconfer(epochTimestamp); + _lookaheadTail += 1; + + // and, insert it in the last slot of the epoch so that it may start preconfing in + // advanced + _setLookaheadEntry( + _lookaheadTail, + LookaheadBufferEntry({ + isFallback: true, + timestamp: uint40(epochEndTimestamp - LibPreconfConstants.SECONDS_IN_SLOT), + prevTimestamp: uint40(prevSlotTimestamp), + preconfer: fallbackPreconfer + }) + ); + } else { + for (uint256 i; i < lookaheadSetParams.length; ++i) { + _lookaheadTail += 1; + + address preconfer = lookaheadSetParams[i].preconfer; + uint256 slotTimestamp = lookaheadSetParams[i].timestamp; + + // Each entry must be registered in the preconf registry + require(preconfRegistry.getPreconferIndex(preconfer) != 0, PreconferNotRegistered()); + + // Ensure that the timestamps belong to a valid slot in the epoch + require((slotTimestamp - epochTimestamp) % 12 == 0, InvalidSlotTimestamp()); + require(slotTimestamp < epochEndTimestamp, InvalidSlotTimestamp()); + require(slotTimestamp > prevSlotTimestamp, InvalidSlotTimestamp()); + + // Update the lookahead entry + _setLookaheadEntry( + _lookaheadTail, + LookaheadBufferEntry({ + isFallback: false, + timestamp: uint40(slotTimestamp), + prevTimestamp: uint40(prevSlotTimestamp), + preconfer: preconfer + }) + ); + prevSlotTimestamp = slotTimestamp; + } + } + + lookaheadTail = _lookaheadTail; + lookaheadPosters[epochTimestamp % POSTER_BUFFER_SIZE] = + Poster({ addr: msg.sender, epochTimestamp: uint64(epochTimestamp) }); + + // We directly use the lookahead set params even in the case of a fallback preconfer to + // assist the nodes in identifying an incorrect lookahead. The contents of this event can be + // matched against + // the output of `getLookaheadParamsForEpoch` to verify the correctness of the lookahead. + emit LookaheadUpdated(lookaheadSetParams); + } + + /** + * @notice Computes the timestamp of the epoch containing the provided slot timestamp + */ + function _getEpochTimestamp(uint256 slotTimestamp) private view returns (uint256) { + uint256 timePassedSinceGenesis = slotTimestamp - beaconGenesis; + uint256 timeToCurrentEpochFromGenesis = ( + timePassedSinceGenesis / LibPreconfConstants.SECONDS_IN_EPOCH + ) * LibPreconfConstants.SECONDS_IN_EPOCH; + return beaconGenesis + timeToCurrentEpochFromGenesis; + } + + /** + * @notice Retrieves the beacon block root for the block at the specified timestamp + */ + function _getBeaconBlockRoot(uint256 timestamp) private view returns (bytes32) { + // At block N, we get the beacon block root for block N - 1. So, to get the block root of + // the Nth block, + // we query the root at block N + 1. If N + 1 is a missed slot, we keep querying until we + // find a block N + x + // that has the block root for Nth block. + uint256 targetTimestamp = timestamp + LibPreconfConstants.SECONDS_IN_SLOT; + while (true) { + (bool success, bytes memory result) = + beaconBlockRootContract.staticcall(abi.encode(targetTimestamp)); + if (success && result.length > 0) { + return abi.decode(result, (bytes32)); + } + + unchecked { + targetTimestamp += LibPreconfConstants.SECONDS_IN_SLOT; + } + } + return bytes32(0); + } + + function _getLookaheadEntry(uint256 index) + internal + view + returns (LookaheadBufferEntry memory) + { + return lookahead[index % LOOKAHEAD_BUFFER_SIZE]; + } + + function _setLookaheadEntry(uint256 index, LookaheadBufferEntry memory entry) internal { + lookahead[index % LOOKAHEAD_BUFFER_SIZE] = entry; + } + + function _isLookaheadRequired( + uint256 epochTimestamp, + uint256 nextEpochTimestamp + ) + internal + view + returns (bool) + { + // If it's the first slot of current epoch, we don't need the lookahead since the offchain + // node may not have access to it yet. + return block.timestamp != epochTimestamp + && getLookaheadPoster(nextEpochTimestamp) == address(0); + } + + /** + * @dev Assumes that validatorBLSPubKey is 48 bytes long. + * Puts 16 empty bytes infront to make it equivalent to 48-byte long pub key stored in + * uint256[2] + */ + function _getValidatorPubKeyHash(bytes memory validatorBLSPubKey) + internal + pure + returns (bytes32) + { + return keccak256(abi.encodePacked(bytes16(0), validatorBLSPubKey)); + } + + function _validateEpochTimestamp(uint256 epochTimestamp) internal view { + require(epochTimestamp >= beaconGenesis, InvalidEpochTimestamp()); + require( + (epochTimestamp - beaconGenesis) % LibPreconfConstants.SECONDS_IN_EPOCH == 0, + InvalidEpochTimestamp() + ); + } + + //======= + // Views + //======= + + /// @dev We use the beacon block root at the first block in the last epoch as randomness to + /// decide on the preconfer for the given epoch + function getFallbackPreconfer(uint256 epochTimestamp) public view returns (address) { + _validateEpochTimestamp(epochTimestamp); + + uint256 nextPreconferIndex = preconfRegistry.getNextPreconferIndex(); + + // Registry must have at least one preconfer + require(nextPreconferIndex != 1, NoRegisteredPreconfer()); + + // Start of the last epoch + uint256 lastEpochTimestamp = epochTimestamp - LibPreconfConstants.SECONDS_IN_EPOCH; + uint256 randomness = uint256(_getBeaconBlockRoot(lastEpochTimestamp)); + uint256 preconferIndex = randomness % (nextPreconferIndex - 1) + 1; + + return preconfRegistry.getPreconferAtIndex(preconferIndex); + } + + /** + * @notice Returns the full 32 slot preconfer lookahead for the epoch + * @dev This function has been added as a helper for the node to get the full 32 slot lookahead + * without + * the need of deconstructing the contract storage. Due to the fact that we are deconstructing + * an efficient + * data structure to fill in all the slots, this is very heavy on gas, and onchain calls to it + * should be avoided. + * @param epochTimestamp The start timestamp of the epoch for which the lookahead is to be + * generated + */ + function getLookaheadForEpoch(uint256 epochTimestamp) + external + view + returns (address[SLOTS_IN_EPOCH] memory) + { + _validateEpochTimestamp(epochTimestamp); + + address[SLOTS_IN_EPOCH] memory lookaheadForEpoch; + + uint256 _lookaheadTail = lookaheadTail; + uint256 lastSlotTimestamp = epochTimestamp + LibPreconfConstants.SECONDS_IN_EPOCH + - LibPreconfConstants.SECONDS_IN_SLOT; + + // Take the tail to the entry that fills the last slot of the epoch. + // This may be an entry in the next epoch who starts preconfing in advanced. + // This may also be an empty slot since the lookahead for next epoch is not yet posted. + while (_getLookaheadEntry(_lookaheadTail).prevTimestamp >= lastSlotTimestamp) { + _lookaheadTail -= 1; + } + + LookaheadBufferEntry memory _entry = _getLookaheadEntry(_lookaheadTail); + + // Iterate backwards and fill in the slots + for (uint256 i = SLOTS_IN_EPOCH; i > 0; --i) { + if (_entry.timestamp >= lastSlotTimestamp) { + lookaheadForEpoch[i - 1] = _entry.preconfer; + } + + lastSlotTimestamp -= LibPreconfConstants.SECONDS_IN_SLOT; + if (lastSlotTimestamp == _entry.prevTimestamp) { + _lookaheadTail -= 1; + // Reuse the memory space of _entry + _entry.preconfer = _getLookaheadEntry(_lookaheadTail).preconfer; + _entry.prevTimestamp = _getLookaheadEntry(_lookaheadTail).prevTimestamp; + } + } + + return lookaheadForEpoch; + } + + /** + * @notice Builds and returns lookahead set parameters for an epoch + * @dev This function can be used by the offchain node to create the lookahead to be posted. + * @param epochTimestamp The start timestamp of the epoch for which the lookahead is to be + * generated + * @param validatorBLSPubKeys The BLS public keys of the validators who are expected to propose + * in the epoch + * in the same sequence as they appear in the epoch. So at index n - 1, we have the validator + * for slot n in that + * epoch. + */ + function getLookaheadParamsForEpoch( + uint256 epochTimestamp, + bytes[SLOTS_IN_EPOCH] memory validatorBLSPubKeys + ) + external + view + returns (LookaheadSetParam[] memory) + { + _validateEpochTimestamp(epochTimestamp); + + uint256 index; + LookaheadSetParam[32] memory lookaheadSetParamsTemp; + + for (uint256 i = 0; i < 32; ++i) { + uint256 slotTimestamp = epochTimestamp + (i * LibPreconfConstants.SECONDS_IN_SLOT); + + // Fetch the validator object from the registry + IPreconfRegistry.Validator memory validator = + preconfRegistry.getValidator(_getValidatorPubKeyHash(validatorBLSPubKeys[i])); + + // Skip deregistered preconfers + if (preconfRegistry.getPreconferIndex(validator.preconfer) == 0) { + continue; + } + + // If the validator is allowed to propose in the epoch, add the associated preconfer to + // the lookahead + if ( + validator.preconfer != address(0) && slotTimestamp >= validator.startProposingAt + && (validator.stopProposingAt == 0 || slotTimestamp < validator.stopProposingAt) + ) { + lookaheadSetParamsTemp[index] = + LookaheadSetParam({ timestamp: slotTimestamp, preconfer: validator.preconfer }); + ++index; + } + } + + // Not very gas efficient, but is okay for a view expected to be used offchain + LookaheadSetParam[] memory lookaheadSetParams = new LookaheadSetParam[](index); + for (uint256 i; i < index; ++i) { + lookaheadSetParams[i] = lookaheadSetParamsTemp[i]; + } + + return lookaheadSetParams; + } + + /// @dev Returns true if the contract is expecting a lookahead for the next epoch + function isLookaheadRequired() external view returns (bool) { + uint256 epochTimestamp = _getEpochTimestamp(block.timestamp); + uint256 nextEpochTimestamp = epochTimestamp + LibPreconfConstants.SECONDS_IN_EPOCH; + return _isLookaheadRequired(epochTimestamp, nextEpochTimestamp); + } + + function getPreconfServiceManager() external view returns (address) { + return address(preconfServiceManager); + } + + function getPreconfRegistry() external view returns (address) { + return address(preconfRegistry); + } + + function getTaikoL1() external view returns (address) { + return address(taikoL1); + } + + function getBeaconGenesis() external view returns (uint256) { + return beaconGenesis; + } + + function getBeaconBlockRootContract() external view returns (address) { + return beaconBlockRootContract; + } + + function getLookaheadTail() external view returns (uint256) { + return lookaheadTail; + } + + function getLookaheadBuffer() + external + view + returns (LookaheadBufferEntry[LOOKAHEAD_BUFFER_SIZE] memory) + { + LookaheadBufferEntry[LOOKAHEAD_BUFFER_SIZE] memory _lookahead; + for (uint256 i; i < LOOKAHEAD_BUFFER_SIZE; ++i) { + _lookahead[i] = lookahead[i]; + } + return _lookahead; + } + + function getLookaheadPoster(uint256 epochTimestamp) public view returns (address) { + _validateEpochTimestamp(epochTimestamp); + Poster memory poster = lookaheadPosters[epochTimestamp % POSTER_BUFFER_SIZE]; + return poster.epochTimestamp == epochTimestamp ? poster.addr : address(0); + } +} diff --git a/packages/protocol/contracts/layer1/preconf/libs/LibBLS12381.sol b/packages/protocol/contracts/layer1/preconf/libs/LibBLS12381.sol new file mode 100644 index 00000000000..835b2f029b9 --- /dev/null +++ b/packages/protocol/contracts/layer1/preconf/libs/LibBLS12381.sol @@ -0,0 +1,468 @@ +// SPDX-License-Identifier: MIT +// Functions in this library have been adapted from: +// https://github.com/ethyla/bls12-381-hash-to-curve/blob/main/src/HashToCurve.sol +pragma solidity ^0.8.24; + +/// @title LibBLS12381 +/// @custom:security-contact security@taiko.xyz +library LibBLS12381 { + using LibBLS12381 for *; + + struct FieldPoint2 { + uint256[2] u; + uint256[2] u_I; + } + + struct G1Point { + uint256[2] x; + uint256[2] y; + } + + struct G2Point { + uint256[2] x; + uint256[2] x_I; + uint256[2] y; + uint256[2] y_I; + } + + /// @dev Referenced from https://eips.ethereum.org/EIPS/eip-2537#curve-parameters + function baseFieldModulus() internal pure returns (uint256[2] memory) { + return [ + 0x000000000000000000000000000000001a0111ea397fe69a4b1ba7b6434bacd7, + 0x64774b84f38512bf6730d2a0f6b0f6241eabfffeb153ffffb9feffffffffaaab + ]; + } + + /// @dev Referenced from https://eips.ethereum.org/EIPS/eip-2537#curve-parameters + function negGeneratorG1() internal pure returns (G1Point memory) { + return G1Point({ + x: [ + 0x0000000000000000000000000000000017f1d3a73197d7942695638c4fa9ac0f, + 0xc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb + ], + y: [ + 0x00000000000000000000000000000000114d1d6855d545a8aa7d76c8cf2e21f2, + 0x67816aef1db507c96655b9d5caac42364e6f38ba0ecb751bad54dcd6b939c2ca + ] + }); + } + + /** + * @notice Negates a G1 point, by reflecting it over the x-axis + * @dev Assumes that the Y coordinate is always less than the field modulus + * @param point The G1 point to negate + */ + function negate(G1Point memory point) internal pure returns (G1Point memory) { + uint256[2] memory fieldModulus = baseFieldModulus(); + uint256[2] memory yNeg; + + // Perform word-wise elementary subtraction + if (fieldModulus[1] < point.y[1]) { + yNeg[1] = type(uint256).max - (point.y[1] - fieldModulus[1]) + 1; + fieldModulus[0] -= 1; // borrow + } else { + yNeg[1] = fieldModulus[1] - point.y[1]; + } + yNeg[0] = fieldModulus[0] - point.y[0]; + + return G1Point({ x: point.x, y: yNeg }); + } + + /** + * @notice Transforms a sequence of bytes into a G2 point + * @dev Based on https://datatracker.ietf.org/doc/html/rfc9380 + * @param message The message to hash + * @param dst The domain separation tag + */ + function hashToCurveG2( + bytes memory message, + bytes memory dst + ) + internal + view + returns (G2Point memory r) + { + // 1. u = hash_to_field(msg, 2) + FieldPoint2[2] memory u = hashToFieldFp2(message, dst); + // 2. Q0 = map_to_curve(u[0]) + G2Point memory q0 = u[0].mapToG2(); + // 3. Q1 = map_to_curve(u[1]) + G2Point memory q1 = u[1].mapToG2(); + // 4. R = Q0 + Q1 + r = q0.plus(q1); + // 5. P = clear_cofactor(R) + // Not needed as map fp to g2 already does it + } + + /** + * @notice Transforms a sequence of bytes into an element in the FP2 field + * @dev Based on https://datatracker.ietf.org/doc/html/rfc9380 + * @param message The message to hash + * @param dst The domain separation tag + */ + function hashToFieldFp2( + bytes memory message, + bytes memory dst + ) + internal + view + returns (FieldPoint2[2] memory) + { + // 1. len_in_bytes = count * m * L + // so always 2 * 2 * 64 = 256 + uint16 lenInBytes = 256; + // 2. uniform_bytes = expand_message(msg, DST, len_in_bytes) + uint256[] memory pseudoRandomBytes = _expandMsgXmd(message, dst, lenInBytes); + FieldPoint2[2] memory u; + // No loop here saves 800 gas hardcoding offset an additional 300 + // 3. for i in (0, ..., count - 1): + // 4. for j in (0, ..., m - 1): + // 5. elm_offset = L * (j + i * m) + // 6. tv = substr(uniform_bytes, elm_offset, HTF_L) + // uint8 HTF_L = 64; + // bytes memory tv = new bytes(64); + // 7. e_j = OS2IP(tv) mod p + // 8. u_i = (e_0, ..., e_(m - 1)) + // tv = bytes.concat(pseudo_random_bytes[0], pseudo_random_bytes[1]); + u[0].u = _modfield(pseudoRandomBytes[0], pseudoRandomBytes[1]); + u[0].u_I = _modfield(pseudoRandomBytes[2], pseudoRandomBytes[3]); + u[1].u = _modfield(pseudoRandomBytes[4], pseudoRandomBytes[5]); + u[1].u_I = _modfield(pseudoRandomBytes[6], pseudoRandomBytes[7]); + // 9. return (u_0, ..., u_(count - 1)) + return u; + } + + /** + * @notice Returns a G1Point in the compressed form + * @dev Based on + * https://github.com/zcash/librustzcash/blob/6e0364cd42a2b3d2b958a54771ef51a8db79dd29/pairing/src/bls12_381/README.md#serialization + * @param point The G1 point to compress + */ + function compress(G1Point memory point) internal pure returns (uint256[2] memory) { + uint256[2] memory r = point.x; + + // Set the first MSB + r[0] = r[0] | (1 << 127); + + // Second MSB is left to be 0 since we are assuming that no infinity points are involved + + // Set the third MSB if point.y is lexicographically larger than the y in negated point + if (_greaterThan(point.y, point.negate().y)) { + r[0] = r[0] | (1 << 125); + } + + return r; + } + + //================== + // Precompile calls + //================== + + /** + * @notice Adds two G2 points using the precompile at 0x0e + */ + function plus( + G2Point memory point1, + G2Point memory point2 + ) + internal + view + returns (G2Point memory) + { + uint256[8] memory r; + + uint256[16] memory input = [ + point1.x[0], + point1.x[1], + point1.x_I[0], + point1.x_I[1], + point1.y[0], + point1.y[1], + point1.y_I[0], + point1.y_I[1], + point2.x[0], + point2.x[1], + point2.x_I[0], + point2.x_I[1], + point2.y[0], + point2.y[1], + point2.y_I[0], + point2.y_I[1] + ]; + + // ABI for G2 addition precompile + // G2 addition call expects 512 bytes as an input that is interpreted as byte concatenation + // of two G2 points (256 bytes each). Output is an encoding of addition operation result - + // single G2 point (256 bytes). + assembly { + let success := + staticcall( + sub(gas(), 2000), + /// gas should be 800 + 0x0e, // address of BLS12_G2ADD + input, //input offset + 512, // input size + r, // output offset + 256 // output size + ) + if iszero(success) { revert(0, 0) } + } + + return _resolveG2Point(r); + } + + /** + * @notice Maps an element of the FP2 field to a G2 point using the precompile at 0x13 + */ + function mapToG2(FieldPoint2 memory fp2) internal view returns (G2Point memory) { + uint256[8] memory r; + + uint256[4] memory input = [fp2.u[0], fp2.u[1], fp2.u_I[0], fp2.u_I[1]]; + + // ABI for mapping Fp2 element to G2 point precompile + // Field-to-curve call expects 128 bytes an an input that is interpreted as a an element of + // the quadratic extension field. Output of this call is 256 bytes and is G2 point following + // respective encoding rules. + assembly { + let success := + staticcall( + sub(gas(), 2000), + /// gas should be 75000 + 0x13, // address of BLS12_MAP_FP2_TO_G2 + input, //input offset + 128, // input size + r, // output offset + 256 // output size + ) + if iszero(success) { revert(0, 0) } + } + + return _resolveG2Point(r); + } + + /** + * @notice Pairing check using the precompile at 0x11 + */ + function pairing( + G1Point memory a1, + G2Point memory b1, + G1Point memory a2, + G2Point memory b2 + ) + internal + view + returns (bool) + { + bool[1] memory r; + + uint256[24] memory input = [ + a1.x[0], + a1.x[1], + a1.y[0], + a1.y[1], + b1.x[0], + b1.x[1], + b1.x_I[0], + b1.x_I[1], + b1.y[0], + b1.y[1], + b1.y_I[0], + b1.y_I[1], + a2.x[0], + a2.x[1], + a2.y[0], + a2.y[1], + b2.x[0], + b2.x[1], + b2.x_I[0], + b2.x_I[1], + b2.y[0], + b2.y[1], + b2.y_I[0], + b2.y_I[1] + ]; + + // ABI for pairing precompile + // Pairing expects 384 (G1Point = 128 bytes, G2Point = 256 bytes) * k bytes as input. + // In this case, since two pairs of points are being passed, the input size is 384 * 2 = 768 + // bytes. + assembly { + let success := + staticcall( + sub(gas(), 2000), + /// gas should be 151000 + 0x11, // address of BLS12_PAIRING + input, //input offset + 768, // input size + r, // output offset + 32 // output size + ) + if iszero(success) { revert(0, 0) } + } + + return r[0]; + } + + //========= + // Helpers + //========= + + function _expandMsgXmd( + bytes memory message, + bytes memory dst, + uint16 lenInBytes + ) + internal + pure + returns (uint256[] memory) + { + // 1. ell = ceil(len_in_bytes / b_in_bytes) + // b_in_bytes seems to be 32 for sha256 + // ceil the division + uint256 ell = (lenInBytes - 1) / 32 + 1; + + // 2. ABORT if ell > 255 or len_in_bytes > 65535 or len(DST) > 255 + require(ell <= 255, "len_in_bytes too large for sha256"); + // Not really needed because of parameter type + // require(lenInBytes <= 65535, "len_in_bytes too large"); + // no length normalizing via hashing + require(dst.length <= 255, "dst too long"); + + bytes memory dstPrime = bytes.concat(dst, bytes1(uint8(dst.length))); + + // 4. Z_pad = I2OSP(0, s_in_bytes) + // this should be sha256 blocksize so 64 bytes + bytes memory zPad = + hex"00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + + // 5. l_i_b_str = I2OSP(len_in_bytes, 2) + // length in byte string? + bytes2 libStr = bytes2(lenInBytes); + + // 6. msg_prime = Z_pad || msg || l_i_b_str || I2OSP(0, 1) || DST_prime + bytes memory msgPrime = bytes.concat(zPad, message, libStr, hex"00", dstPrime); + + uint256 b_0; + uint256[] memory b = new uint256[](ell); + + // 7. b_0 = H(msg_prime) + b_0 = uint256(sha256(msgPrime)); + + // 8. b_1 = H(b_0 || I2OSP(1, 1) || DST_prime) + b[0] = uint256(sha256(bytes.concat(bytes32(b_0), hex"01", dstPrime))); + + // 9. for i in (2, ..., ell): + for (uint8 i = 2; i <= ell; i++) { + // 10. b_i = H(strxor(b_0, b_(i - 1)) || I2OSP(i, 1) || DST_prime) + bytes memory tmp = abi.encodePacked(b_0 ^ b[i - 2], i, dstPrime); + b[i - 1] = uint256(sha256(tmp)); + } + // 11. uniform_bytes = b_1 || ... || b_ell + // 12. return substr(uniform_bytes, 0, len_in_bytes) + // Here we don't need the uniform_bytes because b is already properly formed + return b; + } + + function _modfield(uint256 _b1, uint256 _b2) internal view returns (uint256[2] memory r) { + assembly { + let bl := 0x40 + let ml := 0x40 + + let freemem := mload(0x40) // Free memory pointer is always stored at 0x40 + + // arg[0] = base.length @ +0 + mstore(freemem, bl) + // arg[1] = exp.length @ +0x20 + mstore(add(freemem, 0x20), 0x20) + // arg[2] = mod.length @ +0x40 + mstore(add(freemem, 0x40), ml) + + // arg[3] = base.bits @ + 0x60 + // places the first 32 bytes of _b1 and the last 32 bytes of _b2 + mstore(add(freemem, 0x60), _b1) + mstore(add(freemem, 0x80), _b2) + + // arg[4] = exp.bits @ +0x60+base.length + // exponent always 1 + mstore(add(freemem, 0xa0), 1) + + // arg[5] = mod.bits @ +96+base.length+exp.length + // this field_modulus as hex + // 4002409555221667393417789825735904156556882819939007885332058136124031650490837864442687629129015664037894272559787 + // we add the 0 prefix so that the result will be exactly 64 bytes + // saves 300 gas per call instead of sending it along every time + // places the first 32 bytes and the last 32 bytes of the field modulus + mstore( + add(freemem, 0xc0), + 0x000000000000000000000000000000001a0111ea397fe69a4b1ba7b6434bacd7 + ) + mstore( + add(freemem, 0xe0), + 0x64774b84f38512bf6730d2a0f6b0f6241eabfffeb153ffffb9feffffffffaaab + ) + + // Invoke contract 0x5, put return value right after mod.length, @ 0x60 + let success := + staticcall( + sub(gas(), 1350), // gas + 0x5, // mpdexp precompile + freemem, //input offset + 0x100, // input size = 0x60+base.length+exp.length+mod.length + add(freemem, 0x60), // output offset + ml // output size + ) + if iszero(success) { revert(0, 0) } + + // point to mod length, result was placed immediately after + r := add(freemem, 0x60) + //adjust freemem pointer + mstore(0x40, add(add(freemem, 0x60), ml)) + } + } + + /** + * @notice Returns true if `a` is lexicographically greater than `b` + * @dev It makes the comparison bit-wise. + * This functions also assumes that the passed values are 48-byte long BLS pub keys that have + * 16 functional bytes in the first word, and 32 bytes in the second. + */ + function _greaterThan(uint256[2] memory a, uint256[2] memory b) internal pure returns (bool) { + uint256 wordA; + uint256 wordB; + uint256 mask; + + // Only compare the unequal words + if (a[0] == b[0]) { + wordA = a[1]; + wordB = b[1]; + mask = 1 << 255; + } else { + wordA = a[0]; + wordB = b[0]; + mask = 1 << 127; // Only check for lower 16 bytes in the first word + } + + // We may safely set the control value to be less than 256 since it is guaranteed that the + // the loop returns if the first words are different. + for (uint256 i; i < 256; ++i) { + uint256 x = wordA & mask; + uint256 y = wordB & mask; + + if (x == 0 && y != 0) return false; + if (x != 0 && y == 0) return true; + + mask = mask >> 1; + } + + return false; + } + + function _resolveG2Point(uint256[8] memory flattened) internal pure returns (G2Point memory) { + return G2Point({ + x: [flattened[0], flattened[1]], + x_I: [flattened[2], flattened[3]], + y: [flattened[4], flattened[5]], + y_I: [flattened[6], flattened[7]] + }); + } +} diff --git a/packages/protocol/contracts/layer1/preconf/libs/LibBLSSignature.sol b/packages/protocol/contracts/layer1/preconf/libs/LibBLSSignature.sol new file mode 100644 index 00000000000..1b2255450ba --- /dev/null +++ b/packages/protocol/contracts/layer1/preconf/libs/LibBLSSignature.sol @@ -0,0 +1,38 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "./LibBLS12381.sol"; + +/// @title LibBLSSignature +/// @custom:security-contact security@taiko.xyz +library LibBLSSignature { + using LibBLS12381 for *; + + /// @dev The domain separation tag for the BLS signature + function dst() internal pure returns (bytes memory) { + // Set based on the recommendations of RFC9380 + return bytes("Taiko Based Rollup Preconfirmation v0.1.0"); + } + + /** + * @notice Returns `true` if the BLS signature on the message matches against the public key + * @param message The message bytes + * @param sig The BLS signature + * @param pubkey The BLS public key of the expected signer + */ + function verifySignature( + bytes memory message, + LibBLS12381.G2Point memory sig, + LibBLS12381.G1Point memory pubkey + ) + public + view + returns (bool) + { + // Hash the message bytes into a G2 point + LibBLS12381.G2Point memory msgG2 = message.hashToCurveG2(dst()); + + // Return the pairing check that denotes the correctness of the signature + return LibBLS12381.pairing(pubkey, msgG2, LibBLS12381.negGeneratorG1(), sig); + } +} diff --git a/packages/protocol/contracts/layer1/preconf/libs/LibEIP4788.sol b/packages/protocol/contracts/layer1/preconf/libs/LibEIP4788.sol new file mode 100644 index 00000000000..153cb582131 --- /dev/null +++ b/packages/protocol/contracts/layer1/preconf/libs/LibEIP4788.sol @@ -0,0 +1,98 @@ +// SPDX-License-Identifier: MIT + +// Referenced from: https://ethresear.ch/t/slashing-proofoor-on-chain-slashed-validator-proofs/19421 +pragma solidity ^0.8.24; + +import "./LibMerkleUtils.sol"; + +/// @title LibEIP4788 +/// @custom:security-contact security@taiko.xyz +library LibEIP4788 { + struct InclusionProof { + // `Chunks` of the SSZ encoded validator + bytes32[8] validator; + // Index of the validator in the beacon state validator list + uint256 validatorIndex; + // Proof of inclusion of validator in beacon state validator list + bytes32[] validatorProof; + // Root of the validator list in the beacon state + bytes32 validatorsRoot; + // Proof of inclusion of validator list in the beacon state + bytes32[] beaconStateProof; + // Root of the beacon state + bytes32 beaconStateRoot; + // Proof of inclusion of beacon state in the beacon block + bytes32[] beaconBlockProofForState; + // Proof of inclusion of the validator index in the beacon block + bytes32[] beaconBlockProofForProposerIndex; + } + + /// @dev The validator pub key failed verification against the pub key hash tree root in the + /// validator chunks + error InvalidValidatorBLSPubKey(); + /// @dev The proof that the validator is a part of the validator list is invalid. + error ValidatorProofFailed(); + /// @dev The proof that the validator list is a part of the beacon state is invalid. + error BeaconStateProofFailed(); + /// @dev The proof that the beacon state is a part of the beacon block is invalid. + error BeaconBlockProofForStateFailed(); + /// @dev The proof that the actual validator index is a part of the beacon is invalid. + error BeaconBlockProofForProposerIndex(); + + function verifyValidator( + bytes memory validatorBLSPubKey, + bytes32 beaconBlockRoot, + InclusionProof memory inclusionProof + ) + internal + pure + { + // Validator's BLS public key is verified against the hash tree root within Validator chunks + bytes32 pubKeyHashTreeRoot = sha256(abi.encodePacked(validatorBLSPubKey, bytes16(0))); + require(pubKeyHashTreeRoot == inclusionProof.validator[0], InvalidValidatorBLSPubKey()); + + // Validator is verified against the validator list in the beacon state + bytes32 validatorHashTreeRoot = LibMerkleUtils.merkleize(inclusionProof.validator); + require( + LibMerkleUtils.verifyProof( + inclusionProof.validatorProof, + inclusionProof.validatorsRoot, + validatorHashTreeRoot, + inclusionProof.validatorIndex + ), + ValidatorProofFailed() + ); + + require( + LibMerkleUtils.verifyProof( + inclusionProof.beaconStateProof, + inclusionProof.beaconStateRoot, + inclusionProof.validatorsRoot, + 11 + ), + BeaconStateProofFailed() + ); + + // Beacon state is verified against the beacon block + require( + LibMerkleUtils.verifyProof( + inclusionProof.beaconBlockProofForState, + beaconBlockRoot, + inclusionProof.beaconStateRoot, + 3 + ), + BeaconBlockProofForStateFailed() + ); + + // Validator index is verified against the beacon block + require( + LibMerkleUtils.verifyProof( + inclusionProof.beaconBlockProofForProposerIndex, + beaconBlockRoot, + LibMerkleUtils.toLittleEndian(inclusionProof.validatorIndex), + 1 + ), + BeaconBlockProofForProposerIndex() + ); + } +} diff --git a/packages/protocol/contracts/layer1/preconf/libs/LibMerkleUtils.sol b/packages/protocol/contracts/layer1/preconf/libs/LibMerkleUtils.sol new file mode 100644 index 00000000000..c9a962edea4 --- /dev/null +++ b/packages/protocol/contracts/layer1/preconf/libs/LibMerkleUtils.sol @@ -0,0 +1,80 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.24; + +/// @title LibMerkleUtils +/// @custom:security-contact security@taiko.xyz +library LibMerkleUtils { + uint256 internal constant CHUNKS_LENGTH = 8; + uint256 internal constant TMP_LENGTH = 4; + + function hash(bytes32 a, bytes32 b) internal pure returns (bytes32) { + return sha256(abi.encodePacked(a, b)); + } + + function merkleize(bytes32[CHUNKS_LENGTH] memory chunks) internal pure returns (bytes32) { + bytes32[] memory tmp = new bytes32[](TMP_LENGTH); + + for (uint256 i; i < CHUNKS_LENGTH; ++i) { + merge(tmp, i, chunks[i]); + } + + return tmp[TMP_LENGTH - 1]; + } + + function merge(bytes32[] memory tmp, uint256 index, bytes32 chunk) internal pure { + bytes32 h = chunk; + uint256 j = 0; + while (true) { + if (index & 1 << j == 0) { + break; + } else { + h = hash(tmp[j], h); + } + j += 1; + } + tmp[j] = h; + } + + function verifyProof( + bytes32[] memory proof, + bytes32 root, + bytes32 leaf, + uint256 leafIndex + ) + internal + pure + returns (bool) + { + bytes32 h = leaf; + uint256 index = leafIndex; + + for (uint256 i = 0; i < proof.length; i++) { + bytes32 proofElement = proof[i]; + + if (index % 2 == 0) { + h = sha256(bytes.concat(h, proofElement)); + } else { + h = sha256(bytes.concat(proofElement, h)); + } + + index = index / 2; + } + + return h == root; + } + + function toLittleEndian(uint256 n) internal pure returns (bytes32) { + uint256 v = n; + v = ((v & 0xFF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00) >> 8) + | ((v & 0x00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF) << 8); + v = ((v & 0xFFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000) >> 16) + | ((v & 0x0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF) << 16); + v = ((v & 0xFFFFFFFF00000000FFFFFFFF00000000FFFFFFFF00000000FFFFFFFF00000000) >> 32) + | ((v & 0x00000000FFFFFFFF00000000FFFFFFFF00000000FFFFFFFF00000000FFFFFFFF) << 32); + v = ((v & 0xFFFFFFFFFFFFFFFF0000000000000000FFFFFFFFFFFFFFFF0000000000000000) >> 64) + | ((v & 0x0000000000000000FFFFFFFFFFFFFFFF0000000000000000FFFFFFFFFFFFFFFF) << 64); + v = (v >> 128) | (v << 128); + return bytes32(v); + } +} diff --git a/packages/protocol/contracts/layer1/preconf/mock/MockPreconfRegistry.sol b/packages/protocol/contracts/layer1/preconf/mock/MockPreconfRegistry.sol new file mode 100644 index 00000000000..0bb360711ca --- /dev/null +++ b/packages/protocol/contracts/layer1/preconf/mock/MockPreconfRegistry.sol @@ -0,0 +1,245 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; +import "../impl/LibPreconfConstants.sol"; +import "../libs/LibBLSSignature.sol"; +import "../iface/IPreconfRegistry.sol"; +import "../iface/IPreconfServiceManager.sol"; +import "../avs-mvp/iface/IAVSDirectory.sol"; + +contract MockPreconfRegistry is IPreconfRegistry, Initializable { + using LibBLS12381 for LibBLS12381.G1Point; + + IPreconfServiceManager internal immutable preconfServiceManager; + + uint256 internal nextPreconferIndex; + + // Maps the preconfer's address to an index that may change over the lifetime of a preconfer + mapping(address preconfer => uint256 index) internal preconferToIndex; + + // Maps an index to the preconfer's address + // We need this mapping to deregister a preconfer in O(1) time. + // While it may also be done by just using the above map and sending a "witness" that is + // calculated offchain, + // we ideally do not want the node to maintain historical state. + mapping(uint256 index => address preconfer) internal indexToPreconfer; + + // Maps a validator's BLS pub key hash to the validator's details + mapping(bytes32 publicKeyHash => Validator validator) internal validators; + + constructor(IPreconfServiceManager _preconfServiceManager) { + preconfServiceManager = _preconfServiceManager; + } + + function init() external initializer { + nextPreconferIndex = 1; + } + + /** + * @notice Registers a preconfer in the registry by giving it a non-zero index + * @dev This function internally accesses Eigenlayer via the AVS service manager + * @param operatorSignature The signature of the operator in the format expected by Eigenlayer + */ + function registerPreconfer(bytes calldata operatorSignature) external { + // Preconfer must not have registered already + require(preconferToIndex[msg.sender] == 0, PreconferAlreadyRegistered()); + + uint256 _nextPreconferIndex = nextPreconferIndex; + + preconferToIndex[msg.sender] = _nextPreconferIndex; + indexToPreconfer[_nextPreconferIndex] = msg.sender; + + unchecked { + nextPreconferIndex = _nextPreconferIndex + 1; + } + + emit PreconferRegistered(msg.sender); + + preconfServiceManager.registerOperatorToAVS(msg.sender, operatorSignature); + } + + /** + * @notice Deregisters a preconfer from the registry by setting its index to zero + * @dev It assigns the index of the last preconfer to the preconfer being removed and + * decrements the global index counter. + */ + function deregisterPreconfer() external { + // Preconfer must have registered already + require(preconferToIndex[msg.sender] != 0, PreconferNotRegistered()); + + unchecked { + uint256 _nextPreconferIndex = nextPreconferIndex - 1; + + // Update to the decremented index to account for the removed preconfer + nextPreconferIndex = _nextPreconferIndex; + + uint256 removedPreconferIndex = preconferToIndex[msg.sender]; + address lastPreconfer = indexToPreconfer[_nextPreconferIndex]; + + // Remove the preconfer and exchange its index with the last preconfer + preconferToIndex[msg.sender] = 0; + preconferToIndex[lastPreconfer] = removedPreconferIndex; + indexToPreconfer[removedPreconferIndex] = lastPreconfer; + } + + emit PreconferDeregistered(msg.sender); + + preconfServiceManager.deregisterOperatorFromAVS(msg.sender); + } + + /** + * @notice Assigns a validator to a preconfer + * @dev The function allows different validators to be assigned to different preconfers, but + * generally, it will be called by a preconfer to assign validators to itself. + * @param addValidatorParams Contains the public key, signature, expiry, and preconfer + */ + function addValidators(AddValidatorParam[] calldata addValidatorParams) external { + for (uint256 i; i < addValidatorParams.length; ++i) { + // Revert if preconfer is not registered + require(preconferToIndex[msg.sender] != 0, PreconferNotRegistered()); + + // bytes memory message = _createMessage(ValidatorOp.ADD, + // addValidatorParams[i].signatureExpiry, msg.sender); + + // Revert if any signature is invalid + //if (!verifySignature(message, addValidatorParams[i].signature, + // addValidatorParams[i].pubkey)) { + // revert InvalidValidatorSignature(); + //} + + // Revert if the signature has expired + require( + block.timestamp <= addValidatorParams[i].signatureExpiry, + ValidatorSignatureExpired() + ); + + // Point compress the public key just how it is done on the consensus layer + uint256[2] memory compressedPubKey = addValidatorParams[i].pubkey.compress(); + // Use the hash for ease of mapping + bytes32 pubKeyHash = keccak256(abi.encodePacked(compressedPubKey)); + + Validator memory validator = validators[pubKeyHash]; + + // Update the validator if it has no preconfer assigned, or if it has stopped proposing + // for the former preconfer + require( + validator.preconfer == address(0) + || (validator.stopProposingAt != 0 && block.timestamp > validator.stopProposingAt), + ValidatorAlreadyActive() + ); + + unchecked { + validators[pubKeyHash] = Validator({ + preconfer: msg.sender, + // The delay is crucial in order to not contradict the lookahead + startProposingAt: uint40(block.timestamp + LibPreconfConstants.TWO_EPOCHS), + stopProposingAt: uint40(0) + }); + } + + emit ValidatorAdded(pubKeyHash, msg.sender); + } + } + + /** + * @notice Unassigns a validator from a preconfer + * @dev Instead of removing the validator immediately, we delay the removal by two epochs, + * & set the `stopProposingAt` timestamp. + * @param removeValidatorParams Contains the public key, signature and expiry + */ + function removeValidators(RemoveValidatorParam[] calldata removeValidatorParams) external { + for (uint256 i; i < removeValidatorParams.length; ++i) { + // Point compress the public key just how it is done on the consensus layer + uint256[2] memory compressedPubKey = removeValidatorParams[i].pubkey.compress(); + // Use the hash for ease of mapping + bytes32 pubKeyHash = keccak256(abi.encodePacked(compressedPubKey)); + + Validator memory validator = validators[pubKeyHash]; + + // Revert if the validator is not active (or already removed, but waiting to stop + // proposing) + require(validator.preconfer != address(0), ValidatorAlreadyInactive()); + require(validator.stopProposingAt == 0, ValidatorAlreadyInactive()); + + bytes memory message = _createMessage( + ValidatorOp.REMOVE, removeValidatorParams[i].signatureExpiry, validator.preconfer + ); + + // Revert if any signature is invalid + require( + LibBLSSignature.verifySignature( + message, removeValidatorParams[i].signature, removeValidatorParams[i].pubkey + ), + InvalidValidatorSignature() + ); + + // Revert if the signature has expired + require( + block.timestamp <= removeValidatorParams[i].signatureExpiry, + ValidatorSignatureExpired() + ); + + unchecked { + // We also need to delay the removal by two epochs to avoid contradicting the + // lookahead + validators[pubKeyHash].stopProposingAt = + uint40(block.timestamp + LibPreconfConstants.TWO_EPOCHS); + } + + emit ValidatorRemoved(pubKeyHash, validator.preconfer); + } + } + + //======= + // Views + //======= + + function getMessageToSign( + ValidatorOp validatorOp, + uint256 expiry, + address preconfer + ) + external + view + returns (bytes memory) + { + return _createMessage(validatorOp, expiry, preconfer); + } + + function getPreconfServiceManager() external view returns (address) { + return address(preconfServiceManager); + } + + function getNextPreconferIndex() external view returns (uint256) { + return nextPreconferIndex; + } + + function getPreconferIndex(address preconfer) external view returns (uint256) { + return preconferToIndex[preconfer]; + } + + function getPreconferAtIndex(uint256 index) external view returns (address) { + return indexToPreconfer[index]; + } + + function getValidator(bytes32 pubKeyHash) external view returns (Validator memory) { + return validators[pubKeyHash]; + } + + //========= + // Helpers + //========= + + function _createMessage( + ValidatorOp validatorOp, + uint256 expiry, + address preconfer + ) + internal + view + returns (bytes memory) + { + return abi.encodePacked(block.chainid, validatorOp, expiry, preconfer); + } +} diff --git a/packages/protocol/contracts/layer1/preconf/mock/MockTaikoToken.sol b/packages/protocol/contracts/layer1/preconf/mock/MockTaikoToken.sol new file mode 100644 index 00000000000..2f6d915e32e --- /dev/null +++ b/packages/protocol/contracts/layer1/preconf/mock/MockTaikoToken.sol @@ -0,0 +1,13 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +contract MockTaikoToken { + address public lastAddr; + uint256 public lastAmount; + + function approve(address spender, uint256 amount) external returns (bool) { + lastAddr = spender; + lastAmount = amount; + return true; + } +} diff --git a/packages/protocol/contracts/L1/provers/GuardianProver.sol b/packages/protocol/contracts/layer1/provers/GuardianProver.sol similarity index 51% rename from packages/protocol/contracts/L1/provers/GuardianProver.sol rename to packages/protocol/contracts/layer1/provers/GuardianProver.sol index eec69566ca1..542dc25481e 100644 --- a/packages/protocol/contracts/L1/provers/GuardianProver.sol +++ b/packages/protocol/contracts/layer1/provers/GuardianProver.sol @@ -1,12 +1,13 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; -import "../../common/EssentialContract.sol"; -import "../../common/LibStrings.sol"; -import "../../verifiers/IVerifier.sol"; -import "../ITaikoL1.sol"; +import "src/shared/common/EssentialContract.sol"; +import "src/shared/common/LibAddress.sol"; +import "src/shared/common/LibStrings.sol"; +import "../verifiers/IVerifier.sol"; +import "../based/ITaikoL1.sol"; /// @title GuardianProver /// This prover uses itself as the verifier. @@ -54,22 +55,22 @@ contract GuardianProver is IVerifier, EssentialContract { bytes proofData ); - /// @notice Emitted when the set of guardians is updated - /// @param version The new version - /// @param guardians The new set of guardians + /// @notice Emitted when the set of guardians is updated. + /// @param version The new version. + /// @param guardians The new set of guardians. event GuardiansUpdated(uint32 version, address[] guardians); - /// @notice Emitted when an approval is made - /// @param operationId The operation ID - /// @param approvalBits The new approval bits - /// @param minGuardiansReached If the proof was submitted + /// @notice Emitted when an approval is made. + /// @param operationId The operation ID. + /// @param approvalBits The new approval bits. + /// @param minGuardiansReached If the proof was submitted. event Approved(uint256 indexed operationId, uint256 approvalBits, bool minGuardiansReached); - /// @notice Emitted when a guardian prover submit a different proof for the same block - /// @param blockId The block ID - /// @param guardian The guardian prover address - /// @param currentProofHash The existing proof hash - /// @param newProofHash The new and different proof hash + /// @notice Emitted when a guardian prover submits a different proof for the same block. + /// @param blockId The block ID. + /// @param guardian The guardian prover address. + /// @param currentProofHash The existing proof hash. + /// @param newProofHash The new and different proof hash. /// @param provingPaused True if TaikoL1's proving is paused. event ConflictingProofs( uint256 indexed blockId, @@ -83,6 +84,7 @@ contract GuardianProver is IVerifier, EssentialContract { /// @param enabled True if TaikoL1 proving auto-pause is enabled. event ProvingAutoPauseEnabled(bool indexed enabled); + error GP_BOND_NOT_ERC20(); error GP_INVALID_GUARDIAN(); error GP_INVALID_GUARDIAN_SET(); error GP_INVALID_MIN_GUARDIANS(); @@ -92,15 +94,15 @@ contract GuardianProver is IVerifier, EssentialContract { /// @notice Initializes the contract. /// @param _owner The owner of this contract. msg.sender will be used if this value is zero. - /// @param _addressManager The address of the {AddressManager} contract. - function init(address _owner, address _addressManager) external initializer { - __Essential_init(_owner, _addressManager); + /// @param _rollupAddressManager The address of the {AddressManager} contract. + function init(address _owner, address _rollupAddressManager) external initializer { + __Essential_init(_owner, _rollupAddressManager); } - /// @notice Set the set of guardians - /// @param _newGuardians The new set of guardians - /// @param _minGuardians The minimum required to sign - /// @param _clearData true to invalidate all existing data. + /// @notice Sets the set of guardians. + /// @param _newGuardians The new set of guardians. + /// @param _minGuardians The minimum required to sign. + /// @param _clearData True to invalidate all existing data. function setGuardians( address[] memory _newGuardians, uint8 _minGuardians, @@ -110,14 +112,12 @@ contract GuardianProver is IVerifier, EssentialContract { onlyOwner { // We need at most 255 guardians (so the approval bits fit in a uint256) - if (_newGuardians.length == 0 || _newGuardians.length > type(uint8).max) { - revert GP_INVALID_GUARDIAN_SET(); - } + require(_newGuardians.length != 0, GP_INVALID_GUARDIAN_SET()); + require(_newGuardians.length <= type(uint8).max, GP_INVALID_GUARDIAN_SET()); // Minimum number of guardians to approve is at least equal or greater than half the // guardians (rounded up) and less or equal than the total number of guardians - if (_minGuardians == 0 || _minGuardians > _newGuardians.length) { - revert GP_INVALID_MIN_GUARDIANS(); - } + require(_minGuardians != 0, GP_INVALID_MIN_GUARDIANS()); + require(_minGuardians <= _newGuardians.length, GP_INVALID_MIN_GUARDIANS()); // Delete the current guardians for (uint256 i; i < guardians.length; ++i) { @@ -128,9 +128,9 @@ contract GuardianProver is IVerifier, EssentialContract { // Set the new guardians for (uint256 i; i < _newGuardians.length; ++i) { address guardian = _newGuardians[i]; - if (guardian == address(0)) revert GP_INVALID_GUARDIAN(); + require(guardian != address(0), GP_INVALID_GUARDIAN()); // This makes sure there are not duplicate addresses - if (guardianIds[guardian] != 0) revert GP_INVALID_GUARDIAN_SET(); + require(guardianIds[guardian] == 0, GP_INVALID_GUARDIAN_SET()); // Save and index the guardian guardians.push(guardian); @@ -144,91 +144,69 @@ contract GuardianProver is IVerifier, EssentialContract { emit GuardiansUpdated(version, _newGuardians); } - /// @dev Enables or disables proving auto pause. - /// @param _enable true to enable, false to disable. + /// @notice Enables or disables proving auto pause. + /// @param _enable True to enable, false to disable. function enableProvingAutoPause(bool _enable) external onlyOwner { - if (provingAutoPauseEnabled == _enable) revert GP_INVALID_STATUS(); + require(provingAutoPauseEnabled != _enable, GP_INVALID_STATUS()); provingAutoPauseEnabled = _enable; emit ProvingAutoPauseEnabled(_enable); } /// @notice Enables unlimited allowance for Taiko L1 contract. - /// param _enable true if unlimited allowance is approved, false to set the allowance to 0. - function enableTaikoTokenAllowance(bool _enable) external onlyOwner { - address tko = resolve(LibStrings.B_TAIKO_TOKEN, false); + /// @param _enable True if unlimited allowance is approved, false to set the allowance to 0. + function enableBondAllowance(bool _enable) external onlyOwner { + address bondToken = resolve(LibStrings.B_BOND_TOKEN, true); + require(bondToken != address(0), GP_BOND_NOT_ERC20()); + address taiko = resolve(LibStrings.B_TAIKO, false); - IERC20(tko).approve(taiko, _enable ? type(uint256).max : 0); + IERC20(bondToken).approve(taiko, _enable ? type(uint256).max : 0); } - /// @dev Withdraws Taiko Token to a given address. + /// @notice Withdraws bond asset to a given address. /// @param _to The recipient address. /// @param _amount The amount of Taiko token to withdraw. Use 0 for all balance. - function withdrawTaikoToken(address _to, uint256 _amount) external onlyOwner { - if (_to == address(0)) revert GV_ZERO_ADDRESS(); + function withdrawBond(address _to, uint256 _amount) external onlyOwner { + require(_to != address(0), GV_ZERO_ADDRESS()); - IERC20 tko = IERC20(resolve(LibStrings.B_TAIKO_TOKEN, false)); - uint256 amount = _amount == 0 ? tko.balanceOf(address(this)) : _amount; - tko.transfer(_to, amount); + address bondToken = resolve(LibStrings.B_BOND_TOKEN, true); + if (bondToken != address(0)) { + uint256 amount = _amount == 0 ? IERC20(bondToken).balanceOf(address(this)) : _amount; + IERC20(bondToken).transfer(_to, amount); + } else { + LibAddress.sendEtherAndVerify(_to, address(this).balance); + } } - /// @dev Called by guardians to approve a guardian proof - /// @param _meta The block's metadata. + /// @notice Called by guardians to approve a guardian proof (version 2). + /// @param _metaV2 The block's metadata (version 2). /// @param _tran The valid transition. /// @param _proof The tier proof. - /// @return approved_ True if the minimum number of approval is acquired, false otherwise. - function approve( - TaikoData.BlockMetadata calldata _meta, + /// @return approved_ True if the minimum number of approvals is acquired, false otherwise. + function approveV2( + TaikoData.BlockMetadataV2 calldata _metaV2, TaikoData.Transition calldata _tran, TaikoData.TierProof calldata _proof ) external whenNotPaused nonReentrant - returns (bool approved_) + returns (bool) { - bytes32 proofHash = keccak256(abi.encode(_meta, _tran, _proof.data)); - uint256 _version = version; - bytes32 currProofHash = latestProofHash[_version][_meta.id]; - - if (currProofHash == 0) { - latestProofHash[_version][_meta.id] = proofHash; - currProofHash = proofHash; - } - - bool conflicting = currProofHash != proofHash; - bool pauseProving = conflicting && provingAutoPauseEnabled - && address(this) == resolve(LibStrings.B_CHAIN_WATCHDOG, true); - - if (conflicting) { - latestProofHash[_version][_meta.id] = proofHash; - emit ConflictingProofs(_meta.id, msg.sender, currProofHash, proofHash, pauseProving); - } - - if (pauseProving) { - ITaikoL1(resolve(LibStrings.B_TAIKO, false)).pauseProving(true); - } else { - approved_ = _approve(_meta.id, proofHash); - emit GuardianApproval(msg.sender, _meta.id, _tran.blockHash, approved_, _proof.data); - - if (approved_) { - delete approvals[_version][proofHash]; - delete latestProofHash[_version][_meta.id]; - - ITaikoL1(resolve(LibStrings.B_TAIKO, false)).proveBlock( - _meta.id, abi.encode(_meta, _tran, _proof) - ); - } - } + return _approve({ + _blockId: _metaV2.id, + _proofHash: keccak256(abi.encode(_metaV2, _tran, _proof.data)), + _blockHash: _tran.blockHash, + _data: abi.encode(_metaV2, _tran, _proof), + _proofData: _proof.data + }); } /// @notice Pauses chain proving and verification. function pauseTaikoProving() external whenNotPaused { - if (guardianIds[msg.sender] == 0) revert GP_INVALID_GUARDIAN(); + require(guardianIds[msg.sender] != 0, GP_INVALID_GUARDIAN()); - if (address(this) != resolve(LibStrings.B_CHAIN_WATCHDOG, true)) { - revert GV_PERMISSION_DENIED(); - } + require(address(this) == resolve(LibStrings.B_CHAIN_WATCHDOG, true), GV_PERMISSION_DENIED()); ITaikoL1(resolve(LibStrings.B_TAIKO, false)).pauseProving(true); } @@ -242,18 +220,90 @@ contract GuardianProver is IVerifier, EssentialContract { external view { - if (_ctx.msgSender != address(this)) revert GV_PERMISSION_DENIED(); + require(_ctx.msgSender == address(this), GV_PERMISSION_DENIED()); + } + + /// @inheritdoc IVerifier + function verifyBatchProof( + ContextV2[] calldata _ctxs, + TaikoData.TierProof calldata /*_proof*/ + ) + external + view + { + for (uint256 i; i < _ctxs.length; ++i) { + require(_ctxs[i].msgSender == address(this), GV_PERMISSION_DENIED()); + } } - /// @notice Returns the number of guardians - /// @return The number of guardians + /// @notice Returns the number of guardians. + /// @return The number of guardians. function numGuardians() public view returns (uint256) { return guardians.length; } - function _approve(uint256 _blockId, bytes32 _proofHash) internal returns (bool approved_) { + /// @notice Internal function to handle the approval process. + /// @param _blockId The block ID. + /// @param _proofHash The proof hash. + /// @param _blockHash The block hash. + /// @param _data The encoded data. + /// @param _proofData The proof data. + /// @return approved_ True if the minimum number of approvals is acquired, false otherwise. + function _approve( + uint64 _blockId, + bytes32 _proofHash, + bytes32 _blockHash, + bytes memory _data, + bytes memory _proofData + ) + internal + returns (bool approved_) + { + uint256 _version = version; + bytes32 currProofHash = latestProofHash[_version][_blockId]; + + if (currProofHash == 0) { + latestProofHash[_version][_blockId] = _proofHash; + currProofHash = _proofHash; + } + + bool conflicting = currProofHash != _proofHash; + bool pauseProving = conflicting && provingAutoPauseEnabled + && address(this) == resolve(LibStrings.B_CHAIN_WATCHDOG, true); + + if (conflicting) { + latestProofHash[_version][_blockId] = _proofHash; + emit ConflictingProofs(_blockId, msg.sender, currProofHash, _proofHash, pauseProving); + } + + if (pauseProving) { + ITaikoL1(resolve(LibStrings.B_TAIKO, false)).pauseProving(true); + } else { + approved_ = _saveApproval(_blockId, _proofHash); + emit GuardianApproval(msg.sender, _blockId, _blockHash, approved_, _proofData); + + if (approved_) { + delete approvals[_version][_proofHash]; + delete latestProofHash[_version][_blockId]; + + ITaikoL1(resolve(LibStrings.B_TAIKO, false)).proveBlock(_blockId, _data); + } + } + } + + /// @notice Internal function to save the approval. + /// @param _blockId The block ID. + /// @param _proofHash The proof hash. + /// @return approved_ True if the minimum number of approvals is acquired, false otherwise. + function _saveApproval( + uint256 _blockId, + bytes32 _proofHash + ) + internal + returns (bool approved_) + { uint256 id = guardianIds[msg.sender]; - if (id == 0) revert GP_INVALID_GUARDIAN(); + require(id != 0, GP_INVALID_GUARDIAN()); uint256 _version = version; @@ -266,6 +316,9 @@ contract GuardianProver is IVerifier, EssentialContract { emit Approved(_blockId, _approval, approved_); } + /// @notice Internal function to check if the minimum number of approvals is reached. + /// @param _approvalBits The approval bits. + /// @return True if the minimum number of approvals is reached, false otherwise. function _isApproved(uint256 _approvalBits) private view returns (bool) { uint256 count; uint256 bits = _approvalBits; diff --git a/packages/protocol/contracts/layer1/provers/ProverSet.sol b/packages/protocol/contracts/layer1/provers/ProverSet.sol new file mode 100644 index 00000000000..36eb638eb00 --- /dev/null +++ b/packages/protocol/contracts/layer1/provers/ProverSet.sol @@ -0,0 +1,185 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20VotesUpgradeable.sol"; +import "@openzeppelin/contracts/interfaces/IERC1271.sol"; +import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "src/shared/common/EssentialContract.sol"; +import "src/shared/common/LibStrings.sol"; +import "src/shared/common/LibAddress.sol"; +import "../based/ITaikoL1.sol"; + +interface IHasRecipient { + function recipient() external view returns (address); +} + +/// @title ProverSet +/// @notice A contract that holds TAIKO token and acts as a Taiko prover. This contract will simply +/// relay `proveBlock` calls to TaikoL1 so msg.sender doesn't need to hold any TAIKO. +/// @custom:security-contact security@taiko.xyz +contract ProverSet is EssentialContract, IERC1271 { + bytes4 private constant _EIP1271_MAGICVALUE = 0x1626ba7e; + + mapping(address prover => bool isProver) public isProver; // slot 1 + address public admin; // slot 2 + + uint256[48] private __gap; + + event ProverEnabled(address indexed prover, bool indexed enabled); + + error INVALID_STATUS(); + error INVALID_BOND_TOKEN(); + error PERMISSION_DENIED(); + error NOT_FIRST_PROPOSAL(); + + modifier onlyAuthorized() { + require( + msg.sender == admin || msg.sender == IHasRecipient(admin).recipient(), + PERMISSION_DENIED() + ); + _; + } + + modifier onlyProver() { + require(isProver[msg.sender], PERMISSION_DENIED()); + _; + } + + /// @notice Initializes the contract. + function init( + address _owner, + address _admin, + address _rollupAddressManager + ) + external + nonZeroAddr(_admin) + initializer + { + __Essential_init(_owner, _rollupAddressManager); + admin = _admin; + + address _bondToken = bondToken(); + if (_bondToken != address(0)) { + IERC20(_bondToken).approve(taikoL1(), type(uint256).max); + } + } + + function approveAllowance(address _address, uint256 _allowance) external onlyOwner { + address _bondToken = bondToken(); + require(_bondToken != address(0), INVALID_BOND_TOKEN()); + IERC20(_bondToken).approve(_address, _allowance); + } + + /// @notice Enables or disables a prover. + function enableProver(address _prover, bool _isProver) external onlyAuthorized { + require(isProver[_prover] != _isProver, INVALID_STATUS()); + isProver[_prover] = _isProver; + + emit ProverEnabled(_prover, _isProver); + } + + /// @notice Withdraws Taiko tokens back to the admin address. + function withdrawToAdmin(uint256 _amount) external onlyAuthorized { + address _bondToken = bondToken(); + if (_bondToken != address(0)) { + IERC20(_bondToken).transfer(admin, _amount); + } else { + LibAddress.sendEtherAndVerify(admin, _amount); + } + } + + /// @notice Withdraws ETH back to the owner address. + function withdrawEtherToAdmin(uint256 _amount) external onlyAuthorized { + LibAddress.sendEtherAndVerify(admin, _amount); + } + + /// @notice Proposes a batch blocks only when it is the first batch blocks proposal in the + /// current L1 block. + function proposeBlocksV2Conditionally( + bytes[] calldata _params, + bytes[] calldata _txList + ) + external + onlyProver + { + ITaikoL1 taiko = ITaikoL1(taikoL1()); + // Ensure this block is the first block proposed in the current L1 block. + require(taiko.lastProposedIn() != block.number, NOT_FIRST_PROPOSAL()); + taiko.proposeBlocksV2(_params, _txList); + } + + /// @notice Propose a Taiko block. + function proposeBlockV2(bytes calldata _params, bytes calldata _txList) external onlyProver { + ITaikoL1(taikoL1()).proposeBlockV2(_params, _txList); + } + + /// @notice Propose multiple Taiko blocks. + function proposeBlocksV2( + bytes[] calldata _paramsArr, + bytes[] calldata _txListArr + ) + external + onlyProver + { + ITaikoL1(taikoL1()).proposeBlocksV2(_paramsArr, _txListArr); + } + + /// @notice Proves or contests a Taiko block. + function proveBlock(uint64 _blockId, bytes calldata _input) external onlyProver { + ITaikoL1(taikoL1()).proveBlock(_blockId, _input); + } + + /// @notice Batch proves or contests Taiko blocks. + function proveBlocks( + uint64[] calldata _blockId, + bytes[] calldata _input, + bytes calldata _batchProof + ) + external + onlyProver + { + ITaikoL1(taikoL1()).proveBlocks(_blockId, _input, _batchProof); + } + + /// @notice Deposits Taiko token to TaikoL1 contract. + function depositBond(uint256 _amount) external onlyAuthorized { + ITaikoL1(taikoL1()).depositBond(_amount); + } + + /// @notice Withdraws Taiko token from TaikoL1 contract. + function withdrawBond(uint256 _amount) external onlyAuthorized { + ITaikoL1(taikoL1()).withdrawBond(_amount); + } + + /// @notice Delegates token voting right to a delegatee. + /// @param _delegatee The delegatee to receive the voting right. + function delegate(address _delegatee) external onlyAuthorized nonReentrant { + address _bondToken = bondToken(); + require(_bondToken != address(0), INVALID_BOND_TOKEN()); + ERC20VotesUpgradeable(_bondToken).delegate(_delegatee); + } + + // This function is necessary for this contract to become an assigned prover. + function isValidSignature( + bytes32 _hash, + bytes calldata _signature + ) + external + view + returns (bytes4 magicValue_) + { + (address recovered, ECDSA.RecoverError error) = ECDSA.tryRecover(_hash, _signature); + if (error == ECDSA.RecoverError.NoError && isProver[recovered]) { + magicValue_ = _EIP1271_MAGICVALUE; + } + } + + function taikoL1() internal view virtual returns (address) { + return resolve(LibStrings.B_TAIKO, false); + } + + function bondToken() internal view virtual returns (address) { + return resolve(LibStrings.B_BOND_TOKEN, true); + } +} diff --git a/packages/protocol/contracts/team/airdrop/ERC20Airdrop.sol b/packages/protocol/contracts/layer1/team/airdrop/ERC20Airdrop.sol similarity index 98% rename from packages/protocol/contracts/team/airdrop/ERC20Airdrop.sol rename to packages/protocol/contracts/layer1/team/airdrop/ERC20Airdrop.sol index 108c329e9e1..469a0618e51 100644 --- a/packages/protocol/contracts/team/airdrop/ERC20Airdrop.sol +++ b/packages/protocol/contracts/layer1/team/airdrop/ERC20Airdrop.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; diff --git a/packages/protocol/contracts/team/airdrop/MerkleClaimable.sol b/packages/protocol/contracts/layer1/team/airdrop/MerkleClaimable.sol similarity index 97% rename from packages/protocol/contracts/team/airdrop/MerkleClaimable.sol rename to packages/protocol/contracts/layer1/team/airdrop/MerkleClaimable.sol index 2ed3d6a7e34..38eba9238f2 100644 --- a/packages/protocol/contracts/team/airdrop/MerkleClaimable.sol +++ b/packages/protocol/contracts/layer1/team/airdrop/MerkleClaimable.sol @@ -1,8 +1,8 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import "@openzeppelin/contracts/utils/cryptography/MerkleProof.sol"; -import "../../common/EssentialContract.sol"; +import "src/shared/common/EssentialContract.sol"; /// @title MerkleClaimable /// @notice Contract for managing Taiko token airdrop for eligible users diff --git a/packages/protocol/contracts/team/tokenunlock/TokenUnlock.sol b/packages/protocol/contracts/layer1/team/tokenunlock/TokenUnlock.sol similarity index 83% rename from packages/protocol/contracts/team/tokenunlock/TokenUnlock.sol rename to packages/protocol/contracts/layer1/team/tokenunlock/TokenUnlock.sol index e7d6c8be987..1a2dad9cf12 100644 --- a/packages/protocol/contracts/team/tokenunlock/TokenUnlock.sol +++ b/packages/protocol/contracts/layer1/team/tokenunlock/TokenUnlock.sol @@ -1,15 +1,15 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import "@openzeppelin/contracts-upgradeable/utils/introspection/IERC165Upgradeable.sol"; import "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; -import "../../common/EssentialContract.sol"; -import "../../common/LibStrings.sol"; -import "../../libs/LibMath.sol"; -import "../proving/ProverSet.sol"; +import "src/shared/common/EssentialContract.sol"; +import "src/shared/common/LibStrings.sol"; +import "src/shared/common/LibMath.sol"; +import "../../provers/ProverSet.sol"; /// @title TokenUnlock /// @notice Manages the linear unlocking of Taiko tokens over a four-year period. @@ -60,31 +60,37 @@ contract TokenUnlock is EssentialContract { error NOT_WITHDRAWABLE(); error NOT_PROVER_SET(); error PERMISSION_DENIED(); + error TAIKO_TOKEN_NOT_USED_AS_BOND_TOKEN(); modifier onlyRecipient() { if (msg.sender != recipient) revert PERMISSION_DENIED(); _; } + modifier onlyRecipientOrOwner() { + if (msg.sender != recipient && msg.sender != owner()) revert PERMISSION_DENIED(); + _; + } + /// @notice Initializes the contract. /// @param _owner The contract owner address. - /// @param _addressManager The rollup address manager. + /// @param _rollupAddressManager The rollup address manager. /// @param _recipient Who will be the grantee for this contract. /// @param _tgeTimestamp The token generation event timestamp. function init( address _owner, - address _addressManager, + address _rollupAddressManager, address _recipient, uint64 _tgeTimestamp ) external nonZeroAddr(_recipient) - nonZeroValue(bytes32(uint256(_tgeTimestamp))) + nonZeroValue(_tgeTimestamp) initializer { if (_owner == _recipient) revert INVALID_PARAM(); - __Essential_init(_owner, _addressManager); + __Essential_init(_owner, _rollupAddressManager); recipient = _recipient; tgeTimestamp = _tgeTimestamp; @@ -105,6 +111,11 @@ contract TokenUnlock is EssentialContract { /// @notice Create a new prover set. function createProverSet() external onlyRecipient returns (address proverSet_) { + require( + resolve(LibStrings.B_BOND_TOKEN, false) == resolve(LibStrings.B_TAIKO_TOKEN, false), + TAIKO_TOKEN_NOT_USED_AS_BOND_TOKEN() + ); + bytes memory data = abi.encodeCall(ProverSet.init, (owner(), address(this), addressManager)); proverSet_ = address(new ERC1967Proxy(resolve(LibStrings.B_PROVER_SET, false), data)); @@ -117,7 +128,7 @@ contract TokenUnlock is EssentialContract { uint256 _amount ) external - nonZeroValue(bytes32(_amount)) + nonZeroValue(_amount) onlyRecipient { if (!isProverSet[_proverSet]) revert NOT_PROVER_SET(); @@ -126,7 +137,7 @@ contract TokenUnlock is EssentialContract { IERC20(resolve(LibStrings.B_TAIKO_TOKEN, false)).safeTransfer(_proverSet, _amount); } - /// @notice Withdraws all withdrawable tokens. + /// @notice Withdraws tokens by the recipient. /// @param _to The address the token will be sent to. /// @param _amount The amount of tokens to withdraw. function withdraw( @@ -135,18 +146,23 @@ contract TokenUnlock is EssentialContract { ) external nonZeroAddr(_to) - nonZeroValue(bytes32(_amount)) + nonZeroValue(_amount) onlyRecipient nonReentrant { if (_amount > amountWithdrawable()) revert NOT_WITHDRAWABLE(); - emit TokenWithdrawn(_to, _amount); - IERC20(resolve(LibStrings.B_TAIKO_TOKEN, false)).safeTransfer(_to, _amount); } - function changeRecipient(address _newRecipient) external onlyRecipient { + /// @notice Withdraws all tokens to the recipient address. + function withdraw() external nonReentrant { + uint256 amount = amountWithdrawable(); + emit TokenWithdrawn(recipient, amount); + IERC20(resolve(LibStrings.B_TAIKO_TOKEN, false)).safeTransfer(recipient, amount); + } + + function changeRecipient(address _newRecipient) external onlyRecipientOrOwner { if (_newRecipient == address(0) || _newRecipient == recipient) { revert INVALID_PARAM(); } diff --git a/packages/protocol/contracts/L1/tiers/ITierProvider.sol b/packages/protocol/contracts/layer1/tiers/ITierProvider.sol similarity index 63% rename from packages/protocol/contracts/L1/tiers/ITierProvider.sol rename to packages/protocol/contracts/layer1/tiers/ITierProvider.sol index c8fc464cef4..1e74dbcf25d 100644 --- a/packages/protocol/contracts/L1/tiers/ITierProvider.sol +++ b/packages/protocol/contracts/layer1/tiers/ITierProvider.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; /// @title ITierProvider /// @notice Defines interface to return tier configuration. @@ -11,7 +11,7 @@ interface ITierProvider { uint96 contestBond; uint24 cooldownWindow; // in minutes uint16 provingWindow; // in minutes - uint8 maxBlocksToVerifyPerProof; + uint8 maxBlocksToVerifyPerProof; // DEPRECATED } error TIER_NOT_FOUND(); @@ -28,25 +28,8 @@ interface ITierProvider { function getTierIds() external view returns (uint16[] memory); /// @dev Determines the minimal tier for a block based on a random input. + /// @param proposer The address of the block proposer. /// @param rand A pseudo-random number. /// @return The tier id. - function getMinTier(uint256 rand) external view returns (uint16); -} - -/// @dev Tier ID cannot be zero! -library LibTiers { - /// @notice Optimistic tier ID. - uint16 public constant TIER_OPTIMISTIC = 100; - - /// @notice SGX tier ID. - uint16 public constant TIER_SGX = 200; - - /// @notice SGX + ZKVM tier ID. - uint16 public constant TIER_SGX_ZKVM = 300; - - /// @notice Guardian tier ID with minority approval. - uint16 public constant TIER_GUARDIAN_MINORITY = 900; - - /// @notice Guardian tier ID with majority approval. - uint16 public constant TIER_GUARDIAN = 1000; + function getMinTier(address proposer, uint256 rand) external view returns (uint16); } diff --git a/packages/protocol/contracts/L1/tiers/ITierRouter.sol b/packages/protocol/contracts/layer1/tiers/ITierRouter.sol similarity index 94% rename from packages/protocol/contracts/L1/tiers/ITierRouter.sol rename to packages/protocol/contracts/layer1/tiers/ITierRouter.sol index 00454883985..3b8863a021a 100644 --- a/packages/protocol/contracts/L1/tiers/ITierRouter.sol +++ b/packages/protocol/contracts/layer1/tiers/ITierRouter.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; /// @title ITierRouter /// @notice Defines interface to return an ITierProvider diff --git a/packages/protocol/contracts/layer1/tiers/LibTiers.sol b/packages/protocol/contracts/layer1/tiers/LibTiers.sol new file mode 100644 index 00000000000..fd70d7eaf04 --- /dev/null +++ b/packages/protocol/contracts/layer1/tiers/LibTiers.sol @@ -0,0 +1,31 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +/// @title LibTiers +/// @dev Tier ID cannot be zero and must be unique. +/// @custom:security-contact security@taiko.xyz +library LibTiers { + /// @notice Optimistic tier ID. + uint16 public constant TIER_OPTIMISTIC = 100; + + /// @notice TEE tiers + /// Although these tiers have diffeerent IDs, at most one should be selected in a verifier. + uint16 public constant TIER_SGX = 200; + uint16 public constant TIER_TDX = 201; + uint16 public constant TIER_TEE_ANY = 202; + + /// @notice ZK Tiers. + /// Although these tiers have diffeerent IDs, at most one should be selected in a verifier. + uint16 public constant TIER_ZKVM_RISC0 = 250; + uint16 public constant TIER_ZKVM_SP1 = 251; + uint16 public constant TIER_ZKVM_ANY = 252; + + /// @notice Any ZKVM+TEE proof + uint16 public constant TIER_ZKVM_AND_TEE = 300; + + /// @notice Guardian tier ID with minority approval. + uint16 public constant TIER_GUARDIAN_MINORITY = 900; + + /// @notice Guardian tier ID with majority approval. + uint16 public constant TIER_GUARDIAN = 1000; +} diff --git a/packages/protocol/contracts/layer1/tiers/TierProviderBase.sol b/packages/protocol/contracts/layer1/tiers/TierProviderBase.sol new file mode 100644 index 00000000000..b1eadb72334 --- /dev/null +++ b/packages/protocol/contracts/layer1/tiers/TierProviderBase.sol @@ -0,0 +1,96 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "src/shared/common/LibStrings.sol"; +import "./ITierProvider.sol"; +import "./LibTiers.sol"; + +/// @title TierProviderBase +/// @dev Any changes to the configuration in this file must be announced and documented on our site. +/// Ensure all modifications are reviewed by the devrel team. +/// @custom:security-contact security@taiko.xyz +abstract contract TierProviderBase is ITierProvider { + uint96 public constant BOND_UNIT = 50 ether; // TAIKO tokens + + /// @inheritdoc ITierProvider + /// @notice Each tier, except the top tier, has a validity bond that is 75 TAIKO higher than the + /// previous tier. Additionally, each tier's contest bond is 6.5625 times its validity bond. + function getTier(uint16 _tierId) public pure virtual returns (ITierProvider.Tier memory) { + if (_tierId == LibTiers.TIER_OPTIMISTIC) { + return _buildTier(LibStrings.B_TIER_OPTIMISTIC, 1, 1440, 60); + } + + // TEE Tiers + if (_tierId == LibTiers.TIER_SGX) { + // cooldownWindow is 240 minutes and provingWindow is 60 minutes + return _buildTier(LibStrings.B_TIER_SGX, 2, 240, 60); + } + if (_tierId == LibTiers.TIER_TDX) { + // cooldownWindow is 240 minutes and provingWindow is 60 minutes + return _buildTier(LibStrings.B_TIER_TDX, 2, 240, 60); + } + if (_tierId == LibTiers.TIER_TEE_ANY) { + // cooldownWindow is 240 minutes and provingWindow is 60 minutes + return _buildTier(LibStrings.B_TIER_TEE_ANY, 2, 240, 60); + } + + // ZKVM Tiers: Allowing 120 minutes for proof aggregation. + if (_tierId == LibTiers.TIER_ZKVM_RISC0) { + // cooldownWindow is 240 minutes and provingWindow is 120 minutes + return _buildTier(LibStrings.B_TIER_ZKVM_RISC0, 3, 240, 120); + } + if (_tierId == LibTiers.TIER_ZKVM_SP1) { + // cooldownWindow is 240 minutes and provingWindow is 120 minutes + return _buildTier(LibStrings.B_TIER_ZKVM_SP1, 3, 240, 120); + } + if (_tierId == LibTiers.TIER_ZKVM_ANY) { + // cooldownWindow is 240 minutes and provingWindow is 90 minutes + return _buildTier(LibStrings.B_TIER_ZKVM_ANY, 3, 240, 120); + } + if (_tierId == LibTiers.TIER_ZKVM_AND_TEE) { + // cooldownWindow is 240 minutes and provingWindow is 90 minutes + return _buildTier(LibStrings.B_TIER_ZKVM_AND_TEE, 3, 240, 120); + } + + // Guardian Minority Tiers + if (_tierId == LibTiers.TIER_GUARDIAN_MINORITY) { + // cooldownWindow is 60 minutes and provingWindow is 120 minutes + return _buildTier(LibStrings.B_TIER_GUARDIAN_MINORITY, 4, 240, 120); + } + + // Guardian Major Tiers + if (_tierId == LibTiers.TIER_GUARDIAN) { + // cooldownWindow is 480 minutes + return _buildTier(LibStrings.B_TIER_GUARDIAN, 0, 480, 0); + } + + revert TIER_NOT_FOUND(); + } + + /// @dev Builds a generic tier with specified parameters. + /// @param _verifierName The name of the verifier. + /// @param _validityBondUnits The units of validity bonds. + /// @param _cooldownWindow The cooldown window duration in minutes. + /// @param _provingWindow The proving window duration in minutes. + /// @return A Tier struct with the provided parameters. + function _buildTier( + bytes32 _verifierName, + uint8 _validityBondUnits, + uint16 _cooldownWindow, + uint16 _provingWindow + ) + private + pure + returns (ITierProvider.Tier memory) + { + uint96 validityBond = BOND_UNIT * _validityBondUnits; + return ITierProvider.Tier({ + verifierName: _verifierName, + validityBond: validityBond, + contestBond: validityBond / 10_000 * 65_625, + cooldownWindow: _cooldownWindow, + provingWindow: _provingWindow, + maxBlocksToVerifyPerProof: 0 + }); + } +} diff --git a/packages/protocol/contracts/tko/TaikoToken.sol b/packages/protocol/contracts/layer1/token/TaikoToken.sol similarity index 65% rename from packages/protocol/contracts/tko/TaikoToken.sol rename to packages/protocol/contracts/layer1/token/TaikoToken.sol index 5643acac3f1..94a126138f2 100644 --- a/packages/protocol/contracts/tko/TaikoToken.sol +++ b/packages/protocol/contracts/layer1/token/TaikoToken.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; -import "./TaikoTokenBase.sol"; +import "src/shared/token/TaikoTokenBase.sol"; /// @title TaikoToken /// @notice The TaikoToken (TKO), in the protocol is used for prover collateral @@ -14,19 +14,38 @@ contract TaikoToken is TaikoTokenBase { address private constant _TAIKO_L1 = 0x06a9Ab27c7e2255df1815E6CC0168d7755Feb19a; address private constant _ERC20_VAULT = 0x996282cA11E5DEb6B5D122CC3B9A1FcAAD4415Ab; + error TT_INVALID_PARAM(); + /// @notice Initializes the contract. /// @param _owner The owner of this contract. msg.sender will be used if this value is zero. /// @param _recipient The address to receive initial token minting. - function init(address _owner, address _recipient) public initializer { __Essential_init(_owner); - __ERC20_init("Taiko Token", "TKO"); + __ERC20_init("Taiko Token", "TAIKO"); __ERC20Votes_init(); __ERC20Permit_init("Taiko Token"); // Mint 1 billion tokens _mint(_recipient, 1_000_000_000 ether); } + /// @notice Batch transfers tokens + /// @param recipients The list of addresses to transfer tokens to. + /// @param amounts The list of amounts for transfer. + /// @return true if the transfer is successful. + function batchTransfer( + address[] calldata recipients, + uint256[] calldata amounts + ) + external + returns (bool) + { + if (recipients.length != amounts.length) revert TT_INVALID_PARAM(); + for (uint256 i; i < recipients.length; ++i) { + _transfer(msg.sender, recipients[i], amounts[i]); + } + return true; + } + function delegates(address account) public view virtual override returns (address) { // Special checks to avoid reading from storage slots if (account == _TAIKO_L1 || account == _ERC20_VAULT) return address(0); diff --git a/packages/protocol/contracts/verifiers/IVerifier.sol b/packages/protocol/contracts/layer1/verifiers/IVerifier.sol similarity index 55% rename from packages/protocol/contracts/verifiers/IVerifier.sol rename to packages/protocol/contracts/layer1/verifiers/IVerifier.sol index a3e0091fcd2..ae9e91cbfe7 100644 --- a/packages/protocol/contracts/verifiers/IVerifier.sol +++ b/packages/protocol/contracts/layer1/verifiers/IVerifier.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; -import "../L1/TaikoData.sol"; +import "../based/TaikoData.sol"; /// @title IVerifier /// @notice Defines the function that handles proof verification. @@ -17,6 +17,17 @@ interface IVerifier { address msgSender; } + struct ContextV2 { + bytes32 metaHash; + bytes32 blobHash; + address prover; + uint64 blockId; + bool isContesting; + bool blobUsed; + address msgSender; + TaikoData.Transition tran; + } + /// @notice Verifies a proof. /// @param _ctx The context of the proof verification. /// @param _tran The transition to verify. @@ -27,4 +38,13 @@ interface IVerifier { TaikoData.TierProof calldata _proof ) external; + + /// @notice Verifies multiple proofs. + /// @param _ctxs The array of contexts for the proof verifications. + /// @param _proof The batch proof to verify. + function verifyBatchProof( + ContextV2[] calldata _ctxs, + TaikoData.TierProof calldata _proof + ) + external; } diff --git a/packages/protocol/contracts/verifiers/libs/LibPublicInput.sol b/packages/protocol/contracts/layer1/verifiers/LibPublicInput.sol similarity index 94% rename from packages/protocol/contracts/verifiers/libs/LibPublicInput.sol rename to packages/protocol/contracts/layer1/verifiers/LibPublicInput.sol index 4bf3a6b7d1a..d85205fd53f 100644 --- a/packages/protocol/contracts/verifiers/libs/LibPublicInput.sol +++ b/packages/protocol/contracts/layer1/verifiers/LibPublicInput.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; -import "../../L1/TaikoData.sol"; +import "../../layer1/based/TaikoData.sol"; /// @title LibPublicInput /// @notice A library for handling hashing the so-called public input hash, used by sgx and zk diff --git a/packages/protocol/contracts/layer1/verifiers/Risc0Verifier.sol b/packages/protocol/contracts/layer1/verifiers/Risc0Verifier.sol new file mode 100644 index 00000000000..2700c1cefe7 --- /dev/null +++ b/packages/protocol/contracts/layer1/verifiers/Risc0Verifier.sol @@ -0,0 +1,127 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "@risc0/contracts/IRiscZeroVerifier.sol"; +import "src/shared/common/EssentialContract.sol"; +import "src/shared/common/LibStrings.sol"; +import "../based/ITaikoL1.sol"; +import "./LibPublicInput.sol"; +import "./IVerifier.sol"; + +/// @title Risc0Verifier +/// @custom:security-contact security@taiko.xyz +contract Risc0Verifier is EssentialContract, IVerifier { + // [32, 0, 0, 0] -- big-endian uint32(32) for hash bytes len + bytes private constant FIXED_JOURNAL_HEADER = hex"20000000"; + + /// @notice Trusted imageId mapping + mapping(bytes32 imageId => bool trusted) public isImageTrusted; + + uint256[49] private __gap; + + /// @dev Emitted when a trusted image is set / unset. + /// @param imageId The id of the image + /// @param trusted True if trusted, false otherwise + event ImageTrusted(bytes32 imageId, bool trusted); + + /// @dev Emitted when a proof is verified + event ProofVerified(bytes32 metaHash, bytes32 publicInputHash); + + error RISC_ZERO_INVALID_BLOCK_PROOF_IMAGE_ID(); + error RISC_ZERO_INVALID_AGGREGATION_IMAGE_ID(); + error RISC_ZERO_INVALID_PROOF(); + + /// @notice Initializes the contract with the provided address manager. + /// @param _owner The address of the owner. + /// @param _rollupAddressManager The address of the AddressManager. + function init(address _owner, address _rollupAddressManager) external initializer { + __Essential_init(_owner, _rollupAddressManager); + } + + /// @notice Sets/unsets an the imageId as trusted entity + /// @param _imageId The id of the image. + /// @param _trusted True if trusted, false otherwise. + function setImageIdTrusted(bytes32 _imageId, bool _trusted) external onlyOwner { + isImageTrusted[_imageId] = _trusted; + + emit ImageTrusted(_imageId, _trusted); + } + + /// @inheritdoc IVerifier + function verifyProof( + Context calldata _ctx, + TaikoData.Transition calldata _tran, + TaikoData.TierProof calldata _proof + ) + external + view + { + // Do not run proof verification to contest an existing proof + if (_ctx.isContesting) return; + + // Decode will throw if not proper length/encoding + (bytes memory seal, bytes32 imageId) = abi.decode(_proof.data, (bytes, bytes32)); + + require(isImageTrusted[imageId], RISC_ZERO_INVALID_BLOCK_PROOF_IMAGE_ID()); + + bytes32 publicInputHash = LibPublicInput.hashPublicInputs( + _tran, address(this), address(0), _ctx.prover, _ctx.metaHash, taikoChainId() + ); + + // journalDigest is the sha256 hash of the hashed public input + bytes32 journalDigest = sha256(bytes.concat(FIXED_JOURNAL_HEADER, publicInputHash)); + + // call risc0 verifier contract + (bool success,) = resolve(LibStrings.B_RISCZERO_GROTH16_VERIFIER, false).staticcall( + abi.encodeCall(IRiscZeroVerifier.verify, (seal, imageId, journalDigest)) + ); + require(success, RISC_ZERO_INVALID_PROOF()); + } + + /// @inheritdoc IVerifier + function verifyBatchProof( + ContextV2[] calldata _ctxs, + TaikoData.TierProof calldata _proof + ) + external + { + // Decode will throw if not proper length/encoding + (bytes memory seal, bytes32 blockImageId, bytes32 aggregationImageId) = + abi.decode(_proof.data, (bytes, bytes32, bytes32)); + + // Check if the aggregation program is trusted + require(isImageTrusted[aggregationImageId], RISC_ZERO_INVALID_AGGREGATION_IMAGE_ID()); + // Check if the block proving program is trusted + require(isImageTrusted[blockImageId], RISC_ZERO_INVALID_BLOCK_PROOF_IMAGE_ID()); + + // Collect public inputs + bytes32[] memory publicInputs = new bytes32[](_ctxs.length + 1); + // First public input is the block proving program key + publicInputs[0] = blockImageId; + // All other inputs are the block program public inputs (a single 32 byte value) + for (uint256 i; i < _ctxs.length; ++i) { + publicInputs[i + 1] = LibPublicInput.hashPublicInputs( + _ctxs[i].tran, + address(this), + address(0), + _ctxs[i].prover, + _ctxs[i].metaHash, + taikoChainId() + ); + emit ProofVerified(_ctxs[i].metaHash, publicInputs[i + 1]); + } + + // journalDigest is the sha256 hash of the hashed public input + bytes32 journalDigest = sha256(abi.encodePacked(publicInputs)); + + // call risc0 verifier contract + (bool success,) = resolve(LibStrings.B_RISCZERO_GROTH16_VERIFIER, false).staticcall( + abi.encodeCall(IRiscZeroVerifier.verify, (seal, aggregationImageId, journalDigest)) + ); + require(success, RISC_ZERO_INVALID_PROOF()); + } + + function taikoChainId() internal view virtual returns (uint64) { + return ITaikoL1(resolve(LibStrings.B_TAIKO, false)).getConfig().chainId; + } +} diff --git a/packages/protocol/contracts/layer1/verifiers/SP1Verifier.sol b/packages/protocol/contracts/layer1/verifiers/SP1Verifier.sol new file mode 100644 index 00000000000..cd3e62af336 --- /dev/null +++ b/packages/protocol/contracts/layer1/verifiers/SP1Verifier.sol @@ -0,0 +1,129 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "@sp1-contracts/src/ISP1Verifier.sol"; +import "src/shared/common/EssentialContract.sol"; +import "src/shared/common/LibStrings.sol"; +import "../based/ITaikoL1.sol"; +import "./LibPublicInput.sol"; +import "./IVerifier.sol"; + +/// @title SP1Verifier +/// @custom:security-contact security@taiko.xyz +contract SP1Verifier is EssentialContract, IVerifier { + /// @notice The verification keys mappings for the proving programs. + mapping(bytes32 provingProgramVKey => bool trusted) public isProgramTrusted; + + uint256[49] private __gap; + + /// @dev Emitted when a trusted image is set / unset. + /// @param programVKey The id of the image + /// @param trusted The block's assigned prover. + event ProgramTrusted(bytes32 programVKey, bool trusted); + + error SP1_INVALID_PROGRAM_VKEY(); + error SP1_INVALID_AGGREGATION_VKEY(); + error SP1_INVALID_PARAMS(); + error SP1_INVALID_PROOF(); + + /// @notice Initializes the contract with the provided address manager. + /// @param _owner The address of the owner. + /// @param _addressManager The address of the AddressManager. + function init(address _owner, address _addressManager) external initializer { + __Essential_init(_owner, _addressManager); + } + + /// @notice Sets/unsets an the program's verification key as trusted entity + /// @param _programVKey The verification key of the program. + /// @param _trusted True if trusted, false otherwise. + function setProgramTrusted(bytes32 _programVKey, bool _trusted) external onlyOwner { + isProgramTrusted[_programVKey] = _trusted; + + emit ProgramTrusted(_programVKey, _trusted); + } + + /// @inheritdoc IVerifier + function verifyProof( + Context calldata _ctx, + TaikoData.Transition calldata _tran, + TaikoData.TierProof calldata _proof + ) + external + view + { + // Do not run proof verification to contest an existing proof + if (_ctx.isContesting) return; + + // Avoid in-memory decoding, so in-place decode with slicing. + // e.g.: bytes32 programVKey = bytes32(_proof.data[0:32]); + require(isProgramTrusted[bytes32(_proof.data[0:32])], SP1_INVALID_PROGRAM_VKEY()); + + // Need to be converted from bytes32 to bytes + bytes32 hashedPublicInput = LibPublicInput.hashPublicInputs( + _tran, address(this), address(0), _ctx.prover, _ctx.metaHash, taikoChainId() + ); + + // _proof.data[32:] is the succinct's proof position + (bool success,) = sp1RemoteVerifier().staticcall( + abi.encodeCall( + ISP1Verifier.verifyProof, + (bytes32(_proof.data[0:32]), abi.encode(hashedPublicInput), _proof.data[32:]) + ) + ); + + require(success, SP1_INVALID_PROOF()); + } + + /// @inheritdoc IVerifier + function verifyBatchProof( + ContextV2[] calldata _ctxs, + TaikoData.TierProof calldata _proof + ) + external + view + { + require(_ctxs.length != 0 && _proof.data.length > 64, SP1_INVALID_PARAMS()); + // Extract the necessary data + bytes32 aggregationProgram = bytes32(_proof.data[0:32]); + bytes32 blockProvingProgram = bytes32(_proof.data[32:64]); + + // Check if the aggregation program is trusted + require(isProgramTrusted[aggregationProgram], SP1_INVALID_AGGREGATION_VKEY()); + // Check if the block proving program is trusted + require(isProgramTrusted[blockProvingProgram], SP1_INVALID_PROGRAM_VKEY()); + + // Collect public inputs + bytes32[] memory publicInputs = new bytes32[](_ctxs.length + 1); + // First public input is the block proving program key + publicInputs[0] = blockProvingProgram; + // All other inputs are the block program public inputs (a single 32 byte value) + for (uint256 i; i < _ctxs.length; ++i) { + publicInputs[i + 1] = LibPublicInput.hashPublicInputs( + _ctxs[i].tran, + address(this), + address(0), + _ctxs[i].prover, + _ctxs[i].metaHash, + taikoChainId() + ); + } + + // _proof.data[64:] is the succinct's proof position + (bool success,) = sp1RemoteVerifier().staticcall( + abi.encodeCall( + ISP1Verifier.verifyProof, + (aggregationProgram, abi.encodePacked(publicInputs), _proof.data[64:]) + ) + ); + + require(success, SP1_INVALID_PROOF()); + } + + function taikoChainId() internal view virtual returns (uint64) { + return ITaikoL1(resolve(LibStrings.B_TAIKO, false)).getConfig().chainId; + } + + function sp1RemoteVerifier() public view virtual returns (address) { + return resolve(LibStrings.B_SP1_REMOTE_VERIFIER, false); + } +} diff --git a/packages/protocol/contracts/layer1/verifiers/SgxVerifier.sol b/packages/protocol/contracts/layer1/verifiers/SgxVerifier.sol new file mode 100644 index 00000000000..1044bec19b4 --- /dev/null +++ b/packages/protocol/contracts/layer1/verifiers/SgxVerifier.sol @@ -0,0 +1,265 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; +import "src/shared/common/EssentialContract.sol"; +import "src/shared/common/LibStrings.sol"; +import "../automata-attestation/interfaces/IAttestation.sol"; +import "../automata-attestation/lib/QuoteV3Auth/V3Struct.sol"; +import "../based/ITaikoL1.sol"; +import "../based/TaikoData.sol"; +import "./LibPublicInput.sol"; +import "./IVerifier.sol"; + +/// @title SgxVerifier +/// @notice This contract is the implementation of verifying SGX signature proofs +/// onchain. +/// @dev Please see references below: +/// - Reference #1: https://ethresear.ch/t/2fa-zk-rollups-using-sgx/14462 +/// - Reference #2: https://github.com/gramineproject/gramine/discussions/1579 +/// @custom:security-contact security@taiko.xyz +contract SgxVerifier is EssentialContract, IVerifier { + /// @dev Each public-private key pair (Ethereum address) is generated within + /// the SGX program when it boots up. The off-chain remote attestation + /// ensures the validity of the program hash and has the capability of + /// bootstrapping the network with trustworthy instances. + struct Instance { + address addr; + uint64 validSince; + } + + /// @notice The expiry time for the SGX instance. + uint64 public constant INSTANCE_EXPIRY = 365 days; + + /// @notice A security feature, a delay until an instance is enabled when using onchain RA + /// verification + uint64 public constant INSTANCE_VALIDITY_DELAY = 0; + + /// @dev For gas savings, we shall assign each SGX instance with an id that when we need to + /// set a new pub key, just write storage once. + /// Slot 1. + uint256 public nextInstanceId; + + /// @dev One SGX instance is uniquely identified (on-chain) by it's ECDSA public key + /// (or rather ethereum address). Once that address is used (by proof verification) it has to be + /// overwritten by a new one (representing the same instance). This is due to side-channel + /// protection. Also this public key shall expire after some time + /// (for now it is a long enough 6 months setting). + /// Slot 2. + mapping(uint256 instanceId => Instance instance) public instances; + + /// @dev One address shall be registered (during attestation) only once, otherwise it could + /// bypass this contract's expiry check by always registering with the same attestation and + /// getting multiple valid instanceIds. While during proving, it is technically possible to + /// register the old addresses, it is less of a problem, because the instanceId would be the + /// same for those addresses and if deleted - the attestation cannot be reused anyways. + /// Slot 3. + mapping(address instanceAddress => bool alreadyAttested) public addressRegistered; + + uint256[47] private __gap; + + /// @notice Emitted when a new SGX instance is added to the registry, or replaced. + /// @param id The ID of the SGX instance. + /// @param instance The address of the SGX instance. + /// @param replaced The address of the SGX instance that was replaced. If it is the first + /// instance, this value is zero address. + /// @param validSince The time since the instance is valid. + event InstanceAdded( + uint256 indexed id, address indexed instance, address indexed replaced, uint256 validSince + ); + + /// @notice Emitted when an SGX instance is deleted from the registry. + /// @param id The ID of the SGX instance. + /// @param instance The address of the SGX instance. + event InstanceDeleted(uint256 indexed id, address indexed instance); + + error SGX_ALREADY_ATTESTED(); + error SGX_INVALID_ATTESTATION(); + error SGX_INVALID_INSTANCE(); + error SGX_INVALID_PROOF(); + error SGX_RA_NOT_SUPPORTED(); + + /// @notice Initializes the contract. + /// @param _owner The owner of this contract. msg.sender will be used if this value is zero. + /// @param _rollupAddressManager The address of the {AddressManager} contract. + function init(address _owner, address _rollupAddressManager) external initializer { + __Essential_init(_owner, _rollupAddressManager); + } + + /// @notice Adds trusted SGX instances to the registry. + /// @param _instances The address array of trusted SGX instances. + /// @return The respective instanceId array per addresses. + function addInstances(address[] calldata _instances) + external + onlyOwner + returns (uint256[] memory) + { + return _addInstances(_instances, true); + } + + /// @notice Deletes SGX instances from the registry. + /// @param _ids The ids array of SGX instances. + function deleteInstances(uint256[] calldata _ids) + external + onlyFromOwnerOrNamed(LibStrings.B_SGX_WATCHDOG) + { + for (uint256 i; i < _ids.length; ++i) { + uint256 idx = _ids[i]; + + require(instances[idx].addr != address(0), SGX_INVALID_INSTANCE()); + + emit InstanceDeleted(idx, instances[idx].addr); + + delete instances[idx]; + } + } + + /// @notice Adds an SGX instance after the attestation is verified + /// @param _attestation The parsed attestation quote. + /// @return The respective instanceId + function registerInstance(V3Struct.ParsedV3QuoteStruct calldata _attestation) + external + returns (uint256) + { + address automataDcapAttestation = resolve(LibStrings.B_AUTOMATA_DCAP_ATTESTATION, true); + + require(automataDcapAttestation != address(0), SGX_RA_NOT_SUPPORTED()); + + (bool verified,) = IAttestation(automataDcapAttestation).verifyParsedQuote(_attestation); + + require(verified, SGX_INVALID_ATTESTATION()); + + address[] memory addresses = new address[](1); + addresses[0] = address(bytes20(_attestation.localEnclaveReport.reportData)); + + return _addInstances(addresses, false)[0]; + } + + /// @inheritdoc IVerifier + function verifyProof( + Context calldata _ctx, + TaikoData.Transition calldata _tran, + TaikoData.TierProof calldata _proof + ) + external + onlyFromNamedEither(LibStrings.B_TAIKO, LibStrings.B_TIER_TEE_ANY) + { + // Do not run proof verification to contest an existing proof + if (_ctx.isContesting) return; + + // Size is: 89 bytes + // 4 bytes + 20 bytes + 65 bytes (signature) = 89 + require(_proof.data.length == 89, SGX_INVALID_PROOF()); + + uint32 id = uint32(bytes4(_proof.data[:4])); + address newInstance = address(bytes20(_proof.data[4:24])); + + address oldInstance = ECDSA.recover( + LibPublicInput.hashPublicInputs( + _tran, address(this), newInstance, _ctx.prover, _ctx.metaHash, taikoChainId() + ), + _proof.data[24:] + ); + + require(_isInstanceValid(id, oldInstance), SGX_INVALID_INSTANCE()); + + if (newInstance != oldInstance && newInstance != address(0)) { + _replaceInstance(id, oldInstance, newInstance); + } + } + + /// @inheritdoc IVerifier + function verifyBatchProof( + ContextV2[] calldata _ctxs, + TaikoData.TierProof calldata _proof + ) + external + onlyFromNamedEither(LibStrings.B_TAIKO, LibStrings.B_TIER_TEE_ANY) + { + // Size is: 109 bytes + // 4 bytes + 20 bytes + 20 bytes + 65 bytes (signature) = 109 + require(_proof.data.length == 109, SGX_INVALID_PROOF()); + + uint32 id = uint32(bytes4(_proof.data[:4])); + address oldInstance = address(bytes20(_proof.data[4:24])); + address newInstance = address(bytes20(_proof.data[24:44])); + bytes memory signature = _proof.data[44:]; + + // Collect public inputs + bytes32[] memory publicInputs = new bytes32[](_ctxs.length + 2); + // First public input is the current instance public key + publicInputs[0] = bytes32(uint256(uint160(oldInstance))); + publicInputs[1] = bytes32(uint256(uint160(newInstance))); + // All other inputs are the block program public inputs (a single 32 byte value) + for (uint256 i; i < _ctxs.length; ++i) { + // TODO: For now this assumes the new instance public key to remain the same + publicInputs[i + 2] = LibPublicInput.hashPublicInputs( + _ctxs[i].tran, + address(this), + newInstance, + _ctxs[i].prover, + _ctxs[i].metaHash, + taikoChainId() + ); + } + + bytes32 signatureHash = keccak256(abi.encodePacked(publicInputs)); + // Verify the blocks + require(oldInstance == ECDSA.recover(signatureHash, signature), SGX_INVALID_PROOF()); + + require(_isInstanceValid(id, oldInstance), SGX_INVALID_INSTANCE()); + + if (newInstance != oldInstance && newInstance != address(0)) { + _replaceInstance(id, oldInstance, newInstance); + } + } + + function taikoChainId() internal view virtual returns (uint64) { + return ITaikoL1(resolve(LibStrings.B_TAIKO, false)).getConfig().chainId; + } + + function _addInstances( + address[] memory _instances, + bool instantValid + ) + private + returns (uint256[] memory ids) + { + ids = new uint256[](_instances.length); + + uint64 validSince = uint64(block.timestamp); + + if (!instantValid) { + validSince += INSTANCE_VALIDITY_DELAY; + } + + for (uint256 i; i < _instances.length; ++i) { + require(!addressRegistered[_instances[i]], SGX_ALREADY_ATTESTED()); + + addressRegistered[_instances[i]] = true; + + require(_instances[i] != address(0), SGX_INVALID_INSTANCE()); + + instances[nextInstanceId] = Instance(_instances[i], validSince); + ids[i] = nextInstanceId; + + emit InstanceAdded(nextInstanceId, _instances[i], address(0), validSince); + + ++nextInstanceId; + } + } + + function _replaceInstance(uint256 id, address oldInstance, address newInstance) private { + // Replacing an instance means, it went through a cooldown (if added by on-chain RA) so no + // need to have a cooldown + instances[id] = Instance(newInstance, uint64(block.timestamp)); + emit InstanceAdded(id, newInstance, oldInstance, block.timestamp); + } + + function _isInstanceValid(uint256 id, address instance) private view returns (bool) { + require(instance != address(0), SGX_INVALID_INSTANCE()); + require(instance == instances[id].addr, SGX_INVALID_INSTANCE()); + return instances[id].validSince <= block.timestamp + && block.timestamp <= instances[id].validSince + INSTANCE_EXPIRY; + } +} diff --git a/packages/protocol/contracts/verifiers/SgxVerifier.sol b/packages/protocol/contracts/layer1/verifiers/SgxVerifierBase.sol similarity index 68% rename from packages/protocol/contracts/verifiers/SgxVerifier.sol rename to packages/protocol/contracts/layer1/verifiers/SgxVerifierBase.sol index f8472371a5b..451d88604a3 100644 --- a/packages/protocol/contracts/verifiers/SgxVerifier.sol +++ b/packages/protocol/contracts/layer1/verifiers/SgxVerifierBase.sol @@ -1,23 +1,18 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; -import "../L1/ITaikoL1.sol"; -import "../common/EssentialContract.sol"; -import "../common/LibStrings.sol"; +import "src/shared/common/EssentialContract.sol"; +import "src/shared/common/LibStrings.sol"; import "../automata-attestation/interfaces/IAttestation.sol"; import "../automata-attestation/lib/QuoteV3Auth/V3Struct.sol"; -import "./libs/LibPublicInput.sol"; -import "./IVerifier.sol"; -/// @title SgxVerifier -/// @notice This contract is the implementation of verifying SGX signature proofs -/// onchain. +/// @title SgxVerifierBase /// @dev Please see references below: /// - Reference #1: https://ethresear.ch/t/2fa-zk-rollups-using-sgx/14462 /// - Reference #2: https://github.com/gramineproject/gramine/discussions/1579 /// @custom:security-contact security@taiko.xyz -contract SgxVerifier is EssentialContract, IVerifier { +abstract contract SgxVerifierBase is EssentialContract { /// @dev Each public-private key pair (Ethereum address) is generated within /// the SGX program when it boots up. The off-chain remote attestation /// ensures the validity of the program hash and has the capability of @@ -78,11 +73,25 @@ contract SgxVerifier is EssentialContract, IVerifier { error SGX_INVALID_PROOF(); error SGX_RA_NOT_SUPPORTED(); - /// @notice Initializes the contract. - /// @param _owner The owner of this contract. msg.sender will be used if this value is zero. - /// @param _addressManager The address of the {AddressManager} contract. - function init(address _owner, address _addressManager) external initializer { - __Essential_init(_owner, _addressManager); + /// @notice Register an SGX instance after the attestation is verified + /// @param _attestation The parsed attestation quote. + /// @return The respective instanceId + function registerInstance(V3Struct.ParsedV3QuoteStruct calldata _attestation) + external + returns (uint256) + { + address automataDcapAttestation = resolve(LibStrings.B_AUTOMATA_DCAP_ATTESTATION, true); + + require(automataDcapAttestation != address(0), SGX_RA_NOT_SUPPORTED()); + + (bool verified,) = IAttestation(automataDcapAttestation).verifyParsedQuote(_attestation); + + require(verified, SGX_INVALID_ATTESTATION()); + + address[] memory addresses = new address[](1); + addresses[0] = address(bytes20(_attestation.localEnclaveReport.reportData)); + + return _addInstances(addresses, false)[0]; } /// @notice Adds trusted SGX instances to the registry. @@ -105,7 +114,7 @@ contract SgxVerifier is EssentialContract, IVerifier { for (uint256 i; i < _ids.length; ++i) { uint256 idx = _ids[i]; - if (instances[idx].addr == address(0)) revert SGX_INVALID_INSTANCE(); + require(instances[idx].addr != address(0), SGX_INVALID_INSTANCE()); emit InstanceDeleted(idx, instances[idx].addr); @@ -113,69 +122,11 @@ contract SgxVerifier is EssentialContract, IVerifier { } } - /// @notice Adds an SGX instance after the attestation is verified - /// @param _attestation The parsed attestation quote. - /// @return The respective instanceId - function registerInstance(V3Struct.ParsedV3QuoteStruct calldata _attestation) - external - returns (uint256) - { - address automataDcapAttestation = resolve(LibStrings.B_AUTOMATA_DCAP_ATTESTATION, true); - - if (automataDcapAttestation == address(0)) { - revert SGX_RA_NOT_SUPPORTED(); - } - - (bool verified,) = IAttestation(automataDcapAttestation).verifyParsedQuote(_attestation); - - if (!verified) revert SGX_INVALID_ATTESTATION(); - - address[] memory _address = new address[](1); - _address[0] = address(bytes20(_attestation.localEnclaveReport.reportData)); - - return _addInstances(_address, false)[0]; - } - - /// @inheritdoc IVerifier - function verifyProof( - Context calldata _ctx, - TaikoData.Transition calldata _tran, - TaikoData.TierProof calldata _proof - ) - external - onlyFromNamed(LibStrings.B_TAIKO) - { - // Do not run proof verification to contest an existing proof - if (_ctx.isContesting) return; - - // Size is: 89 bytes - // 4 bytes + 20 bytes + 65 bytes (signature) = 89 - if (_proof.data.length != 89) revert SGX_INVALID_PROOF(); - - uint32 id = uint32(bytes4(_proof.data[:4])); - address newInstance = address(bytes20(_proof.data[4:24])); - - uint64 chainId = ITaikoL1(resolve(LibStrings.B_TAIKO, false)).getConfig().chainId; - - address oldInstance = ECDSA.recover( - LibPublicInput.hashPublicInputs( - _tran, address(this), newInstance, _ctx.prover, _ctx.metaHash, chainId - ), - _proof.data[24:] - ); - - if (!_isInstanceValid(id, oldInstance)) revert SGX_INVALID_INSTANCE(); - - if (oldInstance != newInstance) { - _replaceInstance(id, oldInstance, newInstance); - } - } - function _addInstances( address[] memory _instances, bool instantValid ) - private + internal returns (uint256[] memory ids) { ids = new uint256[](_instances.length); @@ -187,11 +138,11 @@ contract SgxVerifier is EssentialContract, IVerifier { } for (uint256 i; i < _instances.length; ++i) { - if (addressRegistered[_instances[i]]) revert SGX_ALREADY_ATTESTED(); + require(!addressRegistered[_instances[i]], SGX_ALREADY_ATTESTED()); addressRegistered[_instances[i]] = true; - if (_instances[i] == address(0)) revert SGX_INVALID_INSTANCE(); + require(_instances[i] != address(0), SGX_INVALID_INSTANCE()); instances[nextInstanceId] = Instance(_instances[i], validSince); ids[i] = nextInstanceId; @@ -202,14 +153,14 @@ contract SgxVerifier is EssentialContract, IVerifier { } } - function _replaceInstance(uint256 id, address oldInstance, address newInstance) private { + function _replaceInstance(uint256 id, address oldInstance, address newInstance) internal { // Replacing an instance means, it went through a cooldown (if added by on-chain RA) so no // need to have a cooldown instances[id] = Instance(newInstance, uint64(block.timestamp)); emit InstanceAdded(id, newInstance, oldInstance, block.timestamp); } - function _isInstanceValid(uint256 id, address instance) private view returns (bool) { + function _isInstanceValid(uint256 id, address instance) internal view returns (bool) { if (instance == address(0)) return false; if (instance != instances[id].addr) return false; return instances[id].validSince <= block.timestamp diff --git a/packages/protocol/contracts/layer1/verifiers/compose/ComposeVerifier.sol b/packages/protocol/contracts/layer1/verifiers/compose/ComposeVerifier.sol new file mode 100644 index 00000000000..da4d2ef4bda --- /dev/null +++ b/packages/protocol/contracts/layer1/verifiers/compose/ComposeVerifier.sol @@ -0,0 +1,123 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "src/shared/common/EssentialContract.sol"; +import "src/shared/common/LibStrings.sol"; +import "../IVerifier.sol"; + +/// @title ComposeVerifier +/// @notice This contract is an abstract verifier that composes multiple sub-verifiers to validate +/// proofs. +/// It ensures that a set of sub-proofs are verified by their respective verifiers before +/// considering the overall proof as valid. +/// @custom:security-contact security@taiko.xyz +abstract contract ComposeVerifier is EssentialContract, IVerifier { + uint256[50] private __gap; + + struct SubProof { + address verifier; + bytes proof; + } + + error CV_INVALID_CALLER(); + error CV_INVALID_SUB_VERIFIER(); + error CV_INVALID_SUBPROOF_LENGTH(); + error CV_SUB_VERIFIER_NOT_FOUND(); + + modifier onlyAuthorizedCaller() { + require(isCallerAuthorized(msg.sender), CV_INVALID_CALLER()); + _; + } + + /// @notice Initializes the contract. + /// @param _owner The owner of this contract. msg.sender will be used if this value is zero. + /// @param _rollupAddressManager The address of the {AddressManager} contract. + function init(address _owner, address _rollupAddressManager) external initializer { + __Essential_init(_owner, _rollupAddressManager); + } + + /// @inheritdoc IVerifier + function verifyProof( + Context calldata _ctx, + TaikoData.Transition calldata _tran, + TaikoData.TierProof calldata _proof + ) + external + onlyAuthorizedCaller + nonReentrant + { + (address[] memory verifiers, uint256 numSubProofs_) = getSubVerifiersAndThreshold(); + + SubProof[] memory subProofs = abi.decode(_proof.data, (SubProof[])); + require(subProofs.length == numSubProofs_, CV_INVALID_SUBPROOF_LENGTH()); + + for (uint256 i; i < subProofs.length; ++i) { + require(subProofs[i].verifier != address(0), CV_INVALID_SUB_VERIFIER()); + + // find the verifier + bool verifierFound; + for (uint256 j; j < verifiers.length; ++j) { + if (verifiers[j] == subProofs[i].verifier) { + verifierFound = true; + verifiers[j] = address(0); + } + } + + require(verifierFound, CV_SUB_VERIFIER_NOT_FOUND()); + + IVerifier(subProofs[i].verifier).verifyProof( + _ctx, _tran, TaikoData.TierProof(_proof.tier, subProofs[i].proof) + ); + } + } + + /// @inheritdoc IVerifier + function verifyBatchProof( + ContextV2[] calldata _ctxs, + TaikoData.TierProof calldata _proof + ) + external + onlyAuthorizedCaller + nonReentrant + { + (address[] memory verifiers, uint256 numSubProofs_) = getSubVerifiersAndThreshold(); + + SubProof[] memory subProofs = abi.decode(_proof.data, (SubProof[])); + require(subProofs.length == numSubProofs_, CV_INVALID_SUBPROOF_LENGTH()); + + for (uint256 i; i < subProofs.length; ++i) { + require(subProofs[i].verifier != address(0), CV_INVALID_SUB_VERIFIER()); + + // find the verifier + bool verifierFound; + for (uint256 j; j < verifiers.length; ++j) { + if (verifiers[j] == subProofs[i].verifier) { + verifierFound = true; + verifiers[j] = address(0); + } + } + + require(verifierFound, CV_SUB_VERIFIER_NOT_FOUND()); + + IVerifier(subProofs[i].verifier).verifyBatchProof( + _ctxs, TaikoData.TierProof(_proof.tier, subProofs[i].proof) + ); + } + } + + /// @notice Returns the list of sub-verifiers and calculates the threshold. + /// @return verifiers_ An array of addresses of sub-verifiers. + /// @return numSubProofs_ The number of sub proofs required. + function getSubVerifiersAndThreshold() + public + view + virtual + returns (address[] memory verifiers_, uint256 numSubProofs_); + + /// @notice Checks if the caller is authorized. + /// @param _caller The address of the caller to be checked. + /// @return A boolean value indicating whether the caller is authorized. + function isCallerAuthorized(address _caller) public view virtual returns (bool) { + return _caller == resolve(LibStrings.B_TAIKO, false); + } +} diff --git a/packages/protocol/contracts/layer1/verifiers/compose/TeeAnyVerifier.sol b/packages/protocol/contracts/layer1/verifiers/compose/TeeAnyVerifier.sol new file mode 100644 index 00000000000..5b22fa94c2e --- /dev/null +++ b/packages/protocol/contracts/layer1/verifiers/compose/TeeAnyVerifier.sol @@ -0,0 +1,30 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "src/shared/common/LibStrings.sol"; +import "./ComposeVerifier.sol"; + +/// @title TeeAnyVerifier +/// @custom:security-contact security@taiko.xyz +contract TeeAnyVerifier is ComposeVerifier { + uint256[50] private __gap; + + /// @inheritdoc ComposeVerifier + function isCallerAuthorized(address _caller) public view override returns (bool) { + return _caller == resolve(LibStrings.B_TAIKO, false) + || _caller == resolve(LibStrings.B_TIER_ZKVM_AND_TEE, true); + } + + /// @inheritdoc ComposeVerifier + function getSubVerifiersAndThreshold() + public + view + override + returns (address[] memory verifiers_, uint256 numSubProofs_) + { + verifiers_ = new address[](2); + verifiers_[0] = resolve(LibStrings.B_TIER_SGX, true); + verifiers_[1] = resolve(LibStrings.B_TIER_TDX, true); + numSubProofs_ = 1; + } +} diff --git a/packages/protocol/contracts/layer1/verifiers/compose/ZkAndTeeVerifier.sol b/packages/protocol/contracts/layer1/verifiers/compose/ZkAndTeeVerifier.sol new file mode 100644 index 00000000000..58293f60c06 --- /dev/null +++ b/packages/protocol/contracts/layer1/verifiers/compose/ZkAndTeeVerifier.sol @@ -0,0 +1,24 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "src/shared/common/LibStrings.sol"; +import "./ComposeVerifier.sol"; + +/// @title ZkAndTeeVerifier +/// @custom:security-contact security@taiko.xyz +contract ZkAndTeeVerifier is ComposeVerifier { + uint256[50] private __gap; + + /// @inheritdoc ComposeVerifier + function getSubVerifiersAndThreshold() + public + view + override + returns (address[] memory verifiers_, uint256 numSubProofs_) + { + verifiers_ = new address[](2); + verifiers_[0] = resolve(LibStrings.B_TIER_TEE_ANY, false); + verifiers_[1] = resolve(LibStrings.B_TIER_ZKVM_ANY, false); + numSubProofs_ = 2; + } +} diff --git a/packages/protocol/contracts/layer1/verifiers/compose/ZkAnyVerifier.sol b/packages/protocol/contracts/layer1/verifiers/compose/ZkAnyVerifier.sol new file mode 100644 index 00000000000..2dd0e5f6a04 --- /dev/null +++ b/packages/protocol/contracts/layer1/verifiers/compose/ZkAnyVerifier.sol @@ -0,0 +1,30 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "src/shared/common/LibStrings.sol"; +import "./ComposeVerifier.sol"; + +/// @title ZkAnyVerifier +/// @custom:security-contact security@taiko.xyz +contract ZkAnyVerifier is ComposeVerifier { + uint256[50] private __gap; + + /// @inheritdoc ComposeVerifier + function isCallerAuthorized(address _caller) public view override returns (bool) { + return _caller == resolve(LibStrings.B_TAIKO, false) + || _caller == resolve(LibStrings.B_TIER_ZKVM_AND_TEE, true); + } + + /// @inheritdoc ComposeVerifier + function getSubVerifiersAndThreshold() + public + view + override + returns (address[] memory verifiers_, uint256 numSubProofs_) + { + verifiers_ = new address[](2); + verifiers_[0] = resolve(LibStrings.B_TIER_ZKVM_RISC0, true); + verifiers_[1] = resolve(LibStrings.B_TIER_ZKVM_SP1, true); + numSubProofs_ = 1; + } +} diff --git a/packages/protocol/contracts/layer2/DelegateOwner.sol b/packages/protocol/contracts/layer2/DelegateOwner.sol new file mode 100644 index 00000000000..182e24d533a --- /dev/null +++ b/packages/protocol/contracts/layer2/DelegateOwner.sol @@ -0,0 +1,152 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "../shared/common/EssentialContract.sol"; +import "../shared/common/LibStrings.sol"; +import "../shared/common/LibAddress.sol"; +import "../shared/common/LibBytes.sol"; +import "../shared/bridge/IBridge.sol"; + +/// @title DelegateOwner +/// @notice This contract will be the owner of all essential contracts deployed on the L2 chain. +/// @dev Notice that when sending the message on the owner chain, the gas limit of the message must +/// not be zero, so on this chain, some EOA can help execute this transaction. +/// @custom:security-contact security@taiko.xyz +contract DelegateOwner is EssentialContract, IMessageInvocable { + /// @notice The owner chain ID. + uint64 public remoteChainId; // slot 1 + + /// @notice The admin who can directly call `invokeCall`. + address public admin; + + /// @notice The next transaction ID. + uint64 public nextTxId; // slot 2 + + /// @notice The real owner on L1, supposedly the DAO. + address public remoteOwner; + + uint256[48] private __gap; + + struct Call { + uint64 txId; + address target; + bool isDelegateCall; + bytes txdata; + } + + /// @notice Emitted when a message is invoked. + /// @param txId The transaction ID. + /// @param target The target address. + /// @param isDelegateCall True if the call is a `delegatecall`. + /// @param txdata The transaction data. + event MessageInvoked( + uint64 indexed txId, address indexed target, bool isDelegateCall, bytes txdata + ); + + /// @notice Emitted when the admin has been changed. + /// @param oldAdmin The old admin address. + /// @param newAdmin The new admin address. + event AdminUpdated(address indexed oldAdmin, address indexed newAdmin); + + error DO_DRYRUN_SUCCEEDED(); + error DO_INVALID_PARAM(); + error DO_INVALID_SENDER(); + error DO_INVALID_TARGET(); + error DO_INVALID_TX_ID(); + error DO_PERMISSION_DENIED(); + + modifier onlyAdminOrRemoteOwner() { + if (!_isAdminOrRemoteOwner(msg.sender)) revert DO_PERMISSION_DENIED(); + _; + } + + /// @notice Initializes the contract. + /// @param _remoteOwner The real owner on L1 that can send a cross-chain message to invoke + /// `onMessageInvocation`. + /// @param _remoteChainId The L1 chain's ID. + /// @param _sharedAddressManager The address of the {AddressManager} contract. + /// @param _admin The admin address. + function init( + address _remoteOwner, + address _sharedAddressManager, + uint64 _remoteChainId, + address _admin + ) + external + initializer + { + // This contract's owner will be itself. + __Essential_init(address(this), _sharedAddressManager); + + if (_remoteOwner == address(0) || _remoteChainId == 0 || _remoteChainId == block.chainid) { + revert DO_INVALID_PARAM(); + } + + remoteChainId = _remoteChainId; + remoteOwner = _remoteOwner; + admin = _admin; + } + + /// @inheritdoc IMessageInvocable + function onMessageInvocation(bytes calldata _data) external payable onlyAdminOrRemoteOwner { + _invokeCall(_data, true); + } + + /// @notice Dryruns a message invocation but always revert. + /// If this tx is reverted with DO_TRY_RUN_SUCCEEDED, the try run is successful. + /// Note that this function shall not be used in transaction and is designed for offchain + /// simulation only. + function dryrunInvocation(bytes calldata _data) external payable { + _invokeCall(_data, false); + revert DO_DRYRUN_SUCCEEDED(); + } + + /// @dev Updates the admin address. + /// @param _admin The new admin address. + function setAdmin(address _admin) external nonReentrant onlyOwner { + if (_admin == admin || _admin == address(this)) revert DO_INVALID_PARAM(); + + emit AdminUpdated(admin, _admin); + admin = _admin; + } + + /// @dev Accepts contract ownership + /// @param _target Target addresses. + function acceptOwnership(address _target) external nonReentrant onlyOwner { + Ownable2StepUpgradeable(_target).acceptOwnership(); + } + + function transferOwnership(address) public pure override notImplemented { } + + function _authorizePause(address, bool) internal pure override notImplemented { } + + function _invokeCall(bytes calldata _data, bool _verifyTxId) private { + Call memory call = abi.decode(_data, (Call)); + + if (call.txId == 0) { + call.txId = nextTxId; + } else if (_verifyTxId && call.txId != nextTxId) { + revert DO_INVALID_TX_ID(); + } + + nextTxId += 1; + + // By design, the target must be a contract address if the txdata is not empty + if (call.txdata.length != 0 && !Address.isContract(call.target)) revert DO_INVALID_TARGET(); + + (bool success, bytes memory result) = call.isDelegateCall // + ? call.target.delegatecall(call.txdata) + : call.target.call{ value: msg.value }(call.txdata); + + if (!success) LibBytes.revertWithExtractedError(result); + emit MessageInvoked(call.txId, call.target, call.isDelegateCall, call.txdata); + } + + function _isAdminOrRemoteOwner(address _sender) private view returns (bool) { + if (_sender == admin) return true; + if (_sender != resolve(LibStrings.B_BRIDGE, false)) return false; + + IBridge.Context memory ctx = IBridge(_sender).context(); + return ctx.srcChainId == remoteChainId && ctx.from == remoteOwner; + } +} diff --git a/packages/protocol/contracts/layer2/based/IBlockHash.sol b/packages/protocol/contracts/layer2/based/IBlockHash.sol new file mode 100644 index 00000000000..21f57452034 --- /dev/null +++ b/packages/protocol/contracts/layer2/based/IBlockHash.sol @@ -0,0 +1,11 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +/// @title IBlockHash +/// @notice Interface for retrieving block hashes. +interface IBlockHash { + /// @notice Retrieves the block hash for a given block ID. + /// @param _blockId The ID of the block whose hash is being requested. + /// @return The block hash of the specified block ID, or 0 if no hash is found. + function getBlockHash(uint256 _blockId) external view returns (bytes32); +} diff --git a/packages/protocol/contracts/layer2/based/LibEIP1559.sol b/packages/protocol/contracts/layer2/based/LibEIP1559.sol new file mode 100644 index 00000000000..b1c57926ff3 --- /dev/null +++ b/packages/protocol/contracts/layer2/based/LibEIP1559.sol @@ -0,0 +1,123 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "@solady/src/utils/FixedPointMathLib.sol"; +import "src/shared/common/LibMath.sol"; + +/// @title LibEIP1559 +/// @notice Implements e^(x) based bonding curve for EIP-1559 +/// @dev See https://ethresear.ch/t/make-eip-1559-more-like-an-amm-curve/9082 but some minor +/// difference as stated in docs/eip1559_on_l2.md. +/// @custom:security-contact security@taiko.xyz +library LibEIP1559 { + using LibMath for uint256; + + /// @notice The maximum allowable input value for the exp() function. + uint128 public constant MAX_EXP_INPUT = 135_305_999_368_893_231_588; + + /// @notice Calculates the base fee and gas excess for EIP-1559 + /// @param _gasTarget The target gas usage + /// @param _gasExcess The current gas excess + /// @param _gasIssuance The gas issuance + /// @param _parentGasUsed The gas used by the parent block + /// @param _minGasExcess The minimum gas excess + /// @return basefee_ The calculated base fee + /// @return gasExcess_ The calculated gas excess + function calc1559BaseFee( + uint64 _gasTarget, + uint64 _gasExcess, + uint64 _gasIssuance, + uint32 _parentGasUsed, + uint64 _minGasExcess + ) + internal + pure + returns (uint256 basefee_, uint64 gasExcess_) + { + // We always add the gas used by parent block to the gas excess + // value as this has already happened + uint256 excess = uint256(_gasExcess) + _parentGasUsed; + excess = excess > _gasIssuance ? excess - _gasIssuance : 1; + gasExcess_ = uint64(excess.max(_minGasExcess).min(type(uint64).max)); + + // The base fee per gas used by this block is the spot price at the + // bonding curve, regardless the actual amount of gas used by this + // block, however, this block's gas used will affect the next + // block's base fee. + basefee_ = basefee(_gasTarget, gasExcess_); + } + + /// @dev Adjusts the gas excess to maintain the same base fee when the gas target changes. + /// The formula used for adjustment is: + /// `_newGasTarget*ln(_newGasTarget/_gasTarget)+_gasExcess*_newGasTarget/_gasTarget` + /// @param _oldGasTarget The current gas target. + /// @param _newGasTarget The new gas target. + /// @param _oldGasExcess The current gas excess. + /// @return newGasTarget_ The new gas target value. + /// @return newGasExcess_ The new gas excess value. + function adjustExcess( + uint64 _oldGasTarget, + uint64 _newGasTarget, + uint64 _oldGasExcess + ) + internal + pure + returns (uint64 newGasTarget_, uint64 newGasExcess_) + { + uint256 f = FixedPointMathLib.WAD; + + if (_oldGasTarget == 0) { + return (_newGasTarget, _oldGasExcess); + } + + if ( + _newGasTarget == 0 || _oldGasTarget == _newGasTarget + || _newGasTarget >= type(uint256).max / f + ) { + return (_oldGasTarget, _oldGasExcess); + } + + uint256 ratio = f * _newGasTarget / _oldGasTarget; + if (ratio == 0 || ratio > uint256(type(int256).max)) { + return (_newGasTarget, _oldGasExcess); + } + + int256 lnRatio = FixedPointMathLib.lnWad(int256(ratio)); // may be negative + uint256 newGasExcess; + + assembly { + // compute x = (_newGasTarget * lnRatio + _gasExcess * ratio) + let x := add(mul(_newGasTarget, lnRatio), mul(_oldGasExcess, ratio)) + + // If x < 0, set newGasExcess to 0, otherwise calculate newGasExcess = x / f + switch slt(x, 0) + case 1 { newGasExcess := 0 } + default { newGasExcess := div(x, f) } + } + + return (_newGasTarget, newGasExcess.capToUint64()); + } + + /// @dev Calculates the base fee using the formula: exp(_gasExcess/_gasTarget)/_gasTarget + /// @param _gasTarget The current gas target. + /// @param _gasExcess The current gas excess. + /// @return The calculated base fee. + function basefee(uint64 _gasTarget, uint64 _gasExcess) internal pure returns (uint256) { + if (_gasTarget == 0) return 1; + + return (ethQty(_gasTarget, _gasExcess) / _gasTarget).max(1); + } + + /// @dev Calculates the exponential of the ratio of gas excess to gas target. + /// @param _gasTarget The current gas target. + /// @param _gasExcess The current gas excess. + /// @return The calculated exponential value. + function ethQty(uint64 _gasTarget, uint64 _gasExcess) internal pure returns (uint256) { + assert(_gasTarget != 0); + uint256 input = FixedPointMathLib.WAD * _gasExcess / _gasTarget; + if (input > MAX_EXP_INPUT) { + input = MAX_EXP_INPUT; + } + return uint256(FixedPointMathLib.expWad(int256(input))) / FixedPointMathLib.WAD; + } +} diff --git a/packages/protocol/contracts/L2/LibL2Config.sol b/packages/protocol/contracts/layer2/based/LibL2Config.sol similarity index 88% rename from packages/protocol/contracts/L2/LibL2Config.sol rename to packages/protocol/contracts/layer2/based/LibL2Config.sol index 70af37013b8..f1a7586d7f7 100644 --- a/packages/protocol/contracts/L2/LibL2Config.sol +++ b/packages/protocol/contracts/layer2/based/LibL2Config.sol @@ -1,6 +1,7 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; +/// @dev DEPRECATED but used by node/client for syncing old blocks /// @title LibL2Config library LibL2Config { struct Config { diff --git a/packages/protocol/contracts/layer2/based/TaikoL2.sol b/packages/protocol/contracts/layer2/based/TaikoL2.sol new file mode 100644 index 00000000000..e9baedd74aa --- /dev/null +++ b/packages/protocol/contracts/layer2/based/TaikoL2.sol @@ -0,0 +1,341 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; + +import "src/shared/common/EssentialContract.sol"; +import "src/shared/common/LibStrings.sol"; +import "src/shared/common/LibAddress.sol"; +import "src/shared/common/LibMath.sol"; +import "src/shared/signal/ISignalService.sol"; +import "./LibEIP1559.sol"; +import "./LibL2Config.sol"; +import "./IBlockHash.sol"; +import "./TaikoL2Deprecated.sol"; + +/// @title TaikoL2 +/// @notice Taiko L2 is a smart contract that handles cross-layer message +/// verification and manages EIP-1559 gas pricing for Layer 2 (L2) operations. +/// It is used to anchor the latest L1 block details to L2 for cross-layer +/// communication, manage EIP-1559 parameters for gas pricing, and store +/// verified L1 block information. +/// @custom:security-contact security@taiko.xyz +contract TaikoL2 is EssentialContract, IBlockHash, TaikoL2Deprecated { + using LibAddress for address; + using LibMath for uint256; + using SafeERC20 for IERC20; + + /// @notice Golden touch address is the only address that can do the anchor transaction. + address public constant GOLDEN_TOUCH_ADDRESS = 0x0000777735367b36bC9B61C50022d9D0700dB4Ec; + + /// @notice Mapping from L2 block numbers to their block hashes. All L2 block hashes will + /// be saved in this mapping. + mapping(uint256 blockId => bytes32 blockHash) private _blockhashes; + + /// @notice A hash to check the integrity of public inputs. + /// @dev Slot 2. + bytes32 public publicInputHash; + + /// @notice The gas excess value used to calculate the base fee. + /// @dev Slot 3. + uint64 public parentGasExcess; + + /// @notice The last synced L1 block height. + uint64 public lastSyncedBlock; + + /// @notice The last L2 block's timestamp. + uint64 public parentTimestamp; + + /// @notice The last L2 block's gas target. + uint64 public parentGasTarget; + + /// @notice The L1's chain ID. + uint64 public l1ChainId; + + uint256[46] private __gap; + + /// @notice Emitted when the latest L1 block details are anchored to L2. + /// @param parentHash The hash of the parent block. + /// @param parentGasExcess The gas excess value used to calculate the base fee. + event Anchored(bytes32 parentHash, uint64 parentGasExcess); + + /// @notice Emitted when the gas target has been updated. + /// @param oldGasTarget The previous gas target. + /// @param newGasTarget The new gas target. + /// @param oldGasExcess The previous gas excess. + /// @param newGasExcess The new gas excess. + /// @param basefee The base fee in this block. + event EIP1559Update( + uint64 oldGasTarget, + uint64 newGasTarget, + uint64 oldGasExcess, + uint64 newGasExcess, + uint256 basefee + ); + + error L2_BASEFEE_MISMATCH(); + error L2_FORK_ERROR(); + error L2_INVALID_L1_CHAIN_ID(); + error L2_INVALID_L2_CHAIN_ID(); + error L2_INVALID_PARAM(); + error L2_INVALID_SENDER(); + error L2_PUBLIC_INPUT_HASH_MISMATCH(); + error L2_TOO_LATE(); + + modifier onlyGoldenTouch() { + require(msg.sender == GOLDEN_TOUCH_ADDRESS, L2_INVALID_SENDER()); + _; + } + + /// @notice Initializes the contract. + /// @param _owner The owner of this contract. msg.sender will be used if this value is zero. + /// @param _rollupAddressManager The address of the {AddressManager} contract. + /// @param _l1ChainId The ID of the base layer. + /// @param _initialGasExcess The initial parentGasExcess. + function init( + address _owner, + address _rollupAddressManager, + uint64 _l1ChainId, + uint64 _initialGasExcess + ) + external + initializer + { + __Essential_init(_owner, _rollupAddressManager); + + require(_l1ChainId != 0, L2_INVALID_L1_CHAIN_ID()); + require(_l1ChainId != block.chainid, L2_INVALID_L1_CHAIN_ID()); + require(block.chainid > 1, L2_INVALID_L2_CHAIN_ID()); + require(block.chainid <= type(uint64).max, L2_INVALID_L2_CHAIN_ID()); + + if (block.number == 0) { + // This is the case in real L2 genesis + } else if (block.number == 1) { + // This is the case in tests + uint256 parentHeight = block.number - 1; + _blockhashes[parentHeight] = blockhash(parentHeight); + } else { + revert L2_TOO_LATE(); + } + + l1ChainId = _l1ChainId; + parentGasExcess = _initialGasExcess; + (publicInputHash,) = _calcPublicInputHash(block.number); + } + + /// @notice Anchors the latest L1 block details to L2 for cross-layer + /// message verification. + /// @dev This function can be called freely as the golden touch private key is publicly known, + /// but the Taiko node guarantees the first transaction of each block is always this anchor + /// transaction, and any subsequent calls will revert with L2_PUBLIC_INPUT_HASH_MISMATCH. + /// @param _anchorBlockId The `anchorBlockId` value in this block's metadata. + /// @param _anchorStateRoot The state root for the L1 block with id equals `_anchorBlockId`. + /// @param _parentGasUsed The gas used in the parent block. + /// @param _baseFeeConfig The base fee configuration. + function anchorV2( + uint64 _anchorBlockId, + bytes32 _anchorStateRoot, + uint32 _parentGasUsed, + LibSharedData.BaseFeeConfig calldata _baseFeeConfig + ) + external + nonZeroBytes32(_anchorStateRoot) + nonZeroValue(_anchorBlockId) + nonZeroValue(_baseFeeConfig.gasIssuancePerSecond) + nonZeroValue(_baseFeeConfig.adjustmentQuotient) + onlyGoldenTouch + nonReentrant + { + require(block.number >= ontakeForkHeight(), L2_FORK_ERROR()); + + uint256 parentId = block.number - 1; + _verifyAndUpdatePublicInputHash(parentId); + _verifyBaseFeeAndUpdateGasExcess(_parentGasUsed, _baseFeeConfig); + _syncChainData(_anchorBlockId, _anchorStateRoot); + _updateParentHashAndTimestamp(parentId); + } + + /// @notice Withdraw token or Ether from this address. + /// Note: This contract receives a portion of L2 base fees, while the remainder is directed to + /// L2 block's coinbase address. + /// @param _token Token address or address(0) if Ether. + /// @param _to Withdraw to address. + function withdraw( + address _token, + address _to + ) + external + nonZeroAddr(_to) + whenNotPaused + onlyFromOwnerOrNamed(LibStrings.B_WITHDRAWER) + nonReentrant + { + if (_token == address(0)) { + _to.sendEtherAndVerify(address(this).balance); + } else { + IERC20(_token).safeTransfer(_to, IERC20(_token).balanceOf(address(this))); + } + } + + /// @notice Calculates the base fee and gas excess using EIP-1559 configuration for the given + /// parameters. + /// @param _parentGasUsed Gas used in the parent block. + /// @param _baseFeeConfig Configuration parameters for base fee calculation. + /// @return basefee_ The calculated EIP-1559 base fee per gas. + /// @return newGasTarget_ The new gas target value. + /// @return newGasExcess_ The new gas excess value. + function getBasefeeV2( + uint32 _parentGasUsed, + uint64 _blockTimestamp, + LibSharedData.BaseFeeConfig calldata _baseFeeConfig + ) + public + view + returns (uint256 basefee_, uint64 newGasTarget_, uint64 newGasExcess_) + { + // uint32 * uint8 will never overflow + uint64 newGasTarget = + uint64(_baseFeeConfig.gasIssuancePerSecond) * _baseFeeConfig.adjustmentQuotient; + + (newGasTarget_, newGasExcess_) = + LibEIP1559.adjustExcess(parentGasTarget, newGasTarget, parentGasExcess); + + uint64 gasIssuance = + (_blockTimestamp - parentTimestamp) * _baseFeeConfig.gasIssuancePerSecond; + + if ( + _baseFeeConfig.maxGasIssuancePerBlock != 0 + && gasIssuance > _baseFeeConfig.maxGasIssuancePerBlock + ) { + gasIssuance = _baseFeeConfig.maxGasIssuancePerBlock; + } + + (basefee_, newGasExcess_) = LibEIP1559.calc1559BaseFee( + newGasTarget_, newGasExcess_, gasIssuance, _parentGasUsed, _baseFeeConfig.minGasExcess + ); + } + + /// @inheritdoc IBlockHash + function getBlockHash(uint256 _blockId) public view returns (bytes32) { + if (_blockId >= block.number) return 0; + if (_blockId + 256 >= block.number) return blockhash(_blockId); + return _blockhashes[_blockId]; + } + + /// @notice Tells if we need to validate basefee (for simulation). + /// @return Returns true to skip checking basefee mismatch. + function skipFeeCheck() public pure virtual returns (bool) { + return false; + } + + /// @notice Returns the Ontake fork height. + /// @return The Ontake fork height. + function ontakeForkHeight() public pure virtual returns (uint64) { + return 0; + } + + /// @dev Synchronizes chain data with the given anchor block ID and state root. + /// @param _anchorBlockId The ID of the anchor block. + /// @param _anchorStateRoot The state root of the anchor block. + function _syncChainData(uint64 _anchorBlockId, bytes32 _anchorStateRoot) private { + /// @dev If the anchor block ID is less than or equal to the last synced block, return + /// early. + if (_anchorBlockId <= lastSyncedBlock) return; + + /// @dev Store the L1's state root as a signal to the local signal service to + /// allow for multi-hop bridging. + ISignalService(resolve(LibStrings.B_SIGNAL_SERVICE, false)).syncChainData( + l1ChainId, LibStrings.H_STATE_ROOT, _anchorBlockId, _anchorStateRoot + ); + + /// @dev Update the last synced block to the current anchor block ID. + lastSyncedBlock = _anchorBlockId; + } + + /// @dev Updates the parent block hash and timestamp. + /// @param _parentId The ID of the parent block. + function _updateParentHashAndTimestamp(uint256 _parentId) private { + // Get the block hash of the parent block. + bytes32 parentHash = blockhash(_parentId); + + // Store the parent block hash in the _blockhashes mapping. + _blockhashes[_parentId] = parentHash; + + // Update the parent timestamp to the current block timestamp. + parentTimestamp = uint64(block.timestamp); + + // Emit an event to signal that the parent hash and gas excess have been anchored. + emit Anchored(parentHash, parentGasExcess); + } + + /// @dev Verifies the current ancestor block hash and updates it with a new aggregated hash. + /// @param _parentId The ID of the parent block. + function _verifyAndUpdatePublicInputHash(uint256 _parentId) private { + // Calculate the current and new ancestor hashes based on the parent block ID. + (bytes32 currPublicInputHash_, bytes32 newPublicInputHash_) = + _calcPublicInputHash(_parentId); + + // Ensure the current ancestor block hash matches the expected value. + require(publicInputHash == currPublicInputHash_, L2_PUBLIC_INPUT_HASH_MISMATCH()); + + // Update the ancestor block hash to the new calculated value. + publicInputHash = newPublicInputHash_; + } + + /// @dev Verifies that the base fee per gas is correct and updates the gas excess. + /// @param _parentGasUsed The gas used by the parent block. + /// @param _baseFeeConfig The configuration parameters for calculating the base fee. + function _verifyBaseFeeAndUpdateGasExcess( + uint32 _parentGasUsed, + LibSharedData.BaseFeeConfig calldata _baseFeeConfig + ) + private + { + (uint256 basefee, uint64 newGasTarget, uint64 newGasExcess) = + getBasefeeV2(_parentGasUsed, uint64(block.timestamp), _baseFeeConfig); + + require(block.basefee == basefee || skipFeeCheck(), L2_BASEFEE_MISMATCH()); + + emit EIP1559Update(parentGasTarget, newGasTarget, parentGasExcess, newGasExcess, basefee); + + parentGasTarget = newGasTarget; + parentGasExcess = newGasExcess; + } + + /// @dev Calculates the aggregated ancestor block hash for the given block ID. + /// @dev This function computes two public input hashes: one for the previous state and one for + /// the new state. + /// It uses a ring buffer to store the previous 255 block hashes and the current chain ID. + /// @param _blockId The ID of the block for which the public input hash is calculated. + /// @return currPublicInputHash_ The public input hash for the previous state. + /// @return newPublicInputHash_ The public input hash for the new state. + function _calcPublicInputHash(uint256 _blockId) + private + view + returns (bytes32 currPublicInputHash_, bytes32 newPublicInputHash_) + { + bytes32[256] memory inputs; + + // Unchecked is safe because it cannot overflow. + unchecked { + // Put the previous 255 blockhashes (excluding the parent's) into a + // ring buffer. + for (uint256 i; i < 255 && _blockId >= i + 1; ++i) { + uint256 j = _blockId - i - 1; + inputs[j % 255] = blockhash(j); + } + } + + inputs[255] = bytes32(block.chainid); + + assembly { + currPublicInputHash_ := keccak256(inputs, 8192 /*mul(256, 32)*/ ) + } + + inputs[_blockId % 255] = blockhash(_blockId); + assembly { + newPublicInputHash_ := keccak256(inputs, 8192 /*mul(256, 32)*/ ) + } + } +} diff --git a/packages/protocol/contracts/layer2/based/TaikoL2Deprecated.sol b/packages/protocol/contracts/layer2/based/TaikoL2Deprecated.sol new file mode 100644 index 00000000000..0cf9ea1dffc --- /dev/null +++ b/packages/protocol/contracts/layer2/based/TaikoL2Deprecated.sol @@ -0,0 +1,60 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "src/shared/data/LibSharedData.sol"; + +/// @title TaikoL2Deprecated +/// @notice This contract includes deprecated functions whose ABI are still used by client for old +/// blocks. +/// @custom:security-contact security@taiko.xyz +abstract contract TaikoL2Deprecated { + error L2_DEPRECATED_METHOD(); + + modifier deprecated() { + revert L2_DEPRECATED_METHOD(); + _; + } + + function anchor( + bytes32 _l1BlockHash, + bytes32 _l1StateRoot, + uint64 _l1BlockId, + uint32 _parentGasUsed + ) + external + deprecated + { } + + function getBasefee( + uint64 _anchorBlockId, + uint32 _parentGasUsed + ) + public + pure + deprecated + returns (uint256 basefee_, uint64 parentGasExcess_) + { } + + function adjustExcess( + uint64 _currGasExcess, + uint64 _currGasTarget, + uint64 _newGasTarget + ) + public + pure + deprecated + returns (uint64 newGasExcess_) + { } + + function calculateBaseFee( + LibSharedData.BaseFeeConfig calldata _baseFeeConfig, + uint64 _blocktime, + uint64 _parentGasExcess, + uint32 _parentGasUsed + ) + public + pure + deprecated + returns (uint256 basefee_, uint64 parentGasExcess_) + { } +} diff --git a/packages/protocol/contracts/layer2/devnet/DevnetTaikoL2.sol b/packages/protocol/contracts/layer2/devnet/DevnetTaikoL2.sol new file mode 100644 index 00000000000..129438bc756 --- /dev/null +++ b/packages/protocol/contracts/layer2/devnet/DevnetTaikoL2.sol @@ -0,0 +1,12 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "../based/TaikoL2.sol"; + +/// @title DevnetTaikoL2 +/// @custom:security-contact security@taiko.xyz +contract DevnetTaikoL2 is TaikoL2 { + function ontakeForkHeight() public pure override returns (uint64) { + return 0; + } +} diff --git a/packages/protocol/contracts/layer2/hekla/HeklaTaikoL2.sol b/packages/protocol/contracts/layer2/hekla/HeklaTaikoL2.sol new file mode 100644 index 00000000000..f1af6519eb4 --- /dev/null +++ b/packages/protocol/contracts/layer2/hekla/HeklaTaikoL2.sol @@ -0,0 +1,12 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "../based/TaikoL2.sol"; + +/// @title HeklaTaikoL2 +/// @custom:security-contact security@taiko.xyz +contract HeklaTaikoL2 is TaikoL2 { + function ontakeForkHeight() public pure override returns (uint64) { + return 840_512; + } +} diff --git a/packages/protocol/contracts/layer2/mainnet/MainnetTaikoL2.sol b/packages/protocol/contracts/layer2/mainnet/MainnetTaikoL2.sol new file mode 100644 index 00000000000..956c193fdab --- /dev/null +++ b/packages/protocol/contracts/layer2/mainnet/MainnetTaikoL2.sol @@ -0,0 +1,12 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "../based/TaikoL2.sol"; + +/// @title MainnetTaikoL2 +/// @custom:security-contact security@taiko.xyz +contract MainnetTaikoL2 is TaikoL2 { + function ontakeForkHeight() public pure override returns (uint64) { + return 538_304; + } +} diff --git a/packages/protocol/contracts/tko/BridgedTaikoToken.sol b/packages/protocol/contracts/layer2/token/BridgedTaikoToken.sol similarity index 79% rename from packages/protocol/contracts/tko/BridgedTaikoToken.sol rename to packages/protocol/contracts/layer2/token/BridgedTaikoToken.sol index c847dda6665..0fa1d8a7d23 100644 --- a/packages/protocol/contracts/tko/BridgedTaikoToken.sol +++ b/packages/protocol/contracts/layer2/token/BridgedTaikoToken.sol @@ -1,8 +1,8 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; -import "../tokenvault/IBridgedERC20.sol"; -import "./TaikoTokenBase.sol"; +import "src/shared/tokenvault/IBridgedERC20.sol"; +import "src/shared/token/TaikoTokenBase.sol"; /// @title BridgedTaikoToken /// @notice The TaikoToken on L2 to support checkpoints and voting. For testnets, we do not need to @@ -11,10 +11,10 @@ import "./TaikoTokenBase.sol"; contract BridgedTaikoToken is TaikoTokenBase, IBridgedERC20 { /// @notice Initializes the contract. /// @param _owner The owner of this contract. msg.sender will be used if this value is zero. - /// @param _addressManager The address manager address. - function init(address _owner, address _addressManager) external initializer { - __Essential_init(_owner, _addressManager); - __ERC20_init("Taiko Token", "TKO"); + /// @param _sharedAddressManager The address manager address. + function init(address _owner, address _sharedAddressManager) external initializer { + __Essential_init(_owner, _sharedAddressManager); + __ERC20_init("Taiko Token", "TAIKO"); __ERC20Votes_init(); __ERC20Permit_init("Taiko Token"); } diff --git a/packages/protocol/contracts/mainnet/L1RollupAddressManager.sol b/packages/protocol/contracts/mainnet/L1RollupAddressManager.sol deleted file mode 100644 index b6ad942929f..00000000000 --- a/packages/protocol/contracts/mainnet/L1RollupAddressManager.sol +++ /dev/null @@ -1,57 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.24; - -import "../common/AddressManager.sol"; -import "../common/LibStrings.sol"; - -/// @title L1RollupAddressManager -/// @notice See the documentation in {IAddressManager}. -/// @dev This contract shall NOT be used to upgrade existing implementation unless the name-address -/// registration becomes stable in 0x579f40D0BE111b823962043702cabe6Aaa290780. -/// @custom:security-contact security@taiko.xyz -contract L1RollupAddressManager is AddressManager { - /// @notice Gets the address mapped to a specific chainId-name pair. - /// @dev Sub-contracts can override this method to avoid reading from storage. - /// Some names are not cached as they are not used frequently or - /// its address is likely to change. - function _getOverride( - uint64 _chainId, - bytes32 _name - ) - internal - pure - override - returns (address addr_) - { - if (_chainId == 1) { - if (_name == LibStrings.B_TAIKO_TOKEN) { - return 0x10dea67478c5F8C5E2D90e5E9B26dBe60c54d800; - } - if (_name == LibStrings.B_SIGNAL_SERVICE) { - return 0x9e0a24964e5397B566c1ed39258e21aB5E35C77C; - } - if (_name == LibStrings.B_BRIDGE) { - return 0xd60247c6848B7Ca29eDdF63AA924E53dB6Ddd8EC; - } - if (_name == LibStrings.B_TAIKO) { - return 0x06a9Ab27c7e2255df1815E6CC0168d7755Feb19a; - } - if (_name == LibStrings.B_TIER_SGX) { - return 0xb0f3186FC1963f774f52ff455DC86aEdD0b31F81; - } - if (_name == LibStrings.B_TIER_GUARDIAN_MINORITY) { - return 0x579A8d63a2Db646284CBFE31FE5082c9989E985c; - } - if (_name == LibStrings.B_TIER_GUARDIAN) { - return 0xE3D777143Ea25A6E031d1e921F396750885f43aC; - } - if (_name == LibStrings.B_AUTOMATA_DCAP_ATTESTATION) { - return 0x8d7C954960a36a7596d7eA4945dDf891967ca8A3; - } - if (_name == LibStrings.B_TIER_ROUTER) { - return 0xa8e5D3a2E2052bea7f10bE6a0386454b721d1f9F; - } - } - return address(0); - } -} diff --git a/packages/protocol/contracts/mainnet/L1SharedAddressManager.sol b/packages/protocol/contracts/mainnet/L1SharedAddressManager.sol deleted file mode 100644 index 32677bafa95..00000000000 --- a/packages/protocol/contracts/mainnet/L1SharedAddressManager.sol +++ /dev/null @@ -1,68 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.24; - -import "../common/AddressManager.sol"; -import "../common/LibStrings.sol"; - -/// @title L1SharedAddressManager -/// @notice See the documentation in {IAddressManager}. -/// @dev This contract shall NOT be used to upgrade existing implementation unless the name-address -/// registration becomes stable in 0xEf9EaA1dd30a9AA1df01c36411b5F082aA65fBaa. -/// @custom:security-contact security@taiko.xyz -contract L1SharedAddressManager is AddressManager { - /// @notice Gets the address mapped to a specific chainId-name pair. - /// @dev Sub-contracts can override this method to avoid reading from storage. - /// Some names are not cached as they are not used frequently or - /// its address is likely to change. - function _getOverride( - uint64 _chainId, - bytes32 _name - ) - internal - pure - override - returns (address addr_) - { - if (_chainId == 1) { - if (_name == LibStrings.B_TAIKO_TOKEN) { - return 0x10dea67478c5F8C5E2D90e5E9B26dBe60c54d800; - } - if (_name == LibStrings.B_SIGNAL_SERVICE) { - return 0x9e0a24964e5397B566c1ed39258e21aB5E35C77C; - } - if (_name == LibStrings.B_BRIDGE) { - return 0xd60247c6848B7Ca29eDdF63AA924E53dB6Ddd8EC; - } - if (_name == LibStrings.B_ERC20_VAULT) { - return 0x996282cA11E5DEb6B5D122CC3B9A1FcAAD4415Ab; - } - if (_name == LibStrings.B_ERC721_VAULT) { - return 0x0b470dd3A0e1C41228856Fb319649E7c08f419Aa; - } - if (_name == LibStrings.B_ERC1155_VAULT) { - return 0xaf145913EA4a56BE22E120ED9C24589659881702; - } - if (_name == LibStrings.B_QUOTA_MANAGER) { - return 0x91f67118DD47d502B1f0C354D0611997B022f29E; - } - } else if (_chainId == 167_000) { - if (_name == LibStrings.B_BRIDGE) { - return 0x1670000000000000000000000000000000000001; - } - if (_name == LibStrings.B_ERC20_VAULT) { - return 0x1670000000000000000000000000000000000002; - } - if (_name == LibStrings.B_ERC721_VAULT) { - return 0x1670000000000000000000000000000000000003; - } - if (_name == LibStrings.B_ERC1155_VAULT) { - return 0x1670000000000000000000000000000000000004; - } - if (_name == LibStrings.B_SIGNAL_SERVICE) { - return 0x1670000000000000000000000000000000000005; - } - } - - return address(0); - } -} diff --git a/packages/protocol/contracts/bridge/Bridge.sol b/packages/protocol/contracts/shared/bridge/Bridge.sol similarity index 80% rename from packages/protocol/contracts/bridge/Bridge.sol rename to packages/protocol/contracts/shared/bridge/Bridge.sol index d5f6abb2a0f..eb18c5ef7a6 100644 --- a/packages/protocol/contracts/bridge/Bridge.sol +++ b/packages/protocol/contracts/shared/bridge/Bridge.sol @@ -1,11 +1,12 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20VotesUpgradeable.sol"; import "../common/EssentialContract.sol"; import "../common/LibStrings.sol"; -import "../libs/LibAddress.sol"; -import "../libs/LibMath.sol"; +import "../common/LibAddress.sol"; +import "../common/LibMath.sol"; +import "../common/LibNetwork.sol"; import "../signal/ISignalService.sol"; import "./IBridge.sol"; import "./IQuotaManager.sol"; @@ -43,17 +44,9 @@ contract Bridge is EssentialContract, IBridge { ///@dev The max proof size for a message to be processable by a relayer. uint256 public constant RELAYER_MAX_PROOF_BYTES = 200_000; - ///@dev The 32bytes padded 11 fields in Message struct (11 * 32) - uint256 public constant CALLDATA_MESSAGE_SIZE_BYTES = 352; - /// @dev The amount of gas not to charge fee per cache operation. uint256 private constant _GAS_REFUND_PER_CACHE_OPERATION = 20_000; - /// @dev The slot in transient storage of the call context. This is the keccak256 hash - /// of "bridge.ctx_slot" - bytes32 private constant _CTX_SLOT = - 0xe4ece82196de19aabe639620d7f716c433d1348f96ce727c9989a982dbadc2b9; - /// @dev Gas limit for sending Ether. // - EOA gas used is < 21000 // - For Loopring smart wallet, gas used is about 23000 @@ -110,11 +103,12 @@ contract Bridge is EssentialContract, IBridge { /// @notice Initializes the contract. /// @param _owner The owner of this contract. msg.sender will be used if this value is zero. - /// @param _addressManager The address of the {AddressManager} contract. - function init(address _owner, address _addressManager) external initializer { - __Essential_init(_owner, _addressManager); + /// @param _sharedAddressManager The address of the {AddressManager} contract. + function init(address _owner, address _sharedAddressManager) external initializer { + __Essential_init(_owner, _sharedAddressManager); } + /// @notice This function shall be called by previously deployed contracts. function init2() external onlyOwner reinitializer(2) { // reset some previously used slots for future reuse __reserved1 = 0; @@ -206,7 +200,9 @@ contract Bridge is EssentialContract, IBridge { ); // Must reset the context after the message call - _resetContext(); + _storeContext( + bytes32(_PLACEHOLDER), address(uint160(_PLACEHOLDER)), uint64(_PLACEHOLDER) + ); } else { _message.srcOwner.sendEtherAndVerify(_message.value, _SEND_ETHER_GAS_LIMIT); } @@ -292,10 +288,10 @@ contract Bridge is EssentialContract, IBridge { // Taking into account the encoded message calldata cost, and can count with 16 // gas per bytes (vs. checking each and every byte if zero or non-zero) stats.gasUsedInFeeCalc = uint32( - GAS_OVERHEAD + gasStart - + (uint32(_message.data.length + CALLDATA_MESSAGE_SIZE_BYTES) << 4) + GAS_OVERHEAD + gasStart + _messageCalldataCost(_message.data.length) - gasleft() ); + uint256 gasCharged = refund.max(stats.gasUsedInFeeCalc) - refund; uint256 maxFee = gasCharged * _message.fee / _message.gasLimit; uint256 baseFee = gasCharged * block.basefee; @@ -334,17 +330,12 @@ contract Bridge is EssentialContract, IBridge { if (_unableToInvokeMessageCall(_message, resolve(LibStrings.B_SIGNAL_SERVICE, false))) { succeeded = _message.destOwner.sendEther(_message.value, _SEND_ETHER_GAS_LIMIT, ""); } else { - uint256 invocationGasLimit; - if (msg.sender != _message.destOwner) { - if (_message.gasLimit == 0 || _isLastAttempt) revert B_PERMISSION_DENIED(); - invocationGasLimit = _invocationGasLimit(_message); - } else { - // The owner uses all gas left in message invocation - invocationGasLimit = gasleft(); + if ((_message.gasLimit == 0 || _isLastAttempt) && msg.sender != _message.destOwner) { + revert B_PERMISSION_DENIED(); } // Attempt to invoke the messageCall. - succeeded = _invokeMessageCall(_message, msgHash, invocationGasLimit, false); + succeeded = _invokeMessageCall(_message, msgHash, gasleft(), false); } if (succeeded) { @@ -471,25 +462,14 @@ contract Bridge is EssentialContract, IBridge { /// @param dataLength The length of message.data. /// @return The minimal gas limit required for sending this message. function getMessageMinGasLimit(uint256 dataLength) public pure returns (uint32) { - unchecked { - // The abi encoding of A = (Message calldata msg) is 10 * 32 bytes - // + 32 bytes (A is a dynamic tuple, offset to first elements) - // + 32 bytes (offset to last bytes element of Message) - // + 32 bytes (padded encoding of length of Message.data + dataLength (padded to 32 - // bytes) - // = 13 * 32 + (dataLength / 32 * 32) + 32. - // non-zero calldata cost per byte is 16. - - uint256 dataCost = (dataLength / 32 * 32 + 448) << 4; - return SafeCastUpgradeable.toUint32(dataCost + GAS_RESERVE); - } + return _messageCalldataCost(dataLength) + GAS_RESERVE; } /// @notice Checks if the given address can pause and/or unpause the bridge. /// @dev Considering that the watchdog is a hot wallet, in case its private key is leaked, we /// only allow watchdog to pause the bridge, but does not allow it to unpause the bridge. function _authorizePause(address addr, bool toPause) internal view override { - // Owner and chain_pauser can pause/unpause the bridge. + // Owner and chain watchdog can pause/unpause the bridge. if (addr == owner() || addr == resolve(LibStrings.B_CHAIN_WATCHDOG, true)) return; // bridge_watchdog can pause the bridge, but cannot unpause it. @@ -501,7 +481,8 @@ contract Bridge is EssentialContract, IBridge { /// @notice Invokes a call message on the Bridge. /// @param _message The call message to be invoked. /// @param _msgHash The hash of the message. - /// @param _checkGasleft True to check gasleft is sufficient for target function invocation. + /// @param _shouldCheckForwardedGas True to check gasleft is sufficient for target function + /// invocation. /// @return success_ A boolean value indicating whether the message call was successful. /// @dev This function updates the context in the state before and after the /// message call. @@ -509,21 +490,33 @@ contract Bridge is EssentialContract, IBridge { Message calldata _message, bytes32 _msgHash, uint256 _gasLimit, - bool _checkGasleft + bool _shouldCheckForwardedGas ) private returns (bool success_) { assert(_message.from != address(this)); + if (_message.value == 0 && _message.data.length == 0) return true; + if (_gasLimit == 0) return false; _storeContext(_msgHash, _message.from, _message.srcChainId); - if (_checkGasleft && _hasInsufficientGas(_gasLimit, _message.data.length)) { - revert B_INSUFFICIENT_GAS(); + + address to = _message.to; + uint256 value = _message.value; + bytes memory data = _message.data; + uint256 gasLeft; + + assembly { + success_ := call(_gasLimit, to, value, add(data, 0x20), mload(data), 0, 0) + gasLeft := gas() } - success_ = _message.to.sendEther(_message.value, _gasLimit, _message.data); - _resetContext(); + + if (_shouldCheckForwardedGas) { + _checkForwardedGas(gasLeft, _gasLimit); + } + _storeContext(bytes32(_PLACEHOLDER), address(uint160(_PLACEHOLDER)), uint64(_PLACEHOLDER)); } /// @notice Updates the status of a bridge message. @@ -537,31 +530,12 @@ contract Bridge is EssentialContract, IBridge { emit MessageStatusChanged(_msgHash, _status); } - /// @notice Resets the call context - function _resetContext() private { - if (LibNetwork.isDencunSupported(block.chainid)) { - _storeContext(bytes32(0), address(0), uint64(0)); - } else { - _storeContext( - bytes32(_PLACEHOLDER), address(uint160(_PLACEHOLDER)), uint64(_PLACEHOLDER) - ); - } - } - /// @notice Stores the call context /// @param _msgHash The message hash. /// @param _from The sender's address. /// @param _srcChainId The source chain ID. - function _storeContext(bytes32 _msgHash, address _from, uint64 _srcChainId) private { - if (LibNetwork.isDencunSupported(block.chainid)) { - assembly { - tstore(_CTX_SLOT, _msgHash) - tstore(add(_CTX_SLOT, 1), _from) - tstore(add(_CTX_SLOT, 2), _srcChainId) - } - } else { - __ctx = Context(_msgHash, _from, _srcChainId); - } + function _storeContext(bytes32 _msgHash, address _from, uint64 _srcChainId) internal virtual { + __ctx = Context(_msgHash, _from, _srcChainId); } /// @notice Checks if the signal was received and caches cross-chain data if requested. @@ -605,20 +579,8 @@ contract Bridge is EssentialContract, IBridge { /// @notice Loads and returns the call context. /// @return ctx_ The call context. - function _loadContext() private view returns (Context memory) { - if (LibNetwork.isDencunSupported(block.chainid)) { - bytes32 msgHash; - address from; - uint64 srcChainId; - assembly { - msgHash := tload(_CTX_SLOT) - from := tload(add(_CTX_SLOT, 1)) - srcChainId := tload(add(_CTX_SLOT, 2)) - } - return Context(msgHash, from, srcChainId); - } else { - return __ctx; - } + function _loadContext() internal view virtual returns (Context memory) { + return __ctx; } /// @notice Checks if the signal was received. @@ -647,29 +609,6 @@ contract Bridge is EssentialContract, IBridge { } } - ///@dev This implementation was suggested by OpenZeppelin in an audit to replace the previous. - function _hasInsufficientGas( - uint256 _minGas, - uint256 _dataLength - ) - private - view - returns (bool result_) - { - unchecked { - // https://github.com/ethereum/execution-specs/blob/master/src/ethereum/cancun/vm/gas.py#L128 - uint256 words = _dataLength / 32 + 1; - uint256 memoryGasCost = words * 3 + words * words / 512; - - // Need to add the gas cost of accessing the message.to account. This currently - // corresponds to 2600 gas if the account is cold, and 100 otherwise. - - // Also need to add the cost of transferring a nonzero msg.value. This cost is currently - // 9000, but provides a 2300 gas stipend to the called contract. - result_ = gasleft() * 63 < _minGas * 64 + (memoryGasCost + 9300) * 63; - } - } - function _checkStatus(bytes32 _msgHash, Status _expectedStatus) private view { if (messageStatus[_msgHash] != _expectedStatus) revert B_INVALID_STATUS(); } @@ -697,4 +636,73 @@ contract Bridge is EssentialContract, IBridge { return minGasRequired.max(_message.gasLimit) - minGasRequired; } } + + function _messageCalldataCost(uint256 dataLength) private pure returns (uint32) { + // The abi encoding of A = (Message calldata msg) is 10 * 32 bytes + // + 32 bytes (A is a dynamic tuple, offset to first elements) + // + 32 bytes (offset to last bytes element of Message) + // + 32 bytes (padded encoding of length of Message.data + dataLength + // (padded to 32 // bytes) = 13 * 32 + ((dataLength + 31) / 32 * 32). + // Non-zero calldata cost per byte is 16. + unchecked { + return uint32(((dataLength + 31) / 32 * 32 + 416) << 4); + } + } + + /// @dev Suggested by OpenZeppelin and copied from + /// https://github.com/OpenZeppelin/openzeppelin-contracts/ + /// blob/83c7e45092dac350b070c421cd2bf7105616cf1a/contracts/ + /// metatx/ERC2771Forwarder.sol#L327C1-L370C6 + /// + /// @dev Checks if the requested gas was correctly forwarded to the callee. + /// As a consequence of https://eips.ethereum.org/EIPS/eip-150[EIP-150]: + /// - At most `gasleft() - floor(gasleft() / 64)` is forwarded to the callee. + /// - At least `floor(gasleft() / 64)` is kept in the caller. + /// + /// It reverts consuming all the available gas if the forwarded gas is not the requested gas. + /// + /// IMPORTANT: The `gasLeft` parameter should be measured exactly at the end of the forwarded + /// call. + /// Any gas consumed in between will make room for bypassing this check. + function _checkForwardedGas(uint256 _gasLeft, uint256 _gasRequested) private pure { + // To avoid insufficient gas griefing attacks, as referenced in + // https://ronan.eth.limo/blog/ethereum-gas-dangers/ + // + // A malicious relayer can attempt to shrink the gas forwarded so that the underlying call + // reverts out-of-gas + // but the forwarding itself still succeeds. In order to make sure that the subcall received + // sufficient gas, + // we will inspect gasleft() after the forwarding. + // + // Let X be the gas available before the subcall, such that the subcall gets at most X * 63 + // / 64. + // We can't know X after CALL dynamic costs, but we want it to be such that X * 63 / 64 >= + // req.gas. + // Let Y be the gas used in the subcall. gasleft() measured immediately after the subcall + // will be gasleft() = X - Y. + // If the subcall ran out of gas, then Y = X * 63 / 64 and gasleft() = X - Y = X / 64. + // Under this assumption req.gas / 63 > gasleft() is true is true if and only if + // req.gas / 63 > X / 64, or equivalently req.gas > X * 63 / 64. + // This means that if the subcall runs out of gas we are able to detect that insufficient + // gas was passed. + // + // We will now also see that req.gas / 63 > gasleft() implies that req.gas >= X * 63 / 64. + // The contract guarantees Y <= req.gas, thus gasleft() = X - Y >= X - req.gas. + // - req.gas / 63 > gasleft() + // - req.gas / 63 >= X - req.gas + // - req.gas >= X * 63 / 64 + // In other words if req.gas < X * 63 / 64 then req.gas / 63 <= gasleft(), thus if the + // relayer behaves honestly + // the forwarding does not revert. + if (_gasLeft < _gasRequested / 63) { + // We explicitly trigger invalid opcode to consume all gas and bubble-up the effects, + // since + // neither revert or assert consume all gas since Solidity 0.8.20 + // https://docs.soliditylang.org/en/v0.8.20/control-structures.html#panic-via-assert-and-error-via-require + /// @solidity memory-safe-assembly + assembly { + invalid() + } + } + } } diff --git a/packages/protocol/contracts/bridge/IBridge.sol b/packages/protocol/contracts/shared/bridge/IBridge.sol similarity index 99% rename from packages/protocol/contracts/bridge/IBridge.sol rename to packages/protocol/contracts/shared/bridge/IBridge.sol index 99af78b249f..23e6eecee0f 100644 --- a/packages/protocol/contracts/bridge/IBridge.sol +++ b/packages/protocol/contracts/shared/bridge/IBridge.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; /// @title IBridge /// @notice The bridge used in conjunction with the {ISignalService}. diff --git a/packages/protocol/contracts/bridge/IQuotaManager.sol b/packages/protocol/contracts/shared/bridge/IQuotaManager.sol similarity index 97% rename from packages/protocol/contracts/bridge/IQuotaManager.sol rename to packages/protocol/contracts/shared/bridge/IQuotaManager.sol index 3091e019315..02b28292e7c 100644 --- a/packages/protocol/contracts/bridge/IQuotaManager.sol +++ b/packages/protocol/contracts/shared/bridge/IQuotaManager.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; /// @title IQuotaManager /// @custom:security-contact security@taiko.xyz diff --git a/packages/protocol/contracts/bridge/QuotaManager.sol b/packages/protocol/contracts/shared/bridge/QuotaManager.sol similarity index 93% rename from packages/protocol/contracts/bridge/QuotaManager.sol rename to packages/protocol/contracts/shared/bridge/QuotaManager.sol index b5bf55ecfd8..293eeb7ca8d 100644 --- a/packages/protocol/contracts/bridge/QuotaManager.sol +++ b/packages/protocol/contracts/shared/bridge/QuotaManager.sol @@ -1,9 +1,9 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import "../common/EssentialContract.sol"; import "../common/LibStrings.sol"; -import "../libs/LibMath.sol"; +import "../common/LibMath.sol"; import "./IQuotaManager.sol"; /// @title QuotaManager @@ -31,17 +31,17 @@ contract QuotaManager is EssentialContract, IQuotaManager { /// @notice Initializes the contract. /// @param _owner The owner of this contract. msg.sender will be used if this value is zero. - /// @param _addressManager The address of the {AddressManager} contract. + /// @param _sharedAddressManager The address of the {AddressManager} contract. /// @param _quotaPeriod The time required to restore all quota. function init( address _owner, - address _addressManager, + address _sharedAddressManager, uint24 _quotaPeriod ) external initializer { - __Essential_init(_owner, _addressManager); + __Essential_init(_owner, _sharedAddressManager); _setQuotaPeriod(_quotaPeriod); } diff --git a/packages/protocol/contracts/bridge/README.md b/packages/protocol/contracts/shared/bridge/README.md similarity index 100% rename from packages/protocol/contracts/bridge/README.md rename to packages/protocol/contracts/shared/bridge/README.md diff --git a/packages/protocol/contracts/common/AddressManager.sol b/packages/protocol/contracts/shared/common/AddressManager.sol similarity index 73% rename from packages/protocol/contracts/common/AddressManager.sol rename to packages/protocol/contracts/shared/common/AddressManager.sol index 91ab17e86da..ac0ab0ae7ea 100644 --- a/packages/protocol/contracts/common/AddressManager.sol +++ b/packages/protocol/contracts/shared/common/AddressManager.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import "./EssentialContract.sol"; @@ -24,12 +24,12 @@ contract AddressManager is EssentialContract, IAddressManager { error AM_ADDRESS_ALREADY_SET(); /// @notice Initializes the contract. - /// @param _owner The owner of this contract. msg.sender will be used if this value is zero. + /// @param _owner The owner of this contract. function init(address _owner) external initializer { - __Essential_init(_owner); - addressManager = address(this); + __Essential_init(_owner, address(this)); } + /// @notice This function shall be called by previously deployed contracts. function init2() external onlyOwner reinitializer(2) { addressManager = address(this); } @@ -48,21 +48,15 @@ contract AddressManager is EssentialContract, IAddressManager { onlyOwner { address oldAddress = __addresses[_chainId][_name]; - if (_newAddress == oldAddress) revert AM_ADDRESS_ALREADY_SET(); + require(_newAddress != oldAddress, AM_ADDRESS_ALREADY_SET()); __addresses[_chainId][_name] = _newAddress; emit AddressSet(_chainId, _name, _newAddress, oldAddress); } /// @inheritdoc IAddressManager function getAddress(uint64 _chainId, bytes32 _name) external view override returns (address) { - address addr = _getOverride(_chainId, _name); - if (addr != address(0)) return addr; - else return __addresses[_chainId][_name]; + return __addresses[_chainId][_name]; } - /// @notice Gets the address mapped to a specific chainId-name pair. - /// @dev Sub-contracts can override this method to avoid reading from storage. - function _getOverride(uint64 _chainId, bytes32 _name) internal pure virtual returns (address) { } - function _authorizePause(address, bool) internal pure override notImplemented { } } diff --git a/packages/protocol/contracts/common/AddressResolver.sol b/packages/protocol/contracts/shared/common/AddressResolver.sol similarity index 66% rename from packages/protocol/contracts/common/AddressResolver.sol rename to packages/protocol/contracts/shared/common/AddressResolver.sol index 27f88b2a221..ebfaec3a8be 100644 --- a/packages/protocol/contracts/common/AddressResolver.sol +++ b/packages/protocol/contracts/shared/common/AddressResolver.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; import "./IAddressManager.sol"; @@ -22,7 +22,16 @@ abstract contract AddressResolver is IAddressResolver, Initializable { /// name. /// @param _name The name to check against. modifier onlyFromNamed(bytes32 _name) { - if (msg.sender != resolve(_name, true)) revert RESOLVER_DENIED(); + require(msg.sender == resolve(_name, true), RESOLVER_DENIED()); + _; + } + + /// @dev Modifier that ensures the caller is the resolved address of a given + /// name, if the name is set. + /// @param _name The name to check against. + modifier onlyFromOptionalNamed(bytes32 _name) { + address addr = resolve(_name, true); + require(addr == address(0) || msg.sender == addr, RESOLVER_DENIED()); _; } @@ -31,9 +40,10 @@ abstract contract AddressResolver is IAddressResolver, Initializable { /// @param _name1 The first name to check against. /// @param _name2 The second name to check against. modifier onlyFromNamedEither(bytes32 _name1, bytes32 _name2) { - if (msg.sender != resolve(_name1, true) && msg.sender != resolve(_name2, true)) { - revert RESOLVER_DENIED(); - } + require( + msg.sender == resolve(_name1, true) || msg.sender == resolve(_name2, true), + RESOLVER_DENIED() + ); _; } @@ -43,15 +53,7 @@ abstract contract AddressResolver is IAddressResolver, Initializable { } /// @inheritdoc IAddressResolver - function resolve( - bytes32 _name, - bool _allowZeroAddress - ) - public - view - virtual - returns (address payable) - { + function resolve(bytes32 _name, bool _allowZeroAddress) public view virtual returns (address) { return _resolve(uint64(block.chainid), _name, _allowZeroAddress); } @@ -64,7 +66,7 @@ abstract contract AddressResolver is IAddressResolver, Initializable { public view virtual - returns (address payable) + returns (address) { return _resolve(_chainId, _name, _allowZeroAddress); } @@ -72,9 +74,8 @@ abstract contract AddressResolver is IAddressResolver, Initializable { /// @dev Initialization method for setting up AddressManager reference. /// @param _addressManager Address of the AddressManager. function __AddressResolver_init(address _addressManager) internal virtual onlyInitializing { - if (block.chainid > type(uint64).max) { - revert RESOLVER_UNEXPECTED_CHAINID(); - } + require(block.chainid <= type(uint64).max, RESOLVER_UNEXPECTED_CHAINID()); + addressManager = _addressManager; } @@ -90,17 +91,19 @@ abstract contract AddressResolver is IAddressResolver, Initializable { bytes32 _name, bool _allowZeroAddress ) - private + internal view - returns (address payable addr_) + returns (address addr_) { - address _addressManager = addressManager; - if (_addressManager == address(0)) revert RESOLVER_INVALID_MANAGER(); + addr_ = _getAddress(_chainId, _name); + + require(_allowZeroAddress || addr_ != address(0), RESOLVER_ZERO_ADDR(_chainId, _name)); + } - addr_ = payable(IAddressManager(_addressManager).getAddress(_chainId, _name)); + function _getAddress(uint64 _chainId, bytes32 _name) internal view virtual returns (address) { + address _addressManager = addressManager; + require(_addressManager != address(0), RESOLVER_INVALID_MANAGER()); - if (!_allowZeroAddress && addr_ == address(0)) { - revert RESOLVER_ZERO_ADDR(_chainId, _name); - } + return IAddressManager(_addressManager).getAddress(_chainId, _name); } } diff --git a/packages/protocol/contracts/common/EssentialContract.sol b/packages/protocol/contracts/shared/common/EssentialContract.sol similarity index 70% rename from packages/protocol/contracts/common/EssentialContract.sol rename to packages/protocol/contracts/shared/common/EssentialContract.sol index 3bb20817366..70320ea9623 100644 --- a/packages/protocol/contracts/common/EssentialContract.sol +++ b/packages/protocol/contracts/shared/common/EssentialContract.sol @@ -1,30 +1,20 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import "@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol"; import "@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol"; import "./AddressResolver.sol"; -import "../libs/LibNetwork.sol"; /// @title EssentialContract /// @custom:security-contact security@taiko.xyz abstract contract EssentialContract is UUPSUpgradeable, Ownable2StepUpgradeable, AddressResolver { - uint8 private constant _FALSE = 1; - - uint8 private constant _TRUE = 2; - - /// @dev The slot in transient storage of the reentry lock. - /// This is the result of keccak256("ownerUUPS.reentry_slot") plus 1. The addition aims to - /// prevent hash collisions with slots defined in EIP-1967, where slots are derived by - /// keccak256("something") - 1, and with slots in SignalService, calculated directly with - /// keccak256("something"). - bytes32 private constant _REENTRY_SLOT = - 0xa5054f728453d3dbe953bdc43e4d0cb97e662ea32d7958190f3dc2da31d9721b; + uint8 internal constant _FALSE = 1; + uint8 internal constant _TRUE = 2; /// @dev Slot 1. - uint8 private __reentry; - uint8 private __paused; - uint64 public lastUnpausedAt; + uint8 internal __reentry; + uint8 internal __paused; + uint64 internal __lastUnpausedAt; uint256[49] private __gap; @@ -45,7 +35,7 @@ abstract contract EssentialContract is UUPSUpgradeable, Ownable2StepUpgradeable, /// @dev Modifier that ensures the caller is the owner or resolved address of a given name. /// @param _name The name to check against. modifier onlyFromOwnerOrNamed(bytes32 _name) { - if (msg.sender != owner() && msg.sender != resolve(_name, true)) revert RESOLVER_DENIED(); + require(msg.sender == owner() || msg.sender == resolve(_name, true), RESOLVER_DENIED()); _; } @@ -55,29 +45,34 @@ abstract contract EssentialContract is UUPSUpgradeable, Ownable2StepUpgradeable, } modifier nonReentrant() { - if (_loadReentryLock() == _TRUE) revert REENTRANT_CALL(); + require(_loadReentryLock() != _TRUE, REENTRANT_CALL()); _storeReentryLock(_TRUE); _; _storeReentryLock(_FALSE); } modifier whenPaused() { - if (!paused()) revert INVALID_PAUSE_STATUS(); + require(paused(), INVALID_PAUSE_STATUS()); _; } modifier whenNotPaused() { - if (paused()) revert INVALID_PAUSE_STATUS(); + require(!paused(), INVALID_PAUSE_STATUS()); _; } modifier nonZeroAddr(address _addr) { - if (_addr == address(0)) revert ZERO_ADDRESS(); + require(_addr != address(0), ZERO_ADDRESS()); _; } - modifier nonZeroValue(bytes32 _value) { - if (_value == 0) revert ZERO_VALUE(); + modifier nonZeroValue(uint256 _value) { + require(_value != 0, ZERO_VALUE()); + _; + } + + modifier nonZeroBytes32(bytes32 _value) { + require(_value != 0, ZERO_VALUE()); _; } @@ -112,6 +107,10 @@ abstract contract EssentialContract is UUPSUpgradeable, Ownable2StepUpgradeable, return __paused == _TRUE; } + function lastUnpausedAt() public view virtual returns (uint64) { + return __lastUnpausedAt; + } + function inNonReentrant() public view returns (bool) { return _loadReentryLock() == _TRUE; } @@ -143,7 +142,7 @@ abstract contract EssentialContract is UUPSUpgradeable, Ownable2StepUpgradeable, function _unpause() internal whenPaused { __paused = _FALSE; - lastUnpausedAt = uint64(block.timestamp); + __lastUnpausedAt = uint64(block.timestamp); emit Unpaused(msg.sender); } @@ -153,23 +152,11 @@ abstract contract EssentialContract is UUPSUpgradeable, Ownable2StepUpgradeable, // Stores the reentry lock function _storeReentryLock(uint8 _reentry) internal virtual { - if (LibNetwork.isDencunSupported(block.chainid)) { - assembly { - tstore(_REENTRY_SLOT, _reentry) - } - } else { - __reentry = _reentry; - } + __reentry = _reentry; } // Loads the reentry lock function _loadReentryLock() internal view virtual returns (uint8 reentry_) { - if (LibNetwork.isDencunSupported(block.chainid)) { - assembly { - reentry_ := tload(_REENTRY_SLOT) - } - } else { - reentry_ = __reentry; - } + reentry_ = __reentry; } } diff --git a/packages/protocol/contracts/common/IAddressManager.sol b/packages/protocol/contracts/shared/common/IAddressManager.sol similarity index 96% rename from packages/protocol/contracts/common/IAddressManager.sol rename to packages/protocol/contracts/shared/common/IAddressManager.sol index f88933462fe..46ee1478156 100644 --- a/packages/protocol/contracts/common/IAddressManager.sol +++ b/packages/protocol/contracts/shared/common/IAddressManager.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; /// @title IAddressManager /// @notice Manages a mapping of (chainId, name) pairs to Ethereum addresses. diff --git a/packages/protocol/contracts/common/IAddressResolver.sol b/packages/protocol/contracts/shared/common/IAddressResolver.sol similarity index 87% rename from packages/protocol/contracts/common/IAddressResolver.sol rename to packages/protocol/contracts/shared/common/IAddressResolver.sol index 886e123e1ba..efeae4a73d6 100644 --- a/packages/protocol/contracts/common/IAddressResolver.sol +++ b/packages/protocol/contracts/shared/common/IAddressResolver.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; /// @title IAddressResolver /// @notice This contract acts as a bridge for name-to-address resolution. @@ -16,13 +16,7 @@ interface IAddressResolver { /// @param _allowZeroAddress If set to true, does not throw if the resolved /// address is `address(0)`. /// @return Address associated with the given name. - function resolve( - bytes32 _name, - bool _allowZeroAddress - ) - external - view - returns (address payable); + function resolve(bytes32 _name, bool _allowZeroAddress) external view returns (address); /// @notice Resolves a name to its address deployed on a specified chain. /// @param _chainId The chainId of interest. @@ -38,5 +32,5 @@ interface IAddressResolver { ) external view - returns (address payable); + returns (address); } diff --git a/packages/protocol/contracts/libs/LibAddress.sol b/packages/protocol/contracts/shared/common/LibAddress.sol similarity index 83% rename from packages/protocol/contracts/libs/LibAddress.sol rename to packages/protocol/contracts/shared/common/LibAddress.sol index bfac8da7266..5bc0cd324ae 100644 --- a/packages/protocol/contracts/libs/LibAddress.sol +++ b/packages/protocol/contracts/shared/common/LibAddress.sol @@ -1,9 +1,7 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; -import "@openzeppelin/contracts/utils/Address.sol"; import "@openzeppelin/contracts/utils/introspection/IERC165.sol"; -import "@openzeppelin/contracts/interfaces/IERC1271.sol"; /// @title LibAddress /// @dev Provides utilities for address-related operations. @@ -29,7 +27,7 @@ library LibAddress { returns (bool success_) { // Check for zero-address transactions - if (_to == address(0)) revert ETH_TRANSFER_FAILED(); + require(_to != address(0), ETH_TRANSFER_FAILED()); // dispatch message to recipient // by assembly calling "handle" function // we call via assembly to avoid memcopying a very large returndata @@ -54,9 +52,7 @@ library LibAddress { /// @param _gasLimit The max amount gas to pay for this transaction. function sendEtherAndVerify(address _to, uint256 _amount, uint256 _gasLimit) internal { if (_amount == 0) return; - if (!sendEther(_to, _amount, _gasLimit, "")) { - revert ETH_TRANSFER_FAILED(); - } + require(sendEther(_to, _amount, _gasLimit, ""), ETH_TRANSFER_FAILED()); } /// @dev Sends Ether to the specified address. This method will revert if sending ether fails. @@ -74,10 +70,10 @@ library LibAddress { view returns (bool result_) { - if (!Address.isContract(_addr)) return false; - - try IERC165(_addr).supportsInterface(_interfaceId) returns (bool _result) { - result_ = _result; - } catch { } + (bool success, bytes memory data) = + _addr.staticcall(abi.encodeCall(IERC165.supportsInterface, (_interfaceId))); + if (success && data.length == 32) { + result_ = abi.decode(data, (bool)); + } } } diff --git a/packages/protocol/contracts/libs/LibBytes.sol b/packages/protocol/contracts/shared/common/LibBytes.sol similarity index 94% rename from packages/protocol/contracts/libs/LibBytes.sol rename to packages/protocol/contracts/shared/common/LibBytes.sol index 3ddddcf2b6a..39c0bf442fb 100644 --- a/packages/protocol/contracts/libs/LibBytes.sol +++ b/packages/protocol/contracts/shared/common/LibBytes.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; library LibBytes { error INNER_ERROR(bytes innerError); @@ -34,7 +34,7 @@ library LibBytes { function revertWithExtractedError(bytes memory _returnData) internal pure { // If the _res length is less than 68, then // the transaction failed with custom error or silently (without a revert message) - if (_returnData.length < 68) revert INNER_ERROR(_returnData); + require(_returnData.length >= 68, INNER_ERROR(_returnData)); assembly { // Slice the sighash. diff --git a/packages/protocol/contracts/libs/LibMath.sol b/packages/protocol/contracts/shared/common/LibMath.sol similarity index 83% rename from packages/protocol/contracts/libs/LibMath.sol rename to packages/protocol/contracts/shared/common/LibMath.sol index cbdda81a3ff..14ae1a5e14d 100644 --- a/packages/protocol/contracts/libs/LibMath.sol +++ b/packages/protocol/contracts/shared/common/LibMath.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; /// @title LibMath /// @dev This library offers additional math functions for uint256. @@ -20,4 +20,8 @@ library LibMath { function max(uint256 _a, uint256 _b) internal pure returns (uint256) { return _a > _b ? _a : _b; } + + function capToUint64(uint256 _value) internal pure returns (uint64) { + return uint64(min(_value, type(uint64).max)); + } } diff --git a/packages/protocol/contracts/libs/LibNetwork.sol b/packages/protocol/contracts/shared/common/LibNetwork.sol similarity index 59% rename from packages/protocol/contracts/libs/LibNetwork.sol rename to packages/protocol/contracts/shared/common/LibNetwork.sol index b4c3f651ecc..2806b474a13 100644 --- a/packages/protocol/contracts/libs/LibNetwork.sol +++ b/packages/protocol/contracts/shared/common/LibNetwork.sol @@ -1,25 +1,26 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; /// @title LibNetwork library LibNetwork { - uint256 internal constant MAINNET = 1; - uint256 internal constant ROPSTEN = 2; - uint256 internal constant RINKEBY = 4; - uint256 internal constant GOERLI = 5; - uint256 internal constant KOVAN = 42; - uint256 internal constant HOLESKY = 17_000; - uint256 internal constant SEPOLIA = 11_155_111; + uint256 internal constant ETHEREUM_MAINNET = 1; + uint256 internal constant ETHEREUM_ROPSTEN = 2; + uint256 internal constant ETHEREUM_RINKEBY = 4; + uint256 internal constant ETHEREUM_GOERLI = 5; + uint256 internal constant ETHEREUM_KOVAN = 42; + uint256 internal constant ETHEREUM_HOLESKY = 17_000; + uint256 internal constant ETHEREUM_SEPOLIA = 11_155_111; - uint64 internal constant TAIKO = 167_000; + uint64 internal constant TAIKO_MAINNET = 167_000; + uint64 internal constant TAIKO_HEKLA = 167_009; /// @dev Checks if the chain ID represents an Ethereum testnet. /// @param _chainId The chain ID. /// @return true if the chain ID represents an Ethereum testnet, false otherwise. function isEthereumTestnet(uint256 _chainId) internal pure returns (bool) { - return _chainId == LibNetwork.ROPSTEN || _chainId == LibNetwork.RINKEBY - || _chainId == LibNetwork.GOERLI || _chainId == LibNetwork.KOVAN - || _chainId == LibNetwork.HOLESKY || _chainId == LibNetwork.SEPOLIA; + return _chainId == LibNetwork.ETHEREUM_ROPSTEN || _chainId == LibNetwork.ETHEREUM_RINKEBY + || _chainId == LibNetwork.ETHEREUM_GOERLI || _chainId == LibNetwork.ETHEREUM_KOVAN + || _chainId == LibNetwork.ETHEREUM_HOLESKY || _chainId == LibNetwork.ETHEREUM_SEPOLIA; } /// @dev Checks if the chain ID represents an Ethereum testnet or the Etheruem mainnet. @@ -27,14 +28,14 @@ library LibNetwork { /// @return true if the chain ID represents an Ethereum testnet or the Etheruem mainnet, false /// otherwise. function isEthereumMainnetOrTestnet(uint256 _chainId) internal pure returns (bool) { - return _chainId == LibNetwork.MAINNET || isEthereumTestnet(_chainId); + return _chainId == LibNetwork.ETHEREUM_MAINNET || isEthereumTestnet(_chainId); } /// @dev Checks if the chain ID represents the Taiko L2 mainnet. /// @param _chainId The chain ID. /// @return true if the chain ID represents the Taiko L2 mainnet. function isTaikoMainnet(uint256 _chainId) internal pure returns (bool) { - return _chainId == TAIKO; + return _chainId == TAIKO_MAINNET; } /// @dev Checks if the chain ID represents an internal Taiko devnet's base layer. @@ -50,7 +51,7 @@ library LibNetwork { /// @param _chainId The chain ID. /// @return true if the chain supports Dencun hardfork, false otherwise. function isDencunSupported(uint256 _chainId) internal pure returns (bool) { - return _chainId == LibNetwork.MAINNET || _chainId == LibNetwork.HOLESKY - || _chainId == LibNetwork.SEPOLIA || isTaikoDevnet(_chainId); + return _chainId == LibNetwork.ETHEREUM_MAINNET || _chainId == LibNetwork.ETHEREUM_HOLESKY + || _chainId == LibNetwork.ETHEREUM_SEPOLIA || isTaikoDevnet(_chainId); } } diff --git a/packages/protocol/contracts/common/LibStrings.sol b/packages/protocol/contracts/shared/common/LibStrings.sol similarity index 67% rename from packages/protocol/contracts/common/LibStrings.sol rename to packages/protocol/contracts/shared/common/LibStrings.sol index 3403c683a16..e744460adba 100644 --- a/packages/protocol/contracts/common/LibStrings.sol +++ b/packages/protocol/contracts/shared/common/LibStrings.sol @@ -1,10 +1,11 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; /// @title LibStrings /// @custom:security-contact security@taiko.xyz library LibStrings { bytes32 internal constant B_AUTOMATA_DCAP_ATTESTATION = bytes32("automata_dcap_attestation"); + bytes32 internal constant B_BOND_TOKEN = bytes32("bond_token"); bytes32 internal constant B_BRIDGE = bytes32("bridge"); bytes32 internal constant B_BRIDGE_WATCHDOG = bytes32("bridge_watchdog"); bytes32 internal constant B_BRIDGED_ERC1155 = bytes32("bridged_erc1155"); @@ -14,18 +15,28 @@ library LibStrings { bytes32 internal constant B_ERC1155_VAULT = bytes32("erc1155_vault"); bytes32 internal constant B_ERC20_VAULT = bytes32("erc20_vault"); bytes32 internal constant B_ERC721_VAULT = bytes32("erc721_vault"); + bytes32 internal constant B_PRECONF_TASK_MANAGER = bytes32("preconf_task_manager"); bytes32 internal constant B_PROVER_ASSIGNMENT = bytes32("PROVER_ASSIGNMENT"); bytes32 internal constant B_PROVER_SET = bytes32("prover_set"); bytes32 internal constant B_QUOTA_MANAGER = bytes32("quota_manager"); + bytes32 internal constant B_SEQUENCER_REGISTRY = bytes32("sequencer_registry"); bytes32 internal constant B_SGX_WATCHDOG = bytes32("sgx_watchdog"); bytes32 internal constant B_SIGNAL_SERVICE = bytes32("signal_service"); + bytes32 internal constant B_SP1_REMOTE_VERIFIER = bytes32("sp1_remote_verifier"); bytes32 internal constant B_TAIKO = bytes32("taiko"); bytes32 internal constant B_TAIKO_TOKEN = bytes32("taiko_token"); bytes32 internal constant B_TIER_GUARDIAN = bytes32("tier_guardian"); bytes32 internal constant B_TIER_GUARDIAN_MINORITY = bytes32("tier_guardian_minority"); + bytes32 internal constant B_TIER_OPTIMISTIC = bytes32(""); bytes32 internal constant B_TIER_ROUTER = bytes32("tier_router"); bytes32 internal constant B_TIER_SGX = bytes32("tier_sgx"); - bytes32 internal constant B_TIER_SGX_ZKVM = bytes32("tier_sgx_zkvm"); + bytes32 internal constant B_TIER_TDX = bytes32("tier_tdx"); + bytes32 internal constant B_TIER_TEE_ANY = bytes32("tier_tee_any"); + bytes32 internal constant B_TIER_ZKVM_RISC0 = bytes32("tier_zkvm_risc0"); + bytes32 internal constant B_TIER_ZKVM_SP1 = bytes32("tier_zkvm_sp1"); + bytes32 internal constant B_TIER_ZKVM_ANY = bytes32("tier_zkvm_any"); + bytes32 internal constant B_TIER_ZKVM_AND_TEE = bytes32("tier_zkvm_and_tee"); + bytes32 internal constant B_RISCZERO_GROTH16_VERIFIER = bytes32("risc0_groth16_verifier"); bytes32 internal constant B_WITHDRAWER = bytes32("withdrawer"); bytes32 internal constant H_RETURN_LIVENESS_BOND = keccak256("RETURN_LIVENESS_BOND"); bytes32 internal constant H_SIGNAL_ROOT = keccak256("SIGNAL_ROOT"); diff --git a/packages/protocol/contracts/libs/LibTrieProof.sol b/packages/protocol/contracts/shared/common/LibTrieProof.sol similarity index 83% rename from packages/protocol/contracts/libs/LibTrieProof.sol rename to packages/protocol/contracts/shared/common/LibTrieProof.sol index f28476318c8..d65e7c4f9ec 100644 --- a/packages/protocol/contracts/libs/LibTrieProof.sol +++ b/packages/protocol/contracts/shared/common/LibTrieProof.sol @@ -4,11 +4,11 @@ // | |/ _` | | / / _ \ | |__/ _` | '_ (_-< // |_|\__,_|_|_\_\___/ |____\__,_|_.__/__/ -pragma solidity 0.8.24; +pragma solidity ^0.8.24; -import "../thirdparty/optimism/rlp/RLPReader.sol"; -import "../thirdparty/optimism/rlp/RLPWriter.sol"; -import "../thirdparty/optimism/trie/SecureMerkleTrie.sol"; +import "@optimism/packages/contracts-bedrock/src/libraries/rlp/RLPReader.sol"; +import "@optimism/packages/contracts-bedrock/src/libraries/rlp/RLPWriter.sol"; +import "@optimism/packages/contracts-bedrock/src/libraries/trie/SecureMerkleTrie.sol"; /// @title LibTrieProof /// @custom:security-contact security@taiko.xyz @@ -47,7 +47,7 @@ library LibTrieProof { bytes memory rlpAccount = SecureMerkleTrie.get(abi.encodePacked(_addr), _accountProof, _rootHash); - if (rlpAccount.length == 0) revert LTP_INVALID_ACCOUNT_PROOF(); + require(rlpAccount.length != 0, LTP_INVALID_ACCOUNT_PROOF()); RLPReader.RLPItem[] memory accountState = RLPReader.readList(rlpAccount); @@ -61,6 +61,6 @@ library LibTrieProof { bytes.concat(_slot), RLPWriter.writeUint(uint256(_value)), _storageProof, storageRoot_ ); - if (!verified) revert LTP_INVALID_INCLUSION_PROOF(); + require(verified, LTP_INVALID_INCLUSION_PROOF()); } } diff --git a/packages/protocol/contracts/shared/data/LibSharedData.sol b/packages/protocol/contracts/shared/data/LibSharedData.sol new file mode 100644 index 00000000000..3bf9e665fd9 --- /dev/null +++ b/packages/protocol/contracts/shared/data/LibSharedData.sol @@ -0,0 +1,13 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +library LibSharedData { + /// @dev Struct that represents L2 basefee configurations + struct BaseFeeConfig { + uint8 adjustmentQuotient; + uint8 sharingPctg; + uint32 gasIssuancePerSecond; + uint64 minGasExcess; + uint32 maxGasIssuancePerBlock; + } +} diff --git a/packages/protocol/contracts/signal/ISignalService.sol b/packages/protocol/contracts/shared/signal/ISignalService.sol similarity index 94% rename from packages/protocol/contracts/signal/ISignalService.sol rename to packages/protocol/contracts/shared/signal/ISignalService.sol index 52638ac5e4b..f6e8cc7b81f 100644 --- a/packages/protocol/contracts/signal/ISignalService.sol +++ b/packages/protocol/contracts/shared/signal/ISignalService.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; /// @title ISignalService /// @notice The SignalService contract serves as a secure cross-chain message @@ -148,18 +148,6 @@ interface ISignalService { view returns (bool); - /// @notice Returns the given block's chain height. - /// @param _chainId Identifier of the chainId. - /// @param _kind A value to mark the data type. - /// @return blockId_ The largest synced block id. - function getSyncedChainHeight( - uint64 _chainId, - bytes32 _kind - ) - external - view - returns (uint64 blockId_); - /// @notice Returns the given block's chain data. /// @param _chainId Identifier of the chainId. /// @param _kind A value to mark the data type. diff --git a/packages/protocol/contracts/signal/SignalService.sol b/packages/protocol/contracts/shared/signal/SignalService.sol similarity index 94% rename from packages/protocol/contracts/signal/SignalService.sol rename to packages/protocol/contracts/shared/signal/SignalService.sol index 1ae6a2eb0ec..f7432392bb7 100644 --- a/packages/protocol/contracts/signal/SignalService.sol +++ b/packages/protocol/contracts/shared/signal/SignalService.sol @@ -1,9 +1,9 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import "../common/EssentialContract.sol"; import "../common/LibStrings.sol"; -import "../libs/LibTrieProof.sol"; +import "../common/LibTrieProof.sol"; import "./ISignalService.sol"; /// @title SignalService @@ -41,9 +41,9 @@ contract SignalService is EssentialContract, ISignalService { /// @notice Initializes the contract. /// @param _owner The owner of this contract. msg.sender will be used if this value is zero. - /// @param _addressManager The address of the {AddressManager} contract. - function init(address _owner, address _addressManager) external initializer { - __Essential_init(_owner, _addressManager); + /// @param _sharedAddressManager The address of the {AddressManager} contract. + function init(address _owner, address _sharedAddressManager) external initializer { + __Essential_init(_owner, _sharedAddressManager); } /// @dev Authorize or deauthorize an address for calling syncChainData. @@ -120,7 +120,7 @@ contract SignalService is EssentialContract, ISignalService { ) public view - nonZeroValue(_chainData) + nonZeroBytes32(_chainData) returns (bool) { bytes32 signal = signalForChainData(_chainId, _kind, _blockId); @@ -132,11 +132,6 @@ contract SignalService is EssentialContract, ISignalService { return _loadSignalValue(_app, _signal) != 0; } - /// @inheritdoc ISignalService - function getSyncedChainHeight(uint64 _chainId, bytes32 _kind) external view returns (uint64) { - return topBlockId[_chainId][_kind]; - } - /// @inheritdoc ISignalService function getSyncedChainData( uint64 _chainId, @@ -198,8 +193,8 @@ contract SignalService is EssentialContract, ISignalService { view virtual nonZeroAddr(_app) - nonZeroValue(_signal) - nonZeroValue(_value) + nonZeroBytes32(_signal) + nonZeroBytes32(_value) returns (bytes32) { return LibTrieProof.verifyMerkleProof( @@ -239,8 +234,8 @@ contract SignalService is EssentialContract, ISignalService { ) private nonZeroAddr(_app) - nonZeroValue(_signal) - nonZeroValue(_value) + nonZeroBytes32(_signal) + nonZeroBytes32(_value) returns (bytes32 slot_) { slot_ = getSignalSlot(uint64(block.chainid), _app, _signal); @@ -281,7 +276,7 @@ contract SignalService is EssentialContract, ISignalService { private view nonZeroAddr(_app) - nonZeroValue(_signal) + nonZeroBytes32(_signal) returns (bytes32 value_) { bytes32 slot = getSignalSlot(uint64(block.chainid), _app, _signal); @@ -300,7 +295,7 @@ contract SignalService is EssentialContract, ISignalService { private view nonZeroAddr(_app) - nonZeroValue(_signal) + nonZeroBytes32(_signal) returns (CacheAction[] memory actions) { HopProof[] memory hopProofs = abi.decode(_proof, (HopProof[])); diff --git a/packages/protocol/contracts/tko/TaikoTokenBase.sol b/packages/protocol/contracts/shared/token/TaikoTokenBase.sol similarity index 98% rename from packages/protocol/contracts/tko/TaikoTokenBase.sol rename to packages/protocol/contracts/shared/token/TaikoTokenBase.sol index 2e30a8b9547..b0f373fac6c 100644 --- a/packages/protocol/contracts/tko/TaikoTokenBase.sol +++ b/packages/protocol/contracts/shared/token/TaikoTokenBase.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20VotesUpgradeable.sol"; import "../common/EssentialContract.sol"; diff --git a/packages/protocol/contracts/tokenvault/BaseNFTVault.sol b/packages/protocol/contracts/shared/tokenvault/BaseNFTVault.sol similarity index 99% rename from packages/protocol/contracts/tokenvault/BaseNFTVault.sol rename to packages/protocol/contracts/shared/tokenvault/BaseNFTVault.sol index 8b4e3559533..e47075803f7 100644 --- a/packages/protocol/contracts/tokenvault/BaseNFTVault.sol +++ b/packages/protocol/contracts/shared/tokenvault/BaseNFTVault.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import "./BaseVault.sol"; diff --git a/packages/protocol/contracts/tokenvault/BaseVault.sol b/packages/protocol/contracts/shared/tokenvault/BaseVault.sol similarity index 98% rename from packages/protocol/contracts/tokenvault/BaseVault.sol rename to packages/protocol/contracts/shared/tokenvault/BaseVault.sol index 18d17edb551..de9db5c8314 100644 --- a/packages/protocol/contracts/tokenvault/BaseVault.sol +++ b/packages/protocol/contracts/shared/tokenvault/BaseVault.sol @@ -1,12 +1,12 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import "@openzeppelin/contracts-upgradeable/utils/introspection/IERC165Upgradeable.sol"; import "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; import "../bridge/IBridge.sol"; import "../common/EssentialContract.sol"; import "../common/LibStrings.sol"; -import "../libs/LibBytes.sol"; +import "../common/LibBytes.sol"; /// @title INameSymbol /// @notice Interface for contracts that provide name() and symbol() diff --git a/packages/protocol/contracts/tokenvault/BridgedERC1155.sol b/packages/protocol/contracts/shared/tokenvault/BridgedERC1155.sol similarity index 96% rename from packages/protocol/contracts/tokenvault/BridgedERC1155.sol rename to packages/protocol/contracts/shared/tokenvault/BridgedERC1155.sol index f846fc4d5c1..2edb63ce287 100644 --- a/packages/protocol/contracts/tokenvault/BridgedERC1155.sol +++ b/packages/protocol/contracts/shared/tokenvault/BridgedERC1155.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import "@openzeppelin/contracts-upgradeable/token/ERC1155/ERC1155Upgradeable.sol"; import "../common/EssentialContract.sol"; @@ -35,7 +35,7 @@ contract BridgedERC1155 is /// @inheritdoc IBridgedERC1155Initializable function init( address _owner, - address _addressManager, + address _sharedAddressManager, address _srcToken, uint256 _srcChainId, string calldata _symbol, @@ -48,7 +48,7 @@ contract BridgedERC1155 is // The symbol and the name can be empty for ERC1155 tokens so we use some placeholder data // for them instead. LibBridgedToken.validateInputs(_srcToken, _srcChainId); - __Essential_init(_owner, _addressManager); + __Essential_init(_owner, _sharedAddressManager); // The token URI here is not important as the client will have to read the URI from the // canonical contract to fetch meta data. diff --git a/packages/protocol/contracts/tokenvault/BridgedERC20.sol b/packages/protocol/contracts/shared/tokenvault/BridgedERC20.sol similarity index 97% rename from packages/protocol/contracts/tokenvault/BridgedERC20.sol rename to packages/protocol/contracts/shared/tokenvault/BridgedERC20.sol index e8a75b8cbe0..f8a564680dc 100644 --- a/packages/protocol/contracts/tokenvault/BridgedERC20.sol +++ b/packages/protocol/contracts/shared/tokenvault/BridgedERC20.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol"; import "@openzeppelin/contracts-upgradeable/utils/introspection/IERC165Upgradeable.sol"; @@ -60,7 +60,7 @@ contract BridgedERC20 is /// @inheritdoc IBridgedERC20Initializable function init( address _owner, - address _addressManager, + address _sharedAddressManager, address _srcToken, uint256 _srcChainId, uint8 _decimals, @@ -68,11 +68,12 @@ contract BridgedERC20 is string calldata _name ) external + virtual initializer { // Check if provided parameters are valid LibBridgedToken.validateInputs(_srcToken, _srcChainId); - __Essential_init(_owner, _addressManager); + __Essential_init(_owner, _sharedAddressManager); __ERC20_init(_name, _symbol); // Set contract properties @@ -149,7 +150,7 @@ contract BridgedERC20 is return migratingAddress != address(0) && !migratingInbound; } - function supportsInterface(bytes4 _interfaceId) public pure returns (bool) { + function supportsInterface(bytes4 _interfaceId) public pure virtual returns (bool) { return _interfaceId == type(IBridgedERC20).interfaceId || _interfaceId == type(IBridgedERC20Initializable).interfaceId || _interfaceId == type(IBridgedERC20Migratable).interfaceId diff --git a/packages/protocol/contracts/shared/tokenvault/BridgedERC20V2.sol b/packages/protocol/contracts/shared/tokenvault/BridgedERC20V2.sol new file mode 100644 index 00000000000..85cdfafefc6 --- /dev/null +++ b/packages/protocol/contracts/shared/tokenvault/BridgedERC20V2.sol @@ -0,0 +1,118 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "@openzeppelin/contracts-upgradeable/interfaces/IERC5267Upgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/IERC20PermitUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/utils/cryptography/EIP712Upgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/utils/CountersUpgradeable.sol"; +import "./BridgedERC20.sol"; + +/// @title BridgedERC20V2 +/// @notice An upgradeable ERC20 contract that represents tokens bridged from +/// another chain. This implementation adds ERC20Permit support to BridgedERC20. +/// +/// Most of the code were copied from OZ's ERC20PermitUpgradeable.sol contract. +/// +/// @custom:security-contact security@taiko.xyz +contract BridgedERC20V2 is BridgedERC20, IERC20PermitUpgradeable, EIP712Upgradeable { + using CountersUpgradeable for CountersUpgradeable.Counter; + + // solhint-disable-next-line var-name-mixedcase + bytes32 private constant _PERMIT_TYPEHASH = keccak256( + "Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)" + ); + + mapping(address account => CountersUpgradeable.Counter counter) private _nonces; + uint256[49] private __gap; + + error BTOKEN_DEADLINE_EXPIRED(); + error BTOKEN_INVALID_SIG(); + + /// @inheritdoc IBridgedERC20Initializable + /// @dev This function is called when the bridge deploys a new bridged ERC20 token, so this + /// function must also cover the logic in init2(), we use + /// `reinitializer(2)` instead of `initializer`. + function init( + address _owner, + address _sharedAddressManager, + address _srcToken, + uint256 _srcChainId, + uint8 _decimals, + string calldata _symbol, + string calldata _name + ) + external + virtual + override + reinitializer(2) + { + // Check if provided parameters are valid + LibBridgedToken.validateInputs(_srcToken, _srcChainId); + __Essential_init(_owner, _sharedAddressManager); + __ERC20_init(_name, _symbol); + // Set contract properties + srcToken = _srcToken; + srcChainId = _srcChainId; + __srcDecimals = _decimals; + + // Cover logics from `init2()` + __EIP712_init_unchained(_name, "1"); + } + + /// @notice This function shall be called by previously deployed contracts. + function init2() external reinitializer(2) { + __EIP712_init_unchained(name(), "1"); + } + + /// @inheritdoc IERC20PermitUpgradeable + // solhint-disable-next-line func-name-mixedcase + function DOMAIN_SEPARATOR() external view override returns (bytes32) { + return _domainSeparatorV4(); + } + + /// @inheritdoc IERC20PermitUpgradeable + function permit( + address owner, + address spender, + uint256 value, + uint256 deadline, + uint8 v, + bytes32 r, + bytes32 s + ) + public + virtual + override + { + if (block.timestamp > deadline) revert BTOKEN_DEADLINE_EXPIRED(); + + bytes32 structHash = keccak256( + abi.encode(_PERMIT_TYPEHASH, owner, spender, value, _useNonce(owner), deadline) + ); + + bytes32 hash = _hashTypedDataV4(structHash); + + address signer = ECDSAUpgradeable.recover(hash, v, r, s); + if (signer != owner) revert BTOKEN_INVALID_SIG(); + + _approve(owner, spender, value); + } + + /// @inheritdoc IERC20PermitUpgradeable + function nonces(address owner) public view virtual override returns (uint256) { + return _nonces[owner].current(); + } + + function supportsInterface(bytes4 _interfaceId) public pure virtual override returns (bool) { + return _interfaceId == type(IERC20PermitUpgradeable).interfaceId + || _interfaceId == type(IERC5267Upgradeable).interfaceId + || super.supportsInterface(_interfaceId); + } + + /// @dev "Consume a nonce": return the current value and increment. + function _useNonce(address owner) internal virtual returns (uint256 current) { + CountersUpgradeable.Counter storage nonce = _nonces[owner]; + current = nonce.current(); + nonce.increment(); + } +} diff --git a/packages/protocol/contracts/tokenvault/BridgedERC721.sol b/packages/protocol/contracts/shared/tokenvault/BridgedERC721.sol similarity index 96% rename from packages/protocol/contracts/tokenvault/BridgedERC721.sol rename to packages/protocol/contracts/shared/tokenvault/BridgedERC721.sol index 3315c8bb56c..979aa00edb2 100644 --- a/packages/protocol/contracts/tokenvault/BridgedERC721.sol +++ b/packages/protocol/contracts/shared/tokenvault/BridgedERC721.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import "@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol"; import "../common/EssentialContract.sol"; @@ -30,7 +30,7 @@ contract BridgedERC721 is /// @inheritdoc IBridgedERC721Initializable function init( address _owner, - address _addressManager, + address _sharedAddressManager, address _srcToken, uint256 _srcChainId, string calldata _symbol, @@ -41,7 +41,7 @@ contract BridgedERC721 is { // Check if provided parameters are valid LibBridgedToken.validateInputs(_srcToken, _srcChainId); - __Essential_init(_owner, _addressManager); + __Essential_init(_owner, _sharedAddressManager); __ERC721_init(_name, _symbol); srcToken = _srcToken; diff --git a/packages/protocol/contracts/tokenvault/ERC1155Vault.sol b/packages/protocol/contracts/shared/tokenvault/ERC1155Vault.sol similarity index 97% rename from packages/protocol/contracts/tokenvault/ERC1155Vault.sol rename to packages/protocol/contracts/shared/tokenvault/ERC1155Vault.sol index f6b82fe1c40..d9de36a88bf 100644 --- a/packages/protocol/contracts/tokenvault/ERC1155Vault.sol +++ b/packages/protocol/contracts/shared/tokenvault/ERC1155Vault.sol @@ -1,9 +1,9 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import "@openzeppelin/contracts/token/ERC1155/IERC1155.sol"; import "@openzeppelin/contracts-upgradeable/token/ERC1155/utils/ERC1155ReceiverUpgradeable.sol"; -import "../libs/LibAddress.sol"; +import "../common/LibAddress.sol"; import "../common/LibStrings.sol"; import "./IBridgedERC1155.sol"; import "./BaseNFTVault.sol"; @@ -20,9 +20,9 @@ contract ERC1155Vault is BaseNFTVault, ERC1155ReceiverUpgradeable { /// @notice Initializes the contract. /// @param _owner The owner of this contract. msg.sender will be used if this value is zero. - /// @param _addressManager The address of the {AddressManager} contract. - function init(address _owner, address _addressManager) external initializer { - __Essential_init(_owner, _addressManager); + /// @param _sharedAddressManager The address of the {AddressManager} contract. + function init(address _owner, address _sharedAddressManager) external initializer { + __Essential_init(_owner, _sharedAddressManager); __ERC1155Receiver_init(); } /// @notice Transfers ERC1155 tokens to this vault and sends a message to diff --git a/packages/protocol/contracts/tokenvault/ERC20Vault.sol b/packages/protocol/contracts/shared/tokenvault/ERC20Vault.sol similarity index 98% rename from packages/protocol/contracts/tokenvault/ERC20Vault.sol rename to packages/protocol/contracts/shared/tokenvault/ERC20Vault.sol index e2e017f4ceb..b7b0b0296b2 100644 --- a/packages/protocol/contracts/tokenvault/ERC20Vault.sol +++ b/packages/protocol/contracts/shared/tokenvault/ERC20Vault.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; @@ -7,7 +7,7 @@ import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; import "@openzeppelin/contracts/utils/Address.sol"; import "../bridge/IQuotaManager.sol"; import "../common/LibStrings.sol"; -import "../libs/LibAddress.sol"; +import "../common/LibAddress.sol"; import "./IBridgedERC20.sol"; import "./BaseVault.sol"; @@ -160,9 +160,9 @@ contract ERC20Vault is BaseVault { /// @notice Initializes the contract. /// @param _owner The owner of this contract. msg.sender will be used if this value is zero. - /// @param _addressManager The address of the {AddressManager} contract. - function init(address _owner, address _addressManager) external initializer { - __Essential_init(_owner, _addressManager); + /// @param _sharedAddressManager The address of the {AddressManager} contract. + function init(address _owner, address _sharedAddressManager) external initializer { + __Essential_init(_owner, _sharedAddressManager); } /// @notice Change bridged token. @@ -355,8 +355,6 @@ contract ERC20Vault is BaseVault { private returns (address token_) { - _consumeTokenQuota(token_, _amount); - if (_ctoken.chainId == block.chainid) { token_ = _ctoken.addr; IERC20(token_).safeTransfer(_to, _amount); @@ -366,6 +364,7 @@ contract ERC20Vault is BaseVault { // check. IBridgedERC20(token_).mint(_to, _amount); } + _consumeTokenQuota(token_, _amount); } /// @dev Handles the message on the source chain and returns the encoded diff --git a/packages/protocol/contracts/tokenvault/ERC721Vault.sol b/packages/protocol/contracts/shared/tokenvault/ERC721Vault.sol similarity index 96% rename from packages/protocol/contracts/tokenvault/ERC721Vault.sol rename to packages/protocol/contracts/shared/tokenvault/ERC721Vault.sol index ac07f53bb2d..2784e80d64a 100644 --- a/packages/protocol/contracts/tokenvault/ERC721Vault.sol +++ b/packages/protocol/contracts/shared/tokenvault/ERC721Vault.sol @@ -1,9 +1,9 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import "@openzeppelin/contracts/token/ERC721/IERC721.sol"; import "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol"; -import "../libs/LibAddress.sol"; +import "../common/LibAddress.sol"; import "../common/LibStrings.sol"; import "./IBridgedERC721.sol"; import "./BaseNFTVault.sol"; @@ -20,9 +20,9 @@ contract ERC721Vault is BaseNFTVault, IERC721Receiver { /// @notice Initializes the contract. /// @param _owner The owner of this contract. msg.sender will be used if this value is zero. - /// @param _addressManager The address of the {AddressManager} contract. - function init(address _owner, address _addressManager) external initializer { - __Essential_init(_owner, _addressManager); + /// @param _sharedAddressManager The address of the {AddressManager} contract. + function init(address _owner, address _sharedAddressManager) external initializer { + __Essential_init(_owner, _sharedAddressManager); } /// @notice Transfers ERC721 tokens to this vault and sends a message to the diff --git a/packages/protocol/contracts/tokenvault/IBridgedERC1155.sol b/packages/protocol/contracts/shared/tokenvault/IBridgedERC1155.sol similarity index 91% rename from packages/protocol/contracts/tokenvault/IBridgedERC1155.sol rename to packages/protocol/contracts/shared/tokenvault/IBridgedERC1155.sol index 3d0ac0a93de..4c3e721782f 100644 --- a/packages/protocol/contracts/tokenvault/IBridgedERC1155.sol +++ b/packages/protocol/contracts/shared/tokenvault/IBridgedERC1155.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; /// @title IBridgedERC1155 /// @notice Contract for bridging ERC1155 tokens across different chains. @@ -32,14 +32,14 @@ interface IBridgedERC1155 { interface IBridgedERC1155Initializable { /// @notice Initializes the contract. /// @param _owner The owner of this contract. msg.sender will be used if this value is zero. - /// @param _addressManager The address of the {AddressManager} contract. + /// @param _sharedAddressManager The address of the {AddressManager} contract. /// @param _srcToken Address of the source token. /// @param _srcChainId Source chain ID. /// @param _symbol Symbol of the bridged token. /// @param _name Name of the bridged token. function init( address _owner, - address _addressManager, + address _sharedAddressManager, address _srcToken, uint256 _srcChainId, string calldata _symbol, diff --git a/packages/protocol/contracts/tokenvault/IBridgedERC20.sol b/packages/protocol/contracts/shared/tokenvault/IBridgedERC20.sol similarity index 61% rename from packages/protocol/contracts/tokenvault/IBridgedERC20.sol rename to packages/protocol/contracts/shared/tokenvault/IBridgedERC20.sol index 06c274c9225..b8b672b4791 100644 --- a/packages/protocol/contracts/tokenvault/IBridgedERC20.sol +++ b/packages/protocol/contracts/shared/tokenvault/IBridgedERC20.sol @@ -1,11 +1,24 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; /// @title IBridgedERC20 /// @notice Interface for all bridged tokens. -/// @dev To facilitate compatibility with third-party bridged tokens, sometimes it might be -/// necessary to implement an intermediary adapter contract which should conform to this interface, -/// enabling effective interaction with third-party contracts. +/// @dev Here is the list of assumptions that guarantees that the bridged token can be bridged back +/// to it's canonical counterpart (by-default it is, but in case a third-party "native" token is set +/// and used in our bridge): +/// - The token should be ERC-20 compliant +/// - Supply increases should only be caused by mints from the vault. Notably, rebasing tokens are +/// not supported. +/// - Token balances should change by exactly the given amounts on `transfer`/`mint`/`burn`. Notable, +/// tokens with fees on transfers are not supported. +/// - If the bridged token is not directly deployed by the Bridge (ERC20Vault), - for example a USDT +/// token bytecode deployed on Taiko to support native tokens - it might be necessary to implement +/// an intermediary adapter contract which should conform mint() and burn() interfaces, so that the +/// ERC20Vault can call these actions on the adapter. +/// - If the bridged token is not directly deployed by the Bridge (ERC20Vault), but conforms the +/// mint() and burn() interface and the ERC20Vault has the right to perform these actions (has +/// minter/burner role). +/// - If the bridged token is directly deployed by our Bridge (ERC20Vault). /// @custom:security-contact security@taiko.xyz interface IBridgedERC20 { /// @notice Mints `amount` tokens and assigns them to the `account` address. @@ -39,7 +52,7 @@ interface IBridgedERC20Migratable { interface IBridgedERC20Initializable { /// @notice Initializes the contract. /// @param _owner The owner of this contract. msg.sender will be used if this value is zero. - /// @param _addressManager The address of the {AddressManager} contract. + /// @param _sharedAddressManager The address of the {AddressManager} contract. /// @param _srcToken The source token address. /// @param _srcChainId The source chain ID. /// @param _decimals The number of decimal places of the source token. @@ -47,7 +60,7 @@ interface IBridgedERC20Initializable { /// @param _name The name of the token. function init( address _owner, - address _addressManager, + address _sharedAddressManager, address _srcToken, uint256 _srcChainId, uint8 _decimals, diff --git a/packages/protocol/contracts/tokenvault/IBridgedERC721.sol b/packages/protocol/contracts/shared/tokenvault/IBridgedERC721.sol similarity index 90% rename from packages/protocol/contracts/tokenvault/IBridgedERC721.sol rename to packages/protocol/contracts/shared/tokenvault/IBridgedERC721.sol index e8a2d426605..8f89632084c 100644 --- a/packages/protocol/contracts/tokenvault/IBridgedERC721.sol +++ b/packages/protocol/contracts/shared/tokenvault/IBridgedERC721.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; /// @title IBridgedERC721 /// @notice Contract for bridging ERC721 tokens across different chains. @@ -25,14 +25,14 @@ interface IBridgedERC721 { interface IBridgedERC721Initializable { /// @notice Initializes the contract. /// @param _owner The owner of this contract. msg.sender will be used if this value is zero. - /// @param _addressManager The address of the {AddressManager} contract. + /// @param _sharedAddressManager The address of the {AddressManager} contract. /// @param _srcToken Address of the source token. /// @param _srcChainId Source chain ID. /// @param _symbol Symbol of the bridged token. /// @param _name Name of the bridged token. function init( address _owner, - address _addressManager, + address _sharedAddressManager, address _srcToken, uint256 _srcChainId, string calldata _symbol, diff --git a/packages/protocol/contracts/tokenvault/LibBridgedToken.sol b/packages/protocol/contracts/shared/tokenvault/LibBridgedToken.sol similarity index 98% rename from packages/protocol/contracts/tokenvault/LibBridgedToken.sol rename to packages/protocol/contracts/shared/tokenvault/LibBridgedToken.sol index c81313ccb04..bf6b8125b8a 100644 --- a/packages/protocol/contracts/tokenvault/LibBridgedToken.sol +++ b/packages/protocol/contracts/shared/tokenvault/LibBridgedToken.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import "@openzeppelin/contracts/utils/Strings.sol"; diff --git a/packages/protocol/contracts/team/proving/ProverSet.sol b/packages/protocol/contracts/team/proving/ProverSet.sol deleted file mode 100644 index 00ba19a7ebf..00000000000 --- a/packages/protocol/contracts/team/proving/ProverSet.sol +++ /dev/null @@ -1,125 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.24; - -import "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20VotesUpgradeable.sol"; -import "@openzeppelin/contracts/interfaces/IERC1271.sol"; -import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; -import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; -import "../../common/EssentialContract.sol"; -import "../../common/LibStrings.sol"; -import "../../L1/ITaikoL1.sol"; - -interface IHasRecipient { - function recipient() external view returns (address); -} - -/// @title ProverSet -/// @notice A contract that holds TKO token and acts as a Taiko prover. This contract will simply -/// relay `proveBlock` calls to TaikoL1 so msg.sender doesn't need to hold any TKO. -/// @custom:security-contact security@taiko.xyz -contract ProverSet is EssentialContract, IERC1271 { - bytes4 private constant _EIP1271_MAGICVALUE = 0x1626ba7e; - - mapping(address prover => bool isProver) public isProver; // slot 1 - address public admin; // slot 2 - - uint256[48] private __gap; - - event ProverEnabled(address indexed prover, bool indexed enabled); - - error INVALID_STATUS(); - error PERMISSION_DENIED(); - - modifier onlyAuthorized() { - if (msg.sender != admin && msg.sender != IHasRecipient(admin).recipient()) { - revert PERMISSION_DENIED(); - } - _; - } - - modifier onlyProver() { - if (!isProver[msg.sender]) revert PERMISSION_DENIED(); - _; - } - - /// @notice Initializes the contract. - function init( - address _owner, - address _admin, - address _addressManager - ) - external - nonZeroAddr(_admin) - initializer - { - __Essential_init(_owner, _addressManager); - admin = _admin; - IERC20(tkoToken()).approve(taikoL1(), type(uint256).max); - } - - /// @notice Receives ETH as fees. - receive() external payable { } - - function approveAllowance(address _address, uint256 _allowance) external onlyOwner { - IERC20(tkoToken()).approve(_address, _allowance); - } - - /// @notice Enables or disables a prover. - function enableProver(address _prover, bool _isProver) external onlyAuthorized { - if (isProver[_prover] == _isProver) revert INVALID_STATUS(); - isProver[_prover] = _isProver; - - emit ProverEnabled(_prover, _isProver); - } - - /// @notice Withdraws Taiko tokens back to the admin address. - function withdrawToAdmin(uint256 _amount) external onlyAuthorized { - IERC20(tkoToken()).transfer(admin, _amount); - } - - /// @notice Propose a Taiko block. - function proposeBlock( - bytes calldata _params, - bytes calldata _txList - ) - external - onlyProver - nonReentrant - { - ITaikoL1(taikoL1()).proposeBlock(_params, _txList); - } - - /// @notice Proves or contests a Taiko block. - function proveBlock(uint64 _blockId, bytes calldata _input) external onlyProver nonReentrant { - ITaikoL1(taikoL1()).proveBlock(_blockId, _input); - } - - /// @notice Delegates token voting right to a delegatee. - /// @param _delegatee The delegatee to receive the voting right. - function delegate(address _delegatee) external onlyAuthorized nonReentrant { - ERC20VotesUpgradeable(tkoToken()).delegate(_delegatee); - } - - // This function is necessary for this contract to become an assigned prover. - function isValidSignature( - bytes32 _hash, - bytes calldata _signature - ) - external - view - returns (bytes4 magicValue_) - { - (address recovered, ECDSA.RecoverError error) = ECDSA.tryRecover(_hash, _signature); - if (error == ECDSA.RecoverError.NoError && isProver[recovered]) { - magicValue_ = _EIP1271_MAGICVALUE; - } - } - - function taikoL1() internal view virtual returns (address) { - return resolve(LibStrings.B_TAIKO, false); - } - - function tkoToken() internal view virtual returns (address) { - return resolve(LibStrings.B_TAIKO_TOKEN, false); - } -} diff --git a/packages/protocol/contracts/thirdparty/README.md b/packages/protocol/contracts/thirdparty/README.md deleted file mode 100644 index 0102fe8cd67..00000000000 --- a/packages/protocol/contracts/thirdparty/README.md +++ /dev/null @@ -1,9 +0,0 @@ -# ABOUT THIRDPARTY CODE - -- /optimism: code copied from `packages/contracts-bedrock/src/libraries` in https://github.com/ethereum-optimism/optimism/releases/tag/op-batcher%2Fv1.4.3 as-is with only solidity pragma changed. - -- /solmate: code copied from https://github.com/transmissions11/solmate/blob/v7/src/utils/FixedPointMathLib.sol as-is with only solidity pragma changed. - -- /nomad-xyz: code copied from https://github.com/nomad-xyz/ExcessivelySafeCall/blob/main/src/ExcessivelySafeCall.sol with unused coded removed and solidity pragma changed. - -- /risczero: interface copied from https://sepolia.etherscan.io/address/0x83c2e9cd64b2a16d3908e94c7654f3864212e2f8#code as per: https://dev.risczero.com/api/blockchain-integration/contracts/verifier diff --git a/packages/protocol/contracts/thirdparty/optimism/Bytes.sol b/packages/protocol/contracts/thirdparty/optimism/Bytes.sol deleted file mode 100644 index 6a6fba86e7d..00000000000 --- a/packages/protocol/contracts/thirdparty/optimism/Bytes.sol +++ /dev/null @@ -1,152 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.24; - -/// @title Bytes -/// @notice Bytes is a library for manipulating byte arrays. -library Bytes { - /// @custom:attribution https://github.com/GNSPS/solidity-bytes-utils - /// @notice Slices a byte array with a given starting index and length. Returns a new byte array - /// as opposed to a pointer to the original array. Will throw if trying to slice more - /// bytes than exist in the array. - /// @param _bytes Byte array to slice. - /// @param _start Starting index of the slice. - /// @param _length Length of the slice. - /// @return Slice of the input byte array. - function slice( - bytes memory _bytes, - uint256 _start, - uint256 _length - ) - internal - pure - returns (bytes memory) - { - unchecked { - require(_length + 31 >= _length, "slice_overflow"); - require(_start + _length >= _start, "slice_overflow"); - require(_bytes.length >= _start + _length, "slice_outOfBounds"); - } - - bytes memory tempBytes; - - assembly { - switch iszero(_length) - case 0 { - // Get a location of some free memory and store it in tempBytes as - // Solidity does for memory variables. - tempBytes := mload(0x40) - - // The first word of the slice result is potentially a partial - // word read from the original array. To read it, we calculate - // the length of that partial word and start copying that many - // bytes into the array. The first word we copy will start with - // data we don't care about, but the last `lengthmod` bytes will - // land at the beginning of the contents of the new array. When - // we're done copying, we overwrite the full first word with - // the actual length of the slice. - let lengthmod := and(_length, 31) - - // The multiplication in the next line is necessary - // because when slicing multiples of 32 bytes (lengthmod == 0) - // the following copy loop was copying the origin's length - // and then ending prematurely not copying everything it should. - let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod))) - let end := add(mc, _length) - - for { - // The multiplication in the next line has the same exact purpose - // as the one above. - let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start) - } lt(mc, end) { - mc := add(mc, 0x20) - cc := add(cc, 0x20) - } { mstore(mc, mload(cc)) } - - mstore(tempBytes, _length) - - //update free-memory pointer - //allocating the array padded to 32 bytes like the compiler does now - mstore(0x40, and(add(mc, 31), not(31))) - } - //if we want a zero-length slice let's just return a zero-length array - default { - tempBytes := mload(0x40) - - //zero out the 32 bytes slice we are about to return - //we need to do it because Solidity does not garbage collect - mstore(tempBytes, 0) - - mstore(0x40, add(tempBytes, 0x20)) - } - } - - return tempBytes; - } - - /// @notice Slices a byte array with a given starting index up to the end of the original byte - /// array. Returns a new array rather than a pointer to the original. - /// @param _bytes Byte array to slice. - /// @param _start Starting index of the slice. - /// @return Slice of the input byte array. - function slice(bytes memory _bytes, uint256 _start) internal pure returns (bytes memory) { - if (_start >= _bytes.length) { - return bytes(""); - } - return slice(_bytes, _start, _bytes.length - _start); - } - - /// @notice Converts a byte array into a nibble array by splitting each byte into two nibbles. - /// Resulting nibble array will be exactly twice as long as the input byte array. - /// @param _bytes Input byte array to convert. - /// @return Resulting nibble array. - function toNibbles(bytes memory _bytes) internal pure returns (bytes memory) { - bytes memory _nibbles; - assembly { - // Grab a free memory offset for the new array - _nibbles := mload(0x40) - - // Load the length of the passed bytes array from memory - let bytesLength := mload(_bytes) - - // Calculate the length of the new nibble array - // This is the length of the input array times 2 - let nibblesLength := shl(0x01, bytesLength) - - // Update the free memory pointer to allocate memory for the new array. - // To do this, we add the length of the new array + 32 bytes for the array length - // rounded up to the nearest 32 byte boundary to the current free memory pointer. - mstore(0x40, add(_nibbles, and(not(0x1F), add(nibblesLength, 0x3F)))) - - // Store the length of the new array in memory - mstore(_nibbles, nibblesLength) - - // Store the memory offset of the _bytes array's contents on the stack - let bytesStart := add(_bytes, 0x20) - - // Store the memory offset of the nibbles array's contents on the stack - let nibblesStart := add(_nibbles, 0x20) - - // Loop through each byte in the input array - for { let i := 0x00 } lt(i, bytesLength) { i := add(i, 0x01) } { - // Get the starting offset of the next 2 bytes in the nibbles array - let offset := add(nibblesStart, shl(0x01, i)) - // Load the byte at the current index within the `_bytes` array - let b := byte(0x00, mload(add(bytesStart, i))) - - // Pull out the first nibble and store it in the new array - mstore8(offset, shr(0x04, b)) - // Pull out the second nibble and store it in the new array - mstore8(add(offset, 0x01), and(b, 0x0F)) - } - } - return _nibbles; - } - - /// @notice Compares two byte arrays by comparing their keccak256 hashes. - /// @param _bytes First byte array to compare. - /// @param _other Second byte array to compare. - /// @return true if the two byte arrays are equal, false otherwise. - function equal(bytes memory _bytes, bytes memory _other) internal pure returns (bool) { - return keccak256(_bytes) == keccak256(_other); - } -} diff --git a/packages/protocol/contracts/thirdparty/optimism/rlp/RLPReader.sol b/packages/protocol/contracts/thirdparty/optimism/rlp/RLPReader.sol deleted file mode 100644 index 9164b7490ed..00000000000 --- a/packages/protocol/contracts/thirdparty/optimism/rlp/RLPReader.sol +++ /dev/null @@ -1,303 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.24; - -/// @custom:attribution https://github.com/hamdiallam/Solidity-RLP -/// @title RLPReader -/// @notice RLPReader is a library for parsing RLP-encoded byte arrays into Solidity types. Adapted -/// from Solidity-RLP (https://github.com/hamdiallam/Solidity-RLP) by Hamdi Allam with -/// various tweaks to improve readability. (A shout-out to Optimism !) -library RLPReader { - /// @notice Custom pointer type to avoid confusion between pointers and uint256s. - type MemoryPointer is uint256; - - /// @notice RLP item types. - /// @custom:value DATA_ITEM Represents an RLP data item (NOT a list). - /// @custom:value LIST_ITEM Represents an RLP list item. - enum RLPItemType { - DATA_ITEM, - LIST_ITEM - } - - /// @notice Struct representing an RLP item. - /// @custom:field length Length of the RLP item. - /// @custom:field ptr Pointer to the RLP item in memory. - struct RLPItem { - uint256 length; - MemoryPointer ptr; - } - - /// @notice Max list length that this library will accept. - uint256 internal constant MAX_LIST_LENGTH = 32; - - /// @notice Converts bytes to a reference to memory position and length. - /// @param _in Input bytes to convert. - /// @return out_ Output memory reference. - function toRLPItem(bytes memory _in) internal pure returns (RLPItem memory out_) { - // Empty arrays are not RLP items. - require( - _in.length > 0, - "RLPReader: length of an RLP item must be greater than zero to be decodable" - ); - - MemoryPointer ptr; - assembly { - ptr := add(_in, 32) - } - - out_ = RLPItem({ length: _in.length, ptr: ptr }); - } - - /// @notice Reads an RLP list value into a list of RLP items. - /// @param _in RLP list value. - /// @return out_ Decoded RLP list items. - function readList(RLPItem memory _in) internal pure returns (RLPItem[] memory out_) { - (uint256 listOffset, uint256 listLength, RLPItemType itemType) = _decodeLength(_in); - - require( - itemType == RLPItemType.LIST_ITEM, - "RLPReader: decoded item type for list is not a list item" - ); - - require( - listOffset + listLength == _in.length, - "RLPReader: list item has an invalid data remainder" - ); - - // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by - // writing to the length. Since we can't know the number of RLP items without looping over - // the entire input, we'd have to loop twice to accurately size this array. It's easier to - // simply set a reasonable maximum list length and decrease the size before we finish. - out_ = new RLPItem[](MAX_LIST_LENGTH); - - uint256 itemCount = 0; - uint256 offset = listOffset; - while (offset < _in.length) { - (uint256 itemOffset, uint256 itemLength,) = _decodeLength( - RLPItem({ - length: _in.length - offset, - ptr: MemoryPointer.wrap(MemoryPointer.unwrap(_in.ptr) + offset) - }) - ); - - // We don't need to check itemCount < out.length explicitly because Solidity already - // handles this check on our behalf, we'd just be wasting gas. - out_[itemCount] = RLPItem({ - length: itemLength + itemOffset, - ptr: MemoryPointer.wrap(MemoryPointer.unwrap(_in.ptr) + offset) - }); - - itemCount += 1; - offset += itemOffset + itemLength; - } - - // Decrease the array size to match the actual item count. - assembly { - mstore(out_, itemCount) - } - } - - /// @notice Reads an RLP list value into a list of RLP items. - /// @param _in RLP list value. - /// @return out_ Decoded RLP list items. - function readList(bytes memory _in) internal pure returns (RLPItem[] memory out_) { - out_ = readList(toRLPItem(_in)); - } - - /// @notice Reads an RLP bytes value into bytes. - /// @param _in RLP bytes value. - /// @return out_ Decoded bytes. - function readBytes(RLPItem memory _in) internal pure returns (bytes memory out_) { - (uint256 itemOffset, uint256 itemLength, RLPItemType itemType) = _decodeLength(_in); - - require( - itemType == RLPItemType.DATA_ITEM, - "RLPReader: decoded item type for bytes is not a data item" - ); - - require( - _in.length == itemOffset + itemLength, - "RLPReader: bytes value contains an invalid remainder" - ); - - out_ = _copy(_in.ptr, itemOffset, itemLength); - } - - /// @notice Reads an RLP bytes value into bytes. - /// @param _in RLP bytes value. - /// @return out_ Decoded bytes. - function readBytes(bytes memory _in) internal pure returns (bytes memory out_) { - out_ = readBytes(toRLPItem(_in)); - } - - /// @notice Reads the raw bytes of an RLP item. - /// @param _in RLP item to read. - /// @return out_ Raw RLP bytes. - function readRawBytes(RLPItem memory _in) internal pure returns (bytes memory out_) { - out_ = _copy(_in.ptr, 0, _in.length); - } - - /// @notice Decodes the length of an RLP item. - /// @param _in RLP item to decode. - /// @return offset_ Offset of the encoded data. - /// @return length_ Length of the encoded data. - /// @return type_ RLP item type (LIST_ITEM or DATA_ITEM). - function _decodeLength(RLPItem memory _in) - private - pure - returns (uint256 offset_, uint256 length_, RLPItemType type_) - { - // Short-circuit if there's nothing to decode, note that we perform this check when - // the user creates an RLP item via toRLPItem, but it's always possible for them to bypass - // that function and create an RLP item directly. So we need to check this anyway. - require( - _in.length > 0, - "RLPReader: length of an RLP item must be greater than zero to be decodable" - ); - - MemoryPointer ptr = _in.ptr; - uint256 prefix; - assembly { - prefix := byte(0, mload(ptr)) - } - - if (prefix <= 0x7f) { - // Single byte. - return (0, 1, RLPItemType.DATA_ITEM); - } else if (prefix <= 0xb7) { - // Short string. - - // slither-disable-next-line variable-scope - uint256 strLen = prefix - 0x80; - - require( - _in.length > strLen, - "RLPReader: length of content must be greater than string length (short string)" - ); - - bytes1 firstByteOfContent; - assembly { - firstByteOfContent := and(mload(add(ptr, 1)), shl(248, 0xff)) - } - - require( - strLen != 1 || firstByteOfContent >= 0x80, - "RLPReader: invalid prefix, single byte < 0x80 are not prefixed (short string)" - ); - - return (1, strLen, RLPItemType.DATA_ITEM); - } else if (prefix <= 0xbf) { - // Long string. - uint256 lenOfStrLen = prefix - 0xb7; - - require( - _in.length > lenOfStrLen, - "RLPReader: length of content must be > than length of string length (long string)" - ); - - bytes1 firstByteOfContent; - assembly { - firstByteOfContent := and(mload(add(ptr, 1)), shl(248, 0xff)) - } - - require( - firstByteOfContent != 0x00, - "RLPReader: length of content must not have any leading zeros (long string)" - ); - - uint256 strLen; - assembly { - strLen := shr(sub(256, mul(8, lenOfStrLen)), mload(add(ptr, 1))) - } - - require( - strLen > 55, - "RLPReader: length of content must be greater than 55 bytes (long string)" - ); - - require( - _in.length > lenOfStrLen + strLen, - "RLPReader: length of content must be greater than total length (long string)" - ); - - return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM); - } else if (prefix <= 0xf7) { - // Short list. - // slither-disable-next-line variable-scope - uint256 listLen = prefix - 0xc0; - - require( - _in.length > listLen, - "RLPReader: length of content must be greater than list length (short list)" - ); - - return (1, listLen, RLPItemType.LIST_ITEM); - } else { - // Long list. - uint256 lenOfListLen = prefix - 0xf7; - - require( - _in.length > lenOfListLen, - "RLPReader: length of content must be > than length of list length (long list)" - ); - - bytes1 firstByteOfContent; - assembly { - firstByteOfContent := and(mload(add(ptr, 1)), shl(248, 0xff)) - } - - require( - firstByteOfContent != 0x00, - "RLPReader: length of content must not have any leading zeros (long list)" - ); - - uint256 listLen; - assembly { - listLen := shr(sub(256, mul(8, lenOfListLen)), mload(add(ptr, 1))) - } - - require( - listLen > 55, - "RLPReader: length of content must be greater than 55 bytes (long list)" - ); - - require( - _in.length > lenOfListLen + listLen, - "RLPReader: length of content must be greater than total length (long list)" - ); - - return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM); - } - } - - /// @notice Copies the bytes from a memory location. - /// @param _src Pointer to the location to read from. - /// @param _offset Offset to start reading from. - /// @param _length Number of bytes to read. - /// @return out_ Copied bytes. - function _copy( - MemoryPointer _src, - uint256 _offset, - uint256 _length - ) - private - pure - returns (bytes memory out_) - { - out_ = new bytes(_length); - if (_length == 0) { - return out_; - } - - // Mostly based on Solidity's copy_memory_to_memory: - // solhint-disable max-line-length - // https://github.com/ethereum/solidity/blob/34dd30d71b4da730488be72ff6af7083cf2a91f6/libsolidity/codegen/YulUtilFunctions.cpp#L102-L114 - uint256 src = MemoryPointer.unwrap(_src) + _offset; - assembly { - let dest := add(out_, 32) - let i := 0 - for { } lt(i, _length) { i := add(i, 32) } { mstore(add(dest, i), mload(add(src, i))) } - - if gt(i, _length) { mstore(add(dest, _length), 0) } - } - } -} diff --git a/packages/protocol/contracts/thirdparty/optimism/rlp/RLPWriter.sol b/packages/protocol/contracts/thirdparty/optimism/rlp/RLPWriter.sol deleted file mode 100644 index f6eb0bf54a1..00000000000 --- a/packages/protocol/contracts/thirdparty/optimism/rlp/RLPWriter.sol +++ /dev/null @@ -1,70 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.24; - -/// @custom:attribution https://github.com/bakaoh/solidity-rlp-encode -/// @title RLPWriter -/// @author RLPWriter is a library for encoding Solidity types to RLP bytes. Adapted from Bakaoh's -/// RLPEncode library (https://github.com/bakaoh/solidity-rlp-encode) with minor -/// modifications to improve legibility. (A shout-out to Optimism !) -library RLPWriter { - /// @notice RLP encodes a byte string. - /// @param _in The byte string to encode. - /// @return out_ The RLP encoded string in bytes. - function writeBytes(bytes memory _in) internal pure returns (bytes memory out_) { - if (_in.length == 1 && uint8(_in[0]) < 128) { - out_ = _in; - } else { - out_ = abi.encodePacked(_writeLength(_in.length, 128), _in); - } - } - - /// @notice RLP encodes a uint. - /// @param _in The uint256 to encode. - /// @return out_ The RLP encoded uint256 in bytes. - function writeUint(uint256 _in) internal pure returns (bytes memory out_) { - out_ = writeBytes(_toBinary(_in)); - } - - /// @notice Encode the first byte and then the `len` in binary form if `length` is more than 55. - /// @param _len The length of the string or the payload. - /// @param _offset 128 if item is string, 192 if item is list. - /// @return out_ RLP encoded bytes. - function _writeLength(uint256 _len, uint256 _offset) private pure returns (bytes memory out_) { - if (_len < 56) { - out_ = new bytes(1); - out_[0] = bytes1(uint8(_len) + uint8(_offset)); - } else { - uint256 lenLen; - uint256 i = 1; - while (_len / i != 0) { - lenLen++; - i *= 256; - } - - out_ = new bytes(lenLen + 1); - out_[0] = bytes1(uint8(lenLen) + uint8(_offset) + 55); - for (i = 1; i <= lenLen; i++) { - out_[i] = bytes1(uint8((_len / (256 ** (lenLen - i))) % 256)); - } - } - } - - /// @notice Encode integer in big endian binary form with no leading zeroes. - /// @param _x The integer to encode. - /// @return out_ RLP encoded bytes. - function _toBinary(uint256 _x) private pure returns (bytes memory out_) { - bytes memory b = abi.encodePacked(_x); - - uint256 i = 0; - for (; i < 32; i++) { - if (b[i] != 0) { - break; - } - } - - out_ = new bytes(32 - i); - for (uint256 j = 0; j < out_.length; j++) { - out_[j] = b[i++]; - } - } -} diff --git a/packages/protocol/contracts/thirdparty/optimism/trie/MerkleTrie.sol b/packages/protocol/contracts/thirdparty/optimism/trie/MerkleTrie.sol deleted file mode 100644 index 3b883d0185e..00000000000 --- a/packages/protocol/contracts/thirdparty/optimism/trie/MerkleTrie.sol +++ /dev/null @@ -1,247 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.24; - -import { Bytes } from "../Bytes.sol"; -import { RLPReader } from "../rlp/RLPReader.sol"; - -/// @title MerkleTrie -/// @notice MerkleTrie is a small library for verifying standard Ethereum Merkle-Patricia trie -/// inclusion proofs. By default, this library assumes a hexary trie. One can change the -/// trie radix constant to support other trie radixes. -library MerkleTrie { - /// @notice Struct representing a node in the trie. - /// @custom:field encoded The RLP-encoded node. - /// @custom:field decoded The RLP-decoded node. - struct TrieNode { - bytes encoded; - RLPReader.RLPItem[] decoded; - } - - /// @notice Determines the number of elements per branch node. - uint256 internal constant TREE_RADIX = 16; - - /// @notice Branch nodes have TREE_RADIX elements and one value element. - uint256 internal constant BRANCH_NODE_LENGTH = TREE_RADIX + 1; - - /// @notice Leaf nodes and extension nodes have two elements, a `path` and a `value`. - uint256 internal constant LEAF_OR_EXTENSION_NODE_LENGTH = 2; - - /// @notice Prefix for even-nibbled extension node paths. - uint8 internal constant PREFIX_EXTENSION_EVEN = 0; - - /// @notice Prefix for odd-nibbled extension node paths. - uint8 internal constant PREFIX_EXTENSION_ODD = 1; - - /// @notice Prefix for even-nibbled leaf node paths. - uint8 internal constant PREFIX_LEAF_EVEN = 2; - - /// @notice Prefix for odd-nibbled leaf node paths. - uint8 internal constant PREFIX_LEAF_ODD = 3; - - /// @notice Verifies a proof that a given key/value pair is present in the trie. - /// @param _key Key of the node to search for, as a hex string. - /// @param _value Value of the node to search for, as a hex string. - /// @param _proof Merkle trie inclusion proof for the desired node. Unlike traditional Merkle - /// trees, this proof is executed top-down and consists of a list of RLP-encoded - /// nodes that make a path down to the target node. - /// @param _root Known root of the Merkle trie. Used to verify that the included proof is - /// correctly constructed. - /// @return valid_ Whether or not the proof is valid. - function verifyInclusionProof( - bytes memory _key, - bytes memory _value, - bytes[] memory _proof, - bytes32 _root - ) - internal - pure - returns (bool valid_) - { - valid_ = Bytes.equal(_value, get(_key, _proof, _root)); - } - - /// @notice Retrieves the value associated with a given key. - /// @param _key Key to search for, as hex bytes. - /// @param _proof Merkle trie inclusion proof for the key. - /// @param _root Known root of the Merkle trie. - /// @return value_ Value of the key if it exists. - function get( - bytes memory _key, - bytes[] memory _proof, - bytes32 _root - ) - internal - pure - returns (bytes memory value_) - { - require(_key.length > 0, "MerkleTrie: empty key"); - - TrieNode[] memory proof = _parseProof(_proof); - bytes memory key = Bytes.toNibbles(_key); - bytes memory currentNodeID = abi.encodePacked(_root); - uint256 currentKeyIndex = 0; - - // Proof is top-down, so we start at the first element (root). - for (uint256 i = 0; i < proof.length; i++) { - TrieNode memory currentNode = proof[i]; - - // Key index should never exceed total key length or we'll be out of bounds. - require(currentKeyIndex <= key.length, "MerkleTrie: key index exceeds total key length"); - - if (currentKeyIndex == 0) { - // First proof element is always the root node. - require( - Bytes.equal(abi.encodePacked(keccak256(currentNode.encoded)), currentNodeID), - "MerkleTrie: invalid root hash" - ); - } else if (currentNode.encoded.length >= 32) { - // Nodes 32 bytes or larger are hashed inside branch nodes. - require( - Bytes.equal(abi.encodePacked(keccak256(currentNode.encoded)), currentNodeID), - "MerkleTrie: invalid large internal hash" - ); - } else { - // Nodes smaller than 32 bytes aren't hashed. - require( - Bytes.equal(currentNode.encoded, currentNodeID), - "MerkleTrie: invalid internal node hash" - ); - } - - if (currentNode.decoded.length == BRANCH_NODE_LENGTH) { - if (currentKeyIndex == key.length) { - // Value is the last element of the decoded list (for branch nodes). There's - // some ambiguity in the Merkle trie specification because bytes(0) is a - // valid value to place into the trie, but for branch nodes bytes(0) can exist - // even when the value wasn't explicitly placed there. Geth treats a value of - // bytes(0) as "key does not exist" and so we do the same. - value_ = RLPReader.readBytes(currentNode.decoded[TREE_RADIX]); - require( - value_.length > 0, - "MerkleTrie: value length must be greater than zero (branch)" - ); - - // Extra proof elements are not allowed. - require( - i == proof.length - 1, - "MerkleTrie: value node must be last node in proof (branch)" - ); - - return value_; - } else { - // We're not at the end of the key yet. - // Figure out what the next node ID should be and continue. - uint8 branchKey = uint8(key[currentKeyIndex]); - RLPReader.RLPItem memory nextNode = currentNode.decoded[branchKey]; - currentNodeID = _getNodeID(nextNode); - currentKeyIndex += 1; - } - } else if (currentNode.decoded.length == LEAF_OR_EXTENSION_NODE_LENGTH) { - bytes memory path = _getNodePath(currentNode); - uint8 prefix = uint8(path[0]); - uint8 offset = 2 - (prefix % 2); - bytes memory pathRemainder = Bytes.slice(path, offset); - bytes memory keyRemainder = Bytes.slice(key, currentKeyIndex); - uint256 sharedNibbleLength = _getSharedNibbleLength(pathRemainder, keyRemainder); - - // Whether this is a leaf node or an extension node, the path remainder MUST be a - // prefix of the key remainder (or be equal to the key remainder) or the proof is - // considered invalid. - require( - pathRemainder.length == sharedNibbleLength, - "MerkleTrie: path remainder must share all nibbles with key" - ); - - if (prefix == PREFIX_LEAF_EVEN || prefix == PREFIX_LEAF_ODD) { - // Prefix of 2 or 3 means this is a leaf node. For the leaf node to be valid, - // the key remainder must be exactly equal to the path remainder. We already - // did the necessary byte comparison, so it's more efficient here to check that - // the key remainder length equals the shared nibble length, which implies - // equality with the path remainder (since we already did the same check with - // the path remainder and the shared nibble length). - require( - keyRemainder.length == sharedNibbleLength, - "MerkleTrie: key remainder must be identical to path remainder" - ); - - // Our Merkle Trie is designed specifically for the purposes of the Ethereum - // state trie. Empty values are not allowed in the state trie, so we can safely - // say that if the value is empty, the key should not exist and the proof is - // invalid. - value_ = RLPReader.readBytes(currentNode.decoded[1]); - require( - value_.length > 0, - "MerkleTrie: value length must be greater than zero (leaf)" - ); - - // Extra proof elements are not allowed. - require( - i == proof.length - 1, - "MerkleTrie: value node must be last node in proof (leaf)" - ); - - return value_; - } else if (prefix == PREFIX_EXTENSION_EVEN || prefix == PREFIX_EXTENSION_ODD) { - // Prefix of 0 or 1 means this is an extension node. We move onto the next node - // in the proof and increment the key index by the length of the path remainder - // which is equal to the shared nibble length. - currentNodeID = _getNodeID(currentNode.decoded[1]); - currentKeyIndex += sharedNibbleLength; - } else { - revert("MerkleTrie: received a node with an unknown prefix"); - } - } else { - revert("MerkleTrie: received an unparseable node"); - } - } - - revert("MerkleTrie: ran out of proof elements"); - } - - /// @notice Parses an array of proof elements into a new array that contains both the original - /// encoded element and the RLP-decoded element. - /// @param _proof Array of proof elements to parse. - /// @return proof_ Proof parsed into easily accessible structs. - function _parseProof(bytes[] memory _proof) private pure returns (TrieNode[] memory proof_) { - uint256 length = _proof.length; - proof_ = new TrieNode[](length); - for (uint256 i = 0; i < length; ++i) { - proof_[i] = TrieNode({ encoded: _proof[i], decoded: RLPReader.readList(_proof[i]) }); - } - } - - /// @notice Picks out the ID for a node. Node ID is referred to as the "hash" within the - /// specification, but nodes < 32 bytes are not actually hashed. - /// @param _node Node to pull an ID for. - /// @return id_ ID for the node, depending on the size of its contents. - function _getNodeID(RLPReader.RLPItem memory _node) private pure returns (bytes memory id_) { - id_ = _node.length < 32 ? RLPReader.readRawBytes(_node) : RLPReader.readBytes(_node); - } - - /// @notice Gets the path for a leaf or extension node. - /// @param _node Node to get a path for. - /// @return nibbles_ Node path, converted to an array of nibbles. - function _getNodePath(TrieNode memory _node) private pure returns (bytes memory nibbles_) { - nibbles_ = Bytes.toNibbles(RLPReader.readBytes(_node.decoded[0])); - } - - /// @notice Utility; determines the number of nibbles shared between two nibble arrays. - /// @param _a First nibble array. - /// @param _b Second nibble array. - /// @return shared_ Number of shared nibbles. - function _getSharedNibbleLength( - bytes memory _a, - bytes memory _b - ) - private - pure - returns (uint256 shared_) - { - uint256 max = (_a.length < _b.length) ? _a.length : _b.length; - for (; shared_ < max && _a[shared_] == _b[shared_];) { - unchecked { - ++shared_; - } - } - } -} diff --git a/packages/protocol/contracts/thirdparty/optimism/trie/SecureMerkleTrie.sol b/packages/protocol/contracts/thirdparty/optimism/trie/SecureMerkleTrie.sol deleted file mode 100644 index 01808436903..00000000000 --- a/packages/protocol/contracts/thirdparty/optimism/trie/SecureMerkleTrie.sol +++ /dev/null @@ -1,57 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.24; - -import { MerkleTrie } from "./MerkleTrie.sol"; - -/// @title SecureMerkleTrie -/// @notice SecureMerkleTrie is a thin wrapper around the MerkleTrie library that hashes the input -/// keys. Ethereum's state trie hashes input keys before storing them. -library SecureMerkleTrie { - /// @notice Verifies a proof that a given key/value pair is present in the Merkle trie. - /// @param _key Key of the node to search for, as a hex string. - /// @param _value Value of the node to search for, as a hex string. - /// @param _proof Merkle trie inclusion proof for the desired node. Unlike traditional Merkle - /// trees, this proof is executed top-down and consists of a list of RLP-encoded - /// nodes that make a path down to the target node. - /// @param _root Known root of the Merkle trie. Used to verify that the included proof is - /// correctly constructed. - /// @return valid_ Whether or not the proof is valid. - function verifyInclusionProof( - bytes memory _key, - bytes memory _value, - bytes[] memory _proof, - bytes32 _root - ) - internal - pure - returns (bool valid_) - { - bytes memory key = _getSecureKey(_key); - valid_ = MerkleTrie.verifyInclusionProof(key, _value, _proof, _root); - } - - /// @notice Retrieves the value associated with a given key. - /// @param _key Key to search for, as hex bytes. - /// @param _proof Merkle trie inclusion proof for the key. - /// @param _root Known root of the Merkle trie. - /// @return value_ Value of the key if it exists. - function get( - bytes memory _key, - bytes[] memory _proof, - bytes32 _root - ) - internal - pure - returns (bytes memory value_) - { - bytes memory key = _getSecureKey(_key); - value_ = MerkleTrie.get(key, _proof, _root); - } - - /// @notice Computes the hashed version of the input key. - /// @param _key Key to hash. - /// @return hash_ Hashed version of the key. - function _getSecureKey(bytes memory _key) private pure returns (bytes memory hash_) { - hash_ = abi.encodePacked(keccak256(_key)); - } -} diff --git a/packages/protocol/contracts/thirdparty/risczero/IRiscZeroReceiptVerifier.sol b/packages/protocol/contracts/thirdparty/risczero/IRiscZeroReceiptVerifier.sol deleted file mode 100644 index 841b1c99423..00000000000 --- a/packages/protocol/contracts/thirdparty/risczero/IRiscZeroReceiptVerifier.sol +++ /dev/null @@ -1,27 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.24; - -/// @notice Verifier interface for RISC Zero receipts of execution. -/// https://github.com/risc0/risc0-ethereum/blob/release-0.7/contracts/src/IRiscZeroVerifier.sol -interface IRiscZeroReceiptVerifier { - /// @notice Verify that the given seal is a valid RISC Zero proof of execution with the - /// given image ID, post-state digest, and journal digest. - /// @dev This method additionally ensures that the input hash is all-zeros (i.e. no - /// committed input), the exit code is (Halted, 0), and there are no assumptions (i.e. the - /// receipt is unconditional). - /// @param seal The encoded cryptographic proof (i.e. SNARK). - /// @param imageId The identifier for the guest program. - /// @param postStateDigest A hash of the final memory state. Required to run the verifier, but - /// otherwise can be left unconstrained for most use cases. - /// @param journalDigest The SHA-256 digest of the journal bytes. - /// @return true if the receipt passes the verification checks. The return code must be checked. - function verify( - bytes calldata seal, - bytes32 imageId, - bytes32 postStateDigest, - bytes32 journalDigest - ) - external - view - returns (bool); -} diff --git a/packages/protocol/contracts/thirdparty/solmate/LibFixedPointMath.sol b/packages/protocol/contracts/thirdparty/solmate/LibFixedPointMath.sol deleted file mode 100644 index 2ad599363c2..00000000000 --- a/packages/protocol/contracts/thirdparty/solmate/LibFixedPointMath.sol +++ /dev/null @@ -1,82 +0,0 @@ -// SPDX-License-Identifier: MIT -// Taken from the contract below, expWad() function tailored to Taiko's need -// https://github.com/transmissions11/solmate/blob/v7/src/utils/FixedPointMathLib.sol -pragma solidity 0.8.24; - -library LibFixedPointMath { - uint128 public constant MAX_EXP_INPUT = 135_305_999_368_893_231_588; - uint256 public constant SCALING_FACTOR = 1e18; // For fixed point representation factor - - error Overflow(); - - // Computes e^x in 1e18 fixed point. - function exp(int256 x) internal pure returns (int256 r) { - unchecked { - // Input x is in fixed point format, with scale factor 1/1e18. - - // When the result is < 0.5 we return zero. This happens when - // x <= floor(log(0.5e18) * 1e18) ~ -42e18 - if (x <= -42_139_678_854_452_767_551) { - return 0; - } - - // When the result is > (2**255 - 1) / 1e18 we can not represent it - // as an int256. This happens when x >= floor(log((2**255 -1) / - // 1e18) * 1e18) ~ 135. - if (x >= 135_305_999_368_893_231_589) revert Overflow(); - - // x is now in the range (-42, 136) * 1e18. Convert to (-42, 136) * - // 2**96 - // for more intermediate precision and a binary basis. This base - // conversion - // is a multiplication by 1e18 / 2**96 = 5**18 / 2**78. - x = (x << 78) / 5 ** 18; - - // Reduce range of x to (-½ ln 2, ½ ln 2) * 2**96 by factoring out - // powers of two - // such that exp(x) = exp(x') * 2**k, where k is an integer. - // Solving this gives k = round(x / log(2)) and x' = x - k * log(2). - int256 k = ((x << 96) / 54_916_777_467_707_473_351_141_471_128 + 2 ** 95) >> 96; - x = x - k * 54_916_777_467_707_473_351_141_471_128; - // k is in the range [-61, 195]. - - // Evaluate using a (6, 7)-term rational approximation. - // p is made monic, we'll multiply by a scale factor later. - int256 y = x + 1_346_386_616_545_796_478_920_950_773_328; - y = ((y * x) >> 96) + 57_155_421_227_552_351_082_224_309_758_442; - int256 p = y + x - 94_201_549_194_550_492_254_356_042_504_812; - p = ((p * y) >> 96) + 28_719_021_644_029_726_153_956_944_680_412_240; - p = p * x + (4_385_272_521_454_847_904_659_076_985_693_276 << 96); - - // We leave p in 2**192 basis so we don't need to scale it back up - // for the division. - int256 q = x - 2_855_989_394_907_223_263_936_484_059_900; - q = ((q * x) >> 96) + 50_020_603_652_535_783_019_961_831_881_945; - q = ((q * x) >> 96) - 533_845_033_583_426_703_283_633_433_725_380; - q = ((q * x) >> 96) + 3_604_857_256_930_695_427_073_651_918_091_429; - q = ((q * x) >> 96) - 14_423_608_567_350_463_180_887_372_962_807_573; - q = ((q * x) >> 96) + 26_449_188_498_355_588_339_934_803_723_976_023; - assembly { - // Div in assembly because solidity adds a zero check despite - // the `unchecked`. - // The q polynomial is known not to have zeros in the domain. - // (All roots are complex) - // No scaling required because p is already 2**96 too large. - r := sdiv(p, q) - } - // r should be in the range (0.09, 0.25) * 2**96. - - // We now need to multiply r by - // * the scale factor s = ~6.031367120..., - // * the 2**k factor from the range reduction, and - // * the 1e18 / 2**96 factor for base conversion. - // We do all of this at once, with an intermediate result in 2**213 - // basis - // so the final right shift is always by a positive amount. - r = int256( - (uint256(r) * 3_822_833_074_963_236_453_042_738_258_902_158_003_155_416_615_667) - >> uint256(195 - k) - ); - } - } -} diff --git a/packages/protocol/contracts/verifiers/RiscZeroVerifier.sol b/packages/protocol/contracts/verifiers/RiscZeroVerifier.sol deleted file mode 100644 index 5e299802122..00000000000 --- a/packages/protocol/contracts/verifiers/RiscZeroVerifier.sol +++ /dev/null @@ -1,87 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.24; - -import "../common/EssentialContract.sol"; -import "../common/LibStrings.sol"; -import "../thirdparty/risczero/IRiscZeroReceiptVerifier.sol"; -import "../L1/ITaikoL1.sol"; -import "./IVerifier.sol"; -import "./libs/LibPublicInput.sol"; - -/// @title RiscZeroVerifier -/// @custom:security-contact security@taiko.xyz -contract RiscZeroVerifier is EssentialContract, IVerifier { - /// @notice RISC Zero remote verifier contract address, e.g.: - /// https://sepolia.etherscan.io/address/0x83c2e9cd64b2a16d3908e94c7654f3864212e2f8 - IRiscZeroReceiptVerifier public receiptVerifier; - /// @notice Trusted imageId mapping - mapping(bytes32 imageId => bool trusted) public isImageTrusted; - - uint256[48] private __gap; - - /// @dev Emitted when a trusted image is set / unset. - /// @param imageId The id of the image - /// @param trusted True if trusted, false otherwise - event ImageTrusted(bytes32 imageId, bool trusted); - - error RISC_ZERO_INVALID_IMAGE_ID(); - error RISC_ZERO_INVALID_PROOF(); - - /// @notice Initializes the contract with the provided address manager. - /// @param _owner The address of the owner. - /// @param _addressManager The address of the AddressManager. - /// @param _receiptVerifier The address of the risc zero receipt verifier contract. - function init( - address _owner, - address _addressManager, - address _receiptVerifier - ) - external - initializer - { - __Essential_init(_owner, _addressManager); - receiptVerifier = IRiscZeroReceiptVerifier(_receiptVerifier); - } - - /// @notice Sets/unsets an the imageId as trusted entity - /// @param _imageId The id of the image. - /// @param _trusted True if trusted, false otherwise. - function setImageIdTrusted(bytes32 _imageId, bool _trusted) external onlyOwner { - isImageTrusted[_imageId] = _trusted; - - emit ImageTrusted(_imageId, _trusted); - } - - /// @inheritdoc IVerifier - function verifyProof( - Context calldata _ctx, - TaikoData.Transition calldata _tran, - TaikoData.TierProof calldata _proof - ) - external - view - { - // Do not run proof verification to contest an existing proof - if (_ctx.isContesting) return; - - // Decode will throw if not proper length/encoding - (bytes memory seal, bytes32 imageId, bytes32 postStateDigest) = - abi.decode(_proof.data, (bytes, bytes32, bytes32)); - - if (!isImageTrusted[imageId]) { - revert RISC_ZERO_INVALID_IMAGE_ID(); - } - - uint64 chainId = ITaikoL1(resolve(LibStrings.B_TAIKO, false)).getConfig().chainId; - bytes32 hash = LibPublicInput.hashPublicInputs( - _tran, address(this), address(0), _ctx.prover, _ctx.metaHash, chainId - ); - - // journalDigest is the sha256 hash of the hashed public input - bytes32 journalDigest = sha256(bytes.concat(hash)); - - if (!receiptVerifier.verify(seal, imageId, postStateDigest, journalDigest)) { - revert RISC_ZERO_INVALID_PROOF(); - } - } -} diff --git a/packages/protocol/deployments/hekla-contract-logs.md b/packages/protocol/deployments/hekla-contract-logs.md index 4ec92a0750b..70c11e98d8e 100644 --- a/packages/protocol/deployments/hekla-contract-logs.md +++ b/packages/protocol/deployments/hekla-contract-logs.md @@ -9,64 +9,84 @@ ### shared_address_manager - proxy: `0x7D3338FD5e654CAC5B10028088624CA1D64e74f7` -- impl: `0x1B71F7014DB583Dc354d97608FAFe81e1a611c03` -- owner: `0x13cfc60c900a927C48f5c2a4923Ec9771a3A2805` +- impl: `0xAcA2a9f774e540CF592c07bBaAC9Ebae40e7C175` +- owner: `0x1D2D1bb9D180541E88a6a682aCf3f61c1605B190` - logs: - upgraded on May 10, 2024 at commit `4903bec` + - upgraded on Jun 10, 2024 at commit `d5965bb` + - transferred ownership on Jul 8, 2024 + - upgraded on Sep 20, 2024 at commit `fd1c039` + - upgraded on Oct 29, 2024 at commit `3d12cb2` ### taiko_token - proxy: `0x6490E12d480549D333499236fF2Ba6676C296011` -- impl: `0x087f33bf5141033bbf7a2acef5d8fadce9204eca` -- owner: `0x13cfc60c900a927C48f5c2a4923Ec9771a3A2805` +- impl: `0xD826bb700EAEdD6E83C32681f95a35Ac7F290104` +- owner: `0x1D2D1bb9D180541E88a6a682aCf3f61c1605B190` - logs: - deployed on Mar 29, 2024 at commit `b341a68d5` + - upgraded on Jun 18, 2024, added `batchTransfer` method. + - transferred ownership on Jul 8, 2024 + - upgraded on Dec 16, 2024 at commit `ccc9500` ### signal_service - proxy: `0x6Fc2fe9D9dd0251ec5E0727e826Afbb0Db2CBe0D` -- impl: `0x7c20d41c2573A1225B361A3B2F667fe1F021A83B` -- owner: `0x13cfc60c900a927C48f5c2a4923Ec9771a3A2805` +- impl: `0xE6371B30e500ff38ec809a652fdFE98174011B2D` +- owner: `0x1D2D1bb9D180541E88a6a682aCf3f61c1605B190` - logs: - upgraded on May 10, 2024 at commit `4903bec` + - upgraded on Jun 10, 2024 at commit `d5965bb` + - transferred ownership on Jul 8, 2024 ### bridge - proxy: `0xA098b76a3Dd499D3F6D58D8AcCaFC8efBFd06807` -- impl: `0x74baa4826B22F7746EfEeCEc178FFbb77A2567C3` -- owner: `0x13cfc60c900a927C48f5c2a4923Ec9771a3A2805` +- impl: `0xE3d424D6D752dBcc6e19Dfd6755D518118f3d93b` +- owner: `0x1D2D1bb9D180541E88a6a682aCf3f61c1605B190` - logs: - upgraded on May 10, 2024 at commit `4903bec` + - upgraded on Jun 10, 2024 at commit `d5965bb` + - transferred ownership on Jul 8, 2024 + - upgraded on Sep 20, 2024 at commit `fd1c039` + - upgraded on Oct 29, 2024 at commit `3d12cb2` ### erc20_vault - proxy: `0x2259662ed5dE0E09943Abe701bc5f5a108eABBAa` -- impl: `0xbE1101ED567020581127Ad065461c69c2C3A6115` -- owner: `0x13cfc60c900a927C48f5c2a4923Ec9771a3A2805` +- impl: `0x1bf437b2f6e5959fe167210Ee2221ADa09a66846` +- owner: `0x1D2D1bb9D180541E88a6a682aCf3f61c1605B190` - logs: - upgraded on May 10, 2024 at commit `4903bec` + - upgraded on Jun 10, 2024 at commit `d5965bb` + - transferred ownership on Jul 8, 2024 ### erc721_vault - proxy: `0x046b82D9010b534c716742BE98ac3FEf3f2EC99f` -- impl: `0xBEBD9B63dED7eC68F00f98495b60FC5eEE7f154E` -- owner: `0x13cfc60c900a927C48f5c2a4923Ec9771a3A2805` +- impl: `0x06467bab46598b887240044309A6ffE261A0E2e3` +- owner: `0x1D2D1bb9D180541E88a6a682aCf3f61c1605B190` - logs: - upgraded on May 10, 2024 at commit `4903bec` + - upgraded on Jun 10, 2024 at commit `d5965bb` + - transferred ownership on Jul 8, 2024 ### erc1155_vault - proxy: `0x9Ae5945Ab34f6182F75E16B73e037421F341fEe3` -- impl: `0xE1A60fD257De1A304a5b5d1EfDa38aFe52c0f910` -- owner: `0x13cfc60c900a927C48f5c2a4923Ec9771a3A2805` +- impl: `0xBFCff65554d6e89A1aC280eE1E9f87764124B833` +- owner: `0x1D2D1bb9D180541E88a6a682aCf3f61c1605B190` - logs: - upgraded on May 10, 2024 at commit `4903bec` + - upgraded on Jun 10, 2024 at commit `d5965bb` + - transferred ownership on Jul 8, 2024 ### bridged_erc20 -- impl: `0x2E062eA9f7f2D777eb67a32710BFDcE42c655B18` +- impl: `0xe3661857941E4A711fa6b4Fc080bC5c5948a70f1` - logs: - deployed on May 10, 2024 at commit `4903bec` + - deployed on Jul 25, 2024 at commit `3d89d24` ### bridged_erc721 @@ -83,128 +103,251 @@ ### rollup_address_manager - proxy: `0x1F027871F286Cf4B7F898B21298E7B3e090a8403` -- impl: `0xDd39Ad18E6B8A2696394C310D5F95700dB643D27` -- owner: `0x13cfc60c900a927C48f5c2a4923Ec9771a3A2805` +- impl: `0x97Ece9dC33e8442ED6e61aA378bf3FdC7dF17213` +- owner: `0x1D2D1bb9D180541E88a6a682aCf3f61c1605B190` - logs: - upgraded on May 10, 2024 at commit `13ad99d` + - upgraded on Jun 10, 2024 at commit `d5965bb` + - transferred ownership on Jul 8, 2024 + - upgraded on Sep 20, 2024 at commit `fd1c039` + - upgraded on Oct 29, 2024 at commit `3d12cb2` ### taikoL1 - proxy: `0x79C9109b764609df928d16fC4a91e9081F7e87DB` -- impl: `0x168FEe80cD2Cc496b504A0844aBB4eA9ec32f787` -- owner: `0x13cfc60c900a927C48f5c2a4923Ec9771a3A2805` +- impl: `0x833958CF23DAA9F19Ab418BCA114C2842819284A` +- owner: `0x1D2D1bb9D180541E88a6a682aCf3f61c1605B190` - logs: - upgraded on May 10, 2024 at commit `4903bec` + - upgraded on Jun 10, 2024 at [PR #17532](https://github.com/taikoxyz/taiko-mono/pull/17532) + - upgraded on Jun 12, 2024 at commit `07b073d` + - upgraded on Jun 12, 2024 at [PR #17553](https://github.com/taikoxyz/taiko-mono/pull/17553) + - upgraded on Jun 14, 2024 at [PR #17553](https://github.com/taikoxyz/taiko-mono/pull/17553) @commit `baed5b5` + - upgraded on Jun 19, 2024 at commit `b7e12e3` + - upgraded on Jun 20, 2024 at commit `6e07ab5` + - transferred ownership on Jul 8, 2024 + - upgraded on Jul 11, 2024 at [PR #17779](https://github.com/taikoxyz/taiko-mono/pull/17779) + - upgraded on Jul 15, 2024 at commit `45281b8` + - upgraded on Aug 15, 2024 at `protocol-v1.8.0` with [#17919](https://github.com/taikoxyz/taiko-mono/pull/17919) + - upgraded on Sep 20, 2024 at commit `fd1c039` + - upgraded on Oct 16, 2024 at commit `233806e` + - upgraded on Oct 29, 2024 at commit `3d12cb2` + - upgraded on Nov 3, 2024 at commit `ea0158f` ### assignmentHook - proxy: `0x9e640a6aadf4f664CF467B795c31332f44AcBe6c` -- impl: `0xA35ed4FAD13C038C05aC4c8FD3353B3d90d15ea5` -- owner: `0x13cfc60c900a927C48f5c2a4923Ec9771a3A2805` +- impl: `0xfcb5B945dbd08AfdB08e6C358193B23b0E6eFa23` +- owner: `0x1D2D1bb9D180541E88a6a682aCf3f61c1605B190` - logs: - upgraded on May 10, 2024 at commit `4903bec` + - upgraded on Jun 12, 2024 at commit `04bb81e` + - transferred ownership on Jul 8, 2024 ### tierProvider -- impl: `0x750D885DCAB712bA808D66D934CF315D0D98d04c.` +- impl: `0x9AaBba3Ae6D4aC3F5487608Da81006454e7933d3` - logs: - upgraded on May 14, 2024 at commit `0ef7b8caa` + - upgraded on Jun 14, 2024 at commit `cc10b04` + - upgraded on Jun 19, 2024 at commit `b7e12e3` + - upgraded on Aug 15, 2024 at commit `05d49b0` -### guardian_prover_minority +### tierRouter -- proxy: `` -- impl: `` -- owner: `0x13cfc60c900a927C48f5c2a4923Ec9771a3A2805` +- impl: `0x6A666F2C56a6559dB0BD8866Bd0c0dDB9ec03c66` - logs: - - upgraded on May 10, 2024 at commit `4903bec` + - deployed on Jun 10, 2024 at commit `d5965bb` + - upgraded on Jun 14, 2024 at commit `cc10b04` + - upgraded on Jun 19, 2024 at commit `b7e12e3` + - upgraded on Aug 15, 2024 at commit `05d49b0` + - upgraded on Sep 02, 2024 at commit `9dae5c8` + - upgraded on Oct 24, 2024 at commit `78f9ac0` + - upgraded on Oct 30, 2024 at commit `63455f9` + - upgraded on Nov 4, 2024 at commit `90b2693` + - upgraded on Nov 4, 2024 at commit `8e00612` + +### prover_set + +- proxy: `0xD3f681bD6B49887A48cC9C9953720903967E9DC0` +- impl: `0x7840556da7E6E74C01a8334a9e6a6d3F4Ae094A0.` +- owner: `0x1D2D1bb9D180541E88a6a682aCf3f61c1605B190` +- logs: + - deployed on Jun 17, 2024 at commit `b7e12e3` + - upgraded on Jul 11, 2024 at commit `30631a9` + - upgraded on Sep 20, 2024 at commit `fd1c039` + - upgraded on Oct 29, 2024 at commit `3d12cb2` + +### prover_set_contester + +- proxy: `0x335103c4fa2F55451975082136F1478eCFeB84B9` +- impl: `0x93Df4e369fb916ccc78e94e85017d18e367ba9B5.` +- owner: `0x1D2D1bb9D180541E88a6a682aCf3f61c1605B190` +- logs: + - deployed on Jun 21, 2024 at commit `099ce22` + - upgraded on Jul 11, 2024 at commit `30631a9` + - upgraded on Sep 20, 2024 at commit `fd1c039` + - upgraded on Oct 29, 2024 at commit `3d12cb2` ### guardian_prover - proxy: `0x92F195a8702da2104aE8E3E10779176E7C35d6BC` -- impl: `0x3D351Ab46F79805e579E24E5cD94362758a99eb5` -- owner: `0x13cfc60c900a927C48f5c2a4923Ec9771a3A2805` +- impl: `0x426A2DA100727d8f3e89252Ba125acbd0e048aDe` +- owner: `0x1D2D1bb9D180541E88a6a682aCf3f61c1605B190` - logs: - upgraded on May 10, 2024 at commit `4903bec` + - upgraded on Jun 10, 2024 at commit `d5965bb` + - transferred ownership on Jul 8, 2024 + - upgraded on Sep 20, 2024 at commit `fd1c039` + - upgraded on Oct 29, 2024 at commit `3d12cb2` ### guardian_minority - proxy: `0x31d4d27da5c299d4b6CE19c869B8891C0002795d` -- impl: `0x22DC7e70B810822EB8DdDDb341021c252f480f2D` -- owner: `0x13cfc60c900a927C48f5c2a4923Ec9771a3A2805` +- impl: `0x8ACaB96A6e8bf611E21A6eA332C6509c8d0b699f` +- owner: `0x1D2D1bb9D180541E88a6a682aCf3f61c1605B190` - logs: - deployed on May 20, 2024 at commit `6e56475` + - upgraded on Jun 10, 2024 at commit `d5965bb` + - transferred ownership on Jul 8, 2024 + - upgraded on Sep 20, 2024 at commit `fd1c039` + - upgraded on Oct 29, 2024 at commit `3d12cb2` + +### tier_sgx + +- proxy : 0x532EFBf6D62720D0B2a2Bb9d11066E8588cAE6D9 +- impl : 0x3c1b6b0F179dab0dE5e11C9B2a531C5c693Fd70C +- owner : 0x1D2D1bb9D180541E88a6a682aCf3f61c1605B190 +- logs: + - upgraded on Nov 6, 2024 at commit `0706f0a` + +### risc0_groth16_verifier + +- addr : 0x5fd84014c62D5ea28D4533D5B1B48Ca44e571057 +- logs: + - deployed on August 14, 2024 at commit `cba2a1e` + - upgraded on October 22, 2024 at commit `684a909` + +### tier_zkvm_risc0 + +- proxy : 0x4fEd801C5a876D4289e869cbEfA1E1A448b10714 +- impl : 0xAF9F3B3f9276f24e4143e6247795cf71985C4890 +- owner : 0x1D2D1bb9D180541E88a6a682aCf3f61c1605B190 +- logs: + - deployed on August 14, 2024 at commit `cba2a1e` + - upgraded on Nov 6, 2024 at commit `0706f0a` + +### sp1_plonk_verifier + +- addr : 0xfb2d02219D065eBF3Aa8d2D1a1C52b1868EE7384 +- logs: + - deployed on September 02, 2024 at commit `16ac02e` + - upgraded on September 15, 2024 at commit `6f26434` + - upgraded on October 22, 2024 at commit `684a909` + - upgraded on Nov 8, 2024 at commit `0b11101` + +### tier_zkvm_sp1 + +- proxy : 0xFbE49f777E0078b3Fa0bae6de4794c88d6EA6DDD +- impl : 0xB83b7f7fA8f4e6332769D123b8C973F485aC4bBc. +- owner : 0x1D2D1bb9D180541E88a6a682aCf3f61c1605B190 +- logs: + - deployed on September 02, 2024 at commit `16ac02e` + - upgraded on September 15, 2024 at commit `6f26434` + - upgraded on Nov 6, 2024 at commit `0706f0a` ## L2 Contracts ### bridge - proxy: `0x1670090000000000000000000000000000000001` -- impl: `0x8CC29961a0329D033C6A5fF5Ab915cceB53aEDce` -- owner: `0x1D2D1bb9D180541E88a6a682aCf3f61c1605B190` +- impl: `0x50216f60163ef399E22026fa1300aEa8eebA3462` +- owner: `0x95F6077C7786a58FA070D98043b16DF2B1593D2b` - logs: - upgraded on May 10, 2024 at commit `4903bec` + - upgraded on Jun 10, 2024 at commit `d5965bb` + - upgraded on Sep 20, 2024 at commit `fd1c039` + - upgraded on Oct 29, 2024 at commit `3d12cb2` ### erc20_vault - proxy: `0x1670090000000000000000000000000000000002` -- impl: `0xFefDE79d88264E26fb1fea40f83b8C549d09075E` -- owner: `0x1D2D1bb9D180541E88a6a682aCf3f61c1605B190` +- impl: `0x4A5AE0837cfb6C40c7DaF0885ac6c35e2EE644f1` +- owner: `0x95F6077C7786a58FA070D98043b16DF2B1593D2b` - logs: - upgraded on May 10, 2024 at commit `4903bec` + - upgraded on Jun 10, 2024 at commit `d5965bb` + - upgraded on Aug 26, 2024 at commit `4e08881` ### erc721_vault - proxy: `0x1670090000000000000000000000000000000003` -- impl: `0x598Ee9B7EdbB2A838156823Ae28E2Ca98c0b5BB7` -- owner: `0x1D2D1bb9D180541E88a6a682aCf3f61c1605B190` +- impl: `0x2DdAad1110F2F69238Eb834851437fc05DAb62b9` +- owner: `0x95F6077C7786a58FA070D98043b16DF2B1593D2b` - logs: - upgraded on May 10, 2024 at commit `4903bec` + - upgraded on Jun 10, 2024 at commit `d5965bb` + - upgraded on Aug 26, 2024 at commit `4e08881` ### erc1155_vault - proxy: `0x1670090000000000000000000000000000000004` -- impl: `0x63Ff7f4Fac6275a598DF5d86cC5e1278Db2D7346` -- owner: `0x1D2D1bb9D180541E88a6a682aCf3f61c1605B190` +- impl: `0x58366150b4E1B18dd0D3F043Ba45a9BECb53cd85` +- owner: `0x95F6077C7786a58FA070D98043b16DF2B1593D2b` - logs: - upgraded on May 10, 2024 at commit `4903bec` + - upgraded on Jun 10, 2024 at commit `d5965bb` + - upgraded on Aug 26, 2024 at commit `4e08881` ### signal_service - proxy: `0x1670090000000000000000000000000000000005` -- impl: `0x6EFDeff4E88a24063aAaeF6f50470E3305eCf1Ce` -- owner: `0x1D2D1bb9D180541E88a6a682aCf3f61c1605B190` +- impl: `0x4c70b7F5E153D497faFa0476575903F9299ed811` +- owner: `0x95F6077C7786a58FA070D98043b16DF2B1593D2b` - logs: - upgraded on May 10, 2024 at commit `4903bec` + - upgraded on Jun 10, 2024 at commit `d5965bb` ### shared_address_manager - proxy: `0x1670090000000000000000000000000000000006` -- impl: `0x38969CEc9C1524D81264dE493b18988920C1f74b` -- owner: `0x1D2D1bb9D180541E88a6a682aCf3f61c1605B190` +- impl: `0x1063F4cF9eaAA67B5dc9750d96eC0BD885D10AeE` +- owner: `0x95F6077C7786a58FA070D98043b16DF2B1593D2b` - logs: - upgraded on May 10, 2024 at commit `4903bec` + - upgraded on Jun 10, 2024 at commit `d5965bb` + - upgraded on Sep 20, 2024 at commit `fd1c039` + - upgraded on Oct 29, 2024 at commit `3d12cb2` ### taikoL2 - proxy: `0x1670090000000000000000000000000000010001` -- impl: `0x5b927DF807f84D6A993BD04f6EC0C17f7fa4cEFb` -- owner: `0x1D2D1bb9D180541E88a6a682aCf3f61c1605B190` +- impl: `0x637B1e6E71007d033B5d4385179037C90665A203` +- owner: `0x95F6077C7786a58FA070D98043b16DF2B1593D2b` - logs: - upgraded on May 10, 2024 at commit `4903bec` + - upgraded on Jun 10, 2024 at commit `d5965bb` + - upgraded on Sep 20, 2024 at commit `fd1c039` + - upgraded on Oct 29, 2024 at commit `3d12cb2` ### rollup_address_manager - proxy: `0x1670090000000000000000000000000000010002` -- impl: `0xF74340b7E8816FA0351be5AF5fDF91b28495B99A` -- owner: `0x1D2D1bb9D180541E88a6a682aCf3f61c1605B190` +- impl: `0x1063F4cF9eaAA67B5dc9750d96eC0BD885D10AeE` +- owner: `0x95F6077C7786a58FA070D98043b16DF2B1593D2b` - logs: - upgraded on May 10, 2024 at commit `4903bec` + - upgraded on Jun 10, 2024 at commit `d5965bb` + - upgraded on Sep 20, 2024 at commit `fd1c039` + - upgraded on Oct 29, 2024 at commit `3d12cb2` ### bridged_erc20 -- impl: `0x62Acda3Ad15B382C32B2fB21BEAc9DfB95bbb02F` +- impl: `0x1BAF1AB3686Ace2fD47E11Ac627F3Cc626aEc0FF` - logs: - deployed on May 10, 2024 at commit `4903bec` + - deployed on Jul 25, 2024 at commit `3d89d24` + - upgraded on Oct 29, 2024 at commit `3d12cb2` ### bridged_erc721 @@ -218,6 +361,11 @@ - logs: - deployed on May 10, 2024 at commit `4903bec` -## Other EOAs/Contracts +### delegate_owner -- Holesky `TimelockController`:`0x13cfc60c900a927C48f5c2a4923Ec9771a3A2805` +- proxy: `0x95F6077C7786a58FA070D98043b16DF2B1593D2b` +- impl: `0x36dD2d50C08Ee22553ef34583B367D86c3D44fBd` +- owner: `0x95F6077C7786a58FA070D98043b16DF2B1593D2b` +- admin: `0x1D2D1bb9D180541E88a6a682aCf3f61c1605B190` +- logs: + - deployed on Aug 15, 2024 at commit `46a3e00` diff --git a/packages/protocol/deployments/mainnet-contract-logs-L1.md b/packages/protocol/deployments/mainnet-contract-logs-L1.md index 9054985c57e..89b083c9496 100644 --- a/packages/protocol/deployments/mainnet-contract-logs-L1.md +++ b/packages/protocol/deployments/mainnet-contract-logs-L1.md @@ -10,7 +10,7 @@ - ens: `sam.based.taiko.eth` - proxy: `0xEf9EaA1dd30a9AA1df01c36411b5F082aA65fBaa` -- impl: `0x9496502d7D121B3D5eF25cA6c58d4f7593398a17` +- impl: `0xEC1a9aa1C648F047752fe4eeDb2C21ceab0c6449` - owner: `admin.taiko.eth` - names: - taiko_token: `0x10dea67478c5F8C5E2D90e5E9B26dBe60c54d800` @@ -24,7 +24,7 @@ - erc721_vault@167000: `0x1670000000000000000000000000000000000003` - erc1155_vault: `0xaf145913EA4a56BE22E120ED9C24589659881702` - erc1155_vault@167000: `0x1670000000000000000000000000000000000004` - - bridged_erc20: `0x79BC0Aada00fcF6E7AB514Bfeb093b5Fae3653e3` + - bridged_erc20: `0x65666141a541423606365123Ed280AB16a09A2e1` - bridged_erc721: `0xC3310905E2BC9Cfb198695B75EF3e5B69C6A1Bf7` - bridged_erc1155: `0x3c90963cFBa436400B0F9C46Aa9224cB379c2c40` - quota_manager: `0x91f67118DD47d502B1f0C354D0611997B022f29E` @@ -35,39 +35,45 @@ - Upgraded from `0x9cA1Ab10c9fAc5153F8b78E67f03aAa69C9c6A15` to `0xF1cA1F1A068468E1dcF90dA6add185467de80943` @commit`b90b932` @tx`0x416560cd96dc75ccffebe889e8d1ab3e08b33f814dc4a2bf7c6f9555071d1f6f` - `Init2()` called @tx`0x7311fee56f87294e336393b55939489bc1e810c402f304013475d04c90ca32a9` - Upgraded from `0xF1cA1F1A068468E1dcF90dA6add185467de80943` to `0x9496502d7D121B3D5eF25cA6c58d4f7593398a17` @commit`e79a367ad` @tx`0xe1ef58455de0b0331228e487d54720290ed8a73f709d2146bd43330d4a360bd3` + - Upgraded from `0x9496502d7D121B3D5eF25cA6c58d4f7593398a17` to `0x2f7126f78365AD54EAB26fD7faEc60435008E2fD` @commit`bb2abc5` @tx`0x7d584f0a645cad61e634f64ffaf7e1bbfb92749878eb25b39ce0e5cf698897c7` + - register `bridged_erc20` to `0x65666141a541423606365123Ed280AB16a09A2e1` @tx`0x0ad38201728e782a04d74c5984efedba4c2c0669c9ce791db2b010efe4f15b1d` + - Upgraded from `0x2f7126f78365AD54EAB26fD7faEc60435008E2fD` to `0xEC1a9aa1C648F047752fe4eeDb2C21ceab0c6449` @commit`9345f14` @tx`0x13ea4d044a313cf667d16514465e6b96227ef7198bda7b19c70eefee44e9bccd` #### taiko_token - ens: `token.taiko.eth` - proxy: `0x10dea67478c5F8C5E2D90e5E9B26dBe60c54d800` -- impl: `0xea53c0f4b129Cf3f3FBA896F9f23ca18246e9B3c` +- impl: `0xcfe803378D79d1180EbF030455040EA6513869dF` - owner: `admin.taiko.eth` - logs: - deployed on April 25, 2024 @commit`2f6d3c62e` - upgraded impl from `0x9ae1a067f9655dd0511390e3d70bb25933ae61eb` to `0xea53c0f4b129Cf3f3FBA896F9f23ca18246e9B3c` @commit`b90b932` and, - Changed owner from `labs.taiko.eth` to `admin.taiko.eth` @tx`0x7d82794932540ed9edd259e58f6ef8ae21a49beada7f0224638f888f7149c01c` - Accept owner @tx`0x416560cd96dc75ccffebe889e8d1ab3e08b33f814dc4a2bf7c6f9555071d1f6f` + - upgraded impl from `0xea53c0f4b129Cf3f3FBA896F9f23ca18246e9B3c` to `0x55833dA2962c2330ccCF043ff8037e6D2939bCF6` @commit`2b483de` @tx`0x0bbf7d1258c646f41a02a92a55825b1ebfd3659577d0f2b57b462f8895e23a04` + - upgraded impl from `0x55833dA2962c2330ccCF043ff8037e6D2939bCF6` to `0xcfe803378D79d1180EbF030455040EA6513869dF` @commit`d2b00ce` @tx`0xc9f468d33d8d55911e4e5b5c301ed244a5f81ab0f389d2b4f398eb5b89d417ef` #### signal_service - ens: `signals.based.taiko.eth` - proxy: `0x9e0a24964e5397B566c1ed39258e21aB5E35C77C` -- impl: `0x3d59c18b31A7D950EF9bd15eD285b6c182E0f0bb` +- impl: `0x45fed11Ba70D4217545F18E27DDAF7D76Ff499f3` - owner: `admin.taiko.eth` - logs: - deployed on May 1, 2024 @commit`56dddf2b6` - admin.taiko.eth accepted the ownership @tx`0x0ed114fee6de4e3e2206cea44e6632ec0c4588f73648d98d8df5dc0183b07885` - upgraded from `0xE1d91bAE44B70bD66e8b688B8421fD62dcC33c72` to `0xB11Cd7bA46a12F238b4Ad831f6F296262C1e652d` @commit`b90b932` @tx`0x416560cd96dc75ccffebe889e8d1ab3e08b33f814dc4a2bf7c6f9555071d1f6f` - - upgraded from `0xB11Cd7bA46a12F238b4Ad831f6F296262C1e652d` to `0x3d59c18b31A7D950EF9bd15eD285b6c182E0f0bb` @commit`a3faee0` @tx`eth:0x40A2aCCbd92BCA938b02010E17A5b8929b49130D` + - upgraded from `0xB11Cd7bA46a12F238b4Ad831f6F296262C1e652d` to `0x3d59c18b31A7D950EF9bd15eD285b6c182E0f0bb` @commit`a3faee0` @tx`0x13f54109cb7f7507ad03562b06ea8d8b472043186e44252302583bc64acfb20b` + - restored from `0x3d59c18b31A7D950EF9bd15eD285b6c182E0f0bb` to `0xB11Cd7bA46a12F238b4Ad831f6F296262C1e652d` @commit`b90b932` @tx`0xdb5e926c96d112ce1389da77a927fba6c7d04a711839b9e14777530ebcf83914` + - upgraded from `0xB11Cd7bA46a12F238b4Ad831f6F296262C1e652d` to `0xDF8642a1FBFc2014de27E8E87283D6f3eEF315DF` @commit`bb2abc5` @tx`0x7d584f0a645cad61e634f64ffaf7e1bbfb92749878eb25b39ce0e5cf698897c7` + - Upgraded from `0xDF8642a1FBFc2014de27E8E87283D6f3eEF315DF` to `0x45fed11Ba70D4217545F18E27DDAF7D76Ff499f3` @commit`9345f14` @tx`0x13ea4d044a313cf667d16514465e6b96227ef7198bda7b19c70eefee44e9bccd` #### bridge - ens: `bridge.based.taiko.eth` - proxy: `0xd60247c6848B7Ca29eDdF63AA924E53dB6Ddd8EC` -- impl: `0x3c326483EBFabCf3252205f26dF632FE83d11108` +- impl: `0x2705B12a971dA766A3f9321a743d61ceAD67dA2F` - owner: `admin.taiko.eth` -- todo: - - upgrade the contract - logs: - deployed on May 1, 2024 @commit`56dddf2b6` - admin.taiko.eth accepted the ownership @tx`0x0ed114fee6de4e3e2206cea44e6632ec0c4588f73648d98d8df5dc0183b07885` @@ -79,6 +85,10 @@ - upgraded from `0x02F21B4C3d4dbfF70cE851741175a727c8D782Be` to `0x71c2f41AEDe913AAEf2c62596E03702E348D6Cd0.` @commit`` in @tx`0x8a380a25d03a740d9535dfc3e2fc4f6960e22d49ad88b8d85f59af4013aedf87` - upgrade impl to `0x951B7Ae1bB26d12dB37f01748e8fB62FEf45A8B5` @commit`1bd3285` @tx`0xf21f6bf720767db3bc9b63ef69cacb20340bdedfb6589e6a4d11fe082dfa7bd6` - upgrade impl to `0x3c326483EBFabCf3252205f26dF632FE83d11108` @commit`3ae25fd` @tx`0xc0ba6558642b93ee892bee0705dbcfb5130c53637e6266bfa5e3a6501167d6f2` + - upgrade impl to `0xD28f2c26aD8bA88b0691F6BB41Ff021878052561` @commit`2b483de` @tx`0x0bbf7d1258c646f41a02a92a55825b1ebfd3659577d0f2b57b462f8895e23a04` + - upgrade impl to `0x01E7D369a619eF1B0E92563d8737F42C09789986` @commit`04d8c87` @tx`0x13f54109cb7f7507ad03562b06ea8d8b472043186e44252302583bc64acfb20b` + - Upgrade impl to `0xAc96FF285158bceBB8573D20d853e86BB2915aF3` @commit`bb2abc5` @tx`0x7d584f0a645cad61e634f64ffaf7e1bbfb92749878eb25b39ce0e5cf698897c7` + - Upgrade impl to `0x2705B12a971dA766A3f9321a743d61ceAD67dA2F` @commit`9345f14` @tx`0x13ea4d044a313cf667d16514465e6b96227ef7198bda7b19c70eefee44e9bccd` #### quota_manager @@ -87,9 +97,9 @@ - owner: `admin.taiko.eth` - quota: - Quota Period: 24 hours - - ETH: `64516129032258064516` 1000 ETH + - ETH: 1000 ETH - WETH(`0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2`): 1000 ETH - - TKO(`0x10dea67478c5F8C5E2D90e5E9B26dBe60c54d800`): 2,000,000 + - TAIKO(`0x10dea67478c5F8C5E2D90e5E9B26dBe60c54d800`): 2,000,000 - USDT(`0xdAC17F958D2ee523a2206206994597C13D831ec7`): 4,000,000 - USDC(`0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48`): 4,000,000 - logs: @@ -101,50 +111,61 @@ - ens: `v20.based.taiko.eth` - proxy: `0x996282cA11E5DEb6B5D122CC3B9A1FcAAD4415Ab` -- impl: `0x4F750D13005444407D44dAA30922128db0374ca1` +- impl: `0xb20C8Ffc2dD49596508d262b6E8B6817e9790E63` - owner: `admin.taiko.eth` - logs: - deployed on May 1, 2024 @commit`56dddf2b6` - upgraded from `0x15D9F7e12aEa18DAEF5c651fBf97567CAd4a4BEc` to `0xC722d9f3f8D60288589F7f67a9CFAd34d3B9bf8E` @commit`b90b932` @tx`0x416560cd96dc75ccffebe889e8d1ab3e08b33f814dc4a2bf7c6f9555071d1f6f` - upgraded from `0xC722d9f3f8D60288589F7f67a9CFAd34d3B9bf8E` to `0x4F750D13005444407D44dAA30922128db0374ca1` @commit`fa481c1` @tx`0x02ed558762eae5f0a930ba4a1047a02d4a793ea48890268c32df04e882f138ff` + - upgraded from `0x4F750D13005444407D44dAA30922128db0374ca1` to `0xF8bdaC4E68bA2595Be8381aaa5456917e374E737` @commit`d907359` @tx`0xdb5e926c96d112ce1389da77a927fba6c7d04a711839b9e14777530ebcf83914` + - upgraded from `0xF8bdaC4E68bA2595Be8381aaa5456917e374E737` to `0xa303784B0557BF1F1FB8b8abEF2B18a005722689` @commit`04d8c87` @tx`0x13f54109cb7f7507ad03562b06ea8d8b472043186e44252302583bc64acfb20b` + - upgraded from `0xa303784B0557BF1F1FB8b8abEF2B18a005722689` to `0x7ACFBb369a552C45d402448A4d64b9da54C3FF30` @commit`bb2abc5` @tx`0xee632b50626beb2f7db84c9c7f303f29366f86dfaccd24ddd831ceac714c20e5` + - upgraded from `0x7ACFBb369a552C45d402448A4d64b9da54C3FF30` to `0xb20C8Ffc2dD49596508d262b6E8B6817e9790E63` @commit`9345f14` @tx`0x13ea4d044a313cf667d16514465e6b96227ef7198bda7b19c70eefee44e9bccd` #### erc721_vault - ens: `v721.based.taiko.eth` - proxy: `0x0b470dd3A0e1C41228856Fb319649E7c08f419Aa` -- impl: `0x2dfef0339009Ce10786fc118C883BB97af3163eD` +- impl: `0xA4C5c20aB33C96B1c281Dca37D03E23609274C49` - owner: `admin.taiko.eth` - logs: - deployed on May 1, 2024 @commit`56dddf2b6` - upgraded from `0xEC04849E7722Fd69797a155796Db75aC8F94f692` to `0x41A7BDD153a5AfFb10Ed1AD3D6a4e5ad001495FA` @commit`b90b932` @tx`0x416560cd96dc75ccffebe889e8d1ab3e08b33f814dc4a2bf7c6f9555071d1f6f` - upgraded from `0x41A7BDD153a5AfFb10Ed1AD3D6a4e5ad001495FA` to `0x2dfef0339009Ce10786fc118C883BB97af3163eD` @commit`fa481c1` @tx`0x02ed558762eae5f0a930ba4a1047a02d4a793ea48890268c32df04e882f138ff` + - upgraded from `0x2dfef0339009Ce10786fc118C883BB97af3163eD` to `0x55B5df6B53466446221180498BfD1C59e54732c4` @commit`d907359` @tx`0xdb5e926c96d112ce1389da77a927fba6c7d04a711839b9e14777530ebcf83914` + - upgraded from `0x55B5df6B53466446221180498BfD1C59e54732c4` to `0xD961e3Ef2D7DF58cDc67BFd9055255430E5e3fEc` @commit`bb2abc5` @tx`0x7d584f0a645cad61e634f64ffaf7e1bbfb92749878eb25b39ce0e5cf698897c7` + - upgraded from `0xD961e3Ef2D7DF58cDc67BFd9055255430E5e3fEc` to `0xA4C5c20aB33C96B1c281Dca37D03E23609274C49` @commit`9345f14` @tx`0x13ea4d044a313cf667d16514465e6b96227ef7198bda7b19c70eefee44e9bccd` #### erc1155_vault - ens: `v1155.based.taiko.eth` - proxy: `0xaf145913EA4a56BE22E120ED9C24589659881702` -- impl: `0x097BBBef669AaD66030aB223195D200eF9A47dc3` +- impl: `0x838ed469db456b67EB3b0B74D759Be4DA999b9c8` - owner: `admin.taiko.eth` - logs: - deployed on May 1, 2024 @commit`56dddf2b6` - upgraded from `0x7748dA086A2e6EDd8Db97eD236840910013c6396` to `0xd90b5fcf8d00d333d107E4Ab7F94c0c0A41CDcfE` @commit`b90b932` @tx`0x416560cd96dc75ccffebe889e8d1ab3e08b33f814dc4a2bf7c6f9555071d1f6f` - upgraded from `0xd90b5fcf8d00d333d107E4Ab7F94c0c0A41CDcfE` to `0x097BBBef669AaD66030aB223195D200eF9A47dc3` @commit`fa481c1` @tx`0x02ed558762eae5f0a930ba4a1047a02d4a793ea48890268c32df04e882f138ff` + - upgraded from `0x097BBBef669AaD66030aB223195D200eF9A47dc3` to `0xca92880829139b310B6b0CB41f66D566Db1a59C8` @commit`d907359` @tx`0xdb5e926c96d112ce1389da77a927fba6c7d04a711839b9e14777530ebcf83914` + - upgraded from `0xca92880829139b310B6b0CB41f66D566Db1a59C8` to `0x89C68Bc7028f8b1e69A91382b0a4b1825085617b` @commit`bb2abc5` @tx`0x7d584f0a645cad61e634f64ffaf7e1bbfb92749878eb25b39ce0e5cf698897c7` + - upgraded from `0x89C68Bc7028f8b1e69A91382b0a4b1825085617b` to `0x838ed469db456b67EB3b0B74D759Be4DA999b9c8` @commit`9345f14` @tx`0x13ea4d044a313cf667d16514465e6b96227ef7198bda7b19c70eefee44e9bccd` #### bridged_erc20 -- impl: `0xcc5d488073FA918cBbd73B9A523F3858C4de7372` +- impl: `0x65666141a541423606365123Ed280AB16a09A2e1` - logs: - deployed on May 1, 2024 @commit`56dddf2b6` + - deployed on Jul 25, 2024 @commit`ba6bf94` #### bridged_erc721 -- impl: `0xc4096E9ff1526Bd1840B65e9f45695135aC12De7` +- impl: `0xC3310905E2BC9Cfb198695B75EF3e5B69C6A1Bf7` - logs: - deployed on May 1, 2024 @commit`56dddf2b6` #### bridged_erc1155 -- impl: `0x39E4C1214e733639d059979079A151911e42791d` +- impl: `0x3c90963cFBa436400B0F9C46Aa9224cB379c2c40` - logs: - deployed on May 1, 2024 @commit`56dddf2b6` @@ -154,20 +175,23 @@ - ens: `ram.based.taiko.eth` - proxy: `0x579f40D0BE111b823962043702cabe6Aaa290780` -- impl: `0x8EEf314878A7E56314E8DF285d0B0D649C903aF6` +- impl: `0x0079a79E5d8DDA67029051d505E5A11DE279B36D` - names: + - bond_token: `0x10dea67478c5F8C5E2D90e5E9B26dBe60c54d800` - taiko_token: `0x10dea67478c5F8C5E2D90e5E9B26dBe60c54d800` - signal_service: `0x9e0a24964e5397B566c1ed39258e21aB5E35C77C` - bridge: `0xd60247c6848B7Ca29eDdF63AA924E53dB6Ddd8EC` - taiko: `0x06a9Ab27c7e2255df1815E6CC0168d7755Feb19a` - - tier_router: `0xa8e5D3a2E2052bea7f10bE6a0386454b721d1f9F` + - tier_router: `0x8a4c692F12d3a9750E744A4CE24a1d351bE52E66` - tier_sgx: `0xb0f3186FC1963f774f52ff455DC86aEdD0b31F81` + - risc0_groth16_verifier: `0xcF706D99C265fC2349AE43c5f6BFD7931FE5308D` + - tier_zkvm_risc0: `0x55902b2D3DF2A65370A89C86Ae9dd71Ecd508edc` + - sp1_remote_verifier: `0x2D33d748644dAb8B3FB0E07642d9dE96b816d067` + - tier_zkvm_sp1: `0x5c44f2239925b0d86d2BFEe539f19CD0A08Af452` - tier_guardian_minority: `0x579A8d63a2Db646284CBFE31FE5082c9989E985c` - tier_guardian: `0xE3D777143Ea25A6E031d1e921F396750885f43aC` - automata_dcap_attestation: `0x8d7C954960a36a7596d7eA4945dDf891967ca8A3` - - prover_set: `0xd0AEe97712a4a88B75C31E3C61DD2Ce6E514D85F` - - proposer_one: `0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045` vitalik.eth - - proposer: `0x000000633b68f5d8d3a86593ebb815b4663bcbe0` + - prover_set: `0xCE5a119479337a153CA3bd1b2bF9755c78F2B15A` - chain_watchdog: `0xE3D777143Ea25A6E031d1e921F396750885f43aC` - logs: - deployed on May 1, 2024 @commit`56dddf2b6` @@ -182,12 +206,24 @@ - upgraded from `0x8Af4669E3068Bae96b92cD73603f5D86beD07a9a` to `0x8EEf314878A7E56314E8DF285d0B0D649C903aF6` @commit`a3faee0` @tx`eth:0x40A2aCCbd92BCA938b02010E17A5b8929b49130D` - register `prover_set` to `0xd0AEe97712a4a88B75C31E3C61DD2Ce6E514D85F` @tx`0xb23d9cec24a1cc14956482d9d6a77eee0d6ab6ccd5b77e2be191fb8368c2d107` - unregister `assignment_hook` @tx`0xb23d9cec24a1cc14956482d9d6a77eee0d6ab6ccd5b77e2be191fb8368c2d107` + - register `prover_set` to `0x5D528253fA14cd7F637937de847BE8D5BE0Bf5fd` @commit`2b483de` @tx`0x0bbf7d1258c646f41a02a92a55825b1ebfd3659577d0f2b57b462f8895e23a04` + - register `tier_router` to `0x6e997f1f22c40ba37f633b08f3b07e10ed43155a` @tx`0x13f54109cb7f7507ad03562b06ea8d8b472043186e44252302583bc64acfb20b` + - Upgraded from `0x8EEf314878A7E56314E8DF285d0B0D649C903aF6` to `0x29a88d60246C76E4F28806b9C8a42d2183154900` @commit`57c8dc0` @tx`0x9f787086b4c5e6887eb1d27c286069bcbbcabb1d7ed9f69ab3121c4681cf4b2c` + - register `prover_set` to `0x518845daA8870bE2C59E49620Fc262AD48953C9a` @commit`67a7a37` @tx`0xc1f91c375713f601b99cf6d2cdb80c129e036a7c9ec5f75871c4d13216dbbb5c` + - register `prover_set` to `0x74828E5fe803072AF9Df512B3911B4223572D652` @commit`bb2abc5` @tx`0x7d584f0a645cad61e634f64ffaf7e1bbfb92749878eb25b39ce0e5cf698897c7` + - upgraded from `0x29a88d60246C76E4F28806b9C8a42d2183154900` to `0x4f6D5D3109C07E77035B410602996e445b18E8E9` @commit`bb2abc5` @tx`0x7d584f0a645cad61e634f64ffaf7e1bbfb92749878eb25b39ce0e5cf698897c7` + - register `prover_set` to `0xCE5a119479337a153CA3bd1b2bF9755c78F2B15A` @commit`be34059` @tx`0x170617251f2345eda4bcbd29e316caa0b014602a44244c60b963382ac7da7748` + - upgraded from `0x4f6D5D3109C07E77035B410602996e445b18E8E9` to `0x3202Fc255aE09F91DbbD5b000b87dA4A2E04eE37` @commit`9345f14` @tx`0x13ea4d044a313cf667d16514465e6b96227ef7198bda7b19c70eefee44e9bccd` + - upgraded from `0x3202Fc255aE09F91DbbD5b000b87dA4A2E04eE37` to `0x190D5d50D98D2202a618f75B2fD9986e60E096be` @commit`4fd7b59` @tx`0xf26d0526aa4b8225c603720ce0dc016803188b959c50677d5446087d1f2c4e60` + - upgraded from `0x190D5d50D98D2202a618f75B2fD9986e60E096be` to `0x6D8e6e1a061791AD17A55De5e15a111c58f6Fb3D` @commit`2625c60` @tx`0x5d46840df79d8df508880675e7ea549e9b46137f597ca520c3e0c979439441d1` + - upgraded from `0x6D8e6e1a061791AD17A55De5e15a111c58f6Fb3D` to `0x52CA3c5566d779b3c6bb5c4f760Ea39E294Fc788` @commit`9ae9a5e` @tx`0x43353a74df973d8f6a379b5c8815ac80935a5099f8ab93a4aa204eb5ef2c663e` + - upgraded from `0x52CA3c5566d779b3c6bb5c4f760Ea39E294Fc788` to `0x0079a79E5d8DDA67029051d505E5A11DE279B36D` @commit`06128e8` @tx`0xe66aba9f8bfcd86dc0ae32416862ca61a51c47f8ec747799e65f155ef27eeb20` #### taikoL1 - ens: `based.taiko.eth` - proxy: `0x06a9Ab27c7e2255df1815E6CC0168d7755Feb19a` -- impl: `0x4b2743B869b85d5F7D8020566f92664995E4f3c5` +- impl: `0xe7c4B445D3C7C8E4D68afb85A068F9fAa18e9A5B` - owner: `admin.taiko.eth` - logs: - deployed on May 1, 2024 @commit`56dddf2b6` @@ -199,40 +235,62 @@ - Upgraded from `0xa200c2268d77737a8Fd2CA1698dA6eeab2a85CEb` to `0x3505a0700DB72dEc7AbFF1aF231BB5D87aBF2944` on May 28 @commit`b335b70` @tx`0xa603b6d55457e64e18ddae684bfd14948452cdd7b927dd22bf0b83045e8fd028` - Upgrade to `0xE84DC8E2a21e59426542Ab040D77f81d6dB881eE` @commit`3ae25fd` @tx`0x2c455ae888a23c232bb5c7603657eda010ffadc602a74e626332bc06eaaa3b78` - Upgrade to `0x4b2743B869b85d5F7D8020566f92664995E4f3c5` @commit`a3faee0` @tx`eth:0x40A2aCCbd92BCA938b02010E17A5b8929b49130D` + - Upgrade to `0x0468745A07de44A9a3138adAc35875ecaf7a20D5` @commit`2b483de` @tx`0x0bbf7d1258c646f41a02a92a55825b1ebfd3659577d0f2b57b462f8895e23a04` + - Upgrade to `0xB9E1E58bcF33B79CcfF99c298963546a6c334388` @commit`d907359` @tx`0xdb5e926c96d112ce1389da77a927fba6c7d04a711839b9e14777530ebcf83914` + - Upgrade to `0x5fc54737ECC1de49D58AE1195d4A296257F1E31b` @commit`04d8c87` @tx`0x13f54109cb7f7507ad03562b06ea8d8b472043186e44252302583bc64acfb20b` + - Upgrade to `0xcEe590fACd976B9BDE87BC1B7620B284c5edD2C3` @commit`2dd30ab` @tx`0xc1f91c375713f601b99cf6d2cdb80c129e036a7c9ec5f75871c4d13216dbbb5c` + - Upgrade to `0xBA1d90BCfA74163bFE09e8eF609b346507D83231` @commit`bb2abc5` @tx`0x7d584f0a645cad61e634f64ffaf7e1bbfb92749878eb25b39ce0e5cf698897c7` + - Upgrade to `0xf0E6d34937701622cA887a75c150cC23d4FFDf2F` @commit`b4f8547` @tx`0x8778064404816273804d74c97b051f3865bc03062cfa4b0e9567f4556ad31981` + - Upgrade to `0x4229d14F520848aa83760Cf748abEB8A69cdaB2d` @commit`9345f14` @tx`0x13ea4d044a313cf667d16514465e6b96227ef7198bda7b19c70eefee44e9bccd` + - Upgrade to `0xA3E75eDA1Be2114816f388A5cF53EbA142DCDB17` @commit`ea0158f` @tx`0x78ca7c7d9c7e5aa9c5e6ab80e0229289a8d3bc8df2c2b9ba6baa74a0f60a0703` + - Upgrade to `0xe7c4B445D3C7C8E4D68afb85A068F9fAa18e9A5B` @commit`ea0158f` with new `RollupAddressManagerCache` @commit `9ae9a5e` @tx`0x5eb57ab352b3e3c1ddbc3fe468d582901b88c6a137ce49b0d70857d5218d626d` + - Upgrade to `0xb74A66b6CF50AD63E29669F0BDE4354E11758162` @commit`06128e8` @tx`0xe66aba9f8bfcd86dc0ae32416862ca61a51c47f8ec747799e65f155ef27eeb20` + - Upgrade to `0xd4896d4537c6425aC5d89B9f122d4E4ac4D65e1c` @commit`ea0158f` with new `RollupAddressManagerCache` @commit `7394458` @tx`0x9c2f36af40c0004110041fc45d980b73b0c8dde8064713a55aeb6f69fca77a99` + - Upgrade to `0xe7c4B445D3C7C8E4D68afb85A068F9fAa18e9A5B` @commit`ea0158f` with new `RollupAddressManagerCache` @commit `9ae9a5e` @tx`0x5eb57ab352b3e3c1ddbc3fe468d582901b88c6a137ce49b0d70857d5218d626d` + +#### tier_router + +- impl: `0x8a4c692F12d3a9750E744A4CE24a1d351bE52E66` +- logs: + - deployed on Oct 24, 2024 @commit`7334b1d` + - deployed on Nov 1, 2024 @commit`f4f4796` + - deployed on Nov 2, 2024 @commit`9182fba` + - deployed on Nov 8, 2024 @commit`1fee7bb` without changes in [PR #18371](https://github.com/taikoxyz/taiko-mono/pull/18371) + - deployed on Nov 10, 2024 @commit`f24a908` without changes in [PR #18371](https://github.com/taikoxyz/taiko-mono/pull/18371) + - deployed on Dec 20, 2024 @commit`06128e8` without changes in [PR #18371](https://github.com/taikoxyz/taiko-mono/pull/18371) -#### assignment_hook +#### tier_sgx -- proxy: `0x537a2f0D3a5879b41BCb5A2afE2EA5c4961796F6` -- impl: `0xe226fAd08E2f0AE68C32Eb5d8210fFeDB736Fb0d` +- proxy: `0xb0f3186FC1963f774f52ff455DC86aEdD0b31F81` +- impl: `0x81DFEA931500cdcf0460e9EC45FA283A6B7f0838` - owner: `admin.taiko.eth` - logs: - deployed on May 1, 2024 @commit`56dddf2b6` - - Upgraded from `0x4f664222C3fF6207558A745648B568D095dDA170` to `0xe226fAd08E2f0AE68C32Eb5d8210fFeDB736Fb0d` @commit`b90b932` @tx`0x416560cd96dc75ccffebe889e8d1ab3e08b33f814dc4a2bf7c6f9555071d1f6f` -- todo: - - upgrade assignment hook (remove a large Event) + - Upgraded from `0x3f54067EF5d8B414Bdb1945cdF482BD158Aad175` to `0xf381868DD6B2aC8cca468D63B42F9040DE2257E9` @commit`b90b932` @tx`0x416560cd96dc75ccffebe889e8d1ab3e08b33f814dc4a2bf7c6f9555071d1f6f` + - Upgraded from `0xf381868DD6B2aC8cca468D63B42F9040DE2257E9` to `0xB0b782cf0fCEce896E0C041F8e54f86cA4cC8e9F` @commit`a3faee0` @tx`eth:0x40A2aCCbd92BCA938b02010E17A5b8929b49130D` + - Upgraded from `0xB0b782cf0fCEce896E0C041F8e54f86cA4cC8e9F` to `0xEE5F6648307319263FFBaE91f68ac700b188fF24` @commit`be34059` @tx`0x170617251f2345eda4bcbd29e316caa0b014602a44244c60b963382ac7da7748` + - Upgraded from `0xEE5F6648307319263FFBaE91f68ac700b188fF24` to `0x7EE4CEF8a945639e09DDf3032e9d95c8d90f07f3` @commit`dd09223` @tx`0x2e246e4b4637c4bf13dccea873a30e35e704bafa7f02e30c877ecec7d786e662` + - Upgraded from `0x7EE4CEF8a945639e09DDf3032e9d95c8d90f07f3` to `0x81DFEA931500cdcf0460e9EC45FA283A6B7f0838` @commit`9345f14` @tx`0x13ea4d044a313cf667d16514465e6b96227ef7198bda7b19c70eefee44e9bccd` -#### tier_provider +#### tier_risk0 -- impl: `0x4cffe56C947E26D07C14020499776DB3e9AE3a23` +- proxy: `0x55902b2D3DF2A65370A89C86Ae9dd71Ecd508edc` +- impl: `0xefe30A0D56a5804F695f971010597262CAd9A2c3` - logs: - - deployed on May 1, 2024 @commit`56dddf2b6` - - deployed on May 15, 2024 @commit`cd5144255` + - deployed on Nov 6, 2024 @commit`bfb0386` -#### tier_sgx +#### tier_sp1 -- proxy: `0xb0f3186FC1963f774f52ff455DC86aEdD0b31F81` -- impl: `0xB0b782cf0fCEce896E0C041F8e54f86cA4cC8e9F` -- owner: `admin.taiko.eth` +- proxy: `0x5c44f2239925b0d86d2BFEe539f19CD0A08Af452` +- impl: `0x5f5b83Ca87E2fBc513B800FeD6cCD626536d7219` - logs: - - deployed on May 1, 2024 @commit`56dddf2b6` - - Upgraded from `0x3f54067EF5d8B414Bdb1945cdF482BD158Aad175` to `0xf381868DD6B2aC8cca468D63B42F9040DE2257E9` @commit`b90b932` @tx`0x416560cd96dc75ccffebe889e8d1ab3e08b33f814dc4a2bf7c6f9555071d1f6f` - - Upgraded from `0xf381868DD6B2aC8cca468D63B42F9040DE2257E9` to `0xB0b782cf0fCEce896E0C041F8e54f86cA4cC8e9F` @commit`a3faee0` @tx`eth:0x40A2aCCbd92BCA938b02010E17A5b8929b49130D` + - deployed on Nov 8, 2024 @commit`0b11101` #### guardian_prover_minority - ens: `guardians1.based.taiko.eth` - proxy: `0x579A8d63a2Db646284CBFE31FE5082c9989E985c` -- impl: `0x7E717FFD6f7dD1008192bDC7193904FaB25BC8A4` +- impl: `0xB866E9046CAf4D75e2cbCD8b5eA3f07Ea74F7B47` - owner: `admin.taiko.eth` - guardianProvers: - `0x000012dd12a6d9dd2045f5e2594f4996b99a5d33` @@ -250,13 +308,15 @@ - Upgraded from `0x717DC5E3814591790BcB1fD9259eEdA7c14ce9CF` to `0x750221E951b77a2Cb4046De41Ec5F6d1aa7942D2` @commit`b90b932` @tx`0x416560cd96dc75ccffebe889e8d1ab3e08b33f814dc4a2bf7c6f9555071d1f6f` - Upgraded from `0x750221E951b77a2Cb4046De41Ec5F6d1aa7942D2` to `0x253E47F2b1e91F2001d3578aeB24C0ccF464b65e` @commit`cd5144255` @tx`0x8030569e293baddbc4e8b26688a1ecf14a231d86c90e9d02dad1e919ea2f3964` - Upgraded from `0x253E47F2b1e91F2001d3578aeB24C0ccF464b65e` to `0x468F6A9C0ad2e9C8370687D2844A9e70fE942d5c` @commit`b955e0e` @tx`0x5a60c5815947a199cc84e1bc75539e01a202597b20c1f87bd9d02f8be6453abd` - - Upgraded from `0x468F6A9C0ad2e9C8370687D2844A9e70fE942d5c` to `0x7E717FFD6f7dD1008192bDC7193904FaB25BC8A4.` @commit`8a27cbe` @tx`eth:0x40A2aCCbd92BCA938b02010E17A5b8929b49130D` + - Upgraded from `0x468F6A9C0ad2e9C8370687D2844A9e70fE942d5c` to `0x7E717FFD6f7dD1008192bDC7193904FaB25BC8A4` @commit`8a27cbe` @tx`eth:0x40A2aCCbd92BCA938b02010E17A5b8929b49130D` + - Upgraded from `0x7E717FFD6f7dD1008192bDC7193904FaB25BC8A4` to `0x3c40CC51e78B4a622622F9A4Df1b40068bc8Df98` @commit`be34059` @tx`0x170617251f2345eda4bcbd29e316caa0b014602a44244c60b963382ac7da7748` + - Upgraded from `0x3c40CC51e78B4a622622F9A4Df1b40068bc8Df98` to `0xB866E9046CAf4D75e2cbCD8b5eA3f07Ea74F7B47` @commit`9345f14` @tx`0x13ea4d044a313cf667d16514465e6b96227ef7198bda7b19c70eefee44e9bccd` #### guardian_prover - ens: `guardians.based.taiko.eth` - proxy: `0xE3D777143Ea25A6E031d1e921F396750885f43aC` -- impl: `0x7E717FFD6f7dD1008192bDC7193904FaB25BC8A4` +- impl: `0xB866E9046CAf4D75e2cbCD8b5eA3f07Ea74F7B47` - owner: `admin.taiko.eth` - guardianProvers: - `0x000012dd12a6d9dd2045f5e2594f4996b99a5d33` @@ -273,7 +333,9 @@ - Upgraded from `0x717DC5E3814591790BcB1fD9259eEdA7c14ce9CF` to `0x750221E951b77a2Cb4046De41Ec5F6d1aa7942D2` @commit`b90b932` @tx`0x416560cd96dc75ccffebe889e8d1ab3e08b33f814dc4a2bf7c6f9555071d1f6f` - Upgraded from `0x750221E951b77a2Cb4046De41Ec5F6d1aa7942D2` to `0x253E47F2b1e91F2001d3578aeB24C0ccF464b65e` @commit`cd5144255` @tx`0x8030569e293baddbc4e8b26688a1ecf14a231d86c90e9d02dad1e919ea2f3964` - Upgraded from `0x253E47F2b1e91F2001d3578aeB24C0ccF464b65e` to `0x468F6A9C0ad2e9C8370687D2844A9e70fE942d5c` @commit`b955e0e` @tx`0x5a60c5815947a199cc84e1bc75539e01a202597b20c1f87bd9d02f8be6453abd` - - Upgraded from `0x468F6A9C0ad2e9C8370687D2844A9e70fE942d5c` to `0x7E717FFD6f7dD1008192bDC7193904FaB25BC8A4.` @commit`8a27cbe` @tx`eth:0x40A2aCCbd92BCA938b02010E17A5b8929b49130D` + - Upgraded from `0x468F6A9C0ad2e9C8370687D2844A9e70fE942d5c` to `0x7E717FFD6f7dD1008192bDC7193904FaB25BC8A4` @commit`8a27cbe` @tx`eth:0x40A2aCCbd92BCA938b02010E17A5b8929b49130D` + - Upgraded from `0x7E717FFD6f7dD1008192bDC7193904FaB25BC8A4` to `0x3c40CC51e78B4a622622F9A4Df1b40068bc8Df98` @commit`be34059` @tx`0x170617251f2345eda4bcbd29e316caa0b014602a44244c60b963382ac7da7748` + - Upgraded from `0x3c40CC51e78B4a622622F9A4Df1b40068bc8Df98` to `0xB866E9046CAf4D75e2cbCD8b5eA3f07Ea74F7B47` @commit`9345f14` @tx`0x13ea4d044a313cf667d16514465e6b96227ef7198bda7b19c70eefee44e9bccd` #### p256_verifier @@ -293,6 +355,18 @@ - logs: - deployed on May 1, 2024 @commit`56dddf2b6` +#### risc0_groth16_verifier + +- impl: `0xcF706D99C265fC2349AE43c5f6BFD7931FE5308D` +- logs: + - deployed on Nov 6, 2024 @commit`bfb0386` + +#### sp1_remote_verifier + +- impl: `0x2D33d748644dAb8B3FB0E07642d9dE96b816d067` +- logs: + - deployed on Nov 8, 2024 @commit`0b11101` + #### automata_dcap_attestation - proxy: `0x8d7C954960a36a7596d7eA4945dDf891967ca8A3` @@ -306,40 +380,58 @@ - Upgraded from `0xde1b1FBe7D721af4A56651272ef91A59B7303323` to `0x5f73f0AdC7dAA6134Fe751C4a78d524f9384e0B5` @commit`3740dc0` @tx`0x46a6d47c15505a1259c64d1e09353680e525b2706dd9e095e15019dda7c1b295` - Called `configureTcbInfoJson` @commit`3740dc0` @tx`0x46a6d47c15505a1259c64d1e09353680e525b2706dd9e095e15019dda7c1b295` - Update mrenclave & mrsign on May 28, 2024 @commit`b335b70` @tx`0x6a240314c6a48f3ab58e0a3d5bf0e915668dac5eec19c694656eeb3d66c12465` + - Called `setMrEnclave` @commit`9d06958` @tx`0x0aa35e03c521f8e4b4d03662a6ecc6de5dd3e336f63e6ea00eff7b4184eae9be` ### token_unlock -- impl: `0x035AFfC82612de31E9Db2259B9482D0Dd53B7819.` +- impl: `0xD6A337D948F44bAF9Bef85e4f00A5006Fe6ff5E7` - logs: - deployed @commit`bca493f` @tx`0x0a4a63715257b766ca06e7e87ee25088d557c460e50120208b31666c83fc68bc` + - deployed @commit`3d89d24` @tx`0x28fdfb26c1409e420fe9ecce22063fa70efdbe56359aeacf9f65e68db8b8d34a` ### prover_set -- impl: `0x34f2B21107AfE3584949c184A1E6236FFDAC4f6F` +- impl: `0x518845daA8870bE2C59E49620Fc262AD48953C9a` - logs: - deployed @commit`bca493f` @tx`0xfacd0f26e3ec4bf1f949637373483fcfe9a960dfc427d6fa62b116907bac3373` + - deployed @commit`2dd30ab` @tx`0xc1f91c375713f601b99cf6d2cdb80c129e036a7c9ec5f75871c4d13216dbbb5c` ### labprover.taiko.eth - ens: `labprover.taiko.eth` - proxy: `0x68d30f47F19c07bCCEf4Ac7FAE2Dc12FCa3e0dC9` -- impl: `0xd0AEe97712a4a88B75C31E3C61DD2Ce6E514D85F` +- impl: `0xd0d3f025D83D7122de7eC43e86331C57c8A4F30B` - enabled provers: - `0x000000629FBCf27A347d1AEbA658435230D74a5f` + - `0x000000633b68f5d8d3a86593ebb815b4663bcbe0` - logs: - deployed @commit`bca493f`@tx`0xf3b6af477112d0a8209506c8f310f4eb0713beebb1911ef5d11162d36d93c0ff` - enabled two provers (`0x000000629FBCf27A347d1AEbA658435230D74a5f` and `0x00000027F51a57E7FcBC4b481d15fcE5BE68b30B`) @tx`0xa0b1565473849bc753d395abd982e6899ecdd9e754014eebed67b69edadb61c5` - upgraded from `0x68d30f47F19c07bCCEf4Ac7FAE2Dc12FCa3e0dC9` to `0x500735343372Dd6c9B84dBc7a75babf4479742B9` @commit`fa481c1` @tx`0x02ed558762eae5f0a930ba4a1047a02d4a793ea48890268c32df04e882f138ff` - disable a prover (`0x00000027F51a57E7FcBC4b481d15fcE5BE68b30B`) on May 28 @commit`b335b70` @tx`0x27c84a1dbf80d88948f96f1536c244816543fb780c81a04ba485c4c156431112` - upgraded from `0x500735343372Dd6c9B84dBc7a75babf4479742B9` to `0xd0AEe97712a4a88B75C31E3C61DD2Ce6E514D85F` @commit`a3faee0` @tx`eth:0x40A2aCCbd92BCA938b02010E17A5b8929b49130D` + - upgraded from `0xd0AEe97712a4a88B75C31E3C61DD2Ce6E514D85F` to `0x5D528253fA14cd7F637937de847BE8D5BE0Bf5fd` @commit`2b483de` @tx`0x0bbf7d1258c646f41a02a92a55825b1ebfd3659577d0f2b57b462f8895e23a04` + - upgraded from `0x5D528253fA14cd7F637937de847BE8D5BE0Bf5fd` to `0xD547Ca5d6b50dC5E900a091978597eB51F18F9D1` @commit`d907359` @tx`0xb4c23d57a1f0916180d0752c57726b634e7707bb7377c93d9e95d19e3695887a` + - enabled a prover (`0x000000633b68f5d8d3a86593ebb815b4663bcbe0`) @tx`0xb4c23d57a1f0916180d0752c57726b634e7707bb7377c93d9e95d19e3695887a` + - upgraded from `0xD547Ca5d6b50dC5E900a091978597eB51F18F9D1` to `0x518845daA8870bE2C59E49620Fc262AD48953C9a` @commit`2dd30ab` @tx`0xc1f91c375713f601b99cf6d2cdb80c129e036a7c9ec5f75871c4d13216dbbb5c` + - upgraded from `0x518845daA8870bE2C59E49620Fc262AD48953C9a` to `0x74828E5fe803072AF9Df512B3911B4223572D652` @commit`bb2abc5` @tx`0xc1f91c375713f601b99cf6d2cdb80c129e036a7c9ec5f75871c4d13216dbbb5c` + - upgraded from `0x74828E5fe803072AF9Df512B3911B4223572D652` to `0xCE5a119479337a153CA3bd1b2bF9755c78F2B15A` @commit`be34059` @tx`0x170617251f2345eda4bcbd29e316caa0b014602a44244c60b963382ac7da7748` + - upgraded from `0xCE5a119479337a153CA3bd1b2bF9755c78F2B15A` to `0x3022Ed0346CCE0c08268c8ad081458AfD95E8763` @commit`9345f14` @tx`0x13ea4d044a313cf667d16514465e6b96227ef7198bda7b19c70eefee44e9bccd` + - upgraded from `0x3022Ed0346CCE0c08268c8ad081458AfD95E8763` to `0xd0d3f025D83D7122de7eC43e86331C57c8A4F30B` @commit`06128e8` @tx`0xe66aba9f8bfcd86dc0ae32416862ca61a51c47f8ec747799e65f155ef27eeb20` ### labcontester.taiko.eth - ens: `labcontester.taiko.eth` - proxy: `0xa01d464ca3982DAa97B19fa7F8a232eB11A9DDb3` -- impl: `0xd0AEe97712a4a88B75C31E3C61DD2Ce6E514D85F` +- impl: `0xd0d3f025D83D7122de7eC43e86331C57c8A4F30B` - enabled provers: - `0x00000027F51a57E7FcBC4b481d15fcE5BE68b30B` - logs: - enabled a prover (`0x00000027F51a57E7FcBC4b481d15fcE5BE68b30B`) on May 28 @commit`b335b70` @tx`0x27c84a1dbf80d88948f96f1536c244816543fb780c81a04ba485c4c156431112` - upgraded from `0x500735343372Dd6c9B84dBc7a75babf4479742B9` to `0xd0AEe97712a4a88B75C31E3C61DD2Ce6E514D85F` @commit`a3faee0` @tx`eth:0x40A2aCCbd92BCA938b02010E17A5b8929b49130D` + - upgraded from `0xd0AEe97712a4a88B75C31E3C61DD2Ce6E514D85F` to `0x5D528253fA14cd7F637937de847BE8D5BE0Bf5fd` @commit`2b483de` @tx`0x0bbf7d1258c646f41a02a92a55825b1ebfd3659577d0f2b57b462f8895e23a04` + - upgraded from `0xD547Ca5d6b50dC5E900a091978597eB51F18F9D1` to `0x518845daA8870bE2C59E49620Fc262AD48953C9a` @commit`2dd30ab` @tx`0xc1f91c375713f601b99cf6d2cdb80c129e036a7c9ec5f75871c4d13216dbbb5c` + - upgraded from `0x518845daA8870bE2C59E49620Fc262AD48953C9a` to `0x74828E5fe803072AF9Df512B3911B4223572D652` @commit`bb2abc5` @tx`0xc1f91c375713f601b99cf6d2cdb80c129e036a7c9ec5f75871c4d13216dbbb5c` + - upgraded from `0x74828E5fe803072AF9Df512B3911B4223572D652` to `0xCE5a119479337a153CA3bd1b2bF9755c78F2B15A` @commit`be34059` @tx`0x170617251f2345eda4bcbd29e316caa0b014602a44244c60b963382ac7da7748` + - upgraded from `0xCE5a119479337a153CA3bd1b2bF9755c78F2B15A` to `0x3022Ed0346CCE0c08268c8ad081458AfD95E8763` @commit`9345f14` @tx`0x13ea4d044a313cf667d16514465e6b96227ef7198bda7b19c70eefee44e9bccd` + - upgraded from `0x3022Ed0346CCE0c08268c8ad081458AfD95E8763` to `0xd0d3f025D83D7122de7eC43e86331C57c8A4F30B` @commit`06128e8` @tx`0xe66aba9f8bfcd86dc0ae32416862ca61a51c47f8ec747799e65f155ef27eeb20` diff --git a/packages/protocol/deployments/mainnet-contract-logs-L2.md b/packages/protocol/deployments/mainnet-contract-logs-L2.md index 4088e18c654..3faba5a7b13 100644 --- a/packages/protocol/deployments/mainnet-contract-logs-L2.md +++ b/packages/protocol/deployments/mainnet-contract-logs-L2.md @@ -23,12 +23,13 @@ - erc721_vault@1: `0x0b470dd3A0e1C41228856Fb319649E7c08f419Aa` - erc1155_vault: `0x1670000000000000000000000000000000000004` - erc1155_vault@1: `0xaf145913EA4a56BE22E120ED9C24589659881702` - - bridged_erc20: `0x0167000000000000000000000000000000010096` + - bridged_erc20: `0x98161D67f762A9E589E502348579FA38B1Ac47A8` - bridged_erc721: `0x0167000000000000000000000000000000010097` - bridged_erc1155: `0x0167000000000000000000000000000000010098` - quota_manager: `0x0000000000000000000000000000000000000000` - bridge_watchdog: `0x0000000000000000000000000000000000000000` - todo: + - deploy and register BridgedERC20V2 - change owner to DelegateOwner - logs: - deployed on May 1, 2024 @commit`56dddf2b6` @@ -40,15 +41,16 @@ - set erc1155_vault@1 to `0xaf145913EA4a56BE22E120ED9C24589659881702` @tx`0x4a16a8a7d02f696b753208bbf8e7e3501d6b70b9a764fa2b4e115add46c13cb3` - changed owner to `0xCa5b76Cc7A38b86Db11E5aE5B1fc9740c3bA3DE8` @tx`0xf68861171c602e3e75ca69e950957fcb908c7949c6df9a9ea3026c238ebb1e9c` - register `taiko_token` to `0xA9d23408b9bA935c230493c40C73824Df71A0975` @tx`0xc77434f4e37959cdc0eac125303b78dd192d8727173373cc7a6158ca7d829dad` + - register `bridged_erc20` to `0x98161D67f762A9E589E502348579FA38B1Ac47A8` @tx`0xf377885a94467d520bd765a186d3c3524099fe28e936d05656d0da2509628e65` #### bridge - proxy: `0x1670000000000000000000000000000000000001` -- impl: `0x8fb67c2c16dc8578b6d69bc668236924f4c1b0f7` +- impl: `0x95ae2918dcbc6aFF8B4c1F1BCC1bf819b6e08B83` - owner: `0xCa5b76Cc7A38b86Db11E5aE5B1fc9740c3bA3DE8` - todo: - change owner to DelegateOwner - - upgrade the contract + - upgrade the contract:https://github.com/taikoxyz/taiko-mono/pull/17529 - logs: - deployed on May 1, 2024 @commit`56dddf2b6` - redeployed on May 22, 2024 @commit`b955e0e` @@ -56,12 +58,14 @@ - upgraded from `0xf961854D68368cFFc86d90AEe8a19E9781dACA3e` to `0x98C5De7670aA7d47C6c0551fAD27Bfe464A6751a..` @commit`` in @tx`0x0b5d6acc9c5b8ef193920246081ec5ce7268111acfc1dce1f058bea06f3953c7` - changed owner to `0xCa5b76Cc7A38b86Db11E5aE5B1fc9740c3bA3DE8` @tx`0xf68861171c602e3e75ca69e950957fcb908c7949c6df9a9ea3026c238ebb1e9c` - upgrade impl to `0x0893c8821Fa358D5f3630695Ce062204814359A1` @commit`1bd3285` @tx`0x4605c4ce594e996bdbdb532a9aefe4fab1ea36f7e2ef63eef56a7e8033810df3` - - upgrade impl to `0x8fb67c2c16dc8578b6d69bc668236924f4c1b0f7` @commit`3ae25fd` @tx`0xc77434f4e37959cdc0eac125303b78dd192d8727173373cc7a6158ca7d829dad` + - upgrade impl to `0x8fb67c2c16dc8578b6d69bc668236924f4c1b0f7` @commit`3ae25fd` @tx`0xd95435c742c01B0E982913BcA252173Ae96DF61d` + - upgrade impl to `0x4Ca6bE8C1Ec05beFB216bAEEF9EE36997e35E98E` @commit`a3e1cf7` @tx`0xdf0348394d5e58f801de917575aafdc1cb55533b14a6e46fd460d1437238dc02` + - upgrade impl to `0x95ae2918dcbc6aFF8B4c1F1BCC1bf819b6e08B83` @commit`9345f14` @tx`0xdbe9caf2b1282d0fecf9a752f2c1aeade8820bb66bb5ad210f0081996504173b` #### erc20_vault - proxy: `0x1670000000000000000000000000000000000002` -- impl: `0x33fBcde27fBA21e90582Df31DFB427D4dbdBefC1` +- impl: `0xb96AbB41b01E3ad519D00E80355a1c3801910F62` - owner: `0xCa5b76Cc7A38b86Db11E5aE5B1fc9740c3bA3DE8` - todo: - change owner to DelegateOwner @@ -72,11 +76,12 @@ - linked bridged TKO to `0xA9d23408b9bA935c230493c40C73824Df71A0975` @tx`0xe25d05320b95fbc3bffe0b7cbfe351dd5fa6413db307d5c28f7b70983567a43b` - linked bridged USDC to `0x07d83526730c7438048D55A4fc0b850e2aaB6f0b` @tx`0xf1752ac712779e9ae53d408abdc5eec70e63582433143d6d91a489a1e8fc4778` - changed owner to `0xCa5b76Cc7A38b86Db11E5aE5B1fc9740c3bA3DE8` @tx`0xf68861171c602e3e75ca69e950957fcb908c7949c6df9a9ea3026c238ebb1e9c` + - upgrade impl to `0xb96AbB41b01E3ad519D00E80355a1c3801910F62` @commit`9345f14` @tx`0xdbe9caf2b1282d0fecf9a752f2c1aeade8820bb66bb5ad210f0081996504173b` #### erc721_vault - proxy: `0x1670000000000000000000000000000000000003` -- impl: `0xD68BFe63E0f2983D89cbB225BEd068a8f19f5e08` +- impl: `0xd532f20a4751156C566Da7745db95E7f80145B36` - owner: `0xCa5b76Cc7A38b86Db11E5aE5B1fc9740c3bA3DE8` - todo: - change owner to DelegateOwner @@ -85,11 +90,12 @@ - redeployed on May 22, 2024 @commit`b955e0e` - upgrade to `0xD68BFe63E0f2983D89cbB225BEd068a8f19f5e08` @`0x8705703a93cb4cfc1ae69d1277f4464f807c7615237f2b04ff010c6e45708d34` - changed owner to `0xCa5b76Cc7A38b86Db11E5aE5B1fc9740c3bA3DE8` @tx`0xf68861171c602e3e75ca69e950957fcb908c7949c6df9a9ea3026c238ebb1e9c` + - upgrade impl to `0xd532f20a4751156C566Da7745db95E7f80145B36` @commit`9345f14` @tx`0xdbe9caf2b1282d0fecf9a752f2c1aeade8820bb66bb5ad210f0081996504173b` #### erc1155_vault - proxy: `0x1670000000000000000000000000000000000004` -- impl: `0x3918a2910C393A1A2EF7AAc807970EFE47A54b7e` +- impl: `0xBBBC4ad39488b990E095042fa6c59A90d3817846` - owner: `0xCa5b76Cc7A38b86Db11E5aE5B1fc9740c3bA3DE8` - todo: - change owner to DelegateOwner @@ -98,6 +104,7 @@ - redeployed on May 22, 2024 @commit`b955e0e` - upgrade to `0x3918a2910C393A1A2EF7AAc807970EFE47A54b7e` @tx`0x264a2a553672a5480141638c3ca00a7bdf2c54e48c53f41867ca4f64703e16d7` - changed owner to `0xCa5b76Cc7A38b86Db11E5aE5B1fc9740c3bA3DE8` @tx`0xf68861171c602e3e75ca69e950957fcb908c7949c6df9a9ea3026c238ebb1e9c` + - upgrade impl to `0xBBBC4ad39488b990E095042fa6c59A90d3817846` @commit`9345f14` @tx`0xdbe9caf2b1282d0fecf9a752f2c1aeade8820bb66bb5ad210f0081996504173b` #### signal_service @@ -110,7 +117,6 @@ - changed owner to `0xCa5b76Cc7A38b86Db11E5aE5B1fc9740c3bA3DE8` @tx`0xf68861171c602e3e75ca69e950957fcb908c7949c6df9a9ea3026c238ebb1e9c` - todo: - change owner to DelegateOwner - - update signal service ## Rollup Specific @@ -133,7 +139,7 @@ #### taikoL2 - proxy: `0x1670000000000000000000000000000000010001` -- impl: `0x0167000000000000000000000000000000010001` +- impl: `0x75E76c367D6be621bD90e4b1e32fBB3fF59150b6` - owner: `0xCa5b76Cc7A38b86Db11E5aE5B1fc9740c3bA3DE8` - todo: - change owner to DelegateOwner @@ -141,6 +147,7 @@ - deployed on May 1, 2024 @commit`56dddf2b6` - redeployed on May 22, 2024 @commit`b955e0e` - changed owner to `0xCa5b76Cc7A38b86Db11E5aE5B1fc9740c3bA3DE8` @tx`0xf68861171c602e3e75ca69e950957fcb908c7949c6df9a9ea3026c238ebb1e9c` + - upgrade impl to `0x75E76c367D6be621bD90e4b1e32fBB3fF59150b6` @commit`9345f14` @tx`0xdbe9caf2b1282d0fecf9a752f2c1aeade8820bb66bb5ad210f0081996504173b` #### bridged_taiko_token diff --git a/packages/protocol/deployments/mainnet-transfer-logs-L1.md b/packages/protocol/deployments/mainnet-transfer-logs-L1.md index 53f75e6ec75..41222580562 100644 --- a/packages/protocol/deployments/mainnet-transfer-logs-L1.md +++ b/packages/protocol/deployments/mainnet-transfer-logs-L1.md @@ -12,11 +12,11 @@ #### tx`0x9ede1da0bb372fbaa210bb1847172888b30e8a3cc68c9d868ec066ca3301f480` -- labs.taiko.eth depositted 10 ETH to proposer: `0x000000633b68f5d8d3a86593ebb815b4663bcbe0` -- labs.taiko.eth depositted 10 ETH to prover: `0x000000629FBCf27A347d1AEbA658435230D74a5f` -- labs.taiko.eth depositted 5 ETH to contester: `0x00000027F51a57E7FcBC4b481d15fcE5BE68b30B` -- labs.taiko.eth depositted 0.01 ETH to bridge watchdog: `0x00000291ab79c55dc4fcd97dfba4880df4b93624` -- labs.taiko.eth depositted 5 ETH to bridge L1 relayer: `0x0000001539d3a970c979ac67a8836a359ce4a1fc` +- labs.taiko.eth deposited 10 ETH to proposer: `0x000000633b68f5d8d3a86593ebb815b4663bcbe0` +- labs.taiko.eth deposited 10 ETH to prover: `0x000000629FBCf27A347d1AEbA658435230D74a5f` +- labs.taiko.eth deposited 5 ETH to contester: `0x00000027F51a57E7FcBC4b481d15fcE5BE68b30B` +- labs.taiko.eth deposited 0.01 ETH to bridge watchdog: `0x00000291ab79c55dc4fcd97dfba4880df4b93624` +- labs.taiko.eth deposited 5 ETH to bridge L1 relayer: `0x0000001539d3a970c979ac67a8836a359ce4a1fc` - labs.taiko.eth transferred 5 ETH to Daniel Wang: `0x69AA0361Dbb0527d4F1e5312403Bd41788fe61Fe` #### tx`0xdb04aa0f162cd84cadae96135e471575108954d552a873d42027b579140ca182` diff --git a/packages/protocol/docs/analysis/MrPotatoMagic-Analysis.md b/packages/protocol/docs/analysis/MrPotatoMagic-Analysis.md index e9138690c4c..8e523b65c69 100644 --- a/packages/protocol/docs/analysis/MrPotatoMagic-Analysis.md +++ b/packages/protocol/docs/analysis/MrPotatoMagic-Analysis.md @@ -13,7 +13,7 @@ Day 2-7 - Reviewing base contracts (least inherited) - Adding inline bookmarks for notes -- Understanding RLP encoding, EIP-4844, +- Understanding RLP encoding, EIP-4844 Day 8-12 @@ -51,7 +51,7 @@ Day 19-21 1. The biggest trust assumption in the contract is the owner role handling all the Address manager contracts. This role can pause the contracts at anytime. 2. The second trust assumption is the guardians multisig. Currently, the guardians are trusted and will be removed over time. But since they are the highest tier, the centralization risk in the proving system exists. -3. ANother role is the bridge watchdog. This role can ban and suspend any messages at will. It is the most important risk of the bridge contracts. +3. Another role is the bridge watchdog. This role can ban and suspend any messages at will. It is the most important risk of the bridge contracts. 4. The snapshooter role has some risks associated since it takes snapshots on the TaikoToken. There are more roles in the codebase but these are the foremost and most central to the protocol. @@ -110,7 +110,7 @@ Eventually, after the best tier i.e. highest tier proof (ZK proof) is solid and 4. Benefits of Based Contestable Rollup - Abstraction of special if-else code into a tier-based proof system makes the developers aware that the team cannot just shut down the chain uasing guardian prover and does not have control over it. -- Taiko has 3 types of bonds - validity bonds, contestation bonds and liveness bonds. We've spoken about the first two. Liveness bonds are basically, le's say, I have a prover off-chain and this prover is supposed to submit the proof within 15 minutes, then if the prover does not submit the proof in that time, then the prover's liveness bond is burnt. +- Taiko has 3 types of bonds - validity bonds, contestation bonds and liveness bonds. We've spoken about the first two. Liveness bonds are basically, let's say, I have a prover off-chain and this prover is supposed to submit the proof within 15 minutes, then if the prover does not submit the proof in that time, then the prover's liveness bond is burnt. - As an app dev, you can always change your config a long way. You can just use one layer-1 transaction to go from 100% optimistic to 100% ZK rollup. - As ZK becomes more trustworthy, the team will slowly increase the % to ZK until they become fully ZK and remove the guardian prover. @@ -147,7 +147,7 @@ End game: multiple zkVMs (Guardians removed) There are a few risks associated with the protocol: -- The protocol does not have a robust on-chain fee estimation mechanism. On calling the on-chain functions, the relayers should provide the contracts with upto date prices for users or atleast maintain a default amount of gas to send across. +- The protocol does not have a robust on-chain fee estimation mechanism. On calling the on-chain functions, the relayers should provide the contracts with up to date prices for users or atleast maintain a default amount of gas to send across. - The protocol would not work perfectly with swapping protocols. This is because the bridge includes invocation delays which can cause swaps to go outdated. - There is an issue related to custom coinbase transfers which can create a risk among block proposers. diff --git a/packages/protocol/docs/analysis/Sathish9098-Analysis.md b/packages/protocol/docs/analysis/Sathish9098-Analysis.md index 44ef49b993c..64f022ad978 100644 --- a/packages/protocol/docs/analysis/Sathish9098-Analysis.md +++ b/packages/protocol/docs/analysis/Sathish9098-Analysis.md @@ -277,7 +277,7 @@ The `LibVerifying` library is part of the Taiko protocol and is designed for han - `init(TaikoData.State storage _state, TaikoData.Config memory _config, bytes32 _genesisBlockHash)` : Sets up initial protocol state using specified configuration and genesis block hash, ensuring the protocol is ready for operation from a clearly defined starting point. -- `verifyBlocks(TaikoData.State storage _state, TaikoData.Config memory _config, IAddressResolver _resolver, uint64 _maxBlocksToVerify)` : Processes and verifies up to `_maxBlocksToVerify` blocks based on established transition rules and updates their state as verified, maintaining blockchain integrity. +- `verifyBlocks(TaikoData.State storage _state, TaikoData.Config memory _config, IAddressResolver _resolver, uint64 _maxBlocksToVerifyPerProposal)` : Processes and verifies up to `_maxBlocksToVerifyPerProposal` blocks based on established transition rules and updates their state as verified, maintaining blockchain integrity. - `_syncChainData(TaikoData.Config memory _config, IAddressResolver _resolver, uint64 _lastVerifiedBlockId, bytes32 _stateRoot)` : Internally updates external systems with the latest verified blockchain data, ensuring consistency across the protocol and external references. diff --git a/packages/protocol/docs/analysis/kaveyjoe-Analysis.md b/packages/protocol/docs/analysis/kaveyjoe-Analysis.md index c02ec09ac44..0e79b3b3765 100644 --- a/packages/protocol/docs/analysis/kaveyjoe-Analysis.md +++ b/packages/protocol/docs/analysis/kaveyjoe-Analysis.md @@ -63,7 +63,7 @@ The block will then mark complete on the chain. The block status changes from gr - The block consists of a transaction list (txList) and metadata. The txList of an L2 block will eventually (when EIP-4844 is live) be part of a blob in the L1 Consensus Layer (CL). - txList is not directly accessible to L1 contracts. Therefore, a ZKP shall prove that the chosen txList is a slice of the given blob data. -- Block validity criteria that all blocks need to respect: K_maxBobSize, K_BlockMaxTxs, K_BlockMaxGasLimit and config.anchorTxGasLimit +- Block validity criteria that all blocks need to respect: K_maxBlockSize, K_BlockMaxTxs, K_BlockMaxGasLimit and config.anchorTxGasLimit - Once the block is proposed, the Taiko client checks if the block is decoded into a list of transactions - Taiko client validates each enclosed transaction and generates a tracelog for each transaction for the prover to use as witness data. If a tx is invalid, it will be dropped. - The first transaction in the Taiko L2 block is always an anchoring transaction, which verifies the 256 hashes of the latest blocks, the L2 chain ID and the EIP-1559 base fee @@ -96,7 +96,7 @@ L2 tx fee = L2 EIP-1559* base fee + L1 tx fee + prover fee + proposer fee* L2 EIP-1559 fee = L2 EIP-1559 tip (goes to the proposer) + L2 EIP-1559 base fee (goes to the Taiko DAO). -Once a proposer has collected enough transactions, most probably including and ordering them with the intent to generate a (maxim) profit, they create a block. +Once a proposer has collected enough transactions, most probably including and ordering them with the intent to generate a (maximum) profit, they create a block. - Profit means that for the proposer, the sum of transaction fees (L2 tx fees) from the block is larger than L1 tx fee + prover fee + EIP-1559 base fee. diff --git a/packages/protocol/docs/how_taiko_is_deployed.md b/packages/protocol/docs/how_taiko_is_deployed.md index 70d25938054..23ab68cfa20 100644 --- a/packages/protocol/docs/how_taiko_is_deployed.md +++ b/packages/protocol/docs/how_taiko_is_deployed.md @@ -2,6 +2,6 @@ The Taiko protocol smart contracts are deployed on L1 and L2. The L2 contracts are pre-deployed first by creating a genesis block, and then the L1 contracts are deployed using a script. The general flow is like this: -1. A `genesis.json` is generated, which includes the L2 contracts (see: [generate genesis](../utils/generate_genesis/main.ts)). +1. A `genesis.json` is generated, which includes the L2 contracts (see: [generate genesis](../utils/generate_genesis/generate.ts)). 2. The `genesis.json` is used as input to generate the genesis block (see: https://geth.ethereum.org/docs/fundamentals/private-network#creating-genesis-block). -3. The L1 smart contracts are deployed by executing the L1 deployment script, [DeployOnL1.s.sol](../script/DeployOnL1.s.sol). The L1 deployment script takes in artifacts from the L2 deployment such as the deployed contract addresses, and genesis block hash. +3. The L1 smart contracts are deployed by executing the L1 deployment script, [DeployProtocolOnL1.s.sol](../script/layer1/DeployProtocolOnL1.s.sol). The L1 deployment script takes in artifacts from the L2 deployment such as the deployed contract addresses, and genesis block hash. diff --git a/packages/protocol/docs/how_taiko_proves_blocks.md b/packages/protocol/docs/how_taiko_proves_blocks.md index 1d1dd7dcf08..6f66bc6ab02 100644 --- a/packages/protocol/docs/how_taiko_proves_blocks.md +++ b/packages/protocol/docs/how_taiko_proves_blocks.md @@ -68,7 +68,7 @@ Note that the anchor transaction emits an `Anchored` event that may help ZKP to ZKP shall also check the signature of the anchor transaction: - The signer must be _`TaikoL2.GOLDEN_TOUCH_ADDRESS`_. -- The signature must use `1` as the `k` value if the calculated `r` is not `0`, otherwise, `k` must be `2`. See [LibL2Signer.sol](https://github.com/taikoxyz/taiko-mono/blob/main/packages/protocol/test/L2/LibL2Signer.sol). +- The signature must use `1` as the `k` value if the calculated `r` is not `0`, otherwise, `k` must be `2`. See [LibL2Signer.sol](https://github.com/taikoxyz/taiko-mono/blob/main/packages/protocol/test/layer2/LibL2Signer.sol). ### Block Metadata diff --git a/packages/protocol/foundry.toml b/packages/protocol/foundry.toml index 9e3b3b0465c..f66986cfb74 100644 --- a/packages/protocol/foundry.toml +++ b/packages/protocol/foundry.toml @@ -1,7 +1,4 @@ [profile.default] -src = "contracts" -out = "out" -test = "test" script = "script" gas_price = 10_000_000_000 # 10 Gwei gas_limit = "18446744073709551615" # u64::MAX @@ -9,15 +6,23 @@ optimizer = true optimizer_runs = 200 ffi = true memory_limit = 2_073_741_824 -solc_version = "0.8.24" -evm_version = "cancun" +solc_version = "0.8.27" remappings = [ - "@openzeppelin/contracts-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/", - "@openzeppelin/contracts/=node_modules/@openzeppelin/contracts/", - "solady/=node_modules/solady/", + "openzeppelin/=node_modules/@openzeppelin/", + "@openzeppelin=node_modules/@openzeppelin", + "@openzeppelin-upgrades/contracts/=node_modules/@openzeppelin/contracts-upgradeable/", + "@risc0/contracts/=node_modules/risc0-ethereum/contracts/src/", + "@solady/=node_modules/solady/", + "@optimism/=node_modules/optimism/", + "@sp1-contracts/=node_modules/sp1-contracts/contracts/", "forge-std/=node_modules/forge-std/", "ds-test/=node_modules/ds-test/src/", - "p256-verifier/=node_modules/p256-verifier/", + "@p256-verifier/contracts/=node_modules/p256-verifier/src/", + "eigenlayer-middleware/=node_modules/eigenlayer-middleware/", + "eigenlayer-contracts/=node_modules/eigenlayer-contracts/", + "src/=contracts/", + "test/=test/", + "script/=script/", ] # Do not change the block_gas_limit value, TaikoL2.t.sol depends on it. @@ -29,6 +34,7 @@ fs_permissions = [ { access = "read", path = "./out" }, { access = "read-write", path = "./deployments" }, { access = "read", path = "./test" }, + { access = "read", path = "./script/" }, { access = "read", path = "./genesis" }, ] @@ -48,5 +54,23 @@ multiline_func_header = "all" number_underscore = "thousands" wrap_comments = true +[profile.layer1] +src = "contracts/layer1" +test = "test/layer1" +script = "script/layer1" +out = "out/layer1" +evm_version = "cancun" + +[profile.layer2] +src = "contracts/layer2" +test = "test/layer2" +script = "script/layer2" +out = "out/layer2" +evm_version = "shanghai" + [profile.genesis] -test = "genesis" +src = "contracts/layer2" +test = "test/genesis" +script = "script/layer2" +out = "out/layer2" +evm_version = "shanghai" \ No newline at end of file diff --git a/packages/protocol/package.json b/packages/protocol/package.json index a57d6cf02f4..cf9f5272977 100644 --- a/packages/protocol/package.json +++ b/packages/protocol/package.json @@ -1,22 +1,27 @@ { "name": "@taiko/protocol", - "version": "1.6.0", + "version": "1.11.0", "private": true, "scripts": { "buildMerkle": "ts-node ./utils/airdrop/buildMerkleTree.ts ./utils/airdrop/airdrop_db/example_claimList.json", - "clean": "rm -rf abis cache* && forge clean", - "compile": "forge build --build-info --extra-output storage-layout", - "layout": "./deployments/gen-layouts.sh", - "test:deploy": "./script/download_solc.sh && ./script/test_deploy_on_l1.sh", + "clean": "rm -rf out abis cache* && forge clean", + "compile:l1": "FOUNDRY_PROFILE=layer1 forge build --build-info --extra-output storage-layout", + "compile:l2": "FOUNDRY_PROFILE=layer2 forge build --build-info --extra-output storage-layout", + "compile:genesis": "FOUNDRY_PROFILE=genesis forge build --build-info --extra-output storage-layout", + "compile": "pnpm compile:l1 && pnpm compile:l2", + "test:l1": "FOUNDRY_PROFILE=layer1 forge test -vvv --extra-output storage-layout", + "test:l2": "FOUNDRY_PROFILE=layer2 forge test -vvv --extra-output storage-layout", + "test": "pnpm test:l1 && pnpm test:l2", + "layout:l1": "./script/gen-layouts.sh layer1", + "layout:l2": "./script/gen-layouts.sh layer2", + "layout": "pnpm layout:l1 && pnpm layout:l2", + "test:deploy:l1": "./script/download_solc.sh && ./script/layer1/deploy_protocol_on_l1.sh", "eslint": "pnpm exec eslint --fix --ignore-path .eslintignore --ext .js,.ts .", - "fmt:sol": "forge fmt", - "generate:genesis": "ts-node ./utils/generate_genesis/main.ts", - "lint:sol": "forge fmt && pnpm solhint 'contracts/**/*.sol'", - "snapshot": "forge snapshot --match-path 'test/**/*.t.sol'", - "test": "forge test -vvv --match-path test/*.t.sol", + "fmt:sol": "forge fmt && pnpm solhint 'contracts/**/*.sol'", "test:coverage": "mkdir -p coverage && forge coverage --report lcov && lcov --remove ./lcov.info -o ./coverage/lcov.info 'test/' 'script/' 'contracts/thirdparty/' && genhtml coverage/lcov.info --branch-coverage --output-dir coverage --ignore-errors category && open coverage/index.html", - "test:genesis": "pnpm compile && FOUNDRY_PROFILE=genesis ./genesis/generate_genesis.test.sh", - "export:simconf": "mkdir -p simulation/out && forge test --match-test 'test_L2_NoFeeCheck_simulation' -vv > simulation/out/simconf_$(date +%s).txt" + "genesis:gen": "pnpm compile:l2 && ts-node ./test/genesis/generate/generate.ts", + "genesis:test": "./test/genesis/genesis.test.sh", + "export:simconf": "mkdir -p simulation/out && FOUNDRY_PROFILE=layer2 forge test --match-test 'test_L2_NoFeeCheck_simulation' -vv > simulation/out/simconf_$(date +%s).txt" }, "devDependencies": { "@types/node": "^20.11.30", @@ -31,7 +36,7 @@ "eslint-plugin-promise": "^6.1.1", "ethers": "^5.7.2", "solc": "0.8.24", - "solhint": "^5.0.1", + "solhint": "^5.0.3", "ts-node": "^10.9.2", "typescript": "^5.2.2" }, @@ -39,9 +44,14 @@ "@openzeppelin/contracts": "4.9.6", "@openzeppelin/contracts-upgradeable": "4.9.6", "ds-test": "github:dapphub/ds-test#e282159d5170298eb2455a6c05280ab5a73a4ef0", + "eigenlayer-contracts": "github:Layr-labs/eigenlayer-contracts#dev", + "eigenlayer-middleware": "github:layr-Labs/eigenlayer-middleware#mainnet", "forge-std": "github:foundry-rs/forge-std#v1.7.5", - "merkletreejs": "^0.3.11", + "merkletreejs": "^0.4.0", + "optimism": "github:ethereum-optimism/optimism#v1.8.0", "p256-verifier": "github:taikoxyz/p256-verifier#v0.1.0", - "solady": "github:Vectorized/solady#v0.0.167" + "risc0-ethereum": "github:risc0/risc0-ethereum#v1.1.2", + "solady": "github:Vectorized/solady#v0.0.231", + "sp1-contracts": "github:succinctlabs/sp1-contracts#v3.0.0" } } diff --git a/packages/protocol/script/download_solc.sh b/packages/protocol/script/download_solc.sh index 8c77c315a8a..0f078855856 100755 --- a/packages/protocol/script/download_solc.sh +++ b/packages/protocol/script/download_solc.sh @@ -11,7 +11,7 @@ fi mkdir -p "$(dirname "${solc_bin}")" -VERSION=v0.8.24 +VERSION=v0.8.27 if [ "$(uname)" = 'Darwin' ]; then SOLC_FILE_NAME=solc-macos diff --git a/packages/protocol/script/gen-layouts.sh b/packages/protocol/script/gen-layouts.sh new file mode 100755 index 00000000000..f3e74433b8d --- /dev/null +++ b/packages/protocol/script/gen-layouts.sh @@ -0,0 +1,113 @@ +#!/bin/bash + +# Define the list of contracts to inspect +# Please try not to change the order +# Contracts shared between layer 1 and layer 2 +contracts_shared=( +"contracts/shared/tokenvault/ERC1155Vault.sol:ERC1155Vault" +"contracts/shared/tokenvault/ERC20Vault.sol:ERC20Vault" +"contracts/shared/tokenvault/ERC721Vault.sol:ERC721Vault" +"contracts/shared/tokenvault/BridgedERC20.sol:BridgedERC20" +"contracts/shared/tokenvault/BridgedERC20V2.sol:BridgedERC20V2" +"contracts/shared/tokenvault/BridgedERC721.sol:BridgedERC721" +"contracts/shared/tokenvault/BridgedERC1155.sol:BridgedERC1155" +"contracts/shared/bridge/Bridge.sol:Bridge" +"contracts/shared/bridge/QuotaManager.sol:QuotaManager" +"contracts/shared/common/AddressManager.sol:AddressManager" +"contracts/shared/common/AddressResolver.sol:AddressResolver" +"contracts/shared/common/EssentialContract.sol:EssentialContract" +"contracts/shared/signal/SignalService.sol:SignalService" +) + +# Layer 1 contracts +contracts_layer1=( +"contracts/layer1/token/TaikoToken.sol:TaikoToken" +"contracts/layer1/verifiers/compose/ComposeVerifier.sol:ComposeVerifier" +"contracts/layer1/verifiers/compose/TeeAnyVerifier.sol:TeeAnyVerifier" +"contracts/layer1/verifiers/compose/ZkAndTeeVerifier.sol:ZkAndTeeVerifier" +"contracts/layer1/verifiers/compose/ZkAnyVerifier.sol:ZkAnyVerifier" +"contracts/layer1/verifiers/Risc0Verifier.sol:Risc0Verifier" +"contracts/layer1/verifiers/SP1Verifier.sol:SP1Verifier" +"contracts/layer1/verifiers/SgxVerifier.sol:SgxVerifier" +"contracts/layer1/automata-attestation/AutomataDcapV3Attestation.sol:AutomataDcapV3Attestation" +"contracts/layer1/based/TaikoL1.sol:TaikoL1" +"contracts/layer1/hekla/HeklaTaikoL1.sol:HeklaTaikoL1" +"contracts/layer1/hekla/HeklaTierRouter.sol:HeklaTierRouter" +"contracts/layer1/mainnet/multirollup/MainnetBridge.sol:MainnetBridge" +"contracts/layer1/mainnet/multirollup/MainnetSignalService.sol:MainnetSignalService" +"contracts/layer1/mainnet/multirollup/MainnetERC20Vault.sol:MainnetERC20Vault" +"contracts/layer1/mainnet/multirollup/MainnetERC1155Vault.sol:MainnetERC1155Vault" +"contracts/layer1/mainnet/multirollup/MainnetERC721Vault.sol:MainnetERC721Vault" +"contracts/layer1/mainnet/multirollup/MainnetSharedAddressManager.sol:MainnetSharedAddressManager" +"contracts/layer1/mainnet/addrcache/RollupAddressCache.sol:RollupAddressCache" +"contracts/layer1/mainnet/addrcache/SharedAddressCache.sol:SharedAddressCache" +"contracts/layer1/mainnet/addrcache/AddressCache.sol:AddressCache" +"contracts/layer1/mainnet/rollup/verifiers/MainnetSgxVerifier.sol:MainnetSgxVerifier" +"contracts/layer1/mainnet/rollup/verifiers/MainnetSP1Verifier.sol:MainnetSP1Verifier" +"contracts/layer1/mainnet/rollup/verifiers/MainnetZkAnyVerifier.sol:MainnetZkAnyVerifier" +"contracts/layer1/mainnet/rollup/verifiers/MainnetRisc0Verifier.sol:MainnetRisc0Verifier" +"contracts/layer1/mainnet/rollup/verifiers/MainnetZkAndTeeVerifier.sol:MainnetZkAndTeeVerifier" +"contracts/layer1/mainnet/rollup/verifiers/MainnetTeeAnyVerifier.sol:MainnetTeeAnyVerifier" +"contracts/layer1/mainnet/rollup/MainnetGuardianProver.sol:MainnetGuardianProver" +"contracts/layer1/mainnet/rollup/MainnetTaikoL1.sol:MainnetTaikoL1" +"contracts/layer1/mainnet/rollup/MainnetRollupAddressManager.sol:MainnetRollupAddressManager" +"contracts/layer1/mainnet/rollup/MainnetTierRouter.sol:MainnetTierRouter" +"contracts/layer1/mainnet/rollup/MainnetProverSet.sol:MainnetProverSet" +"contracts/layer1/team/tokenunlock/TokenUnlock.sol:TokenUnlock" +"contracts/layer1/provers/ProverSet.sol:ProverSet" +"contracts/layer1/provers/GuardianProver.sol:GuardianProver" +"contracts/layer1/fork/ForkManager.sol:ForkManager" +) + +# Layer 2 contracts +contracts_layer2=( +"contracts/layer2/token/BridgedTaikoToken.sol:BridgedTaikoToken" +"contracts/layer2/DelegateOwner.sol:DelegateOwner" +"contracts/layer2/based/TaikoL2.sol:TaikoL2" +"contracts/layer2/hekla/HeklaTaikoL2.sol:HeklaTaikoL2" +"contracts/layer2/mainnet/MainnetTaikoL2.sol:MainnetTaikoL2" +) + +profile=$1 + +if [ "$profile" == "layer1" ]; then + echo "Generating layer 1 contract layouts..." + contracts=("${contracts_shared[@]}" "${contracts_layer1[@]}") +elif [ "$profile" == "layer2" ]; then + echo "Generating layer 2 contract layouts..." + contracts=("${contracts_shared[@]}" "${contracts_layer2[@]}") +else + echo "Invalid profile. Please enter either 'layer1' or 'layer2'." + exit 1 +fi + +# Empty the output file initially +output_file="contract_layout_${profile}.md" +> $output_file + +# Loop over each contract +for contract in "${contracts[@]}"; do + # Run forge inspect and append to the file + # Ensure correct concatenation of the command without commas + echo "inspect ${contract}" + + echo "## ${contract}" >> $output_file + FORGE_DISPLAY=plain FOUNDRY_PROFILE=${profile} forge inspect -C ./contracts/${profile} -o ./out/${profile} ${contract} storagelayout --pretty >> $output_file + echo "" >> $output_file +done + +sed_pattern='s|contracts/.*/\([^/]*\)\.sol:\([^/]*\)|\2|g' + +if [[ "$(uname -s)" == "Darwin" ]]; then + sed -i '' "$sed_pattern" "$output_file" +else + sed -i "$sed_pattern" "$output_file" +fi + +# Use awk to remove the last column and write to a temporary file +temp_file="${output_file}_temp" +while IFS= read -r line; do + # Remove everything behind the second-to-last "|" + echo "$line" | sed -E 's/\|[^|]*\|[^|]*$/|/' +done < "$output_file" > "$temp_file" +mv "$temp_file" "$output_file" \ No newline at end of file diff --git a/packages/protocol/script/AddSGXVerifierInstances.s.sol b/packages/protocol/script/layer1/AddSGXVerifierInstances.s.sol similarity index 86% rename from packages/protocol/script/AddSGXVerifierInstances.s.sol rename to packages/protocol/script/layer1/AddSGXVerifierInstances.s.sol index a4abb02152f..13179a4cbd8 100644 --- a/packages/protocol/script/AddSGXVerifierInstances.s.sol +++ b/packages/protocol/script/layer1/AddSGXVerifierInstances.s.sol @@ -1,8 +1,8 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; -import "../test/DeployCapability.sol"; -import "../contracts/verifiers/SgxVerifier.sol"; +import "test/shared/DeployCapability.sol"; +import "src/layer1/verifiers/SgxVerifier.sol"; contract AddSGXVerifierInstances is DeployCapability { uint256 public privateKey = vm.envUint("PRIVATE_KEY"); diff --git a/packages/protocol/script/DeployERC20Airdrop.s.sol b/packages/protocol/script/layer1/DeployERC20Airdrop.s.sol similarity index 94% rename from packages/protocol/script/DeployERC20Airdrop.s.sol rename to packages/protocol/script/layer1/DeployERC20Airdrop.s.sol index 70d0f7f3d42..c726ca9b0dd 100644 --- a/packages/protocol/script/DeployERC20Airdrop.s.sol +++ b/packages/protocol/script/layer1/DeployERC20Airdrop.s.sol @@ -1,8 +1,8 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; -import "../test/DeployCapability.sol"; -import "../contracts/team/airdrop/ERC20Airdrop.sol"; +import "test/shared/DeployCapability.sol"; +import "src/layer1/team/airdrop/ERC20Airdrop.sol"; // @KorbinianK , @2manslkh // As written also in the tests the workflow shall be the following (checklist): diff --git a/packages/protocol/script/layer1/DeployHeklaL2Contracts.s.sol b/packages/protocol/script/layer1/DeployHeklaL2Contracts.s.sol new file mode 100644 index 00000000000..94d2c612f35 --- /dev/null +++ b/packages/protocol/script/layer1/DeployHeklaL2Contracts.s.sol @@ -0,0 +1,35 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "test/shared/DeployCapability.sol"; +import "src/shared/bridge/Bridge.sol"; +import "src/shared/common/AddressManager.sol"; +import "../../contracts/layer2/hekla/HeklaTaikoL2.sol"; +import "../../contracts/shared/tokenvault/BridgedERC20V2.sol"; + +contract DeployHeklaL2Contracts is DeployCapability { + uint256 public privateKey = vm.envUint("PRIVATE_KEY"); + + modifier broadcast() { + require(privateKey != 0, "invalid private key"); + vm.startBroadcast(privateKey); + _; + vm.stopBroadcast(); + } + + function run() external broadcast { + // TaikoL2 + address heklaTaikoL2 = address(new HeklaTaikoL2()); + // Bridge + address bridge = address(new Bridge()); + // Address manager + address addressManager = address(new AddressManager()); + // Bridged ERC20 V2 + address bridgedERC20V2 = address(new BridgedERC20V2()); + + console2.log("> hekla_taiko_l2@", heklaTaikoL2); + console2.log("> bridge@", bridge); + console2.log("> address_manager@", addressManager); + console2.log("> bridged_erc20_v2@", bridgedERC20V2); + } +} diff --git a/packages/protocol/script/DeployLabsProverPool.s.sol b/packages/protocol/script/layer1/DeployLabsProverPool.s.sol similarity index 84% rename from packages/protocol/script/DeployLabsProverPool.s.sol rename to packages/protocol/script/layer1/DeployLabsProverPool.s.sol index b258e441e4d..a109d51c68d 100644 --- a/packages/protocol/script/DeployLabsProverPool.s.sol +++ b/packages/protocol/script/layer1/DeployLabsProverPool.s.sol @@ -1,8 +1,8 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; -import "../test/DeployCapability.sol"; -import "../contracts/team/proving/ProverSet.sol"; +import "test/shared/DeployCapability.sol"; +import "src/layer1/provers/ProverSet.sol"; contract DeployLabsProverPool is DeployCapability { address public addressManager = 0x579f40D0BE111b823962043702cabe6Aaa290780; diff --git a/packages/protocol/script/DeployOnL1.s.sol b/packages/protocol/script/layer1/DeployProtocolOnL1.s.sol similarity index 66% rename from packages/protocol/script/DeployOnL1.s.sol rename to packages/protocol/script/layer1/DeployProtocolOnL1.s.sol index 4a6619668a3..3f97218e85e 100644 --- a/packages/protocol/script/DeployOnL1.s.sol +++ b/packages/protocol/script/layer1/DeployProtocolOnL1.s.sol @@ -1,45 +1,51 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import "@openzeppelin/contracts/utils/Strings.sol"; - -import "../contracts/common/LibStrings.sol"; -import "../contracts/tko/TaikoToken.sol"; -import "../contracts/L1/TaikoL1.sol"; -import "../contracts/L1/provers/GuardianProver.sol"; -import "../contracts/L1/tiers/DevnetTierProvider.sol"; -import "../contracts/L1/tiers/TierProviderV2.sol"; -import "../contracts/L1/hooks/AssignmentHook.sol"; -import "../contracts/bridge/Bridge.sol"; -import "../contracts/tokenvault/BridgedERC20.sol"; -import "../contracts/tokenvault/BridgedERC721.sol"; -import "../contracts/tokenvault/BridgedERC1155.sol"; -import "../contracts/tokenvault/ERC20Vault.sol"; -import "../contracts/tokenvault/ERC1155Vault.sol"; -import "../contracts/tokenvault/ERC721Vault.sol"; -import "../contracts/signal/SignalService.sol"; -import "../contracts/automata-attestation/AutomataDcapV3Attestation.sol"; -import "../contracts/automata-attestation/utils/SigVerifyLib.sol"; -import "../contracts/automata-attestation/lib/PEMCertChainLib.sol"; -import "../contracts/verifiers/SgxVerifier.sol"; -import "../contracts/team/proving/ProverSet.sol"; -import "../test/common/erc20/FreeMintERC20.sol"; -import "../test/common/erc20/MayFailFreeMintERC20.sol"; -import "../test/L1/TestTierProvider.sol"; -import "../test/DeployCapability.sol"; +import "@risc0/contracts/groth16/RiscZeroGroth16Verifier.sol"; +import { SP1Verifier as SuccinctVerifier } from "@sp1-contracts/src/v3.0.0/SP1VerifierPlonk.sol"; // Actually this one is deployed already on mainnet, but we are now deploying our own (non via-ir) // version. For mainnet, it is easier to go with one of: // - https://github.com/daimo-eth/p256-verifier // - https://github.com/rdubois-crypto/FreshCryptoLib -import { P256Verifier } from "p256-verifier/src/P256Verifier.sol"; - -/// @title DeployOnL1 +import "@p256-verifier/contracts/P256Verifier.sol"; + +import "src/shared/common/LibStrings.sol"; +import "src/shared/tokenvault/BridgedERC1155.sol"; +import "src/shared/tokenvault/BridgedERC20.sol"; +import "src/shared/tokenvault/BridgedERC721.sol"; +import "src/layer1/automata-attestation/AutomataDcapV3Attestation.sol"; +import "src/layer1/automata-attestation/lib/PEMCertChainLib.sol"; +import "src/layer1/automata-attestation/utils/SigVerifyLib.sol"; +import "src/layer1/devnet/DevnetTaikoL1.sol"; +import "src/layer1/devnet/DevnetTierRouter.sol"; +import "src/layer1/mainnet/rollup/MainnetGuardianProver.sol"; +import "src/layer1/mainnet/rollup/MainnetTaikoL1.sol"; +import "src/layer1/mainnet/rollup/MainnetTierRouter.sol"; +import "src/layer1/mainnet/rollup/verifiers/MainnetSgxVerifier.sol"; +import "src/layer1/mainnet/multirollup/MainnetBridge.sol"; +import "src/layer1/mainnet/multirollup/MainnetERC1155Vault.sol"; +import "src/layer1/mainnet/multirollup/MainnetERC20Vault.sol"; +import "src/layer1/mainnet/multirollup/MainnetERC721Vault.sol"; +import "src/layer1/mainnet/multirollup/MainnetSignalService.sol"; +import "src/layer1/provers/GuardianProver.sol"; +import "src/layer1/provers/ProverSet.sol"; +import "src/layer1/token/TaikoToken.sol"; +import "src/layer1/verifiers/Risc0Verifier.sol"; +import "src/layer1/verifiers/SP1Verifier.sol"; +import "test/layer1/based/TestTierRouter.sol"; +import "test/shared/token/FreeMintERC20.sol"; +import "test/shared/token/MayFailFreeMintERC20.sol"; +import "test/shared/DeployCapability.sol"; + +/// @title DeployProtocolOnL1 /// @notice This script deploys the core Taiko protocol smart contract on L1, /// initializing the rollup. -contract DeployOnL1 is DeployCapability { +contract DeployProtocolOnL1 is DeployCapability { uint256 public NUM_MIN_MAJORITY_GUARDIANS = vm.envUint("NUM_MIN_MAJORITY_GUARDIANS"); uint256 public NUM_MIN_MINORITY_GUARDIANS = vm.envUint("NUM_MIN_MINORITY_GUARDIANS"); + address public DAO_FALLBACK_PROPOSER = 0xD3f681bD6B49887A48cC9C9953720903967E9DC0; address public constant MAINNET_CONTRACT_OWNER = 0x9CBeE534B5D8a6280e01a14844Ee8aF350399C7F; // admin.taiko.eth @@ -149,9 +155,17 @@ contract DeployOnL1 is DeployCapability { ), registerTo: sharedAddressManager }); + } else { + register(sharedAddressManager, "taiko_token", taikoToken); } + register(sharedAddressManager, "bond_token", taikoToken); // Deploy Bridging contracts + deployProxy({ + name: "mainnet_signal_service", + impl: address(new MainnetSignalService()), + data: abi.encodeCall(SignalService.init, (address(0), sharedAddressManager)) + }); deployProxy({ name: "signal_service", impl: address(new SignalService()), @@ -159,6 +173,11 @@ contract DeployOnL1 is DeployCapability { registerTo: sharedAddressManager }); + deployProxy({ + name: "mainnet_bridge", + impl: address(new MainnetBridge()), + data: abi.encodeCall(Bridge.init, (address(0), sharedAddressManager)) + }); address brdige = deployProxy({ name: "bridge", impl: address(new Bridge()), @@ -182,6 +201,11 @@ contract DeployOnL1 is DeployCapability { console2.log("- sharedAddressManager : ", sharedAddressManager); // Deploy Vaults + deployProxy({ + name: "mainnet_erc20_vault", + impl: address(new MainnetERC20Vault()), + data: abi.encodeCall(ERC20Vault.init, (owner, sharedAddressManager)) + }); deployProxy({ name: "erc20_vault", impl: address(new ERC20Vault()), @@ -189,6 +213,11 @@ contract DeployOnL1 is DeployCapability { registerTo: sharedAddressManager }); + deployProxy({ + name: "mainnet_erc721_vault", + impl: address(new MainnetERC721Vault()), + data: abi.encodeCall(ERC721Vault.init, (owner, sharedAddressManager)) + }); deployProxy({ name: "erc721_vault", impl: address(new ERC721Vault()), @@ -196,6 +225,11 @@ contract DeployOnL1 is DeployCapability { registerTo: sharedAddressManager }); + deployProxy({ + name: "mainnet_erc1155_vault", + impl: address(new MainnetERC1155Vault()), + data: abi.encodeCall(ERC1155Vault.init, (owner, sharedAddressManager)) + }); deployProxy({ name: "erc1155_vault", impl: address(new ERC1155Vault()), @@ -243,12 +277,34 @@ contract DeployOnL1 is DeployCapability { // --------------------------------------------------------------- // Register shared contracts in the new rollup copyRegister(rollupAddressManager, _sharedAddressManager, "taiko_token"); + copyRegister(rollupAddressManager, _sharedAddressManager, "bond_token"); copyRegister(rollupAddressManager, _sharedAddressManager, "signal_service"); - copyRegister(rollupAddressManager, _sharedAddressManager, "bridge"); + // copyRegister(rollupAddressManager, _sharedAddressManager, "bridge"); + + deployProxy({ + name: "mainnet_taiko", + impl: address(new MainnetTaikoL1()), + data: abi.encodeCall( + TaikoL1.init, + ( + owner, + rollupAddressManager, + vm.envBytes32("L2_GENESIS_HASH"), + vm.envBool("PAUSE_TAIKO_L1") + ) + ) + }); + + TaikoL1 taikoL1; + if (keccak256(abi.encode(vm.envString("TIER_ROUTER"))) == keccak256(abi.encode("devnet"))) { + taikoL1 = TaikoL1(address(new DevnetTaikoL1())); + } else { + taikoL1 = TaikoL1(address(new TaikoL1())); + } deployProxy({ name: "taiko", - impl: address(new TaikoL1()), + impl: address(taikoL1), data: abi.encodeCall( TaikoL1.init, ( @@ -262,10 +318,9 @@ contract DeployOnL1 is DeployCapability { }); deployProxy({ - name: "assignment_hook", - impl: address(new AssignmentHook()), - data: abi.encodeCall(AssignmentHook.init, (owner, rollupAddressManager)), - registerTo: rollupAddressManager + name: "mainnet_tier_sgx", + impl: address(new MainnetSgxVerifier()), + data: abi.encodeCall(SgxVerifier.init, (owner, rollupAddressManager)) }); deployProxy({ @@ -275,6 +330,12 @@ contract DeployOnL1 is DeployCapability { registerTo: rollupAddressManager }); + deployProxy({ + name: "mainnet_guardian_prover_minority", + impl: address(new MainnetGuardianProver()), + data: abi.encodeCall(GuardianProver.init, (address(0), rollupAddressManager)) + }); + address guardianProverImpl = address(new GuardianProver()); address guardianProverMinority = deployProxy({ @@ -283,7 +344,7 @@ contract DeployOnL1 is DeployCapability { data: abi.encodeCall(GuardianProver.init, (address(0), rollupAddressManager)) }); - GuardianProver(guardianProverMinority).enableTaikoTokenAllowance(true); + GuardianProver(guardianProverMinority).enableBondAllowance(true); address guardianProver = deployProxy({ name: "guardian_prover", @@ -296,7 +357,7 @@ contract DeployOnL1 is DeployCapability { register( rollupAddressManager, "tier_router", - address(deployTierProvider(vm.envString("TIER_PROVIDER"))) + address(deployTierRouter(vm.envString("TIER_ROUTER"))) ); address[] memory guardians = vm.envAddress("GUARDIAN_PROVERS", ","); @@ -322,7 +383,8 @@ contract DeployOnL1 is DeployCapability { name: "automata_dcap_attestation", impl: automateDcapV3AttestationImpl, data: abi.encodeCall( - AutomataDcapV3Attestation.init, (owner, address(sigVerifyLib), address(pemCertChainLib)) + AutomataDcapV3Attestation.init, (owner, address(sigVerifyLib), + address(pemCertChainLib)) ), registerTo: rollupAddressManager }); @@ -339,15 +401,57 @@ contract DeployOnL1 is DeployCapability { ProverSet.init, (owner, vm.envAddress("PROVER_SET_ADMIN"), rollupAddressManager) ) }); + + // Log addresses for the user to register sgx instance + console2.log("SigVerifyLib", address(sigVerifyLib)); + console2.log("PemCertChainLib", address(pemCertChainLib)); + console2.log("AutomataDcapVaAttestation", automataProxy); + + deployProxy({ + name: "prover_set", + impl: address(new ProverSet()), + data: abi.encodeCall( + ProverSet.init, (owner, vm.envAddress("PROVER_SET_ADMIN"), rollupAddressManager) + ) + }); + + deployZKVerifiers(owner, rollupAddressManager); + } + + // deploy both sp1 & risc0 verifiers. + // using function to avoid stack too deep error + function deployZKVerifiers(address owner, address rollupAddressManager) private { + // Deploy r0 groth16 verifier + RiscZeroGroth16Verifier verifier = + new RiscZeroGroth16Verifier(ControlID.CONTROL_ROOT, ControlID.BN254_CONTROL_ID); + register(rollupAddressManager, "risc0_groth16_verifier", address(verifier)); + + deployProxy({ + name: "tier_zkvm_risc0", + impl: address(new Risc0Verifier()), + data: abi.encodeCall(Risc0Verifier.init, (owner, rollupAddressManager)), + registerTo: rollupAddressManager + }); + + // Deploy sp1 plonk verifier + SuccinctVerifier succinctVerifier = new SuccinctVerifier(); + register(rollupAddressManager, "sp1_remote_verifier", address(succinctVerifier)); + + deployProxy({ + name: "tier_zkvm_sp1", + impl: address(new SP1Verifier()), + data: abi.encodeCall(SP1Verifier.init, (owner, rollupAddressManager)), + registerTo: rollupAddressManager + }); } - function deployTierProvider(string memory tierProviderName) private returns (address) { - if (keccak256(abi.encode(tierProviderName)) == keccak256(abi.encode("devnet"))) { - return address(new DevnetTierProvider()); - } else if (keccak256(abi.encode(tierProviderName)) == keccak256(abi.encode("testnet"))) { - return address(new TestTierProvider()); - } else if (keccak256(abi.encode(tierProviderName)) == keccak256(abi.encode("mainnet"))) { - return address(new TierProviderV2()); + function deployTierRouter(string memory tierRouterName) private returns (address) { + if (keccak256(abi.encode(tierRouterName)) == keccak256(abi.encode("devnet"))) { + return address(new DevnetTierRouter()); + } else if (keccak256(abi.encode(tierRouterName)) == keccak256(abi.encode("testnet"))) { + return address(new TestTierRouter()); + } else if (keccak256(abi.encode(tierRouterName)) == keccak256(abi.encode("mainnet"))) { + return address(new MainnetTierRouter(DAO_FALLBACK_PROPOSER)); } else { revert("invalid tier provider"); } diff --git a/packages/protocol/script/layer1/DeployProverSet.s.sol b/packages/protocol/script/layer1/DeployProverSet.s.sol new file mode 100644 index 00000000000..924b1d5e590 --- /dev/null +++ b/packages/protocol/script/layer1/DeployProverSet.s.sol @@ -0,0 +1,39 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "src/layer1/provers/ProverSet.sol"; +import "test/shared/DeployCapability.sol"; + +contract DeployProverSet is DeployCapability { + modifier broadcast() { + vm.startBroadcast(); + _; + vm.stopBroadcast(); + } + + function run() external broadcast { + address owner = vm.envOr("PROVER_SET_OWNER", msg.sender); + address admin = vm.envOr("PROVER_SET_ADMIN", msg.sender); + address addressManager = vm.envAddress("ROLLUP_ADDRESS_MANAGER"); + + addressNotNull(owner, "invalid owner address"); + addressNotNull(admin, "invalid admin address"); + addressNotNull(addressManager, "invalid rollup address manager address"); + + address proverSet = address(new ProverSet()); + + address proxy = deployProxy({ + name: "prover_set", + impl: proverSet, + data: abi.encodeCall(ProverSet.init, (owner, admin, addressManager)) + }); + + console2.log(); + console2.log("Deployed ProverSet impl at address: %s", proverSet); + console2.log("Deployed ProverSet proxy at address: %s", proxy); + } + + function addressNotNull(address addr, string memory err) private pure { + require(addr != address(0), err); + } +} diff --git a/packages/protocol/script/DeployL1QuotaManager.s.sol b/packages/protocol/script/layer1/DeployQuotaManager.s.sol similarity index 90% rename from packages/protocol/script/DeployL1QuotaManager.s.sol rename to packages/protocol/script/layer1/DeployQuotaManager.s.sol index c28aeb3419e..77d7d1fefcc 100644 --- a/packages/protocol/script/DeployL1QuotaManager.s.sol +++ b/packages/protocol/script/layer1/DeployQuotaManager.s.sol @@ -1,10 +1,10 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; -import "../test/DeployCapability.sol"; -import "../contracts/bridge/QuotaManager.sol"; +import "test/shared/DeployCapability.sol"; +import "src/shared/bridge/QuotaManager.sol"; -contract DeployL1QuotaManager is DeployCapability { +contract DeployQuotaManager is DeployCapability { uint256 public privateKey = vm.envUint("PRIVATE_KEY"); // MAINNET_L1_SHARED_ADDRESS_MANAGER: 0xEf9EaA1dd30a9AA1df01c36411b5F082aA65fBaa address public addressManager = vm.envAddress("L1_SHARED_ADDRESS_MANAGER"); diff --git a/packages/protocol/script/layer1/DeployRisc0Verifier.s.sol b/packages/protocol/script/layer1/DeployRisc0Verifier.s.sol new file mode 100644 index 00000000000..353a5557f33 --- /dev/null +++ b/packages/protocol/script/layer1/DeployRisc0Verifier.s.sol @@ -0,0 +1,28 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.24; + +import "@risc0/contracts/groth16/RiscZeroGroth16Verifier.sol"; +import "test/shared/DeployCapability.sol"; +import "src/layer1/verifiers/Risc0Verifier.sol"; + +contract DeployRisc0Verifier is DeployCapability { + uint256 public deployerPrivKey = vm.envUint("PRIVATE_KEY"); + address public rollupAddressManager = vm.envAddress("ROLLUP_ADDRESS_MANAGER"); + + function run() external { + require(deployerPrivKey != 0, "invalid deployer priv key"); + require(rollupAddressManager != address(0), "invalid rollup address manager address"); + + vm.startBroadcast(deployerPrivKey); + RiscZeroGroth16Verifier verifier = + new RiscZeroGroth16Verifier(ControlID.CONTROL_ROOT, ControlID.BN254_CONTROL_ID); + register(rollupAddressManager, "risc0_groth16_verifier", address(verifier)); + deployProxy({ + name: "tier_zkvm_risc0", + impl: address(new Risc0Verifier()), + data: abi.encodeCall(Risc0Verifier.init, (address(0), rollupAddressManager)), + registerTo: rollupAddressManager + }); + vm.stopBroadcast(); + } +} diff --git a/packages/protocol/script/layer1/DeploySP1Verifier.s.sol b/packages/protocol/script/layer1/DeploySP1Verifier.s.sol new file mode 100644 index 00000000000..9f6f5f898ae --- /dev/null +++ b/packages/protocol/script/layer1/DeploySP1Verifier.s.sol @@ -0,0 +1,31 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import { SP1Verifier as SuccinctVerifier } from "@sp1-contracts/src/v3.0.0/SP1VerifierPlonk.sol"; +import "test/shared/DeployCapability.sol"; +import "src/layer1/verifiers/SP1Verifier.sol"; + +contract DeploySP1Verifier is DeployCapability { + uint256 public deployerPrivKey = vm.envUint("PRIVATE_KEY"); + address public rollupAddressManager = vm.envAddress("ROLLUP_ADDRESS_MANAGER"); + + function run() external { + require(deployerPrivKey != 0, "invalid deployer priv key"); + require(rollupAddressManager != address(0), "invalid rollup address manager address"); + + vm.startBroadcast(deployerPrivKey); + + // Deploy sp1 plonk verifier + SuccinctVerifier succinctVerifier = new SuccinctVerifier(); + register(rollupAddressManager, "sp1_remote_verifier", address(succinctVerifier)); + + deployProxy({ + name: "tier_zkvm_sp1", + impl: address(new SP1Verifier()), + data: abi.encodeCall(SP1Verifier.init, (address(0), rollupAddressManager)), + registerTo: rollupAddressManager + }); + + vm.stopBroadcast(); + } +} diff --git a/packages/protocol/script/DeployTaikoToken.s.sol b/packages/protocol/script/layer1/DeployTaikoToken.s.sol similarity index 88% rename from packages/protocol/script/DeployTaikoToken.s.sol rename to packages/protocol/script/layer1/DeployTaikoToken.s.sol index 1279aa5527c..9684aea4870 100644 --- a/packages/protocol/script/DeployTaikoToken.s.sol +++ b/packages/protocol/script/layer1/DeployTaikoToken.s.sol @@ -1,8 +1,8 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; -import "../test/DeployCapability.sol"; -import "../contracts/tko/TaikoToken.sol"; +import "test/shared/DeployCapability.sol"; +import "src/layer1/token/TaikoToken.sol"; contract DeployTaikoToken is DeployCapability { uint256 public privateKey = vm.envUint("PRIVATE_KEY"); diff --git a/packages/protocol/script/layer1/SendMessageToDelegateOwner.s.sol b/packages/protocol/script/layer1/SendMessageToDelegateOwner.s.sol new file mode 100644 index 00000000000..acb6ec105f8 --- /dev/null +++ b/packages/protocol/script/layer1/SendMessageToDelegateOwner.s.sol @@ -0,0 +1,56 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "forge-std/src/Script.sol"; +import "src/shared/bridge/IBridge.sol"; +import "src/layer2/DelegateOwner.sol"; +import "test/shared/thirdparty/Multicall3.sol"; + +contract SendMessageToDelegateOwner is Script { + address public delegateOwner = 0x5995941Df88F30Ac140515AA39832db963E2f863; + address public delegateOwnerImpl = 0x1f0511cDae2fbfD93563469dA02b82dEd320C8Bd; + address public multicall3 = 0xcA11bde05977b3631167028862bE2a173976CA11; + address public l1Bridge = 0xd60247c6848B7Ca29eDdF63AA924E53dB6Ddd8EC; + address public testAccount1 = 0x3c181965C5cFAE61a9010A283e5e0C1445649810; + + modifier broadcast() { + vm.startBroadcast(); + _; + vm.stopBroadcast(); + } + + function run() external broadcast { + Multicall3.Call3[] memory calls = new Multicall3.Call3[](2); + calls[0].target = delegateOwner; + calls[0].allowFailure = false; + calls[0].callData = abi.encodeCall(DelegateOwner.setAdmin, (testAccount1)); + + calls[1].target = delegateOwner; + calls[1].allowFailure = false; + calls[1].callData = abi.encodeCall(UUPSUpgradeable.upgradeTo, (delegateOwnerImpl)); + + DelegateOwner.Call memory dcall = DelegateOwner.Call({ + txId: 1, // Has to match with DelegateOwner's nextTxId or 0 + target: multicall3, + isDelegateCall: true, + txdata: abi.encodeCall(Multicall3.aggregate3, (calls)) + }); + + // Use https://bridge.taiko.xyz/relayer to manually trigger the message if necessary. + IBridge.Message memory message = IBridge.Message({ + id: 0, + fee: 0, + gasLimit: 1_000_000, // cannot be zero + from: msg.sender, + srcChainId: 1, + srcOwner: msg.sender, + destChainId: 167_000, + destOwner: delegateOwner, + to: delegateOwner, + value: 0, + data: abi.encodeCall(DelegateOwner.onMessageInvocation, abi.encode(dcall)) + }); + + IBridge(l1Bridge).sendMessage(message); + } +} diff --git a/packages/protocol/script/SetDcapParams.s.sol b/packages/protocol/script/layer1/SetDcapParams.s.sol similarity index 94% rename from packages/protocol/script/SetDcapParams.s.sol rename to packages/protocol/script/layer1/SetDcapParams.s.sol index 9f65aa2eaa1..9a38c703ce0 100644 --- a/packages/protocol/script/SetDcapParams.s.sol +++ b/packages/protocol/script/layer1/SetDcapParams.s.sol @@ -1,10 +1,10 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import "forge-std/src/Script.sol"; import "forge-std/src/console2.sol"; -import "../test/automata-attestation/common/AttestationBase.t.sol"; +import "test/layer1/automata-attestation/common/AttestationBase.t.sol"; contract SetDcapParams is Script, AttestationBase { uint256 public ownerPrivateKey = vm.envUint("PRIVATE_KEY"); // Owner of the attestation contract @@ -67,7 +67,7 @@ contract SetDcapParams is Script, AttestationBase { } function _configureTcbInfoJson() internal { - tcbInfoPath = vm.envString("TCB_INFO_PATH"); + string memory tcbInfoPath = vm.envString("TCB_INFO_PATH"); string memory tcbInfoJson = vm.readFile(string.concat(vm.projectRoot(), tcbInfoPath)); configureTcbInfoJson(dcapAttestationAddress, tcbInfoJson); console2.logString("TCB_INFO_JSON set: "); diff --git a/packages/protocol/script/layer1/UpdateMainnetOntakeL1.s.sol b/packages/protocol/script/layer1/UpdateMainnetOntakeL1.s.sol new file mode 100644 index 00000000000..97d945f3a72 --- /dev/null +++ b/packages/protocol/script/layer1/UpdateMainnetOntakeL1.s.sol @@ -0,0 +1,42 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "test/shared/DeployCapability.sol"; +import "src/layer1/mainnet/multirollup/MainnetSharedAddressManager.sol"; +import "src/layer1/mainnet/multirollup/MainnetSignalService.sol"; +import "src/layer1/mainnet/multirollup/MainnetBridge.sol"; +import "src/layer1/mainnet/rollup/MainnetRollupAddressManager.sol"; +import "src/layer1/mainnet/rollup/MainnetTaikoL1.sol"; +import "src/layer1/mainnet/rollup/verifiers/MainnetSgxVerifier.sol"; +import "src/layer1/provers/GuardianProver.sol"; +import "src/layer1/mainnet/rollup/MainnetProverSet.sol"; + +contract UpgradeMainnetOntakeL1 is DeployCapability { + uint256 public privateKey = vm.envUint("PRIVATE_KEY"); + + modifier broadcast() { + require(privateKey != 0, "invalid private key"); + vm.startBroadcast(privateKey); + _; + vm.stopBroadcast(); + } + + function run() external broadcast { + // MainnetSharedAddressManager + console2.log(address(new MainnetSharedAddressManager())); + // MainnetSignalService + console2.log(address(new MainnetSignalService())); + // MainnetBridge + console2.log(address(new MainnetBridge())); + // MainnetRollupAddressManager + console2.log(address(new MainnetRollupAddressManager())); + // MainnetTaikoL1 + console2.log(address(new MainnetTaikoL1())); + // MainnetSgxVerifier + console2.log(address(new MainnetSgxVerifier())); + // GuardianProver + console2.log(address(new GuardianProver())); + // MainnetProverSet + console2.log(address(new MainnetProverSet())); + } +} diff --git a/packages/protocol/script/layer1/UpdateRisc0Verifier.s.sol b/packages/protocol/script/layer1/UpdateRisc0Verifier.s.sol new file mode 100644 index 00000000000..f63398eb35a --- /dev/null +++ b/packages/protocol/script/layer1/UpdateRisc0Verifier.s.sol @@ -0,0 +1,21 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.24; + +import "@risc0/contracts/groth16/RiscZeroGroth16Verifier.sol"; +import "test/shared/DeployCapability.sol"; + +contract UpdateRisc0Verifier is DeployCapability { + uint256 public deployerPrivKey = vm.envUint("PRIVATE_KEY"); + address public rollupAddressManager = vm.envAddress("ROLLUP_ADDRESS_MANAGER"); + + function run() external { + require(deployerPrivKey != 0, "invalid deployer priv key"); + require(rollupAddressManager != address(0), "invalid rollup address manager address"); + + vm.startBroadcast(deployerPrivKey); + RiscZeroGroth16Verifier verifier = + new RiscZeroGroth16Verifier(ControlID.CONTROL_ROOT, ControlID.BN254_CONTROL_ID); + register(rollupAddressManager, "risc0_groth16_verifier", address(verifier)); + vm.stopBroadcast(); + } +} diff --git a/packages/protocol/script/layer1/UpdateSP1Verifier.s.sol b/packages/protocol/script/layer1/UpdateSP1Verifier.s.sol new file mode 100644 index 00000000000..a9d74e0004c --- /dev/null +++ b/packages/protocol/script/layer1/UpdateSP1Verifier.s.sol @@ -0,0 +1,23 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "@sp1-contracts/src/v3.0.0/SP1VerifierPlonk.sol"; +import "test/shared/DeployCapability.sol"; + +contract UpdateSP1Verifier is DeployCapability { + uint256 public deployerPrivKey = vm.envUint("PRIVATE_KEY"); + address public rollupAddressManager = vm.envAddress("ROLLUP_ADDRESS_MANAGER"); + + function run() external { + require(deployerPrivKey != 0, "invalid deployer priv key"); + require(rollupAddressManager != address(0), "invalid rollup address manager address"); + + vm.startBroadcast(deployerPrivKey); + + // Deploy sp1 plonk verifier + SP1Verifier sp1Verifier = new SP1Verifier(); + register(rollupAddressManager, "sp1_remote_verifier", address(sp1Verifier)); + + vm.stopBroadcast(); + } +} diff --git a/packages/protocol/script/layer1/UpgradeHeklaOntakeL1.s.sol b/packages/protocol/script/layer1/UpgradeHeklaOntakeL1.s.sol new file mode 100644 index 00000000000..4dc0498eeda --- /dev/null +++ b/packages/protocol/script/layer1/UpgradeHeklaOntakeL1.s.sol @@ -0,0 +1,52 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol"; +import "test/shared/DeployCapability.sol"; +import "src/layer1/hekla/HeklaTaikoL1.sol"; +import "src/shared/bridge/Bridge.sol"; +import "src/shared/common/AddressManager.sol"; +import "src/layer1/provers/ProverSet.sol"; +import "src/layer1/provers/GuardianProver.sol"; + +contract UpgradeHeklaOntakeL1 is DeployCapability { + uint256 public privateKey = vm.envUint("PRIVATE_KEY"); + + modifier broadcast() { + require(privateKey != 0, "invalid private key"); + vm.startBroadcast(privateKey); + _; + vm.stopBroadcast(); + } + + function run() external broadcast { + // TaikoL1 + UUPSUpgradeable(0x79C9109b764609df928d16fC4a91e9081F7e87DB).upgradeTo( + address(new HeklaTaikoL1()) + ); + // Bridge + UUPSUpgradeable(0xA098b76a3Dd499D3F6D58D8AcCaFC8efBFd06807).upgradeTo(address(new Bridge())); + // Rollup address manager + UUPSUpgradeable(0x1F027871F286Cf4B7F898B21298E7B3e090a8403).upgradeTo( + address(new AddressManager()) + ); + // Shared address manager + UUPSUpgradeable(0x7D3338FD5e654CAC5B10028088624CA1D64e74f7).upgradeTo( + address(new AddressManager()) + ); + // Prover set + UUPSUpgradeable(0xD3f681bD6B49887A48cC9C9953720903967E9DC0).upgradeTo( + address(new ProverSet()) + ); + UUPSUpgradeable(0x335103c4fa2F55451975082136F1478eCFeB84B9).upgradeTo( + address(new ProverSet()) + ); + // Guardian Prover + UUPSUpgradeable(0x92F195a8702da2104aE8E3E10779176E7C35d6BC).upgradeTo( + address(new GuardianProver()) + ); + UUPSUpgradeable(0x31d4d27da5c299d4b6CE19c869B8891C0002795d).upgradeTo( + address(new GuardianProver()) + ); + } +} diff --git a/packages/protocol/script/layer1/UpgradeHeklaOntakeL2.s.sol b/packages/protocol/script/layer1/UpgradeHeklaOntakeL2.s.sol new file mode 100644 index 00000000000..c6b7cfd815f --- /dev/null +++ b/packages/protocol/script/layer1/UpgradeHeklaOntakeL2.s.sol @@ -0,0 +1,77 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol"; +import "test/shared/DeployCapability.sol"; +import "src/layer2/hekla/HeklaTaikoL2.sol"; +import "src/shared/bridge/Bridge.sol"; +import "src/shared/common/AddressManager.sol"; +import "test/shared/thirdparty/Multicall3.sol"; +import "src/layer2/DelegateOwner.sol"; + +contract UpgradeHeklaOntakeL2 is DeployCapability { + address public delegateOwner = 0x95F6077C7786a58FA070D98043b16DF2B1593D2b; + address public multicall3 = 0xcA11bde05977b3631167028862bE2a173976CA11; + + uint256 public privateKey = vm.envUint("PRIVATE_KEY"); + address public newHeklaTaikoL2 = vm.envAddress("NEW_HEKLA_TAIKO_L2"); + address public newBridge = vm.envAddress("NEW_BRIDGE"); + address public newAddressManager = vm.envAddress("NEW_ADDRESS_MANAGER"); + address public newBridgedERC20 = vm.envAddress("NEW_BRIDGED_ERC20"); + + modifier broadcast() { + require(privateKey != 0, "invalid private key"); + vm.startBroadcast(privateKey); + _; + vm.stopBroadcast(); + } + + function run() external broadcast { + Multicall3.Call3[] memory calls = new Multicall3.Call3[](5); + // TaikoL2 + calls[0].target = 0x1670090000000000000000000000000000010001; + calls[0].allowFailure = false; + calls[0].callData = abi.encodeCall(UUPSUpgradeable.upgradeTo, (newHeklaTaikoL2)); + // Bridge + calls[1].target = 0x1670090000000000000000000000000000000001; + calls[1].allowFailure = false; + calls[1].callData = abi.encodeCall(UUPSUpgradeable.upgradeTo, (newBridge)); + // Rollup address manager + calls[2].target = 0x1670090000000000000000000000000000010002; + calls[2].allowFailure = false; + calls[2].callData = abi.encodeCall(UUPSUpgradeable.upgradeTo, (newAddressManager)); + // Shared address manager + calls[3].target = 0x1670090000000000000000000000000000000006; + calls[3].allowFailure = false; + calls[3].callData = abi.encodeCall(UUPSUpgradeable.upgradeTo, (newAddressManager)); + // Register Bridged ERC20 + calls[4].target = 0x1670090000000000000000000000000000000006; + calls[4].allowFailure = false; + calls[4].callData = abi.encodeCall( + AddressManager.setAddress, (167_009, bytes32(bytes("bridged_erc20")), newBridgedERC20) + ); + + DelegateOwner.Call memory dcall = DelegateOwner.Call({ + txId: 0, + target: multicall3, + isDelegateCall: true, + txdata: abi.encodeCall(Multicall3.aggregate3, (calls)) + }); + + IBridge.Message memory message = IBridge.Message({ + id: 0, + fee: 0, + gasLimit: 3_000_000, + from: msg.sender, + srcChainId: 17_000, + srcOwner: msg.sender, + destChainId: 167_009, + destOwner: delegateOwner, + to: delegateOwner, + value: 0, + data: abi.encodeCall(DelegateOwner.onMessageInvocation, abi.encode(dcall)) + }); + + IBridge(0xA098b76a3Dd499D3F6D58D8AcCaFC8efBFd06807).sendMessage(message); + } +} diff --git a/packages/protocol/script/config_dcap_sgx_verifier.sh b/packages/protocol/script/layer1/config_dcap_sgx_verifier.sh similarity index 93% rename from packages/protocol/script/config_dcap_sgx_verifier.sh rename to packages/protocol/script/layer1/config_dcap_sgx_verifier.sh index 0a115ea164d..ae55b2683a5 100755 --- a/packages/protocol/script/config_dcap_sgx_verifier.sh +++ b/packages/protocol/script/layer1/config_dcap_sgx_verifier.sh @@ -2,7 +2,7 @@ usage() { echo \ -'Run "PRIVATE_KEY=0x1234 ./script/config_dcap_sgx_verifier.sh +'Run "PRIVATE_KEY=0x1234 ./script/config_dcap_sgx_verifier.sh --tcb file_path: config tcb --eq file_path: config qe --mrenclave hex_string: config mrenclave @@ -29,11 +29,21 @@ if [ $# -eq 0 ]; then exit 1 fi -# replace with the correct address of the verifier/attester/pemCertChain. +# dev addresses of the verifier/attester/pemCertChain. +# export SGX_VERIFIER_ADDRESS=0xebB0DA61818F639f460F67940EB269b36d1F104E +# export ATTESTATION_ADDRESS=0xCFd1a900c9C0aB14443460b8F011d8076db636c2 +# export PEM_CERTCHAIN_ADDRESS=0xaa22e95F5Bf27E07c02e6cc41A700597832FA30d + +# Hekla addresses of the verifier/attester/pemCertChain. export SGX_VERIFIER_ADDRESS=0x532EFBf6D62720D0B2a2Bb9d11066E8588cAE6D9 export ATTESTATION_ADDRESS=0xC6cD3878Fc56F2b2BaB0769C580fc230A95e1398 export PEM_CERTCHAIN_ADDRESS=0x08d7865e7F534d743Aba5874A9AD04bcB223a92E +# Mainnet addresses of the verifier/attester/pemCertChain. Uncomment this and comment out the above if running for mainnet! +# export SGX_VERIFIER_ADDRESS=0xb0f3186FC1963f774f52ff455DC86aEdD0b31F81 +# export ATTESTATION_ADDRESS=0x8d7C954960a36a7596d7eA4945dDf891967ca8A3 +# export PEM_CERTCHAIN_ADDRESS=0x02772b7B3a5Bea0141C993Dbb8D0733C19F46169 + # default value # for setMrEnclave which should be called by the owner of the verifier MR_ENCLAVE=0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef @@ -58,7 +68,7 @@ toggle_check=0 vm_file_path() { local file_path="$1" local parent_dir=$(dirname "$file_path") - local trimmed_path="/test/automata-attestation/assets/$(basename "$parent_dir")/$(basename "$file_path")" + local trimmed_path="/test/layer1/automata-attestation/assets/$(basename "$parent_dir")/$(basename "$file_path")" echo "$trimmed_path" } @@ -142,7 +152,7 @@ MR_SIGNER=$MR_SIGNER \ QEID_PATH=$QEID_PATH \ TCB_INFO_PATH=$TCB_INFO_PATH \ V3_QUOTE_BYTES=$V3_QUOTE_BYTES \ -forge script script/SetDcapParams.s.sol:SetDcapParams \ +forge script script/layer1/SetDcapParams.s.sol:SetDcapParams \ --fork-url $FORK_URL \ --broadcast \ --evm-version cancun \ diff --git a/packages/protocol/script/layer1/deploy_protocol_on_l1.sh b/packages/protocol/script/layer1/deploy_protocol_on_l1.sh new file mode 100755 index 00000000000..53345e7f5ff --- /dev/null +++ b/packages/protocol/script/layer1/deploy_protocol_on_l1.sh @@ -0,0 +1,21 @@ +#!/bin/sh + +# This script is only used by `pnpm test:deploy:l1`. +set -e + +forge script ./script/layer1/DeployProtocolOnL1.s.sol:DeployProtocolOnL1 \ + --fork-url $FORK_URL \ + --broadcast \ + --ffi \ + -vvvv \ + --private-key $PRIVATE_KEY \ + --block-gas-limit 200000000 + +forge script ./script/layer1/DeployTaikoToken.s.sol:DeployTaikoToken \ + --fork-url $FORK_URL \ + --broadcast \ + --skip-simulation \ + --ffi \ + -vvvv \ + --private-key $PRIVATE_KEY \ + --block-gas-limit 200000000 diff --git a/packages/protocol/script/layer1/preconf/BaseScript.sol b/packages/protocol/script/layer1/preconf/BaseScript.sol new file mode 100644 index 00000000000..e0a8926d9ae --- /dev/null +++ b/packages/protocol/script/layer1/preconf/BaseScript.sol @@ -0,0 +1,28 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "forge-std/src/Script.sol"; +import "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; + +contract BaseScript is Script { + modifier broadcast() { + uint256 privateKey = vm.envUint("PRIVATE_KEY"); + require(privateKey != 0, "BaseScript: invalid private key"); + + vm.startBroadcast(); + _; + vm.stopBroadcast(); + } + + function deployProxy( + address _impl, + address _admin, + bytes memory _data + ) + internal + returns (address) + { + TransparentUpgradeableProxy proxy = new TransparentUpgradeableProxy(_impl, _admin, _data); + return address(proxy); + } +} diff --git a/packages/protocol/script/layer1/preconf/deployment/DeployAVS.s.sol b/packages/protocol/script/layer1/preconf/deployment/DeployAVS.s.sol new file mode 100644 index 00000000000..702f4df46a4 --- /dev/null +++ b/packages/protocol/script/layer1/preconf/deployment/DeployAVS.s.sol @@ -0,0 +1,73 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "forge-std/src/Script.sol"; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol"; +import "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; + +import "src/layer1/based/ITaikoL1.sol"; +import "src/layer1/preconf/impl/PreconfRegistry.sol"; +import "src/layer1/preconf/avs-mvp/PreconfServiceManager.sol"; +import "src/layer1/preconf/avs-mvp/iface/IAVSDirectory.sol"; +import "src/layer1/preconf/avs-mvp/iface/ISlasher.sol"; +import "src/layer1/preconf/impl/PreconfTaskManager.sol"; + +import "../BaseScript.sol"; +import "../misc/EmptyContract.sol"; + +contract DeployAVS is BaseScript { + // Required by service manager + address public implDirectory = vm.envAddress("AVS_DIRECTORY"); + address public slasher = vm.envAddress("SLASHER"); + + // Required by task manager + address public taikoL1 = vm.envAddress("TAIKO_L1"); + address public taikoToken = vm.envAddress("TAIKO_TOKEN"); + uint256 public beaconGenesisTimestamp = vm.envUint("BEACON_GENESIS_TIMESTAMP"); + address public beaconBlockRootContract = vm.envAddress("BEACON_BLOCK_ROOT_CONTRACT"); + + function run() external broadcast { + EmptyContract emptyContract = new EmptyContract(); + ProxyAdmin proxyAdmin = new ProxyAdmin(); + + // Deploy proxies with empty implementations + address preconfRegistry = deployProxy(address(emptyContract), address(proxyAdmin), ""); + address preconfServiceManager = deployProxy(address(emptyContract), address(proxyAdmin), ""); + address preconfTaskManager = deployProxy(address(emptyContract), address(proxyAdmin), ""); + + // Deploy implementations + PreconfRegistry preconfRegistryImpl = + new PreconfRegistry(IPreconfServiceManager(preconfServiceManager)); + PreconfServiceManager preconfServiceManagerImpl = new PreconfServiceManager( + preconfRegistry, preconfTaskManager, IAVSDirectory(implDirectory), ISlasher(slasher) + ); + PreconfTaskManager preconfTaskManagerImpl = new PreconfTaskManager( + IPreconfServiceManager(preconfServiceManager), + IPreconfRegistry(preconfRegistry), + ITaikoL1(taikoL1), + beaconGenesisTimestamp, + beaconBlockRootContract + ); + + // Upgrade proxies with implementations + proxyAdmin.upgradeAndCall( + ITransparentUpgradeableProxy(preconfRegistry), + address(preconfRegistryImpl), + abi.encodeCall(PreconfRegistry.init, ()) + ); + proxyAdmin.upgrade( + ITransparentUpgradeableProxy(preconfServiceManager), address(preconfServiceManagerImpl) + ); + proxyAdmin.upgradeAndCall( + ITransparentUpgradeableProxy(preconfTaskManager), + address(preconfTaskManagerImpl), + abi.encodeCall(PreconfTaskManager.init, IERC20(taikoToken)) + ); + + console2.log("Proxy admin: ", address(proxyAdmin)); + console2.log("Preconf Registry: ", preconfRegistry); + console2.log("Preconf Service Manager: ", preconfServiceManager); + console2.log("Preconf Task Manager: ", preconfTaskManager); + } +} diff --git a/packages/protocol/script/layer1/preconf/deployment/DeployEigenlayerMVP.s.sol b/packages/protocol/script/layer1/preconf/deployment/DeployEigenlayerMVP.s.sol new file mode 100644 index 00000000000..cec20b27f87 --- /dev/null +++ b/packages/protocol/script/layer1/preconf/deployment/DeployEigenlayerMVP.s.sol @@ -0,0 +1,50 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "forge-std/src/Script.sol"; +import "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol"; +import "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; + +import "src/layer1/preconf/avs-mvp/impl/DelegationManager.sol"; +import "src/layer1/preconf/avs-mvp/impl/StrategyManager.sol"; +import "src/layer1/preconf/avs-mvp/impl/Slasher.sol"; +import "src/layer1/preconf/avs-mvp/impl/AVSDirectory.sol"; + +import "../BaseScript.sol"; +import "../misc/EmptyContract.sol"; + +contract DeployEigenlayerMVP is BaseScript { + function run() external broadcast { + EmptyContract emptyContract = new EmptyContract(); + ProxyAdmin proxyAdmin = new ProxyAdmin(); + + // Deploy proxies with empty implementations + address avsDirectory = deployProxy(address(emptyContract), address(proxyAdmin), ""); + address delegationManager = deployProxy(address(emptyContract), address(proxyAdmin), ""); + address strategyManager = deployProxy(address(emptyContract), address(proxyAdmin), ""); + address slasher = deployProxy(address(emptyContract), address(proxyAdmin), ""); + + // Deploy implementations + AVSDirectory avsDirectoryImpl = new AVSDirectory(); + DelegationManager delegationManagerImpl = + new DelegationManager(IStrategyManager(strategyManager)); + StrategyManager strategyManagerImpl = + new StrategyManager(IDelegationManager(delegationManager)); + Slasher slasherImpl = new Slasher(); + + // Upgrade proxies with implementations + proxyAdmin.upgrade(ITransparentUpgradeableProxy(avsDirectory), address(avsDirectoryImpl)); + proxyAdmin.upgrade( + ITransparentUpgradeableProxy(delegationManager), address(delegationManagerImpl) + ); + proxyAdmin.upgrade( + ITransparentUpgradeableProxy(strategyManager), address(strategyManagerImpl) + ); + proxyAdmin.upgrade(ITransparentUpgradeableProxy(slasher), address(slasherImpl)); + + console2.log("AVS Directory: ", avsDirectory); + console2.log("Delegation Manager: ", delegationManager); + console2.log("Strategy Manager: ", strategyManager); + console2.log("Slasher: ", slasher); + } +} diff --git a/packages/protocol/script/layer1/preconf/deployment/deploy_avs.sh b/packages/protocol/script/layer1/preconf/deployment/deploy_avs.sh new file mode 100644 index 00000000000..eb494a26207 --- /dev/null +++ b/packages/protocol/script/layer1/preconf/deployment/deploy_avs.sh @@ -0,0 +1,17 @@ +set -e + +: "${PRIVATE_KEY:?Environment variable PRIVATE_KEY is required}" +: "${FORK_URL:?Environment variable FORK_URL is required}" +: "${AVS_DIRECTORY:?Environment variable AVS_DIRECTORY is required}" +: "${SLASHER:?Environment variable SLASHER is required}" +: "${TAIKO_L1:?Environment variable TAIKO_L1 is required}" +: "${TAIKO_TOKEN:?Environment variable TAIKO_TOKEN is required}" +: "${BEACON_GENESIS_TIMESTAMP:?Environment variable BEACON_GENESIS_TIMESTAMP is required}" +: "${BEACON_BLOCK_ROOT_CONTRACT:?Environment variable BEACON_BLOCK_ROOT_CONTRACT is required}" +echo "BEACON_GENESIS_TIMESTAMP: $BEACON_GENESIS_TIMESTAMP" + +forge script scripts/deployment/DeployAVS.s.sol:DeployAVS \ + --fork-url $FORK_URL \ + --broadcast \ + --skip-simulation \ + --private-key $PRIVATE_KEY \ No newline at end of file diff --git a/packages/protocol/script/layer1/preconf/deployment/deploy_eigenlayer_mvp.sh b/packages/protocol/script/layer1/preconf/deployment/deploy_eigenlayer_mvp.sh new file mode 100644 index 00000000000..b0465281eb1 --- /dev/null +++ b/packages/protocol/script/layer1/preconf/deployment/deploy_eigenlayer_mvp.sh @@ -0,0 +1,10 @@ +set -e + +: "${PRIVATE_KEY:?Environment variable PRIVATE_KEY is required}" +: "${FORK_URL:?Environment variable FORK_URL is required}" + +forge script scripts/deployment/DeployEigenlayerMVP.s.sol:DeployEigenlayerMVP \ + --rpc-url $FORK_URL \ + --broadcast \ + --skip-simulation \ + --private-key $PRIVATE_KEY \ No newline at end of file diff --git a/packages/protocol/script/layer1/preconf/deployment/mock/DeployMockAVS.s.sol b/packages/protocol/script/layer1/preconf/deployment/mock/DeployMockAVS.s.sol new file mode 100644 index 00000000000..a0dbcb9d095 --- /dev/null +++ b/packages/protocol/script/layer1/preconf/deployment/mock/DeployMockAVS.s.sol @@ -0,0 +1,75 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "forge-std/src/Script.sol"; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol"; +import "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; + +import "src/layer1/based/ITaikoL1.sol"; +import "src/layer1/preconf/mock/MockPreconfRegistry.sol"; +import "src/layer1/preconf/impl/PreconfTaskManager.sol"; +import "src/layer1/preconf/iface/IPreconfRegistry.sol"; +import "src/layer1/preconf/iface/IPreconfTaskManager.sol"; +import "src/layer1/preconf/avs-mvp/iface/IAVSDirectory.sol"; +import "src/layer1/preconf/avs-mvp/iface/ISlasher.sol"; +import "src/layer1/preconf/avs-mvp/PreconfServiceManager.sol"; + +import "../../BaseScript.sol"; +import "../../misc/EmptyContract.sol"; + +contract DeployMockAVS is BaseScript { + // Required by service manager + address public avsDirectory = vm.envAddress("AVS_DIRECTORY"); + address public slasher = vm.envAddress("SLASHER"); + + // Required by task manager + address public taikoL1 = vm.envAddress("TAIKO_L1"); + address public taikoToken = vm.envAddress("TAIKO_TOKEN"); + uint256 public beaconGenesisTimestamp = vm.envUint("BEACON_GENESIS_TIMESTAMP"); + address public beaconBlockRootContract = vm.envAddress("BEACON_BLOCK_ROOT_CONTRACT"); + + function run() external broadcast { + EmptyContract emptyContract = new EmptyContract(); + ProxyAdmin proxyAdmin = new ProxyAdmin(); + + // Deploy proxies with empty implementations + address preconfRegistry = deployProxy(address(emptyContract), address(proxyAdmin), ""); + address preconfServiceManager = deployProxy(address(emptyContract), address(proxyAdmin), ""); + address preconfTaskManager = deployProxy(address(emptyContract), address(proxyAdmin), ""); + + // Deploy implementations + MockPreconfRegistry preconfRegistryImpl = + new MockPreconfRegistry(IPreconfServiceManager(preconfServiceManager)); + PreconfServiceManager preconfServiceManagerImpl = new PreconfServiceManager( + preconfRegistry, preconfTaskManager, IAVSDirectory(avsDirectory), ISlasher(slasher) + ); + PreconfTaskManager preconfTaskManagerImpl = new PreconfTaskManager( + IPreconfServiceManager(preconfServiceManager), + IPreconfRegistry(preconfRegistry), + ITaikoL1(taikoL1), + beaconGenesisTimestamp, + beaconBlockRootContract + ); + + // Upgrade proxies with implementations + proxyAdmin.upgradeAndCall( + ITransparentUpgradeableProxy(preconfRegistry), + address(preconfRegistryImpl), + abi.encodeCall(MockPreconfRegistry.init, ()) + ); + proxyAdmin.upgrade( + ITransparentUpgradeableProxy(preconfServiceManager), address(preconfServiceManagerImpl) + ); + proxyAdmin.upgradeAndCall( + ITransparentUpgradeableProxy(preconfTaskManager), + address(preconfTaskManagerImpl), + abi.encodeCall(PreconfTaskManager.init, IERC20(taikoToken)) + ); + + console2.log("Proxy admin: ", address(proxyAdmin)); + console2.log("Preconf Registry: ", preconfRegistry); + console2.log("Preconf Service Manager: ", preconfServiceManager); + console2.log("Preconf Task Manager: ", preconfTaskManager); + } +} diff --git a/packages/protocol/script/layer1/preconf/deployment/mock/DeployMockTaikoToken.s.sol b/packages/protocol/script/layer1/preconf/deployment/mock/DeployMockTaikoToken.s.sol new file mode 100644 index 00000000000..a9a8428beea --- /dev/null +++ b/packages/protocol/script/layer1/preconf/deployment/mock/DeployMockTaikoToken.s.sol @@ -0,0 +1,13 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "forge-std/src/Script.sol"; +import "src/layer1/preconf/mock/MockTaikoToken.sol"; +import "../../BaseScript.sol"; + +contract DeployMockTaikoToken is BaseScript { + function run() external broadcast { + MockTaikoToken myContract = new MockTaikoToken(); + console2.log("MockTaikoToken:", address(myContract)); + } +} diff --git a/packages/protocol/script/layer1/preconf/misc/EmptyContract.sol b/packages/protocol/script/layer1/preconf/misc/EmptyContract.sol new file mode 100644 index 00000000000..c1158fe8b1f --- /dev/null +++ b/packages/protocol/script/layer1/preconf/misc/EmptyContract.sol @@ -0,0 +1,5 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +/// @dev This is solely used as a placeholder during empty proxy deployment +contract EmptyContract { } diff --git a/packages/protocol/script/tokenunlock/Deploy.data.json b/packages/protocol/script/layer1/tokenunlock/Deploy.data.json similarity index 100% rename from packages/protocol/script/tokenunlock/Deploy.data.json rename to packages/protocol/script/layer1/tokenunlock/Deploy.data.json diff --git a/packages/protocol/script/tokenunlock/Deploy.s.sol b/packages/protocol/script/layer1/tokenunlock/Deploy.s.sol similarity index 73% rename from packages/protocol/script/tokenunlock/Deploy.s.sol rename to packages/protocol/script/layer1/tokenunlock/Deploy.s.sol index 73103eb6984..c94fc0fe490 100644 --- a/packages/protocol/script/tokenunlock/Deploy.s.sol +++ b/packages/protocol/script/layer1/tokenunlock/Deploy.s.sol @@ -1,15 +1,21 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; -import "../../test/DeployCapability.sol"; -import "../../contracts/team/tokenunlock/TokenUnlock.sol"; +import "src/layer1/team/tokenunlock/TokenUnlock.sol"; +import "test/shared/DeployCapability.sol"; contract DeployTokenUnlock is DeployCapability { using stdJson for string; + // On L2 it shall be: 0xCa5b76Cc7A38b86Db11E5aE5B1fc9740c3bA3DE8 address public OWNER = 0x9CBeE534B5D8a6280e01a14844Ee8aF350399C7F; // admin.taiko.eth + // On L2 it shall be: 0x1670000000000000000000000000000000010002 address public ROLLUP_ADDRESS_MANAGER = 0x579f40D0BE111b823962043702cabe6Aaa290780; + // Fine as is uint64 public TGE = 1_717_588_800; // Wednesday, June 5, 2024 12:00:00 PM + // On L2 is shall be: 0x806A3D0B9540655454Dd9dd9922B1321f0cfA2ED + // Deployed (and verified) with TXN: + // https://taikoscan.io/tx/0x3100bc89ba700400f81d7823898f0f43a0dd5ce5507b13c4ad9e625dc0497909 address public TOKEN_UNLOCK_IMPL = 0x035AFfC82612de31E9Db2259B9482D0Dd53B7819; function setUp() public { } diff --git a/packages/protocol/script/tokenunlock/Vest.data.json b/packages/protocol/script/layer1/tokenunlock/Vest.data.json similarity index 100% rename from packages/protocol/script/tokenunlock/Vest.data.json rename to packages/protocol/script/layer1/tokenunlock/Vest.data.json index acaae6037ba..c97818ee7ec 100644 --- a/packages/protocol/script/tokenunlock/Vest.data.json +++ b/packages/protocol/script/layer1/tokenunlock/Vest.data.json @@ -1,17 +1,17 @@ [ { - "recipient": "0xa48dEBc18D5e63F1FB94DD513f643e412684f8a4", "proxy": "0x33A270541f383A4A48dB6C5f1f00A161b8F79e2a", + "recipient": "0xa48dEBc18D5e63F1FB94DD513f643e412684f8a4", "vestAmount": 35000 }, { - "recipient": "0xa48dEBc18D5e63F1FB94DD513f643e412684f8a4", "proxy": "0x33A270541f383A4A48dB6C5f1f00A161b8F79e2a", + "recipient": "0xa48dEBc18D5e63F1FB94DD513f643e412684f8a4", "vestAmount": 25000 }, { - "recipient": "0xa48dEBc18D5e63F1FB94DD513f643e412684f8a4", "proxy": "0x33A270541f383A4A48dB6C5f1f00A161b8F79e2a", + "recipient": "0xa48dEBc18D5e63F1FB94DD513f643e412684f8a4", "vestAmount": 15000 } ] diff --git a/packages/protocol/script/layer1/tokenunlock/Vest.s.sol b/packages/protocol/script/layer1/tokenunlock/Vest.s.sol new file mode 100644 index 00000000000..1f421602d33 --- /dev/null +++ b/packages/protocol/script/layer1/tokenunlock/Vest.s.sol @@ -0,0 +1,58 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "forge-std/src/Script.sol"; +import "forge-std/src/console2.sol"; + +import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; +import "src/layer1/team/tokenunlock/TokenUnlock.sol"; + +contract VestTokenUnlock is Script { + using stdJson for string; + + struct VestingItem { + address proxy; + address recipient; + uint256 vestAmount; + } + + // On L2 it shall be: 0xA9d23408b9bA935c230493c40C73824Df71A0975 + ERC20 private tko = ERC20(0x10dea67478c5F8C5E2D90e5E9B26dBe60c54d800); + + function run() external { + string memory path = "/script/tokenunlock/Vest.data.json"; + VestingItem[] memory items = abi.decode( + vm.parseJson(vm.readFile(string.concat(vm.projectRoot(), path))), (VestingItem[]) + ); + + uint256 total; + for (uint256 i; i < items.length; i++) { + address proxy = items[i].proxy; + address recipient = items[i].recipient; + uint256 vestAmount = uint256(items[i].vestAmount); + + console2.log("proxy:", proxy); + console2.log("recipient:", recipient); + console2.log("vestAmount:", vestAmount); + console2.log(""); + + TokenUnlock target = TokenUnlock(proxy); + + require(target.recipient() == recipient, "recipient mismatch"); + require(target.owner() == 0x9CBeE534B5D8a6280e01a14844Ee8aF350399C7F, "owner mismatch"); + + total += SafeCastUpgradeable.toUint128(items[i].vestAmount * 1e18); + } + + console2.log("total:", total / 1e18); + require(tko.balanceOf(msg.sender) >= total, "insufficient TKO balance"); + + vm.startBroadcast(); + for (uint256 i; i < items.length; i++) { + uint128 vestAmount = uint128(items[i].vestAmount * 1e18); + tko.approve(items[i].proxy, vestAmount); + TokenUnlock(items[i].proxy).vest(vestAmount); + } + vm.stopBroadcast(); + } +} diff --git a/packages/protocol/script/layer1/tokenunlock/exercise1.data.json b/packages/protocol/script/layer1/tokenunlock/exercise1.data.json new file mode 100644 index 00000000000..3bf88371ae4 --- /dev/null +++ b/packages/protocol/script/layer1/tokenunlock/exercise1.data.json @@ -0,0 +1,632 @@ +[ + { + "proxy": "0xe8373f13fb890a135965f4cd9766d60a7f5d81bc", + "recipient": "0x02E725B7e99091Bd4cCBf15228384e160eCdf78f", + "vestAmount": 1267615 + }, + { + "proxy": "0x4d4f7e608cd77ef04ce8b19e383445e69b5b47df", + "recipient": "0x034c33c7A7FC791F9cc3A1C6A739a6958885Cae3", + "vestAmount": 1543210 + }, + { + "proxy": "0x4c3a28c3bdaa5c789d1cce6a0ccbdaec2378c78f", + "recipient": "0x0C11eF582C87A45A7DE131367bba9B416DC90FfA", + "vestAmount": 2234567 + }, + { + "proxy": "0xA997C0850D7086b07E65d46B499Af91Cd24E72f2", + "recipient": "0x0D48D06DC186D5d5aab4705E9f358adFE6fFe2eD", + "vestAmount": 6666142 + }, + { + "proxy": "0x4984884eb4ca609fCd6a5aF880D47986BBd9F00e", + "recipient": "0x0f2f3F49964a0FA960dee19A749D7B44a3869865", + "vestAmount": 4945850 + }, + { + "proxy": "0x830194aEf3B5BD35077395ef788C3A8c0a5b88dc", + "recipient": "0x1109BFA2dae2281457639Dee11d86c3629cc4E7C", + "vestAmount": 953644 + }, + { + "proxy": "0x4570F9414a92AFd73CAA5bc1AEFb5DeB3a2ff31f", + "recipient": "0x1B499d378C5ca187F0295228b2077a188F6C49b0", + "vestAmount": 171043 + }, + { + "proxy": "0x9af4fca3378e94904c56263869DFAAC344Df69AE", + "recipient": "0x268d2E2bBE32B4Aeb84dECE49A8b88132e33A6c5", + "vestAmount": 1386432 + }, + { + "proxy": "0x4060aC8b1c346307a5e15ac78c2f45cb16e702A7", + "recipient": "0x2C80010717A818ae170643D4dAa556aCB994804C", + "vestAmount": 5335098 + }, + { + "proxy": "0xF1C162704CCcd51496E50c68B5cF5faE8f03251C", + "recipient": "0x3002c9B8B4cce5Bc5A5025D0403C6b187D35Fb85", + "vestAmount": 76753 + }, + { + "proxy": "0x61e8d5186633A0Df3569E5C40D13f607A70556b5", + "recipient": "0x31C3281eBC1046725e08dAbAb9a09356b895B991", + "vestAmount": 26006 + }, + { + "proxy": "0xB31Af0e8E21BE453c053F9D8d371CaaD83beE3fD", + "recipient": "0x31F8Cf2fFFC843D1e534875c02be57f424279c2d", + "vestAmount": 917576 + }, + { + "proxy": "0x856c55b5BC6838A134ce98F00dF2111330583f56", + "recipient": "0x34198aaD335426bd66d40842F4A13096d58d3B56", + "vestAmount": 99778 + }, + { + "proxy": "0xB0b3BAF6Ed01994eE8E3F2A3CEe0770A2ab27281", + "recipient": "0x36A7e5FC77Dd43896Fe2cF9E3FED985CAd8aF034", + "vestAmount": 1047274 + }, + { + "proxy": "0x0858B67aB18083d86F4020CC21f5cbdc1C68ED3e", + "recipient": "0x396AD8cD527d5C98255865e520b52aCC3B2e84Ac", + "vestAmount": 538093 + }, + { + "proxy": "0xC296544D2005b7f07e45F5Eb91765BF58F73FE00", + "recipient": "0x3F72FE6675dBf3428289019F1A28Da2D13de708e", + "vestAmount": 2701842 + }, + { + "proxy": "0x4077Ac1dc1B7DF8E941c1F2414363E375d94Aa73", + "recipient": "0x3fe67b9b757411b5C1db6E25A0B742902210F126", + "vestAmount": 2210123 + }, + { + "proxy": "0xE69F975488e789E40C84488de11516dc3EE604e6", + "recipient": "0x42cAD9922973B0aF9849562A1a7ADeBf6dc64517", + "vestAmount": 293578 + }, + { + "proxy": "0x61BCf27361e45a394612c2f761586bfdfE2a07E3", + "recipient": "0x42e7da399D2b2Acc2C238Dbd63072B28e7019A69", + "vestAmount": 106724 + }, + { + "proxy": "0x2d040D592085D4707595fcAfffd335b4df131d81", + "recipient": "0x44aa8FBfDD5315660565085888ceaA8B43127C8B", + "vestAmount": 2876543 + }, + { + "proxy": "0x26e58007D473AAc2f3a41DFBd1f5298266Fc3801", + "recipient": "0x49864Bb823F1e7bb8028F6E7A76e22190d55c184", + "vestAmount": 765113 + }, + { + "proxy": "0x8Ac9A867b1f87287860E2e7a8aBf6dE27ddE75eA", + "recipient": "0x4cad91EA77267D0f5290cA5Bd2685bE6399a1ccd", + "vestAmount": 3028273 + }, + { + "proxy": "0x41f2Ace12c2361ef6677dCbc8F469ECdb9bcfAb1", + "recipient": "0x4d00862721636071cb187c5e99dc51602947122c", + "vestAmount": 229874 + }, + { + "proxy": "0x14f02931B2290bE66AAcE3134AB5bfEc80cf67b4", + "recipient": "0x4f068DbC35Be594E28BbFb85976402dbE41e0011", + "vestAmount": 335403 + }, + { + "proxy": "0x979e17ff19e6EA3391bb7657F0f73D292Eaf9C03", + "recipient": "0x53c725A86547272C55A8fdb52DeBE2e9B19B01C0", + "vestAmount": 56839 + }, + { + "proxy": "0x6370D429554C7e25E6e82f3aFf7d61A950D245dD", + "recipient": "0x5b01475cfCb320737806E3330f206021386CB88a", + "vestAmount": 65150 + }, + { + "proxy": "0xd3F954f8888142c86f43eB3795659A387EDB7656", + "recipient": "0x5e84d2C5105e9966CF08e6D7f413730dFF3Bb862", + "vestAmount": 1453272 + }, + { + "proxy": "0x55df502EefF4E49845648207a3a8C7B46f8C2a26", + "recipient": "0x600324dfd716C08892A000A146d790A1Ca519913", + "vestAmount": 1987654 + }, + { + "proxy": "0x92692fBbB3663811B6DDdebFe747E9A142d4061d", + "recipient": "0x61bA99B686DE575d6faEB8B90202Dd27A061F1C9", + "vestAmount": 57375 + }, + { + "proxy": "0xE4d809e41BF1A5264CD690FdB23BDEbAb8bCbdAA", + "recipient": "0x62400E5c7239D4cFA285E460cc290dc55F130bb7", + "vestAmount": 85526 + }, + { + "proxy": "0x7ae5d5964ae38e5958bb47C777f618458503fA89", + "recipient": "0x6574a47d7c4bb89e144754432e929284c1b9b9ce", + "vestAmount": 69077 + }, + { + "proxy": "0xef9a873452cFE3e039512D0b71d84D1e21F5D61d", + "recipient": "0x674EDb847199a0B87b8d33ADE8636939d68f64cc", + "vestAmount": 38376 + }, + { + "proxy": "0xa96d402D43E419B86bC0EEa596322dEE7363Ce95", + "recipient": "0x69ad4c99fA216f26a797D3Dab0CC619DF8F3BA97", + "vestAmount": 352294 + }, + { + "proxy": "0x002de81024DE91903BdFdC331c2c8dc74Ec89473", + "recipient": "0x69E6Ec47A242B4f68AB3cd4B84737D2a570A90cf", + "vestAmount": 179632 + }, + { + "proxy": "0x42dE671f715138aE364B661fbA6755cB0daA5767", + "recipient": "0x6B6072CE402F22fDcFbA1705383D8e280717Cb87", + "vestAmount": 2273557 + }, + { + "proxy": "0x34f1ac3F8389A607994E9f3D4B11e35e965C3d16", + "recipient": "0x6cf7EaE611201Be43a12ceE4a4098ED0Fd61B04A", + "vestAmount": 293578 + }, + { + "proxy": "0xA0DD28a91c9247e6d292dfe8eD08e65b09301A1d", + "recipient": "0x6d4ee35D70AD6331000E370F079aD7df52E75005", + "vestAmount": 268634 + }, + { + "proxy": "0x7C846ff2df23189c6499d5A15c300C2E646E16dc", + "recipient": "0x6d76bef8d6ea81ea4cee5cae1bb4cc4452a078a4", + "vestAmount": 100814 + }, + { + "proxy": "0xBD5f35779a810d53feff393Ac148b755a7F578Ea", + "recipient": "0x7153C8ff9F93E50EEB7af9092ADA3d5fBf36d2b9", + "vestAmount": 1789432 + }, + { + "proxy": "0x4B816E63cf18CAA6496EEc851243a9F7AF85F94A", + "recipient": "0x7154a02BA6eEaB9300D056e25f3EEA3481680f87", + "vestAmount": 57564 + }, + { + "proxy": "0x0dfE829D9c4aEE47d575D2d8360cFA5470ee649C", + "recipient": "0x7177844d5322a31775a30A23545f56bAcd96b4c5", + "vestAmount": 2987654 + }, + { + "proxy": "0x0B9cc0d4f8F24E184Acd63AD41049b74E37B1336", + "recipient": "0x71e18C339795799fE56AaF3d5c9BD4dc93bE2842", + "vestAmount": 55498 + }, + { + "proxy": "0x73d773a39f1fBcDea9a507F18920C232109AD937", + "recipient": "0x72AD836ce0E262c3BD26F4ACc9F3D4Ece016467B", + "vestAmount": 952320 + }, + { + "proxy": "0x3E9B482b91BF5C8e633cCf8DdF6f502353E41401", + "recipient": "0x79B9EA7391614996D8FA6685a6f7b0cD42d20005", + "vestAmount": 1934928 + }, + { + "proxy": "0x1323833A0E7cffA19E5Ffe9627d5408e10D585C7", + "recipient": "0x81abBCCCF44B3102C0cD8159C1AB8B295849Df23", + "vestAmount": 537289 + }, + { + "proxy": "0xb89Af25B6e4Dd2dE0c7fc3cf4830bC2160C05DBe", + "recipient": "0x8271Ad10f05cE0e6386345C626F562531E993980", + "vestAmount": 2456789 + }, + { + "proxy": "0x7e00954241463fdEF08772403a24cc49746DC2C4", + "recipient": "0x84111cC3680c6E49F523931D91a66fE096e0e3F9", + "vestAmount": 338862 + }, + { + "proxy": "0xba1c1B16250345b2287A95B89714271960fE1436", + "recipient": "0x8Aca37F5E1CD1b04062D7e223E6ca12f83252010", + "vestAmount": 1315846 + }, + { + "proxy": "0x4D0C031173b97354c9A4481b3b992B853762F207", + "recipient": "0x90D6f6b7C3884989d8bC7C3A3b48c99E15064D19", + "vestAmount": 4719305 + }, + { + "proxy": "0xc1fC85dD478A151d841D7f0b5D0123c506EfF4D2", + "recipient": "0x93b7d75157B4642C13C8d597211d6eBEC4DdCA9a", + "vestAmount": 1294962 + }, + { + "proxy": "0xb4a1629794cb81733fC2e6686F5efdc158AC10dF", + "recipient": "0x97A8386BA97aAd10a721e81Db40C7a15DE9AB38d", + "vestAmount": 390097 + }, + { + "proxy": "0x558F2AFe2b503A80211A403978306D4803e0572D", + "recipient": "0x9aC84504eC5a11272e0AFf0250Dc3a0fDe38077B", + "vestAmount": 1044237 + }, + { + "proxy": "0x06Dc1A8DF03A37407461a5556FF616CcE74cCa52", + "recipient": "0x9c7A1909d8d85E3B127e722F6285AE82d42F50Fe", + "vestAmount": 2878901 + }, + { + "proxy": "0xafd91993D759e054d83C727C997915F711346b5f", + "recipient": "0xA5947589a26a6fF0940199dC6E9c1D5fBDEFEF82", + "vestAmount": 2046201 + }, + { + "proxy": "0xae262EAa17023Eb96Ca2e8dd7ac5F2Ffc2cdB39c", + "recipient": "0xAfad04eee0d3A2cc731173BD9Ab6c9C8ff7a2abe", + "vestAmount": 2360444 + }, + { + "proxy": "0xfcBaB371E7f8E78481E5aFd142904d26ef9Bb16D", + "recipient": "0xB33c01Ee9a0F9bBCa09aABef9475736Aadf87607", + "vestAmount": 3456789 + }, + { + "proxy": "0xf540Eb805E0F09F062fd2D8d4b5dc050698804C5", + "recipient": "0xbc003292cdd3E96614B21a262623b2C7670588E6", + "vestAmount": 2123456 + }, + { + "proxy": "0x9e69720b63F6A8A594E95979c765204C49f4B55e", + "recipient": "0xBe8683952A47717c1677b0eF2fCd780437d8358A", + "vestAmount": 115129 + }, + { + "proxy": "0x48C77361a550639c0232f75D258C5D0cAE0f786a", + "recipient": "0xc371426148b3Fb1FBE74eff7077C71403bEd3EbA", + "vestAmount": 1876543 + }, + { + "proxy": "0x000211eCC56999E716A414A2F7A5e70546B6bAAf", + "recipient": "0xCA3B8F422e22DCE4bAac134adb959BcdfC7E158f", + "vestAmount": 57564 + }, + { + "proxy": "0xB4764CdE7DD138e34Dc3f5D504df8CCabB6702D7", + "recipient": "0xCdd8f9696a8AD5036b3f2E818Efde8C53d69FC66", + "vestAmount": 2654321 + }, + { + "proxy": "0x0446f327325b74674D2FEdcaD7E4C96429061E19", + "recipient": "0xCE1614f1239dDE0c3D79386e89B6717A5a683bEB", + "vestAmount": 6541233 + }, + { + "proxy": "0xbb2D2930dc45541B882a6adaF7cf8b65Fa57991C", + "recipient": "0xe64f8aae6f57773eeb73d722fac8a59c620c6ed8", + "vestAmount": 171254 + }, + { + "proxy": "0xd662E7261235A031629eDa276ac3D752e762b8C1", + "recipient": "0xe7c66e440EdC9E3fb6c022224f6F5f5E0B294DEb", + "vestAmount": 1234567 + }, + { + "proxy": "0xb856E58D783b61b3EbD1f529AD2dA01560D0F1E2", + "recipient": "0xe870eFf00F9f2535b44e019f630bdF86990165de", + "vestAmount": 2345679 + }, + { + "proxy": "0x15ab53180D3996b35Ec0D7E274D2C7174e0Fb71A", + "recipient": "0xEafC539906f78dFab80F0f9934cbD44b85E0F009", + "vestAmount": 69077 + }, + { + "proxy": "0x492032F457b2Ccc7fde39c7325fda94ca590a09f", + "recipient": "0xee28eda7f55d67f691b188bb951ecde41560bab4", + "vestAmount": 293578 + }, + { + "proxy": "0x1eA405a8dbE04e6A2338473Bf2379b44391730fc", + "recipient": "0xeFD98C15B79031FE813aF21c707D344a68c8036c", + "vestAmount": 187391 + }, + { + "proxy": "0x98ef6BA6423Aaa9abD0780D21DCe4cE6872a0867", + "recipient": "0xF3c7A8AF7a807460b83f08ba96399C747707dAF8", + "vestAmount": 2134003 + }, + { + "proxy": "0xC144FCf7750426dFbad46EB7a14d5424584Ce4Fb", + "recipient": "0xf7E737Ec08e7152c32380f4FB2896B821D0542A6", + "vestAmount": 38376 + }, + { + "proxy": "0xC0F2516DC3174D9C1a5F02BEB6f9FE16e88ea2Fe", + "recipient": "0xF92b27de9ddfc9f3f8a0535fbdF2129fFcbc433b", + "vestAmount": 587157 + }, + { + "proxy": "0x67c52cda25B36fFf71A61819693BF8A4909aE436", + "recipient": "0xFa6f278dd30DDD4486cB384E236B0E17dC6D3bE6", + "vestAmount": 84722 + }, + { + "proxy": "0xd2601a20c2E8F5F1810b16E408c641d624b11aC2", + "recipient": "0x02331a72Fc3ADF8CAdC808BbE0D73B6D0044F439", + "vestAmount": 406507 + }, + { + "proxy": "0x5E6c193F25B83734f87918593E05d03675Fb3241", + "recipient": "0x02F23534F9DA649adC356fb18F63893fAc544158", + "vestAmount": 160003 + }, + { + "proxy": "0xEaaB2c7a21Bb8d6020adfBAf7b9cde409d340884", + "recipient": "0x07C1c2F5e5BD4319461E914b41B58CDCe8aEb4b3", + "vestAmount": 18761726 + }, + { + "proxy": "0x5E44E672BA19f947813CeEB12B04F7cC03E1843A", + "recipient": "0x094438c269efcf6f8cffb2bde4a889bb3d17d2a8", + "vestAmount": 156345 + }, + { + "proxy": "0x7Ed070524F12c2405AFc66b77118927993F3c15E", + "recipient": "0x0f63505173Fa24A4a752e08123153B879f665c57", + "vestAmount": 1094431 + }, + { + "proxy": "0x5B113b3B76fB00aE8868a5400ef0AeF9C091aDD3", + "recipient": "0x1C3E3fE0d28B22d64D76Ce30b8d51DCD9867a68a", + "vestAmount": 4264029 + }, + { + "proxy": "0xe3b5372bA89D07Dc80284e93B050a90D2910297A", + "recipient": "0x1F28F10176F89F4E9985873B84d14e75751BB3D1", + "vestAmount": 6085050 + }, + { + "proxy": "0xBcf79a834375E527024905C1FEE637c3f6F333F7", + "recipient": "0x220866b1a2219f40e72f5c628b65d54268ca3a9d", + "vestAmount": 852806 + }, + { + "proxy": "0xa35315c325131Ea6d0111cFD3476A5bcfd354aC6", + "recipient": "0x278887be139f325334e1dde087f28c4d525e7d59", + "vestAmount": 1918813 + }, + { + "proxy": "0xA78eCb16beA92bb2c8A33C231D65f430bf876895", + "recipient": "0x33Ee24a0398b8D02A562A308F4407CD93ee150d4", + "vestAmount": 1569197 + }, + { + "proxy": "0x57064365517a727D7250D14dAAe153EB1d8945bb", + "recipient": "0x399f2700CE8Ba81d10FE43C1D077365dC41017d4", + "vestAmount": 1870203 + }, + { + "proxy": "0xe84847bb619FcaeECcbCbAA05Fa343253c6BD726", + "recipient": "0x408505ec4bB812B9B649a653390a7b683CEa3D54", + "vestAmount": 196998 + }, + { + "proxy": "0x39007C8196B2b3dd83Edc3495AB40b6B4F8F7646", + "recipient": "0x4382AF750BA8a0dC2877F621e6BDF6523e33894c", + "vestAmount": 781741 + }, + { + "proxy": "0x95e4Acc3b6fb42e18bE53A03854097E4bf9a384D", + "recipient": "0x443Fd508c4992DdFACA64283975C5192dEEF6897", + "vestAmount": 1876173 + }, + { + "proxy": "0xf819370886418a277AF656B08aDa4498447276E4", + "recipient": "0x4492b21337F0664829A991DA4c8aa7E686e24A23", + "vestAmount": 3595992 + }, + { + "proxy": "0x37Dd6E027DC1cc3dCed44F71dC88C6F053850B87", + "recipient": "0x57e9210C7B2eaAA1fA9ef11e15AbB3e91d0103aC", + "vestAmount": 4406149 + }, + { + "proxy": "0x705B86fEC672A22D92aD89B54F00a347e2fB30cC", + "recipient": "0x67821e4e35d1E20c29a9Fb05748a7fe226cb142F", + "vestAmount": 156345 + }, + { + "proxy": "0x91E573Aec1c1997f1E979a6f5A5012097D6d952b", + "recipient": "0x6e0a1ddad894e6466d405bb73377f0a257278d74", + "vestAmount": 406507 + }, + { + "proxy": "0x07a7f8319fA8aA6cdc8B273255A517e6bB6a6Ce4", + "recipient": "0x713F619Ba5169a20B228901fe135c5d894f29E1F", + "vestAmount": 390866 + }, + { + "proxy": "0x12B860F2Bd797fB15270e16EC04DC4D14e176f2e", + "recipient": "0x74cf36eb5034e47974DB61D2a8EA6996cfD1e149", + "vestAmount": 234522 + }, + { + "proxy": "0x2CCB411B68aF29e5122b45A9c316A36d87Eef3Cb", + "recipient": "0x78DB576873F032A7C4749b214A8AF6966B3Be239", + "vestAmount": 1594747 + }, + { + "proxy": "0xA85F093474C081bC9FFA3784638727F57B28f656", + "recipient": "0x7F696B2D2f5ff70177E1a4c3BB76D3604aB0caEc", + "vestAmount": 272207 + }, + { + "proxy": "0x0e409A34aC3F9216BdA002Fb149A824F88213ce4", + "recipient": "0x7F73eF385FdAb454D5bfDa2d8b41C89D6e123cec", + "vestAmount": 465487 + }, + { + "proxy": "0xfb9ce64875BDC1a761Ddb51c2Aa642C204AA92BA", + "recipient": "0x839bBb11d3041359A4c43be9CB6A4AA22dDdcB1f", + "vestAmount": 781741 + }, + { + "proxy": "0x497f9F18EBDBb90193E51A4327Bc2B00f250577F", + "recipient": "0x84329866d00Ff90AEFC839A2bdFe5ce00d09cFdD", + "vestAmount": 312698 + }, + { + "proxy": "0xb11C0D761D6e164294A19D27b89E1d72D11E482B", + "recipient": "0x917c7EaEc939341014EAAE8cc024Cf81812bf852", + "vestAmount": 156345 + }, + { + "proxy": "0x38D8361e6F1585f5B37355E9d69A27e33d28b9A3", + "recipient": "0x92f39A77f57e20765F3F34C62A92BD3df312757D", + "vestAmount": 8528057 + }, + { + "proxy": "0xf98cd91ACd1c50d2793b5C0fA5e1f89f46cd1e09", + "recipient": "0x987f10f336b498d71B5e2cB22267712Bda141F96", + "vestAmount": 767525 + }, + { + "proxy": "0x2Da30e14dE6a5fcE16a5Ea72199De76cebDC876C", + "recipient": "0xf7a0cd60e3b6ab4523a5f54e9a410258895b138d", + "vestAmount": 4013867 + }, + { + "proxy": "0x38d0fECe1dC70DD8AbdCcF809C3C2DDC75643C9B", + "recipient": "0xA0E337be4b8A912be55DA9ad4CAA1fF7Ce1aF5aa", + "vestAmount": 781741 + }, + { + "proxy": "0x18F5B40B88deAa89B5126a0CeeD4BA9980828C09", + "recipient": "0xa397b03d905db7abebac9a21f5f3222e287784ea", + "vestAmount": 4264029 + }, + { + "proxy": "0x4a143794D7a4f9f5504F0997Ab7342dd1772fC42", + "recipient": "0xa4C81339127A50Dd607BAeda4fD4A7AE6e91A502", + "vestAmount": 469043 + }, + { + "proxy": "0xEFDA54D371f7115aeE324CdBf0C64c77b83755a5", + "recipient": "0xa61b8679D39A3e504840d3170ab802885BDd5Adf", + "vestAmount": 426403 + }, + { + "proxy": "0xC179213e60427ff1e0f716736115FD7A66D9C4cE", + "recipient": "0xa6EdC299f9CE65132093F3A1D73C94077E0aBD5A", + "vestAmount": 275175 + }, + { + "proxy": "0xFd44459f4a8514cf4767533e20f1Ca42039B342E", + "recipient": "0xA96c49B904922fEcCa1e7c82aa16A57F57eBe016", + "vestAmount": 312698 + }, + { + "proxy": "0x56CF6b3952606282eac95d7fD55818a3ae762e2D", + "recipient": "0xA9db645b9eE2B98372ccDa26C8eebf347c880E40", + "vestAmount": 312698 + }, + { + "proxy": "0x380B8da34766F6832d22B1684B9CE9170dE13351", + "recipient": "0xaBb44CF55E2432a230A9B2f4c829e2Ec0c55E888", + "vestAmount": 156345 + }, + { + "proxy": "0xED8aF5Beb21A80a9d34D0268D24fbB81B0223248", + "recipient": "0xae68433B53902512F46C1F3983e5CD92b593884F", + "vestAmount": 2345216 + }, + { + "proxy": "0xE4d0D3A0EF348baace39C7FAea7eDcF7ac394E9c", + "recipient": "0xAf9f957827083c7e5aeA1537BCE1C8524f9Ba533", + "vestAmount": 409628 + }, + { + "proxy": "0x4d0c7Df23Dcc4DB0C2cBa5d1e933c0b22E0e5b5d", + "recipient": "0xb39f7e1D1137BFeaf80836a1eFBbFF1ab43abf27", + "vestAmount": 2558417 + }, + { + "proxy": "0x8238bE2711c02B5CEdC161Cba94aB494dbc3fe29", + "recipient": "0xb45893511573Ff6A693759CbcA5162300550a35c", + "vestAmount": 406507 + }, + { + "proxy": "0x3858DD901cBa69ced85B168e3BF7C847BFEa31cB", + "recipient": "0xb601F9Cd345BFA714E1b9B6BB9835e8013e4FD99", + "vestAmount": 156345 + }, + { + "proxy": "0x0B80540FC0083a56E3856F3fa3F29384a17e72f4", + "recipient": "0xb826224b742ead5cf91ea432340e3763fac09cdd", + "vestAmount": 406507 + }, + { + "proxy": "0xC7C91c6c0483321F0fe28BC8aCDdFCB0bd782c3F", + "recipient": "0xB8f18645723f2B09fC951b90CCF25bB1C5AE1729", + "vestAmount": 13736431 + }, + { + "proxy": "0x081e2656DDF88ecE61F1cb9cFc4F76Ca6A0B9633", + "recipient": "0xB976fEA31067a94Be59c9378Cd0d06F52B939f3F", + "vestAmount": 4264029 + }, + { + "proxy": "0x97c82462b0FE23C629Fa6a866298aB640eC24F9c", + "recipient": "0xbCe472BcACf391E3423a16b75e0C3652e624A903", + "vestAmount": 852806 + }, + { + "proxy": "0xaFa63d505286803890f8De43D9f30aAC089b25D8", + "recipient": "0xBD525cFe28cf0d3313028066dCd239650b71e5FE", + "vestAmount": 781741 + }, + { + "proxy": "0xC9fe0C30469CA4F9BA44D85010b692d361eD82f1", + "recipient": "0xC319a9E5607F2406C2ADB844868c1C8a0fC19690", + "vestAmount": 5240773 + }, + { + "proxy": "0xeD0fE496640866DC5BCb74cD29dEa85428342CCE", + "recipient": "0xe30d11D319Be10e8e759B9d1472BB03e4DdB933f", + "vestAmount": 4264029 + }, + { + "proxy": "0xBaf6D3ccE04E95DB01bEBd66F7E3De62427Ea577", + "recipient": "0xeBd6eF43d35892d8686f294ac9550C68860D1a0d", + "vestAmount": 475303 + }, + { + "proxy": "0xEd788885b0CdD78CFDbBEC1bd96F03eFA61621fb", + "recipient": "0xf45F391DB05810a435E74dFaa9503eC29CB4C2eC", + "vestAmount": 781741 + }, + { + "proxy": "0xAd7a3867a790D38F16e485f3DB074ad069FC5c1C", + "recipient": "0xf7E737Ec08e7152c32380f4FB2896B821D0542A6", + "vestAmount": 739101 + }, + { + "proxy": "0x4CE8E8bB4ea26cabe32C5B9100Ee9eD6759C58CB", + "recipient": "0xFc207A04ff27D0865c9879f4F84B82c5a0753989", + "vestAmount": 234522 + }, + { + "proxy": "0x2Bc21D70BDe29a8E6576F7aCD979029058f2eeF9", + "recipient": "0x841F98C82Df7Eb6107a7b6A0e9Ab054a01819428", + "vestAmount": 2439024 + } +] diff --git a/packages/protocol/script/layer2/DeployDelegateOwner.s.sol b/packages/protocol/script/layer2/DeployDelegateOwner.s.sol new file mode 100644 index 00000000000..935686fb00c --- /dev/null +++ b/packages/protocol/script/layer2/DeployDelegateOwner.s.sol @@ -0,0 +1,28 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "test/shared/DeployCapability.sol"; +import "src/layer2/DelegateOwner.sol"; + +// forge script --rpc-url https://rpc.mainnet.taiko.xyz script/DeployDelegateOwner.s.sol +contract DeployDelegateOwner is DeployCapability { + address public l2Sam = 0x1670000000000000000000000000000000000006; + address public testAccount2 = 0x3c181965C5cFAE61a9010A283e5e0C1445649810; + + address public l1Owner = testAccount2; + address public l2Admin = testAccount2; + + modifier broadcast() { + vm.startBroadcast(); + _; + vm.stopBroadcast(); + } + + function run() external broadcast { + deployProxy({ + name: "delegate_owner", + impl: address(new DelegateOwner()), + data: abi.encodeCall(DelegateOwner.init, (l1Owner, l2Sam, 1, l2Admin)) + }); + } +} diff --git a/packages/protocol/script/L2PostGenesisConfig.s.sol b/packages/protocol/script/layer2/PostGenesisConfig.s.sol similarity index 94% rename from packages/protocol/script/L2PostGenesisConfig.s.sol rename to packages/protocol/script/layer2/PostGenesisConfig.s.sol index 56beda16071..28254de3ef7 100644 --- a/packages/protocol/script/L2PostGenesisConfig.s.sol +++ b/packages/protocol/script/layer2/PostGenesisConfig.s.sol @@ -1,20 +1,20 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import "forge-std/src/Script.sol"; import "forge-std/src/console2.sol"; -import "../contracts/tokenvault/ERC20Vault.sol"; -import "../contracts/bridge/Bridge.sol"; -import "../contracts/common/AddressManager.sol"; +import "src/shared/tokenvault/ERC20Vault.sol"; +import "src/shared/bridge/Bridge.sol"; +import "src/shared/common/AddressManager.sol"; interface USDCProxy { function configureMinter(address minter, uint256 minterAllowedAmount) external; } // Run with: -// forge script --rpc-url https://rpc.mainnet.taiko.xyz script/L2PostGenesisConfig.s.sol -contract L2PostGenesisConfig is Script { +// forge script --rpc-url https://rpc.mainnet.taiko.xyz script/PostGenesisConfig.s.sol +contract PostGenesisConfig is Script { // All following addresses are L2 addresses address public bridgedTKO = 0xA9d23408b9bA935c230493c40C73824Df71A0975; address public bridgedUSDC = 0x07d83526730c7438048D55A4fc0b850e2aaB6f0b; diff --git a/packages/protocol/script/L2PostGenesisQuery.s.sol b/packages/protocol/script/layer2/PostGenesisQuery.s.sol similarity index 93% rename from packages/protocol/script/L2PostGenesisQuery.s.sol rename to packages/protocol/script/layer2/PostGenesisQuery.s.sol index 23eac73209b..906e0961dff 100644 --- a/packages/protocol/script/L2PostGenesisQuery.s.sol +++ b/packages/protocol/script/layer2/PostGenesisQuery.s.sol @@ -1,13 +1,13 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; -import "../test/DeployCapability.sol"; -import "../contracts/common/AddressManager.sol"; -import "../contracts/bridge/Bridge.sol"; +import "test/shared/DeployCapability.sol"; +import "src/shared/common/AddressManager.sol"; +import "src/shared/bridge/Bridge.sol"; // Run with: -// forge script --rpc-url https://rpc.mainnet.taiko.xyz script/L2PostGenesisQuery.s.sol -contract L2PostGenesisQuery is DeployCapability { +// forge script --rpc-url https://rpc.mainnet.taiko.xyz script/PostGenesisQuery.s.sol +contract PostGenesisQuery is DeployCapability { uint64 taiko_id = 167_000; function run() external view { diff --git a/packages/protocol/script/layer2/UpdateMainnetOntakeL2.s.sol b/packages/protocol/script/layer2/UpdateMainnetOntakeL2.s.sol new file mode 100644 index 00000000000..d578b827771 --- /dev/null +++ b/packages/protocol/script/layer2/UpdateMainnetOntakeL2.s.sol @@ -0,0 +1,21 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "test/shared/DeployCapability.sol"; +import "src/layer2/mainnet/MainnetTaikoL2.sol"; + +contract UpgradeMainnetOntakeL2 is DeployCapability { + uint256 public privateKey = vm.envUint("PRIVATE_KEY"); + + modifier broadcast() { + require(privateKey != 0, "invalid private key"); + vm.startBroadcast(privateKey); + _; + vm.stopBroadcast(); + } + + function run() external broadcast { + // MainnetTaikoL2 + console2.log(address(new MainnetTaikoL2())); + } +} diff --git a/packages/protocol/script/merge_contracts.py b/packages/protocol/script/merge_contracts.py deleted file mode 100644 index 7722d5d5ebd..00000000000 --- a/packages/protocol/script/merge_contracts.py +++ /dev/null @@ -1,27 +0,0 @@ -import os -import argparse - -def merge_solidity_files(root_dir, output_file='../out/taiko_protocol.md'): - with open(output_file, 'w') as outfile: - for subdir, dirs, files in os.walk(root_dir): - for file in files: - if file.endswith('.sol') and not file.endswith('.t.sol'): - file_path = os.path.join(subdir, file) - if "/test/" in file_path: - continue - print("merging ", file_path) - relative_path = os.path.relpath(file_path, root_dir) - outfile.write(f"## {relative_path}\n") - outfile.write("```solidity\n") - with open(file_path, 'r') as infile: - outfile.write(infile.read()) - outfile.write("\n```\n\n") - - -if __name__ == "__main__": - # parser = argparse.ArgumentParser(description="Merge Solidity files into a Markdown file.") - # parser.add_argument("root_dir", type=str, help="Root directory containing Solidity files") - # args = parser.parse_args() - # merge_solidity_files(args.root_dir) - merge_solidity_files("../contracts") - print("merged into ../out/taiko_protocol.md") diff --git a/packages/protocol/script/AuthorizeTaikoForMultihop.s.sol b/packages/protocol/script/shared/AuthorizeTaikoForMultihop.s.sol similarity index 85% rename from packages/protocol/script/AuthorizeTaikoForMultihop.s.sol rename to packages/protocol/script/shared/AuthorizeTaikoForMultihop.s.sol index 322d83de801..ffb76b79516 100644 --- a/packages/protocol/script/AuthorizeTaikoForMultihop.s.sol +++ b/packages/protocol/script/shared/AuthorizeTaikoForMultihop.s.sol @@ -1,8 +1,8 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; -import "../test/DeployCapability.sol"; -import "../contracts/signal/SignalService.sol"; +import "test/shared/DeployCapability.sol"; +import "src/shared/signal/SignalService.sol"; contract AuthorizeTaikoForMultihop is DeployCapability { uint256 public privateKey = vm.envUint("PRIVATE_KEY"); diff --git a/packages/protocol/script/SetAddress.s.sol b/packages/protocol/script/shared/SetAddress.s.sol similarity index 92% rename from packages/protocol/script/SetAddress.s.sol rename to packages/protocol/script/shared/SetAddress.s.sol index a1e18a4796e..701fc32d9aa 100644 --- a/packages/protocol/script/SetAddress.s.sol +++ b/packages/protocol/script/shared/SetAddress.s.sol @@ -1,10 +1,10 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import "forge-std/src/Script.sol"; import "forge-std/src/console2.sol"; -import "../contracts/common/AddressManager.sol"; +import "src/shared/common/AddressManager.sol"; contract SetAddress is Script { uint256 public adminPrivateKey = vm.envUint("PRIVATE_KEY"); diff --git a/packages/protocol/script/SetRemoteBridgeSuites.s.sol b/packages/protocol/script/shared/SetRemoteBridgeSuites.s.sol similarity index 97% rename from packages/protocol/script/SetRemoteBridgeSuites.s.sol rename to packages/protocol/script/shared/SetRemoteBridgeSuites.s.sol index 2b757fb61f5..91734516a9d 100644 --- a/packages/protocol/script/SetRemoteBridgeSuites.s.sol +++ b/packages/protocol/script/shared/SetRemoteBridgeSuites.s.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; -import "../test/DeployCapability.sol"; +import "test/shared/DeployCapability.sol"; contract SetRemoteBridgeSuites is DeployCapability { uint256 public privateKey = vm.envUint("PRIVATE_KEY"); diff --git a/packages/protocol/script/test_deploy_on_l1.sh b/packages/protocol/script/test_deploy_on_l1.sh deleted file mode 100755 index c4df51742f9..00000000000 --- a/packages/protocol/script/test_deploy_on_l1.sh +++ /dev/null @@ -1,44 +0,0 @@ -#!/bin/sh - -# This script is only used by `pnpm test:deploy`. -set -e - -export PRIVATE_KEY=0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 -PROPOSER=0x0000000000000000000000000000000000000000 \ -TAIKO_TOKEN=0x0000000000000000000000000000000000000000 \ -PROPOSER_ONE=0x0000000000000000000000000000000000000000 \ -GUARDIAN_PROVERS="0x1000777700000000000000000000000000000001,0x1000777700000000000000000000000000000002,0x1000777700000000000000000000000000000003,0x1000777700000000000000000000000000000004,0x1000777700000000000000000000000000000005,0x1000777700000000000000000000000000000006,0x1000777700000000000000000000000000000007" \ -TAIKO_L2_ADDRESS=0x1000777700000000000000000000000000000001 \ -L2_SIGNAL_SERVICE=0x1000777700000000000000000000000000000007 \ -CONTRACT_OWNER=0x60997970C51812dc3A010C7d01b50e0d17dc79C8 \ -PROVER_SET_ADMIN=0x60997970C51812dc3A010C7d01b50e0d17dc79C8 \ -TAIKO_TOKEN_PREMINT_RECIPIENT=0xa0Ee7A142d267C1f36714E4a8F75612F20a79720 \ -TAIKO_TOKEN_NAME="Taiko Token Katla" \ -TAIKO_TOKEN_SYMBOL=TTKOk \ -SHARED_ADDRESS_MANAGER=0x0000000000000000000000000000000000000000 \ -L2_GENESIS_HASH=0xee1950562d42f0da28bd4550d88886bc90894c77c9c9eaefef775d4c8223f259 \ -PAUSE_TAIKO_L1=true \ -PAUSE_BRIDGE=true \ -NUM_MIN_MAJORITY_GUARDIANS=7 \ -NUM_MIN_MINORITY_GUARDIANS=2 \ -TIER_PROVIDER="devnet" \ -forge script script/DeployOnL1.s.sol:DeployOnL1 \ - --fork-url http://localhost:8545 \ - --broadcast \ - --ffi \ - -vvvv \ - --private-key $PRIVATE_KEY \ - --block-gas-limit 100000000 - -export PRIVATE_KEY=0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 -SECURITY_COUNCIL=0x60997970C51812dc3A010C7d01b50e0d17dc79C8 \ -TAIKO_TOKEN_PREMINT_RECIPIENT=0xa0Ee7A142d267C1f36714E4a8F75612F20a79720 \ -TAIKO_TOKEN_NAME="Taiko Token" \ -TAIKO_TOKEN_SYMBOL=TTKO \ -forge script script/DeployTaikoToken.s.sol:DeployTaikoToken \ - --fork-url http://localhost:8545 \ - --broadcast \ - --ffi \ - -vvvv \ - --private-key $PRIVATE_KEY \ - --block-gas-limit 100000000 diff --git a/packages/protocol/script/tokenunlock/Vest.s.sol b/packages/protocol/script/tokenunlock/Vest.s.sol deleted file mode 100644 index 261bb205947..00000000000 --- a/packages/protocol/script/tokenunlock/Vest.s.sol +++ /dev/null @@ -1,53 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.24; - -import "forge-std/src/Script.sol"; -import "forge-std/src/console2.sol"; - -import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; -import "../../contracts/team/tokenunlock/TokenUnlock.sol"; - -contract VestTokenUnlock is Script { - using stdJson for string; - - struct VestingItem { - address recipient; - address proxy; - uint256 vestAmount; - } - - ERC20 private tko = ERC20(0x10dea67478c5F8C5E2D90e5E9B26dBe60c54d800); - - function run() external { - vm.startBroadcast(); - - string memory path = "/script/tokenunlock/Vest.data.json"; - VestingItem[] memory items = abi.decode( - vm.parseJson(vm.readFile(string.concat(vm.projectRoot(), path))), (VestingItem[]) - ); - - for (uint256 i; i < items.length; i++) { - if (items[i].vestAmount != 0) { - address proxy = items[i].proxy; - console2.log("proxy. :", proxy); - console2.log("grantee:", items[i].recipient); - console2.log("vested :", items[i].vestAmount); - - require(TokenUnlock(proxy).owner() == msg.sender, "msg.sender not owner"); - require( - TokenUnlock(proxy).recipient() == items[i].recipient, "inconsistent recipient" - ); - - uint128 vestAmount = uint128(items[i].vestAmount * 1e18); - require(tko.balanceOf(msg.sender) >= vestAmount, "insufficient TKO balance"); - - tko.approve(proxy, vestAmount); - TokenUnlock(proxy).vest(vestAmount); - - console2.log("Vested!\n"); - } - } - - vm.stopBroadcast(); - } -} diff --git a/packages/protocol/script/upgrade/UpgradeAddressManager.s.sol b/packages/protocol/script/upgrade/UpgradeAddressManager.s.sol deleted file mode 100644 index c62a98e6035..00000000000 --- a/packages/protocol/script/upgrade/UpgradeAddressManager.s.sol +++ /dev/null @@ -1,13 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.24; - -import "forge-std/src/Script.sol"; -import "forge-std/src/console2.sol"; -import "../../contracts/common/AddressManager.sol"; -import "./UpgradeScript.s.sol"; - -contract UpgradeAddressManager is UpgradeScript { - function run() external setUp { - upgrade("AddressManager", address(new AddressManager())); - } -} diff --git a/packages/protocol/script/upgrade/UpgradeAssignmentHook.s.sol b/packages/protocol/script/upgrade/UpgradeAssignmentHook.s.sol deleted file mode 100644 index 6532fd8278a..00000000000 --- a/packages/protocol/script/upgrade/UpgradeAssignmentHook.s.sol +++ /dev/null @@ -1,13 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.24; - -import "forge-std/src/Script.sol"; -import "forge-std/src/console2.sol"; -import "../../contracts/L1/hooks/AssignmentHook.sol"; -import "./UpgradeScript.s.sol"; - -contract UpgradeAssignmentHook is UpgradeScript { - function run() external setUp { - upgrade("AssignmentHook", address(new AssignmentHook())); - } -} diff --git a/packages/protocol/script/upgrade/UpgradeBridge.s.sol b/packages/protocol/script/upgrade/UpgradeBridge.s.sol deleted file mode 100644 index 37459f216e8..00000000000 --- a/packages/protocol/script/upgrade/UpgradeBridge.s.sol +++ /dev/null @@ -1,13 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.24; - -import "forge-std/src/Script.sol"; -import "forge-std/src/console2.sol"; -import "../../contracts/bridge/Bridge.sol"; -import "./UpgradeScript.s.sol"; - -contract UpgradeBridge is UpgradeScript { - function run() external setUp { - upgrade("Bridge", address(new Bridge())); - } -} diff --git a/packages/protocol/script/upgrade/UpgradeERC1155Vault.s.sol b/packages/protocol/script/upgrade/UpgradeERC1155Vault.s.sol deleted file mode 100644 index 5813f4e58cc..00000000000 --- a/packages/protocol/script/upgrade/UpgradeERC1155Vault.s.sol +++ /dev/null @@ -1,13 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.24; - -import "forge-std/src/Script.sol"; -import "forge-std/src/console2.sol"; -import "../../contracts/tokenvault/ERC1155Vault.sol"; -import "./UpgradeScript.s.sol"; - -contract UpgradeERC1155Vault is UpgradeScript { - function run() external setUp { - upgrade("ERC1155Vault", address(new ERC1155Vault())); - } -} diff --git a/packages/protocol/script/upgrade/UpgradeERC20Vault.s.sol b/packages/protocol/script/upgrade/UpgradeERC20Vault.s.sol deleted file mode 100644 index 33a65c20e02..00000000000 --- a/packages/protocol/script/upgrade/UpgradeERC20Vault.s.sol +++ /dev/null @@ -1,13 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.24; - -import "forge-std/src/Script.sol"; -import "forge-std/src/console2.sol"; -import "../../contracts/tokenvault/ERC20Vault.sol"; -import "./UpgradeScript.s.sol"; - -contract UpgradeERC20Vault is UpgradeScript { - function run() external setUp { - upgrade("ERC20Vault", address(new ERC20Vault())); - } -} diff --git a/packages/protocol/script/upgrade/UpgradeERC721Vault.s.sol b/packages/protocol/script/upgrade/UpgradeERC721Vault.s.sol deleted file mode 100644 index 84cbdcaf9eb..00000000000 --- a/packages/protocol/script/upgrade/UpgradeERC721Vault.s.sol +++ /dev/null @@ -1,13 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.24; - -import "forge-std/src/Script.sol"; -import "forge-std/src/console2.sol"; -import "../../contracts/tokenvault/ERC721Vault.sol"; -import "./UpgradeScript.s.sol"; - -contract UpgradeERC721Vault is UpgradeScript { - function run() external setUp { - upgrade("ERC721Vault", address(new ERC721Vault())); - } -} diff --git a/packages/protocol/script/upgrade/UpgradeGuardianProver.s.sol b/packages/protocol/script/upgrade/UpgradeGuardianProver.s.sol deleted file mode 100644 index e86523e49d0..00000000000 --- a/packages/protocol/script/upgrade/UpgradeGuardianProver.s.sol +++ /dev/null @@ -1,13 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.24; - -import "forge-std/src/Script.sol"; -import "forge-std/src/console2.sol"; -import "../../contracts/L1/provers/GuardianProver.sol"; -import "./UpgradeScript.s.sol"; - -contract UpgradeGuardianProver is UpgradeScript { - function run() external setUp { - upgrade("GuardianProver", address(new GuardianProver())); - } -} diff --git a/packages/protocol/script/upgrade/UpgradeScript.s.sol b/packages/protocol/script/upgrade/UpgradeScript.s.sol deleted file mode 100644 index 3a5d70c18e1..00000000000 --- a/packages/protocol/script/upgrade/UpgradeScript.s.sol +++ /dev/null @@ -1,32 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.24; - -import "@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol"; - -import "forge-std/src/console2.sol"; -import "forge-std/src/Script.sol"; - -contract UpgradeScript is Script { - uint256 public privateKey = vm.envUint("PRIVATE_KEY"); - address public proxyAddress = vm.envAddress("PROXY_ADDRESS"); - - UUPSUpgradeable proxy; - - modifier setUp() { - require(privateKey != 0, "PRIVATE_KEY not set"); - require(proxyAddress != address(0), "PROXY_ADDRESS not set"); - - proxy = UUPSUpgradeable(payable(proxyAddress)); - vm.startBroadcast(privateKey); - - _; - - vm.stopBroadcast(); - } - - function upgrade(string memory name, address newImpl) public { - console2.log("Upgrading", name, proxyAddress); - proxy.upgradeTo(newImpl); - console2.log("Upgraded", proxyAddress, "to", newImpl); - } -} diff --git a/packages/protocol/script/upgrade/UpgradeSignalService.s.sol b/packages/protocol/script/upgrade/UpgradeSignalService.s.sol deleted file mode 100644 index 258b8a8add5..00000000000 --- a/packages/protocol/script/upgrade/UpgradeSignalService.s.sol +++ /dev/null @@ -1,13 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.24; - -import "forge-std/src/Script.sol"; -import "forge-std/src/console2.sol"; -import "../../contracts/signal/SignalService.sol"; -import "./UpgradeScript.s.sol"; - -contract UpgradeSignalService is UpgradeScript { - function run() external setUp { - upgrade("SignalService", address(new SignalService())); - } -} diff --git a/packages/protocol/script/upgrade/UpgradeTaikoL1.s.sol b/packages/protocol/script/upgrade/UpgradeTaikoL1.s.sol deleted file mode 100644 index 6f9b7bfd5be..00000000000 --- a/packages/protocol/script/upgrade/UpgradeTaikoL1.s.sol +++ /dev/null @@ -1,13 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.24; - -import "forge-std/src/Script.sol"; -import "forge-std/src/console2.sol"; -import "../../contracts/L1/TaikoL1.sol"; -import "./UpgradeScript.s.sol"; - -contract UpgradeTaikoL1 is UpgradeScript { - function run() external setUp { - upgrade("TaikoL1", address(new TaikoL1())); - } -} diff --git a/packages/protocol/script/upgrade/UpgradeTierProvider.s.sol b/packages/protocol/script/upgrade/UpgradeTierProvider.s.sol deleted file mode 100644 index 1d9d858af8b..00000000000 --- a/packages/protocol/script/upgrade/UpgradeTierProvider.s.sol +++ /dev/null @@ -1,19 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.24; - -import "../../test/DeployCapability.sol"; -import "../../test/L1/TestTierProvider.sol"; - -contract UpgradeTierProvider is DeployCapability { - uint256 public privateKey = vm.envUint("PRIVATE_KEY"); - address public addressManager = vm.envAddress("ADDRESS_MANAGER_ADDRESS"); - - function run() external { - vm.startBroadcast(privateKey); - address impl = address(new TestTierProvider()); - AddressManager(addressManager).setAddress(uint64(block.chainid), "tier_provider", impl); - vm.stopBroadcast(); - console2.log("> tier_provider@", addressManager); - console2.log("\t addr : ", impl); - } -} diff --git a/packages/protocol/script/upgrade_to.sh b/packages/protocol/script/upgrade_to.sh deleted file mode 100755 index 59c920490ff..00000000000 --- a/packages/protocol/script/upgrade_to.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/sh - -set -e -: "${FORK_URL:=http://localhost:8545}" - -forge script script/upgrade/Upgrade$CONTRACT.s.sol:Upgrade$CONTRACT \ - --fork-url $FORK_URL \ - -vvvvv \ - --broadcast \ - --ffi \ diff --git a/packages/protocol/test/L1/TaikoL1TestGroup6.t.sol b/packages/protocol/test/L1/TaikoL1TestGroup6.t.sol deleted file mode 100644 index 012f7321f36..00000000000 --- a/packages/protocol/test/L1/TaikoL1TestGroup6.t.sol +++ /dev/null @@ -1,92 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.24; - -import "./TaikoL1TestGroupBase.sol"; - -contract TaikoL1TestGroup6 is TaikoL1TestGroupBase { - // Test summary: - // 1. Alice proposes a block, assigning Bob as the prover. - // 2. Bob proves the block within the proving window, using the correct parent hash. - // 3. Taylor contests Bob's proof. - // 4. Bob re-proves his proof, showing Taylor is incorrect. - // 5. Bob's proof is validated and used to verify the block. - function test_taikoL1_group_6_case_1() external { - vm.warp(1_000_000); - - giveEthAndTko(Alice, 10_000 ether, 1000 ether); - giveEthAndTko(Bob, 10_000 ether, 1000 ether); - giveEthAndTko(Taylor, 10_000 ether, 1000 ether); - ITierProvider.Tier memory tierOp = TestTierProvider(cp).getTier(LibTiers.TIER_OPTIMISTIC); - ITierProvider.Tier memory tierSgx = TestTierProvider(cp).getTier(LibTiers.TIER_SGX); - - console2.log("====== Alice propose a block with bob as the assigned prover"); - TaikoData.BlockMetadata memory meta = proposeBlock(Alice, Bob, ""); - - console2.log("====== Bob proves the block as the assigned prover"); - bytes32 parentHash = GENESIS_BLOCK_HASH; - bytes32 blockHash = bytes32(uint256(10)); - bytes32 stateRoot = bytes32(uint256(11)); - - mineAndWrap(10 seconds); - proveBlock(Bob, meta, parentHash, blockHash, stateRoot, meta.minTier, ""); - - console2.log("====== Taylor contests Bob"); - bytes32 blockHash2 = bytes32(uint256(20)); - bytes32 stateRoot2 = bytes32(uint256(21)); - mineAndWrap(10 seconds); - proveBlock(Taylor, meta, parentHash, blockHash2, stateRoot2, meta.minTier, ""); - - console2.log("====== Bob cannot proves himself is right"); - mineAndWrap(10 seconds); - proveBlock(Bob, meta, parentHash, blockHash, stateRoot, LibTiers.TIER_SGX, ""); - - { - printBlockAndTrans(meta.id); - - TaikoData.Block memory blk = L1.getBlock(meta.id); - assertEq(blk.nextTransitionId, 2); - assertEq(blk.verifiedTransitionId, 0); - assertEq(blk.assignedProver, Bob); - assertEq(blk.livenessBond, 0); - - TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 1); - assertEq(ts.blockHash, blockHash); - assertEq(ts.stateRoot, stateRoot); - assertEq(ts.tier, LibTiers.TIER_SGX); - assertEq(ts.contester, address(0)); - assertEq(ts.contestBond, 1); // not zero - assertEq(ts.validityBond, tierSgx.validityBond); - assertEq(ts.prover, Bob); - assertEq(ts.timestamp, block.timestamp); // not zero - - assertEq(tko.balanceOf(Taylor), 10_000 ether - tierOp.contestBond); - assertEq( - tko.balanceOf(Bob), 10_000 ether - tierSgx.validityBond + tierOp.contestBond * 7 / 8 - ); - } - - console2.log("====== Verify the block"); - mineAndWrap(7 days); - verifyBlock(1); - { - printBlockAndTrans(meta.id); - - TaikoData.Block memory blk = L1.getBlock(meta.id); - - assertEq(blk.nextTransitionId, 2); - assertEq(blk.verifiedTransitionId, 1); - assertEq(blk.assignedProver, Bob); - assertEq(blk.livenessBond, 0); - - TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 1); - assertEq(ts.blockHash, blockHash); - assertEq(ts.stateRoot, stateRoot); - assertEq(ts.tier, LibTiers.TIER_SGX); - assertEq(ts.contestBond, 1); - assertEq(ts.prover, Bob); - - assertEq(tko.balanceOf(Taylor), 10_000 ether - tierOp.contestBond); - assertEq(tko.balanceOf(Bob), 10_000 ether + tierOp.contestBond * 7 / 8); - } - } -} diff --git a/packages/protocol/test/L2/Lib1559Math.t.sol b/packages/protocol/test/L2/Lib1559Math.t.sol deleted file mode 100644 index a4d275d26be..00000000000 --- a/packages/protocol/test/L2/Lib1559Math.t.sol +++ /dev/null @@ -1,38 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.24; - -import "../TaikoTest.sol"; - -contract TestLib1559Math is TaikoTest { - using LibMath for uint256; - - function test_eip1559_math() external pure { - LibL2Config.Config memory config = LibL2Config.get(); - uint256 adjustmentFactor = config.gasTargetPerL1Block * config.basefeeAdjustmentQuotient; - - uint256 baseFee; - uint256 i; - uint256 target = 0.01 gwei; - - for (uint256 k; k < 5; ++k) { - for (; baseFee < target; ++i) { - baseFee = Lib1559Math.basefee(config.gasTargetPerL1Block * i, adjustmentFactor); - } - console2.log("base fee:", baseFee); - console2.log(" gasExcess:", config.gasTargetPerL1Block * i); - console2.log(" i:", i); - target *= 10; - } - } - - function test_eip1559_math_max() external pure { - LibL2Config.Config memory config = LibL2Config.get(); - uint256 adjustmentFactor = config.gasTargetPerL1Block * config.basefeeAdjustmentQuotient; - - uint256 gasExcess = type(uint64).max; - uint256 baseFee = Lib1559Math.basefee(gasExcess, adjustmentFactor); - - console2.log("base fee (gwei):", baseFee / 1 gwei); - console2.log(" gasExcess:", gasExcess); - } -} diff --git a/packages/protocol/test/L2/TaikoL2.t.sol b/packages/protocol/test/L2/TaikoL2.t.sol deleted file mode 100644 index 3665c3cf43a..00000000000 --- a/packages/protocol/test/L2/TaikoL2.t.sol +++ /dev/null @@ -1,126 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.24; - -import "../TaikoTest.sol"; - -contract SkipBasefeeCheckL2 is TaikoL2EIP1559Configurable { - function skipFeeCheck() public pure override returns (bool) { - return true; - } -} - -contract TestTaikoL2 is TaikoTest { - using SafeCast for uint256; - - // Initial salt for semi-random generation - uint256 salt = 2_195_684_615_435_261_315_311; - // same as `block_gas_limit` in foundry.toml - uint32 public constant BLOCK_GAS_LIMIT = 30_000_000; - - address public addressManager; - TaikoL2EIP1559Configurable public L2; - SkipBasefeeCheckL2 public L2skip; - - function setUp() public { - addressManager = deployProxy({ - name: "address_manager", - impl: address(new AddressManager()), - data: abi.encodeCall(AddressManager.init, (address(0))) - }); - - SignalService ss = SignalService( - deployProxy({ - name: "signal_service", - impl: address(new SignalService()), - data: abi.encodeCall(SignalService.init, (address(0), addressManager)), - registerTo: addressManager - }) - ); - - uint64 gasExcess = 0; - uint8 quotient = 8; - uint32 gasTarget = 60_000_000; - uint64 l1ChainId = 12_345; - - L2 = TaikoL2EIP1559Configurable( - payable( - deployProxy({ - name: "taiko", - impl: address(new TaikoL2EIP1559Configurable()), - data: abi.encodeCall( - TaikoL2.init, (address(0), addressManager, l1ChainId, gasExcess) - ), - registerTo: addressManager - }) - ) - ); - - L2.setConfigAndExcess(LibL2Config.Config(gasTarget, quotient), gasExcess); - - ss.authorize(address(L2), true); - - gasExcess = 195_420_300_100; - - vm.roll(block.number + 1); - vm.warp(block.timestamp + 30); - - vm.deal(address(L2), 100 ether); - } - - // calling anchor in the same block more than once should fail - function test_L2_AnchorTx_revert_in_same_block() external { - vm.fee(1); - - vm.prank(L2.GOLDEN_TOUCH_ADDRESS()); - _anchor(BLOCK_GAS_LIMIT); - - vm.prank(L2.GOLDEN_TOUCH_ADDRESS()); - vm.expectRevert(); // L2_PUBLIC_INPUT_HASH_MISMATCH - _anchor(BLOCK_GAS_LIMIT); - } - - // calling anchor in the same block more than once should fail - function test_L2_AnchorTx_revert_from_wrong_signer() external { - vm.fee(1); - vm.expectRevert(); - _anchor(BLOCK_GAS_LIMIT); - } - - function test_L2_AnchorTx_signing(bytes32 digest) external { - (uint8 v, uint256 r, uint256 s) = LibL2Signer.signAnchor(digest, uint8(1)); - address signer = ecrecover(digest, v + 27, bytes32(r), bytes32(s)); - assertEq(signer, L2.GOLDEN_TOUCH_ADDRESS()); - - (v, r, s) = LibL2Signer.signAnchor(digest, uint8(2)); - signer = ecrecover(digest, v + 27, bytes32(r), bytes32(s)); - assertEq(signer, L2.GOLDEN_TOUCH_ADDRESS()); - - vm.expectRevert(); - LibL2Signer.signAnchor(digest, uint8(0)); - - vm.expectRevert(); - LibL2Signer.signAnchor(digest, uint8(3)); - } - - function test_L2_withdraw() external { - vm.prank(L2.owner(), L2.owner()); - L2.withdraw(address(0), Alice); - assertEq(address(L2).balance, 0 ether); - assertEq(Alice.balance, 100 ether); - - // Random EOA cannot call withdraw - vm.expectRevert(); - vm.prank(Alice, Alice); - L2.withdraw(address(0), Alice); - } - - function test_L2_getBlockHash() external { - assertEq(L2.getBlockHash(uint64(1000)), 0); - } - - function _anchor(uint32 parentGasLimit) private { - bytes32 l1Hash = randBytes32(); - bytes32 l1StateRoot = randBytes32(); - L2.anchor(l1Hash, l1StateRoot, 12_345, parentGasLimit); - } -} diff --git a/packages/protocol/test/L2/TaikoL2EIP1559Configurable.sol b/packages/protocol/test/L2/TaikoL2EIP1559Configurable.sol deleted file mode 100644 index 69661686afd..00000000000 --- a/packages/protocol/test/L2/TaikoL2EIP1559Configurable.sol +++ /dev/null @@ -1,46 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.24; - -import "../../contracts/L2/TaikoL2.sol"; - -/// @title TaikoL2EIP1559Configurable -/// @notice TaikoL2 with a setter to change EIP-1559 configurations and states. -/// @custom:security-contact security@taiko.xyz -contract TaikoL2EIP1559Configurable is TaikoL2 { - /// @notice EIP-1559 configuration. - LibL2Config.Config public customConfig; - - uint256[49] private __gap; - - /// @notice Emits when the EIP-1559 configuration and gas excess are changed. - /// @param config The new EIP-1559 config. - /// @param gasExcess The new gas excess. - event ConfigAndExcessChanged(LibL2Config.Config config, uint64 gasExcess); - - error L2_INVALID_CONFIG(); - - /// @notice Sets EIP1559 configuration and gas excess. - /// @param _newConfig The new EIP1559 config. - /// @param _newGasExcess The new gas excess - function setConfigAndExcess( - LibL2Config.Config memory _newConfig, - uint64 _newGasExcess - ) - external - virtual - onlyOwner - { - if (_newConfig.gasTargetPerL1Block == 0) revert L2_INVALID_CONFIG(); - if (_newConfig.basefeeAdjustmentQuotient == 0) revert L2_INVALID_CONFIG(); - - customConfig = _newConfig; - gasExcess = _newGasExcess; - - emit ConfigAndExcessChanged(_newConfig, _newGasExcess); - } - - /// @inheritdoc TaikoL2 - function getConfig() public view override returns (LibL2Config.Config memory) { - return customConfig; - } -} diff --git a/packages/protocol/test/L2/TaikoL2NoFeeCheck.t.sol b/packages/protocol/test/L2/TaikoL2NoFeeCheck.t.sol deleted file mode 100644 index 6a10e25d6cf..00000000000 --- a/packages/protocol/test/L2/TaikoL2NoFeeCheck.t.sol +++ /dev/null @@ -1,201 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.24; - -import "../TaikoTest.sol"; - -contract SkipBasefeeCheckL2 is TaikoL2EIP1559Configurable { - function skipFeeCheck() public pure override returns (bool) { - return true; - } -} - -contract TestTaikoL2NoFeeCheck is TaikoTest { - using SafeCast for uint256; - - // Initial salt for semi-random generation - uint256 salt = 2_195_684_615_435_261_315_311; - // same as `block_gas_limit` in foundry.toml - uint32 public constant BLOCK_GAS_LIMIT = 30_000_000; - - address public addressManager; - SkipBasefeeCheckL2 public L2; - - function setUp() public { - addressManager = deployProxy({ - name: "address_manager", - impl: address(new AddressManager()), - data: abi.encodeCall(AddressManager.init, (address(0))) - }); - - SignalService ss = SignalService( - deployProxy({ - name: "signal_service", - impl: address(new SignalService()), - data: abi.encodeCall(SignalService.init, (address(0), addressManager)), - registerTo: addressManager - }) - ); - - uint64 gasExcess = 0; - uint8 quotient = 8; - uint32 gasTarget = 60_000_000; - uint64 l1ChainId = 12_345; - - gasExcess = 195_420_300_100; - L2 = SkipBasefeeCheckL2( - payable( - deployProxy({ - name: "taiko", - impl: address(new SkipBasefeeCheckL2()), - data: abi.encodeCall( - TaikoL2.init, (address(0), addressManager, l1ChainId, gasExcess) - ), - registerTo: addressManager - }) - ) - ); - - L2.setConfigAndExcess(LibL2Config.Config(gasTarget, quotient), gasExcess); - - ss.authorize(address(L2), true); - - vm.roll(block.number + 1); - vm.warp(block.timestamp + 30); - } - - function test_L2_NoFeeCheck_simulation_lower_traffic() external { - console2.log("LOW TRAFFIC STARTS"); // For parser - _simulation(100_000, 10_000_000, 1, 8); - console2.log("LOW TRAFFIC ENDS"); - } - - function test_L2_NoFeeCheck_simulation_higher_traffic() external { - console2.log("HIGH TRAFFIC STARTS"); // For parser - _simulation(100_000, 120_000_000, 1, 8); - console2.log("HIGH TRAFFIC ENDS"); - } - - function test_L2_NoFeeCheck_simulation_target_traffic() external { - console2.log("TARGET TRAFFIC STARTS"); // For parser - _simulation(60_000_000, 0, 12, 0); - console2.log("TARGET TRAFFIC ENDS"); - } - - function _simulation( - uint256 minGas, - uint256 maxDiffToMinGas, - uint8 quickest, - uint8 maxDiffToQuickest - ) - internal - { - // We need to randomize the: - // - parent gas used (We should sometimes exceed 150.000.000 gas / 12 - // seconds (to simulate congestion a bit) !!) - // - the time we fire away an L2 block (anchor transaction). - // The rest is baked in. - // initial gas excess issued: 49954623777 (from eip1559_util.py) if we - // want to stick to the params of 10x Ethereum gas, etc. - - // This variables counts if we reached the 12seconds (L1) height, if so - // then resets the accumulated parent gas used and increments the L1 - // height number - uint8 accumulated_seconds = 0; - uint256 accumulated_parent_gas_per_l1_block = 0; - uint64 l1Height = uint64(block.number); - uint64 l1BlockCounter = 0; - uint64 maxL2BlockCount = 180; - uint256 allBaseFee = 0; - uint256 allGasUsed = 0; - uint256 newRandomWithoutSalt; - // Simulate 200 L2 blocks - for (uint256 i; i < maxL2BlockCount; ++i) { - newRandomWithoutSalt = uint256( - keccak256( - abi.encodePacked( - block.prevrandao, msg.sender, block.timestamp, i, newRandomWithoutSalt, salt - ) - ) - ); - - uint32 currentGasUsed; - if (maxDiffToMinGas == 0) { - currentGasUsed = uint32(minGas); - } else { - currentGasUsed = - uint32(pickRandomNumber(newRandomWithoutSalt, minGas, maxDiffToMinGas)); - } - salt = uint256(keccak256(abi.encodePacked(currentGasUsed, salt))); - accumulated_parent_gas_per_l1_block += currentGasUsed; - allGasUsed += currentGasUsed; - - uint8 currentTimeAhead; - if (maxDiffToQuickest == 0) { - currentTimeAhead = uint8(quickest); - } else { - currentTimeAhead = - uint8(pickRandomNumber(newRandomWithoutSalt, quickest, maxDiffToQuickest)); - } - accumulated_seconds += currentTimeAhead; - - if (accumulated_seconds >= 12) { - console2.log( - "Gas used per L1 block:", l1Height, ":", accumulated_parent_gas_per_l1_block - ); - l1Height++; - l1BlockCounter++; - accumulated_parent_gas_per_l1_block = 0; - accumulated_seconds = 0; - } - - vm.prank(L2.GOLDEN_TOUCH_ADDRESS()); - _anchorSimulation(currentGasUsed, l1Height); - (uint256 currentBaseFee,) = L2.getBasefee(l1Height, currentGasUsed); - allBaseFee += currentBaseFee; - console2.log("Actual gas in L2 block is:", currentGasUsed); - console2.log("L2block to baseFee is:", i, ":", currentBaseFee); - vm.roll(block.number + 1); - - vm.warp(block.timestamp + currentTimeAhead); - } - - console2.log("Average wei gas price per L2 block is:", (allBaseFee / maxL2BlockCount)); - console2.log("Average gasUsed per L1 block:", (allGasUsed / l1BlockCounter)); - } - - function test_L2_NoFeeCheck_L2_AnchorTx_signing(bytes32 digest) external { - (uint8 v, uint256 r, uint256 s) = LibL2Signer.signAnchor(digest, uint8(1)); - address signer = ecrecover(digest, v + 27, bytes32(r), bytes32(s)); - assertEq(signer, L2.GOLDEN_TOUCH_ADDRESS()); - - (v, r, s) = LibL2Signer.signAnchor(digest, uint8(2)); - signer = ecrecover(digest, v + 27, bytes32(r), bytes32(s)); - assertEq(signer, L2.GOLDEN_TOUCH_ADDRESS()); - - vm.expectRevert(); - LibL2Signer.signAnchor(digest, uint8(0)); - - vm.expectRevert(); - LibL2Signer.signAnchor(digest, uint8(3)); - } - - // Semi-random number generator - function pickRandomNumber( - uint256 randomNum, - uint256 lowerLimit, - uint256 diffBtwLowerAndUpperLimit - ) - internal - view - returns (uint256) - { - randomNum = uint256(keccak256(abi.encodePacked(randomNum, salt))); - return (lowerLimit + (randomNum % diffBtwLowerAndUpperLimit)); - } - - function _anchorSimulation(uint32 parentGasLimit, uint64 l1Height) private { - bytes32 l1Hash = randBytes32(); - bytes32 l1StateRoot = randBytes32(); - L2.anchor(l1Hash, l1StateRoot, l1Height, parentGasLimit); - } -} diff --git a/packages/protocol/test/common/TestMulticall3.sol b/packages/protocol/test/common/TestMulticall3.sol deleted file mode 100644 index bc0620169b5..00000000000 --- a/packages/protocol/test/common/TestMulticall3.sol +++ /dev/null @@ -1,57 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.24; - -/// @title Multicall3 -/// @notice Aggregate results from multiple function calls -/// @dev Multicall & Multicall2 backwards-compatible -/// @dev Aggregate methods are marked `payable` to save 24 gas per call -/// @author Michael Elliot -/// @author Joshua Levine -/// @author Nick Johnson -/// @author Andreas Bigger -/// @author Matt Solomon -contract TestMulticall3 { - struct Call3 { - address target; - bool allowFailure; - bytes callData; - } - - struct Result { - bool success; - bytes returnData; - } - - /// @notice Aggregate calls, ensuring each returns success if required - /// @param calls An array of Call3 structs - /// @return returnData An array of Result structs - function aggregate3(Call3[] calldata calls) - public - payable - returns (Result[] memory returnData) - { - uint256 length = calls.length; - returnData = new Result[](length); - Call3 calldata calli; - for (uint256 i = 0; i < length; ++i) { - Result memory result = returnData[i]; - calli = calls[i]; - (result.success, result.returnData) = calli.target.call(calli.callData); - assembly { - // Revert if the call fails and failure is not allowed - // `allowFailure := calldataload(add(calli, 0x20))` and `success := mload(result)` - if iszero(or(calldataload(add(calli, 0x20)), mload(result))) { - // set "Error(string)" signature: bytes32(bytes4(keccak256("Error(string)"))) - mstore(0x00, 0x08c379a000000000000000000000000000000000000000000000000000000000) - // set data offset - mstore(0x04, 0x0000000000000000000000000000000000000000000000000000000000000020) - // set length of revert string - mstore(0x24, 0x0000000000000000000000000000000000000000000000000000000000000017) - // set revert string: bytes32(abi.encodePacked("Multicall3: call failed")) - mstore(0x44, 0x4d756c746963616c6c333a2063616c6c206661696c6564000000000000000000) - revert(0x00, 0x64) - } - } - } - } -} diff --git a/packages/protocol/genesis/GenerateGenesis.g.sol b/packages/protocol/test/genesis/GenerateGenesis.g.sol similarity index 92% rename from packages/protocol/genesis/GenerateGenesis.g.sol rename to packages/protocol/test/genesis/GenerateGenesis.g.sol index 52f77f2227c..78da0cd79fc 100644 --- a/packages/protocol/genesis/GenerateGenesis.g.sol +++ b/packages/protocol/test/genesis/GenerateGenesis.g.sol @@ -1,25 +1,25 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import "forge-std/src/console2.sol"; import "forge-std/src/StdJson.sol"; import "forge-std/src/Test.sol"; -import "../contracts/common/AddressManager.sol"; -import "../contracts/bridge/Bridge.sol"; -import "../contracts/tokenvault/ERC1155Vault.sol"; -import "../contracts/tokenvault/ERC20Vault.sol"; -import "../contracts/tokenvault/ERC721Vault.sol"; -import "../contracts/signal/SignalService.sol"; -import "../contracts/L2/TaikoL2.sol"; -import "../test/common/erc20/RegularERC20.sol"; +import "src/shared/common/AddressManager.sol"; +import "src/shared/bridge/Bridge.sol"; +import "src/shared/tokenvault/ERC1155Vault.sol"; +import "src/shared/tokenvault/ERC20Vault.sol"; +import "src/shared/tokenvault/ERC721Vault.sol"; +import "src/shared/signal/SignalService.sol"; +import "src/layer2/based/TaikoL2.sol"; +import "../shared/token/RegularERC20.sol"; contract TestGenerateGenesis is Test, AddressResolver { using stdJson for string; string private configJSON = - vm.readFile(string.concat(vm.projectRoot(), "/deployments/genesis_config.json")); + vm.readFile(string.concat(vm.projectRoot(), "/test/genesis/data/genesis_config.json")); string private genesisAllocJSON = - vm.readFile(string.concat(vm.projectRoot(), "/deployments/genesis_alloc.json")); + vm.readFile(string.concat(vm.projectRoot(), "/test/genesis/data/genesis_alloc.json")); address private contractOwner = configJSON.readAddress(".contractOwner"); uint256 private l1ChainId = configJSON.readUint(".l1ChainId"); @@ -272,7 +272,11 @@ contract TestGenerateGenesis is Test, AddressResolver { assertEq(regularERC20.symbol(), "RGL"); } - function getPredeployedContractAddress(string memory contractName) private view returns (address) { + function getPredeployedContractAddress(string memory contractName) + private + view + returns (address) + { return configJSON.readAddress(string.concat(".contractAddresses.", contractName)); } @@ -284,20 +288,11 @@ contract TestGenerateGenesis is Test, AddressResolver { assertEq(address(contractAddress).code, vm.parseBytes(deployedCode)); } - function checkProxyImplementation( - string memory proxyName - ) - private - { - return checkProxyImplementation(proxyName, contractOwner); + function checkProxyImplementation(string memory proxyName) private { + return checkProxyImplementation(proxyName, contractOwner); } - function checkProxyImplementation( - string memory proxyName, - address owner - ) - private - { + function checkProxyImplementation(string memory proxyName, address owner) private { vm.startPrank(owner); // address contractAddress = getPredeployedContractAddress(contractName); address proxyAddress = getPredeployedContractAddress(proxyName); diff --git a/packages/protocol/test/genesis/data/genesis_config.js b/packages/protocol/test/genesis/data/genesis_config.js new file mode 100644 index 00000000000..df60b5b536f --- /dev/null +++ b/packages/protocol/test/genesis/data/genesis_config.js @@ -0,0 +1,61 @@ +"use strict"; +const ADDRESS_LENGTH = 40; + +module.exports = { + // Owner address of the pre-deployed L2 contracts. + contractOwner: "0xDf08F82De32B8d460adbE8D72043E3a7e25A3B39", + l1ChainId: 1, + // Chain ID of the Taiko L2 network. + chainId: 167, + // Account address and pre-mint ETH amount as key-value pairs. + seedAccounts: [ + { "0xDf08F82De32B8d460adbE8D72043E3a7e25A3B39": 1000 }, + { "0x79fcdef22feed20eddacbb2587640e45491b757f": 1000 }, + ], + // Owner Chain ID, Security Council, and Timelock Controller + l1ChainId: 31337, + ownerSecurityCouncil: "0xDf08F82De32B8d460adbE8D72043E3a7e25A3B39", + ownerTimelockController: "0xDf08F82De32B8d460adbE8D72043E3a7e25A3B39", + get contractAddresses() { + return { + // ============ Implementations ============ + // Shared Contracts + BridgeImpl: getConstantAddress(`0${this.chainId}`, 1), + ERC20VaultImpl: getConstantAddress(`0${this.chainId}`, 2), + ERC721VaultImpl: getConstantAddress(`0${this.chainId}`, 3), + ERC1155VaultImpl: getConstantAddress(`0${this.chainId}`, 4), + SignalServiceImpl: getConstantAddress(`0${this.chainId}`, 5), + SharedAddressManagerImpl: getConstantAddress(`0${this.chainId}`, 6), + BridgedERC20Impl: getConstantAddress(`0${this.chainId}`, 10096), + BridgedERC721Impl: getConstantAddress(`0${this.chainId}`, 10097), + BridgedERC1155Impl: getConstantAddress(`0${this.chainId}`, 10098), + RegularERC20: getConstantAddress(`0${this.chainId}`, 10099), + // Rollup Contracts + TaikoL2Impl: getConstantAddress(`0${this.chainId}`, 10001), + RollupAddressManagerImpl: getConstantAddress(`0${this.chainId}`, 10002), + // ============ Proxies ============ + // Shared Contracts + Bridge: getConstantAddress(this.chainId, 1), + ERC20Vault: getConstantAddress(this.chainId, 2), + ERC721Vault: getConstantAddress(this.chainId, 3), + ERC1155Vault: getConstantAddress(this.chainId, 4), + SignalService: getConstantAddress(this.chainId, 5), + SharedAddressManager: getConstantAddress(this.chainId, 6), + // Rollup Contracts + TaikoL2: getConstantAddress(this.chainId, 10001), + RollupAddressManager: getConstantAddress(this.chainId, 10002), + }; + }, + // L2 EIP-1559 baseFee calculation related fields. + param1559: { + gasExcess: 1, + }, + // Option to pre-deploy an ERC-20 token. + predeployERC20: true, +}; + +function getConstantAddress(prefix, suffix) { + return `0x${prefix}${"0".repeat( + ADDRESS_LENGTH - String(prefix).length - String(suffix).length, + )}${suffix}`; +} diff --git a/packages/protocol/test/genesis/data/genesis_config.json b/packages/protocol/test/genesis/data/genesis_config.json new file mode 100644 index 00000000000..8d771d79b1b --- /dev/null +++ b/packages/protocol/test/genesis/data/genesis_config.json @@ -0,0 +1 @@ +{"contractOwner":"0xDf08F82De32B8d460adbE8D72043E3a7e25A3B39","l1ChainId":31337,"chainId":167,"seedAccounts":[{"0xDf08F82De32B8d460adbE8D72043E3a7e25A3B39":1000},{"0x79fcdef22feed20eddacbb2587640e45491b757f":1000}],"ownerSecurityCouncil":"0xDf08F82De32B8d460adbE8D72043E3a7e25A3B39","ownerTimelockController":"0xDf08F82De32B8d460adbE8D72043E3a7e25A3B39","contractAddresses":{"BridgeImpl":"0x0167000000000000000000000000000000000001","ERC20VaultImpl":"0x0167000000000000000000000000000000000002","ERC721VaultImpl":"0x0167000000000000000000000000000000000003","ERC1155VaultImpl":"0x0167000000000000000000000000000000000004","SignalServiceImpl":"0x0167000000000000000000000000000000000005","SharedAddressManagerImpl":"0x0167000000000000000000000000000000000006","BridgedERC20Impl":"0x0167000000000000000000000000000000010096","BridgedERC721Impl":"0x0167000000000000000000000000000000010097","BridgedERC1155Impl":"0x0167000000000000000000000000000000010098","RegularERC20":"0x0167000000000000000000000000000000010099","TaikoL2Impl":"0x0167000000000000000000000000000000010001","RollupAddressManagerImpl":"0x0167000000000000000000000000000000010002","Bridge":"0x1670000000000000000000000000000000000001","ERC20Vault":"0x1670000000000000000000000000000000000002","ERC721Vault":"0x1670000000000000000000000000000000000003","ERC1155Vault":"0x1670000000000000000000000000000000000004","SignalService":"0x1670000000000000000000000000000000000005","SharedAddressManager":"0x1670000000000000000000000000000000000006","TaikoL2":"0x1670000000000000000000000000000000010001","RollupAddressManager":"0x1670000000000000000000000000000000010002"},"param1559":{"gasExcess":1},"predeployERC20":true} \ No newline at end of file diff --git a/packages/protocol/utils/generate_genesis/erc20.ts b/packages/protocol/test/genesis/generate/erc20.ts similarity index 97% rename from packages/protocol/utils/generate_genesis/erc20.ts rename to packages/protocol/test/genesis/generate/erc20.ts index 1d08dd69ec1..d85c266c1e6 100644 --- a/packages/protocol/utils/generate_genesis/erc20.ts +++ b/packages/protocol/test/genesis/generate/erc20.ts @@ -1,7 +1,7 @@ import { ethers } from "ethers"; import { Result } from "./interface"; const path = require("path"); -const ARTIFACTS_PATH = path.join(__dirname, "../../out"); +const ARTIFACTS_PATH = path.join(__dirname, "../../../out/layer2"); const { computeStorageSlots, getStorageLayout } = require("./utils"); export const TOKEN_NAME = "RegularERC20"; diff --git a/packages/protocol/utils/generate_genesis/main.ts b/packages/protocol/test/genesis/generate/generate.ts similarity index 82% rename from packages/protocol/utils/generate_genesis/main.ts rename to packages/protocol/test/genesis/generate/generate.ts index a792c95a1c5..2462397624c 100644 --- a/packages/protocol/utils/generate_genesis/main.ts +++ b/packages/protocol/test/genesis/generate/generate.ts @@ -4,20 +4,11 @@ const path = require("path"); const { ethers } = require("ethers"); const { deployTaikoL2 } = require("./taikoL2"); const { deployERC20 } = require("./erc20"); +const config: Config = require("../data/genesis_config.js"); // Generate a L2 genesis JSON based on the given configurations. // ref: https://docs.soliditylang.org/en/latest/internals/layout_in_storage.html async function main() { - if (process.argv.length < 3) { - throw new Error("missing config json"); - } - - const config: Config = require( - path.isAbsolute(process.argv[2]) - ? process.argv[2] - : path.join(process.cwd(), process.argv[2]), - ); - const contractOwner = config.contractOwner; const chainId = config.chainId; const seedAccounts = config.seedAccounts; @@ -60,16 +51,13 @@ async function main() { result = await deployERC20(config, result); } - const allocSavedPath = path.join( - __dirname, - "../../deployments/genesis_alloc.json", - ); + const allocSavedPath = path.join(__dirname, "../data/genesis_alloc.json"); fs.writeFileSync(allocSavedPath, JSON.stringify(result.alloc, null, 2)); const layoutSavedPath = path.join( __dirname, - "../../deployments/genesis_storage_layout.json", + "../data/genesis_storage_layout.json", ); fs.writeFileSync( @@ -79,7 +67,7 @@ async function main() { const configJsonSavedPath = path.join( __dirname, - "../../deployments/genesis_config.json", + "../data/genesis_config.json", ); fs.writeFileSync(configJsonSavedPath, JSON.stringify(config)); diff --git a/packages/protocol/utils/generate_genesis/interface.ts b/packages/protocol/test/genesis/generate/interface.ts similarity index 100% rename from packages/protocol/utils/generate_genesis/interface.ts rename to packages/protocol/test/genesis/generate/interface.ts diff --git a/packages/protocol/utils/generate_genesis/taikoL2.ts b/packages/protocol/test/genesis/generate/taikoL2.ts similarity index 99% rename from packages/protocol/utils/generate_genesis/taikoL2.ts rename to packages/protocol/test/genesis/generate/taikoL2.ts index 9e631d35f6c..48e7979c010 100644 --- a/packages/protocol/utils/generate_genesis/taikoL2.ts +++ b/packages/protocol/test/genesis/generate/taikoL2.ts @@ -4,7 +4,7 @@ const { ethers } = require("ethers"); // eslint-disable-next-line node/no-extraneous-require const linker = require("solc/linker"); const { computeStorageSlots, getStorageLayout } = require("./utils"); -const ARTIFACTS_PATH = path.join(__dirname, "../../out"); +const ARTIFACTS_PATH = path.join(__dirname, "../../../out/layer2"); const IMPLEMENTATION_SLOT = "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"; @@ -515,7 +515,7 @@ async function generateContractConfigs( // TaikoL2 => CrossChainOwned l1ChainId, // TaikoL2 - gasExcess: param1559.gasExcess, + parentGasExcess: param1559.gasExcess, publicInputHash: `${ethers.utils.solidityKeccak256( ["bytes32[256]"], [ diff --git a/packages/protocol/utils/generate_genesis/utils.ts b/packages/protocol/test/genesis/generate/utils.ts similarity index 99% rename from packages/protocol/utils/generate_genesis/utils.ts rename to packages/protocol/test/genesis/generate/utils.ts index 96e1adcf0f7..c84f98616ac 100644 --- a/packages/protocol/utils/generate_genesis/utils.ts +++ b/packages/protocol/test/genesis/generate/utils.ts @@ -43,7 +43,7 @@ export interface SolidityStorageLayout { export async function getStorageLayout( name: string, ): Promise { - const artifact = require(`../../out/${name}.sol/${name}.json`); + const artifact = require(`../../../out/layer2/${name}.sol/${name}.json`); if (!("storageLayout" in artifact)) { throw new Error(`Storage layout for ${name} not found.`); } diff --git a/packages/protocol/genesis/generate_genesis.test.sh b/packages/protocol/test/genesis/genesis.test.sh similarity index 87% rename from packages/protocol/genesis/generate_genesis.test.sh rename to packages/protocol/test/genesis/genesis.test.sh index 97d3c848dae..a0046e1b91e 100755 --- a/packages/protocol/genesis/generate_genesis.test.sh +++ b/packages/protocol/test/genesis/genesis.test.sh @@ -14,8 +14,8 @@ if ! docker info > /dev/null 2>&1; then exit 1 fi -GENESIS_JSON=$(cd "$(dirname "$DIR/../..")"; pwd)/deployments/genesis.json -TESTNET_CONFIG=$DIR/testnet/docker-compose.yml +GENESIS_JSON="$DIR/data/genesis.json" +TESTNET_CONFIG="$DIR/testnet/docker-compose.yml" touch "$GENESIS_JSON" @@ -48,13 +48,13 @@ echo ' echo "Starting generate_genesis tests..." # compile the contracts to get latest bytecode -rm -rf out && pnpm compile +rm -rf out && pnpm compile:genesis # run the task -pnpm run generate:genesis $DIR/test_config.js +pnpm run genesis:gen $DIR/test_config.js # generate complete genesis json -cat "$DIR"/../deployments/genesis_alloc.json >> "$GENESIS_JSON" +cat "$DIR/data/genesis_alloc.json" >> "$GENESIS_JSON" echo '}' >> "$GENESIS_JSON" @@ -88,11 +88,11 @@ function waitTestNode { waitTestNode http://localhost:18545 -forge test \ +FOUNDRY_PROFILE=genesis forge test \ -vvv \ --gas-report \ --fork-url http://localhost:18545 \ --fork-retry-backoff 120 \ --no-storage-caching \ - --match-path genesis/*.g.sol \ + --match-path test/genesis/GenerateGenesis.g.sol \ --block-gas-limit 1000000000 diff --git a/packages/protocol/genesis/mainnet.js b/packages/protocol/test/genesis/mainnet.js similarity index 100% rename from packages/protocol/genesis/mainnet.js rename to packages/protocol/test/genesis/mainnet.js diff --git a/packages/protocol/genesis/test_config.js b/packages/protocol/test/genesis/test_config.js similarity index 95% rename from packages/protocol/genesis/test_config.js rename to packages/protocol/test/genesis/test_config.js index 43637193643..59dff796b9c 100644 --- a/packages/protocol/genesis/test_config.js +++ b/packages/protocol/test/genesis/test_config.js @@ -2,9 +2,9 @@ const ADDRESS_LENGTH = 40; module.exports = { - contractOwner: "0x70997970C51812dc3A010C7d01b50e0d17dc79C8", - l1ChainId: 1, - chainId: 167, + contractOwner: "0x91c34396e640e3bB4eE80f2e523c23dDa2b3f78F", + l1ChainId: 7014190335, + chainId: 167010, seedAccounts: [ { "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266": 1024, @@ -76,7 +76,7 @@ module.exports = { "0x9eAF5590f2c84912A08de97FA28d0529361Deb9E": 1024, }, { - "0x1003ff39d25F2Ab16dBCc18EcE05a9B6154f65F4": 1024, + "0x91c34396e640e3bB4eE80f2e523c23dDa2b3f78F": 1024, }, ], get contractAddresses() { @@ -110,7 +110,7 @@ module.exports = { }; }, param1559: { - gasExcess: 20000000000, + gasExcess: 0, }, predeployERC20: true, }; diff --git a/packages/protocol/genesis/testnet/docker-compose.yml b/packages/protocol/test/genesis/testnet/docker-compose.yml similarity index 79% rename from packages/protocol/genesis/testnet/docker-compose.yml rename to packages/protocol/test/genesis/testnet/docker-compose.yml index 069d744f363..745f43de926 100644 --- a/packages/protocol/genesis/testnet/docker-compose.yml +++ b/packages/protocol/test/genesis/testnet/docker-compose.yml @@ -1,11 +1,9 @@ -version: "3.9" - services: geth: image: ethereum/client-go:v1.13.14 restart: unless-stopped volumes: - - ../../deployments:/data + - ../data:/data - .:/host ports: - 18545:8545 diff --git a/packages/protocol/genesis/testnet/init_geth.sh b/packages/protocol/test/genesis/testnet/init_geth.sh similarity index 100% rename from packages/protocol/genesis/testnet/init_geth.sh rename to packages/protocol/test/genesis/testnet/init_geth.sh diff --git a/packages/protocol/genesis/testnet/keyfile.json b/packages/protocol/test/genesis/testnet/keyfile.json similarity index 100% rename from packages/protocol/genesis/testnet/keyfile.json rename to packages/protocol/test/genesis/testnet/keyfile.json diff --git a/packages/protocol/genesis/testnet/password b/packages/protocol/test/genesis/testnet/password similarity index 100% rename from packages/protocol/genesis/testnet/password rename to packages/protocol/test/genesis/testnet/password diff --git a/packages/protocol/test/layer1/TaikoL1Test.sol b/packages/protocol/test/layer1/TaikoL1Test.sol new file mode 100644 index 00000000000..e77e24220b9 --- /dev/null +++ b/packages/protocol/test/layer1/TaikoL1Test.sol @@ -0,0 +1,15 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "src/layer1/based/TaikoL1.sol"; +import "src/layer1/token/TaikoToken.sol"; +import "src/layer1/verifiers/SgxVerifier.sol"; +import "src/layer1/verifiers/SP1Verifier.sol"; +import "src/layer1/verifiers/Risc0Verifier.sol"; +import "src/layer1/provers/GuardianProver.sol"; +import "src/layer1/team/airdrop/ERC20Airdrop.sol"; +import "src/shared/bridge/QuotaManager.sol"; +import "../layer1/based/TestTierRouter.sol"; +import "../shared/TaikoTest.sol"; + +abstract contract TaikoL1Test is TaikoTest { } diff --git a/packages/protocol/test/automata-attestation/AutomataDcapV3AttestationTest.t.sol b/packages/protocol/test/layer1/automata-attestation/AutomataDcapV3AttestationTest.t.sol similarity index 51% rename from packages/protocol/test/automata-attestation/AutomataDcapV3AttestationTest.t.sol rename to packages/protocol/test/layer1/automata-attestation/AutomataDcapV3AttestationTest.t.sol index 0983fbe0071..148cae8a13f 100644 --- a/packages/protocol/test/automata-attestation/AutomataDcapV3AttestationTest.t.sol +++ b/packages/protocol/test/layer1/automata-attestation/AutomataDcapV3AttestationTest.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import "forge-std/src/Test.sol"; import "forge-std/src/console.sol"; @@ -10,7 +10,7 @@ contract AutomataDcapV3AttestationTest is Test, AttestationBase { using BytesUtils for bytes; using stdJson for string; - string internal v3QuoteJsonPath = "/test/automata-attestation/assets/0923/v3quote.json"; + string internal v3QuoteJsonPath = "/test/layer1/automata-attestation/assets/0923/v3quote.json"; function setUp() public { // Call the AttestationBase init setup @@ -117,7 +117,7 @@ contract AutomataDcapV3AttestationTest is Test, AttestationBase { assertTrue(parsedInstanceAddr == address(0xC2D4564358139C90C17B744FE837F4DDc503EEdF)); } - function testParsedQuoteBinAttestation() public { + function testParsedSampleQuoteBinAttestation() public { vm.prank(user); bytes memory v3QuoteBytes = sampleQuote; V3Struct.ParsedV3QuoteStruct memory v3quote = @@ -128,6 +128,34 @@ contract AutomataDcapV3AttestationTest is Test, AttestationBase { assertTrue(parsedInstanceAddr == 0xC2D4564358139C90C17B744FE837F4DDc503EEdF); } + function testParsedCustomQuoteBinAttestation() public { + // fast forward to a time where the quote is valid + skip(1_820_000_000 - block.timestamp); + vm.prank(user); + bytes memory v3QuoteBytes = + hex"03000200000000000a000f00939a7233f79c4ca9940a0db3957f060724b261d141674cafc44426b74ed02fdf000000000b0d100fffff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000500000000000000e7000000000000009b2784bccc0779fa34e75d74881bf5850bb4a6410f4edfa935ef77115db3a86d0000000000000000000000000000000000000000000000000000000000000000ca0583a715534a8c981b914589a7f0dc5d60959d9ae79fb5353299a4231673d500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000309734c02d2145cabb034f3c0505d28f7e5bfc2d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ca10000010eec632f3dbb9a3b1280ca5e837750e12ce5adbea2cc64d53672b0b0213404d3b27c84dc886ce361716b5d51e85136750ca05827ced6d7c2afd025bc6ee44bd874269e41c5fcd064b417d110f40b745b5c7d0eb8208be57c3c48bd7bdabbf2e47c46ddd935f4589134f89c9e0995dfdaaef29aa61807366818f2eebf915134d0b0d100fffff0000000000000000000000000000000000000000000000000000000000000000000000000000000000001500000000000000e70000000000000096b347a64e5a045e27369c26e6dcda51fd7c850e9b3a3a79e718f43261dee1e400000000000000000000000000000000000000000000000000000000000000008c4f5775d796503e96137f77c68a829a0056ac8ded70140b081b094490c57bff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bf7138a8539a3d44afb1d9ab145134cd27aa8c6ee6c3053bdab6b19b46800d570000000000000000000000000000000000000000000000000000000000000000e04cceabc75e8485601a01fdf514b68c31f4498f3e2273930c03a1f7efbe0eaee34f08f9c3a0eba0e24f677ce5692389f4c016e5caf8451b544d312df74264752000000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f0500620e00002d2d2d2d2d424547494e2043455254494649434154452d2d2d2d2d0a4d494945386a4343424a696741774942416749556565364e4e4f502f6b526c6f734d77336b435a70644a70424f414977436759494b6f5a497a6a3045417749770a634445694d434147413155454177775a535735305a577767553064594946424453794251624746305a6d397962534244515445614d42674741315545436777520a535735305a577767513239796347397959585270623234784644415342674e564241634d43314e68626e526849454e7359584a684d51737743515944565151490a44414a445154454c4d416b474131554542684d4356564d774868634e4d6a51774e5449794d6a4d7a4f544d345768634e4d7a45774e5449794d6a4d7a4f544d340a576a42774d534977494159445651514444426c4a626e526c624342545231676755454e4c49454e6c636e52705a6d6c6a5958526c4d526f77474159445651514b0a4442464a626e526c6243424462334a7762334a6864476c76626a45554d424947413155454277774c553246756447456751327868636d4578437a414a42674e560a4241674d416b4e424d517377435159445651514745774a56557a425a4d424d4742797147534d34394167454743437147534d34394177454841304941424673770a4f5267652f704a4834514d3163456c44626f463451384549313864386a42665a63536b4c615179656b35614f6b4767454756672f476655356255453450544c2b0a37794c6b626b394471557950467836592b434b6a67674d4f4d494944436a416642674e5648534d4547444157674253566231334e765276683655424a796454300a4d383442567776655644427242674e56485238455a4442694d47436758714263686c706f64485277637a6f764c32467761533530636e567a6447566b633256790a646d6c6a5a584d75615735305a577775593239744c334e6e6543396a5a584a3061575a7059324630615739754c3359304c33426a61324e796244396a595431770a624746305a6d397962535a6c626d4e765a476c755a7a316b5a584977485159445652304f42425945464c686b766f31584a6f2b6958464c6c6c454f2b472f56580a695239534d41344741315564447745422f775145417749477744414d42674e5648524d4241663845416a41414d4949434f77594a4b6f5a496876684e415130420a424949434c444343416967774867594b4b6f5a496876684e41513042415151516668326b6a583748503937435265674c6256594f726a434341575547436971470a534962345451454e41514977676746564d42414743797147534962345451454e415149424167454c4d42414743797147534962345451454e415149434167454c0a4d42414743797147534962345451454e41514944416745444d42414743797147534962345451454e41514945416745444d42454743797147534962345451454e0a41514946416749412f7a415242677371686b69472b4530424451454342674943415038774541594c4b6f5a496876684e4151304241676343415141774541594c0a4b6f5a496876684e4151304241676743415141774541594c4b6f5a496876684e4151304241676b43415141774541594c4b6f5a496876684e4151304241676f430a415141774541594c4b6f5a496876684e4151304241677343415141774541594c4b6f5a496876684e4151304241677743415141774541594c4b6f5a496876684e0a4151304241673043415141774541594c4b6f5a496876684e4151304241673443415141774541594c4b6f5a496876684e4151304241673843415141774541594c0a4b6f5a496876684e4151304241684143415141774541594c4b6f5a496876684e4151304241684543415130774877594c4b6f5a496876684e41513042416849450a4541734c4177502f2f7741414141414141414141414141774541594b4b6f5a496876684e4151304241775143414141774641594b4b6f5a496876684e415130420a424151474d474271414141414d41384743697147534962345451454e4151554b415145774867594b4b6f5a496876684e41513042426751516c4b6254394547580a78334843365163754c712b374d7a424542676f71686b69472b453042445145484d4459774541594c4b6f5a496876684e4151304242774542416638774541594c0a4b6f5a496876684e4151304242774942416638774541594c4b6f5a496876684e4151304242774d4241663877436759494b6f5a497a6a304541774944534141770a5251496763325556534f386d4b384c314f5675534943514264315671534e50326e716d5656394c4678504e326c6f774349514362662b69785065367a335966420a664b51344f4b6c546f694d55386a66333849672f765275586976525257773d3d0a2d2d2d2d2d454e442043455254494649434154452d2d2d2d2d0a2d2d2d2d2d424547494e2043455254494649434154452d2d2d2d2d0a4d4949436c6a4343416a32674177494241674956414a567658633239472b487051456e4a3150517a7a674658433935554d416f4743437147534d343942414d430a4d476778476a415942674e5642414d4d45556c756447567349464e48574342536232393049454e424d526f77474159445651514b4442464a626e526c624342440a62334a7762334a6864476c76626a45554d424947413155454277774c553246756447456751327868636d4578437a414a42674e564241674d416b4e424d5173770a435159445651514745774a56557a4165467730784f4441314d6a45784d4455774d5442614677307a4d7a41314d6a45784d4455774d5442614d484178496a41670a42674e5642414d4d47556c756447567349464e4857434251513073675547786864475a76636d306751304578476a415942674e5642416f4d45556c75644756730a49454e76636e4276636d4630615739754d5251774567594456515148444174545957353059534244624746795954454c4d416b474131554543417743513045780a437a414a42674e5642415954416c56544d466b77457759484b6f5a497a6a3043415159494b6f5a497a6a304441516344516741454e53422f377432316c58534f0a3243757a7078773734654a423732457944476757357258437478327456544c7136684b6b367a2b5569525a436e71523770734f766771466553786c6d546c4a6c0a65546d693257597a33714f42757a43427544416642674e5648534d4547444157674251695a517a575770303069664f44744a5653763141624f536347724442530a42674e5648523845537a424a4d45656752614244686b466f64485277637a6f764c324e6c636e52705a6d6c6a5958526c63793530636e567a6447566b633256790a646d6c6a5a584d75615735305a577775593239744c306c756447567355306459556d397664454e424c6d526c636a416442674e5648513445466751556c5739640a7a62306234656c4153636e553944504f4156634c336c517744675944565230504151482f42415144416745474d42494741315564457745422f7751494d4159420a4166384341514177436759494b6f5a497a6a30454177494452774177524149675873566b6930772b6936565947573355462f32327561586530594a446a3155650a6e412b546a44316169356343494359623153416d4435786b66545670766f34556f79695359787244574c6d5552344349394e4b7966504e2b0a2d2d2d2d2d454e442043455254494649434154452d2d2d2d2d0a2d2d2d2d2d424547494e2043455254494649434154452d2d2d2d2d0a4d4949436a7a4343416a53674177494241674955496d554d316c71644e496e7a6737535655723951477a6b6e42717777436759494b6f5a497a6a3045417749770a614445614d4267474131554541777752535735305a5777675530645949464a766233516751304578476a415942674e5642416f4d45556c756447567349454e760a636e4276636d4630615739754d5251774567594456515148444174545957353059534244624746795954454c4d416b47413155454341774351304578437a414a0a42674e5642415954416c56544d423458445445344d4455794d5445774e4455784d466f58445451354d54497a4d54497a4e546b314f566f77614445614d4267470a4131554541777752535735305a5777675530645949464a766233516751304578476a415942674e5642416f4d45556c756447567349454e76636e4276636d46300a615739754d5251774567594456515148444174545957353059534244624746795954454c4d416b47413155454341774351304578437a414a42674e56424159540a416c56544d466b77457759484b6f5a497a6a3043415159494b6f5a497a6a3044415163445167414543366e45774d4449595a4f6a2f69505773437a61454b69370a314f694f534c52466857476a626e42564a66566e6b59347533496a6b4459594c304d784f346d717379596a6c42616c54565978465032734a424b357a6c4b4f420a757a43427544416642674e5648534d4547444157674251695a517a575770303069664f44744a5653763141624f5363477244425342674e5648523845537a424a0a4d45656752614244686b466f64485277637a6f764c324e6c636e52705a6d6c6a5958526c63793530636e567a6447566b63325679646d6c6a5a584d75615735300a5a577775593239744c306c756447567355306459556d397664454e424c6d526c636a416442674e564851344546675155496d554d316c71644e496e7a673753560a55723951477a6b6e4271777744675944565230504151482f42415144416745474d42494741315564457745422f7751494d4159424166384341514577436759490a4b6f5a497a6a3045417749445351417752674968414f572f35516b522b533943695344634e6f6f774c7550524c735747662f59693747535839344267775477670a41694541344a306c72486f4d732b586f356f2f7358364f39515778485241765a55474f6452513763767152586171493d0a2d2d2d2d2d454e442043455254494649434154452d2d2d2d2d0a00"; + V3Struct.ParsedV3QuoteStruct memory v3quote = + verifyParsedQuoteAttestation(v3QuoteBytes, true); + address parsedInstanceAddr = + address(bytes20(Bytes.slice(v3quote.localEnclaveReport.reportData, 0, 20))); + // console.log("[log] parsed instance addr = %s", parsedInstanceAddr); + assertTrue(parsedInstanceAddr == 0x309734C02d2145cABB034F3c0505D28F7E5bFc2d); + } + + function testParsedCustomQuoteBinAttestation2() public { + // fast forward to a time where the quote is valid + skip(1_820_000_000 - block.timestamp); + vm.prank(user); + bytes memory v3QuoteBytes = + hex"03000200000000000a000f00939a7233f79c4ca9940a0db3957f06071be3d9366ba62a20234e416dad1fec240000000002090000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005000000000000000300000000000000dfcb4fca3073e3f3a90b05d328688c32619d56f26789c0a9797aa10e765a78070000000000000000000000000000000000000000000000000000000000000000ca0583a715534a8c981b914589a7f0dc5d60959d9ae79fb5353299a4231673d500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ecf78b2b1f7e61370e150678b6283c042c6bda030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000441000003eb0537ec9eff3c1b167a9354ef0e48ec3f8118265d714ce1218931e3fff3d71b526c2012deec8a2d821958dc8ba37011a472bc9eb4338f8580447e50a93d221d7ed1af4c65d20077454982d6352bb648cbce2421197e7df764affb38a7c90dd4523fbf508525c66f39c72e3e7701830ddad0b2891398252fd1acf7868281dfc0209000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001500000000000000030000000000000096b347a64e5a045e27369c26e6dcda51fd7c850e9b3a3a79e718f43261dee1e400000000000000000000000000000000000000000000000000000000000000008c4f5775d796503e96137f77c68a829a0056ac8ded70140b081b094490c57bff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006316b596db625df6899ab6832860358700f52e6edb650f27aac553d0fa4d64140000000000000000000000000000000000000000000000000000000000000000532e6ff126eaa52e75c602bf831838d71f18d69c9341c434e9df28b515b2669d8cb6969c5aa5ee6dc342b7f95de306979c69b09a514d44840689055fc56bcc352000000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f0500dc0d00002d2d2d2d2d424547494e2043455254494649434154452d2d2d2d2d0a4d4949456a44434342444b674177494241674955464a772b4d3738584e49683564396552746a3141336b637031587377436759494b6f5a497a6a3045417749770a6354456a4d4345474131554541777761535735305a577767553064594946424453794251636d396a5a584e7a6233496751304578476a415942674e5642416f4d0a45556c756447567349454e76636e4276636d4630615739754d5251774567594456515148444174545957353059534244624746795954454c4d416b47413155450a4341774351304578437a414a42674e5642415954416c56544d423458445449304d4459784e4445344d7a597a4e316f5844544d784d4459784e4445344d7a597a0a4e316f77634445694d434147413155454177775a535735305a5777675530645949464244537942445a584a3061575a70593246305a5445614d426747413155450a43677752535735305a577767513239796347397959585270623234784644415342674e564241634d43314e68626e526849454e7359584a684d517377435159440a5651514944414a445154454c4d416b474131554542684d4356564d775754415442676371686b6a4f5051494242676771686b6a4f50514d4242774e43414154310a664748303932422f537034647235574a512b787537377753624e4461452b53732f334b4c626b71434d595346535546465757307047636365564832485a646e310a52637833543775337347716442546e697479596d6f344943707a434341714d77487759445652306a42426777466f4155304f6971326e58582b53354a463567380a6578526c304e587957553077624159445652306642475577597a42686f462b6758595a626148523063484d364c79396863476b7564484a316333526c5a484e6c0a636e5a705932567a4c6d6c75644756734c6d4e766253397a5a3367765932567964476c6d61574e6864476c76626939324e4339775932746a636d772f593245390a63484a765932567a633239794a6d56755932396b6157356e5057526c636a416442674e564851344546675155384e42757945652b5a354f6d7a794e674f7845700a4c376f7155374d7744675944565230504151482f42415144416762414d41774741315564457745422f7751434d4141776767485442676b71686b69472b4530420a44514545676748454d4949427744416542676f71686b69472b453042445145424242423662436843506c354d5255734930584f7a656745614d4949425977594b0a4b6f5a496876684e41513042416a434341564d774541594c4b6f5a496876684e4151304241674543415149774541594c4b6f5a496876684e41513042416749430a415149774541594c4b6f5a496876684e4151304241674d43415141774541594c4b6f5a496876684e4151304241675143415141774541594c4b6f5a496876684e0a4151304241675543415141774541594c4b6f5a496876684e4151304241675943415141774541594c4b6f5a496876684e4151304241676343415141774541594c0a4b6f5a496876684e4151304241676743415141774541594c4b6f5a496876684e4151304241676b43415141774541594c4b6f5a496876684e4151304241676f430a415141774541594c4b6f5a496876684e4151304241677343415141774541594c4b6f5a496876684e4151304241677743415141774541594c4b6f5a496876684e0a4151304241673043415141774541594c4b6f5a496876684e4151304241673443415141774541594c4b6f5a496876684e4151304241673843415141774541594c0a4b6f5a496876684e4151304241684143415141774541594c4b6f5a496876684e415130424168454341516b774877594c4b6f5a496876684e41513042416849450a4541494341414141414141414141414141414141414141774541594b4b6f5a496876684e4151304241775143414141774641594b4b6f5a496876684e415130420a4241514741484271454141414d41384743697147534962345451454e4151554b41514177436759494b6f5a497a6a3045417749445341417752514968414d53680a31634b685451576349537230554a4a52765a6d4b767165464f324a37534c65336b794b54677175414169425971442b62676871754e636a55656b384e4a2f467a0a41726b5965416b52683055444d4764436561547032673d3d0a2d2d2d2d2d454e442043455254494649434154452d2d2d2d2d0a2d2d2d2d2d424547494e2043455254494649434154452d2d2d2d2d0a4d4949436d444343416a36674177494241674956414e446f71747031312f6b7553526559504873555a644456386c6c4e4d416f4743437147534d343942414d430a4d476778476a415942674e5642414d4d45556c756447567349464e48574342536232393049454e424d526f77474159445651514b4442464a626e526c624342440a62334a7762334a6864476c76626a45554d424947413155454277774c553246756447456751327868636d4578437a414a42674e564241674d416b4e424d5173770a435159445651514745774a56557a4165467730784f4441314d6a45784d4455774d5442614677307a4d7a41314d6a45784d4455774d5442614d484578497a41680a42674e5642414d4d476b6c756447567349464e48574342515130736755484a765932567a6332397949454e424d526f77474159445651514b4442464a626e526c0a6243424462334a7762334a6864476c76626a45554d424947413155454277774c553246756447456751327868636d4578437a414a42674e564241674d416b4e420a4d517377435159445651514745774a56557a425a4d424d4742797147534d34394167454743437147534d34394177454841304941424c39712b4e4d7032494f670a74646c31626b2f75575a352b5447516d38614369387a373866732b664b435133642b75447a586e56544154325a68444369667949754a77764e33774e427039690a484253534d4a4d4a72424f6a6762737767626777487759445652306a42426777466f4155496d554d316c71644e496e7a6737535655723951477a6b6e427177770a556759445652306642457377535442486f45576751345a426148523063484d364c79396a5a584a3061575a70593246305a584d7564484a316333526c5a484e6c0a636e5a705932567a4c6d6c75644756734c6d4e766253394a626e526c62464e4857464a76623352445153356b5a584977485159445652304f42425945464e446f0a71747031312f6b7553526559504873555a644456386c6c4e4d41344741315564447745422f77514541774942426a415342674e5648524d4241663845434441470a4151482f416745414d416f4743437147534d343942414d43413067414d4555434951434a6754627456714f795a316d336a716941584d365159613672357357530a34792f4737793875494a4778647749675271507642534b7a7a516167424c517135733541373070646f6961524a387a2f3075447a344e675639316b3d0a2d2d2d2d2d454e442043455254494649434154452d2d2d2d2d0a2d2d2d2d2d424547494e2043455254494649434154452d2d2d2d2d0a4d4949436a7a4343416a53674177494241674955496d554d316c71644e496e7a6737535655723951477a6b6e42717777436759494b6f5a497a6a3045417749770a614445614d4267474131554541777752535735305a5777675530645949464a766233516751304578476a415942674e5642416f4d45556c756447567349454e760a636e4276636d4630615739754d5251774567594456515148444174545957353059534244624746795954454c4d416b47413155454341774351304578437a414a0a42674e5642415954416c56544d423458445445344d4455794d5445774e4455784d466f58445451354d54497a4d54497a4e546b314f566f77614445614d4267470a4131554541777752535735305a5777675530645949464a766233516751304578476a415942674e5642416f4d45556c756447567349454e76636e4276636d46300a615739754d5251774567594456515148444174545957353059534244624746795954454c4d416b47413155454341774351304578437a414a42674e56424159540a416c56544d466b77457759484b6f5a497a6a3043415159494b6f5a497a6a3044415163445167414543366e45774d4449595a4f6a2f69505773437a61454b69370a314f694f534c52466857476a626e42564a66566e6b59347533496a6b4459594c304d784f346d717379596a6c42616c54565978465032734a424b357a6c4b4f420a757a43427544416642674e5648534d4547444157674251695a517a575770303069664f44744a5653763141624f5363477244425342674e5648523845537a424a0a4d45656752614244686b466f64485277637a6f764c324e6c636e52705a6d6c6a5958526c63793530636e567a6447566b63325679646d6c6a5a584d75615735300a5a577775593239744c306c756447567355306459556d397664454e424c6d526c636a416442674e564851344546675155496d554d316c71644e496e7a673753560a55723951477a6b6e4271777744675944565230504151482f42415144416745474d42494741315564457745422f7751494d4159424166384341514577436759490a4b6f5a497a6a3045417749445351417752674968414f572f35516b522b533943695344634e6f6f774c7550524c735747662f59693747535839344267775477670a41694541344a306c72486f4d732b586f356f2f7358364f39515778485241765a55474f6452513763767152586171493d0a2d2d2d2d2d454e442043455254494649434154452d2d2d2d2d0a00"; + V3Struct.ParsedV3QuoteStruct memory v3quote = + verifyParsedQuoteAttestation(v3QuoteBytes, true); + address parsedInstanceAddr = + address(bytes20(Bytes.slice(v3quote.localEnclaveReport.reportData, 0, 20))); + // console.log("[log] parsed instance addr = %s", parsedInstanceAddr); + assertTrue(parsedInstanceAddr == 0xecf78b2b1F7e61370e150678b6283C042c6bDa03); + } + function testParsedQuoteBase64Attestation() public { string memory v3QuoteB64Str = "AwACAAAAAAAKAA8Ak5pyM/ecTKmUCg2zlX8GBxLOavHkqB4OzaxCe5m7ApUAAAAACwsQD///AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAAAAADnAAAAAAAAADAx1Y7sROJljY0p6/ptbdwC841C1n7aq7S/qjSGeOa6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdPSuOeKkIHE14ZQJvmEsmUZdpbf5KBZii0O8HZPcA9QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdC5oqY9mLGLKIiJy2EWABZTTIFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAyhAAAEDWo4+gcMfB8oCHFOW95E3dDzSJmZxRjEPY6SLfsAxxmdL1E9tpPreSh37ItjqcFJQ6gYaaITdFjh1JUAIXGkDHJ34Tn18pgiVpiftlGYcB2Db41vFSVv8F1IkbytroE3V6fAn9HOAil3g7r2a52XZitfw4BTw0lwKAvqDrbhp+CwsQD///AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFQAAAAAAAADnAAAAAAAAAJazR6ZOWgReJzacJubc2lH9fIUOmzo6eecY9DJh3uHkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACMT1d115ZQPpYTf3fGioKaAFasje1wFAsIGwlEkMV7/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEACgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA1ueoS9M+Q7Gjo9LDL6xWrbHDoWPHtiwDG87hHG/EUZgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXsD5UvPvZXKx36JrvQfjbUe/9s+nMccmvZd/k77abt+DaUSo3diPOAmrh0ahh1zxMInkgdjDYnXR+3H1g3xY8SAAAAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8FAGIOAAAtLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRTh6Q0NCSm1nQXdJQkFnSVZBTHorallqeGNYK2ZKb21BVWJDSnFnaWZJb2w2TUFvR0NDcUdTTTQ5QkFNQwpNSEF4SWpBZ0JnTlZCQU1NR1VsdWRHVnNJRk5IV0NCUVEwc2dVR3hoZEdadmNtMGdRMEV4R2pBWUJnTlZCQW9NCkVVbHVkR1ZzSUVOdmNuQnZjbUYwYVc5dU1SUXdFZ1lEVlFRSERBdFRZVzUwWVNCRGJHRnlZVEVMTUFrR0ExVUUKQ0F3Q1EwRXhDekFKQmdOVkJBWVRBbFZUTUI0WERUSXpNRGd5T0RFeE1UTXdOVm9YRFRNd01EZ3lPREV4TVRNdwpOVm93Y0RFaU1DQUdBMVVFQXd3WlNXNTBaV3dnVTBkWUlGQkRTeUJEWlhKMGFXWnBZMkYwWlRFYU1CZ0dBMVVFCkNnd1JTVzUwWld3Z1EyOXljRzl5WVhScGIyNHhGREFTQmdOVkJBY01DMU5oYm5SaElFTnNZWEpoTVFzd0NRWUQKVlFRSURBSkRRVEVMTUFrR0ExVUVCaE1DVlZNd1dUQVRCZ2NxaGtqT1BRSUJCZ2dxaGtqT1BRTUJCd05DQUFReQpzQVNyUzZya2VqMTRIZjFKU3B1UE8xTkRVVnl6WEJDdnAxaDQyRjEwVVUwQUZVV2cxWTQ4b2VCZzd0dk41WDJJClRHRUI1ekhCanpqdjlrdVd5VWpVbzRJRERqQ0NBd293SHdZRFZSMGpCQmd3Rm9BVWxXOWR6YjBiNGVsQVNjblUKOURQT0FWY0wzbFF3YXdZRFZSMGZCR1F3WWpCZ29GNmdYSVphYUhSMGNITTZMeTloY0drdWRISjFjM1JsWkhObApjblpwWTJWekxtbHVkR1ZzTG1OdmJTOXpaM2d2WTJWeWRHbG1hV05oZEdsdmJpOTJOQzl3WTJ0amNtdy9ZMkU5CmNHeGhkR1p2Y20wbVpXNWpiMlJwYm1jOVpHVnlNQjBHQTFVZERnUVdCQlJUVjZabHoxdkprWVNma0pqOE5pZnoKcWdhd1dEQU9CZ05WSFE4QkFmOEVCQU1DQnNBd0RBWURWUjBUQVFIL0JBSXdBRENDQWpzR0NTcUdTSWI0VFFFTgpBUVNDQWl3d2dnSW9NQjRHQ2lxR1NJYjRUUUVOQVFFRUVQNUdyZ0Vjem9wTmJvTTBzSTBidEFFd2dnRmxCZ29xCmhraUcrRTBCRFFFQ01JSUJWVEFRQmdzcWhraUcrRTBCRFFFQ0FRSUJDekFRQmdzcWhraUcrRTBCRFFFQ0FnSUIKQ3pBUUJnc3Foa2lHK0UwQkRRRUNBd0lCQXpBUUJnc3Foa2lHK0UwQkRRRUNCQUlCQXpBUkJnc3Foa2lHK0UwQgpEUUVDQlFJQ0FQOHdFUVlMS29aSWh2aE5BUTBCQWdZQ0FnRC9NQkFHQ3lxR1NJYjRUUUVOQVFJSEFnRUFNQkFHCkN5cUdTSWI0VFFFTkFRSUlBZ0VBTUJBR0N5cUdTSWI0VFFFTkFRSUpBZ0VBTUJBR0N5cUdTSWI0VFFFTkFRSUsKQWdFQU1CQUdDeXFHU0liNFRRRU5BUUlMQWdFQU1CQUdDeXFHU0liNFRRRU5BUUlNQWdFQU1CQUdDeXFHU0liNApUUUVOQVFJTkFnRUFNQkFHQ3lxR1NJYjRUUUVOQVFJT0FnRUFNQkFHQ3lxR1NJYjRUUUVOQVFJUEFnRUFNQkFHCkN5cUdTSWI0VFFFTkFRSVFBZ0VBTUJBR0N5cUdTSWI0VFFFTkFRSVJBZ0VOTUI4R0N5cUdTSWI0VFFFTkFRSVMKQkJBTEN3TUQvLzhBQUFBQUFBQUFBQUFBTUJBR0NpcUdTSWI0VFFFTkFRTUVBZ0FBTUJRR0NpcUdTSWI0VFFFTgpBUVFFQmdCZ2FnQUFBREFQQmdvcWhraUcrRTBCRFFFRkNnRUJNQjRHQ2lxR1NJYjRUUUVOQVFZRUVFV0p6T3Z5ClpFOEsza2ovSGhYRWEvc3dSQVlLS29aSWh2aE5BUTBCQnpBMk1CQUdDeXFHU0liNFRRRU5BUWNCQVFIL01CQUcKQ3lxR1NJYjRUUUVOQVFjQ0FRSC9NQkFHQ3lxR1NJYjRUUUVOQVFjREFRSC9NQW9HQ0NxR1NNNDlCQU1DQTBnQQpNRVVDSUJxM3Z4MkROYW1RQkZtVWRNZSttUFlFQ3U4NFhnb0ZDZ0l3U0pWNGNKYVRBaUVBNDNwN3Ryd0I4MHMrCjJpd2FobURkQW5DTXdKVlBMaVNFdXdEUUY4VkVnU3c9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNsakNDQWoyZ0F3SUJBZ0lWQUpWdlhjMjlHK0hwUUVuSjFQUXp6Z0ZYQzk1VU1Bb0dDQ3FHU000OUJBTUMKTUdneEdqQVlCZ05WQkFNTUVVbHVkR1ZzSUZOSFdDQlNiMjkwSUVOQk1Sb3dHQVlEVlFRS0RCRkpiblJsYkNCRApiM0p3YjNKaGRHbHZiakVVTUJJR0ExVUVCd3dMVTJGdWRHRWdRMnhoY21FeEN6QUpCZ05WQkFnTUFrTkJNUXN3CkNRWURWUVFHRXdKVlV6QWVGdzB4T0RBMU1qRXhNRFV3TVRCYUZ3MHpNekExTWpFeE1EVXdNVEJhTUhBeElqQWcKQmdOVkJBTU1HVWx1ZEdWc0lGTkhXQ0JRUTBzZ1VHeGhkR1p2Y20wZ1EwRXhHakFZQmdOVkJBb01FVWx1ZEdWcwpJRU52Y25CdmNtRjBhVzl1TVJRd0VnWURWUVFIREF0VFlXNTBZU0JEYkdGeVlURUxNQWtHQTFVRUNBd0NRMEV4CkN6QUpCZ05WQkFZVEFsVlRNRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUVOU0IvN3QyMWxYU08KMkN1enB4dzc0ZUpCNzJFeURHZ1c1clhDdHgydFZUTHE2aEtrNnorVWlSWkNucVI3cHNPdmdxRmVTeGxtVGxKbAplVG1pMldZejNxT0J1ekNCdURBZkJnTlZIU01FR0RBV2dCUWlaUXpXV3AwMGlmT0R0SlZTdjFBYk9TY0dyREJTCkJnTlZIUjhFU3pCSk1FZWdSYUJEaGtGb2RIUndjem92TDJObGNuUnBabWxqWVhSbGN5NTBjblZ6ZEdWa2MyVnkKZG1salpYTXVhVzUwWld3dVkyOXRMMGx1ZEdWc1UwZFlVbTl2ZEVOQkxtUmxjakFkQmdOVkhRNEVGZ1FVbFc5ZAp6YjBiNGVsQVNjblU5RFBPQVZjTDNsUXdEZ1lEVlIwUEFRSC9CQVFEQWdFR01CSUdBMVVkRXdFQi93UUlNQVlCCkFmOENBUUF3Q2dZSUtvWkl6ajBFQXdJRFJ3QXdSQUlnWHNWa2kwdytpNlZZR1czVUYvMjJ1YVhlMFlKRGoxVWUKbkErVGpEMWFpNWNDSUNZYjFTQW1ENXhrZlRWcHZvNFVveWlTWXhyRFdMbVVSNENJOU5LeWZQTisKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQ2p6Q0NBalNnQXdJQkFnSVVJbVVNMWxxZE5JbnpnN1NWVXI5UUd6a25CcXd3Q2dZSUtvWkl6ajBFQXdJdwphREVhTUJnR0ExVUVBd3dSU1c1MFpXd2dVMGRZSUZKdmIzUWdRMEV4R2pBWUJnTlZCQW9NRVVsdWRHVnNJRU52CmNuQnZjbUYwYVc5dU1SUXdFZ1lEVlFRSERBdFRZVzUwWVNCRGJHRnlZVEVMTUFrR0ExVUVDQXdDUTBFeEN6QUoKQmdOVkJBWVRBbFZUTUI0WERURTRNRFV5TVRFd05EVXhNRm9YRFRRNU1USXpNVEl6TlRrMU9Wb3dhREVhTUJnRwpBMVVFQXd3UlNXNTBaV3dnVTBkWUlGSnZiM1FnUTBFeEdqQVlCZ05WQkFvTUVVbHVkR1ZzSUVOdmNuQnZjbUYwCmFXOXVNUlF3RWdZRFZRUUhEQXRUWVc1MFlTQkRiR0Z5WVRFTE1Ba0dBMVVFQ0F3Q1EwRXhDekFKQmdOVkJBWVQKQWxWVE1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRUM2bkV3TURJWVpPai9pUFdzQ3phRUtpNwoxT2lPU0xSRmhXR2pibkJWSmZWbmtZNHUzSWprRFlZTDBNeE80bXFzeVlqbEJhbFRWWXhGUDJzSkJLNXpsS09CCnV6Q0J1REFmQmdOVkhTTUVHREFXZ0JRaVpReldXcDAwaWZPRHRKVlN2MUFiT1NjR3JEQlNCZ05WSFI4RVN6QkoKTUVlZ1JhQkRoa0ZvZEhSd2N6b3ZMMk5sY25ScFptbGpZWFJsY3k1MGNuVnpkR1ZrYzJWeWRtbGpaWE11YVc1MApaV3d1WTI5dEwwbHVkR1ZzVTBkWVVtOXZkRU5CTG1SbGNqQWRCZ05WSFE0RUZnUVVJbVVNMWxxZE5JbnpnN1NWClVyOVFHemtuQnF3d0RnWURWUjBQQVFIL0JBUURBZ0VHTUJJR0ExVWRFd0VCL3dRSU1BWUJBZjhDQVFFd0NnWUkKS29aSXpqMEVBd0lEU1FBd1JnSWhBT1cvNVFrUitTOUNpU0RjTm9vd0x1UFJMc1dHZi9ZaTdHU1g5NEJnd1R3ZwpBaUVBNEowbHJIb01zK1hvNW8vc1g2TzlRV3hIUkF2WlVHT2RSUTdjdnFSWGFxST0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoA"; diff --git a/packages/protocol/test/layer1/automata-attestation/assets/0424/tcb_00706A100000.json b/packages/protocol/test/layer1/automata-attestation/assets/0424/tcb_00706A100000.json new file mode 100644 index 00000000000..ec1d14b10e4 --- /dev/null +++ b/packages/protocol/test/layer1/automata-attestation/assets/0424/tcb_00706A100000.json @@ -0,0 +1,244 @@ +{ + "tcbInfo": { + "version": 2, + "issueDate": "2024-06-14T19:46:01Z", + "nextUpdate": "2024-07-14T19:46:01Z", + "fmspc": "00706a100000", + "pceId": "0000", + "tcbType": 0, + "tcbEvaluationDataNumber": 16, + "tcbLevels": [ + { + "tcb": { + "sgxtcbcomp01svn": 8, + "sgxtcbcomp02svn": 8, + "sgxtcbcomp03svn": 0, + "sgxtcbcomp04svn": 0, + "sgxtcbcomp05svn": 0, + "sgxtcbcomp06svn": 0, + "sgxtcbcomp07svn": 0, + "sgxtcbcomp08svn": 0, + "sgxtcbcomp09svn": 0, + "sgxtcbcomp10svn": 0, + "sgxtcbcomp11svn": 0, + "sgxtcbcomp12svn": 0, + "sgxtcbcomp13svn": 0, + "sgxtcbcomp14svn": 0, + "sgxtcbcomp15svn": 0, + "sgxtcbcomp16svn": 0, + "pcesvn": 13 + }, + "tcbDate": "2023-08-09T00:00:00Z", + "tcbStatus": "UpToDate" + }, + { + "tcb": { + "sgxtcbcomp01svn": 7, + "sgxtcbcomp02svn": 7, + "sgxtcbcomp03svn": 0, + "sgxtcbcomp04svn": 0, + "sgxtcbcomp05svn": 0, + "sgxtcbcomp06svn": 0, + "sgxtcbcomp07svn": 0, + "sgxtcbcomp08svn": 0, + "sgxtcbcomp09svn": 0, + "sgxtcbcomp10svn": 0, + "sgxtcbcomp11svn": 0, + "sgxtcbcomp12svn": 0, + "sgxtcbcomp13svn": 0, + "sgxtcbcomp14svn": 0, + "sgxtcbcomp15svn": 0, + "sgxtcbcomp16svn": 0, + "pcesvn": 13 + }, + "tcbDate": "2022-11-09T00:00:00Z", + "tcbStatus": "OutOfDate" + }, + { + "tcb": { + "sgxtcbcomp01svn": 5, + "sgxtcbcomp02svn": 5, + "sgxtcbcomp03svn": 0, + "sgxtcbcomp04svn": 0, + "sgxtcbcomp05svn": 0, + "sgxtcbcomp06svn": 0, + "sgxtcbcomp07svn": 0, + "sgxtcbcomp08svn": 0, + "sgxtcbcomp09svn": 0, + "sgxtcbcomp10svn": 0, + "sgxtcbcomp11svn": 0, + "sgxtcbcomp12svn": 0, + "sgxtcbcomp13svn": 0, + "sgxtcbcomp14svn": 0, + "sgxtcbcomp15svn": 0, + "sgxtcbcomp16svn": 0, + "pcesvn": 11 + }, + "tcbDate": "2021-11-10T00:00:00Z", + "tcbStatus": "OutOfDate" + }, + { + "tcb": { + "sgxtcbcomp01svn": 4, + "sgxtcbcomp02svn": 4, + "sgxtcbcomp03svn": 0, + "sgxtcbcomp04svn": 0, + "sgxtcbcomp05svn": 0, + "sgxtcbcomp06svn": 0, + "sgxtcbcomp07svn": 0, + "sgxtcbcomp08svn": 0, + "sgxtcbcomp09svn": 0, + "sgxtcbcomp10svn": 0, + "sgxtcbcomp11svn": 0, + "sgxtcbcomp12svn": 0, + "sgxtcbcomp13svn": 0, + "sgxtcbcomp14svn": 0, + "sgxtcbcomp15svn": 0, + "sgxtcbcomp16svn": 0, + "pcesvn": 11 + }, + "tcbDate": "2021-06-09T00:00:00Z", + "tcbStatus": "OutOfDate" + }, + { + "tcb": { + "sgxtcbcomp01svn": 3, + "sgxtcbcomp02svn": 3, + "sgxtcbcomp03svn": 0, + "sgxtcbcomp04svn": 0, + "sgxtcbcomp05svn": 0, + "sgxtcbcomp06svn": 0, + "sgxtcbcomp07svn": 0, + "sgxtcbcomp08svn": 0, + "sgxtcbcomp09svn": 0, + "sgxtcbcomp10svn": 0, + "sgxtcbcomp11svn": 0, + "sgxtcbcomp12svn": 0, + "sgxtcbcomp13svn": 0, + "sgxtcbcomp14svn": 0, + "sgxtcbcomp15svn": 0, + "sgxtcbcomp16svn": 0, + "pcesvn": 10 + }, + "tcbDate": "2020-11-11T00:00:00Z", + "tcbStatus": "OutOfDate" + }, + { + "tcb": { + "sgxtcbcomp01svn": 2, + "sgxtcbcomp02svn": 2, + "sgxtcbcomp03svn": 0, + "sgxtcbcomp04svn": 0, + "sgxtcbcomp05svn": 0, + "sgxtcbcomp06svn": 0, + "sgxtcbcomp07svn": 0, + "sgxtcbcomp08svn": 0, + "sgxtcbcomp09svn": 0, + "sgxtcbcomp10svn": 0, + "sgxtcbcomp11svn": 0, + "sgxtcbcomp12svn": 0, + "sgxtcbcomp13svn": 0, + "sgxtcbcomp14svn": 0, + "sgxtcbcomp15svn": 0, + "sgxtcbcomp16svn": 0, + "pcesvn": 9 + }, + "tcbDate": "2020-06-10T00:00:00Z", + "tcbStatus": "OutOfDate" + }, + { + "tcb": { + "sgxtcbcomp01svn": 2, + "sgxtcbcomp02svn": 2, + "sgxtcbcomp03svn": 0, + "sgxtcbcomp04svn": 0, + "sgxtcbcomp05svn": 0, + "sgxtcbcomp06svn": 0, + "sgxtcbcomp07svn": 0, + "sgxtcbcomp08svn": 0, + "sgxtcbcomp09svn": 0, + "sgxtcbcomp10svn": 0, + "sgxtcbcomp11svn": 0, + "sgxtcbcomp12svn": 0, + "sgxtcbcomp13svn": 0, + "sgxtcbcomp14svn": 0, + "sgxtcbcomp15svn": 0, + "sgxtcbcomp16svn": 0, + "pcesvn": 7 + }, + "tcbDate": "2019-05-15T00:00:00Z", + "tcbStatus": "OutOfDate" + }, + { + "tcb": { + "sgxtcbcomp01svn": 2, + "sgxtcbcomp02svn": 2, + "sgxtcbcomp03svn": 0, + "sgxtcbcomp04svn": 0, + "sgxtcbcomp05svn": 0, + "sgxtcbcomp06svn": 0, + "sgxtcbcomp07svn": 0, + "sgxtcbcomp08svn": 0, + "sgxtcbcomp09svn": 0, + "sgxtcbcomp10svn": 0, + "sgxtcbcomp11svn": 0, + "sgxtcbcomp12svn": 0, + "sgxtcbcomp13svn": 0, + "sgxtcbcomp14svn": 0, + "sgxtcbcomp15svn": 0, + "sgxtcbcomp16svn": 0, + "pcesvn": 6 + }, + "tcbDate": "2018-08-15T00:00:00Z", + "tcbStatus": "OutOfDate" + }, + { + "tcb": { + "sgxtcbcomp01svn": 1, + "sgxtcbcomp02svn": 1, + "sgxtcbcomp03svn": 0, + "sgxtcbcomp04svn": 0, + "sgxtcbcomp05svn": 0, + "sgxtcbcomp06svn": 0, + "sgxtcbcomp07svn": 0, + "sgxtcbcomp08svn": 0, + "sgxtcbcomp09svn": 0, + "sgxtcbcomp10svn": 0, + "sgxtcbcomp11svn": 0, + "sgxtcbcomp12svn": 0, + "sgxtcbcomp13svn": 0, + "sgxtcbcomp14svn": 0, + "sgxtcbcomp15svn": 0, + "sgxtcbcomp16svn": 0, + "pcesvn": 5 + }, + "tcbDate": "2018-01-04T00:00:00Z", + "tcbStatus": "OutOfDate" + }, + { + "tcb": { + "sgxtcbcomp01svn": 0, + "sgxtcbcomp02svn": 0, + "sgxtcbcomp03svn": 0, + "sgxtcbcomp04svn": 0, + "sgxtcbcomp05svn": 0, + "sgxtcbcomp06svn": 0, + "sgxtcbcomp07svn": 0, + "sgxtcbcomp08svn": 0, + "sgxtcbcomp09svn": 0, + "sgxtcbcomp10svn": 0, + "sgxtcbcomp11svn": 0, + "sgxtcbcomp12svn": 0, + "sgxtcbcomp13svn": 0, + "sgxtcbcomp14svn": 0, + "sgxtcbcomp15svn": 0, + "sgxtcbcomp16svn": 0, + "pcesvn": 4 + }, + "tcbDate": "2017-07-26T00:00:00Z", + "tcbStatus": "OutOfDate" + } + ] + }, + "signature": "f9c1b130cfd4d7b681e2e082b074e752a9ec286927845fda0846373e985606755277ea130eb169b32ef98b6337a547d9ae06374435c4e9d1c04154443c1c65b5" +} diff --git a/packages/protocol/test/automata-attestation/assets/0424/tcb_00906ED50000.json b/packages/protocol/test/layer1/automata-attestation/assets/0424/tcb_00906ED50000.json similarity index 100% rename from packages/protocol/test/automata-attestation/assets/0424/tcb_00906ED50000.json rename to packages/protocol/test/layer1/automata-attestation/assets/0424/tcb_00906ED50000.json diff --git a/packages/protocol/test/automata-attestation/assets/0424/tcb_00A067110000.json b/packages/protocol/test/layer1/automata-attestation/assets/0424/tcb_00A067110000.json similarity index 100% rename from packages/protocol/test/automata-attestation/assets/0424/tcb_00A067110000.json rename to packages/protocol/test/layer1/automata-attestation/assets/0424/tcb_00A067110000.json diff --git a/packages/protocol/test/layer1/automata-attestation/assets/0424/tcb_30606a000000.json b/packages/protocol/test/layer1/automata-attestation/assets/0424/tcb_30606a000000.json new file mode 100644 index 00000000000..c97c2b2971d --- /dev/null +++ b/packages/protocol/test/layer1/automata-attestation/assets/0424/tcb_30606a000000.json @@ -0,0 +1,221 @@ +{ + "tcbInfo": { + "version": 2, + "issueDate": "2024-06-05T21:19:36Z", + "nextUpdate": "2024-07-05T21:19:36Z", + "fmspc": "30606a000000", + "pceId": "0000", + "tcbType": 0, + "tcbEvaluationDataNumber": 16, + "tcbLevels": [ + { + "tcb": { + "sgxtcbcomp01svn": 12, + "sgxtcbcomp02svn": 12, + "sgxtcbcomp03svn": 3, + "sgxtcbcomp04svn": 3, + "sgxtcbcomp05svn": 255, + "sgxtcbcomp06svn": 255, + "sgxtcbcomp07svn": 1, + "sgxtcbcomp08svn": 0, + "sgxtcbcomp09svn": 0, + "sgxtcbcomp10svn": 0, + "sgxtcbcomp11svn": 0, + "sgxtcbcomp12svn": 0, + "sgxtcbcomp13svn": 0, + "sgxtcbcomp14svn": 0, + "sgxtcbcomp15svn": 0, + "sgxtcbcomp16svn": 0, + "pcesvn": 13 + }, + "tcbDate": "2023-08-09T00:00:00Z", + "tcbStatus": "SWHardeningNeeded" + }, + { + "tcb": { + "sgxtcbcomp01svn": 12, + "sgxtcbcomp02svn": 12, + "sgxtcbcomp03svn": 3, + "sgxtcbcomp04svn": 3, + "sgxtcbcomp05svn": 255, + "sgxtcbcomp06svn": 255, + "sgxtcbcomp07svn": 0, + "sgxtcbcomp08svn": 0, + "sgxtcbcomp09svn": 0, + "sgxtcbcomp10svn": 0, + "sgxtcbcomp11svn": 0, + "sgxtcbcomp12svn": 0, + "sgxtcbcomp13svn": 0, + "sgxtcbcomp14svn": 0, + "sgxtcbcomp15svn": 0, + "sgxtcbcomp16svn": 0, + "pcesvn": 13 + }, + "tcbDate": "2023-08-09T00:00:00Z", + "tcbStatus": "ConfigurationAndSWHardeningNeeded" + }, + { + "tcb": { + "sgxtcbcomp01svn": 11, + "sgxtcbcomp02svn": 11, + "sgxtcbcomp03svn": 3, + "sgxtcbcomp04svn": 3, + "sgxtcbcomp05svn": 255, + "sgxtcbcomp06svn": 255, + "sgxtcbcomp07svn": 1, + "sgxtcbcomp08svn": 0, + "sgxtcbcomp09svn": 0, + "sgxtcbcomp10svn": 0, + "sgxtcbcomp11svn": 0, + "sgxtcbcomp12svn": 0, + "sgxtcbcomp13svn": 0, + "sgxtcbcomp14svn": 0, + "sgxtcbcomp15svn": 0, + "sgxtcbcomp16svn": 0, + "pcesvn": 13 + }, + "tcbDate": "2023-02-15T00:00:00Z", + "tcbStatus": "OutOfDate" + }, + { + "tcb": { + "sgxtcbcomp01svn": 11, + "sgxtcbcomp02svn": 11, + "sgxtcbcomp03svn": 3, + "sgxtcbcomp04svn": 3, + "sgxtcbcomp05svn": 255, + "sgxtcbcomp06svn": 255, + "sgxtcbcomp07svn": 0, + "sgxtcbcomp08svn": 0, + "sgxtcbcomp09svn": 0, + "sgxtcbcomp10svn": 0, + "sgxtcbcomp11svn": 0, + "sgxtcbcomp12svn": 0, + "sgxtcbcomp13svn": 0, + "sgxtcbcomp14svn": 0, + "sgxtcbcomp15svn": 0, + "sgxtcbcomp16svn": 0, + "pcesvn": 13 + }, + "tcbDate": "2023-02-15T00:00:00Z", + "tcbStatus": "OutOfDateConfigurationNeeded" + }, + { + "tcb": { + "sgxtcbcomp01svn": 7, + "sgxtcbcomp02svn": 9, + "sgxtcbcomp03svn": 3, + "sgxtcbcomp04svn": 3, + "sgxtcbcomp05svn": 255, + "sgxtcbcomp06svn": 255, + "sgxtcbcomp07svn": 1, + "sgxtcbcomp08svn": 0, + "sgxtcbcomp09svn": 0, + "sgxtcbcomp10svn": 0, + "sgxtcbcomp11svn": 0, + "sgxtcbcomp12svn": 0, + "sgxtcbcomp13svn": 0, + "sgxtcbcomp14svn": 0, + "sgxtcbcomp15svn": 0, + "sgxtcbcomp16svn": 0, + "pcesvn": 13 + }, + "tcbDate": "2022-08-10T00:00:00Z", + "tcbStatus": "OutOfDate" + }, + { + "tcb": { + "sgxtcbcomp01svn": 7, + "sgxtcbcomp02svn": 9, + "sgxtcbcomp03svn": 3, + "sgxtcbcomp04svn": 3, + "sgxtcbcomp05svn": 255, + "sgxtcbcomp06svn": 255, + "sgxtcbcomp07svn": 0, + "sgxtcbcomp08svn": 0, + "sgxtcbcomp09svn": 0, + "sgxtcbcomp10svn": 0, + "sgxtcbcomp11svn": 0, + "sgxtcbcomp12svn": 0, + "sgxtcbcomp13svn": 0, + "sgxtcbcomp14svn": 0, + "sgxtcbcomp15svn": 0, + "sgxtcbcomp16svn": 0, + "pcesvn": 13 + }, + "tcbDate": "2022-08-10T00:00:00Z", + "tcbStatus": "OutOfDateConfigurationNeeded" + }, + { + "tcb": { + "sgxtcbcomp01svn": 4, + "sgxtcbcomp02svn": 4, + "sgxtcbcomp03svn": 3, + "sgxtcbcomp04svn": 3, + "sgxtcbcomp05svn": 255, + "sgxtcbcomp06svn": 255, + "sgxtcbcomp07svn": 0, + "sgxtcbcomp08svn": 0, + "sgxtcbcomp09svn": 0, + "sgxtcbcomp10svn": 0, + "sgxtcbcomp11svn": 0, + "sgxtcbcomp12svn": 0, + "sgxtcbcomp13svn": 0, + "sgxtcbcomp14svn": 0, + "sgxtcbcomp15svn": 0, + "sgxtcbcomp16svn": 0, + "pcesvn": 11 + }, + "tcbDate": "2021-11-10T00:00:00Z", + "tcbStatus": "OutOfDate" + }, + { + "tcb": { + "sgxtcbcomp01svn": 4, + "sgxtcbcomp02svn": 4, + "sgxtcbcomp03svn": 3, + "sgxtcbcomp04svn": 3, + "sgxtcbcomp05svn": 255, + "sgxtcbcomp06svn": 255, + "sgxtcbcomp07svn": 0, + "sgxtcbcomp08svn": 0, + "sgxtcbcomp09svn": 0, + "sgxtcbcomp10svn": 0, + "sgxtcbcomp11svn": 0, + "sgxtcbcomp12svn": 0, + "sgxtcbcomp13svn": 0, + "sgxtcbcomp14svn": 0, + "sgxtcbcomp15svn": 0, + "sgxtcbcomp16svn": 0, + "pcesvn": 10 + }, + "tcbDate": "2020-11-11T00:00:00Z", + "tcbStatus": "OutOfDate" + }, + { + "tcb": { + "sgxtcbcomp01svn": 4, + "sgxtcbcomp02svn": 4, + "sgxtcbcomp03svn": 3, + "sgxtcbcomp04svn": 3, + "sgxtcbcomp05svn": 255, + "sgxtcbcomp06svn": 255, + "sgxtcbcomp07svn": 0, + "sgxtcbcomp08svn": 0, + "sgxtcbcomp09svn": 0, + "sgxtcbcomp10svn": 0, + "sgxtcbcomp11svn": 0, + "sgxtcbcomp12svn": 0, + "sgxtcbcomp13svn": 0, + "sgxtcbcomp14svn": 0, + "sgxtcbcomp15svn": 0, + "sgxtcbcomp16svn": 0, + "pcesvn": 5 + }, + "tcbDate": "2018-01-04T00:00:00Z", + "tcbStatus": "OutOfDate" + } + ] + }, + "signature": "cd542e85f79fdf7fadb6218bb8640df5fd988f6287b5da46c7f96c63f93c39e540fe260a2f5fe640430705339fad9372a4301f071a9838a737dff6ff6c63e042" +} diff --git a/packages/protocol/test/automata-attestation/assets/0923/identity.json b/packages/protocol/test/layer1/automata-attestation/assets/0923/identity.json similarity index 100% rename from packages/protocol/test/automata-attestation/assets/0923/identity.json rename to packages/protocol/test/layer1/automata-attestation/assets/0923/identity.json diff --git a/packages/protocol/test/automata-attestation/assets/0923/tcb_00606A000000.json b/packages/protocol/test/layer1/automata-attestation/assets/0923/tcb_00606A000000.json similarity index 100% rename from packages/protocol/test/automata-attestation/assets/0923/tcb_00606A000000.json rename to packages/protocol/test/layer1/automata-attestation/assets/0923/tcb_00606A000000.json diff --git a/packages/protocol/test/automata-attestation/assets/0923/v3quote.json b/packages/protocol/test/layer1/automata-attestation/assets/0923/v3quote.json similarity index 100% rename from packages/protocol/test/automata-attestation/assets/0923/v3quote.json rename to packages/protocol/test/layer1/automata-attestation/assets/0923/v3quote.json diff --git a/packages/protocol/test/automata-attestation/assets/complex.json b/packages/protocol/test/layer1/automata-attestation/assets/complex.json similarity index 100% rename from packages/protocol/test/automata-attestation/assets/complex.json rename to packages/protocol/test/layer1/automata-attestation/assets/complex.json diff --git a/packages/protocol/test/automata-attestation/common/AttestationBase.t.sol b/packages/protocol/test/layer1/automata-attestation/common/AttestationBase.t.sol similarity index 89% rename from packages/protocol/test/automata-attestation/common/AttestationBase.t.sol rename to packages/protocol/test/layer1/automata-attestation/common/AttestationBase.t.sol index 62016721950..1f2d71a67ce 100644 --- a/packages/protocol/test/automata-attestation/common/AttestationBase.t.sol +++ b/packages/protocol/test/layer1/automata-attestation/common/AttestationBase.t.sol @@ -1,23 +1,23 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import "forge-std/src/Test.sol"; import "forge-std/src/console.sol"; import "forge-std/src/StdJson.sol"; -import "../../../contracts/verifiers/SgxVerifier.sol"; -import "../../../contracts/thirdparty/optimism/Bytes.sol"; -import { AutomataDcapV3Attestation } from - "../../../contracts/automata-attestation/AutomataDcapV3Attestation.sol"; -import { P256Verifier } from "p256-verifier/src/P256Verifier.sol"; -import { SigVerifyLib } from "../../../contracts/automata-attestation/utils/SigVerifyLib.sol"; -import { PEMCertChainLib } from "../../../contracts/automata-attestation/lib/PEMCertChainLib.sol"; -import { V3Struct } from "../../../contracts/automata-attestation/lib/QuoteV3Auth/V3Struct.sol"; -import { BytesUtils } from "../../../contracts/automata-attestation/utils/BytesUtils.sol"; -import { Base64 } from "solady/src/utils/Base64.sol"; -import "../utils/DcapTestUtils.t.sol"; -import "../utils/V3QuoteParseUtils.t.sol"; +import "@optimism/packages/contracts-bedrock/src/libraries/Bytes.sol"; import "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; +import "@p256-verifier/contracts/P256Verifier.sol"; + +import "src/layer1/verifiers/SgxVerifier.sol"; +import "src/layer1/automata-attestation/AutomataDcapV3Attestation.sol"; +import "src/layer1/automata-attestation/utils/SigVerifyLib.sol"; +import "src/layer1/automata-attestation/lib/PEMCertChainLib.sol"; +import "src/layer1/automata-attestation/lib/QuoteV3Auth/V3Struct.sol"; +import "src/layer1/automata-attestation/utils/BytesUtils.sol"; +import "solady/src/utils/Base64.sol"; +import "../utils/DcapTestUtils.t.sol"; +import "../utils/V3QuoteParseUtils.t.sol"; contract AttestationBase is Test, DcapTestUtils, V3QuoteParseUtils { using BytesUtils for bytes; @@ -30,8 +30,14 @@ contract AttestationBase is Test, DcapTestUtils, V3QuoteParseUtils { // use a network that where the P256Verifier contract exists // ref: https://github.com/daimo-eth/p256-verifier //string internal rpcUrl = vm.envString("RPC_URL"); - string internal tcbInfoPath = "/test/automata-attestation/assets/0923/tcb_00606A000000.json"; - string internal idPath = "/test/automata-attestation/assets/0923/identity.json"; + string[] internal tcbInfoPaths = [ + "/test/layer1/automata-attestation/assets/0923/tcb_00606A000000.json", + "/test/layer1/automata-attestation/assets/0424/tcb_00A067110000.json", + "/test/layer1/automata-attestation/assets/0424/tcb_00906ED50000.json", + "/test/layer1/automata-attestation/assets/0424/tcb_30606a000000.json", + "/test/layer1/automata-attestation/assets/0424/tcb_00706A100000.json" + ]; + string internal idPath = "/test/layer1/automata-attestation/assets/0923/identity.json"; address constant admin = address(1); address constant user = 0x0926b716f6aEF52F9F3C3474A2846e1Bf1ACedf6; bytes32 mrEnclave = 0x46049af725ec3986eeb788693df7bc5f14d3f2705106a19cd09b9d89237db1a0; @@ -68,15 +74,18 @@ contract AttestationBase is Test, DcapTestUtils, V3QuoteParseUtils { setMrEnclave(address(attestation), mrEnclave, true); setMrSigner(address(attestation), mrSigner, true); - string memory tcbInfoJson = vm.readFile(string.concat(vm.projectRoot(), tcbInfoPath)); - string memory enclaveIdJson = vm.readFile(string.concat(vm.projectRoot(), idPath)); + for (uint256 i = 0; i < tcbInfoPaths.length; i++) { + string memory tcbInfoJson = + vm.readFile(string.concat(vm.projectRoot(), tcbInfoPaths[i])); - (bool tcbParsedSuccess, TCBInfoStruct.TCBInfo memory parsedTcbInfo) = - parseTcbInfoJson(tcbInfoJson); - require(tcbParsedSuccess, "tcb parsed failed"); - string memory fmspc = LibString.lower(parsedTcbInfo.fmspc); - attestation.configureTcbInfoJson(fmspc, parsedTcbInfo); + (bool tcbParsedSuccess, TCBInfoStruct.TCBInfo memory parsedTcbInfo) = + parseTcbInfoJson(tcbInfoJson); + require(tcbParsedSuccess, "tcb parsed failed"); + string memory fmspc = LibString.lower(parsedTcbInfo.fmspc); + attestation.configureTcbInfoJson(fmspc, parsedTcbInfo); + } + string memory enclaveIdJson = vm.readFile(string.concat(vm.projectRoot(), idPath)); configureQeIdentityJson(address(attestation), enclaveIdJson); vm.stopPrank(); } diff --git a/packages/protocol/test/automata-attestation/utils/DcapTestUtils.t.sol b/packages/protocol/test/layer1/automata-attestation/utils/DcapTestUtils.t.sol similarity index 95% rename from packages/protocol/test/automata-attestation/utils/DcapTestUtils.t.sol rename to packages/protocol/test/layer1/automata-attestation/utils/DcapTestUtils.t.sol index a859d73a30e..03c581109ff 100644 --- a/packages/protocol/test/automata-attestation/utils/DcapTestUtils.t.sol +++ b/packages/protocol/test/layer1/automata-attestation/utils/DcapTestUtils.t.sol @@ -1,11 +1,11 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; -import { TCBInfoStruct } from "../../../contracts/automata-attestation/lib/TCBInfoStruct.sol"; -import { EnclaveIdStruct } from "../../../contracts/automata-attestation/lib/EnclaveIdStruct.sol"; -import { V3Struct } from "../../../contracts/automata-attestation/lib/QuoteV3Auth/V3Struct.sol"; -import { JSONParserLib } from "solady/src/utils/JSONParserLib.sol"; -import { LibString } from "solady/src/utils/LibString.sol"; +import "src/layer1/automata-attestation/lib/TCBInfoStruct.sol"; +import "src/layer1/automata-attestation/lib/EnclaveIdStruct.sol"; +import "src/layer1/automata-attestation/lib/QuoteV3Auth/V3Struct.sol"; +import "solady/src/utils/JSONParserLib.sol"; +import "solady/src/utils/LibString.sol"; contract DcapTestUtils { using JSONParserLib for JSONParserLib.Item; @@ -235,7 +235,7 @@ contract DcapTestUtils { // Converts a string to a hexstring (of bytes type) // https://ethereum.stackexchange.com/questions/39989/solidity-convert-hex-string-to-bytes - // Convert an hexadecimal character to their value + // Convert a hexadecimal character to their value function _fromHexChar(uint8 c) private pure returns (uint8) { if (bytes1(c) >= bytes1("0") && bytes1(c) <= bytes1("9")) { return c - uint8(bytes1("0")); @@ -249,7 +249,7 @@ contract DcapTestUtils { revert("failed to convert hex value"); } - // Convert an hexadecimal string to raw bytes + // Convert a hexadecimal string to raw bytes function _fromHex(string memory s) private pure returns (bytes memory) { bytes memory ss = bytes(s); require(ss.length % 2 == 0); // length must be even diff --git a/packages/protocol/test/automata-attestation/utils/V3QuoteParseUtils.t.sol b/packages/protocol/test/layer1/automata-attestation/utils/V3QuoteParseUtils.t.sol similarity index 91% rename from packages/protocol/test/automata-attestation/utils/V3QuoteParseUtils.t.sol rename to packages/protocol/test/layer1/automata-attestation/utils/V3QuoteParseUtils.t.sol index 83b7e9a24a4..ae40bc25c0e 100644 --- a/packages/protocol/test/automata-attestation/utils/V3QuoteParseUtils.t.sol +++ b/packages/protocol/test/layer1/automata-attestation/utils/V3QuoteParseUtils.t.sol @@ -1,14 +1,13 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; -import { V3Struct } from "../../../contracts/automata-attestation/lib/QuoteV3Auth/V3Struct.sol"; -import { V3Parser } from "../../../contracts/automata-attestation/lib/QuoteV3Auth/V3Parser.sol"; -import { IPEMCertChainLib } from - "../../../contracts/automata-attestation/lib/interfaces/IPEMCertChainLib.sol"; -import { PEMCertChainLib } from "../../../contracts/automata-attestation/lib/PEMCertChainLib.sol"; -import { Base64 } from "solady/src/utils/Base64.sol"; -import { JSONParserLib } from "solady/src/utils/JSONParserLib.sol"; -import { LibString } from "solady/src/utils/LibString.sol"; +import "src/layer1/automata-attestation/lib/QuoteV3Auth/V3Struct.sol"; +import "src/layer1/automata-attestation/lib/QuoteV3Auth/V3Parser.sol"; +import "src/layer1/automata-attestation/lib/interfaces/IPEMCertChainLib.sol"; +import "src/layer1/automata-attestation/lib/PEMCertChainLib.sol"; +import "solady/src/utils/Base64.sol"; +import "solady/src/utils/JSONParserLib.sol"; +import "solady/src/utils/LibString.sol"; contract V3QuoteParseUtils { using JSONParserLib for JSONParserLib.Item; diff --git a/packages/protocol/test/L1/GuardianProver1.t.sol b/packages/protocol/test/layer1/based/GuardianProver1.t.sol similarity index 94% rename from packages/protocol/test/L1/GuardianProver1.t.sol rename to packages/protocol/test/layer1/based/GuardianProver1.t.sol index 9ae2bd02e4e..0400cafd3eb 100644 --- a/packages/protocol/test/L1/GuardianProver1.t.sol +++ b/packages/protocol/test/layer1/based/GuardianProver1.t.sol @@ -1,7 +1,8 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; -import "../TaikoTest.sol"; +import "src/layer1/provers/GuardianProver.sol"; +import "test/shared/TaikoTest.sol"; contract DummyGuardianProver is GuardianProver { uint256 public operationId; @@ -11,7 +12,7 @@ contract DummyGuardianProver is GuardianProver { } function approve(bytes32 hash) public returns (bool) { - return _approve(operationId++, hash); + return _saveApproval(operationId++, hash); } } diff --git a/packages/protocol/test/L1/GuardianProver2.t.sol b/packages/protocol/test/layer1/based/GuardianProver2.t.sol similarity index 95% rename from packages/protocol/test/L1/GuardianProver2.t.sol rename to packages/protocol/test/layer1/based/GuardianProver2.t.sol index 3aede68a4e9..2cc6df5a115 100644 --- a/packages/protocol/test/L1/GuardianProver2.t.sol +++ b/packages/protocol/test/layer1/based/GuardianProver2.t.sol @@ -1,7 +1,8 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; -import "../L1/TaikoL1TestBase.sol"; +import "src/layer1/provers/GuardianProver.sol"; +import "./TaikoL1TestBase.sol"; /// @author Kirk Baird contract TestGuardianProver2 is TaikoL1TestBase { diff --git a/packages/protocol/test/layer1/based/MockTaikoL1.sol b/packages/protocol/test/layer1/based/MockTaikoL1.sol new file mode 100644 index 00000000000..82e50637655 --- /dev/null +++ b/packages/protocol/test/layer1/based/MockTaikoL1.sol @@ -0,0 +1,68 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "src/layer1/based/ITaikoL1.sol"; + +/// @title MockTaikoL1 +/// @custom:security-contact security@taiko.xyz +contract MockTaikoL1 is ITaikoL1 { + function proposeBlockV2( + bytes calldata _params, + bytes calldata _txList + ) + external + virtual + returns (TaikoData.BlockMetadataV2 memory meta_) + { } + + function proposeBlocksV2( + bytes[] calldata _paramsArr, + bytes[] calldata _txListArr + ) + external + virtual + returns (TaikoData.BlockMetadataV2[] memory metaArr_) + { } + + function proveBlock(uint64 _blockId, bytes calldata _input) external virtual { } + + function proveBlocks( + uint64[] calldata _blockIds, + bytes[] calldata _inputs, + bytes calldata _batchProof + ) + external + virtual + { } + + function verifyBlocks(uint64 _maxBlocksToVerify) external virtual { } + + function pauseProving(bool _pause) external virtual { } + + function depositBond(uint256 _amount) external payable virtual { } + + function withdrawBond(uint256 _amount) external virtual { } + + function getVerifiedBlockProver(uint64 _blockId) external view virtual returns (address) { } + + function getBlockV2(uint64 _blockId) + external + view + virtual + returns (TaikoData.BlockV2 memory blk_) + { } + + function getTransition( + uint64 _blockId, + uint32 _tid + ) + external + view + virtual + returns (TaikoData.TransitionState memory) + { } + + function lastProposedIn() external view returns (uint56) { } + + function getConfig() external pure virtual returns (TaikoData.Config memory) { } +} diff --git a/packages/protocol/test/L1/TaikoL1.t.sol b/packages/protocol/test/layer1/based/TaikoL1.t.sol similarity index 70% rename from packages/protocol/test/L1/TaikoL1.t.sol rename to packages/protocol/test/layer1/based/TaikoL1.t.sol index 399bc88c8b0..52415ea780d 100644 --- a/packages/protocol/test/L1/TaikoL1.t.sol +++ b/packages/protocol/test/layer1/based/TaikoL1.t.sol @@ -1,17 +1,17 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import "./TaikoL1TestBase.sol"; contract TaikoL1_NoCooldown is TaikoL1 { - function getConfig() public view override returns (TaikoData.Config memory config) { + function getConfig() public pure override returns (TaikoData.Config memory config) { config = TaikoL1.getConfig(); // over-write the following - config.maxBlocksToVerifyPerProposal = 0; + config.maxBlocksToVerify = 0; config.blockMaxProposals = 10; config.blockRingBufferSize = 12; config.livenessBond = 1e18; // 1 Taiko token - config.checkEOAForCalldataDA = false; + config.ontakeForkHeight = 0; } } @@ -21,7 +21,7 @@ contract Verifier { } } -contract TaikoL1Test is TaikoL1TestBase { +contract TaikoL1Tests is TaikoL1TestBase { function deployTaikoL1() internal override returns (TaikoL1) { return TaikoL1( payable( @@ -41,20 +41,19 @@ contract TaikoL1Test is TaikoL1TestBase { giveEthAndTko(Bob, 1e8 ether, 100 ether); console2.log("Bob balance:", tko.balanceOf(Bob)); giveEthAndTko(Carol, 1e8 ether, 100 ether); - // Bob - vm.prank(Bob, Bob); bytes32 parentHash = GENESIS_BLOCK_HASH; for (uint256 blockId = 1; blockId < conf.blockMaxProposals * 3; blockId++) { //printVariables("before propose"); - (TaikoData.BlockMetadata memory meta,) = proposeBlock(Alice, Bob, 1_000_000, 1024); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, 1024); + //printVariables("after propose"); mine(1); bytes32 blockHash = bytes32(1e10 + blockId); bytes32 stateRoot = bytes32(1e9 + blockId); - proveBlock(Bob, meta, parentHash, blockHash, stateRoot, meta.minTier, ""); + proveBlock(Alice, meta, parentHash, blockHash, stateRoot, meta.minTier, ""); vm.roll(block.number + 15 * 12); uint16 minTier = meta.minTier; @@ -69,36 +68,33 @@ contract TaikoL1Test is TaikoL1TestBase { /// @dev Test more than one block can be proposed, proven, & verified in the /// same L1 block. function test_L1_multiple_blocks_in_one_L1_block() external { - giveEthAndTko(Alice, 1000 ether, 1000 ether); + giveEthAndTko(Alice, 1e8 ether, 1000 ether); console2.log("Alice balance:", tko.balanceOf(Alice)); - giveEthAndTko(Bob, 1e8 ether, 100 ether); - console2.log("Bob balance:", tko.balanceOf(Bob)); giveEthAndTko(Carol, 1e8 ether, 100 ether); - // Bob - vm.prank(Bob, Bob); bytes32 parentHash = GENESIS_BLOCK_HASH; for (uint256 blockId = 1; blockId <= 20; ++blockId) { printVariables("before propose"); - (TaikoData.BlockMetadata memory meta,) = proposeBlock(Alice, Bob, 1_000_000, 1024); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, 1024); + printVariables("after propose"); bytes32 blockHash = bytes32(1e10 + blockId); bytes32 stateRoot = bytes32(1e9 + blockId); - proveBlock(Bob, meta, parentHash, blockHash, stateRoot, meta.minTier, ""); + proveBlock(Alice, meta, parentHash, blockHash, stateRoot, meta.minTier, ""); vm.roll(block.number + 15 * 12); uint16 minTier = meta.minTier; vm.warp(block.timestamp + tierProvider().getTier(minTier).cooldownWindow * 60 + 1); verifyBlock(2); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(meta.id, blk.blockId); TaikoData.TransitionState memory ts = L1.getTransition(meta.id, parentHash); - assertEq(ts.prover, Bob); + assertEq(ts.prover, Alice); parentHash = blockHash; } @@ -107,25 +103,22 @@ contract TaikoL1Test is TaikoL1TestBase { /// @dev Test verifying multiple blocks in one transaction function test_L1_verifying_multiple_blocks_once() external { - giveEthAndTko(Alice, 1000 ether, 1000 ether); + giveEthAndTko(Alice, 1e8 ether, 1000 ether); console2.log("Alice balance:", tko.balanceOf(Alice)); - giveEthAndTko(Bob, 1e8 ether, 100 ether); - console2.log("Bob balance:", tko.balanceOf(Bob)); giveEthAndTko(Carol, 1e8 ether, 100 ether); - // Bob - vm.prank(Bob, Bob); bytes32 parentHash = GENESIS_BLOCK_HASH; for (uint256 blockId = 1; blockId <= conf.blockMaxProposals; blockId++) { printVariables("before propose"); - (TaikoData.BlockMetadata memory meta,) = proposeBlock(Alice, Bob, 1_000_000, 1024); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, 1024); + printVariables("after propose"); bytes32 blockHash = bytes32(1e10 + blockId); bytes32 stateRoot = bytes32(1e9 + blockId); - proveBlock(Bob, meta, parentHash, blockHash, stateRoot, meta.minTier, ""); + proveBlock(Alice, meta, parentHash, blockHash, stateRoot, meta.minTier, ""); parentHash = blockHash; } @@ -140,14 +133,13 @@ contract TaikoL1Test is TaikoL1TestBase { function test_L1_in_proving_window_logic() external { giveEthAndTko(Alice, 1000 ether, 1000 ether); console2.log("Alice balance:", tko.balanceOf(Alice)); - giveEthAndTko(Bob, 1e8 ether, 100 ether); - console2.log("Bob balance:", tko.balanceOf(Bob)); giveEthAndTko(Carol, 1e8 ether, 100 ether); bytes32 parentHash = GENESIS_BLOCK_HASH; for (uint256 blockId = 1; blockId <= conf.blockMaxProposals; blockId++) { - (TaikoData.BlockMetadata memory meta,) = proposeBlock(Alice, Bob, 1_000_000, 1024); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, 1024); + bytes32 blockHash; bytes32 stateRoot; if (blockId % 2 == 0) { @@ -168,12 +160,12 @@ contract TaikoL1Test is TaikoL1TestBase { secondTransitionHash, stateRoot, meta.minTier, - TaikoErrors.L1_NOT_ASSIGNED_PROVER.selector + LibProving.L1_NOT_ASSIGNED_PROVER.selector ); // Only guardian or assigned prover is allowed if (blockId % 4 == 0) { - proveBlock(Bob, meta, parentHash, blockHash, stateRoot, meta.minTier, ""); + proveBlock(Alice, meta, parentHash, blockHash, stateRoot, meta.minTier, ""); } else { proveBlock( Carol, meta, parentHash, blockHash, stateRoot, LibTiers.TIER_GUARDIAN, "" @@ -202,13 +194,12 @@ contract TaikoL1Test is TaikoL1TestBase { function test_pauseProving() external { L1.pauseProving(true); - TaikoData.BlockMetadata memory meta; - giveEthAndTko(Alice, 1000 ether, 1000 ether); giveEthAndTko(Bob, 1e8 ether, 100 ether); // Proposing is still possible - (meta,) = proposeBlock(Alice, Bob, 1_000_000, 1024); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, 1024); + // Proving is not, so supply the revert reason to proveBlock proveBlock( Bob, @@ -217,7 +208,7 @@ contract TaikoL1Test is TaikoL1TestBase { bytes32("01"), bytes32("02"), meta.minTier, - TaikoErrors.L1_PROVING_PAUSED.selector + LibProving.L1_PROVING_PAUSED.selector ); } @@ -228,43 +219,18 @@ contract TaikoL1Test is TaikoL1TestBase { giveEthAndTko(Bob, 1e8 ether, 100 ether); // Proposing is also not possible - proposeButRevert(Alice, Bob, 1024, EssentialContract.INVALID_PAUSE_STATUS.selector); + proposeButRevert(Alice, 1024, EssentialContract.INVALID_PAUSE_STATUS.selector); // unpause L1.unpause(); // Proposing is possible again - proposeBlock(Alice, Bob, 1_000_000, 1024); + proposeBlock(Alice, 1024); } - function test_getTierIds() external { - uint16[] memory tiers = cp.getTierIds(); - assertEq(tiers[0], LibTiers.TIER_OPTIMISTIC); - assertEq(tiers[1], LibTiers.TIER_SGX); - assertEq(tiers[2], LibTiers.TIER_GUARDIAN); - - vm.expectRevert(); - cp.getTier(123); - } - - function proposeButRevert( - address proposer, - address prover, - uint24 txListSize, - bytes4 revertReason - ) - internal - { - uint256 msgValue = 2 ether; - AssignmentHook.ProverAssignment memory assignment; - TaikoData.HookCall[] memory hookcalls = new TaikoData.HookCall[](1); - hookcalls[0] = TaikoData.HookCall(address(assignmentHook), abi.encode(assignment)); - + function proposeButRevert(address proposer, uint24 txListSize, bytes4 revertReason) internal { vm.prank(proposer, proposer); vm.expectRevert(revertReason); - L1.proposeBlock{ value: msgValue }( - abi.encode(TaikoData.BlockParams(prover, address(0), 0, 0, hookcalls, "")), - new bytes(txListSize) - ); + L1.proposeBlockV2("", new bytes(txListSize)); } } diff --git a/packages/protocol/test/L1/TaikoL1LibProvingWithTiers.t.sol b/packages/protocol/test/layer1/based/TaikoL1LibProvingWithTiers.t.sol similarity index 70% rename from packages/protocol/test/L1/TaikoL1LibProvingWithTiers.t.sol rename to packages/protocol/test/layer1/based/TaikoL1LibProvingWithTiers.t.sol index 6a65281c7c8..d27eb8a968c 100644 --- a/packages/protocol/test/L1/TaikoL1LibProvingWithTiers.t.sol +++ b/packages/protocol/test/layer1/based/TaikoL1LibProvingWithTiers.t.sol @@ -1,17 +1,17 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import "./TaikoL1TestBase.sol"; contract TaikoL1Tiers is TaikoL1 { - function getConfig() public view override returns (TaikoData.Config memory config) { + function getConfig() public pure override returns (TaikoData.Config memory config) { config = TaikoL1.getConfig(); - config.maxBlocksToVerifyPerProposal = 0; + config.maxBlocksToVerify = 0; config.blockMaxProposals = 10; config.blockRingBufferSize = 12; config.livenessBond = 1e18; // 1 Taiko token - config.checkEOAForCalldataDA = false; + config.ontakeForkHeight = 0; } } @@ -29,7 +29,7 @@ contract TaikoL1LibProvingWithTiers is TaikoL1TestBase { } function proveHigherTierProof( - TaikoData.BlockMetadata memory meta, + TaikoData.BlockMetadataV2 memory meta, bytes32 parentHash, bytes32 stateRoot, bytes32 blockHash, @@ -50,19 +50,12 @@ contract TaikoL1LibProvingWithTiers is TaikoL1TestBase { giveEthAndTko(Alice, 1e7 ether, 1000 ether); giveEthAndTko(Carol, 1e7 ether, 1000 ether); console2.log("Alice balance:", tko.balanceOf(Alice)); - // This is a very weird test (code?) issue here. - // If this line is uncommented, - // Alice/Bob has no balance.. (Causing reverts !!!) - // Current investigations are ongoing with foundry team - giveEthAndTko(Bob, 1e6 ether, 100 ether); - console2.log("Bob balance:", tko.balanceOf(Bob)); - // Bob - vm.prank(Bob, Bob); bytes32 parentHash = GENESIS_BLOCK_HASH; for (uint256 blockId = 1; blockId < conf.blockMaxProposals * 3; blockId++) { printVariables("before propose"); - (TaikoData.BlockMetadata memory meta,) = proposeBlock(Alice, Bob, 1_000_000, 1024); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, 1024); + //printVariables("after propose"); mine(1); @@ -70,7 +63,7 @@ contract TaikoL1LibProvingWithTiers is TaikoL1TestBase { bytes32 stateRoot = bytes32(1e9 + blockId); // This proof cannot be verified obviously because of // blockhash:blockId - proveBlock(Bob, meta, parentHash, blockHash, stateRoot, meta.minTier, ""); + proveBlock(Alice, meta, parentHash, blockHash, stateRoot, meta.minTier, ""); // Try to contest - but should revert with L1_ALREADY_PROVED proveBlock( @@ -80,7 +73,7 @@ contract TaikoL1LibProvingWithTiers is TaikoL1TestBase { blockHash, stateRoot, meta.minTier, - TaikoErrors.L1_ALREADY_PROVED.selector + LibProving.L1_ALREADY_PROVED.selector ); vm.roll(block.number + 15 * 12); @@ -99,19 +92,12 @@ contract TaikoL1LibProvingWithTiers is TaikoL1TestBase { giveEthAndTko(Alice, 1e8 ether, 1000 ether); giveEthAndTko(Carol, 1e8 ether, 1000 ether); console2.log("Alice balance:", tko.balanceOf(Alice)); - // This is a very weird test (code?) issue here. - // If this line is uncommented, - // Alice/Bob has no balance.. (Causing reverts !!!) - // Current investigations are ongoing with foundry team - giveEthAndTko(Bob, 1e8 ether, 100 ether); - console2.log("Bob balance:", tko.balanceOf(Bob)); - // Bob - vm.prank(Bob, Bob); bytes32 parentHash = GENESIS_BLOCK_HASH; for (uint256 blockId = 1; blockId < conf.blockMaxProposals * 3; blockId++) { printVariables("before propose"); - (TaikoData.BlockMetadata memory meta,) = proposeBlock(Alice, Bob, 1_000_000, 1024); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, 1024); + //printVariables("after propose"); mine(1); @@ -121,7 +107,7 @@ contract TaikoL1LibProvingWithTiers is TaikoL1TestBase { // stateRoot instead of blockHash uint16 minTier = meta.minTier; - proveBlock(Bob, meta, parentHash, stateRoot, stateRoot, minTier, ""); + proveBlock(Alice, meta, parentHash, stateRoot, stateRoot, minTier, ""); // Try to contest proveBlock(Carol, meta, parentHash, blockHash, stateRoot, minTier, ""); @@ -152,19 +138,12 @@ contract TaikoL1LibProvingWithTiers is TaikoL1TestBase { giveEthAndTko(Alice, 1e8 ether, 1000 ether); giveEthAndTko(Carol, 1e8 ether, 1000 ether); console2.log("Alice balance:", tko.balanceOf(Alice)); - // This is a very weird test (code?) issue here. - // If this line is uncommented, - // Alice/Bob has no balance.. (Causing reverts !!!) - // Current investigations are ongoing with foundry team - giveEthAndTko(Bob, 1e8 ether, 100 ether); - console2.log("Bob balance:", tko.balanceOf(Bob)); - // Bob - vm.prank(Bob, Bob); bytes32 parentHash = GENESIS_BLOCK_HASH; for (uint256 blockId = 1; blockId < conf.blockMaxProposals * 3; blockId++) { printVariables("before propose"); - (TaikoData.BlockMetadata memory meta,) = proposeBlock(Alice, Bob, 1_000_000, 1024); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, 1024); + //printVariables("after propose"); mine(1); @@ -173,7 +152,7 @@ contract TaikoL1LibProvingWithTiers is TaikoL1TestBase { // This proof cannot be verified obviously because of // stateRoot instead of blockHash uint16 minTier = meta.minTier; - proveBlock(Bob, meta, parentHash, stateRoot, stateRoot, minTier, ""); + proveBlock(Alice, meta, parentHash, stateRoot, stateRoot, minTier, ""); // Try to contest proveBlock(Carol, meta, parentHash, blockHash, stateRoot, minTier, ""); @@ -204,19 +183,12 @@ contract TaikoL1LibProvingWithTiers is TaikoL1TestBase { giveEthAndTko(Alice, 1e8 ether, 1000 ether); giveEthAndTko(Carol, 1e8 ether, 1000 ether); console2.log("Alice balance:", tko.balanceOf(Alice)); - // This is a very weird test (code?) issue here. - // If this line is uncommented, - // Alice/Bob has no balance.. (Causing reverts !!!) - // Current investigations are ongoing with foundry team - giveEthAndTko(Bob, 1e8 ether, 100 ether); - console2.log("Bob balance:", tko.balanceOf(Bob)); - // Bob - vm.prank(Bob, Bob); bytes32 parentHash = GENESIS_BLOCK_HASH; for (uint256 blockId = 1; blockId < conf.blockMaxProposals * 3; blockId++) { printVariables("before propose"); - (TaikoData.BlockMetadata memory meta,) = proposeBlock(Alice, Bob, 1_000_000, 1024); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, 1024); + //printVariables("after propose"); mine(1); @@ -226,7 +198,7 @@ contract TaikoL1LibProvingWithTiers is TaikoL1TestBase { // stateRoot instead of blockHash uint16 minTier = meta.minTier; - proveBlock(Bob, meta, parentHash, blockHash, stateRoot, minTier, ""); + proveBlock(Alice, meta, parentHash, blockHash, stateRoot, minTier, ""); if (minTier == LibTiers.TIER_OPTIMISTIC) { // Try to contest @@ -261,19 +233,12 @@ contract TaikoL1LibProvingWithTiers is TaikoL1TestBase { giveEthAndTko(Alice, 1e8 ether, 1000 ether); giveEthAndTko(Carol, 1e8 ether, 1000 ether); console2.log("Alice balance:", tko.balanceOf(Alice)); - // This is a very weird test (code?) issue here. - // If this line is uncommented, - // Alice/Bob has no balance.. (Causing reverts !!!) - // Current investigations are ongoing with foundry team - giveEthAndTko(Bob, 1e8 ether, 100 ether); - console2.log("Bob balance:", tko.balanceOf(Bob)); - // Bob - vm.prank(Bob, Bob); bytes32 parentHash = GENESIS_BLOCK_HASH; for (uint256 blockId = 1; blockId < 10; blockId++) { printVariables("before propose"); - (TaikoData.BlockMetadata memory meta,) = proposeBlock(Alice, Bob, 1_000_000, 1024); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, 1024); + //printVariables("after propose"); mine(1); @@ -282,7 +247,7 @@ contract TaikoL1LibProvingWithTiers is TaikoL1TestBase { // This proof cannot be verified obviously because of // stateRoot instead of blockHash uint16 minTier = meta.minTier; - proveBlock(Bob, meta, parentHash, stateRoot, stateRoot, minTier, ""); + proveBlock(Alice, meta, parentHash, stateRoot, stateRoot, minTier, ""); if (minTier == LibTiers.TIER_OPTIMISTIC) { // Try to contest @@ -305,7 +270,7 @@ contract TaikoL1LibProvingWithTiers is TaikoL1TestBase { 0, stateRoot, LibTiers.TIER_GUARDIAN, - TaikoErrors.L1_INVALID_TRANSITION.selector + LibProving.L1_INVALID_TRANSITION.selector ); } @@ -324,21 +289,16 @@ contract TaikoL1LibProvingWithTiers is TaikoL1TestBase { function test_L1_NonAssignedProverCannotBeFirstInProofWindowTime() external { giveEthAndTko(Alice, 1e8 ether, 100 ether); - // This is a very weird test (code?) issue here. - // If this line (or Bob's query balance) is uncommented, - // Alice/Bob has no balance.. (Causing reverts !!!) console2.log("Alice balance:", tko.balanceOf(Alice)); - giveEthAndTko(Bob, 1e8 ether, 100 ether); - console2.log("Bob balance:", tko.balanceOf(Bob)); + giveEthAndTko(Carol, 1e8 ether, 100 ether); - // Bob - vm.prank(Bob, Bob); bytes32 parentHash = GENESIS_BLOCK_HASH; for (uint256 blockId = 1; blockId < 10; blockId++) { //printVariables("before propose"); - (TaikoData.BlockMetadata memory meta,) = proposeBlock(Alice, Bob, 1_000_000, 1024); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, 1024); + //printVariables("after propose"); mine(1); @@ -351,7 +311,7 @@ contract TaikoL1LibProvingWithTiers is TaikoL1TestBase { blockHash, stateRoot, meta.minTier, - TaikoErrors.L1_NOT_ASSIGNED_PROVER.selector + LibProving.L1_NOT_ASSIGNED_PROVER.selector ); vm.roll(block.number + 15 * 12); @@ -368,19 +328,12 @@ contract TaikoL1LibProvingWithTiers is TaikoL1TestBase { giveEthAndTko(Alice, 1e7 ether, 1000 ether); giveEthAndTko(Carol, 1e7 ether, 1000 ether); console2.log("Alice balance:", tko.balanceOf(Alice)); - // This is a very weird test (code?) issue here. - // If this line is uncommented, - // Alice/Bob has no balance.. (Causing reverts !!!) - // Current investigations are ongoing with foundry team - giveEthAndTko(Bob, 1e6 ether, 100 ether); - console2.log("Bob balance:", tko.balanceOf(Bob)); - // Bob - vm.prank(Bob, Bob); bytes32 parentHash = GENESIS_BLOCK_HASH; for (uint256 blockId = 1; blockId < conf.blockMaxProposals * 3; blockId++) { printVariables("before propose"); - (TaikoData.BlockMetadata memory meta,) = proposeBlock(Alice, Bob, 1_000_000, 1024); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, 1024); + //printVariables("after propose"); mine(1); @@ -391,7 +344,7 @@ contract TaikoL1LibProvingWithTiers is TaikoL1TestBase { (, TaikoData.SlotB memory b) = L1.getStateVariables(); uint64 lastVerifiedBlockBefore = b.lastVerifiedBlockId; - proveBlock(Bob, meta, parentHash, blockHash, stateRoot, meta.minTier, ""); + proveBlock(Alice, meta, parentHash, blockHash, stateRoot, meta.minTier, ""); console2.log("mintTier is:", meta.minTier); // Try to contest proveBlock( @@ -430,19 +383,12 @@ contract TaikoL1LibProvingWithTiers is TaikoL1TestBase { giveEthAndTko(Alice, 1e7 ether, 1000 ether); giveEthAndTko(Carol, 1e7 ether, 1000 ether); console2.log("Alice balance:", tko.balanceOf(Alice)); - // This is a very weird test (code?) issue here. - // If this line is uncommented, - // Alice/Bob has no balance.. (Causing reverts !!!) - // Current investigations are ongoing with foundry team - giveEthAndTko(Bob, 1e6 ether, 100 ether); - console2.log("Bob balance:", tko.balanceOf(Bob)); - // Bob - vm.prank(Bob, Bob); bytes32 parentHash = GENESIS_BLOCK_HASH; for (uint256 blockId = 1; blockId < conf.blockMaxProposals * 3; blockId++) { printVariables("before propose"); - (TaikoData.BlockMetadata memory meta,) = proposeBlock(Alice, Bob, 1_000_000, 1024); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, 1024); + //printVariables("after propose"); mine(1); @@ -450,7 +396,7 @@ contract TaikoL1LibProvingWithTiers is TaikoL1TestBase { bytes32 stateRoot = bytes32(1e9 + blockId); // This proof cannot be verified obviously because of // blockhash:blockId - proveBlock(Bob, meta, parentHash, blockHash, stateRoot, meta.minTier, ""); + proveBlock(Alice, meta, parentHash, blockHash, stateRoot, meta.minTier, ""); // Try to contest - but should revert with L1_ALREADY_PROVED proveBlock( @@ -460,7 +406,7 @@ contract TaikoL1LibProvingWithTiers is TaikoL1TestBase { 0, stateRoot, LibTiers.TIER_GUARDIAN, - TaikoErrors.L1_INVALID_TRANSITION.selector + LibProving.L1_INVALID_TRANSITION.selector ); vm.roll(block.number + 15 * 12); @@ -476,37 +422,49 @@ contract TaikoL1LibProvingWithTiers is TaikoL1TestBase { } function test_L1_GuardianProverCanOverwriteIfNotSameProof() external { + uint64 syncInternal = L1.getConfig().stateRootSyncInternal; + console2.log("syncInternal:", syncInternal); + giveEthAndTko(Alice, 1e7 ether, 1000 ether); giveEthAndTko(Carol, 1e7 ether, 1000 ether); console2.log("Alice balance:", tko.balanceOf(Alice)); - // This is a very weird test (code?) issue here. - // If this line is uncommented, - // Alice/Bob has no balance.. (Causing reverts !!!) - // Current investigations are ongoing with foundry team - giveEthAndTko(Bob, 1e7 ether, 100 ether); - console2.log("Bob balance:", tko.balanceOf(Bob)); - // Bob - vm.prank(Bob, Bob); bytes32 parentHash = GENESIS_BLOCK_HASH; for (uint256 blockId = 1; blockId < conf.blockMaxProposals * 3; blockId++) { + bool isSyncBlock = LibUtils.isSyncBlock(syncInternal, blockId); + console2.log("blockId:", blockId); + console2.log("isSyncBlock:", isSyncBlock); + printVariables("before propose"); - (TaikoData.BlockMetadata memory meta,) = proposeBlock(Alice, Bob, 1_000_000, 1024); - //printVariables("after propose"); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, 1024); + mine(1); - bytes32 blockHash = bytes32(1e10 + blockId); - bytes32 stateRoot = bytes32(1e9 + blockId); - // This proof cannot be verified obviously because of - // blockhash:blockId - proveBlock(Bob, meta, parentHash, stateRoot, stateRoot, meta.minTier, ""); + bytes32 blockHash = bytes32(1_000_000 + blockId); + bytes32 stateRoot = bytes32(2_000_000 + blockId); + + proveBlock(Alice, meta, parentHash, blockHash, stateRoot, meta.minTier, ""); // Prove as guardian - proveBlock( - Carol, meta, parentHash, blockHash, bytes32(uint256(1)), LibTiers.TIER_GUARDIAN, "" - ); + blockHash = bytes32(1_000_000 + blockId + 100); + stateRoot = bytes32(2_000_000 + blockId + 100); + proveBlock(Carol, meta, parentHash, blockHash, stateRoot, LibTiers.TIER_GUARDIAN, ""); - // Prove as guardian again + // Re-prove as guardian + stateRoot = bytes32(2_000_000 + blockId + 200); + if (!isSyncBlock) { + // Changing stateRoot doesn't help + proveBlock( + Carol, + meta, + parentHash, + blockHash, + stateRoot, + LibTiers.TIER_GUARDIAN, + LibProving.L1_ALREADY_PROVED.selector + ); + } + blockHash = bytes32(1_000_000 + blockId + 200); proveBlock(Carol, meta, parentHash, blockHash, stateRoot, LibTiers.TIER_GUARDIAN, ""); vm.roll(block.number + 15 * 12); @@ -527,19 +485,12 @@ contract TaikoL1LibProvingWithTiers is TaikoL1TestBase { giveEthAndTko(Alice, 1e8 ether, 1000 ether); giveEthAndTko(Carol, 1e8 ether, 1000 ether); console2.log("Alice balance:", tko.balanceOf(Alice)); - // This is a very weird test (code?) issue here. - // If this line is uncommented, - // Alice/Bob has no balance.. (Causing reverts !!!) - // Current investigations are ongoing with foundry team - giveEthAndTko(Bob, 1e8 ether, 100 ether); - console2.log("Bob balance:", tko.balanceOf(Bob)); - // Bob - vm.prank(Bob, Bob); bytes32 parentHash = GENESIS_BLOCK_HASH; for (uint256 blockId = 1; blockId < 10; blockId++) { printVariables("before propose"); - (TaikoData.BlockMetadata memory meta,) = proposeBlock(Alice, Bob, 1_000_000, 1024); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, 1024); + //printVariables("after propose"); mine(1); @@ -554,7 +505,7 @@ contract TaikoL1LibProvingWithTiers is TaikoL1TestBase { blockHash, stateRoot, LibTiers.TIER_SGX, - TaikoErrors.L1_INVALID_BLOCK_ID.selector + LibUtils.L1_INVALID_BLOCK_ID.selector ); parentHash = blockHash; @@ -568,19 +519,15 @@ contract TaikoL1LibProvingWithTiers is TaikoL1TestBase { giveEthAndTko(Alice, 1e8 ether, 1000 ether); giveEthAndTko(Carol, 1e8 ether, 1000 ether); console2.log("Alice balance:", tko.balanceOf(Alice)); - // This is a very weird test (code?) issue here. - // If this line is uncommented, - // Alice/Bob has no balance.. (Causing reverts !!!) - // Current investigations are ongoing with foundry team - giveEthAndTko(Bob, 1e8 ether, 100 ether); + + giveEthAndTko(Bob, 1e6 ether, 100 ether); console2.log("Bob balance:", tko.balanceOf(Bob)); - // Bob - vm.prank(Bob, Bob); bytes32 parentHash = GENESIS_BLOCK_HASH; for (uint256 blockId = 1; blockId < 10; blockId++) { printVariables("before propose"); - (TaikoData.BlockMetadata memory meta,) = proposeBlock(Alice, Bob, 1_000_000, 1024); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, 1024); + //printVariables("after propose"); mine(1); @@ -588,7 +535,7 @@ contract TaikoL1LibProvingWithTiers is TaikoL1TestBase { bytes32 stateRoot = bytes32(1e9 + blockId); // Mess up metahash - meta.l1Height = 200; + meta.proposedIn = 200; proveBlock( Bob, meta, @@ -596,7 +543,7 @@ contract TaikoL1LibProvingWithTiers is TaikoL1TestBase { blockHash, stateRoot, LibTiers.TIER_SGX, - TaikoErrors.L1_BLOCK_MISMATCH.selector + LibProving.L1_BLOCK_MISMATCH.selector ); parentHash = blockHash; @@ -608,19 +555,12 @@ contract TaikoL1LibProvingWithTiers is TaikoL1TestBase { giveEthAndTko(Alice, 1e7 ether, 1000 ether); giveEthAndTko(Carol, 1e7 ether, 1000 ether); console2.log("Alice balance:", tko.balanceOf(Alice)); - // This is a very weird test (code?) issue here. - // If this line is uncommented, - // Alice/Bob has no balance.. (Causing reverts !!!) - // Current investigations are onsgoing with foundry team - giveEthAndTko(Bob, 1e7 ether, 100 ether); - console2.log("Bob balance:", tko.balanceOf(Bob)); - // Bob - vm.prank(Bob, Bob); bytes32 parentHash = GENESIS_BLOCK_HASH; for (uint256 blockId = 1; blockId < conf.blockMaxProposals * 3; blockId++) { printVariables("before propose"); - (TaikoData.BlockMetadata memory meta,) = proposeBlock(Alice, Bob, 1_000_000, 1024); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, 1024); + //printVariables("after propose"); mine(1); @@ -628,7 +568,7 @@ contract TaikoL1LibProvingWithTiers is TaikoL1TestBase { bytes32 stateRoot = bytes32(1e9 + blockId); // This proof cannot be verified obviously because of blockhash is // exchanged with stateRoot - proveBlock(Bob, meta, parentHash, stateRoot, stateRoot, meta.minTier, ""); + proveBlock(Alice, meta, parentHash, stateRoot, stateRoot, meta.minTier, ""); // Prove as guardian proveBlock(Carol, meta, parentHash, blockHash, stateRoot, LibTiers.TIER_GUARDIAN, ""); @@ -641,7 +581,7 @@ contract TaikoL1LibProvingWithTiers is TaikoL1TestBase { stateRoot, stateRoot, LibTiers.TIER_SGX, - TaikoErrors.L1_INVALID_TIER.selector + LibProving.L1_INVALID_TIER.selector ); vm.roll(block.number + 15 * 12); @@ -660,24 +600,17 @@ contract TaikoL1LibProvingWithTiers is TaikoL1TestBase { giveEthAndTko(Alice, 1e7 ether, 1000 ether); giveEthAndTko(Carol, 1e7 ether, 1000 ether); console2.log("Alice balance:", tko.balanceOf(Alice)); - // This is a very weird test (code?) issue here. - // If this line is uncommented, - // Alice/Bob has no balance.. (Causing reverts !!!) - // Current investigations are ongoing with foundry team - giveEthAndTko(Bob, 1e6 ether, 100 ether); - console2.log("Bob balance:", tko.balanceOf(Bob)); - // Bob - vm.prank(Bob, Bob); bytes32 parentHash = GENESIS_BLOCK_HASH; printVariables("before propose"); - (TaikoData.BlockMetadata memory meta,) = proposeBlock(Alice, Bob, 1_000_000, 1024); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, 1024); + //printVariables("after propose"); mine(1); bytes32 blockHash = bytes32(uint256(1)); bytes32 stateRoot = bytes32(uint256(1)); - proveBlock(Bob, meta, parentHash, blockHash, stateRoot, LibTiers.TIER_GUARDIAN, ""); + proveBlock(Alice, meta, parentHash, blockHash, stateRoot, LibTiers.TIER_GUARDIAN, ""); // Try to contest with a lower tier proof- but should revert with L1_INVALID_TIER proveBlock( @@ -687,7 +620,7 @@ contract TaikoL1LibProvingWithTiers is TaikoL1TestBase { blockHash, stateRoot, LibTiers.TIER_SGX, - TaikoErrors.L1_INVALID_TIER.selector + LibProving.L1_INVALID_TIER.selector ); printVariables(""); diff --git a/packages/protocol/test/L1/TaikoL1TestBase.sol b/packages/protocol/test/layer1/based/TaikoL1TestBase.sol similarity index 65% rename from packages/protocol/test/L1/TaikoL1TestBase.sol rename to packages/protocol/test/layer1/based/TaikoL1TestBase.sol index adf4cbed7e8..49c0d6e32df 100644 --- a/packages/protocol/test/L1/TaikoL1TestBase.sol +++ b/packages/protocol/test/layer1/based/TaikoL1TestBase.sol @@ -1,20 +1,20 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; -import "../TaikoTest.sol"; +import "../TaikoL1Test.sol"; abstract contract TaikoL1TestBase is TaikoTest { AddressManager public addressManager; - AssignmentHook public assignmentHook; TaikoToken public tko; SignalService public ss; TaikoL1 public L1; TaikoData.Config conf; uint256 internal logCount; - RiscZeroVerifier public rv; + Risc0Verifier public rv; + SP1Verifier public sp1; SgxVerifier public sv; GuardianProver public gp; - TestTierProvider public cp; + TestTierRouter public tr; Bridge public bridge; bytes32 public GENESIS_BLOCK_HASH = keccak256("GENESIS_BLOCK_HASH"); @@ -22,8 +22,8 @@ abstract contract TaikoL1TestBase is TaikoTest { address public L2SS = randAddress(); address public L2 = randAddress(); // Bootstrapped SGX instances (by owner) - address internal SGX_X_0 = vm.addr(0x4); - address internal SGX_X_1 = vm.addr(0x5); + address internal SGX_X_0 = vm.addr(0x1000004); + address internal SGX_X_1 = vm.addr(0x1000005); function deployTaikoL1() internal virtual returns (TaikoL1 taikoL1); @@ -75,7 +75,7 @@ abstract contract TaikoL1TestBase is TaikoTest { setupGuardianProverMultisig(); - cp = new TestTierProvider(); + tr = new TestTierRouter(); bridge = Bridge( payable( @@ -88,18 +88,10 @@ abstract contract TaikoL1TestBase is TaikoTest { ) ); - assignmentHook = AssignmentHook( - deployProxy({ - name: "assignment_hook", - impl: address(new AssignmentHook()), - data: abi.encodeCall(AssignmentHook.init, (address(0), address(addressManager))) - }) - ); - registerAddress("taiko", address(L1)); registerAddress("tier_sgx", address(sv)); registerAddress("tier_guardian", address(gp)); - registerAddress("tier_router", address(cp)); + registerAddress("tier_router", address(tr)); registerAddress("signal_service", address(ss)); registerL2Address("taiko", address(L2)); registerL2Address("signal_service", address(L2SS)); @@ -113,82 +105,29 @@ abstract contract TaikoL1TestBase is TaikoTest { registerTo: address(addressManager) }) ); + registerAddress("bond_token", address(tko)); L1.init(address(0), address(addressManager), GENESIS_BLOCK_HASH, false); + mine(1); - gp.enableTaikoTokenAllowance(true); + gp.enableBondAllowance(true); printVariables("init "); } function proposeBlock( address proposer, - address prover, - uint32 gasLimit, uint24 txListSize ) internal - returns (TaikoData.BlockMetadata memory meta, TaikoData.EthDeposit[] memory ethDeposits) + returns (TaikoData.BlockMetadataV2 memory) { - TaikoData.TierFee[] memory tierFees = new TaikoData.TierFee[](3); - // Register the tier fees - // Based on OPL2ConfigTier we need 3: - // - LibTiers.TIER_SGX; - // - LibTiers.TIER_OPTIMISTIC; - // - LibTiers.TIER_GUARDIAN; - tierFees[0] = TaikoData.TierFee(LibTiers.TIER_OPTIMISTIC, 1 ether); - tierFees[1] = TaikoData.TierFee(LibTiers.TIER_SGX, 1 ether); - tierFees[2] = TaikoData.TierFee(LibTiers.TIER_GUARDIAN, 0 ether); - // For the test not to fail, set the message.value to the highest, the - // rest will be returned - // anyways - uint256 msgValue = 2 ether; - - AssignmentHook.ProverAssignment memory assignment = AssignmentHook.ProverAssignment({ - feeToken: address(0), - tierFees: tierFees, - expiry: uint64(block.timestamp + 60 minutes), - maxBlockId: 0, - maxProposedIn: 0, - metaHash: 0, - parentMetaHash: 0, - signature: new bytes(0) - }); - - assignment.signature = _signAssignment( - prover, assignment, address(L1), proposer, keccak256(new bytes(txListSize)) - ); - - (, TaikoData.SlotB memory b) = L1.getStateVariables(); - - uint256 _difficulty; - unchecked { - _difficulty = block.prevrandao * b.numBlocks; - } - - // TODO: why init meta here? - meta.timestamp = uint64(block.timestamp); - meta.l1Height = uint64(block.number - 1); - meta.l1Hash = blockhash(block.number - 1); - meta.difficulty = bytes32(_difficulty); - meta.gasLimit = gasLimit; - - TaikoData.HookCall[] memory hookcalls; - if (prover != proposer) { - hookcalls = new TaikoData.HookCall[](1); - hookcalls[0] = TaikoData.HookCall(address(assignmentHook), abi.encode(assignment)); - } else { - hookcalls = new TaikoData.HookCall[](0); - } vm.prank(proposer, proposer); - (meta, ethDeposits) = L1.proposeBlock{ value: msgValue }( - abi.encode(TaikoData.BlockParams(prover, address(0), 0, 0, hookcalls, "")), - new bytes(txListSize) - ); + return L1.proposeBlockV2("", new bytes(txListSize)); } function proveBlock( address prover, - TaikoData.BlockMetadata memory meta, + TaikoData.BlockMetadataV2 memory meta, bytes32 parentHash, bytes32 blockHash, bytes32 stateRoot, @@ -231,18 +170,18 @@ abstract contract TaikoL1TestBase is TaikoTest { // Grant 2 signatures, 3rd might be a revert vm.prank(David, David); - gp.approve(meta, tran, proof); + gp.approveV2(meta, tran, proof); vm.prank(Emma, Emma); - gp.approve(meta, tran, proof); + gp.approveV2(meta, tran, proof); if (revertReason != "") { vm.prank(Frank, Frank); vm.expectRevert(); // Revert reason is 'wrapped' so will not be // identical to the expectedRevert - gp.approve(meta, tran, proof); + gp.approveV2(meta, tran, proof); } else { vm.prank(Frank, Frank); - gp.approve(meta, tran, proof); + gp.approveV2(meta, tran, proof); } } else { if (revertReason != "") { @@ -281,36 +220,6 @@ abstract contract TaikoL1TestBase is TaikoTest { console2.log(conf.chainId, string(abi.encodePacked(nameHash)), unicode"→", addr); } - function _signAssignment( - address prover, - AssignmentHook.ProverAssignment memory assignment, - address taikoAddr, - address blockProposer, - bytes32 blobHash - ) - internal - view - returns (bytes memory signature) - { - uint256 signerPrivateKey; - - // In the test suite these are the 3 which acts as provers - if (prover == Alice) { - signerPrivateKey = 0x1; - } else if (prover == Bob) { - signerPrivateKey = 0x2; - } else if (prover == Carol) { - signerPrivateKey = 0x3; - } else { - revert("unexpected"); - } - - bytes32 assignmentHash = - assignmentHook.hashAssignment(assignment, taikoAddr, blockProposer, prover, blobHash); - (uint8 v, bytes32 r, bytes32 s) = vm.sign(signerPrivateKey, assignmentHash); - signature = abi.encodePacked(r, s, v); - } - function createSgxSignatureProof( TaikoData.Transition memory tran, address newInstance, @@ -330,9 +239,9 @@ abstract contract TaikoL1TestBase is TaikoTest { // In the test suite these are the 3 which acts as provers if (SGX_X_0 == newInstance) { - signerPrivateKey = 0x5; + signerPrivateKey = 0x1000005; } else if (SGX_X_1 == newInstance) { - signerPrivateKey = 0x4; + signerPrivateKey = 0x1000004; } (uint8 v, bytes32 r, bytes32 s) = vm.sign(signerPrivateKey, digest); @@ -345,8 +254,6 @@ abstract contract TaikoL1TestBase is TaikoTest { vm.prank(to, to); tko.approve(address(L1), amountTko); - vm.prank(to, to); - tko.approve(address(assignmentHook), amountTko); console2.log("TKO balance:", to, tko.balanceOf(to)); console2.log("ETH balance:", to, to.balance); diff --git a/packages/protocol/test/L1/TaikoL1TestGroup1.t.sol b/packages/protocol/test/layer1/based/TaikoL1TestGroup1.t.sol similarity index 61% rename from packages/protocol/test/L1/TaikoL1TestGroup1.t.sol rename to packages/protocol/test/layer1/based/TaikoL1TestGroup1.t.sol index a9f8bd93f30..9226cc75074 100644 --- a/packages/protocol/test/L1/TaikoL1TestGroup1.t.sol +++ b/packages/protocol/test/layer1/based/TaikoL1TestGroup1.t.sol @@ -1,42 +1,44 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import "./TaikoL1TestGroupBase.sol"; contract TaikoL1TestGroup1 is TaikoL1TestGroupBase { // Test summary: - // 1. Alice proposes a block, assigning Bob as the prover. - // 2. Bob proves the block within the proving window, using the correct parent hash. - // 3. Bob's proof is used to verify the block. + // 1. Alice proposes a block + // 2. Alice proves the block within the proving window, using the correct parent hash. + // 3. Alice's proof is used to verify the block. function test_taikoL1_group_1_case_1() external { vm.warp(1_000_000); printBlockAndTrans(0); giveEthAndTko(Alice, 10_000 ether, 1000 ether); - giveEthAndTko(Bob, 10_000 ether, 1000 ether); giveEthAndTko(Taylor, 10_000 ether, 1000 ether); - ITierProvider.Tier memory tierOp = TestTierProvider(cp).getTier(LibTiers.TIER_OPTIMISTIC); + ITierProvider.Tier memory tierOp = ITierProvider(tr).getTier(LibTiers.TIER_OPTIMISTIC); - console2.log("====== Alice propose a block with bob as the assigned prover"); - TaikoData.BlockMetadata memory meta = proposeBlock(Alice, Bob, ""); + console2.log("====== Alice propose a block"); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, ""); uint96 livenessBond = L1.getConfig().livenessBond; uint256 proposedAt; { printBlockAndTrans(meta.id); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(meta.minTier, LibTiers.TIER_OPTIMISTIC); assertEq(blk.nextTransitionId, 1); assertEq(blk.verifiedTransitionId, 0); assertEq(blk.proposedAt, block.timestamp); - assertEq(blk.assignedProver, Bob); - assertEq(blk.livenessBond, livenessBond); + assertEq(meta.livenessBond, livenessBond); + assertEq(meta.proposer, Alice); + assertEq(meta.timestamp, block.timestamp); + assertEq(meta.anchorBlockId, block.number - 1); + assertEq(meta.proposedAt, block.timestamp); + assertEq(meta.proposedIn, block.number); proposedAt = blk.proposedAt; - assertEq(tko.balanceOf(Alice), 10_000 ether); - assertEq(tko.balanceOf(Bob), 10_000 ether - livenessBond); + assertEq(totalTkoBalance(tko, L1, Alice), 10_000 ether - livenessBond); } // Prove the block @@ -53,38 +55,35 @@ contract TaikoL1TestGroup1 is TaikoL1TestGroupBase { blockHash, stateRoot, meta.minTier, - TaikoErrors.L1_NOT_ASSIGNED_PROVER.selector + LibProving.L1_NOT_ASSIGNED_PROVER.selector ); - console2.log("====== Bob proves the block"); + console2.log("====== Alice proves the block"); mineAndWrap(10 seconds); - proveBlock(Bob, meta, parentHash, blockHash, stateRoot, meta.minTier, ""); + proveBlock(Alice, meta, parentHash, blockHash, stateRoot, meta.minTier, ""); uint256 provenAt; { printBlockAndTrans(meta.id); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(blk.nextTransitionId, 2); assertEq(blk.verifiedTransitionId, 0); assertEq(blk.proposedAt, proposedAt); - assertEq(blk.assignedProver, Bob); - assertEq(blk.livenessBond, 0); TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 1); assertEq(ts.blockHash, blockHash); assertEq(ts.stateRoot, stateRoot); assertEq(ts.tier, LibTiers.TIER_OPTIMISTIC); assertEq(ts.contester, address(0)); - assertEq(ts.contestBond, 1); // not zero - assertEq(ts.prover, Bob); + assertEq(ts.prover, Alice); assertEq(ts.validityBond, tierOp.validityBond); assertEq(ts.timestamp, block.timestamp); provenAt = ts.timestamp; - assertEq(tko.balanceOf(Bob), 10_000 ether - tierOp.validityBond); + assertEq(totalTkoBalance(tko, L1, Alice), 10_000 ether - tierOp.validityBond); } console2.log("====== Verify block"); @@ -93,29 +92,26 @@ contract TaikoL1TestGroup1 is TaikoL1TestGroupBase { { printBlockAndTrans(meta.id); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(blk.nextTransitionId, 2); assertEq(blk.verifiedTransitionId, 1); assertEq(blk.proposedAt, proposedAt); - assertEq(blk.assignedProver, Bob); - assertEq(blk.livenessBond, 0); TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 1); assertEq(ts.blockHash, blockHash); assertEq(ts.stateRoot, stateRoot); assertEq(ts.tier, LibTiers.TIER_OPTIMISTIC); assertEq(ts.contester, address(0)); - assertEq(ts.contestBond, 1); // not zero - assertEq(ts.prover, Bob); + assertEq(ts.prover, Alice); assertEq(ts.validityBond, tierOp.validityBond); assertEq(ts.timestamp, provenAt); - assertEq(tko.balanceOf(Bob), 10_000 ether); + assertEq(totalTkoBalance(tko, L1, Alice), 10_000 ether); } } // Test summary: - // 1. Alice proposes a block, assigning Bob as the prover. + // 1. Alice proposes a block, // 2. Taylor proposes the block outside the proving window. // 3. Taylor's proof is used to verify the block. function test_taikoL1_group_1_case_2() external { @@ -123,30 +119,32 @@ contract TaikoL1TestGroup1 is TaikoL1TestGroupBase { printBlockAndTrans(0); giveEthAndTko(Alice, 10_000 ether, 1000 ether); - giveEthAndTko(Bob, 10_000 ether, 1000 ether); giveEthAndTko(Taylor, 10_000 ether, 1000 ether); - ITierProvider.Tier memory tierOp = TestTierProvider(cp).getTier(LibTiers.TIER_OPTIMISTIC); + ITierProvider.Tier memory tierOp = ITierProvider(tr).getTier(LibTiers.TIER_OPTIMISTIC); - console2.log("====== Alice propose a block with bob as the assigned prover"); - TaikoData.BlockMetadata memory meta = proposeBlock(Alice, Bob, ""); + console2.log("====== Alice propose a block"); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, ""); uint96 livenessBond = L1.getConfig().livenessBond; uint256 proposedAt; { printBlockAndTrans(meta.id); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(meta.minTier, LibTiers.TIER_OPTIMISTIC); assertEq(blk.nextTransitionId, 1); assertEq(blk.verifiedTransitionId, 0); assertEq(blk.proposedAt, block.timestamp); - assertEq(blk.assignedProver, Bob); - assertEq(blk.livenessBond, livenessBond); + assertEq(meta.livenessBond, livenessBond); + assertEq(meta.proposer, Alice); + assertEq(meta.timestamp, block.timestamp); + assertEq(meta.anchorBlockId, block.number - 1); + assertEq(meta.proposedAt, block.timestamp); + assertEq(meta.proposedIn, block.number); proposedAt = blk.proposedAt; - assertEq(tko.balanceOf(Alice), 10_000 ether); - assertEq(tko.balanceOf(Bob), 10_000 ether - livenessBond); + assertEq(totalTkoBalance(tko, L1, Alice), 10_000 ether - livenessBond); } // Prove the block @@ -163,27 +161,26 @@ contract TaikoL1TestGroup1 is TaikoL1TestGroupBase { { printBlockAndTrans(meta.id); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(blk.nextTransitionId, 2); assertEq(blk.verifiedTransitionId, 0); assertEq(blk.proposedAt, proposedAt); - assertEq(blk.assignedProver, Bob); - assertEq(blk.livenessBond, 0); TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 1); assertEq(ts.blockHash, blockHash); assertEq(ts.stateRoot, stateRoot); assertEq(ts.tier, LibTiers.TIER_OPTIMISTIC); assertEq(ts.contester, address(0)); - assertEq(ts.contestBond, 1); // not zero assertEq(ts.prover, Taylor); assertEq(ts.validityBond, tierOp.validityBond); assertEq(ts.timestamp, block.timestamp); provenAt = ts.timestamp; - assertEq(tko.balanceOf(Bob), 10_000 ether - livenessBond); - assertEq(tko.balanceOf(Taylor), 10_000 ether - tierOp.validityBond); + assertEq( + totalTkoBalance(tko, L1, Taylor), + 10_000 ether - tierOp.validityBond + livenessBond * 7 / 8 + ); } console2.log("====== Verify block"); @@ -192,42 +189,39 @@ contract TaikoL1TestGroup1 is TaikoL1TestGroupBase { { printBlockAndTrans(meta.id); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(blk.nextTransitionId, 2); assertEq(blk.verifiedTransitionId, 1); assertEq(blk.proposedAt, proposedAt); - assertEq(blk.assignedProver, Bob); - assertEq(blk.livenessBond, 0); TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 1); assertEq(ts.blockHash, blockHash); assertEq(ts.stateRoot, stateRoot); assertEq(ts.tier, LibTiers.TIER_OPTIMISTIC); assertEq(ts.contester, address(0)); - assertEq(ts.contestBond, 1); // not zero assertEq(ts.prover, Taylor); assertEq(ts.validityBond, tierOp.validityBond); assertEq(ts.timestamp, provenAt); - assertEq(tko.balanceOf(Bob), 10_000 ether - livenessBond); - assertEq(tko.balanceOf(Taylor), 10_000 ether); + assertEq(totalTkoBalance(tko, L1, Alice), 10_000 ether - livenessBond); + assertEq(totalTkoBalance(tko, L1, Taylor), 10_000 ether + livenessBond * 7 / 8); } } // Test summary: - // 1. Alice proposes a block, assigning Bob as the prover. - // 2. Bob proves the block within the proving window. + // 1. Alice proposes a block, + // 2. Alice proves the block within the proving window. // 3. Taylor proves the block outside the proving window. // 4. Taylor's proof is used to verify the block. function test_taikoL1_group_1_case_3() external { vm.warp(1_000_000); giveEthAndTko(Alice, 10_000 ether, 1000 ether); - giveEthAndTko(Bob, 10_000 ether, 1000 ether); + giveEthAndTko(Taylor, 10_000 ether, 1000 ether); - ITierProvider.Tier memory tierOp = TestTierProvider(cp).getTier(LibTiers.TIER_OPTIMISTIC); + ITierProvider.Tier memory tierOp = ITierProvider(tr).getTier(LibTiers.TIER_OPTIMISTIC); - console2.log("====== Alice propose a block with bob as the assigned prover"); - TaikoData.BlockMetadata memory meta = proposeBlock(Alice, Bob, ""); + console2.log("====== Alice propose a block"); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, ""); // Prove the block bytes32 parentHash1 = bytes32(uint256(9)); @@ -237,8 +231,8 @@ contract TaikoL1TestGroup1 is TaikoL1TestGroupBase { mineAndWrap(10 seconds); - console2.log("====== Bob proves the block first"); - proveBlock(Bob, meta, parentHash1, blockHash, stateRoot, meta.minTier, ""); + console2.log("====== Alice proves the block first"); + proveBlock(Alice, meta, parentHash1, blockHash, stateRoot, meta.minTier, ""); console2.log("====== Taylor proves the block later"); mineAndWrap(10 seconds); @@ -250,37 +244,34 @@ contract TaikoL1TestGroup1 is TaikoL1TestGroupBase { { printBlockAndTrans(meta.id); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(blk.nextTransitionId, 3); assertEq(blk.verifiedTransitionId, 2); - assertEq(blk.assignedProver, Bob); - assertEq(blk.livenessBond, 0); TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 2); assertEq(ts.contester, address(0)); - assertEq(ts.contestBond, 1); // not zero assertEq(ts.prover, Taylor); assertEq(ts.validityBond, tierOp.validityBond); - assertEq(tko.balanceOf(Bob), 10_000 ether - tierOp.validityBond); - assertEq(tko.balanceOf(Taylor), 10_000 ether); + assertEq(totalTkoBalance(tko, L1, Alice), 10_000 ether - tierOp.validityBond); + assertEq(totalTkoBalance(tko, L1, Taylor), 10_000 ether); } } // Test summary: - // 1. Alice proposes a block, assigning Bob as the prover. - // 2. Bob proves the block within the proving window. + // 1. Alice proposes a block, + // 2. Alice proves the block within the proving window. // 3. Taylor proves the block outside the proving window. - // 4. Bob's proof is used to verify the block. + // 4. Alice's proof is used to verify the block. function test_taikoL1_group_1_case_4() external { vm.warp(1_000_000); giveEthAndTko(Alice, 10_000 ether, 1000 ether); - giveEthAndTko(Bob, 10_000 ether, 1000 ether); + giveEthAndTko(Taylor, 10_000 ether, 1000 ether); - ITierProvider.Tier memory tierOp = TestTierProvider(cp).getTier(LibTiers.TIER_OPTIMISTIC); + ITierProvider.Tier memory tierOp = ITierProvider(tr).getTier(LibTiers.TIER_OPTIMISTIC); - console2.log("====== Alice propose a block with bob as the assigned prover"); - TaikoData.BlockMetadata memory meta = proposeBlock(Alice, Bob, ""); + console2.log("====== Alice propose a block"); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, ""); // Prove the block bytes32 parentHash1 = GENESIS_BLOCK_HASH; @@ -290,8 +281,8 @@ contract TaikoL1TestGroup1 is TaikoL1TestGroupBase { mineAndWrap(10 seconds); - console2.log("====== Bob proves the block first"); - proveBlock(Bob, meta, parentHash1, blockHash, stateRoot, meta.minTier, ""); + console2.log("====== Alice proves the block first"); + proveBlock(Alice, meta, parentHash1, blockHash, stateRoot, meta.minTier, ""); console2.log("====== Taylor proves the block later"); mineAndWrap(10 seconds); @@ -303,38 +294,34 @@ contract TaikoL1TestGroup1 is TaikoL1TestGroupBase { { printBlockAndTrans(meta.id); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(blk.nextTransitionId, 3); assertEq(blk.verifiedTransitionId, 1); - assertEq(blk.assignedProver, Bob); - assertEq(blk.livenessBond, 0); TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 1); assertEq(ts.contester, address(0)); - assertEq(ts.contestBond, 1); // not zero - assertEq(ts.prover, Bob); + assertEq(ts.prover, Alice); assertEq(ts.validityBond, tierOp.validityBond); - assertEq(tko.balanceOf(Bob), 10_000 ether); - assertEq(tko.balanceOf(Taylor), 10_000 ether - tierOp.validityBond); + assertEq(totalTkoBalance(tko, L1, Taylor), 10_000 ether - tierOp.validityBond); } } // Test summary: - // 1. Alice proposes a block, assigning Bob as the prover. + // 1. Alice proposes a block, // 2. William proves the block outside the proving window. // 3. Taylor also proves the block outside the proving window. // 4. Taylor's proof is used to verify the block. function test_taikoL1_group_1_case_5() external { vm.warp(1_000_000); giveEthAndTko(Alice, 10_000 ether, 1000 ether); - giveEthAndTko(Bob, 10_000 ether, 1000 ether); + giveEthAndTko(Taylor, 10_000 ether, 1000 ether); giveEthAndTko(William, 10_000 ether, 1000 ether); - ITierProvider.Tier memory tierOp = TestTierProvider(cp).getTier(LibTiers.TIER_OPTIMISTIC); + ITierProvider.Tier memory tierOp = ITierProvider(tr).getTier(LibTiers.TIER_OPTIMISTIC); - console2.log("====== Alice propose a block with bob as the assigned prover"); - TaikoData.BlockMetadata memory meta = proposeBlock(Alice, Bob, ""); + console2.log("====== Alice propose a block"); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, ""); // Prove the block bytes32 parentHash1 = bytes32(uint256(9)); @@ -357,56 +344,54 @@ contract TaikoL1TestGroup1 is TaikoL1TestGroupBase { { printBlockAndTrans(meta.id); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(blk.nextTransitionId, 3); assertEq(blk.verifiedTransitionId, 2); - assertEq(blk.assignedProver, Bob); - assertEq(blk.livenessBond, 0); TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 2); assertEq(ts.contester, address(0)); - assertEq(ts.contestBond, 1); // not zero assertEq(ts.prover, Taylor); assertEq(ts.validityBond, tierOp.validityBond); - assertEq(tko.balanceOf(Bob), 10_000 ether - L1.getConfig().livenessBond); - assertEq(tko.balanceOf(Taylor), 10_000 ether); + assertEq(totalTkoBalance(tko, L1, Alice), 10_000 ether - L1.getConfig().livenessBond); } } - // Test summary: - // 1. Alice proposes a block, assigning Bob as the prover. - // 2. Bob proves the block outside the proving window, using the correct parent hash. - // 3. Bob's proof is used to verify the block. + // Test summary: + // 1. Alice proposes a block, + // 2. Alice proves the block outside the proving window, using the correct parent hash. + // 3. Alice's proof is used to verify the block. function test_taikoL1_group_1_case_6() external { vm.warp(1_000_000); printBlockAndTrans(0); giveEthAndTko(Alice, 10_000 ether, 1000 ether); - giveEthAndTko(Bob, 10_000 ether, 1000 ether); giveEthAndTko(Taylor, 10_000 ether, 1000 ether); - ITierProvider.Tier memory tierOp = TestTierProvider(cp).getTier(LibTiers.TIER_OPTIMISTIC); + ITierProvider.Tier memory tierOp = ITierProvider(tr).getTier(LibTiers.TIER_OPTIMISTIC); - console2.log("====== Alice propose a block with bob as the assigned prover"); - TaikoData.BlockMetadata memory meta = proposeBlock(Alice, Bob, ""); + console2.log("====== Alice propose a block"); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, ""); uint96 livenessBond = L1.getConfig().livenessBond; uint256 proposedAt; { printBlockAndTrans(meta.id); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(meta.minTier, LibTiers.TIER_OPTIMISTIC); assertEq(blk.nextTransitionId, 1); assertEq(blk.verifiedTransitionId, 0); assertEq(blk.proposedAt, block.timestamp); - assertEq(blk.assignedProver, Bob); - assertEq(blk.livenessBond, livenessBond); + assertEq(meta.livenessBond, livenessBond); + assertEq(meta.proposer, Alice); + assertEq(meta.timestamp, block.timestamp); + assertEq(meta.anchorBlockId, block.number - 1); + assertEq(meta.proposedAt, block.timestamp); + assertEq(meta.proposedIn, block.number); proposedAt = blk.proposedAt; - assertEq(tko.balanceOf(Alice), 10_000 ether); - assertEq(tko.balanceOf(Bob), 10_000 ether - livenessBond); + assertEq(totalTkoBalance(tko, L1, Alice), 10_000 ether - livenessBond); } // Prove the block @@ -414,35 +399,35 @@ contract TaikoL1TestGroup1 is TaikoL1TestGroupBase { bytes32 blockHash = bytes32(uint256(10)); bytes32 stateRoot = bytes32(uint256(11)); - console2.log("====== Bob proves the block outside the proving window"); + console2.log("====== Alice proves the block outside the proving window"); mineAndWrap(7 days); - proveBlock(Bob, meta, parentHash, blockHash, stateRoot, meta.minTier, ""); + proveBlock(Alice, meta, parentHash, blockHash, stateRoot, meta.minTier, ""); uint256 provenAt; { printBlockAndTrans(meta.id); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(blk.nextTransitionId, 2); assertEq(blk.verifiedTransitionId, 0); assertEq(blk.proposedAt, proposedAt); - assertEq(blk.assignedProver, Bob); - assertEq(blk.livenessBond, 0); TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 1); assertEq(ts.blockHash, blockHash); assertEq(ts.stateRoot, stateRoot); assertEq(ts.tier, LibTiers.TIER_OPTIMISTIC); assertEq(ts.contester, address(0)); - assertEq(ts.contestBond, 1); // not zero - assertEq(ts.prover, Bob); + assertEq(ts.prover, Alice); assertEq(ts.validityBond, tierOp.validityBond); assertEq(ts.timestamp, block.timestamp); provenAt = ts.timestamp; - assertEq(tko.balanceOf(Bob), 10_000 ether - tierOp.validityBond - livenessBond); + assertEq( + totalTkoBalance(tko, L1, Alice), + 10_000 ether - tierOp.validityBond - livenessBond / 8 + ); } console2.log("====== Verify block"); @@ -451,24 +436,21 @@ contract TaikoL1TestGroup1 is TaikoL1TestGroupBase { { printBlockAndTrans(meta.id); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(blk.nextTransitionId, 2); assertEq(blk.verifiedTransitionId, 1); assertEq(blk.proposedAt, proposedAt); - assertEq(blk.assignedProver, Bob); - assertEq(blk.livenessBond, 0); TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 1); assertEq(ts.blockHash, blockHash); assertEq(ts.stateRoot, stateRoot); assertEq(ts.tier, LibTiers.TIER_OPTIMISTIC); assertEq(ts.contester, address(0)); - assertEq(ts.contestBond, 1); // not zero - assertEq(ts.prover, Bob); + assertEq(ts.prover, Alice); assertEq(ts.validityBond, tierOp.validityBond); assertEq(ts.timestamp, provenAt); - assertEq(tko.balanceOf(Bob), 10_000 ether - livenessBond); + assertEq(totalTkoBalance(tko, L1, Alice), 10_000 ether - livenessBond / 8); } } @@ -481,24 +463,28 @@ contract TaikoL1TestGroup1 is TaikoL1TestGroupBase { giveEthAndTko(Alice, 10_000 ether, 1000 ether); console2.log("====== Alice propose a block with herself as the assigned prover"); - TaikoData.BlockMetadata memory meta = proposeBlock(Alice, Alice, ""); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, ""); uint96 livenessBond = L1.getConfig().livenessBond; uint256 proposedAt; { printBlockAndTrans(meta.id); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(meta.minTier, LibTiers.TIER_OPTIMISTIC); assertEq(blk.nextTransitionId, 1); assertEq(blk.verifiedTransitionId, 0); assertEq(blk.proposedAt, block.timestamp); - assertEq(blk.assignedProver, Alice); - assertEq(blk.livenessBond, livenessBond); + assertEq(meta.livenessBond, livenessBond); + assertEq(meta.proposer, Alice); + assertEq(meta.timestamp, block.timestamp); + assertEq(meta.anchorBlockId, block.number - 1); + assertEq(meta.proposedAt, block.timestamp); + assertEq(meta.proposedIn, block.number); proposedAt = blk.proposedAt; - assertEq(tko.balanceOf(Alice), 10_000 ether - livenessBond); + assertEq(totalTkoBalance(tko, L1, Alice), 10_000 ether - livenessBond); } } } diff --git a/packages/protocol/test/layer1/based/TaikoL1TestGroup10.t.sol b/packages/protocol/test/layer1/based/TaikoL1TestGroup10.t.sol new file mode 100644 index 00000000000..489daa1c10b --- /dev/null +++ b/packages/protocol/test/layer1/based/TaikoL1TestGroup10.t.sol @@ -0,0 +1,45 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "./TaikoL1TestGroupBase.sol"; + +contract TaikoL10TestGroup1 is TaikoL1TestGroupBase { + // Test summary: + // 1. Alice proposes 5 blocks, + // 2. Alice proves all 5 block within the proving window, using the correct parent hash. + // 3. Verify up to 10 blocks + function test_taikoL1_group_10_case_1() external { + vm.warp(1_000_000); + printBlockAndTrans(0); + + giveEthAndTko(Alice, 10_000 ether, 1000 ether); + + console2.log("====== Alice propose 5 block"); + bytes32 parentHash = GENESIS_BLOCK_HASH; + + for (uint256 i = 1; i <= 5; ++i) { + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, ""); + + // Prove the block + bytes32 blockHash = bytes32(uint256(10_000 + i)); + bytes32 stateRoot = bytes32(uint256(20_000 + i)); + + mineAndWrap(10 seconds); + proveBlock(Alice, meta, parentHash, blockHash, stateRoot, meta.minTier, ""); + + printBlockAndTrans(meta.id); + + parentHash = blockHash; + } + + console2.log("====== Verify up to 10 block"); + mineAndWrap(7 days); + verifyBlock(10); + { + (, TaikoData.SlotB memory b) = L1.getStateVariables(); + assertEq(b.lastVerifiedBlockId, 5); + + assertEq(totalTkoBalance(tko, L1, Alice), 10_000 ether); + } + } +} diff --git a/packages/protocol/test/layer1/based/TaikoL1TestGroup11.t.sol b/packages/protocol/test/layer1/based/TaikoL1TestGroup11.t.sol new file mode 100644 index 00000000000..6f5feb65b58 --- /dev/null +++ b/packages/protocol/test/layer1/based/TaikoL1TestGroup11.t.sol @@ -0,0 +1,69 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "./TaikoL1TestGroupBase.sol"; + +contract TaikoL10TestGroup11 is TaikoL1TestGroupBase { + // Test summary: + // 1. Zachary proposes a block with a custom proposer in the block parameters + // 2. The proposal will revert as Zachary is not registered as the preconf task manager. + function test_taikoL1_group_11_case_1() external { + vm.warp(1_000_000); + printBlockAndTrans(0); + + giveEthAndTko(Zachary, 10_000 ether, 1000 ether); + + ITierProvider(tr).getTier(LibTiers.TIER_OPTIMISTIC); + + console2.log("====== Zachary proposes a block"); + + TaikoData.BlockParamsV2 memory params; + params.proposer = Alice; + proposeBlock(Zachary, params, LibProposing.L1_INVALID_CUSTOM_PROPOSER.selector); + } + + // Test summary: + // 1. Zachary proposes a block with a Alice as the proposer + // 2. Alice proves the block + // 3. Alice verifies the block to get back her bonds. + function test_taikoL1_group_11_case_2() external { + registerAddress("preconf_task_manager", Zachary); + + vm.warp(1_000_000); + printBlockAndTrans(0); + + giveEthAndTko(Zachary, 10_000 ether, 1000 ether); + giveEthAndTko(Alice, 10_000 ether, 1000 ether); + + ITierProvider.Tier memory tierOp = ITierProvider(tr).getTier(LibTiers.TIER_OPTIMISTIC); + + console2.log("====== Zachary proposes a block with Alice as the proposer"); + + TaikoData.BlockParamsV2 memory params; + params.proposer = Alice; + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Zachary, params, ""); + + assertEq(totalTkoBalance(tko, L1, Zachary), 10_000 ether); + assertEq(totalTkoBalance(tko, L1, Alice), 10_000 ether - L1.getConfig().livenessBond); + + console2.log("====== Alice proves the block"); + // Prove the block + bytes32 blockHash = bytes32(uint256(10_000)); + bytes32 stateRoot = bytes32(uint256(20_000)); + + mineAndWrap(10 seconds); + proveBlock(Alice, meta, GENESIS_BLOCK_HASH, blockHash, stateRoot, meta.minTier, ""); + + assertEq(totalTkoBalance(tko, L1, Zachary), 10_000 ether); + assertEq(totalTkoBalance(tko, L1, Alice), 10_000 ether - tierOp.validityBond); + + printBlockAndTrans(meta.id); + + console2.log("====== Alice's block is verified"); + mineAndWrap(7 days); + verifyBlock(1); + + assertEq(totalTkoBalance(tko, L1, Zachary), 10_000 ether); + assertEq(totalTkoBalance(tko, L1, Alice), 10_000 ether); + } +} diff --git a/packages/protocol/test/L1/TaikoL1TestGroup2.t.sol b/packages/protocol/test/layer1/based/TaikoL1TestGroup2.t.sol similarity index 59% rename from packages/protocol/test/L1/TaikoL1TestGroup2.t.sol rename to packages/protocol/test/layer1/based/TaikoL1TestGroup2.t.sol index 94f8a2f166d..364c1f62717 100644 --- a/packages/protocol/test/L1/TaikoL1TestGroup2.t.sol +++ b/packages/protocol/test/layer1/based/TaikoL1TestGroup2.t.sol @@ -1,37 +1,37 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import "./TaikoL1TestGroupBase.sol"; contract TaikoL1TestGroup2 is TaikoL1TestGroupBase { // Test summary: - // 1. Alice proposes a block, Bob as the prover. - // 2. Bob proves the block within the proving window, with correct parent hash. - // 3. Taylor contests Bob's proof. - // 4. William proves Bob is correct and Taylor is wrong. + // 1. Alice proposes a block, Alice as the prover. + // 2. Alice proves the block within the proving window, with correct parent hash. + // 3. Taylor contests Alice's proof. + // 4. William proves Alice is correct and Taylor is wrong. // 5. William's proof is used to verify the block. function test_taikoL1_group_2_case_1() external { vm.warp(1_000_000); giveEthAndTko(Alice, 10_000 ether, 1000 ether); - giveEthAndTko(Bob, 10_000 ether, 1000 ether); + giveEthAndTko(Taylor, 10_000 ether, 1000 ether); giveEthAndTko(William, 10_000 ether, 1000 ether); - ITierProvider.Tier memory tierOp = TestTierProvider(cp).getTier(LibTiers.TIER_OPTIMISTIC); - ITierProvider.Tier memory tierSgx = TestTierProvider(cp).getTier(LibTiers.TIER_SGX); + ITierProvider.Tier memory tierOp = ITierProvider(tr).getTier(LibTiers.TIER_OPTIMISTIC); + ITierProvider.Tier memory tierSgx = ITierProvider(tr).getTier(LibTiers.TIER_SGX); - console2.log("====== Alice propose a block with bob as the assigned prover"); - TaikoData.BlockMetadata memory meta = proposeBlock(Alice, Bob, ""); + console2.log("====== Alice propose a block"); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, ""); - console2.log("====== Bob proves the block as the assigned prover"); + console2.log("====== Alice proves the block as the assigned prover"); bytes32 parentHash = GENESIS_BLOCK_HASH; bytes32 blockHash = bytes32(uint256(10)); bytes32 stateRoot = bytes32(uint256(11)); mineAndWrap(10 seconds); - proveBlock(Bob, meta, parentHash, blockHash, stateRoot, meta.minTier, ""); + proveBlock(Alice, meta, parentHash, blockHash, stateRoot, meta.minTier, ""); - console2.log("====== Taylor contests Bob"); + console2.log("====== Taylor contests Alice"); bytes32 blockHash2 = bytes32(uint256(20)); bytes32 stateRoot2 = bytes32(uint256(21)); mineAndWrap(10 seconds); @@ -40,11 +40,9 @@ contract TaikoL1TestGroup2 is TaikoL1TestGroupBase { { printBlockAndTrans(meta.id); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(blk.nextTransitionId, 2); assertEq(blk.verifiedTransitionId, 0); - assertEq(blk.assignedProver, Bob); - assertEq(blk.livenessBond, 0); TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 1); assertEq(ts.blockHash, blockHash); @@ -53,40 +51,37 @@ contract TaikoL1TestGroup2 is TaikoL1TestGroupBase { assertEq(ts.contester, Taylor); assertEq(ts.contestBond, tierOp.contestBond); assertEq(ts.validityBond, tierOp.validityBond); - assertEq(ts.prover, Bob); + assertEq(ts.prover, Alice); assertEq(ts.timestamp, block.timestamp); - assertEq(tko.balanceOf(Bob), 10_000 ether - tierOp.validityBond); - assertEq(tko.balanceOf(Taylor), 10_000 ether - tierOp.contestBond); + assertEq(totalTkoBalance(tko, L1, Alice), 10_000 ether - tierOp.validityBond); + assertEq(totalTkoBalance(tko, L1, Taylor), 10_000 ether - tierOp.contestBond); } - console2.log("====== William proves Bob is right"); + console2.log("====== William proves Alice is right"); mineAndWrap(10 seconds); proveBlock(William, meta, parentHash, blockHash, stateRoot, LibTiers.TIER_SGX, ""); { printBlockAndTrans(meta.id); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(blk.nextTransitionId, 2); assertEq(blk.verifiedTransitionId, 0); - assertEq(blk.assignedProver, Bob); - assertEq(blk.livenessBond, 0); TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 1); assertEq(ts.blockHash, blockHash); assertEq(ts.stateRoot, stateRoot); assertEq(ts.tier, LibTiers.TIER_SGX); assertEq(ts.contester, address(0)); - assertEq(ts.contestBond, 1); // not zero assertEq(ts.validityBond, tierSgx.validityBond); assertEq(ts.prover, William); assertEq(ts.timestamp, block.timestamp); // not zero - assertEq(tko.balanceOf(Bob), 10_000 ether); - assertEq(tko.balanceOf(Taylor), 10_000 ether - tierOp.contestBond); + assertEq(totalTkoBalance(tko, L1, Alice), 10_000 ether); + assertEq(totalTkoBalance(tko, L1, Taylor), 10_000 ether - tierOp.contestBond); assertEq( - tko.balanceOf(William), + totalTkoBalance(tko, L1, William), 10_000 ether - tierSgx.validityBond + tierOp.contestBond * 7 / 8 ); } @@ -97,52 +92,50 @@ contract TaikoL1TestGroup2 is TaikoL1TestGroupBase { { printBlockAndTrans(meta.id); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(blk.nextTransitionId, 2); assertEq(blk.verifiedTransitionId, 1); - assertEq(blk.assignedProver, Bob); // assertEq(blk.livenessBond, livenessBond); TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 1); assertEq(ts.blockHash, blockHash); assertEq(ts.stateRoot, stateRoot); assertEq(ts.tier, LibTiers.TIER_SGX); - assertEq(ts.contestBond, 1); assertEq(ts.prover, William); - assertEq(tko.balanceOf(William), 10_000 ether + tierOp.contestBond * 7 / 8); + assertEq(totalTkoBalance(tko, L1, William), 10_000 ether + tierOp.contestBond * 7 / 8); } } // Test summary: - // 1. Alice proposes a block, Bob as the prover. - // 2. Bob proves the block within the proving window, with correct parent hash. - // 3. Taylor contests Bob's proof. - // 4. William proves Taylor is correct and Bob is wrong. + // 1. Alice proposes a block, Alice as the prover. + // 2. Alice proves the block within the proving window, with correct parent hash. + // 3. Taylor contests Alice's proof. + // 4. William proves Taylor is correct and Alice is wrong. // 5. William's proof is used to verify the block. function test_taikoL1_group_2_case_2() external { vm.warp(1_000_000); giveEthAndTko(Alice, 10_000 ether, 1000 ether); - giveEthAndTko(Bob, 10_000 ether, 1000 ether); + giveEthAndTko(Taylor, 10_000 ether, 1000 ether); giveEthAndTko(William, 10_000 ether, 1000 ether); - ITierProvider.Tier memory tierOp = TestTierProvider(cp).getTier(LibTiers.TIER_OPTIMISTIC); - ITierProvider.Tier memory tierSgx = TestTierProvider(cp).getTier(LibTiers.TIER_SGX); + ITierProvider.Tier memory tierOp = ITierProvider(tr).getTier(LibTiers.TIER_OPTIMISTIC); + ITierProvider.Tier memory tierSgx = ITierProvider(tr).getTier(LibTiers.TIER_SGX); - console2.log("====== Alice propose a block with bob as the assigned prover"); - TaikoData.BlockMetadata memory meta = proposeBlock(Alice, Bob, ""); + console2.log("====== Alice propose a block"); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, ""); - console2.log("====== Bob proves the block as the assigned prover"); + console2.log("====== Alice proves the block as the assigned prover"); bytes32 parentHash = GENESIS_BLOCK_HASH; bytes32 blockHash = bytes32(uint256(10)); bytes32 stateRoot = bytes32(uint256(11)); mineAndWrap(10 seconds); - proveBlock(Bob, meta, parentHash, blockHash, stateRoot, meta.minTier, ""); + proveBlock(Alice, meta, parentHash, blockHash, stateRoot, meta.minTier, ""); - console2.log("====== Taylor contests Bob"); + console2.log("====== Taylor contests Alice"); bytes32 blockHash2 = bytes32(uint256(20)); bytes32 stateRoot2 = bytes32(uint256(21)); mineAndWrap(10 seconds); @@ -151,11 +144,9 @@ contract TaikoL1TestGroup2 is TaikoL1TestGroupBase { { printBlockAndTrans(meta.id); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(blk.nextTransitionId, 2); assertEq(blk.verifiedTransitionId, 0); - assertEq(blk.assignedProver, Bob); - assertEq(blk.livenessBond, 0); TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 1); assertEq(ts.blockHash, blockHash); @@ -164,11 +155,11 @@ contract TaikoL1TestGroup2 is TaikoL1TestGroupBase { assertEq(ts.contester, Taylor); assertEq(ts.contestBond, tierOp.contestBond); assertEq(ts.validityBond, tierOp.validityBond); - assertEq(ts.prover, Bob); + assertEq(ts.prover, Alice); assertEq(ts.timestamp, block.timestamp); - assertEq(tko.balanceOf(Bob), 10_000 ether - tierOp.validityBond); - assertEq(tko.balanceOf(Taylor), 10_000 ether - tierOp.contestBond); + assertEq(totalTkoBalance(tko, L1, Alice), 10_000 ether - tierOp.validityBond); + assertEq(totalTkoBalance(tko, L1, Taylor), 10_000 ether - tierOp.contestBond); } console2.log("====== William proves Tayler is right"); @@ -178,27 +169,27 @@ contract TaikoL1TestGroup2 is TaikoL1TestGroupBase { { printBlockAndTrans(meta.id); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(blk.nextTransitionId, 2); assertEq(blk.verifiedTransitionId, 0); - assertEq(blk.assignedProver, Bob); - assertEq(blk.livenessBond, 0); TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 1); assertEq(ts.blockHash, blockHash2); assertEq(ts.stateRoot, stateRoot2); assertEq(ts.tier, LibTiers.TIER_SGX); assertEq(ts.contester, address(0)); - assertEq(ts.contestBond, 1); // not zero assertEq(ts.validityBond, tierSgx.validityBond); assertEq(ts.prover, William); assertEq(ts.timestamp, block.timestamp); - assertEq(tko.balanceOf(Bob), 10_000 ether - tierOp.validityBond); + assertEq(totalTkoBalance(tko, L1, Alice), 10_000 ether - tierOp.validityBond); uint256 quarterReward = tierOp.validityBond * 7 / 8 / 4; - assertEq(tko.balanceOf(Taylor), 10_000 ether + quarterReward * 3); - assertEq(tko.balanceOf(William), 10_000 ether - tierSgx.validityBond + quarterReward); + assertEq(totalTkoBalance(tko, L1, Taylor), 10_000 ether + quarterReward * 3); + assertEq( + totalTkoBalance(tko, L1, William), + 10_000 ether - tierSgx.validityBond + quarterReward + ); } console2.log("====== Verify the block"); @@ -207,26 +198,24 @@ contract TaikoL1TestGroup2 is TaikoL1TestGroupBase { { printBlockAndTrans(meta.id); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(blk.nextTransitionId, 2); assertEq(blk.verifiedTransitionId, 1); - assertEq(blk.assignedProver, Bob); TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 1); assertEq(ts.blockHash, blockHash2); assertEq(ts.stateRoot, stateRoot2); assertEq(ts.tier, LibTiers.TIER_SGX); assertEq(ts.contester, address(0)); - assertEq(ts.contestBond, 1); // not zero assertEq(ts.validityBond, tierSgx.validityBond); assertEq(ts.prover, William); - assertEq(tko.balanceOf(Bob), 10_000 ether - tierOp.validityBond); + assertEq(totalTkoBalance(tko, L1, Alice), 10_000 ether - tierOp.validityBond); uint256 quarterReward = tierOp.validityBond * 7 / 8 / 4; - assertEq(tko.balanceOf(Taylor), 10_000 ether + quarterReward * 3); - assertEq(tko.balanceOf(William), 10_000 ether + quarterReward); + assertEq(totalTkoBalance(tko, L1, Taylor), 10_000 ether + quarterReward * 3); + assertEq(totalTkoBalance(tko, L1, William), 10_000 ether + quarterReward); } } } diff --git a/packages/protocol/test/L1/TaikoL1TestGroup3.t.sol b/packages/protocol/test/layer1/based/TaikoL1TestGroup3.t.sol similarity index 67% rename from packages/protocol/test/L1/TaikoL1TestGroup3.t.sol rename to packages/protocol/test/layer1/based/TaikoL1TestGroup3.t.sol index ee181cda4a0..0375309e8d0 100644 --- a/packages/protocol/test/L1/TaikoL1TestGroup3.t.sol +++ b/packages/protocol/test/layer1/based/TaikoL1TestGroup3.t.sol @@ -1,11 +1,11 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import "./TaikoL1TestGroupBase.sol"; contract TaikoL1TestGroup3 is TaikoL1TestGroupBase { // Test summary: - // 1. Alice proposes a block, assigning Bob as the prover. + // 1. Alice proposes a block, // 2. James proves the block outside the proving window, using the correct parent hash. // 3. Taylor contests James' proof. // 4. William proves James is correct and Taylor is wrong. @@ -14,15 +14,15 @@ contract TaikoL1TestGroup3 is TaikoL1TestGroupBase { vm.warp(1_000_000); giveEthAndTko(Alice, 10_000 ether, 1000 ether); - giveEthAndTko(Bob, 10_000 ether, 1000 ether); + giveEthAndTko(James, 10_000 ether, 1000 ether); giveEthAndTko(Taylor, 10_000 ether, 1000 ether); giveEthAndTko(William, 10_000 ether, 1000 ether); - ITierProvider.Tier memory tierOp = TestTierProvider(cp).getTier(LibTiers.TIER_OPTIMISTIC); - ITierProvider.Tier memory tierSgx = TestTierProvider(cp).getTier(LibTiers.TIER_SGX); + ITierProvider.Tier memory tierOp = ITierProvider(tr).getTier(LibTiers.TIER_OPTIMISTIC); + ITierProvider.Tier memory tierSgx = ITierProvider(tr).getTier(LibTiers.TIER_SGX); - console2.log("====== Alice propose a block with bob as the assigned prover"); - TaikoData.BlockMetadata memory meta = proposeBlock(Alice, Bob, ""); + console2.log("====== Alice propose a block"); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, ""); uint96 livenessBond = L1.getConfig().livenessBond; @@ -43,11 +43,9 @@ contract TaikoL1TestGroup3 is TaikoL1TestGroupBase { { printBlockAndTrans(meta.id); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(blk.nextTransitionId, 2); assertEq(blk.verifiedTransitionId, 0); - assertEq(blk.assignedProver, Bob); - assertEq(blk.livenessBond, 0); TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 1); assertEq(ts.blockHash, blockHash); @@ -59,9 +57,12 @@ contract TaikoL1TestGroup3 is TaikoL1TestGroupBase { assertEq(ts.prover, James); assertEq(ts.timestamp, block.timestamp); - assertEq(tko.balanceOf(Bob), 10_000 ether - livenessBond); - assertEq(tko.balanceOf(James), 10_000 ether - tierOp.validityBond); - assertEq(tko.balanceOf(Taylor), 10_000 ether - tierOp.contestBond); + assertEq(totalTkoBalance(tko, L1, Alice), 10_000 ether - livenessBond); + assertEq( + totalTkoBalance(tko, L1, James), + 10_000 ether - tierOp.validityBond + livenessBond * 7 / 8 + ); + assertEq(totalTkoBalance(tko, L1, Taylor), 10_000 ether - tierOp.contestBond); } console2.log("====== William proves James is right"); @@ -71,26 +72,23 @@ contract TaikoL1TestGroup3 is TaikoL1TestGroupBase { { printBlockAndTrans(meta.id); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(blk.nextTransitionId, 2); assertEq(blk.verifiedTransitionId, 0); - assertEq(blk.assignedProver, Bob); - assertEq(blk.livenessBond, 0); TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 1); assertEq(ts.blockHash, blockHash); assertEq(ts.stateRoot, stateRoot); assertEq(ts.tier, LibTiers.TIER_SGX); assertEq(ts.contester, address(0)); - assertEq(ts.contestBond, 1); // not zero assertEq(ts.validityBond, tierSgx.validityBond); assertEq(ts.prover, William); assertEq(ts.timestamp, block.timestamp); // not zero - assertEq(tko.balanceOf(Bob), 10_000 ether - livenessBond); - assertEq(tko.balanceOf(Taylor), 10_000 ether - tierOp.contestBond); + assertEq(totalTkoBalance(tko, L1, Alice), 10_000 ether - livenessBond); + assertEq(totalTkoBalance(tko, L1, Taylor), 10_000 ether - tierOp.contestBond); assertEq( - tko.balanceOf(William), + totalTkoBalance(tko, L1, William), 10_000 ether - tierSgx.validityBond + tierOp.contestBond * 7 / 8 ); } @@ -101,26 +99,24 @@ contract TaikoL1TestGroup3 is TaikoL1TestGroupBase { { printBlockAndTrans(meta.id); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(blk.nextTransitionId, 2); assertEq(blk.verifiedTransitionId, 1); - assertEq(blk.assignedProver, Bob); // assertEq(blk.livenessBond, livenessBond); TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 1); assertEq(ts.blockHash, blockHash); assertEq(ts.stateRoot, stateRoot); assertEq(ts.tier, LibTiers.TIER_SGX); - assertEq(ts.contestBond, 1); assertEq(ts.prover, William); - assertEq(tko.balanceOf(William), 10_000 ether + tierOp.contestBond * 7 / 8); + assertEq(totalTkoBalance(tko, L1, William), 10_000 ether + tierOp.contestBond * 7 / 8); } } // Test summary: - // 1. Alice proposes a block, Bob as the prover. + // 1. Alice proposes a block, Alice as the prover. // 2. James proves the block outside the proving window, with correct parent hash. // 3. Taylor contests James' proof. // 4. William proves Taylor is correct and James is wrong. @@ -129,15 +125,15 @@ contract TaikoL1TestGroup3 is TaikoL1TestGroupBase { vm.warp(1_000_000); giveEthAndTko(Alice, 10_000 ether, 1000 ether); - giveEthAndTko(Bob, 10_000 ether, 1000 ether); + giveEthAndTko(James, 10_000 ether, 1000 ether); giveEthAndTko(Taylor, 10_000 ether, 1000 ether); giveEthAndTko(William, 10_000 ether, 1000 ether); - ITierProvider.Tier memory tierOp = TestTierProvider(cp).getTier(LibTiers.TIER_OPTIMISTIC); - ITierProvider.Tier memory tierSgx = TestTierProvider(cp).getTier(LibTiers.TIER_SGX); + ITierProvider.Tier memory tierOp = ITierProvider(tr).getTier(LibTiers.TIER_OPTIMISTIC); + ITierProvider.Tier memory tierSgx = ITierProvider(tr).getTier(LibTiers.TIER_SGX); - console2.log("====== Alice propose a block with bob as the assigned prover"); - TaikoData.BlockMetadata memory meta = proposeBlock(Alice, Bob, ""); + console2.log("====== Alice propose a block"); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, ""); uint96 livenessBond = L1.getConfig().livenessBond; @@ -158,11 +154,9 @@ contract TaikoL1TestGroup3 is TaikoL1TestGroupBase { { printBlockAndTrans(meta.id); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(blk.nextTransitionId, 2); assertEq(blk.verifiedTransitionId, 0); - assertEq(blk.assignedProver, Bob); - assertEq(blk.livenessBond, 0); TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 1); assertEq(ts.blockHash, blockHash); @@ -174,9 +168,12 @@ contract TaikoL1TestGroup3 is TaikoL1TestGroupBase { assertEq(ts.prover, James); assertEq(ts.timestamp, block.timestamp); - assertEq(tko.balanceOf(Bob), 10_000 ether - livenessBond); - assertEq(tko.balanceOf(James), 10_000 ether - tierOp.validityBond); - assertEq(tko.balanceOf(Taylor), 10_000 ether - tierOp.contestBond); + assertEq(totalTkoBalance(tko, L1, Alice), 10_000 ether - livenessBond); + assertEq( + totalTkoBalance(tko, L1, James), + 10_000 ether - tierOp.validityBond + livenessBond * 7 / 8 + ); + assertEq(totalTkoBalance(tko, L1, Taylor), 10_000 ether - tierOp.contestBond); } console2.log("====== William proves Tayler is right"); @@ -186,28 +183,31 @@ contract TaikoL1TestGroup3 is TaikoL1TestGroupBase { { printBlockAndTrans(meta.id); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(blk.nextTransitionId, 2); assertEq(blk.verifiedTransitionId, 0); - assertEq(blk.assignedProver, Bob); - assertEq(blk.livenessBond, 0); TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 1); assertEq(ts.blockHash, blockHash2); assertEq(ts.stateRoot, stateRoot2); assertEq(ts.tier, LibTiers.TIER_SGX); assertEq(ts.contester, address(0)); - assertEq(ts.contestBond, 1); // not zero assertEq(ts.validityBond, tierSgx.validityBond); assertEq(ts.prover, William); assertEq(ts.timestamp, block.timestamp); - assertEq(tko.balanceOf(Bob), 10_000 ether - livenessBond); - assertEq(tko.balanceOf(James), 10_000 ether - tierOp.validityBond); + assertEq(totalTkoBalance(tko, L1, Alice), 10_000 ether - livenessBond); + assertEq( + totalTkoBalance(tko, L1, James), + 10_000 ether - tierOp.validityBond + livenessBond * 7 / 8 + ); uint256 quarterReward = tierOp.validityBond * 7 / 8 / 4; - assertEq(tko.balanceOf(Taylor), 10_000 ether + quarterReward * 3); - assertEq(tko.balanceOf(William), 10_000 ether - tierSgx.validityBond + quarterReward); + assertEq(totalTkoBalance(tko, L1, Taylor), 10_000 ether + quarterReward * 3); + assertEq( + totalTkoBalance(tko, L1, William), + 10_000 ether - tierSgx.validityBond + quarterReward + ); } console2.log("====== Verify the block"); @@ -216,27 +216,28 @@ contract TaikoL1TestGroup3 is TaikoL1TestGroupBase { { printBlockAndTrans(meta.id); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(blk.nextTransitionId, 2); assertEq(blk.verifiedTransitionId, 1); - assertEq(blk.assignedProver, Bob); TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 1); assertEq(ts.blockHash, blockHash2); assertEq(ts.stateRoot, stateRoot2); assertEq(ts.tier, LibTiers.TIER_SGX); assertEq(ts.contester, address(0)); - assertEq(ts.contestBond, 1); // not zero assertEq(ts.validityBond, tierSgx.validityBond); assertEq(ts.prover, William); - assertEq(tko.balanceOf(Bob), 10_000 ether - livenessBond); + assertEq(totalTkoBalance(tko, L1, Alice), 10_000 ether - livenessBond); uint256 quarterReward = tierOp.validityBond * 7 / 8 / 4; - assertEq(tko.balanceOf(James), 10_000 ether - tierOp.validityBond); - assertEq(tko.balanceOf(Taylor), 10_000 ether + quarterReward * 3); - assertEq(tko.balanceOf(William), 10_000 ether + quarterReward); + assertEq( + totalTkoBalance(tko, L1, James), + 10_000 ether - tierOp.validityBond + livenessBond * 7 / 8 + ); + assertEq(totalTkoBalance(tko, L1, Taylor), 10_000 ether + quarterReward * 3); + assertEq(totalTkoBalance(tko, L1, William), 10_000 ether + quarterReward); } } } diff --git a/packages/protocol/test/L1/TaikoL1TestGroup4.t.sol b/packages/protocol/test/layer1/based/TaikoL1TestGroup4.t.sol similarity index 64% rename from packages/protocol/test/L1/TaikoL1TestGroup4.t.sol rename to packages/protocol/test/layer1/based/TaikoL1TestGroup4.t.sol index 4c0cf35c3a4..5a748170b7a 100644 --- a/packages/protocol/test/L1/TaikoL1TestGroup4.t.sol +++ b/packages/protocol/test/layer1/based/TaikoL1TestGroup4.t.sol @@ -1,36 +1,36 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import "./TaikoL1TestGroupBase.sol"; contract TaikoL1TestGroup4 is TaikoL1TestGroupBase { // Test summary: - // 1. Alice proposes a block, Bob is the prover. - // 2. Bob proves the block within the proving window, using the correct parent hash. - // 3. Taylor contests then proves Bob is wrong in the same transaction with a higher-tier + // 1. Alice proposes a block, Alice is the prover. + // 2. Alice proves the block within the proving window, using the correct parent hash. + // 3. Taylor contests then proves Alice is wrong in the same transaction with a higher-tier // proof. // 4. Taylor's proof is used to verify the block. function test_taikoL1_group_4_case_1() external { vm.warp(1_000_000); giveEthAndTko(Alice, 10_000 ether, 1000 ether); - giveEthAndTko(Bob, 10_000 ether, 1000 ether); + giveEthAndTko(Taylor, 10_000 ether, 1000 ether); - ITierProvider.Tier memory tierOp = TestTierProvider(cp).getTier(LibTiers.TIER_OPTIMISTIC); - ITierProvider.Tier memory tierSgx = TestTierProvider(cp).getTier(LibTiers.TIER_SGX); + ITierProvider.Tier memory tierOp = ITierProvider(tr).getTier(LibTiers.TIER_OPTIMISTIC); + ITierProvider.Tier memory tierSgx = ITierProvider(tr).getTier(LibTiers.TIER_SGX); - console2.log("====== Alice propose a block with bob as the assigned prover"); - TaikoData.BlockMetadata memory meta = proposeBlock(Alice, Bob, ""); + console2.log("====== Alice propose a block"); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, ""); - console2.log("====== Bob proves the block as the assigned prover"); + console2.log("====== Alice proves the block as the assigned prover"); bytes32 parentHash = GENESIS_BLOCK_HASH; bytes32 blockHash = bytes32(uint256(10)); bytes32 stateRoot = bytes32(uint256(11)); mineAndWrap(10 seconds); - proveBlock(Bob, meta, parentHash, blockHash, stateRoot, meta.minTier, ""); + proveBlock(Alice, meta, parentHash, blockHash, stateRoot, meta.minTier, ""); - console2.log("====== Taylor contests Bob with a higher tier proof"); + console2.log("====== Taylor contests Alice with a higher tier proof"); bytes32 blockHash2 = bytes32(uint256(20)); bytes32 stateRoot2 = bytes32(uint256(21)); mineAndWrap(10 seconds); @@ -39,23 +39,20 @@ contract TaikoL1TestGroup4 is TaikoL1TestGroupBase { { printBlockAndTrans(meta.id); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(blk.nextTransitionId, 2); assertEq(blk.verifiedTransitionId, 0); - assertEq(blk.assignedProver, Bob); - assertEq(blk.livenessBond, 0); TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 1); assertEq(ts.blockHash, blockHash2); assertEq(ts.stateRoot, stateRoot2); assertEq(ts.tier, LibTiers.TIER_SGX); assertEq(ts.contester, address(0)); - assertEq(ts.contestBond, 1); assertEq(ts.validityBond, tierSgx.validityBond); assertEq(ts.prover, Taylor); assertEq(ts.timestamp, block.timestamp); - assertEq(tko.balanceOf(Bob), 10_000 ether - tierOp.validityBond); + assertEq(totalTkoBalance(tko, L1, Alice), 10_000 ether - tierOp.validityBond); assertEq( tko.balanceOf(Taylor), 10_000 ether - tierSgx.validityBond + tierOp.validityBond * 7 / 8 @@ -68,26 +65,24 @@ contract TaikoL1TestGroup4 is TaikoL1TestGroupBase { { printBlockAndTrans(meta.id); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(blk.nextTransitionId, 2); assertEq(blk.verifiedTransitionId, 1); - assertEq(blk.assignedProver, Bob); // assertEq(blk.livenessBond, livenessBond); TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 1); assertEq(ts.blockHash, blockHash2); assertEq(ts.stateRoot, stateRoot2); assertEq(ts.tier, LibTiers.TIER_SGX); - assertEq(ts.contestBond, 1); assertEq(ts.prover, Taylor); - assertEq(tko.balanceOf(Taylor), 10_000 ether + tierOp.validityBond * 7 / 8); + assertEq(totalTkoBalance(tko, L1, Taylor), 10_000 ether + tierOp.validityBond * 7 / 8); } } // Test summary: - // 1. Alice proposes a block, assigning Bob as the prover. + // 1. Alice proposes a block, // 2. David proves the block outside the proving window, using the correct parent hash. // 3. Taylor contests then proves David is wrong in the same transaction with a higher-tier // proof. @@ -96,18 +91,18 @@ contract TaikoL1TestGroup4 is TaikoL1TestGroupBase { vm.warp(1_000_000); giveEthAndTko(Alice, 10_000 ether, 1000 ether); - giveEthAndTko(Bob, 10_000 ether, 1000 ether); + giveEthAndTko(David, 10_000 ether, 1000 ether); giveEthAndTko(Taylor, 10_000 ether, 1000 ether); - ITierProvider.Tier memory tierOp = TestTierProvider(cp).getTier(LibTiers.TIER_OPTIMISTIC); - ITierProvider.Tier memory tierSgx = TestTierProvider(cp).getTier(LibTiers.TIER_SGX); + ITierProvider.Tier memory tierOp = ITierProvider(tr).getTier(LibTiers.TIER_OPTIMISTIC); + ITierProvider.Tier memory tierSgx = ITierProvider(tr).getTier(LibTiers.TIER_SGX); - console2.log("====== Alice propose a block with bob as the assigned prover"); - TaikoData.BlockMetadata memory meta = proposeBlock(Alice, Bob, ""); + console2.log("====== Alice propose a block"); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, ""); uint96 livenessBond = L1.getConfig().livenessBond; - console2.log("====== Bob proves the block as the assigned prover"); + console2.log("====== Alice proves the block as the assigned prover"); bytes32 parentHash = GENESIS_BLOCK_HASH; bytes32 blockHash = bytes32(uint256(10)); bytes32 stateRoot = bytes32(uint256(11)); @@ -124,24 +119,23 @@ contract TaikoL1TestGroup4 is TaikoL1TestGroupBase { { printBlockAndTrans(meta.id); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(blk.nextTransitionId, 2); assertEq(blk.verifiedTransitionId, 0); - assertEq(blk.assignedProver, Bob); - assertEq(blk.livenessBond, 0); TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 1); assertEq(ts.blockHash, blockHash2); assertEq(ts.stateRoot, stateRoot2); assertEq(ts.tier, LibTiers.TIER_SGX); assertEq(ts.contester, address(0)); - assertEq(ts.contestBond, 1); assertEq(ts.validityBond, tierSgx.validityBond); assertEq(ts.prover, Taylor); assertEq(ts.timestamp, block.timestamp); - assertEq(tko.balanceOf(Bob), 10_000 ether - livenessBond); - assertEq(tko.balanceOf(David), 10_000 ether - tierOp.validityBond); + assertEq(totalTkoBalance(tko, L1, Alice), 10_000 ether - livenessBond); + assertEq( + tko.balanceOf(David), 10_000 ether - tierOp.validityBond + livenessBond * 7 / 8 + ); assertEq( tko.balanceOf(Taylor), 10_000 ether - tierSgx.validityBond + tierOp.validityBond * 7 / 8 @@ -154,21 +148,18 @@ contract TaikoL1TestGroup4 is TaikoL1TestGroupBase { { printBlockAndTrans(meta.id); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(blk.nextTransitionId, 2); assertEq(blk.verifiedTransitionId, 1); - assertEq(blk.assignedProver, Bob); - assertEq(blk.livenessBond, 0); TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 1); assertEq(ts.blockHash, blockHash2); assertEq(ts.stateRoot, stateRoot2); assertEq(ts.tier, LibTiers.TIER_SGX); - assertEq(ts.contestBond, 1); assertEq(ts.prover, Taylor); - assertEq(tko.balanceOf(Taylor), 10_000 ether + tierOp.validityBond * 7 / 8); + assertEq(totalTkoBalance(tko, L1, Taylor), 10_000 ether + tierOp.validityBond * 7 / 8); } } } diff --git a/packages/protocol/test/L1/TaikoL1TestGroup5.t.sol b/packages/protocol/test/layer1/based/TaikoL1TestGroup5.t.sol similarity index 68% rename from packages/protocol/test/L1/TaikoL1TestGroup5.t.sol rename to packages/protocol/test/layer1/based/TaikoL1TestGroup5.t.sol index 7e263b24caf..9b59addfd55 100644 --- a/packages/protocol/test/L1/TaikoL1TestGroup5.t.sol +++ b/packages/protocol/test/layer1/based/TaikoL1TestGroup5.t.sol @@ -1,11 +1,11 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import "./TaikoL1TestGroupBase.sol"; contract TaikoL1TestGroup5 is TaikoL1TestGroupBase { // Test summary: - // 1. Alice proposes a block, assigning Bob as the prover. + // 1. Alice proposes a block, // 2. Guardian prover directly proves the block. // 3. Guardian prover re-proves the same transition and fails. // 4. Guardian prover proves the block again with a different transition. @@ -14,11 +14,11 @@ contract TaikoL1TestGroup5 is TaikoL1TestGroupBase { vm.warp(1_000_000); giveEthAndTko(Alice, 10_000 ether, 1000 ether); - giveEthAndTko(Bob, 10_000 ether, 1000 ether); + giveEthAndTko(William, 10_000 ether, 1000 ether); - console2.log("====== Alice propose a block with bob as the assigned prover"); - TaikoData.BlockMetadata memory meta = proposeBlock(Alice, Bob, ""); + console2.log("====== Alice propose a block"); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, ""); console2.log("====== Guardian prover proves"); bytes32 parentHash = GENESIS_BLOCK_HASH; @@ -31,24 +31,21 @@ contract TaikoL1TestGroup5 is TaikoL1TestGroupBase { { printBlockAndTrans(meta.id); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(blk.nextTransitionId, 2); assertEq(blk.verifiedTransitionId, 0); - assertEq(blk.assignedProver, Bob); - assertEq(blk.livenessBond, 0); TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 1); assertEq(ts.blockHash, blockHash); assertEq(ts.stateRoot, stateRoot); assertEq(ts.tier, LibTiers.TIER_GUARDIAN); assertEq(ts.contester, address(0)); - assertEq(ts.contestBond, 1); assertEq(ts.validityBond, 0); assertEq(ts.prover, address(gp)); assertEq(ts.timestamp, block.timestamp); - assertEq(tko.balanceOf(Bob), 10_000 ether); - assertEq(tko.balanceOf(William), 10_000 ether); + assertEq(totalTkoBalance(tko, L1, Alice), 10_000 ether); + assertEq(totalTkoBalance(tko, L1, William), 10_000 ether); } console2.log("====== Guardian re-approve with the same transition"); @@ -60,7 +57,7 @@ contract TaikoL1TestGroup5 is TaikoL1TestGroupBase { blockHash, stateRoot, LibTiers.TIER_GUARDIAN, - TaikoErrors.L1_ALREADY_PROVED.selector + LibProving.L1_ALREADY_PROVED.selector ); console2.log("====== Guardian re-approve with a different transition"); @@ -72,24 +69,21 @@ contract TaikoL1TestGroup5 is TaikoL1TestGroupBase { { printBlockAndTrans(meta.id); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(blk.nextTransitionId, 2); assertEq(blk.verifiedTransitionId, 0); - assertEq(blk.assignedProver, Bob); - assertEq(blk.livenessBond, 0); TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 1); assertEq(ts.blockHash, blockHash2); assertEq(ts.stateRoot, stateRoot2); assertEq(ts.tier, LibTiers.TIER_GUARDIAN); assertEq(ts.contester, address(0)); - assertEq(ts.contestBond, 1); assertEq(ts.validityBond, 0); assertEq(ts.prover, address(gp)); assertEq(ts.timestamp, block.timestamp); - assertEq(tko.balanceOf(Bob), 10_000 ether); - assertEq(tko.balanceOf(William), 10_000 ether); + assertEq(totalTkoBalance(tko, L1, Alice), 10_000 ether); + assertEq(totalTkoBalance(tko, L1, William), 10_000 ether); } console2.log("====== William contests with a lower tier proof"); @@ -101,7 +95,7 @@ contract TaikoL1TestGroup5 is TaikoL1TestGroupBase { blockHash, stateRoot, LibTiers.TIER_SGX, - TaikoErrors.L1_INVALID_TIER.selector + LibProving.L1_INVALID_TIER.selector ); console2.log("====== Verify the block"); @@ -110,28 +104,25 @@ contract TaikoL1TestGroup5 is TaikoL1TestGroupBase { { printBlockAndTrans(meta.id); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(blk.nextTransitionId, 2); assertEq(blk.verifiedTransitionId, 1); - assertEq(blk.assignedProver, Bob); - assertEq(blk.livenessBond, 0); TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 1); assertEq(ts.blockHash, blockHash2); assertEq(ts.stateRoot, stateRoot2); assertEq(ts.tier, LibTiers.TIER_GUARDIAN); - assertEq(ts.contestBond, 1); assertEq(ts.prover, address(gp)); - assertEq(tko.balanceOf(Bob), 10_000 ether); - assertEq(tko.balanceOf(William), 10_000 ether); + assertEq(totalTkoBalance(tko, L1, Alice), 10_000 ether); + assertEq(totalTkoBalance(tko, L1, William), 10_000 ether); } } // Test summary: - // 1. Alice proposes a block, Bob is the prover. - // 2. Bob proves the block. + // 1. Alice proposes a block, Alice is the prover. + // 2. Alice proves the block. // 3. Guardian prover re-proves the same transition and fails. // 4. Guardian prover proves the block with a different transition. // 5. William contests the guardian prover using a lower-tier proof and fails. @@ -139,20 +130,20 @@ contract TaikoL1TestGroup5 is TaikoL1TestGroupBase { vm.warp(1_000_000); giveEthAndTko(Alice, 10_000 ether, 1000 ether); - giveEthAndTko(Bob, 10_000 ether, 1000 ether); + giveEthAndTko(William, 10_000 ether, 1000 ether); - ITierProvider.Tier memory tierOp = TestTierProvider(cp).getTier(LibTiers.TIER_OPTIMISTIC); + ITierProvider.Tier memory tierOp = ITierProvider(tr).getTier(LibTiers.TIER_OPTIMISTIC); - console2.log("====== Alice propose a block with bob as the assigned prover"); - TaikoData.BlockMetadata memory meta = proposeBlock(Alice, Bob, ""); + console2.log("====== Alice propose a block"); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, ""); - console2.log("====== Bob proves the block"); + console2.log("====== Alice proves the block"); bytes32 parentHash = GENESIS_BLOCK_HASH; bytes32 blockHash = bytes32(uint256(10)); bytes32 stateRoot = bytes32(uint256(11)); mineAndWrap(10 seconds); - proveBlock(Bob, meta, parentHash, blockHash, stateRoot, meta.minTier, ""); + proveBlock(Alice, meta, parentHash, blockHash, stateRoot, meta.minTier, ""); console2.log("====== Guardian re-approve with the same transition"); mineAndWrap(10 seconds); @@ -163,7 +154,7 @@ contract TaikoL1TestGroup5 is TaikoL1TestGroupBase { blockHash, stateRoot, LibTiers.TIER_GUARDIAN, - TaikoErrors.L1_ALREADY_PROVED.selector + LibProving.L1_ALREADY_PROVED.selector ); console2.log("====== Guardian re-approve with a different transition"); @@ -175,24 +166,21 @@ contract TaikoL1TestGroup5 is TaikoL1TestGroupBase { { printBlockAndTrans(meta.id); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(blk.nextTransitionId, 2); assertEq(blk.verifiedTransitionId, 0); - assertEq(blk.assignedProver, Bob); - assertEq(blk.livenessBond, 0); TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 1); assertEq(ts.blockHash, blockHash2); assertEq(ts.stateRoot, stateRoot2); assertEq(ts.tier, LibTiers.TIER_GUARDIAN); assertEq(ts.contester, address(0)); - assertEq(ts.contestBond, 1); assertEq(ts.validityBond, 0); assertEq(ts.prover, address(gp)); assertEq(ts.timestamp, block.timestamp); - assertEq(tko.balanceOf(Bob), 10_000 ether - tierOp.validityBond); - assertEq(tko.balanceOf(William), 10_000 ether); + assertEq(totalTkoBalance(tko, L1, Alice), 10_000 ether - tierOp.validityBond); + assertEq(totalTkoBalance(tko, L1, William), 10_000 ether); } console2.log("====== Verify the block"); @@ -201,27 +189,24 @@ contract TaikoL1TestGroup5 is TaikoL1TestGroupBase { { printBlockAndTrans(meta.id); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(blk.nextTransitionId, 2); assertEq(blk.verifiedTransitionId, 1); - assertEq(blk.assignedProver, Bob); - assertEq(blk.livenessBond, 0); TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 1); assertEq(ts.blockHash, blockHash2); assertEq(ts.stateRoot, stateRoot2); assertEq(ts.tier, LibTiers.TIER_GUARDIAN); - assertEq(ts.contestBond, 1); assertEq(ts.prover, address(gp)); - assertEq(tko.balanceOf(Bob), 10_000 ether - tierOp.validityBond); - assertEq(tko.balanceOf(William), 10_000 ether); + assertEq(totalTkoBalance(tko, L1, Alice), 10_000 ether - tierOp.validityBond); + assertEq(totalTkoBalance(tko, L1, William), 10_000 ether); } } // Test summary: - // 1. Alice proposes a block, assigning Bob as the prover. + // 1. Alice proposes a block, // 2. David proves the block outside the proving window. // 3. Guardian prover re-proves the same transition and fails. // 4. Guardian prover proves the block with a different transition. @@ -230,13 +215,13 @@ contract TaikoL1TestGroup5 is TaikoL1TestGroupBase { vm.warp(1_000_000); giveEthAndTko(Alice, 10_000 ether, 1000 ether); - giveEthAndTko(Bob, 10_000 ether, 1000 ether); + giveEthAndTko(David, 10_000 ether, 1000 ether); giveEthAndTko(William, 10_000 ether, 1000 ether); - ITierProvider.Tier memory tierOp = TestTierProvider(cp).getTier(LibTiers.TIER_OPTIMISTIC); + ITierProvider.Tier memory tierOp = ITierProvider(tr).getTier(LibTiers.TIER_OPTIMISTIC); - console2.log("====== Alice propose a block with bob as the assigned prover"); - TaikoData.BlockMetadata memory meta = proposeBlock(Alice, Bob, ""); + console2.log("====== Alice propose a block"); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, ""); uint96 livenessBond = L1.getConfig().livenessBond; @@ -257,7 +242,7 @@ contract TaikoL1TestGroup5 is TaikoL1TestGroupBase { blockHash, stateRoot, LibTiers.TIER_GUARDIAN, - TaikoErrors.L1_ALREADY_PROVED.selector + LibProving.L1_ALREADY_PROVED.selector ); console2.log("====== Guardian re-approve with a different transition"); @@ -269,25 +254,24 @@ contract TaikoL1TestGroup5 is TaikoL1TestGroupBase { { printBlockAndTrans(meta.id); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(blk.nextTransitionId, 2); assertEq(blk.verifiedTransitionId, 0); - assertEq(blk.assignedProver, Bob); - assertEq(blk.livenessBond, 0); TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 1); assertEq(ts.blockHash, blockHash2); assertEq(ts.stateRoot, stateRoot2); assertEq(ts.tier, LibTiers.TIER_GUARDIAN); assertEq(ts.contester, address(0)); - assertEq(ts.contestBond, 1); assertEq(ts.validityBond, 0); assertEq(ts.prover, address(gp)); assertEq(ts.timestamp, block.timestamp); - assertEq(tko.balanceOf(Bob), 10_000 ether - livenessBond); - assertEq(tko.balanceOf(David), 10_000 ether - tierOp.validityBond); - assertEq(tko.balanceOf(William), 10_000 ether); + assertEq(totalTkoBalance(tko, L1, Alice), 10_000 ether - livenessBond); + assertEq( + tko.balanceOf(David), 10_000 ether - tierOp.validityBond + livenessBond * 7 / 8 + ); + assertEq(totalTkoBalance(tko, L1, William), 10_000 ether); } console2.log("====== Verify the block"); @@ -296,38 +280,37 @@ contract TaikoL1TestGroup5 is TaikoL1TestGroupBase { { printBlockAndTrans(meta.id); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(blk.nextTransitionId, 2); assertEq(blk.verifiedTransitionId, 1); - assertEq(blk.assignedProver, Bob); - assertEq(blk.livenessBond, 0); TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 1); assertEq(ts.blockHash, blockHash2); assertEq(ts.stateRoot, stateRoot2); assertEq(ts.tier, LibTiers.TIER_GUARDIAN); - assertEq(ts.contestBond, 1); assertEq(ts.prover, address(gp)); - assertEq(tko.balanceOf(Bob), 10_000 ether - livenessBond); - assertEq(tko.balanceOf(David), 10_000 ether - tierOp.validityBond); - assertEq(tko.balanceOf(William), 10_000 ether); + assertEq(totalTkoBalance(tko, L1, Alice), 10_000 ether - livenessBond); + assertEq( + tko.balanceOf(David), 10_000 ether - tierOp.validityBond + livenessBond * 7 / 8 + ); + assertEq(totalTkoBalance(tko, L1, William), 10_000 ether); } } // Test summary: - // 1. Alice proposes a block, assigning Bob as the prover. + // 1. Alice proposes a block, // 2. Guardian prover directly proves the block out of proving window function test_taikoL1_group_5_case_4() external { vm.warp(1_000_000); giveEthAndTko(Alice, 10_000 ether, 1000 ether); - giveEthAndTko(Bob, 10_000 ether, 1000 ether); + giveEthAndTko(William, 10_000 ether, 1000 ether); - console2.log("====== Alice propose a block with bob as the assigned prover"); - TaikoData.BlockMetadata memory meta = proposeBlock(Alice, Bob, ""); + console2.log("====== Alice propose a block"); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, ""); console2.log("====== Guardian prover proves"); bytes32 parentHash = GENESIS_BLOCK_HASH; @@ -340,24 +323,21 @@ contract TaikoL1TestGroup5 is TaikoL1TestGroupBase { { printBlockAndTrans(meta.id); - TaikoData.Block memory blk = L1.getBlock(meta.id); + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); assertEq(blk.nextTransitionId, 2); assertEq(blk.verifiedTransitionId, 0); - assertEq(blk.assignedProver, Bob); - assertEq(blk.livenessBond, 0); TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 1); assertEq(ts.blockHash, blockHash); assertEq(ts.stateRoot, stateRoot); assertEq(ts.tier, LibTiers.TIER_GUARDIAN); assertEq(ts.contester, address(0)); - assertEq(ts.contestBond, 1); assertEq(ts.validityBond, 0); assertEq(ts.prover, address(gp)); assertEq(ts.timestamp, block.timestamp); - assertEq(tko.balanceOf(Bob), 10_000 ether - L1.getConfig().livenessBond); - assertEq(tko.balanceOf(William), 10_000 ether); + assertEq(totalTkoBalance(tko, L1, Alice), 10_000 ether - L1.getConfig().livenessBond); + assertEq(totalTkoBalance(tko, L1, William), 10_000 ether); } } } diff --git a/packages/protocol/test/layer1/based/TaikoL1TestGroup6.t.sol b/packages/protocol/test/layer1/based/TaikoL1TestGroup6.t.sol new file mode 100644 index 00000000000..8dbb1649542 --- /dev/null +++ b/packages/protocol/test/layer1/based/TaikoL1TestGroup6.t.sol @@ -0,0 +1,86 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "./TaikoL1TestGroupBase.sol"; + +contract TaikoL1TestGroup6 is TaikoL1TestGroupBase { + // Test summary: + // 1. Alice proposes a block, + // 2. Alice proves the block within the proving window, using the correct parent hash. + // 3. Taylor contests Alice's proof. + // 4. Alice re-proves his proof, showing Taylor is incorrect. + // 5. Alice's proof is validated and used to verify the block. + function test_taikoL1_group_6_case_1() external { + vm.warp(1_000_000); + + giveEthAndTko(Alice, 10_000 ether, 1000 ether); + giveEthAndTko(Taylor, 10_000 ether, 1000 ether); + ITierProvider.Tier memory tierOp = ITierProvider(tr).getTier(LibTiers.TIER_OPTIMISTIC); + ITierProvider.Tier memory tierSgx = ITierProvider(tr).getTier(LibTiers.TIER_SGX); + + console2.log("====== Alice propose a block"); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, ""); + + console2.log("====== Alice proves the block as the assigned prover"); + bytes32 parentHash = GENESIS_BLOCK_HASH; + bytes32 blockHash = bytes32(uint256(10)); + bytes32 stateRoot = bytes32(uint256(11)); + + mineAndWrap(10 seconds); + proveBlock(Alice, meta, parentHash, blockHash, stateRoot, meta.minTier, ""); + + console2.log("====== Taylor contests Alice"); + bytes32 blockHash2 = bytes32(uint256(20)); + bytes32 stateRoot2 = bytes32(uint256(21)); + mineAndWrap(10 seconds); + proveBlock(Taylor, meta, parentHash, blockHash2, stateRoot2, meta.minTier, ""); + + console2.log("====== Alice cannot proves himself is right"); + mineAndWrap(10 seconds); + proveBlock(Alice, meta, parentHash, blockHash, stateRoot, LibTiers.TIER_SGX, ""); + + { + printBlockAndTrans(meta.id); + + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); + assertEq(blk.nextTransitionId, 2); + assertEq(blk.verifiedTransitionId, 0); + + TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 1); + assertEq(ts.blockHash, blockHash); + assertEq(ts.stateRoot, stateRoot); + assertEq(ts.tier, LibTiers.TIER_SGX); + assertEq(ts.contester, address(0)); + assertEq(ts.validityBond, tierSgx.validityBond); + assertEq(ts.prover, Alice); + assertEq(ts.timestamp, block.timestamp); // not zero + + assertEq(totalTkoBalance(tko, L1, Taylor), 10_000 ether - tierOp.contestBond); + assertEq( + totalTkoBalance(tko, L1, Alice), + 10_000 ether - tierSgx.validityBond + tierOp.contestBond * 7 / 8 + ); + } + + console2.log("====== Verify the block"); + mineAndWrap(7 days); + verifyBlock(1); + { + printBlockAndTrans(meta.id); + + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); + + assertEq(blk.nextTransitionId, 2); + assertEq(blk.verifiedTransitionId, 1); + + TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 1); + assertEq(ts.blockHash, blockHash); + assertEq(ts.stateRoot, stateRoot); + assertEq(ts.tier, LibTiers.TIER_SGX); + assertEq(ts.prover, Alice); + + assertEq(totalTkoBalance(tko, L1, Taylor), 10_000 ether - tierOp.contestBond); + assertEq(totalTkoBalance(tko, L1, Alice), 10_000 ether + tierOp.contestBond * 7 / 8); + } + } +} diff --git a/packages/protocol/test/L1/TaikoL1TestGroup7.t.sol b/packages/protocol/test/layer1/based/TaikoL1TestGroup7.t.sol similarity index 55% rename from packages/protocol/test/L1/TaikoL1TestGroup7.t.sol rename to packages/protocol/test/layer1/based/TaikoL1TestGroup7.t.sol index e2b9897e46a..f8d57a59536 100644 --- a/packages/protocol/test/L1/TaikoL1TestGroup7.t.sol +++ b/packages/protocol/test/layer1/based/TaikoL1TestGroup7.t.sol @@ -1,31 +1,30 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import "./TaikoL1TestGroupBase.sol"; contract TaikoL1TestGroup7 is TaikoL1TestGroupBase { // Test summary: - // 1. Alice proposes a block, assigning Bob as the prover. - // 2. Bob proves the block within the proving window, using the correct parent hash. - // 3. After the cooldown window, Taylor contests Bob's proof, and fails. + // 1. Alice proposes a block, + // 2. Alice proves the block within the proving window, using the correct parent hash. + // 3. After the cooldown window, Taylor contests Alice's proof, and fails. function test_taikoL1_group_7_case_1() external { vm.warp(1_000_000); giveEthAndTko(Alice, 10_000 ether, 1000 ether); - giveEthAndTko(Bob, 10_000 ether, 1000 ether); giveEthAndTko(Taylor, 10_000 ether, 1000 ether); - ITierProvider.Tier memory tierOp = TestTierProvider(cp).getTier(LibTiers.TIER_OPTIMISTIC); + ITierProvider.Tier memory tierOp = ITierProvider(tr).getTier(LibTiers.TIER_OPTIMISTIC); - console2.log("====== Alice propose a block with bob as the assigned prover"); - TaikoData.BlockMetadata memory meta = proposeBlock(Alice, Bob, ""); + console2.log("====== Alice propose a block"); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, ""); - console2.log("====== Bob proves the block as the assigned prover"); + console2.log("====== Alice proves the block as the assigned prover"); bytes32 parentHash = GENESIS_BLOCK_HASH; bytes32 blockHash = bytes32(uint256(10)); bytes32 stateRoot = bytes32(uint256(11)); mineAndWrap(10 seconds); - proveBlock(Bob, meta, parentHash, blockHash, stateRoot, meta.minTier, ""); + proveBlock(Alice, meta, parentHash, blockHash, stateRoot, meta.minTier, ""); mineAndWrap(tierOp.cooldownWindow * 60); bytes32 blockHash2 = bytes32(uint256(20)); @@ -37,35 +36,34 @@ contract TaikoL1TestGroup7 is TaikoL1TestGroupBase { blockHash2, stateRoot2, meta.minTier, - TaikoErrors.L1_CANNOT_CONTEST.selector + LibProving.L1_CANNOT_CONTEST.selector ); printBlockAndTrans(meta.id); } // Test summary: - // 1. Alice proposes a block, assigning Bob as the prover. - // 2. Bob proves the block within the proving window, using the correct parent hash. - // 3. Taylor contests Bob's proof. - // 4. William attempts but fails to contest Bob again. + // 1. Alice proposes a block, + // 2. Alice proves the block within the proving window, using the correct parent hash. + // 3. Taylor contests Alice's proof. + // 4. William attempts but fails to contest Alice again. function test_taikoL1_group_7_case_2() external { vm.warp(1_000_000); giveEthAndTko(Alice, 10_000 ether, 1000 ether); - giveEthAndTko(Bob, 10_000 ether, 1000 ether); giveEthAndTko(Taylor, 10_000 ether, 1000 ether); giveEthAndTko(William, 10_000 ether, 1000 ether); - ITierProvider.Tier memory tierOp = TestTierProvider(cp).getTier(LibTiers.TIER_OPTIMISTIC); + ITierProvider.Tier memory tierOp = ITierProvider(tr).getTier(LibTiers.TIER_OPTIMISTIC); - console2.log("====== Alice propose a block with bob as the assigned prover"); - TaikoData.BlockMetadata memory meta = proposeBlock(Alice, Bob, ""); + console2.log("====== Alice propose a block"); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, ""); - console2.log("====== Bob proves the block as the assigned prover"); + console2.log("====== Alice proves the block as the assigned prover"); bytes32 parentHash = GENESIS_BLOCK_HASH; bytes32 blockHash = bytes32(uint256(10)); bytes32 stateRoot = bytes32(uint256(11)); mineAndWrap(10 seconds); - proveBlock(Bob, meta, parentHash, blockHash, stateRoot, meta.minTier, ""); + proveBlock(Alice, meta, parentHash, blockHash, stateRoot, meta.minTier, ""); mineAndWrap(tierOp.cooldownWindow * 60 - 1); bytes32 blockHash2 = bytes32(uint256(20)); @@ -81,7 +79,7 @@ contract TaikoL1TestGroup7 is TaikoL1TestGroupBase { blockHash3, stateRoot3, meta.minTier, - TaikoErrors.L1_ALREADY_CONTESTED.selector + LibProving.L1_ALREADY_CONTESTED.selector ); printBlockAndTrans(meta.id); diff --git a/packages/protocol/test/L1/TaikoL1TestGroup8.t.sol b/packages/protocol/test/layer1/based/TaikoL1TestGroup8.t.sol similarity index 57% rename from packages/protocol/test/L1/TaikoL1TestGroup8.t.sol rename to packages/protocol/test/layer1/based/TaikoL1TestGroup8.t.sol index 913ad55eef1..9c52fca4257 100644 --- a/packages/protocol/test/L1/TaikoL1TestGroup8.t.sol +++ b/packages/protocol/test/layer1/based/TaikoL1TestGroup8.t.sol @@ -1,38 +1,37 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import "./TaikoL1TestGroupBase.sol"; contract TaikoL1TestGroup8 is TaikoL1TestGroupBase { // Test summary: - // 1. Alice proposes a block, assigning Bob as the prover. + // 1. Alice proposes a block, // 2. TaikoL1 is paused. - // 3. Bob attempts to prove the block within the proving window. + // 3. Alice attempts to prove the block within the proving window. // 4. Alice tries to propose another block. // 5. TaikoL1 is unpaused. - // 6. Bob attempts again to prove the first block within the proving window. + // 6. Alice attempts again to prove the first block within the proving window. // 7. Alice tries to propose another block. function test_taikoL1_group_8_case_1() external { vm.warp(1_000_000); giveEthAndTko(Alice, 10_000 ether, 1000 ether); - giveEthAndTko(Bob, 10_000 ether, 1000 ether); - console2.log("====== Alice propose a block with bob as the assigned prover"); + console2.log("====== Alice propose a block"); - TaikoData.BlockMetadata memory meta = proposeBlock(Alice, Bob, ""); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, ""); console2.log("====== Pause TaikoL1"); mineAndWrap(10 seconds); vm.prank(L1.owner()); L1.pause(); - console2.log("====== Bob proves the block first after L1 paused"); + console2.log("====== Alice proves the block first after L1 paused"); bytes32 parentHash1 = GENESIS_BLOCK_HASH; bytes32 blockHash = bytes32(uint256(10)); bytes32 stateRoot = bytes32(uint256(11)); proveBlock( - Bob, + Alice, meta, parentHash1, blockHash, @@ -42,82 +41,81 @@ contract TaikoL1TestGroup8 is TaikoL1TestGroupBase { ); console2.log("====== Alice tries to propose another block after L1 paused"); - proposeBlock(Alice, Bob, EssentialContract.INVALID_PAUSE_STATUS.selector); + proposeBlock(Alice, EssentialContract.INVALID_PAUSE_STATUS.selector); console2.log("====== Unpause TaikoL1"); mineAndWrap(10 seconds); vm.prank(L1.owner()); L1.unpause(); - console2.log("====== Bob proves the block first after L1 unpaused"); - proveBlock(Bob, meta, parentHash1, blockHash, stateRoot, meta.minTier, ""); + console2.log("====== Alice proves the block first after L1 unpaused"); + proveBlock(Alice, meta, parentHash1, blockHash, stateRoot, meta.minTier, ""); console2.log("====== Alice tries to propose another block after L1 unpaused"); - proposeBlock(Alice, Bob, ""); + proposeBlock(Alice, ""); } // Test summary: - // 1. Alice proposes a block, assigning Bob as the prover. + // 1. Alice proposes a block, // 2. TaikoL1 proving is paused. - // 3. Bob attempts to prove the block within the proving window. + // 3. Alice attempts to prove the block within the proving window. // 4. Alice tries to propose another block. // 5. TaikoL1 proving is unpaused. - // 6. Bob attempts again to prove the first block within the proving window. + // 6. Alice attempts again to prove the first block within the proving window. // 7. Alice tries to propose another block. function test_taikoL1_group_8_case_2() external { vm.warp(1_000_000); giveEthAndTko(Alice, 10_000 ether, 1000 ether); - giveEthAndTko(Bob, 10_000 ether, 1000 ether); - console2.log("====== Alice propose a block with bob as the assigned prover"); + console2.log("====== Alice propose a block"); - TaikoData.BlockMetadata memory meta = proposeBlock(Alice, Bob, ""); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, ""); console2.log("====== Pause TaikoL1 proving"); mineAndWrap(10 seconds); vm.prank(L1.owner()); L1.pauseProving(true); - console2.log("====== Bob proves the block first after L1 proving paused"); + console2.log("====== Alice proves the block first after L1 proving paused"); bytes32 parentHash1 = GENESIS_BLOCK_HASH; bytes32 blockHash = bytes32(uint256(10)); bytes32 stateRoot = bytes32(uint256(11)); proveBlock( - Bob, + Alice, meta, parentHash1, blockHash, stateRoot, meta.minTier, - TaikoErrors.L1_PROVING_PAUSED.selector + LibProving.L1_PROVING_PAUSED.selector ); console2.log("====== Alice tries to propose another block after L1 proving paused"); - proposeBlock(Alice, Bob, ""); + proposeBlock(Alice, ""); console2.log("====== Unpause TaikoL1 proving"); mineAndWrap(10 seconds); vm.prank(L1.owner()); L1.pauseProving(false); - console2.log("====== Bob proves the block first after L1 proving unpaused"); - proveBlock(Bob, meta, parentHash1, blockHash, stateRoot, meta.minTier, ""); + console2.log("====== Alice proves the block first after L1 proving unpaused"); + proveBlock(Alice, meta, parentHash1, blockHash, stateRoot, meta.minTier, ""); } // Test summary: // 1. Gets a block that doesn't exist // 2. Gets a transition by ID & hash that doesn't exist. function test_taikoL1_group_8_case_3() external { - vm.expectRevert(TaikoErrors.L1_INVALID_BLOCK_ID.selector); - L1.getBlock(2); + vm.expectRevert(LibUtils.L1_INVALID_BLOCK_ID.selector); + L1.getBlockV2(2); - vm.expectRevert(TaikoErrors.L1_TRANSITION_NOT_FOUND.selector); + vm.expectRevert(LibUtils.L1_TRANSITION_NOT_FOUND.selector); L1.getTransition(0, 2); - vm.expectRevert(TaikoErrors.L1_TRANSITION_NOT_FOUND.selector); + vm.expectRevert(LibUtils.L1_TRANSITION_NOT_FOUND.selector); L1.getTransition(0, randBytes32()); - vm.expectRevert(TaikoErrors.L1_INVALID_BLOCK_ID.selector); + vm.expectRevert(LibUtils.L1_INVALID_BLOCK_ID.selector); L1.getTransition(3, randBytes32()); } } diff --git a/packages/protocol/test/layer1/based/TaikoL1TestGroup9.t.sol b/packages/protocol/test/layer1/based/TaikoL1TestGroup9.t.sol new file mode 100644 index 00000000000..0fc7533182b --- /dev/null +++ b/packages/protocol/test/layer1/based/TaikoL1TestGroup9.t.sol @@ -0,0 +1,374 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "./TaikoL1TestGroupBase.sol"; + +// Testing block proving and verification for block#2, as stateRootSyncInternal is set to 2 in +// this test suite, we are testing that block#2 shall have state root always as zero. +contract TaikoL1TestGroup5 is TaikoL1TestGroupBase { + bytes32 internal constant FIRST_BLOCK_HASH = keccak256("FIRST_BLOCK_HASH"); + + function proposeProveVerifyTheFirstBlock() internal { + vm.warp(1_000_000); + + giveEthAndTko(David, 10_000 ether, 1000 ether); + console2.log("====== David proposes, proves, and verifies the first block"); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(David, ""); + + bytes32 stateRoot = bytes32(uint256(1)); + + mineAndWrap(10 seconds); + proveBlock( + David, meta, GENESIS_BLOCK_HASH, FIRST_BLOCK_HASH, stateRoot, LibTiers.TIER_SGX, "" + ); + mineAndWrap(7 days); + verifyBlock(1); + } + + // Test summary: + // 0. David proposes, proves, and verifies the first block. + // 1. Alice proposes a block, + // 2. Guardian prover directly proves the block. + // 3. Guardian prover re-proves the same transition and fails. + // 4. Guardian prover proves the block again with a different transition. + // 5. William contests the guardian prover using a lower-tier proof and fails. + function test_taikoL1_group_9_case_1() external { + proposeProveVerifyTheFirstBlock(); + + giveEthAndTko(Alice, 10_000 ether, 1000 ether); + giveEthAndTko(William, 10_000 ether, 1000 ether); + + console2.log("====== Alice propose a block"); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, ""); + + console2.log("====== Guardian prover proves"); + bytes32 parentHash = FIRST_BLOCK_HASH; + bytes32 blockHash = bytes32(uint256(10)); + bytes32 stateRoot = bytes32(uint256(11)); + + mineAndWrap(10 seconds); + proveBlock(William, meta, parentHash, blockHash, stateRoot, LibTiers.TIER_GUARDIAN, ""); + + { + printBlockAndTrans(meta.id); + + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); + assertEq(blk.nextTransitionId, 2); + assertEq(blk.verifiedTransitionId, 0); + + TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 1); + assertEq(ts.blockHash, blockHash); + // This block is not storing state root + assertEq(ts.stateRoot, 0); + assertEq(ts.tier, LibTiers.TIER_GUARDIAN); + assertEq(ts.contester, address(0)); + assertEq(ts.validityBond, 0); + assertEq(ts.prover, address(gp)); + assertEq(ts.timestamp, block.timestamp); + + assertEq(totalTkoBalance(tko, L1, Alice), 10_000 ether); + assertEq(totalTkoBalance(tko, L1, William), 10_000 ether); + } + + console2.log("====== Guardian re-approve with the same transition"); + mineAndWrap(10 seconds); + proveBlock( + William, + meta, + parentHash, + blockHash, + stateRoot, + LibTiers.TIER_GUARDIAN, + LibProving.L1_ALREADY_PROVED.selector + ); + + console2.log("====== Guardian re-approve with a different transition"); + bytes32 blockHash2 = bytes32(uint256(20)); + bytes32 stateRoot2 = bytes32(uint256(21)); + mineAndWrap(10 seconds); + proveBlock(William, meta, parentHash, blockHash2, stateRoot2, LibTiers.TIER_GUARDIAN, ""); + + { + printBlockAndTrans(meta.id); + + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); + assertEq(blk.nextTransitionId, 2); + assertEq(blk.verifiedTransitionId, 0); + + TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 1); + assertEq(ts.blockHash, blockHash2); + // This block is not storing state root + assertEq(ts.stateRoot, 0); + assertEq(ts.tier, LibTiers.TIER_GUARDIAN); + assertEq(ts.contester, address(0)); + assertEq(ts.validityBond, 0); + assertEq(ts.prover, address(gp)); + assertEq(ts.timestamp, block.timestamp); + + assertEq(totalTkoBalance(tko, L1, Alice), 10_000 ether); + assertEq(totalTkoBalance(tko, L1, William), 10_000 ether); + } + + console2.log("====== William contests with a lower tier proof"); + mineAndWrap(10 seconds); + proveBlock( + William, + meta, + parentHash, + blockHash, + stateRoot, + LibTiers.TIER_SGX, + LibProving.L1_INVALID_TIER.selector + ); + + console2.log("====== Verify the block"); + mineAndWrap(7 days); + verifyBlock(1); + { + printBlockAndTrans(meta.id); + + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); + + assertEq(blk.nextTransitionId, 2); + assertEq(blk.verifiedTransitionId, 1); + + TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 1); + assertEq(ts.blockHash, blockHash2); + // This block is not storing state root + assertEq(ts.stateRoot, 0); + assertEq(ts.tier, LibTiers.TIER_GUARDIAN); + assertEq(ts.prover, address(gp)); + + assertEq(totalTkoBalance(tko, L1, Alice), 10_000 ether); + assertEq(totalTkoBalance(tko, L1, William), 10_000 ether); + } + } + + // Test summary: + // 0. David proposes, proves, and verifies the first block. + // 1. Alice proposes a block, Alice is the prover. + // 2. Alice proves the block. + // 3. Guardian prover re-proves the same transition and fails. + // 4. Guardian prover proves the block with a different transition. + // 5. William contests the guardian prover using a lower-tier proof and fails. + function test_taikoL1_group_9_case_2() external { + proposeProveVerifyTheFirstBlock(); + + giveEthAndTko(Alice, 10_000 ether, 1000 ether); + giveEthAndTko(William, 10_000 ether, 1000 ether); + ITierProvider.Tier memory tierOp = ITierProvider(tr).getTier(LibTiers.TIER_OPTIMISTIC); + + console2.log("====== Alice propose a block"); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, ""); + + console2.log("====== Alice proves the block"); + bytes32 parentHash = FIRST_BLOCK_HASH; + bytes32 blockHash = bytes32(uint256(10)); + bytes32 stateRoot = bytes32(uint256(11)); + + mineAndWrap(10 seconds); + proveBlock(Alice, meta, parentHash, blockHash, stateRoot, meta.minTier, ""); + + console2.log("====== Guardian re-approve with the same transition"); + mineAndWrap(10 seconds); + proveBlock( + William, + meta, + parentHash, + blockHash, + stateRoot, + LibTiers.TIER_GUARDIAN, + LibProving.L1_ALREADY_PROVED.selector + ); + + console2.log("====== Guardian re-approve with a different transition"); + bytes32 blockHash2 = bytes32(uint256(20)); + bytes32 stateRoot2 = bytes32(uint256(21)); + mineAndWrap(10 seconds); + proveBlock(William, meta, parentHash, blockHash2, stateRoot2, LibTiers.TIER_GUARDIAN, ""); + + { + printBlockAndTrans(meta.id); + + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); + assertEq(blk.nextTransitionId, 2); + assertEq(blk.verifiedTransitionId, 0); + + TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 1); + assertEq(ts.blockHash, blockHash2); + // This block is not storing state root + assertEq(ts.stateRoot, 0); + assertEq(ts.tier, LibTiers.TIER_GUARDIAN); + assertEq(ts.contester, address(0)); + assertEq(ts.validityBond, 0); + assertEq(ts.prover, address(gp)); + assertEq(ts.timestamp, block.timestamp); + + assertEq(totalTkoBalance(tko, L1, Alice), 10_000 ether - tierOp.validityBond); + assertEq(totalTkoBalance(tko, L1, William), 10_000 ether); + } + + console2.log("====== Verify the block"); + mineAndWrap(7 days); + verifyBlock(1); + { + printBlockAndTrans(meta.id); + + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); + + assertEq(blk.nextTransitionId, 2); + assertEq(blk.verifiedTransitionId, 1); + + TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 1); + assertEq(ts.blockHash, blockHash2); + // This block is not storing state root + assertEq(ts.stateRoot, 0); + assertEq(ts.tier, LibTiers.TIER_GUARDIAN); + assertEq(ts.prover, address(gp)); + + assertEq(totalTkoBalance(tko, L1, Alice), 10_000 ether - tierOp.validityBond); + assertEq(totalTkoBalance(tko, L1, William), 10_000 ether); + } + } + + // Test summary: + // 0. David proposes, proves, and verifies the first block. + // 1. Alice proposes a block, + // 2. Carol proves the block outside the proving window. + // 3. Guardian prover re-proves the same transition and fails. + // 4. Guardian prover proves the block with a different transition. + // 5. William contests the guardian prover using a lower-tier proof and fails. + function test_taikoL1_group_9_case_3() external { + proposeProveVerifyTheFirstBlock(); + + giveEthAndTko(Alice, 10_000 ether, 1000 ether); + giveEthAndTko(Carol, 10_000 ether, 1000 ether); + giveEthAndTko(William, 10_000 ether, 1000 ether); + ITierProvider.Tier memory tierOp = ITierProvider(tr).getTier(LibTiers.TIER_OPTIMISTIC); + + console2.log("====== Alice propose a block"); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, ""); + + uint96 livenessBond = L1.getConfig().livenessBond; + + console2.log("====== Carol proves the block"); + bytes32 parentHash = FIRST_BLOCK_HASH; + bytes32 blockHash = bytes32(uint256(10)); + bytes32 stateRoot = bytes32(uint256(11)); + + mineAndWrap(7 days); + proveBlock(Carol, meta, parentHash, blockHash, stateRoot, meta.minTier, ""); + + console2.log("====== Guardian re-approve with the same transition"); + mineAndWrap(10 seconds); + proveBlock( + William, + meta, + parentHash, + blockHash, + stateRoot, + LibTiers.TIER_GUARDIAN, + LibProving.L1_ALREADY_PROVED.selector + ); + + console2.log("====== Guardian re-approve with a different transition"); + bytes32 blockHash2 = bytes32(uint256(20)); + bytes32 stateRoot2 = bytes32(uint256(21)); + mineAndWrap(10 seconds); + proveBlock(William, meta, parentHash, blockHash2, stateRoot2, LibTiers.TIER_GUARDIAN, ""); + + { + printBlockAndTrans(meta.id); + + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); + assertEq(blk.nextTransitionId, 2); + assertEq(blk.verifiedTransitionId, 0); + + TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 1); + assertEq(ts.blockHash, blockHash2); + // This block is not storing state root + assertEq(ts.stateRoot, 0); + assertEq(ts.tier, LibTiers.TIER_GUARDIAN); + assertEq(ts.contester, address(0)); + assertEq(ts.validityBond, 0); + assertEq(ts.prover, address(gp)); + assertEq(ts.timestamp, block.timestamp); + + assertEq(totalTkoBalance(tko, L1, Alice), 10_000 ether - livenessBond); + assertEq( + totalTkoBalance(tko, L1, Carol), + 10_000 ether - tierOp.validityBond + livenessBond * 7 / 8 + ); + assertEq(totalTkoBalance(tko, L1, William), 10_000 ether); + } + + console2.log("====== Verify the block"); + mineAndWrap(7 days); + verifyBlock(1); + { + printBlockAndTrans(meta.id); + + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); + + assertEq(blk.nextTransitionId, 2); + assertEq(blk.verifiedTransitionId, 1); + + TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 1); + assertEq(ts.blockHash, blockHash2); + // This block is not storing state root + assertEq(ts.stateRoot, 0); + assertEq(ts.tier, LibTiers.TIER_GUARDIAN); + assertEq(ts.prover, address(gp)); + + assertEq(totalTkoBalance(tko, L1, Alice), 10_000 ether - livenessBond); + assertEq( + totalTkoBalance(tko, L1, Carol), + 10_000 ether - tierOp.validityBond + livenessBond * 7 / 8 + ); + assertEq(totalTkoBalance(tko, L1, William), 10_000 ether); + } + } + + // Test summary: + // 0. David proposes, proves, and verifies the first block. + // 1. Alice proposes a block, + // 2. Guardian prover directly proves the block out of proving window + function test_taikoL1_group_9_case_4() external { + proposeProveVerifyTheFirstBlock(); + + giveEthAndTko(Alice, 10_000 ether, 1000 ether); + giveEthAndTko(William, 10_000 ether, 1000 ether); + + console2.log("====== Alice propose a block"); + TaikoData.BlockMetadataV2 memory meta = proposeBlock(Alice, ""); + + console2.log("====== Guardian prover proves"); + bytes32 parentHash = FIRST_BLOCK_HASH; + bytes32 blockHash = bytes32(uint256(10)); + bytes32 stateRoot = bytes32(uint256(11)); + + mineAndWrap(7 days); + proveBlock(William, meta, parentHash, blockHash, stateRoot, LibTiers.TIER_GUARDIAN, ""); + + { + printBlockAndTrans(meta.id); + + TaikoData.BlockV2 memory blk = L1.getBlockV2(meta.id); + assertEq(blk.nextTransitionId, 2); + assertEq(blk.verifiedTransitionId, 0); + + TaikoData.TransitionState memory ts = L1.getTransition(meta.id, 1); + assertEq(ts.blockHash, blockHash); + // This block is not storing state root + assertEq(ts.stateRoot, 0); + assertEq(ts.tier, LibTiers.TIER_GUARDIAN); + assertEq(ts.contester, address(0)); + assertEq(ts.validityBond, 0); + assertEq(ts.prover, address(gp)); + assertEq(ts.timestamp, block.timestamp); + + assertEq(totalTkoBalance(tko, L1, Alice), 10_000 ether - L1.getConfig().livenessBond); + assertEq(totalTkoBalance(tko, L1, William), 10_000 ether); + } + } +} diff --git a/packages/protocol/test/L1/TaikoL1TestGroupBase.sol b/packages/protocol/test/layer1/based/TaikoL1TestGroupBase.sol similarity index 51% rename from packages/protocol/test/L1/TaikoL1TestGroupBase.sol rename to packages/protocol/test/layer1/based/TaikoL1TestGroupBase.sol index b1709355e8b..5948876c131 100644 --- a/packages/protocol/test/L1/TaikoL1TestGroupBase.sol +++ b/packages/protocol/test/layer1/based/TaikoL1TestGroupBase.sol @@ -1,20 +1,21 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import "./TaikoL1TestBase.sol"; contract TaikoL1New is TaikoL1 { - function getConfig() public view override returns (TaikoData.Config memory config) { + function getConfig() public pure override returns (TaikoData.Config memory config) { config = TaikoL1.getConfig(); - config.maxBlocksToVerifyPerProposal = 0; - config.blockMaxProposals = 10; - config.blockRingBufferSize = 20; - config.checkEOAForCalldataDA = true; + config.maxBlocksToVerify = 0; + config.blockMaxProposals = 20; + config.blockRingBufferSize = 25; + config.stateRootSyncInternal = 2; + config.ontakeForkHeight = 0; } } abstract contract TaikoL1TestGroupBase is TaikoL1TestBase { - function deployTaikoL1() internal override returns (TaikoL1) { + function deployTaikoL1() internal virtual override returns (TaikoL1) { return TaikoL1( payable(deployProxy({ name: "taiko", impl: address(new TaikoL1New()), data: "" })) ); @@ -22,62 +23,32 @@ abstract contract TaikoL1TestGroupBase is TaikoL1TestBase { function proposeBlock( address proposer, - address assignedProver, bytes4 revertReason ) internal - returns (TaikoData.BlockMetadata memory meta) + returns (TaikoData.BlockMetadataV2 memory) { - TaikoData.TierFee[] memory tierFees = new TaikoData.TierFee[](2); - tierFees[0] = TaikoData.TierFee(LibTiers.TIER_OPTIMISTIC, 1 ether); - tierFees[1] = TaikoData.TierFee(LibTiers.TIER_SGX, 2 ether); - - AssignmentHook.ProverAssignment memory assignment = AssignmentHook.ProverAssignment({ - feeToken: address(0), - tierFees: tierFees, - expiry: uint64(block.timestamp + 60 minutes), - maxBlockId: 0, - maxProposedIn: 0, - metaHash: 0, - parentMetaHash: 0, - signature: new bytes(0) - }); - - bytes memory txList = new bytes(10); - assignment.signature = - _signAssignment(assignedProver, assignment, address(L1), proposer, keccak256(txList)); - - TaikoData.HookCall[] memory hookcalls = new TaikoData.HookCall[](1); - hookcalls[0] = TaikoData.HookCall(address(assignmentHook), abi.encode(assignment)); - - bytes memory eoaSig; - { - uint256 privateKey; - if (proposer == Alice) { - privateKey = 0x1; - } else if (proposer == Bob) { - privateKey = 0x2; - } else if (proposer == Carol) { - privateKey = 0x3; - } else { - revert("unexpected"); - } - - (uint8 v, bytes32 r, bytes32 s) = vm.sign(privateKey, keccak256(txList)); - eoaSig = abi.encodePacked(r, s, v); - } + vm.prank(proposer); + if (revertReason != "") vm.expectRevert(revertReason); + return L1.proposeBlockV2("", new bytes(10)); + } + function proposeBlock( + address proposer, + TaikoData.BlockParamsV2 memory params, + bytes4 revertReason + ) + internal + returns (TaikoData.BlockMetadataV2 memory) + { vm.prank(proposer); if (revertReason != "") vm.expectRevert(revertReason); - (meta,) = L1.proposeBlock{ value: 3 ether }( - abi.encode(TaikoData.BlockParams(assignedProver, address(0), 0, 0, hookcalls, eoaSig)), - txList - ); + return L1.proposeBlockV2(abi.encode(params), new bytes(10)); } function proveBlock( address prover, - TaikoData.BlockMetadata memory meta, + TaikoData.BlockMetadataV2 memory meta, bytes32 parentHash, bytes32 blockHash, bytes32 stateRoot, @@ -120,13 +91,71 @@ abstract contract TaikoL1TestGroupBase is TaikoL1TestBase { // Grant 2 signatures, 3rd might be a revert vm.prank(David, David); - gp.approve(meta, tran, proof); + gp.approveV2(meta, tran, proof); vm.prank(Emma, Emma); - gp.approve(meta, tran, proof); + gp.approveV2(meta, tran, proof); if (revertReason != "") vm.expectRevert(revertReason); vm.prank(Frank); - gp.approve(meta, tran, proof); + gp.approveV2(meta, tran, proof); + } else { + if (revertReason != "") vm.expectRevert(revertReason); + vm.prank(prover); + L1.proveBlock(meta.id, abi.encode(meta, tran, proof)); + } + } + + function proveBlock2( + address prover, + TaikoData.BlockMetadataV2 memory meta, + bytes32 parentHash, + bytes32 blockHash, + bytes32 stateRoot, + uint16 tier, + bytes4 revertReason + ) + internal + { + TaikoData.Transition memory tran = TaikoData.Transition({ + parentHash: parentHash, + blockHash: blockHash, + stateRoot: stateRoot, + graffiti: 0x0 + }); + + TaikoData.TierProof memory proof; + proof.tier = tier; + address newInstance; + + // Keep changing the pub key associated with an instance to avoid + // attacks, + // obviously just a mock due to 2 addresses changing all the time. + (newInstance,) = sv.instances(0); + if (newInstance == SGX_X_0) { + newInstance = SGX_X_1; + } else { + newInstance = SGX_X_0; + } + + if (tier == LibTiers.TIER_SGX) { + bytes memory signature = + createSgxSignatureProof(tran, newInstance, prover, keccak256(abi.encode(meta))); + + proof.data = bytes.concat(bytes4(0), bytes20(newInstance), signature); + } + + if (tier == LibTiers.TIER_GUARDIAN) { + proof.data = ""; + + // Grant 2 signatures, 3rd might be a revert + vm.prank(David, David); + gp.approveV2(meta, tran, proof); + vm.prank(Emma, Emma); + gp.approveV2(meta, tran, proof); + + if (revertReason != "") vm.expectRevert(revertReason); + vm.prank(Frank); + gp.approveV2(meta, tran, proof); } else { if (revertReason != "") vm.expectRevert(revertReason); vm.prank(prover); @@ -135,7 +164,7 @@ abstract contract TaikoL1TestGroupBase is TaikoL1TestBase { } function printBlockAndTrans(uint64 blockId) internal view { - TaikoData.Block memory blk = L1.getBlock(blockId); + TaikoData.BlockV2 memory blk = L1.getBlockV2(blockId); printBlock(blk); for (uint32 i = 1; i < blk.nextTransitionId; ++i) { @@ -143,16 +172,28 @@ abstract contract TaikoL1TestGroupBase is TaikoL1TestBase { } } - function printBlock(TaikoData.Block memory blk) internal view { - TaikoData.SlotB memory b = L1.slotB(); + function totalTkoBalance( + TaikoToken tko, + TaikoL1 L1, + address user + ) + internal + view + returns (uint256) + { + return tko.balanceOf(user) + L1.bondBalanceOf(user); + } + + function printBlock(TaikoData.BlockV2 memory blk) internal view { + (, TaikoData.SlotB memory b) = L1.getStateVariables(); + console2.log("\n=================="); console2.log("---CHAIN:"); console2.log(" | lastVerifiedBlockId:", b.lastVerifiedBlockId); console2.log(" | numBlocks:", b.numBlocks); console2.log(" | timestamp:", block.timestamp); console2.log("---BLOCK#", blk.blockId); - console2.log(" | assignedProver:", blk.assignedProver); - console2.log(" | livenessBond:", blk.livenessBond); console2.log(" | proposedAt:", blk.proposedAt); + console2.log(" | proposedIn:", blk.proposedIn); console2.log(" | metaHash:", vm.toString(blk.metaHash)); console2.log(" | nextTransitionId:", blk.nextTransitionId); console2.log(" | verifiedTransitionId:", blk.verifiedTransitionId); @@ -166,11 +207,13 @@ abstract contract TaikoL1TestGroupBase is TaikoL1TestBase { console2.log(" | contester:", ts.contester); console2.log(" | contestBond:", ts.contestBond); console2.log(" | timestamp:", ts.timestamp); + console2.log(" | key (parentHash):", vm.toString(ts.key)); console2.log(" | blockHash:", vm.toString(ts.blockHash)); console2.log(" | stateRoot:", vm.toString(ts.stateRoot)); } function mineAndWrap(uint256 value) internal { + vm.roll(block.number + 1); vm.warp(block.timestamp + value); } } diff --git a/packages/protocol/test/L1/TestTierProvider.sol b/packages/protocol/test/layer1/based/TestTierRouter.sol similarity index 77% rename from packages/protocol/test/L1/TestTierProvider.sol rename to packages/protocol/test/layer1/based/TestTierRouter.sol index 4f19289f923..833d259f639 100644 --- a/packages/protocol/test/L1/TestTierProvider.sol +++ b/packages/protocol/test/layer1/based/TestTierRouter.sol @@ -1,22 +1,23 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; -import "../../contracts/common/LibStrings.sol"; -import "../../contracts/L1/tiers/ITierProvider.sol"; -import "../../contracts/L1/tiers/ITierRouter.sol"; +import "src/shared/common/LibStrings.sol"; +import "src/layer1/tiers/ITierProvider.sol"; +import "src/layer1/tiers/LibTiers.sol"; +import "src/layer1/tiers/ITierRouter.sol"; -/// @title TestTierProvider +/// @title TestTierRouter /// @dev Labeled in AddressResolver as "tier_router" /// @custom:security-contact security@taiko.xyz -contract TestTierProvider is ITierProvider, ITierRouter { +contract TestTierRouter is ITierProvider, ITierRouter { uint256[50] private __gap; /// @inheritdoc ITierRouter function getProvider(uint256) external view returns (address) { return address(this); } - /// @inheritdoc ITierProvider + /// @inheritdoc ITierProvider function getTier(uint16 _tierId) public pure override returns (ITierProvider.Tier memory) { if (_tierId == LibTiers.TIER_OPTIMISTIC) { return ITierProvider.Tier({ @@ -25,8 +26,8 @@ contract TestTierProvider is ITierProvider, ITierRouter { contestBond: 500 ether, // TKO cooldownWindow: 1440, //24 hours provingWindow: 30, // 0.5 hours - maxBlocksToVerifyPerProof: 12 - }); + maxBlocksToVerifyPerProof: 0 // DEPRECATED + }); } if (_tierId == LibTiers.TIER_SGX) { @@ -36,8 +37,8 @@ contract TestTierProvider is ITierProvider, ITierRouter { contestBond: 1640 ether, // =250TKO * 6.5625 cooldownWindow: 1440, //24 hours provingWindow: 60, // 1 hours - maxBlocksToVerifyPerProof: 8 - }); + maxBlocksToVerifyPerProof: 0 // DEPRECATED + }); } if (_tierId == LibTiers.TIER_GUARDIAN) { @@ -47,8 +48,8 @@ contract TestTierProvider is ITierProvider, ITierRouter { contestBond: 0, // must be 0 for top tier cooldownWindow: 60, //1 hours provingWindow: 2880, // 48 hours - maxBlocksToVerifyPerProof: 16 - }); + maxBlocksToVerifyPerProof: 0 // DEPRECATED + }); } revert TIER_NOT_FOUND(); @@ -63,7 +64,7 @@ contract TestTierProvider is ITierProvider, ITierRouter { } /// @inheritdoc ITierProvider - function getMinTier(uint256 _rand) public pure override returns (uint16) { + function getMinTier(address, uint256 _rand) public pure override returns (uint16) { // 10% will be selected to require SGX proofs. if (_rand % 10 == 0) return LibTiers.TIER_SGX; // Other blocks are optimistic, without validity proofs. diff --git a/packages/protocol/test/layer1/fork/ForkManager.t.sol b/packages/protocol/test/layer1/fork/ForkManager.t.sol new file mode 100644 index 00000000000..b3f3c8df647 --- /dev/null +++ b/packages/protocol/test/layer1/fork/ForkManager.t.sol @@ -0,0 +1,69 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "../TaikoL1Test.sol"; +import "src/layer1/fork/ForkManager.sol"; + +contract Fork is EssentialContract { + bytes32 private immutable __name; + + constructor(bytes32 _name) { + __name = _name; + } + + function init() external initializer { + __Essential_init(msg.sender); + } + + function name() public view returns (bytes32) { + return __name; + } +} + +contract ForkManager_RouteToOldFork is ForkManager { + constructor(address _fork1, address _fork2) ForkManager(_fork1, _fork2) { } + + function shouldRouteToOldFork(bytes4 _selector) internal pure override returns (bool) { + return _selector == Fork.name.selector; + } +} + +contract TestForkManager is TaikoL1Test { + address fork1 = address(new Fork("fork1")); + address fork2 = address(new Fork("fork2")); + + function test_ForkManager_default_routing() public { + address proxy = deployProxy({ + name: "main_proxy", + impl: address(new ForkManager(address(0), fork1)), + data: abi.encodeCall(Fork.init, ()) + }); + + assertTrue(ForkManager(payable(proxy)).isForkManager()); + assertEq(Fork(proxy).name(), "fork1"); + + // If we upgrade the proxy's impl to a fork, then alling isForkManager will throw, + // so we should never do this in production. + Fork(proxy).upgradeTo(fork2); + vm.expectRevert(); + ForkManager(payable(proxy)).isForkManager(); + + Fork(proxy).upgradeTo(address(new ForkManager(fork1, fork2))); + assertEq(Fork(proxy).name(), "fork2"); + } + + function test_ForkManager_routing_to_old_fork() public { + address proxy = deployProxy({ + name: "main_proxy", + impl: address(new ForkManager_RouteToOldFork(fork1, fork2)), + data: abi.encodeCall(Fork.init, ()) + }); + + assertTrue(ForkManager(payable(proxy)).isForkManager()); + assertEq(Fork(proxy).name(), "fork1"); + + Fork(proxy).upgradeTo(address(new ForkManager(fork1, fork2))); + assertTrue(ForkManager(payable(proxy)).isForkManager()); + assertEq(Fork(proxy).name(), "fork2"); + } +} diff --git a/packages/protocol/test/layer1/preconf/BaseTest.sol b/packages/protocol/test/layer1/preconf/BaseTest.sol new file mode 100644 index 00000000000..de6486e533a --- /dev/null +++ b/packages/protocol/test/layer1/preconf/BaseTest.sol @@ -0,0 +1,17 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "forge-std/src/Test.sol"; + +contract BaseTest is Test { + address addr_1 = vm.addr(1); + address addr_2 = vm.addr(2); + address addr_3 = vm.addr(3); + address addr_4 = vm.addr(4); + address addr_5 = vm.addr(5); + address addr_6 = vm.addr(6); + address addr_7 = vm.addr(7); + address addr_8 = vm.addr(8); + address addr_9 = vm.addr(9); + address addr_10 = vm.addr(10); +} diff --git a/packages/protocol/test/layer1/preconf/beacon/BeaconProofsVerification.sol b/packages/protocol/test/layer1/preconf/beacon/BeaconProofsVerification.sol new file mode 100644 index 00000000000..e162fe84025 --- /dev/null +++ b/packages/protocol/test/layer1/preconf/beacon/BeaconProofsVerification.sol @@ -0,0 +1,70 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "src/layer1/preconf/libs/LibMerkleUtils.sol"; +import "../BaseTest.sol"; +import "../fixtures/BeaconProofs.sol"; + +/// @dev The beacon chain data used here is from slot 9000000 on Ethereum mainnet. +contract BeaconProofsVerification is BaseTest { + function test_beaconProofsVerification_validatorInclusionInValidatorList() public { + bytes32[8] memory validatorChunks = BeaconProofs.validatorChunks(); + + bytes32 validatorHashTreeRoot = LibMerkleUtils.merkleize(validatorChunks); + + bytes32[] memory validatorProof = BeaconProofs.validatorProof(); + + bytes32 validatorsRoot = BeaconProofs.validatorsRoot(); + uint256 validatorIndex = BeaconProofs.validatorIndex(); + + assertTrue( + LibMerkleUtils.verifyProof( + validatorProof, validatorsRoot, validatorHashTreeRoot, validatorIndex + ) + ); + } + + function test_beaconProofsVerification_validatorListInclusionInBeaconState() public { + bytes32[] memory beaconStateProofForValidatorList = + BeaconProofs.beaconStateProofForValidatorList(); + + bytes32 validatorListRoot = BeaconProofs.validatorsRoot(); + bytes32 beaconStateRoot = BeaconProofs.beaconStateRoot(); + + assertTrue( + LibMerkleUtils.verifyProof( + beaconStateProofForValidatorList, beaconStateRoot, validatorListRoot, 11 + ) + ); + } + + function test_beaconProofsVerification_beaconStateInclusionInBeaconBlock() public { + bytes32[] memory beaconBlockProofForBeaconState = + BeaconProofs.beaconBlockProofForBeaconState(); + + bytes32 beaconStateRoot = BeaconProofs.beaconStateRoot(); + bytes32 beaconBlockRoot = BeaconProofs.beaconBlockRoot(); + + assertTrue( + LibMerkleUtils.verifyProof( + beaconBlockProofForBeaconState, beaconBlockRoot, beaconStateRoot, 3 + ) + ); + } + + function test_beaconProofsVerification_proposerInclusionInBeaconBlock() public { + bytes32[] memory beaconBlockProofForProposer = BeaconProofs.beaconBlockProofForProposer(); + + uint256 validatorIndex = BeaconProofs.validatorIndex(); + bytes32 beaconBlockRoot = BeaconProofs.beaconBlockRoot(); + + assertTrue( + LibMerkleUtils.verifyProof( + beaconBlockProofForProposer, + beaconBlockRoot, + LibMerkleUtils.toLittleEndian(validatorIndex), + 1 + ) + ); + } +} diff --git a/packages/protocol/test/layer1/preconf/blocks/BlockProposing.t.sol b/packages/protocol/test/layer1/preconf/blocks/BlockProposing.t.sol new file mode 100644 index 00000000000..f0b53ef580b --- /dev/null +++ b/packages/protocol/test/layer1/preconf/blocks/BlockProposing.t.sol @@ -0,0 +1,239 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "../fixtures/BlocksFixtures.sol"; + +import "src/layer1/preconf/impl/LibPreconfConstants.sol"; +import "src/layer1/preconf/iface/IPreconfTaskManager.sol"; + +contract BlockProposing is BlocksFixtures { + function setUp() public override { + super.setUp(); + } + + function test_newBlockProposal_preconferCanProposeBlockInAdvanced_Case1() external { + // Push preconfer Address 1 to slot 13 and Address 3 to slot 23 of the next epoch + prepareLookahead(13, 23); + + uint256 currentEpochStart = + LibPreconfConstants.MAINNET_BEACON_GENESIS + LibPreconfConstants.SECONDS_IN_EPOCH; + // Warp to an arbitrary timestamp before the preconfer's slot + uint256 currentSlotTimestamp = + currentEpochStart + (10 * LibPreconfConstants.SECONDS_IN_SLOT); + vm.warp(currentSlotTimestamp); + + // Arbitrary lookahead for the next epoch just to avoid fallback selection in this test + IPreconfTaskManager.LookaheadSetParam[] memory lookaheadSetParams = + new IPreconfTaskManager.LookaheadSetParam[](1); + lookaheadSetParams[0] = IPreconfTaskManager.LookaheadSetParam({ + preconfer: addr_2, + timestamp: currentEpochStart + LibPreconfConstants.SECONDS_IN_EPOCH + }); + + // Address 1 proposes the block + vm.prank(addr_1); + _newBlockProposal("Block Params", "Txn List", 1, lookaheadSetParams); + } + + function test_newBlockProposal_preconferCanProposeBlockInAdvanced_Case2() external { + // Push preconfer Address 1 to slot 13 and Address 3 to slot 23 of the next epoch + prepareLookahead(13, 23); + + uint256 currentEpochStart = + LibPreconfConstants.MAINNET_BEACON_GENESIS + LibPreconfConstants.SECONDS_IN_EPOCH; + // Warp to an arbitrary timestamp after Address 1's slot but before Address 3's slot + uint256 currentSlotTimestamp = + currentEpochStart + (15 * LibPreconfConstants.SECONDS_IN_SLOT); + vm.warp(currentSlotTimestamp); + + // Arbitrary lookahead for the next epoch just to avoid fallback selection in this test + IPreconfTaskManager.LookaheadSetParam[] memory lookaheadSetParams = + new IPreconfTaskManager.LookaheadSetParam[](1); + lookaheadSetParams[0] = IPreconfTaskManager.LookaheadSetParam({ + preconfer: addr_2, + timestamp: currentEpochStart + LibPreconfConstants.SECONDS_IN_EPOCH + }); + + // Address 3 proposes the block in advance + vm.prank(addr_3); + _newBlockProposal("Block Params 2", "Txn List 2", 2, lookaheadSetParams); + } + + function test_newBlockProposal_preconferCanProposeBlockAtDedicatedSlot() external { + // Push preconfer Address 1 to slot 13 and Address 3 to slot 23 of the next epoch + prepareLookahead(13, 23); + + uint256 currentEpochStart = + LibPreconfConstants.MAINNET_BEACON_GENESIS + LibPreconfConstants.SECONDS_IN_EPOCH; + // Warp to the exact timestamp of the preconfer's dedicated slot + uint256 currentSlotTimestamp = + currentEpochStart + (12 * LibPreconfConstants.SECONDS_IN_SLOT); + vm.warp(currentSlotTimestamp); + + // Arbitrary lookahead for the next epoch just to avoid fallback selection in this test + IPreconfTaskManager.LookaheadSetParam[] memory lookaheadSetParams = + new IPreconfTaskManager.LookaheadSetParam[](1); + lookaheadSetParams[0] = IPreconfTaskManager.LookaheadSetParam({ + preconfer: addr_2, + timestamp: currentEpochStart + LibPreconfConstants.SECONDS_IN_EPOCH + }); + + // Address 1 proposes the block at its dedicated slot + vm.prank(addr_1); + _newBlockProposal("Block Params 3", "Txn List 3", 1, lookaheadSetParams); + } + + function test_newBlockProposal_updatesLookaheadForNextEpoch() external { + // Prepare initial lookahead + prepareLookahead(13, 23); + + uint256 currentEpochStart = + LibPreconfConstants.MAINNET_BEACON_GENESIS + LibPreconfConstants.SECONDS_IN_EPOCH; + uint256 nextEpochStart = currentEpochStart + LibPreconfConstants.SECONDS_IN_EPOCH; + + uint256 currentSlotTimestamp = currentEpochStart + (9 * LibPreconfConstants.SECONDS_IN_SLOT); + // Warp to a slot where address 1 can propose a block + vm.warp(currentSlotTimestamp); + + // Prepare lookahead set for the next epoch + IPreconfTaskManager.LookaheadSetParam[] memory lookaheadSetParams = + new IPreconfTaskManager.LookaheadSetParam[](2); + // Slot 10 + lookaheadSetParams[0] = IPreconfTaskManager.LookaheadSetParam({ + timestamp: nextEpochStart + (9 * LibPreconfConstants.SECONDS_IN_SLOT), + preconfer: addr_1 + }); + // Slot 20 + lookaheadSetParams[1] = IPreconfTaskManager.LookaheadSetParam({ + timestamp: nextEpochStart + (19 * LibPreconfConstants.SECONDS_IN_SLOT), + preconfer: addr_2 + }); + + // Address 1 proposes a block and updates the lookahead + vm.prank(addr_1); + _newBlockProposal("Block Params", "Txn List", 1, lookaheadSetParams); + + // Verify that the lookahead for the next epoch has been updated + IPreconfTaskManager.LookaheadBufferEntry[128] memory lookaheadBuffer = + preconfTaskManager.getLookaheadBuffer(); + + // Check the first entry + assertEq(lookaheadBuffer[3].preconfer, addr_1); + assertEq( + lookaheadBuffer[3].timestamp, nextEpochStart + (9 * LibPreconfConstants.SECONDS_IN_SLOT) + ); + assertEq( + lookaheadBuffer[3].prevTimestamp, + currentEpochStart + (22 * LibPreconfConstants.SECONDS_IN_SLOT) + ); + assertEq(lookaheadBuffer[3].isFallback, false); + + // Check the second entry + assertEq(lookaheadBuffer[4].preconfer, addr_2); + assertEq( + lookaheadBuffer[4].timestamp, + nextEpochStart + (19 * LibPreconfConstants.SECONDS_IN_SLOT) + ); + assertEq( + lookaheadBuffer[4].prevTimestamp, + nextEpochStart + (9 * LibPreconfConstants.SECONDS_IN_SLOT) + ); + assertEq(lookaheadBuffer[4].isFallback, false); + + // Verify that the lookahead tail has been updated + assertEq(preconfTaskManager.getLookaheadTail(), 4); + + // Verify that the lookahead poster for the next epoch has been set + assertEq(preconfTaskManager.getLookaheadPoster(nextEpochStart), addr_1); + } + + function test_newBlockProposal_revertWhenTimestampAboveDedicatedSlot() external { + prepareLookahead(13, 23); + + uint256 currentEpochStart = + LibPreconfConstants.MAINNET_BEACON_GENESIS + LibPreconfConstants.SECONDS_IN_EPOCH; + uint256 dedicatedSlotTimestamp = + currentEpochStart + (12 * LibPreconfConstants.SECONDS_IN_SLOT); + + // Warp to a timestamp after the dedicated slot + vm.warp(dedicatedSlotTimestamp + LibPreconfConstants.SECONDS_IN_SLOT); + + vm.prank(addr_1); + vm.expectRevert(IPreconfTaskManager.InvalidLookaheadPointer.selector); + _newBlockProposal( + "Block Params", "Txn List", 1, new IPreconfTaskManager.LookaheadSetParam[](0) + ); + } + + function test_newBlockProposal_revertWhenTimestampBelowPrevTimestamp() external { + prepareLookahead(13, 23); + + uint256 currentEpochStart = + LibPreconfConstants.MAINNET_BEACON_GENESIS + LibPreconfConstants.SECONDS_IN_EPOCH; + uint256 prevSlotTimestamp = currentEpochStart + (12 * LibPreconfConstants.SECONDS_IN_SLOT); + + // Warp to a timestamp before the previous slot + vm.warp(prevSlotTimestamp - LibPreconfConstants.SECONDS_IN_SLOT); + + vm.prank(addr_3); + vm.expectRevert(IPreconfTaskManager.InvalidLookaheadPointer.selector); + _newBlockProposal( + "Block Params", "Txn List", 2, new IPreconfTaskManager.LookaheadSetParam[](0) + ); + } + + function test_newBlockProposal_revertWhenTimestampEqualToPrevTimestamp() external { + prepareLookahead(13, 23); + + uint256 currentEpochStart = + LibPreconfConstants.MAINNET_BEACON_GENESIS + LibPreconfConstants.SECONDS_IN_EPOCH; + uint256 prevSlotTimestamp = currentEpochStart + (12 * LibPreconfConstants.SECONDS_IN_SLOT); + + // Warp to the exact timestamp of the previous slot + vm.warp(prevSlotTimestamp); + + vm.prank(addr_3); + vm.expectRevert(IPreconfTaskManager.InvalidLookaheadPointer.selector); + _newBlockProposal( + "Block Params", "Txn List", 2, new IPreconfTaskManager.LookaheadSetParam[](0) + ); + } + + function test_newBlockProposal_revertWhenSenderIsNotThePreconfer() external { + prepareLookahead(13, 23); + + uint256 currentEpochStart = + LibPreconfConstants.MAINNET_BEACON_GENESIS + LibPreconfConstants.SECONDS_IN_EPOCH; + uint256 currentSlotTimestamp = + currentEpochStart + (15 * LibPreconfConstants.SECONDS_IN_SLOT); + + // Warp to a slot when Address 3 is the expected preconfer + vm.warp(currentSlotTimestamp); + + // Try to propose with a different address than the expected preconfer + vm.prank(addr_2); // addr_2 is not the expected preconfer (It is addr_3) + vm.expectRevert(IPreconfTaskManager.SenderIsNotThePreconfer.selector); + _newBlockProposal( + "Block Params", "Txn List", 2, new IPreconfTaskManager.LookaheadSetParam[](0) + ); + } + + function _newBlockProposal( + bytes memory blockParams, + bytes memory txList, + uint256 lookaheadPointer, + IPreconfTaskManager.LookaheadSetParam[] memory lookaheadSetParams + ) + internal + { + bytes[] memory blockParamsArr = new bytes[](1); + blockParamsArr[0] = blockParams; + + bytes[] memory txListArr = new bytes[](1); + txListArr[0] = txList; + + preconfTaskManager.newBlockProposals( + blockParamsArr, txListArr, lookaheadPointer, lookaheadSetParams + ); + } +} diff --git a/packages/protocol/test/layer1/preconf/bls/BLSExpandMsgXmd.t.sol b/packages/protocol/test/layer1/preconf/bls/BLSExpandMsgXmd.t.sol new file mode 100644 index 00000000000..2a9d893faf8 --- /dev/null +++ b/packages/protocol/test/layer1/preconf/bls/BLSExpandMsgXmd.t.sol @@ -0,0 +1,129 @@ +// SPDX-License-Identifier: MIT +// Test has been referenced from +// https://github.com/ethyla/bls12-381-hash-to-curve/blob/main/test/expandMsgXmd.sol +pragma solidity ^0.8.24; + +import "../BaseTest.sol"; +import "src/layer1/preconf/libs/LibBLS12381.sol"; + +contract BLSExpendMsgXmd is BaseTest { + bytes internal expand_msg_dst = "QUUX-V01-CS02-with-expander-SHA256-128"; + + function test_expandMsgXmd_empty_msg_0x20() public { + uint256[] memory result = LibBLS12381._expandMsgXmd("", expand_msg_dst, 0x20); + uint256 expected = 0x68a985b87eb6b46952128911f2a4412bbc302a9d759667f87f7a21d803f07235; + + assertEq(result[0], expected); + } + + function testExpandMsgXmd_abc_0x20() public { + uint256[] memory result = LibBLS12381._expandMsgXmd("abc", expand_msg_dst, 0x20); + uint256 expected = 0xd8ccab23b5985ccea865c6c97b6e5b8350e794e603b4b97902f53a8a0d605615; + + assertEq(result[0], expected); + } + + function testExpandMsgXmd_abcdef0123456789_0x20() public { + uint256[] memory result = + LibBLS12381._expandMsgXmd("abcdef0123456789", expand_msg_dst, 0x20); + uint256 expected = 0xeff31487c770a893cfb36f912fbfcbff40d5661771ca4b2cb4eafe524333f5c1; + + assertEq(result[0], expected); + } + + function testExpandMsgXmd_q128_0x20() public { + uint256[] memory result = LibBLS12381._expandMsgXmd( + "q128_qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq", + expand_msg_dst, + 0x20 + ); + uint256 expected = 0xb23a1d2b4d97b2ef7785562a7e8bac7eed54ed6e97e29aa51bfe3f12ddad1ff9; + + assertEq(result[0], expected); + } + + function testExpandMsgXmd_a512_0x20() public { + uint256[] memory result = LibBLS12381._expandMsgXmd( + "a512_aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + expand_msg_dst, + 0x20 + ); + uint256 expected = 0x4623227bcc01293b8c130bf771da8c298dede7383243dc0993d2d94823958c4c; + + assertEq(result[0], expected); + } + + function testExpandMsgXmd_empty_msg_0x80() public { + uint256[] memory result = LibBLS12381._expandMsgXmd("", expand_msg_dst, 0x80); + bytes memory expected = + hex"af84c27ccfd45d41914fdff5df25293e221afc53d8ad2ac06d5e3e29485dadbee0d121587713a3e0dd4d5e69e93eb7cd4f5df4cd103e188cf60cb02edc3edf18eda8576c412b18ffb658e3dd6ec849469b979d444cf7b26911a08e63cf31f9dcc541708d3491184472c2c29bb749d4286b004ceb5ee6b9a7fa5b646c993f0ced"; + + assertEq( + bytes.concat( + bytes32(result[0]), bytes32(result[1]), bytes32(result[2]), bytes32(result[3]) + ), + expected + ); + } + + function testExpandMsgXmd_abc_0x80() public { + uint256[] memory result = LibBLS12381._expandMsgXmd("abc", expand_msg_dst, 0x80); + bytes memory expected = + hex"abba86a6129e366fc877aab32fc4ffc70120d8996c88aee2fe4b32d6c7b6437a647e6c3163d40b76a73cf6a5674ef1d890f95b664ee0afa5359a5c4e07985635bbecbac65d747d3d2da7ec2b8221b17b0ca9dc8a1ac1c07ea6a1e60583e2cb00058e77b7b72a298425cd1b941ad4ec65e8afc50303a22c0f99b0509b4c895f40"; + + assertEq( + bytes.concat( + bytes32(result[0]), bytes32(result[1]), bytes32(result[2]), bytes32(result[3]) + ), + expected + ); + } + + function testExpandMsgXmd_abcdef0123456789_0x80() public { + uint256[] memory result = + LibBLS12381._expandMsgXmd("abcdef0123456789", expand_msg_dst, 0x80); + bytes memory expected = + hex"ef904a29bffc4cf9ee82832451c946ac3c8f8058ae97d8d629831a74c6572bd9ebd0df635cd1f208e2038e760c4994984ce73f0d55ea9f22af83ba4734569d4bc95e18350f740c07eef653cbb9f87910d833751825f0ebefa1abe5420bb52be14cf489b37fe1a72f7de2d10be453b2c9d9eb20c7e3f6edc5a60629178d9478df"; + + assertEq( + bytes.concat( + bytes32(result[0]), bytes32(result[1]), bytes32(result[2]), bytes32(result[3]) + ), + expected + ); + } + + function testExpandMsgXmd_q128_0x80() public { + uint256[] memory result = LibBLS12381._expandMsgXmd( + "q128_qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq", + expand_msg_dst, + 0x80 + ); + bytes memory expected = + hex"80be107d0884f0d881bb460322f0443d38bd222db8bd0b0a5312a6fedb49c1bbd88fd75d8b9a09486c60123dfa1d73c1cc3169761b17476d3c6b7cbbd727acd0e2c942f4dd96ae3da5de368d26b32286e32de7e5a8cb2949f866a0b80c58116b29fa7fabb3ea7d520ee603e0c25bcaf0b9a5e92ec6a1fe4e0391d1cdbce8c68a"; + + assertEq( + bytes.concat( + bytes32(result[0]), bytes32(result[1]), bytes32(result[2]), bytes32(result[3]) + ), + expected + ); + } + + function testExpandMsgXmd_a512_0x80() public { + uint256[] memory result = LibBLS12381._expandMsgXmd( + "a512_aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + expand_msg_dst, + 0x80 + ); + bytes memory expected = + hex"546aff5444b5b79aa6148bd81728704c32decb73a3ba76e9e75885cad9def1d06d6792f8a7d12794e90efed817d96920d728896a4510864370c207f99bd4a608ea121700ef01ed879745ee3e4ceef777eda6d9e5e38b90c86ea6fb0b36504ba4a45d22e86f6db5dd43d98a294bebb9125d5b794e9d2a81181066eb954966a487"; + + assertEq( + bytes.concat( + bytes32(result[0]), bytes32(result[1]), bytes32(result[2]), bytes32(result[3]) + ), + expected + ); + } +} diff --git a/packages/protocol/test/layer1/preconf/bls/BLSHashToFieldFp2.t.sol b/packages/protocol/test/layer1/preconf/bls/BLSHashToFieldFp2.t.sol new file mode 100644 index 00000000000..da305ab7957 --- /dev/null +++ b/packages/protocol/test/layer1/preconf/bls/BLSHashToFieldFp2.t.sol @@ -0,0 +1,103 @@ +// SPDX-License-Identifier: MIT +// Test has been referenced from +// https://github.com/ethyla/bls12-381-hash-to-curve/blob/main/test/hashToField.sol +pragma solidity ^0.8.24; + +import "../BaseTest.sol"; +import "src/layer1/preconf/libs/LibBLS12381.sol"; + +contract BLSHashToFieldFp2 is BaseTest { + bytes internal hash_to_dst = "QUUX-V01-CS02-with-BLS12381G2_XMD:SHA-256_SSWU_RO_"; + + function test_hashToFieldFp2_empty_msg() public { + LibBLS12381.FieldPoint2[2] memory result = LibBLS12381.hashToFieldFp2("", hash_to_dst); + bytes memory expected_u0 = + hex"0000000000000000000000000000000003dbc2cce174e91ba93cbb08f26b917f98194a2ea08d1cce75b2b9cc9f21689d80bd79b594a613d0a68eb807dfdc1cf8"; + bytes memory expected_u0_I = + hex"0000000000000000000000000000000005a2acec64114845711a54199ea339abd125ba38253b70a92c876df10598bd1986b739cad67961eb94f7076511b3b39a"; + bytes memory expected_u1 = + hex"0000000000000000000000000000000002f99798e8a5acdeed60d7e18e9120521ba1f47ec090984662846bc825de191b5b7641148c0dbc237726a334473eee94"; + bytes memory expected_u1_I = + hex"00000000000000000000000000000000145a81e418d4010cc027a68f14391b30074e89e60ee7a22f87217b2f6eb0c4b94c9115b436e6fa4607e95a98de30a435"; + + assertEq(bytes.concat(bytes32(result[0].u[0]), bytes32(result[0].u[1])), expected_u0); + assertEq(bytes.concat(bytes32(result[0].u_I[0]), bytes32(result[0].u_I[1])), expected_u0_I); + assertEq(bytes.concat(bytes32(result[1].u[0]), bytes32(result[1].u[1])), expected_u1); + assertEq(bytes.concat(bytes32(result[1].u_I[0]), bytes32(result[1].u_I[1])), expected_u1_I); + } + + function test_hashToFieldFp2_msg_abc() public { + LibBLS12381.FieldPoint2[2] memory result = LibBLS12381.hashToFieldFp2("abc", hash_to_dst); + bytes memory expected_u0 = + hex"0000000000000000000000000000000015f7c0aa8f6b296ab5ff9c2c7581ade64f4ee6f1bf18f55179ff44a2cf355fa53dd2a2158c5ecb17d7c52f63e7195771"; + bytes memory expected_u0_I = + hex"0000000000000000000000000000000001c8067bf4c0ba709aa8b9abc3d1cef589a4758e09ef53732d670fd8739a7274e111ba2fcaa71b3d33df2a3a0c8529dd"; + bytes memory expected_u1 = + hex"00000000000000000000000000000000187111d5e088b6b9acfdfad078c4dacf72dcd17ca17c82be35e79f8c372a693f60a033b461d81b025864a0ad051a06e4"; + bytes memory expected_u1_I = + hex"0000000000000000000000000000000008b852331c96ed983e497ebc6dee9b75e373d923b729194af8e72a051ea586f3538a6ebb1e80881a082fa2b24df9f566"; + + assertEq(bytes.concat(bytes32(result[0].u[0]), bytes32(result[0].u[1])), expected_u0); + assertEq(bytes.concat(bytes32(result[0].u_I[0]), bytes32(result[0].u_I[1])), expected_u0_I); + assertEq(bytes.concat(bytes32(result[1].u[0]), bytes32(result[1].u[1])), expected_u1); + assertEq(bytes.concat(bytes32(result[1].u_I[0]), bytes32(result[1].u_I[1])), expected_u1_I); + } + + function test_hash_to_field_msg_fp2_abcdef0123456789() public { + LibBLS12381.FieldPoint2[2] memory result = + LibBLS12381.hashToFieldFp2("abcdef0123456789", hash_to_dst); + bytes memory expected_u0 = + hex"000000000000000000000000000000000313d9325081b415bfd4e5364efaef392ecf69b087496973b229303e1816d2080971470f7da112c4eb43053130b785e1"; + bytes memory expected_u0_I = + hex"00000000000000000000000000000000062f84cb21ed89406890c051a0e8b9cf6c575cf6e8e18ecf63ba86826b0ae02548d83b483b79e48512b82a6c0686df8f"; + bytes memory expected_u1 = + hex"000000000000000000000000000000001739123845406baa7be5c5dc74492051b6d42504de008c635f3535bb831d478a341420e67dcc7b46b2e8cba5379cca97"; + bytes memory expected_u1_I = + hex"0000000000000000000000000000000001897665d9cb5db16a27657760bbea7951f67ad68f8d55f7113f24ba6ddd82caef240a9bfa627972279974894701d975"; + + assertEq(bytes.concat(bytes32(result[0].u[0]), bytes32(result[0].u[1])), expected_u0); + assertEq(bytes.concat(bytes32(result[0].u_I[0]), bytes32(result[0].u_I[1])), expected_u0_I); + assertEq(bytes.concat(bytes32(result[1].u[0]), bytes32(result[1].u[1])), expected_u1); + assertEq(bytes.concat(bytes32(result[1].u_I[0]), bytes32(result[1].u_I[1])), expected_u1_I); + } + + function test_hashToFieldFp2_msg_q128() public { + LibBLS12381.FieldPoint2[2] memory result = LibBLS12381.hashToFieldFp2( + "q128_qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq", + hash_to_dst + ); + bytes memory expected_u0 = + hex"00000000000000000000000000000000025820cefc7d06fd38de7d8e370e0da8a52498be9b53cba9927b2ef5c6de1e12e12f188bbc7bc923864883c57e49e253"; + bytes memory expected_u0_I = + hex"00000000000000000000000000000000034147b77ce337a52e5948f66db0bab47a8d038e712123bb381899b6ab5ad20f02805601e6104c29df18c254b8618c7b"; + bytes memory expected_u1 = + hex"000000000000000000000000000000000930315cae1f9a6017c3f0c8f2314baa130e1cf13f6532bff0a8a1790cd70af918088c3db94bda214e896e1543629795"; + bytes memory expected_u1_I = + hex"0000000000000000000000000000000010c4df2cacf67ea3cb3108b00d4cbd0b3968031ebc8eac4b1ebcefe84d6b715fde66bef0219951ece29d1facc8a520ef"; + + assertEq(bytes.concat(bytes32(result[0].u[0]), bytes32(result[0].u[1])), expected_u0); + assertEq(bytes.concat(bytes32(result[0].u_I[0]), bytes32(result[0].u_I[1])), expected_u0_I); + assertEq(bytes.concat(bytes32(result[1].u[0]), bytes32(result[1].u[1])), expected_u1); + assertEq(bytes.concat(bytes32(result[1].u_I[0]), bytes32(result[1].u_I[1])), expected_u1_I); + } + + function test_hashToFieldFp2_msg_a512() public { + LibBLS12381.FieldPoint2[2] memory result = LibBLS12381.hashToFieldFp2( + "a512_aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + hash_to_dst + ); + bytes memory expected_u0 = + hex"00000000000000000000000000000000190b513da3e66fc9a3587b78c76d1d132b1152174d0b83e3c1114066392579a45824c5fa17649ab89299ddd4bda54935"; + bytes memory expected_u0_I = + hex"0000000000000000000000000000000012ab625b0fe0ebd1367fe9fac57bb1168891846039b4216b9d94007b674de2d79126870e88aeef54b2ec717a887dcf39"; + bytes memory expected_u1 = + hex"000000000000000000000000000000000e6a42010cf435fb5bacc156a585e1ea3294cc81d0ceb81924d95040298380b164f702275892cedd81b62de3aba3f6b5"; + bytes memory expected_u1_I = + hex"00000000000000000000000000000000117d9a0defc57a33ed208428cb84e54c85a6840e7648480ae428838989d25d97a0af8e3255be62b25c2a85630d2dddd8"; + + assertEq(bytes.concat(bytes32(result[0].u[0]), bytes32(result[0].u[1])), expected_u0); + assertEq(bytes.concat(bytes32(result[0].u_I[0]), bytes32(result[0].u_I[1])), expected_u0_I); + assertEq(bytes.concat(bytes32(result[1].u[0]), bytes32(result[1].u[1])), expected_u1); + assertEq(bytes.concat(bytes32(result[1].u_I[0]), bytes32(result[1].u_I[1])), expected_u1_I); + } +} diff --git a/packages/protocol/test/layer1/preconf/bls/script-test/BLSHashToCurveG2.sol b/packages/protocol/test/layer1/preconf/bls/script-test/BLSHashToCurveG2.sol new file mode 100644 index 00000000000..9caf95cdaea --- /dev/null +++ b/packages/protocol/test/layer1/preconf/bls/script-test/BLSHashToCurveG2.sol @@ -0,0 +1,34 @@ +// SPDX-License-Identifier: MIT +// solhint-disable-next-line +pragma solidity ^0.8.24; + +import "script/layer1/preconf/BaseScript.sol"; +import "src/layer1/preconf/libs/LibBLS12381.sol"; + +/** + * @dev At the time of writing this (Sept, 2024) foundry does not support the LibBLS12381 + * precompile, + * thus + * a traditional foundry test is not possible for hash to curve functionality. Instead, we test it + * manually by sending a transaction to a Pectra devnet and verify the outputs on the explorer. + */ +contract BLSHashToCurveG2 is BaseScript { + function run() external broadcast { + Target target = new Target(); + target.hashToCurveG2(); + } +} + +contract Target { + bytes internal HASH_TO_G2_DST = "QUUX-V01-CS02-with-LibBLS12381G2_XMD:SHA-256_SSWU_RO_"; + + event Output(LibBLS12381.G2Point); + + function hashToCurveG2() external { + /** + * Expected output: + * 0x0000000000000000000000000000000002c2d18e033b960562aae3cab37a27ce00d80ccd5ba4b7fe0e7a210245129dbec7780ccc7954725f4168aff2787776e600000000000000000000000000000000139cddbccdc5e91b9623efd38c49f81a6f83f175e80b06fc374de9eb4b41dfe4ca3a230ed250fbe3a2acf73a41177fd8000000000000000000000000000000001787327b68159716a37440985269cf584bcb1e621d3a7202be6ea05c4cfe244aeb197642555a0645fb87bf7466b2ba480000000000000000000000000000000000aa65dae3c8d732d10ecd2c50f8a1baf3001578f71c694e03866e9f3d49ac1e1ce70dd94a733534f106d4cec0eddd16 + */ + emit Output(LibBLS12381.hashToCurveG2("abc", HASH_TO_G2_DST)); + } +} diff --git a/packages/protocol/test/layer1/preconf/bls/script-test/BLSVerifySignature.sol b/packages/protocol/test/layer1/preconf/bls/script-test/BLSVerifySignature.sol new file mode 100644 index 00000000000..244b2bcf629 --- /dev/null +++ b/packages/protocol/test/layer1/preconf/bls/script-test/BLSVerifySignature.sol @@ -0,0 +1,64 @@ +// SPDX-License-Identifier: MIT +// solhint-disable-next-line +pragma solidity ^0.8.24; + +import "script/layer1/preconf/BaseScript.sol"; +import "src/layer1/preconf/libs/LibBLSSignature.sol"; + +/** + * @dev At the time of writing this (Sept, 2024) foundry does not support the LibBLS12381 + * precompile, + * thus + * a traditional foundry test is not possible to verify a signature. Instead, we test it + * manually by sending a transaction to a Pectra devnet and verify the outputs on the explorer. + */ +contract BLSVerifySignature is BaseScript { + using LibBLS12381 for *; + + function run() external broadcast { + Target target = new Target(); + target.verify(); + } +} + +contract Target { + event Output(bool); + + function verify() external { + LibBLS12381.G2Point memory sig = LibBLS12381.G2Point({ + x: [ + 0x00000000000000000000000000000000075785f1ffe7faabd27259035731c4ff, + 0x881c38e87fc963a47425ce52f12f18c348370eaea53008bc683206d7770f5bdf + ], + x_I: [ + 0x0000000000000000000000000000000002f8146bf138cbc35aeeccd4570d121c, + 0x8aec29661e8108e4094dc37b5a499272a6a680f015d0527c312a82457db8b979 + ], + y: [ + 0x000000000000000000000000000000000f5357626a9be51a0e689244b1a28d7b, + 0xe6132ad16f8d1852c2c75804fccf473902a5b8bbe6dd182d04643f34bb34fbe6 + ], + y_I: [ + 0x000000000000000000000000000000000544d2c2834eebb7cfbd5498cc0c328b, + 0x619d482161808b7e27dbb92941df85f704a6218ce9903af72eabdb3dbead70c7 + ] + }); + + LibBLS12381.G1Point memory pubkey = LibBLS12381.G1Point({ + x: [ + 0x00000000000000000000000000000000101936a69d6fbd2feae29545220ad66e, + 0xb60c3171b8d15de582dd2c645f67cb32377de0c97666e4b4fc7fad8a1c9a81af + ], + y: [ + 0x00000000000000000000000000000000056cde7adcc8f412efa58ee343569d76, + 0xa95176133a52fbf43979f46c0658010c573c093f3814a5d4dded92b52d197dff + ] + }); + + /** + * Expected output using DST as empty string "": + * 0x0000000000000000000000000000000000000000000000000000000000000001 + */ + emit Output(LibBLSSignature.verifySignature("abc", sig, pubkey)); + } +} diff --git a/packages/protocol/test/layer1/preconf/fixtures/BeaconProofs.sol b/packages/protocol/test/layer1/preconf/fixtures/BeaconProofs.sol new file mode 100644 index 00000000000..e6ada1d91c3 --- /dev/null +++ b/packages/protocol/test/layer1/preconf/fixtures/BeaconProofs.sol @@ -0,0 +1,135 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "src/layer1/preconf/libs/LibEIP4788.sol"; + +/// @dev Data has been taken from beacon block at slot 9000000 on Ethereum mainnet +library BeaconProofs { + function validator() internal pure returns (bytes memory) { + return + hex"98fb8eacf684f80712faa9354535620f94a10687c2243c0cdae7280cf6220fb64c78e49efe8eef599406b33e5aac4dd0"; + } + + function validatorsRoot() internal pure returns (bytes32) { + return 0x0ccf56d8e76d16306c6e6e78ec20c07be5fa5ae89b18873b43cc823075a5df0b; + } + + function validatorIndex() internal pure returns (uint256) { + return 912_203; + } + + function beaconStateRoot() internal pure returns (bytes32) { + return 0xcd918afbe365c6dcabab551e32fae5f3f9677433876049dc035e5135122a2e7e; + } + + function beaconBlockRoot() internal pure returns (bytes32) { + return 0xcc8a36da0d5112c8dd602530ac7c7b8364edfd92cdc6f0d62365de392e8e5bb6; + } + + function validatorChunks() internal pure returns (bytes32[8] memory) { + bytes32[8] memory chunks; + chunks[0] = 0x8d7c2b324f41a1d395fc265d42c6e1293b38c33a674244cae9ac67d68367036d; + chunks[1] = 0x0100000000000000000000006661be71769ff00c5e403f327869505caf0b7f70; + chunks[2] = 0x0040597307000000000000000000000000000000000000000000000000000000; + chunks[3] = 0x0000000000000000000000000000000000000000000000000000000000000000; + chunks[4] = 0xe271030000000000000000000000000000000000000000000000000000000000; + chunks[5] = 0x6084030000000000000000000000000000000000000000000000000000000000; + chunks[6] = 0xffffffffffffffff000000000000000000000000000000000000000000000000; + chunks[7] = 0xffffffffffffffff000000000000000000000000000000000000000000000000; + + return chunks; + } + + function validatorProof() internal pure returns (bytes32[] memory) { + bytes32[] memory proof = new bytes32[](41); + proof[0] = 0xf5ee350215176477a7fb48aa80292de237856ad3068f46728da26aedca8a3b2b; + proof[1] = 0xfbeca4cff4f86c2ff5f1ff6808f57b12e7a6f3365d59a35c90f19715995f8be8; + proof[2] = 0x06ee0000b0cf0c0531c2a4f3368eb8df6079216bb6cca127a76e459c62058615; + proof[3] = 0x5b8c291888e7936b46e36d7b71d36c846fbfc04d48cab6beb20e23642f64ee69; + proof[4] = 0xa748ed979e88b53c303ece0946d13d2def12e003b90b562474dac1768d1d0975; + proof[5] = 0xe667bf725f0e72f47409d089248b50a9a11d08591b83374f18ed338f5c3ff964; + proof[6] = 0xd86b77a649fad1d48e109b8bc98d2a2dbc88a4b9b86c5e06878e0b980ebda3b7; + proof[7] = 0xc2db7c18d080f2b21f2c981f65414d00b0cc8542fda38233fa1c1ee33df4bbe1; + proof[8] = 0xe72e80d2ce704957f507af587e19a61ceadad2411c9728315e1f294fadae23f1; + proof[9] = 0x32f30ee3311d96e0544e2e4b0f4e1e1863d06224636ea8004e49a27280a81a11; + proof[10] = 0x89d191926d7681be7545b42b9ef95d413fbe1d8c014400c5ece8141be300b238; + proof[11] = 0x0c924ac306b692750b3285f974edf991dd4f05fff0ab3dd114430499722ff93b; + proof[12] = 0x1eb9a358bbe044159a2bed16a0b69b5b988ba0c57f2c267cfd390b3fb86fde6a; + proof[13] = 0xda60132f38fc053c26ba06136e03a861fd5e59734dc3e6cc1b69c072b9ce600a; + proof[14] = 0xcee182aa676671046ccf49213a58ef8d35e227a3adfaa146f7b71dc47c7bdd73; + proof[15] = 0xf1d0df094ceceed165886daf4c52c467710ed19a53df98ab2607629dbf7036ba; + proof[16] = 0x81917306117277e02aa4174ae73a2ec414862aced0491ec933434d9bd2279e3f; + proof[17] = 0xc562f7ffddaec138272a84b043216c1c906f68198f752ad6b80171794fcba3b5; + proof[18] = 0xcdfeaaff006b40d110ff925b18bffc36cf55543a35c84d25da0b196ea81c6029; + proof[19] = 0x8bd5e9cadc78cd0b0e0abd32a63a39596ad24e14552926bce0f6c54e39c29b99; + proof[20] = 0x6187b4f2f4b3e572fe26a6c73567ab5b1695303b0ad9dd5c9ab9679266fba2e3; + proof[21] = 0x8a8d7fe3af8caa085a7639a832001457dfb9128a8061142ad0335629ff23ff9c; + proof[22] = 0xfeb3c337d7a51a6fbf00b9e34c52e1c9195c969bd4e7a0bfd51d5c5bed9c1167; + proof[23] = 0xe71f0aa83cc32edfbefa9f4d3e0174ca85182eec9f3a09f6a6c0df6377a510d7; + proof[24] = 0x31206fa80a50bb6abe29085058f16212212a60eec8f049fecb92d8c8e0a84bc0; + proof[25] = 0x21352bfecbeddde993839f614c3dac0a3ee37543f9b412b16199dc158e23b544; + proof[26] = 0x619e312724bb6d7c3153ed9de791d764a366b389af13c58bf8a8d90481a46765; + proof[27] = 0x7cdd2986268250628d0c10e385c58c6191e6fbe05191bcc04f133f2cea72c1c4; + proof[28] = 0x848930bd7ba8cac54661072113fb278869e07bb8587f91392933374d017bcbe1; + proof[29] = 0x8869ff2c22b28cc10510d9853292803328be4fb0e80495e8bb8d271f5b889636; + proof[30] = 0xb5fe28e79f1b850f8658246ce9b6a1e7b49fc06db7143e8fe0b4f2b0c5523a5c; + proof[31] = 0x985e929f70af28d0bdd1a90a808f977f597c7c778c489e98d3bd8910d31ac0f7; + proof[32] = 0xc6f67e02e6e4e1bdefb994c6098953f34636ba2b6ca20a4721d2b26a886722ff; + proof[33] = 0x1c9a7e5ff1cf48b4ad1582d3f4e4a1004f3b20d8c5a2b71387a4254ad933ebc5; + proof[34] = 0x2f075ae229646b6f6aed19a5e372cf295081401eb893ff599b3f9acc0c0d3e7d; + proof[35] = 0x328921deb59612076801e8cd61592107b5c67c79b846595cc6320c395b46362c; + proof[36] = 0xbfb909fdb236ad2411b4e4883810a074b840464689986c3f8a8091827e17c327; + proof[37] = 0x55d8fb3687ba3ba49f342c77f5a1f89bec83d811446e1a467139213d640b6a74; + proof[38] = 0xf7210d4f8e7e1039790e7bf4efa207555a10a6db1dd4b95da313aaa88b88fe76; + proof[39] = 0xad21b516cbc645ffe34ab5de1c8aef8cd4e7f8d2b51e8e1456adc7563cda206f; + proof[40] = 0x2821150000000000000000000000000000000000000000000000000000000000; + + return proof; + } + + function beaconStateProofForValidatorList() internal pure returns (bytes32[] memory) { + bytes32[] memory proof = new bytes32[](5); + proof[0] = 0x8c53160000000000000000000000000000000000000000000000000000000000; + proof[1] = 0xd9cb62ffd113d2a2b71b4539c54bf01587d8a2a5a7c81baa2c2ae89d245578d6; + proof[2] = 0xefbad4c97640101fc18122e8b818e8cc3c278a18e05dc601af4095d5519d834a; + proof[3] = 0x775d61d75ab0731115447847764383a42283b502eb4ed3ca7ba412ac67da5138; + proof[4] = 0xbb5cf5c0273b8d100f329ea0c78c471d0833f048c7fc264c285c3696d7aed412; + + return proof; + } + + function beaconBlockProofForBeaconState() internal pure returns (bytes32[] memory) { + bytes32[] memory proof = new bytes32[](3); + proof[0] = 0xf47de6dfa04049ce0586d989821321111d896f3cc37e40637fc226bee212e43d; + proof[1] = 0x7506bc99ed6f0e48ad0e1ded3e878dfcfe08ca4a89308910ba1941e912673258; + proof[2] = 0x00f48b46fd6aac7f8a72d8e1eed4f3b5bd244bf6242cb538ca94b44aed02857a; + + return proof; + } + + function beaconBlockProofForProposer() internal pure returns (bytes32[] memory) { + bytes32[] memory proof = new bytes32[](3); + proof[0] = 0x4054890000000000000000000000000000000000000000000000000000000000; + proof[1] = 0xd22083672621f940e26b3f1e627f8c311a3f5f0874c193b40974f244668e1372; + proof[2] = 0x00f48b46fd6aac7f8a72d8e1eed4f3b5bd244bf6242cb538ca94b44aed02857a; + + return proof; + } + + function eip4788ValidatorInclusionProof() + internal + pure + returns (LibEIP4788.InclusionProof memory) + { + return LibEIP4788.InclusionProof({ + validator: validatorChunks(), + validatorIndex: validatorIndex(), + validatorProof: validatorProof(), + validatorsRoot: validatorsRoot(), + beaconStateProof: beaconStateProofForValidatorList(), + beaconStateRoot: beaconStateRoot(), + beaconBlockProofForState: beaconBlockProofForBeaconState(), + beaconBlockProofForProposerIndex: beaconBlockProofForProposer() + }); + } +} diff --git a/packages/protocol/test/layer1/preconf/fixtures/BlocksFixtures.sol b/packages/protocol/test/layer1/preconf/fixtures/BlocksFixtures.sol new file mode 100644 index 00000000000..291da5cb39b --- /dev/null +++ b/packages/protocol/test/layer1/preconf/fixtures/BlocksFixtures.sol @@ -0,0 +1,66 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "../BaseTest.sol"; +import "../mocks/MockPreconfRegistry.sol"; +import "../mocks/MockPreconfServiceManager.sol"; +import "../mocks/MockBeaconBlockRoot.sol"; +import "test/layer1/based/MockTaikoL1.sol"; + +import "src/layer1/preconf/impl/LibPreconfConstants.sol"; +import "src/layer1/preconf/impl/PreconfTaskManager.sol"; +import "src/layer1/preconf/iface/IPreconfRegistry.sol"; +import "src/layer1/preconf/iface/IPreconfServiceManager.sol"; +import "src/layer1/preconf/iface/IPreconfTaskManager.sol"; + +contract BlocksFixtures is BaseTest { + PreconfTaskManager internal preconfTaskManager; + MockPreconfRegistry internal preconfRegistry; + MockPreconfServiceManager internal preconfServiceManager; + MockBeaconBlockRoot internal beaconBlockRootContract; + MockTaikoL1 internal taikoL1; + + function setUp() public virtual { + preconfRegistry = new MockPreconfRegistry(); + preconfServiceManager = new MockPreconfServiceManager(); + beaconBlockRootContract = new MockBeaconBlockRoot(); + taikoL1 = new MockTaikoL1(); + + preconfTaskManager = new PreconfTaskManager( + IPreconfServiceManager(address(preconfServiceManager)), + IPreconfRegistry(address(preconfRegistry)), + ITaikoL1(taikoL1), + LibPreconfConstants.MAINNET_BEACON_GENESIS, + address(beaconBlockRootContract) + ); + } + + /// @dev Inserts two preconfers in the lookahead for the next epoch at the given slots. + function prepareLookahead(uint256 slot1, uint256 slot2) internal { + addPreconfersToRegistry(3); + + uint256 nextEpochStart = + LibPreconfConstants.MAINNET_BEACON_GENESIS + LibPreconfConstants.SECONDS_IN_EPOCH; + + IPreconfTaskManager.LookaheadSetParam[] memory lookaheadSetParams = + new IPreconfTaskManager.LookaheadSetParam[](2); + lookaheadSetParams[0] = IPreconfTaskManager.LookaheadSetParam({ + preconfer: addr_1, + timestamp: nextEpochStart + LibPreconfConstants.SECONDS_IN_SLOT * (slot1 - 1) + }); + lookaheadSetParams[1] = IPreconfTaskManager.LookaheadSetParam({ + preconfer: addr_3, + timestamp: nextEpochStart + LibPreconfConstants.SECONDS_IN_SLOT * (slot2 - 1) + }); + + vm.warp(LibPreconfConstants.MAINNET_BEACON_GENESIS + LibPreconfConstants.SECONDS_IN_SLOT); + vm.prank(addr_1); + preconfTaskManager.forcePushLookahead(lookaheadSetParams); + } + + function addPreconfersToRegistry(uint256 count) internal { + for (uint256 i = 1; i <= count; i++) { + preconfRegistry.registerPreconfer(vm.addr(i)); + } + } +} diff --git a/packages/protocol/test/layer1/preconf/fixtures/LookaheadFixtures.sol b/packages/protocol/test/layer1/preconf/fixtures/LookaheadFixtures.sol new file mode 100644 index 00000000000..d9e77fe34bc --- /dev/null +++ b/packages/protocol/test/layer1/preconf/fixtures/LookaheadFixtures.sol @@ -0,0 +1,53 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "test/layer1/based/MockTaikoL1.sol"; +import "src/layer1/preconf/impl/LibPreconfConstants.sol"; +import "src/layer1/preconf/impl/PreconfTaskManager.sol"; +import "src/layer1/preconf/iface/IPreconfRegistry.sol"; +import "src/layer1/preconf/iface/IPreconfServiceManager.sol"; + +import "../BaseTest.sol"; +import "../mocks/MockPreconfRegistry.sol"; +import "../mocks/MockPreconfServiceManager.sol"; +import "../mocks/MockBeaconBlockRoot.sol"; + +contract LookaheadFixtures is BaseTest { + PreconfTaskManager internal preconfTaskManager; + MockPreconfRegistry internal preconfRegistry; + MockPreconfServiceManager internal preconfServiceManager; + MockBeaconBlockRoot internal beaconBlockRootContract; + MockTaikoL1 internal taikoL1; + + function setUp() public virtual { + preconfRegistry = new MockPreconfRegistry(); + preconfServiceManager = new MockPreconfServiceManager(); + beaconBlockRootContract = new MockBeaconBlockRoot(); + taikoL1 = new MockTaikoL1(); + + preconfTaskManager = new PreconfTaskManager( + IPreconfServiceManager(address(preconfServiceManager)), + IPreconfRegistry(address(preconfRegistry)), + ITaikoL1(taikoL1), + LibPreconfConstants.MAINNET_BEACON_GENESIS, + address(beaconBlockRootContract) + ); + } + + function addPreconfersToRegistry(uint256 count) internal { + for (uint256 i = 1; i <= count; i++) { + preconfRegistry.registerPreconfer(vm.addr(i)); + } + } + + function computeFallbackPreconfer( + bytes32 randomness, + uint256 nextPreconferIndex + ) + internal + pure + returns (address) + { + return vm.addr(uint256(randomness) % (nextPreconferIndex - 1) + 1); + } +} diff --git a/packages/protocol/test/layer1/preconf/lookahead/IncorrectLookahead.t.sol b/packages/protocol/test/layer1/preconf/lookahead/IncorrectLookahead.t.sol new file mode 100644 index 00000000000..46ff9691ec7 --- /dev/null +++ b/packages/protocol/test/layer1/preconf/lookahead/IncorrectLookahead.t.sol @@ -0,0 +1,661 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "../fixtures/BeaconProofs.sol"; +import "../fixtures/LookaheadFixtures.sol"; + +import "src/layer1/preconf/impl/LibPreconfConstants.sol"; +import "src/layer1/preconf/iface/IPreconfTaskManager.sol"; + +/// @dev The beacon chain data used here is from slot 9000000 on Ethereum mainnet. +contract IncorrectLookahead is LookaheadFixtures { + // Most tests in this file use a lookahead that has a preconfer (addr_1) set at slot 16 in epoch + // 2. + // Epoch 1 starts at the genesis timestamp. + uint256 internal nextEpochStart = + LibPreconfConstants.MAINNET_BEACON_GENESIS + LibPreconfConstants.SECONDS_IN_EPOCH; + uint256 internal slot16Timestamp = nextEpochStart + (15 * LibPreconfConstants.SECONDS_IN_SLOT); + + function setUp() public override { + super.setUp(); + } + + function test_proveIncorrectLookahead_slashesPosterWhenLookaheadEntryIsIncorrect_Case1() + external + { + addPreconfersToRegistry(10); + // addr_1 posts lookahead for next epoch + postLookahead(); + + // We wrap to a timestamp in next to next epoch because invalidating the lookahead of an + // ongoing epoch + // sets a random preconfer for the epoch which is not intended for this test. + uint256 nextEpochEnd = + LibPreconfConstants.MAINNET_BEACON_GENESIS + (2 * LibPreconfConstants.SECONDS_IN_EPOCH); + vm.warp(nextEpochEnd + (3 * LibPreconfConstants.SECONDS_IN_SLOT)); + + // This beacon proposer is not added as a validator for our preconfer in lookahead + bytes memory beaconProposer = BeaconProofs.validator(); + + // Prove the lookahead to be incorrect + preconfTaskManager.proveIncorrectLookahead( + 2, slot16Timestamp, beaconProposer, BeaconProofs.eip4788ValidatorInclusionProof() + ); + + // Verify that storage has been updated + assertEq( + preconfTaskManager.getLookaheadPoster( + LibPreconfConstants.MAINNET_BEACON_GENESIS + LibPreconfConstants.SECONDS_IN_EPOCH + ), + address(0) + ); + + // Poster i.e addr_1 must be slashed + assertTrue(preconfServiceManager.operatorSlashed(addr_1)); + } + + function test_proveIncorrectLookahead_slashesPosterWhenLookaheadEntryIsIncorrect_Case2() + external + { + addPreconfersToRegistry(10); + // addr_1 posts lookahead for next epoch + postLookahead(); + + // We wrap to a timestamp in next to next epoch because invalidating the lookahead of an + // ongoing epoch + // sets a random preconfer for the epoch which is not intended for this test. + uint256 nextEpochEnd = + LibPreconfConstants.MAINNET_BEACON_GENESIS + (2 * LibPreconfConstants.SECONDS_IN_EPOCH); + vm.warp(nextEpochEnd + (3 * LibPreconfConstants.SECONDS_IN_SLOT)); + + // The beacon proposer is added for the preconfer, but is not allowed to propose at slot 16 + bytes memory beaconProposer = BeaconProofs.validator(); + preconfRegistry.addValidator( + beaconProposer, addr_1, slot16Timestamp + LibPreconfConstants.SECONDS_IN_SLOT, 0 + ); + + // Prove the lookahead to be incorrect + preconfTaskManager.proveIncorrectLookahead( + 2, slot16Timestamp, beaconProposer, BeaconProofs.eip4788ValidatorInclusionProof() + ); + + // Verify that storage has been updated + assertEq( + preconfTaskManager.getLookaheadPoster( + LibPreconfConstants.MAINNET_BEACON_GENESIS + LibPreconfConstants.SECONDS_IN_EPOCH + ), + address(0) + ); + + // Poster i.e addr_1 must be slashed + assertTrue(preconfServiceManager.operatorSlashed(addr_1)); + } + + function test_proveIncorrectLookahead_slashesPosterWhenLookaheadEntryIsIncorrect_Case3() + external + { + addPreconfersToRegistry(10); + // addr_1 posts lookahead for next epoch + postLookahead(); + + // We wrap to a timestamp in next to next epoch because invalidating the lookahead of an + // ongoing epoch + // sets a random preconfer for the epoch which is not intended for this test. + uint256 nextEpochEnd = + LibPreconfConstants.MAINNET_BEACON_GENESIS + (2 * LibPreconfConstants.SECONDS_IN_EPOCH); + vm.warp(nextEpochEnd + (3 * LibPreconfConstants.SECONDS_IN_SLOT)); + + // The beacon proposer is added for the preconfer, but is has lost proposal rights at slot + // 16 + bytes memory beaconProposer = BeaconProofs.validator(); + preconfRegistry.addValidator( + beaconProposer, addr_1, LibPreconfConstants.MAINNET_BEACON_GENESIS, slot16Timestamp + ); + + // Prove the lookahead to be incorrect + preconfTaskManager.proveIncorrectLookahead( + 2, slot16Timestamp, beaconProposer, BeaconProofs.eip4788ValidatorInclusionProof() + ); + + // Verify that storage has been updated + assertEq( + preconfTaskManager.getLookaheadPoster( + LibPreconfConstants.MAINNET_BEACON_GENESIS + LibPreconfConstants.SECONDS_IN_EPOCH + ), + address(0) + ); + + // Poster i.e addr_1 must be slashed + assertTrue(preconfServiceManager.operatorSlashed(addr_1)); + } + + function test_proveIncorrectLookahead_slashesPosterWhenLookaheadEntryIsIncorrect_Case4() + external + { + addPreconfersToRegistry(10); + // addr_1 posts lookahead for next epoch + postLookahead(); + + // We wrap to a timestamp in next to next epoch because invalidating the lookahead of an + // ongoing epoch + // sets a random preconfer for the epoch which is not intended for this test. + uint256 nextEpochEnd = + LibPreconfConstants.MAINNET_BEACON_GENESIS + (2 * LibPreconfConstants.SECONDS_IN_EPOCH); + vm.warp(nextEpochEnd + (3 * LibPreconfConstants.SECONDS_IN_SLOT)); + + // The beacon proposer is added for the preconfer, but is has lost proposal rights before + // slot 16 + bytes memory beaconProposer = BeaconProofs.validator(); + preconfRegistry.addValidator( + beaconProposer, + addr_1, + LibPreconfConstants.MAINNET_BEACON_GENESIS, + slot16Timestamp - LibPreconfConstants.SECONDS_IN_SLOT + ); + + // Prove the lookahead to be incorrect + preconfTaskManager.proveIncorrectLookahead( + 2, slot16Timestamp, beaconProposer, BeaconProofs.eip4788ValidatorInclusionProof() + ); + + // Verify that storage has been updated + assertEq( + preconfTaskManager.getLookaheadPoster( + LibPreconfConstants.MAINNET_BEACON_GENESIS + LibPreconfConstants.SECONDS_IN_EPOCH + ), + address(0) + ); + + // Poster i.e addr_1 must be slashed + assertTrue(preconfServiceManager.operatorSlashed(addr_1)); + } + + function test_proveIncorrectLookahead_slashesPosterWhenLookaheadEntryIsIncorrect_Case5() + external + { + addPreconfersToRegistry(10); + // addr_1 posts lookahead for next epoch + postLookahead(); + + // We wrap to a timestamp in next to next epoch because invalidating the lookahead of an + // ongoing epoch + // sets a random preconfer for the epoch which is not intended for this test. + uint256 nextEpochEnd = + LibPreconfConstants.MAINNET_BEACON_GENESIS + (2 * LibPreconfConstants.SECONDS_IN_EPOCH); + vm.warp(nextEpochEnd + (3 * LibPreconfConstants.SECONDS_IN_SLOT)); + + // The beacon proposer belongs to another preconfer + bytes memory beaconProposer = BeaconProofs.validator(); + preconfRegistry.addValidator( + beaconProposer, addr_2, LibPreconfConstants.MAINNET_BEACON_GENESIS, 0 + ); + + // Prove the lookahead to be incorrect + preconfTaskManager.proveIncorrectLookahead( + 2, slot16Timestamp, beaconProposer, BeaconProofs.eip4788ValidatorInclusionProof() + ); + + // Verify that storage has been updated + assertEq( + preconfTaskManager.getLookaheadPoster( + LibPreconfConstants.MAINNET_BEACON_GENESIS + LibPreconfConstants.SECONDS_IN_EPOCH + ), + address(0) + ); + + // Poster i.e addr_1 must be slashed + assertTrue(preconfServiceManager.operatorSlashed(addr_1)); + } + + function test_proveIncorrectLookahead_slashesPosterWhenLookaheadEntryIsIncorrect_Case6() + external + { + addPreconfersToRegistry(10); + // addr_1 posts lookahead for next epoch + postLookahead(); + + // We wrap to a timestamp in next to next epoch because invalidating the lookahead of an + // ongoing epoch + // sets a random preconfer for the epoch which is not intended for this test. + uint256 nextEpochEnd = + LibPreconfConstants.MAINNET_BEACON_GENESIS + (2 * LibPreconfConstants.SECONDS_IN_EPOCH); + vm.warp(nextEpochEnd + (3 * LibPreconfConstants.SECONDS_IN_SLOT)); + + // Take a slot for which their is no dedicated lookahead entry and set it's beacon block + // root + // containing a proposer mapped to a valid preconfer + uint256 slot15Timestamp = slot16Timestamp - LibPreconfConstants.SECONDS_IN_SLOT; + beaconBlockRootContract.set(slot16Timestamp, BeaconProofs.beaconBlockRoot()); + + // The beacon proposer belongs to a valid preconfer who is not in the lookahead at slot 15 + bytes memory beaconProposer = BeaconProofs.validator(); + preconfRegistry.addValidator( + beaconProposer, addr_2, LibPreconfConstants.MAINNET_BEACON_GENESIS, 0 + ); + + // Prove the lookahead to be incorrect + preconfTaskManager.proveIncorrectLookahead( + 2, slot15Timestamp, beaconProposer, BeaconProofs.eip4788ValidatorInclusionProof() + ); + + // Verify that storage has been updated + assertEq( + preconfTaskManager.getLookaheadPoster( + LibPreconfConstants.MAINNET_BEACON_GENESIS + LibPreconfConstants.SECONDS_IN_EPOCH + ), + address(0) + ); + + // Poster i.e addr_1 must be slashed + assertTrue(preconfServiceManager.operatorSlashed(addr_1)); + } + + function test_proveIncorrectLookahead_slashesPosterWhenLookaheadEntryIsIncorrect_Case7() + external + { + addPreconfersToRegistry(10); + // addr_1 posts empty lookahead for next epoch to set fallback preconfer + postEmptyLookahead(); + + // We wrap to a timestamp in next to next epoch because invalidating the lookahead of an + // ongoing epoch + // sets a random preconfer for the epoch which is not intended for this test. + uint256 nextEpochEnd = + LibPreconfConstants.MAINNET_BEACON_GENESIS + (2 * LibPreconfConstants.SECONDS_IN_EPOCH); + vm.warp(nextEpochEnd + (3 * LibPreconfConstants.SECONDS_IN_SLOT)); + + // Take the last slot in the lookahead with the fallback preconfer and set it's beacon block + // root + // containing a proposer mapped to an active preconfer + beaconBlockRootContract.set(nextEpochEnd, BeaconProofs.beaconBlockRoot()); + + // The beacon proposer belongs to a valid preconfer who is not in the lookahead at slot 32 + // as the lookahead has the fallback preconfer + bytes memory beaconProposer = BeaconProofs.validator(); + preconfRegistry.addValidator( + beaconProposer, addr_2, LibPreconfConstants.MAINNET_BEACON_GENESIS, 0 + ); + + // Prove the lookahead to be incorrect + preconfTaskManager.proveIncorrectLookahead( + 1, + nextEpochEnd - LibPreconfConstants.SECONDS_IN_SLOT, + beaconProposer, + BeaconProofs.eip4788ValidatorInclusionProof() + ); + + // Verify that storage has been updated + assertEq( + preconfTaskManager.getLookaheadPoster( + LibPreconfConstants.MAINNET_BEACON_GENESIS + LibPreconfConstants.SECONDS_IN_EPOCH + ), + address(0) + ); + + // Poster i.e addr_1 must be slashed + assertTrue(preconfServiceManager.operatorSlashed(addr_1)); + } + + function test_proveIncorrectLookahead_setsFallbackPreconfer_Case1() external { + addPreconfersToRegistry(10); + // addr_1 posts lookahead for next epoch + postLookahead(); + + // We wrap to an arbitrary timestamp after the incorrect slot in the next epoch + vm.warp(slot16Timestamp + (2 * LibPreconfConstants.SECONDS_IN_SLOT)); + + // This beacon proposer is not added as a validator for our preconfer in lookahead + bytes memory beaconProposer = BeaconProofs.validator(); + + bytes32 randomness = bytes32(uint256(4)); + + // Set beacon block root such that addr_4 is randomly selected + beaconBlockRootContract.set( + LibPreconfConstants.MAINNET_BEACON_GENESIS + LibPreconfConstants.SECONDS_IN_SLOT, + randomness + ); + + // Prove the lookahead to be incorrect + preconfTaskManager.proveIncorrectLookahead( + 2, slot16Timestamp, beaconProposer, BeaconProofs.eip4788ValidatorInclusionProof() + ); + + uint256 lastSlotTimestamp = nextEpochStart + LibPreconfConstants.SECONDS_IN_EPOCH + - LibPreconfConstants.SECONDS_IN_SLOT; + + // Verify that the lookahead has the fallback preconfer + IPreconfTaskManager.LookaheadBufferEntry[128] memory lookaheadBuffer = + preconfTaskManager.getLookaheadBuffer(); + assertEq( + lookaheadBuffer[3].preconfer, + computeFallbackPreconfer(randomness, preconfRegistry.getNextPreconferIndex()) + ); + assertEq(lookaheadBuffer[3].timestamp, lastSlotTimestamp); + assertEq( + lookaheadBuffer[3].prevTimestamp, nextEpochStart - LibPreconfConstants.SECONDS_IN_SLOT + ); + assertEq(lookaheadBuffer[3].isFallback, true); + + // Verify that the remaining entries for the epoch have been removed + assertEq(lookaheadBuffer[2].preconfer, address(0)); + assertEq(lookaheadBuffer[2].timestamp, 0); + assertEq(lookaheadBuffer[2].prevTimestamp, 0); + assertEq(lookaheadBuffer[2].isFallback, false); + + assertEq(lookaheadBuffer[1].preconfer, address(0)); + assertEq(lookaheadBuffer[1].timestamp, 0); + assertEq(lookaheadBuffer[1].prevTimestamp, 0); + assertEq(lookaheadBuffer[1].isFallback, false); + } + + function test_proveIncorrectLookahead_setsFallbackPreconfer_Case2() external { + addPreconfersToRegistry(10); + // addr_1 posts lookahead for next epoch + postLookahead(); + + // We wrap to an arbitrary timestamp after the incorrect slot in the next epoch + vm.warp(slot16Timestamp + (2 * LibPreconfConstants.SECONDS_IN_SLOT)); + + // Force push lookahead for next epoch + // This to ensure if the first entry in the following epoch connects correctly to the newly + // inserted + // fallback preconfer + IPreconfTaskManager.LookaheadSetParam[] memory lookaheadSetParams = + new IPreconfTaskManager.LookaheadSetParam[](2); + + uint256 nextToNextEpochStart = nextEpochStart + LibPreconfConstants.SECONDS_IN_EPOCH; + + // Slot 13 + lookaheadSetParams[0] = IPreconfTaskManager.LookaheadSetParam({ + preconfer: addr_1, + timestamp: nextToNextEpochStart + (12 * LibPreconfConstants.SECONDS_IN_SLOT) + }); + // Slot 22 + lookaheadSetParams[1] = IPreconfTaskManager.LookaheadSetParam({ + preconfer: addr_2, + timestamp: nextToNextEpochStart + (21 * LibPreconfConstants.SECONDS_IN_SLOT) + }); + + // Address 1 pushes the lookahead + vm.prank(addr_1); + preconfTaskManager.forcePushLookahead(lookaheadSetParams); + + // This beacon proposer is not added as a validator for our preconfer in lookahead + bytes memory beaconProposer = BeaconProofs.validator(); + + bytes32 randomness = bytes32(uint256(4)); + + // Set beacon block root such that addr_4 is randomly selected + beaconBlockRootContract.set( + LibPreconfConstants.MAINNET_BEACON_GENESIS + LibPreconfConstants.SECONDS_IN_SLOT, + randomness + ); + + // Prove the lookahead to be incorrect + preconfTaskManager.proveIncorrectLookahead( + 2, slot16Timestamp, beaconProposer, BeaconProofs.eip4788ValidatorInclusionProof() + ); + + uint256 lastSlotTimestamp = nextEpochStart + LibPreconfConstants.SECONDS_IN_EPOCH + - LibPreconfConstants.SECONDS_IN_SLOT; + + // Verify that the lookahead has the fallback preconfer + IPreconfTaskManager.LookaheadBufferEntry[128] memory lookaheadBuffer = + preconfTaskManager.getLookaheadBuffer(); + assertEq( + lookaheadBuffer[3].preconfer, + computeFallbackPreconfer(randomness, preconfRegistry.getNextPreconferIndex()) + ); + assertEq(lookaheadBuffer[3].timestamp, lastSlotTimestamp); + assertEq( + lookaheadBuffer[3].prevTimestamp, nextEpochStart - LibPreconfConstants.SECONDS_IN_SLOT + ); + assertEq(lookaheadBuffer[3].isFallback, true); + + // Verify that the remaining entries for the epoch have been removed + assertEq(lookaheadBuffer[2].preconfer, address(0)); + assertEq(lookaheadBuffer[2].timestamp, 0); + assertEq(lookaheadBuffer[2].prevTimestamp, 0); + assertEq(lookaheadBuffer[2].isFallback, false); + + assertEq(lookaheadBuffer[1].preconfer, address(0)); + assertEq(lookaheadBuffer[1].timestamp, 0); + assertEq(lookaheadBuffer[1].prevTimestamp, 0); + assertEq(lookaheadBuffer[1].isFallback, false); + + // Verify that the first entry in the following epoch is connected to the fallback preconfer + assertEq(lookaheadBuffer[4].preconfer, addr_1); + assertEq( + lookaheadBuffer[4].timestamp, + nextToNextEpochStart + (12 * LibPreconfConstants.SECONDS_IN_SLOT) + ); + assertEq(lookaheadBuffer[4].prevTimestamp, lastSlotTimestamp); + assertEq(lookaheadBuffer[4].isFallback, false); + } + + function test_proveIncorrectLookahead_revertsWhenPosterIsAlreadySlashedOrLookaheadIsEmpty() + external + { + addPreconfersToRegistry(10); + // addr_1 posts lookahead for next epoch + postLookahead(); + + // Reverts when the timestamp belongs to an epoch that does not have a lookahead yet + vm.expectRevert(IPreconfTaskManager.PosterAlreadySlashedOrLookaheadIsEmpty.selector); + preconfTaskManager.proveIncorrectLookahead( + 2, + // Epoch does not have a poster yet + LibPreconfConstants.MAINNET_BEACON_GENESIS + (4 * LibPreconfConstants.SECONDS_IN_EPOCH), + BeaconProofs.validator(), + BeaconProofs.eip4788ValidatorInclusionProof() + ); + } + + function test_proveIncorrectLookahead_revertsWhenDisputeWindowIsMissed() external { + addPreconfersToRegistry(10); + // addr_1 posts lookahead for next epoch + postLookahead(); + + // Wrap into the future when the dispute window is missed + vm.warp( + slot16Timestamp + LibPreconfConstants.DISPUTE_PERIOD + + LibPreconfConstants.SECONDS_IN_SLOT + ); + + // Reverts when the dispute period is over + vm.expectRevert(IPreconfTaskManager.MissedDisputeWindow.selector); + preconfTaskManager.proveIncorrectLookahead( + 2, + slot16Timestamp, + BeaconProofs.validator(), + BeaconProofs.eip4788ValidatorInclusionProof() + ); + } + + function test_proveIncorrectLookahead_revertsWhenLookaheadPointerIsInvalid_Case1() external { + addPreconfersToRegistry(10); + // addr_1 posts lookahead for next epoch + postLookahead(); + + // We wrap to a timestamp in next to next epoch because invalidating the lookahead of an + // ongoing epoch + // sets a random preconfer for the epoch which is not intended for this test. + uint256 nextEpochEnd = + LibPreconfConstants.MAINNET_BEACON_GENESIS + (2 * LibPreconfConstants.SECONDS_IN_EPOCH); + vm.warp(nextEpochEnd + (3 * LibPreconfConstants.SECONDS_IN_SLOT)); + + // Reverts because the pointer is in the past and slot timestamp in future + vm.expectRevert(IPreconfTaskManager.InvalidLookaheadPointer.selector); + preconfTaskManager.proveIncorrectLookahead( + 1, + slot16Timestamp, + BeaconProofs.validator(), + BeaconProofs.eip4788ValidatorInclusionProof() + ); + } + + function test_proveIncorrectLookahead_revertsWhenLookaheadPointerIsInvalid_Case2() external { + addPreconfersToRegistry(10); + // addr_1 posts lookahead for next epoch + postLookahead(); + + // We wrap to a timestamp in next to next epoch because invalidating the lookahead of an + // ongoing epoch + // sets a random preconfer for the epoch which is not intended for this test. + uint256 nextEpochEnd = + LibPreconfConstants.MAINNET_BEACON_GENESIS + (2 * LibPreconfConstants.SECONDS_IN_EPOCH); + vm.warp(nextEpochEnd + (3 * LibPreconfConstants.SECONDS_IN_SLOT)); + + // Reverts because the pointer is in the future (slotTimestamp == pointer.prevTimestamp) + vm.expectRevert(IPreconfTaskManager.InvalidLookaheadPointer.selector); + preconfTaskManager.proveIncorrectLookahead( + 3, + slot16Timestamp, + BeaconProofs.validator(), + BeaconProofs.eip4788ValidatorInclusionProof() + ); + } + + function test_proveIncorrectLookahead_revertsWhenLookaheadPointerIsInvalid_Case3() external { + addPreconfersToRegistry(10); + // addr_1 posts lookahead for next epoch + postLookahead(); + + // Wrap to arbitrary timestamp in next epoch + vm.warp(slot16Timestamp + (2 * LibPreconfConstants.SECONDS_IN_SLOT)); + + // Push a lookahead for the following epoch + // This will enable simulating the condition slotTimestamp < pointer.prevTimestamps + IPreconfTaskManager.LookaheadSetParam[] memory lookaheadSetParams = + new IPreconfTaskManager.LookaheadSetParam[](1); + uint256 nextToNextEpochStart = nextEpochStart + LibPreconfConstants.SECONDS_IN_EPOCH; + // Slot 13 + lookaheadSetParams[0] = IPreconfTaskManager.LookaheadSetParam({ + preconfer: addr_1, + timestamp: nextToNextEpochStart + (12 * LibPreconfConstants.SECONDS_IN_SLOT) + }); + + // Address 1 pushes the lookahead + vm.prank(addr_1); + preconfTaskManager.forcePushLookahead(lookaheadSetParams); + + // Reverts because the pointer is in the future (slotTimestamp < pointer.prevTimestamp) + vm.expectRevert(IPreconfTaskManager.InvalidLookaheadPointer.selector); + preconfTaskManager.proveIncorrectLookahead( + 4, + slot16Timestamp, + BeaconProofs.validator(), + BeaconProofs.eip4788ValidatorInclusionProof() + ); + } + + function test_proveIncorrectLookahead_revertsWhenLookaheadEntryIsCorrect() external { + addPreconfersToRegistry(10); + // addr_1 posts lookahead for next epoch + // Sets slot 16 to its own address + postLookahead(); + + // We wrap to a timestamp in next to next epoch because invalidating the lookahead of an + // ongoing epoch + // sets a random preconfer for the epoch which is not intended for this test. + uint256 nextEpochEnd = + LibPreconfConstants.MAINNET_BEACON_GENESIS + (2 * LibPreconfConstants.SECONDS_IN_EPOCH); + vm.warp(nextEpochEnd + (3 * LibPreconfConstants.SECONDS_IN_SLOT)); + + // Add the validator for addr_1 in registry + // This is also the proposer for the beacon block whose root we have stored (see + // `postLookahead()`) + bytes memory beaconProposer = BeaconProofs.validator(); + preconfRegistry.addValidator( + beaconProposer, addr_1, LibPreconfConstants.MAINNET_BEACON_GENESIS, 0 + ); + + // Reverts when the lookahead is tried to be proven incorrect + vm.expectRevert(IPreconfTaskManager.LookaheadEntryIsCorrect.selector); + preconfTaskManager.proveIncorrectLookahead( + 2, slot16Timestamp, beaconProposer, BeaconProofs.eip4788ValidatorInclusionProof() + ); + } + + function test_proveIncorrectLookahead_emitsProvedIncorrectLookaheadEvent() external { + addPreconfersToRegistry(10); + // addr_1 posts lookahead for next epoch + postLookahead(); + + // We wrap to a timestamp in next to next epoch because invalidating the lookahead of an + // ongoing epoch + // sets a random preconfer for the epoch which is not intended for this test. + uint256 nextEpochEnd = + LibPreconfConstants.MAINNET_BEACON_GENESIS + (2 * LibPreconfConstants.SECONDS_IN_EPOCH); + vm.warp(nextEpochEnd + (3 * LibPreconfConstants.SECONDS_IN_SLOT)); + + // This beacon proposer is not added as a validator for our preconfer in lookahead + bytes memory beaconProposer = BeaconProofs.validator(); + + // Prove the lookahead to be incorrect + vm.expectEmit(); + emit IPreconfTaskManager.ProvedIncorrectLookahead(addr_1, slot16Timestamp, address(this)); + + preconfTaskManager.proveIncorrectLookahead( + 2, slot16Timestamp, beaconProposer, BeaconProofs.eip4788ValidatorInclusionProof() + ); + } + + //========= + // Helpers + //========= + + /// @dev Makes addr_1 push a fixed lookeahead + function postLookahead() internal { + // Arbitrary slot in current epoch + uint256 currentSlotTimestamp = + LibPreconfConstants.MAINNET_BEACON_GENESIS + 2 * LibPreconfConstants.SECONDS_IN_SLOT; + vm.warp(currentSlotTimestamp); + + IPreconfTaskManager.LookaheadSetParam[] memory lookaheadSetParams = + new IPreconfTaskManager.LookaheadSetParam[](3); + + // Slot 5 + lookaheadSetParams[0] = IPreconfTaskManager.LookaheadSetParam({ + preconfer: addr_2, + timestamp: nextEpochStart + (4 * LibPreconfConstants.SECONDS_IN_SLOT) + }); + // Slot 16 (Slot used for fault proofs) + lookaheadSetParams[1] = + IPreconfTaskManager.LookaheadSetParam({ preconfer: addr_1, timestamp: slot16Timestamp }); + // Slot 25 + lookaheadSetParams[2] = IPreconfTaskManager.LookaheadSetParam({ + preconfer: addr_3, + timestamp: nextEpochStart + (24 * LibPreconfConstants.SECONDS_IN_SLOT) + }); + + // Address 1 pushes the lookahead + vm.prank(addr_1); + preconfTaskManager.forcePushLookahead(lookaheadSetParams); + + // Set the beacon block root for slot 16 (in the timestamp of slot 17) + beaconBlockRootContract.set( + slot16Timestamp + LibPreconfConstants.SECONDS_IN_SLOT, BeaconProofs.beaconBlockRoot() + ); + } + + /// @dev Makes addr_1 push an empty lookeahead + function postEmptyLookahead() internal { + // Arbitrary slot in current epoch + uint256 currentSlotTimestamp = + LibPreconfConstants.MAINNET_BEACON_GENESIS + 2 * LibPreconfConstants.SECONDS_IN_SLOT; + vm.warp(currentSlotTimestamp); + + IPreconfTaskManager.LookaheadSetParam[] memory lookaheadSetParams = + new IPreconfTaskManager.LookaheadSetParam[](0); + + beaconBlockRootContract.set( + LibPreconfConstants.MAINNET_BEACON_GENESIS + LibPreconfConstants.SECONDS_IN_SLOT, + bytes32(uint256(4)) + ); + + // Address 1 pushes the lookahead + vm.prank(addr_1); + preconfTaskManager.forcePushLookahead(lookaheadSetParams); + } +} diff --git a/packages/protocol/test/layer1/preconf/lookahead/LookaheadPosting.t.sol b/packages/protocol/test/layer1/preconf/lookahead/LookaheadPosting.t.sol new file mode 100644 index 00000000000..cbee4ba898c --- /dev/null +++ b/packages/protocol/test/layer1/preconf/lookahead/LookaheadPosting.t.sol @@ -0,0 +1,428 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "../fixtures/LookaheadFixtures.sol"; + +import "src/layer1/preconf/impl/LibPreconfConstants.sol"; +import "src/layer1/preconf/iface/IPreconfTaskManager.sol"; + +contract LookaheadPosting is LookaheadFixtures { + function setUp() public override { + super.setUp(); + } + + function test_forcePushLookahead_setsNonEmptyLookaheadInNextEpoch_Case1() external { + addPreconfersToRegistry(5); + + // Arbitrary slot in current epoch + uint256 currentSlotTimestamp = + LibPreconfConstants.MAINNET_BEACON_GENESIS + 2 * LibPreconfConstants.SECONDS_IN_SLOT; + vm.warp(currentSlotTimestamp); + + uint256 nextEpochStart = + LibPreconfConstants.MAINNET_BEACON_GENESIS + LibPreconfConstants.SECONDS_IN_EPOCH; + + IPreconfTaskManager.LookaheadSetParam[] memory lookaheadSetParams = + new IPreconfTaskManager.LookaheadSetParam[](1); + + // Slot 1 + lookaheadSetParams[0] = + IPreconfTaskManager.LookaheadSetParam({ preconfer: addr_1, timestamp: nextEpochStart }); + + // Address 1 pushes the lookahead + vm.prank(addr_1); + preconfTaskManager.forcePushLookahead(lookaheadSetParams); + + // Verify storage is updated correctly + uint256 lookaheadTail = preconfTaskManager.getLookaheadTail(); + assertEq(lookaheadTail, 1); + + IPreconfTaskManager.LookaheadBufferEntry[128] memory lookaheadBuffer = + preconfTaskManager.getLookaheadBuffer(); + assertEq(lookaheadBuffer[1].preconfer, addr_1); + assertEq(lookaheadBuffer[1].timestamp, nextEpochStart); + assertEq(lookaheadBuffer[1].prevTimestamp, 0); + assertEq(lookaheadBuffer[1].isFallback, false); + + assertEq(preconfTaskManager.getLookaheadPoster(nextEpochStart), addr_1); + } + + function test_forcePushLookahead_setsNonEmptyLookaheadInNextEpoch_Case2() external { + addPreconfersToRegistry(7); + + // Arbitrary slot in current epoch + uint256 currentSlotTimestamp = + LibPreconfConstants.MAINNET_BEACON_GENESIS + 2 * LibPreconfConstants.SECONDS_IN_SLOT; + vm.warp(currentSlotTimestamp); + + uint256 nextEpochStart = + LibPreconfConstants.MAINNET_BEACON_GENESIS + LibPreconfConstants.SECONDS_IN_EPOCH; + uint256 slot20Timestamp = nextEpochStart + (19 * LibPreconfConstants.SECONDS_IN_SLOT); + + IPreconfTaskManager.LookaheadSetParam[] memory lookaheadSetParams = + new IPreconfTaskManager.LookaheadSetParam[](2); + + // Slot 1 + lookaheadSetParams[0] = + IPreconfTaskManager.LookaheadSetParam({ preconfer: addr_1, timestamp: nextEpochStart }); + // Slot 20 + lookaheadSetParams[1] = + IPreconfTaskManager.LookaheadSetParam({ preconfer: addr_3, timestamp: slot20Timestamp }); + + // Address 3 pushes the lookahead + vm.prank(addr_3); + preconfTaskManager.forcePushLookahead(lookaheadSetParams); + + // Storage is updated correctly + uint256 lookaheadTail = preconfTaskManager.getLookaheadTail(); + assertEq(lookaheadTail, 2); + + IPreconfTaskManager.LookaheadBufferEntry[128] memory lookaheadBuffer = + preconfTaskManager.getLookaheadBuffer(); + assertEq(lookaheadBuffer[1].preconfer, addr_1); + assertEq(lookaheadBuffer[1].timestamp, nextEpochStart); + assertEq(lookaheadBuffer[1].prevTimestamp, 0); + assertEq(lookaheadBuffer[1].isFallback, false); + + assertEq(lookaheadBuffer[2].preconfer, addr_3); + assertEq(lookaheadBuffer[2].timestamp, slot20Timestamp); + assertEq(lookaheadBuffer[2].prevTimestamp, nextEpochStart); + assertEq(lookaheadBuffer[2].isFallback, false); + + assertEq(preconfTaskManager.getLookaheadPoster(nextEpochStart), addr_3); + } + + function test_forcePushLookahead_setsNonEmptyLookaheadInNextEpoch_Case3() external { + addPreconfersToRegistry(10); + + // Arbitrary slot in current epoch + uint256 currentSlotTimestamp = + LibPreconfConstants.MAINNET_BEACON_GENESIS + 2 * LibPreconfConstants.SECONDS_IN_SLOT; + vm.warp(currentSlotTimestamp); + + uint256 nextEpochStart = + LibPreconfConstants.MAINNET_BEACON_GENESIS + LibPreconfConstants.SECONDS_IN_EPOCH; + uint256 slot14Timestamp = nextEpochStart + (13 * LibPreconfConstants.SECONDS_IN_SLOT); + uint256 slot31Timestamp = nextEpochStart + (30 * LibPreconfConstants.SECONDS_IN_SLOT); + + IPreconfTaskManager.LookaheadSetParam[] memory lookaheadSetParams = + new IPreconfTaskManager.LookaheadSetParam[](3); + + // Slot 1 + lookaheadSetParams[0] = + IPreconfTaskManager.LookaheadSetParam({ preconfer: addr_1, timestamp: nextEpochStart }); + // Slot 14 + lookaheadSetParams[1] = + IPreconfTaskManager.LookaheadSetParam({ preconfer: addr_2, timestamp: slot14Timestamp }); + // Slot 31 + lookaheadSetParams[2] = + IPreconfTaskManager.LookaheadSetParam({ preconfer: addr_5, timestamp: slot31Timestamp }); + + // Address 2 pushes the lookahead + vm.prank(addr_2); + preconfTaskManager.forcePushLookahead(lookaheadSetParams); + + // Storage is updated correctly + uint256 lookaheadTail = preconfTaskManager.getLookaheadTail(); + assertEq(lookaheadTail, 3); + + IPreconfTaskManager.LookaheadBufferEntry[128] memory lookaheadBuffer = + preconfTaskManager.getLookaheadBuffer(); + assertEq(lookaheadBuffer[1].preconfer, addr_1); + assertEq(lookaheadBuffer[1].timestamp, nextEpochStart); + assertEq(lookaheadBuffer[1].prevTimestamp, 0); + assertEq(lookaheadBuffer[1].isFallback, false); + + assertEq(lookaheadBuffer[2].preconfer, addr_2); + assertEq(lookaheadBuffer[2].timestamp, slot14Timestamp); + assertEq(lookaheadBuffer[2].prevTimestamp, nextEpochStart); + assertEq(lookaheadBuffer[2].isFallback, false); + + assertEq(lookaheadBuffer[3].preconfer, addr_5); + assertEq(lookaheadBuffer[3].timestamp, slot31Timestamp); + assertEq(lookaheadBuffer[3].prevTimestamp, slot14Timestamp); + assertEq(lookaheadBuffer[3].isFallback, false); + + assertEq(preconfTaskManager.getLookaheadPoster(nextEpochStart), addr_2); + } + + function test_forcePushLookahead_setsFallbackPreconfer_Case1() external { + addPreconfersToRegistry(10); + + // Arbitrary slot in the current epoch + uint256 currentSlotTimestamp = + LibPreconfConstants.MAINNET_BEACON_GENESIS + 2 * LibPreconfConstants.SECONDS_IN_SLOT; + vm.warp(currentSlotTimestamp); + + uint256 nextEpochStart = + LibPreconfConstants.MAINNET_BEACON_GENESIS + LibPreconfConstants.SECONDS_IN_EPOCH; + uint256 lastSlotTimestampInNextEpoch = nextEpochStart + LibPreconfConstants.SECONDS_IN_EPOCH + - LibPreconfConstants.SECONDS_IN_SLOT; + + // Create an empty lookahead set + IPreconfTaskManager.LookaheadSetParam[] memory emptyLookaheadSetParams = + new IPreconfTaskManager.LookaheadSetParam[](0); + + bytes32 randomness = bytes32(uint256(4)); + + // Push a required root to the mock beacon block root contract + // This root as a source of randomness selects the preconfer with index 4 + beaconBlockRootContract.set( + LibPreconfConstants.MAINNET_BEACON_GENESIS + LibPreconfConstants.SECONDS_IN_SLOT, + randomness + ); + + // Address 2 pushes the empty lookahead + vm.prank(addr_2); + preconfTaskManager.forcePushLookahead(emptyLookaheadSetParams); + + // Verify that the lookahead is empty + uint256 lookaheadTail = preconfTaskManager.getLookaheadTail(); + assertEq(lookaheadTail, 1); + + // Verify that correct preconfer is inserted as fallback in lookahead buffer + IPreconfTaskManager.LookaheadBufferEntry[128] memory lookaheadBuffer = + preconfTaskManager.getLookaheadBuffer(); + assertEq( + lookaheadBuffer[1].preconfer, + computeFallbackPreconfer(randomness, preconfRegistry.getNextPreconferIndex()) + ); + assertEq(lookaheadBuffer[1].timestamp, lastSlotTimestampInNextEpoch); + assertEq(lookaheadBuffer[1].prevTimestamp, 0); + assertEq(lookaheadBuffer[1].isFallback, true); + + // Verify that the lookahead poster is set correctly + assertEq(preconfTaskManager.getLookaheadPoster(nextEpochStart), addr_2); + } + + function test_forcePushLookahead_setsFallbackPreconfer_Case2() external { + addPreconfersToRegistry(10); + + // Arbitrary slot in the current epoch + uint256 currentSlotTimestamp = + LibPreconfConstants.MAINNET_BEACON_GENESIS + 2 * LibPreconfConstants.SECONDS_IN_SLOT; + vm.warp(currentSlotTimestamp); + + uint256 nextEpochStart = + LibPreconfConstants.MAINNET_BEACON_GENESIS + LibPreconfConstants.SECONDS_IN_EPOCH; + uint256 lastSlotTimestampInNextEpoch = nextEpochStart + LibPreconfConstants.SECONDS_IN_EPOCH + - LibPreconfConstants.SECONDS_IN_SLOT; + + // Create an empty lookahead set + IPreconfTaskManager.LookaheadSetParam[] memory emptyLookaheadSetParams = + new IPreconfTaskManager.LookaheadSetParam[](0); + + bytes32 randomness = bytes32(uint256(4)); + + // Unlike Case 1, we push the root at a later timestamp to simulate "skipped blocks" and see + // if the contract iterates forward and finds the required root + beaconBlockRootContract.set( + LibPreconfConstants.MAINNET_BEACON_GENESIS + 3 * LibPreconfConstants.SECONDS_IN_SLOT, + randomness + ); + + // Address 2 pushes the empty lookahead + vm.prank(addr_2); + preconfTaskManager.forcePushLookahead(emptyLookaheadSetParams); + + // Verify that the lookahead is empty + uint256 lookaheadTail = preconfTaskManager.getLookaheadTail(); + assertEq(lookaheadTail, 1); + + // Verify that correct preconfer is inserted as fallback in lookahead buffer + IPreconfTaskManager.LookaheadBufferEntry[128] memory lookaheadBuffer = + preconfTaskManager.getLookaheadBuffer(); + assertEq( + lookaheadBuffer[1].preconfer, + computeFallbackPreconfer(randomness, preconfRegistry.getNextPreconferIndex()) + ); + assertEq(lookaheadBuffer[1].timestamp, lastSlotTimestampInNextEpoch); + assertEq(lookaheadBuffer[1].prevTimestamp, 0); + assertEq(lookaheadBuffer[1].isFallback, true); + + // Verify that the lookahead poster is set correctly + assertEq(preconfTaskManager.getLookaheadPoster(nextEpochStart), addr_2); + } + + function test_forcePushLookahead_revertsWhenPreconferNotRegistered_Case1() external { + // Add addr_1 through addr_5 to the registry + addPreconfersToRegistry(5); + + IPreconfTaskManager.LookaheadSetParam[] memory emptyLookaheadSetParams = + new IPreconfTaskManager.LookaheadSetParam[](0); + + // Transaction is expected to revert as addr_6 is not registered in the preconfer registry + vm.prank(addr_6); + vm.expectRevert(IPreconfTaskManager.PreconferNotRegistered.selector); + preconfTaskManager.forcePushLookahead(emptyLookaheadSetParams); + } + + function test_forcePushLookahead_revertsWhenPreconferNotRegistered_Case2() external { + // Add addr_1 through addr_5 to the registry + addPreconfersToRegistry(5); + + // Arbitrary slot in the current epoch + uint256 currentSlotTimestamp = + LibPreconfConstants.MAINNET_BEACON_GENESIS + 2 * LibPreconfConstants.SECONDS_IN_SLOT; + vm.warp(currentSlotTimestamp); + + uint256 nextEpochStart = + LibPreconfConstants.MAINNET_BEACON_GENESIS + LibPreconfConstants.SECONDS_IN_EPOCH; + + // Create a lookahead set with an unregistered preconfer (addr_6) + IPreconfTaskManager.LookaheadSetParam[] memory lookaheadSetParams = + new IPreconfTaskManager.LookaheadSetParam[](1); + lookaheadSetParams[0] = IPreconfTaskManager.LookaheadSetParam({ + timestamp: nextEpochStart + LibPreconfConstants.SECONDS_IN_SLOT, + preconfer: addr_6 // addr_6 is not registered + }); + + // Transaction is expected to revert as addr_6 is not registered in the preconfer registry + vm.prank(addr_1); + vm.expectRevert(IPreconfTaskManager.PreconferNotRegistered.selector); + preconfTaskManager.forcePushLookahead(lookaheadSetParams); + } + + function test_forcePushLookahead_revertsWhenLookaheadIsNotRequired() external { + // Add addr_1 through addr_5 to the registry + addPreconfersToRegistry(5); + + // Arbitrary slot in the current epoch + uint256 currentSlotTimestamp = + LibPreconfConstants.MAINNET_BEACON_GENESIS + 2 * LibPreconfConstants.SECONDS_IN_SLOT; + vm.warp(currentSlotTimestamp); + + uint256 nextEpochStart = + LibPreconfConstants.MAINNET_BEACON_GENESIS + LibPreconfConstants.SECONDS_IN_EPOCH; + + // Create a valid lookahead set + IPreconfTaskManager.LookaheadSetParam[] memory lookaheadSetParams = + new IPreconfTaskManager.LookaheadSetParam[](1); + lookaheadSetParams[0] = IPreconfTaskManager.LookaheadSetParam({ + timestamp: nextEpochStart + LibPreconfConstants.SECONDS_IN_SLOT, + preconfer: addr_1 + }); + + // First push should succeed + vm.prank(addr_1); + preconfTaskManager.forcePushLookahead(lookaheadSetParams); + + // Verify that the lookahead poster is set correctly + assertEq(preconfTaskManager.getLookaheadPoster(nextEpochStart), addr_1); + + // Attempt to push the lookahead again fails + vm.prank(addr_2); + vm.expectRevert(IPreconfTaskManager.LookaheadIsNotRequired.selector); + preconfTaskManager.forcePushLookahead(lookaheadSetParams); + } + + function test_forcePushLookahead_revertsWhenInvalidSlotTimestamp_notMultipleOf12() external { + // Add addr_1 to the registry + addPreconfersToRegistry(1); + + uint256 currentSlotTimestamp = + LibPreconfConstants.MAINNET_BEACON_GENESIS + 2 * LibPreconfConstants.SECONDS_IN_SLOT; + vm.warp(currentSlotTimestamp); + + uint256 nextEpochStart = + LibPreconfConstants.MAINNET_BEACON_GENESIS + LibPreconfConstants.SECONDS_IN_EPOCH; + + // Create a lookahead set with an invalid timestamp (not a multiple of 12 seconds from epoch + // start) + IPreconfTaskManager.LookaheadSetParam[] memory lookaheadSetParams = + new IPreconfTaskManager.LookaheadSetParam[](1); + lookaheadSetParams[0] = IPreconfTaskManager.LookaheadSetParam({ + timestamp: nextEpochStart + 5, // Not a multiple of 12 + preconfer: addr_1 + }); + + vm.prank(addr_1); + vm.expectRevert(IPreconfTaskManager.InvalidSlotTimestamp.selector); + preconfTaskManager.forcePushLookahead(lookaheadSetParams); + } + + function test_forcePushLookahead_revertsWhenInvalidSlotTimestamp_exceedsEpochEnd() external { + // Add addr_1 to the registry + addPreconfersToRegistry(1); + + uint256 currentSlotTimestamp = + LibPreconfConstants.MAINNET_BEACON_GENESIS + 2 * LibPreconfConstants.SECONDS_IN_SLOT; + vm.warp(currentSlotTimestamp); + + uint256 nextEpochStart = + LibPreconfConstants.MAINNET_BEACON_GENESIS + LibPreconfConstants.SECONDS_IN_EPOCH; + + // Create a lookahead set with a timestamp that exceeds the epoch end + IPreconfTaskManager.LookaheadSetParam[] memory lookaheadSetParams = + new IPreconfTaskManager.LookaheadSetParam[](1); + lookaheadSetParams[0] = IPreconfTaskManager.LookaheadSetParam({ + timestamp: nextEpochStart + LibPreconfConstants.SECONDS_IN_EPOCH, // Exactly one epoch + // later, which is the start of the next epoch + preconfer: addr_1 + }); + + vm.prank(addr_1); + vm.expectRevert(IPreconfTaskManager.InvalidSlotTimestamp.selector); + preconfTaskManager.forcePushLookahead(lookaheadSetParams); + } + + function test_forcePushLookahead_revertsWhenInvalidSlotTimestamp_notGreaterThanPrevious() + external + { + // Add addr_1 and addr_2 to the registry + addPreconfersToRegistry(2); + + uint256 currentSlotTimestamp = + LibPreconfConstants.MAINNET_BEACON_GENESIS + 2 * LibPreconfConstants.SECONDS_IN_SLOT; + vm.warp(currentSlotTimestamp); + + uint256 nextEpochStart = + LibPreconfConstants.MAINNET_BEACON_GENESIS + LibPreconfConstants.SECONDS_IN_EPOCH; + + // Create a lookahead set with timestamps in the wrong order + IPreconfTaskManager.LookaheadSetParam[] memory lookaheadSetParams = + new IPreconfTaskManager.LookaheadSetParam[](2); + lookaheadSetParams[0] = IPreconfTaskManager.LookaheadSetParam({ + timestamp: nextEpochStart + 2 * LibPreconfConstants.SECONDS_IN_SLOT, + preconfer: addr_1 + }); + lookaheadSetParams[1] = IPreconfTaskManager.LookaheadSetParam({ + timestamp: nextEpochStart + LibPreconfConstants.SECONDS_IN_SLOT, // Earlier than the + // previous timestamp + preconfer: addr_2 + }); + + vm.prank(addr_1); + vm.expectRevert(IPreconfTaskManager.InvalidSlotTimestamp.selector); + preconfTaskManager.forcePushLookahead(lookaheadSetParams); + } + + function test_forcePushLookahead_emitsLookaheadUpdatedEvent() external { + // Add addr_1 and addr_2 to the registry + addPreconfersToRegistry(2); + + uint256 currentSlotTimestamp = + LibPreconfConstants.MAINNET_BEACON_GENESIS + 2 * LibPreconfConstants.SECONDS_IN_SLOT; + vm.warp(currentSlotTimestamp); + + uint256 nextEpochStart = + LibPreconfConstants.MAINNET_BEACON_GENESIS + LibPreconfConstants.SECONDS_IN_EPOCH; + + // Create a valid lookahead set + IPreconfTaskManager.LookaheadSetParam[] memory lookaheadSetParams = + new IPreconfTaskManager.LookaheadSetParam[](2); + lookaheadSetParams[0] = IPreconfTaskManager.LookaheadSetParam({ + timestamp: nextEpochStart + LibPreconfConstants.SECONDS_IN_SLOT, + preconfer: addr_1 + }); + lookaheadSetParams[1] = IPreconfTaskManager.LookaheadSetParam({ + timestamp: nextEpochStart + 2 * LibPreconfConstants.SECONDS_IN_SLOT, + preconfer: addr_2 + }); + + vm.prank(addr_1); + vm.expectEmit(); + emit IPreconfTaskManager.LookaheadUpdated(lookaheadSetParams); + preconfTaskManager.forcePushLookahead(lookaheadSetParams); + } +} diff --git a/packages/protocol/test/layer1/preconf/mocks/MockBeaconBlockRoot.sol b/packages/protocol/test/layer1/preconf/mocks/MockBeaconBlockRoot.sol new file mode 100644 index 00000000000..35f3caba2db --- /dev/null +++ b/packages/protocol/test/layer1/preconf/mocks/MockBeaconBlockRoot.sol @@ -0,0 +1,18 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +contract MockBeaconBlockRoot { + mapping(uint256 => bytes32) internal blockRoots; + + function set(uint256 timestamp, bytes32 root) external { + blockRoots[timestamp] = root; + } + + fallback(bytes calldata data) external payable returns (bytes memory) { + bytes32 root = blockRoots[abi.decode(data, (uint256))]; + require(root != bytes32(0), "no root"); + return abi.encode(root); + } + + receive() external payable { } +} diff --git a/packages/protocol/test/layer1/preconf/mocks/MockPreconfRegistry.sol b/packages/protocol/test/layer1/preconf/mocks/MockPreconfRegistry.sol new file mode 100644 index 00000000000..d28561a6fb6 --- /dev/null +++ b/packages/protocol/test/layer1/preconf/mocks/MockPreconfRegistry.sol @@ -0,0 +1,55 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +contract MockPreconfRegistry { + struct Validator { + address preconfer; + uint40 startProposingAt; + uint40 stopProposingAt; + } + + mapping(address preconfer => uint256 index) internal preconferToIndex; + mapping(uint256 index => address preconfer) internal indexToPreconfer; + mapping(bytes32 pubKeyhash => Validator validator) internal validators; + + uint256 internal nextPreconferIndex = 1; + + function registerPreconfer(address preconfer) external { + uint256 _nextPreconferIndex = nextPreconferIndex; + + preconferToIndex[preconfer] = _nextPreconferIndex; + indexToPreconfer[_nextPreconferIndex] = preconfer; + + unchecked { + nextPreconferIndex = _nextPreconferIndex + 1; + } + } + + function addValidator( + bytes memory pubKey, + address preconfer, + uint256 startProposingAt, + uint256 stopProposingAt + ) + external + { + bytes32 key = keccak256(abi.encodePacked(bytes16(0), pubKey)); + validators[key] = Validator(preconfer, uint40(startProposingAt), uint40(stopProposingAt)); + } + + function getNextPreconferIndex() external view returns (uint256) { + return nextPreconferIndex; + } + + function getPreconferIndex(address preconfer) external view returns (uint256) { + return preconferToIndex[preconfer]; + } + + function getPreconferAtIndex(uint256 index) external view returns (address) { + return indexToPreconfer[index]; + } + + function getValidator(bytes32 pubKeyHash) external view returns (Validator memory) { + return validators[pubKeyHash]; + } +} diff --git a/packages/protocol/test/layer1/preconf/mocks/MockPreconfServiceManager.sol b/packages/protocol/test/layer1/preconf/mocks/MockPreconfServiceManager.sol new file mode 100644 index 00000000000..c46ea65303b --- /dev/null +++ b/packages/protocol/test/layer1/preconf/mocks/MockPreconfServiceManager.sol @@ -0,0 +1,15 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +contract MockPreconfServiceManager { + mapping(address => uint256) public stakeLockTimestamps; + mapping(address => bool) public operatorSlashed; + + function lockStakeUntil(address operator, uint256 timestamp) external { + stakeLockTimestamps[operator] = timestamp; + } + + function slashOperator(address operator) external { + operatorSlashed[operator] = true; + } +} diff --git a/packages/protocol/test/team/airdrop/ERC20Airdrop.t.sol b/packages/protocol/test/layer1/team/airdrop/ERC20Airdrop.t.sol similarity index 98% rename from packages/protocol/test/team/airdrop/ERC20Airdrop.t.sol rename to packages/protocol/test/layer1/team/airdrop/ERC20Airdrop.t.sol index ac33e319356..b96d8454d30 100644 --- a/packages/protocol/test/team/airdrop/ERC20Airdrop.t.sol +++ b/packages/protocol/test/layer1/team/airdrop/ERC20Airdrop.t.sol @@ -1,8 +1,8 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; -import "../../TaikoTest.sol"; import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; +import "../../TaikoL1Test.sol"; contract MockERC20Airdrop is ERC20Airdrop { function _verifyMerkleProof( diff --git a/packages/protocol/test/team/airdrop/MerkleClaimable.t.sol b/packages/protocol/test/layer1/team/airdrop/MerkleClaimable.t.sol similarity index 98% rename from packages/protocol/test/team/airdrop/MerkleClaimable.t.sol rename to packages/protocol/test/layer1/team/airdrop/MerkleClaimable.t.sol index 5e29afceec9..613a34637ce 100644 --- a/packages/protocol/test/team/airdrop/MerkleClaimable.t.sol +++ b/packages/protocol/test/layer1/team/airdrop/MerkleClaimable.t.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; -import "../../TaikoTest.sol"; +import "../../TaikoL1Test.sol"; contract MockMerkleClaimable is MerkleClaimable { function init(uint64 _claimStart, uint64 _claimEnd, bytes32 _merkleRoot) external initializer { diff --git a/packages/protocol/test/team/tokenunlock/TokenUnlock.t.sol b/packages/protocol/test/layer1/team/tokenunlock/TokenUnlock.t.sol similarity index 98% rename from packages/protocol/test/team/tokenunlock/TokenUnlock.t.sol rename to packages/protocol/test/layer1/team/tokenunlock/TokenUnlock.t.sol index 8a2ed61964a..1bac31403c8 100644 --- a/packages/protocol/test/team/tokenunlock/TokenUnlock.t.sol +++ b/packages/protocol/test/layer1/team/tokenunlock/TokenUnlock.t.sol @@ -1,9 +1,9 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol"; -import "../../TaikoTest.sol"; -import "../../../contracts/team/tokenunlock/TokenUnlock.sol"; +import "src/layer1/team/tokenunlock/TokenUnlock.sol"; +import "test/shared/TaikoTest.sol"; contract MyERC20 is ERC20, ERC20Votes { constructor(address owner) ERC20("Taiko Token", "TKO") ERC20Permit("Taiko Token") { @@ -48,6 +48,7 @@ contract TestTokenUnlock is TaikoTest { }) ); + addressManager.setAddress(uint64(block.chainid), "bond_token", address(tko)); addressManager.setAddress(uint64(block.chainid), "taiko_token", address(tko)); addressManager.setAddress(uint64(block.chainid), "assignment_hook", assignmentHook); addressManager.setAddress(uint64(block.chainid), "taiko", taikoL1); diff --git a/packages/protocol/test/mocks/MockPlonkVerifier.sol b/packages/protocol/test/layer1/verifiers/MockPlonkVerifier.sol similarity index 84% rename from packages/protocol/test/mocks/MockPlonkVerifier.sol rename to packages/protocol/test/layer1/verifiers/MockPlonkVerifier.sol index 4065fbdb22f..9ff78e24627 100644 --- a/packages/protocol/test/mocks/MockPlonkVerifier.sol +++ b/packages/protocol/test/layer1/verifiers/MockPlonkVerifier.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; -import "../../contracts/thirdparty/optimism/Bytes.sol"; +import "@optimism/packages/contracts-bedrock/src/libraries/Bytes.sol"; /// @author Kirk Baird contract MockPlonkVerifier { diff --git a/packages/protocol/test/verifiers/RiscZeroVerifier.t.sol b/packages/protocol/test/layer1/verifiers/Risc0Verifier.t.sol similarity index 81% rename from packages/protocol/test/verifiers/RiscZeroVerifier.t.sol rename to packages/protocol/test/layer1/verifiers/Risc0Verifier.t.sol index 75eb16dd2d0..fcb63f057e7 100644 --- a/packages/protocol/test/verifiers/RiscZeroVerifier.t.sol +++ b/packages/protocol/test/layer1/verifiers/Risc0Verifier.t.sol @@ -1,9 +1,9 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; -import "../L1/TaikoL1TestBase.sol"; +import "../based/TaikoL1TestBase.sol"; -contract MockRiscZeroRemoteVerifier is IRiscZeroReceiptVerifier { +contract MockRisc0RemoteVerifier is IRiscZeroVerifier { // To simulate failing and succeeding bool public verifying; @@ -14,19 +14,21 @@ contract MockRiscZeroRemoteVerifier is IRiscZeroReceiptVerifier { function verify( bytes calldata, /*seal*/ bytes32, /*imageId*/ - bytes32, /*postStateDigest*/ bytes32 /*journalDigest*/ ) external view - returns (bool) { - return verifying; + require(verifying, "RiscZeroRemoteVerifier: invalid proof"); + } + + function verifyIntegrity(Receipt calldata /*receipt*/ ) external view { + require(verifying, "RiscZeroRemoteVerifier: invalid integrity"); } } contract TestRiscZeroVerifier is TaikoL1TestBase { - MockRiscZeroRemoteVerifier riscZeroRemoteVerifier; + MockRisc0RemoteVerifier riscZeroRemoteVerifier; function deployTaikoL1() internal override returns (TaikoL1) { return @@ -37,18 +39,17 @@ contract TestRiscZeroVerifier is TaikoL1TestBase { // Call the TaikoL1TestBase setUp() super.setUp(); - riscZeroRemoteVerifier = new MockRiscZeroRemoteVerifier(); + riscZeroRemoteVerifier = new MockRisc0RemoteVerifier(); riscZeroRemoteVerifier.setVerifier(true); + registerAddress("risc0_groth16_verifier", address(riscZeroRemoteVerifier)); + // Deploy Taiko's RiscZero proof verifier - rv = RiscZeroVerifier( + rv = Risc0Verifier( deployProxy({ - name: "tier_risc_zero", - impl: address(new RiscZeroVerifier()), - data: abi.encodeCall( - RiscZeroVerifier.init, - (address(0), address(addressManager), address(riscZeroRemoteVerifier)) - ) + name: "tier_zkvm_risc0", + impl: address(new Risc0Verifier()), + data: abi.encodeCall(Risc0Verifier.init, (address(0), address(addressManager))) }) ); @@ -104,7 +105,7 @@ contract TestRiscZeroVerifier is TaikoL1TestBase { (IVerifier.Context memory ctx, TaikoData.Transition memory transition) = _getDummyContextAndTransition(); - vm.expectRevert(RiscZeroVerifier.RISC_ZERO_INVALID_IMAGE_ID.selector); + vm.expectRevert(Risc0Verifier.RISC_ZERO_INVALID_BLOCK_PROOF_IMAGE_ID.selector); rv.verifyProof(ctx, transition, proof); vm.stopPrank(); @@ -120,18 +121,17 @@ contract TestRiscZeroVerifier is TaikoL1TestBase { bytes memory seal = hex"00"; bytes32 imageId = bytes32("11"); - bytes32 postStateDigest = bytes32("22"); // TierProof TaikoData.TierProof memory proof = - TaikoData.TierProof({ tier: 100, data: abi.encode(seal, imageId, postStateDigest) }); + TaikoData.TierProof({ tier: 100, data: abi.encode(seal, imageId) }); vm.warp(block.timestamp + 5); (IVerifier.Context memory ctx, TaikoData.Transition memory transition) = _getDummyContextAndTransition(); - vm.expectRevert(RiscZeroVerifier.RISC_ZERO_INVALID_PROOF.selector); + vm.expectRevert(Risc0Verifier.RISC_ZERO_INVALID_PROOF.selector); rv.verifyProof(ctx, transition, proof); vm.stopPrank(); diff --git a/packages/protocol/test/layer1/verifiers/RiscZeroGroth16Verifier.t.sol b/packages/protocol/test/layer1/verifiers/RiscZeroGroth16Verifier.t.sol new file mode 100644 index 00000000000..fabebf4101a --- /dev/null +++ b/packages/protocol/test/layer1/verifiers/RiscZeroGroth16Verifier.t.sol @@ -0,0 +1,160 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "@risc0/contracts/groth16/RiscZeroGroth16Verifier.sol"; +import "@risc0/contracts/groth16/ControlID.sol"; +import "../based/TaikoL1TestBase.sol"; + +contract RiscZeroGroth16VerifierTest is TaikoL1TestBase { + function deployTaikoL1() internal override returns (TaikoL1) { + return + TaikoL1(payable(deployProxy({ name: "taiko", impl: address(new TaikoL1()), data: "" }))); + } + + function setUp() public override { + vm.startPrank(Emma); + // Call the TaikoL1TestBase setUp() + super.setUp(); + + RiscZeroGroth16Verifier verifier = + new RiscZeroGroth16Verifier(ControlID.CONTROL_ROOT, ControlID.BN254_CONTROL_ID); + console2.log("Deployed RiscZeroGroth16Verifier to", address(verifier)); + registerAddress("risc0_groth16_verifier", address(verifier)); + + // Deploy Taiko's RiscZero proof verifier + rv = Risc0Verifier( + deployProxy({ + name: "tier_zkvm_risc0", + impl: address(new Risc0Verifier()), + data: abi.encodeCall(Risc0Verifier.init, (address(0), address(addressManager))) + }) + ); + + rv.setImageIdTrusted( + bytes32(0x7669d1059d0dfa9537c2b3581569b8bc244495e6c406d07dea628bc8cf480392), true + ); + } + + // Test `verifyProof()` happy path + function test_risc0_groth16_verifyProof() external { + vm.stopPrank(); + + // Caller not necessary has to be TaikoL1 contract because there is no keys (as in SGX keys) + // to be front run. + vm.startPrank(Emma); + + bytes memory seal = + hex"50bd1769220929ac1ac3f9d3a8a4e7f4bcec136f8ea44be5a7248785d83b13879b409b762480f0ca5f38b164091e2def50b35829e453d1418492c01cc1b924e851580fe208d3808a925ce28724f0a862b944074f5277c4bd4b3153c1a1ff87056740628008fcc8d7edef53215db823e4773334e6f5fe08fed84c7ebd005fe4f42b80891724044cadde535253739049d99abc1a91a4a987ad93b0fcedbdb2440c9c2d662101509acb5f869bdb2e15d2609aa1a6c6c1a5a83e04fb2f77d25163b5675351be2204a497f20d43277d211adcc66b730b5d8d7635bb4a456cbf9029904ef2493a0346cd8e1aa2c270a160bc28bca77336bf18fe91b9dc8790a15f1618188dafa9"; + bytes32 imageId = + bytes32(0x7669d1059d0dfa9537c2b3581569b8bc244495e6c406d07dea628bc8cf480392); + bytes32 journalDigest = + bytes32(0xa82287ae36a69b51f8013851b3814ff1243da5dfa071f6fd9b46b85445895553); + + // TierProof + TaikoData.TierProof memory proof = + TaikoData.TierProof({ tier: 100, data: abi.encode(seal, imageId) }); + + vm.warp(block.timestamp + 5); + + (IVerifier.Context memory ctx, TaikoData.Transition memory transition) = + _generateTaikoMainnetContextAndTransition(); + + uint64 chainId = L1.getConfig().chainId; + bytes32 pi = LibPublicInput.hashPublicInputs( + transition, address(rv), address(0), ctx.prover, ctx.metaHash, chainId + ); + bytes memory header = hex"20000000"; // [32, 0, 0, 0] -- big-endian uint32(32) for hash + // bytes len + assert(sha256(bytes.concat(header, pi)) == journalDigest); + + // `verifyProof()` + rv.verifyProof(ctx, transition, proof); + + vm.stopPrank(); + } + + function _generateTaikoMainnetContextAndTransition() + internal + pure + returns (IVerifier.Context memory ctx, TaikoData.Transition memory transition) + { + // Context + ctx = IVerifier.Context({ + metaHash: bytes32(0xd7efb262f6f25cc817452a622009a22e5868e53e1f934d899d3ec68d8c4f2c5b), + blobHash: bytes32(0x015cc9688f24b8d2195e46829b3f726ce006884d5fd2760b7cf414bab9a1b231), + prover: address(0x70997970C51812dc3A010C7d01b50e0d17dc79C8), + msgSender: address(0), + blockId: 223_248, //from mainnet + isContesting: false, + blobUsed: true + }); + + // Transition + transition = TaikoData.Transition({ + parentHash: 0x317de24b32f09629524133334ad552a14e3de603d71a9cf9e88d722809f101b3, + blockHash: 0x9966d3cf051d3d1e44e2a740169627506a619257c95374e812ca572de91ed885, + stateRoot: 0x3ae3de1afa16b93a5c7ea20a0b36b43357061f5b8ef857053d68b2735c3df860, + graffiti: 0x8008500000000000000000000000000000000000000000000000000000000000 + }); + } + + function test_risc0_verifyBatchProof() public { + vm.startPrank(Emma); + + bytes32 aggProofImageId = 0x8e192ebe6872b47645367692838b2d697c467f5e4543d605b0ef7d10365fb11a; + bytes32 blkProofImageId = 0x7669d1059d0dfa9537c2b3581569b8bc244495e6c406d07dea628bc8cf480392; + + // proof generation elf + rv.setImageIdTrusted(aggProofImageId, true); + // proof aggregation elf + rv.setImageIdTrusted(blkProofImageId, true); + + vm.startPrank(address(L1)); + + // Context + IVerifier.ContextV2[] memory ctxs = new IVerifier.ContextV2[](2); + ctxs[0] = IVerifier.ContextV2({ + metaHash: 0x207b2833fb6d804612da24d8785b870a19c7a3f25fa4aaeb9799cd442d65b031, + blobHash: 0x01354e8725e60ad91b32ec4ab19158572a0a5b06b2d4d83f6269c9a7d068f49b, + prover: 0x70997970C51812dc3A010C7d01b50e0d17dc79C8, + msgSender: 0x70997970C51812dc3A010C7d01b50e0d17dc79C8, + blockId: 393_333, + isContesting: false, + blobUsed: true, + tran: TaikoData.Transition({ + parentHash: 0xce519622a374dc014c005d7857de26d952751a9067d3e23ffe14da247aa8a399, + blockHash: 0x941d557653da2214cbf3d30af8d9cadbc7b5f77b6c3e48bca548eba04eb9cd79, + stateRoot: 0x4203a2fd98d268d272acb24d91e25055a779b443ff3e732f2cee7abcf639b5e9, + graffiti: 0x8008500000000000000000000000000000000000000000000000000000000000 + }) + }); + ctxs[1] = IVerifier.ContextV2({ + metaHash: 0x946ba1a9c02fc2f01da49e31cb5be83c118193d0389987c6be616ce76426b44d, + blobHash: 0x01abac8c1fb54f87ff7b0cbf14259b9d5ee7a8de458c587dd6eda43ef8354b4f, + prover: 0x70997970C51812dc3A010C7d01b50e0d17dc79C8, + msgSender: 0x70997970C51812dc3A010C7d01b50e0d17dc79C8, + blockId: 393_334, + isContesting: false, + blobUsed: true, + tran: TaikoData.Transition({ + parentHash: 0x941d557653da2214cbf3d30af8d9cadbc7b5f77b6c3e48bca548eba04eb9cd79, + blockHash: 0xc0dad38646ab264be30995b7b7fd02db65e7115126fb52bfad94c0fc9572287c, + stateRoot: 0x222061caab95b6bd0f8dd398088030979efbe56e282cd566f7abd77838558eb9, + graffiti: 0x8008500000000000000000000000000000000000000000000000000000000000 + }) + }); + + bytes memory seal = + hex"50bd176901a68e3f05b0e651b6e5ff18e5463be794699597908b42b9ac3195a464c2b67320fb89c8199909a5ef1ff32366d1047009f4758294090f4ce613129f64a9ff58109cf0f6cb0f22e194dab522a2938631b138f4afeb075117a05d1ad75093515e15de11d9b231b79be5d42b0c7921ba22d62a6594258745f3e5c2e10508741fd813581ea8fab28ee1d07cb1f2e84500e2993cff3ca2e37284cfb5cfec5fe301d92f4246b2dbffc17d2ef5d889f50b8f28c51d1bacd6b0c55399e574969bb0a77207ceda541460cfec3e0c315889d62c0c91c5cf0cecd515ada96712735e5cf0ea1664af11012004ba7cb6adea3751911c8afe5eb5979b1adf43da6f9c18837f3d"; + // TierProof + TaikoData.TierProof memory proof = TaikoData.TierProof({ + tier: 100, + data: abi.encode(seal, blkProofImageId, aggProofImageId) + }); + + // `verifyProof()` + rv.verifyBatchProof(ctxs, proof); + + vm.stopPrank(); + } +} diff --git a/packages/protocol/test/layer1/verifiers/SP1PlonkVerifier.t.sol b/packages/protocol/test/layer1/verifiers/SP1PlonkVerifier.t.sol new file mode 100644 index 00000000000..9291354fb43 --- /dev/null +++ b/packages/protocol/test/layer1/verifiers/SP1PlonkVerifier.t.sol @@ -0,0 +1,159 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import { SP1Verifier as SuccinctVerifier } from "@sp1-contracts/src/v3.0.0/SP1VerifierPlonk.sol"; +import "../based/TaikoL1TestBase.sol"; + +contract SuccinctVerifierTest is TaikoL1TestBase { + function deployTaikoL1() internal override returns (TaikoL1) { + return + TaikoL1(payable(deployProxy({ name: "taiko", impl: address(new TaikoL1()), data: "" }))); + } + + function setUp() public override { + vm.startPrank(Emma); + // Call the TaikoL1TestBase setUp() + super.setUp(); + + SuccinctVerifier verifier = new SuccinctVerifier(); + console2.log("Deployed SuccinctVerifier to", address(verifier)); + registerAddress("sp1_remote_verifier", address(verifier)); + + // Deploy Taiko's SP1 proof verifier + sp1 = SP1Verifier( + deployProxy({ + name: "tier_zkvm_sp1", + impl: address(new SP1Verifier()), + data: abi.encodeCall(SP1Verifier.init, (address(0), address(addressManager))) + }) + ); + + sp1.setProgramTrusted( + bytes32(0x004e167a367ef584f118c2fac6ffdda82e5349913a165703fb1895f0da412bff), true + ); + } + + // Test `verifyProof()` happy path + function test_sp1_Plonk_verifyProof() external { + vm.stopPrank(); + + // Caller not necessary has to be TaikoL1 contract because there is no keys (as in SGX keys) + // to be front run. + vm.startPrank(Emma); + + bytes memory sp1Proof = + hex"54bdcae329f3f04a73d0e51b60e37a3dc2eb812b6c818895fbda375c24ce943d40a1a3541655911e01acabfb1ed0a04027e641f5e492e883d2ca77a03266b485a61563fe1c751fa9821101c5e755f8963df8493e967224867963a4b459457ca1ae23b7c62e7b320dcb495d119ca771ce2030f6aeeb44c328bc03f8a892c69da84aa43ca1201baeb122781539d987fc6fd706123398a8d50f837817873890c18269c3d3dd0e782114074808a1ff3548b49f0b499424c689e4bf5d74cb876237240d6473dc1ab63fc429bee770b10527113efff5ee6f2705031d6c7370d0a60154f19e8dd20ba14bd5fd5683ac1094f7981b122d908442fa6cd1ca460ffbf49e7e162fbc0d25280c78297ab4f7026a04448422da8e376ebb2b359d6c7be1ec1a660d07dfa82ac8c2d89f04fa02cb3a86a2066188f92895f2f42dc2f6f7e5713067a14a925a02fdffdcb99f7ad1df29281d3120d1196595b53b22a386a3eae6043435445f140976aafc537cbad06c46ca5ad2b16a7da0c4bd45ac880aef87078e7347cb464f0db47c51e064400751c2f032fd0fb92d8e4cf42c5bdda442d7a3c28e3dce3bdd10d8e014089f3a9ddc8c56dd154fe487beaf0ac01e73da68271378808786e69b1b709cfdd5666f53d46c569c965ea013a17e733efa740beddb8e56183138db1723e68dc91a3c893c7d05439388d387ed0fbeb19c7e996083b39858b07762a87c21ae07df5ea0fe21cb4974dc52d4e21553864af5e7d7042bfd0703aed1cf80171006aec8456ef123dc1ae4ec805c9d301f0dfe4788a0c5c599ff7a3ed17390bb1f260665e92e3647d7b89fab2681bc7237943c4b45243f68705d53c2ce8e4c5303b8ae78d556d0c4a1efaa48aedbb7feef62a27332a462fbd4e7dff75f3df8d92ea73b5afcc5a42c1a564bcdd99f2dcfe8e0c9873fa0470753900a20f7e01bcd1b3e6c62b2f8cdbd7de3068b7f5dcbfd6c0e9a511baccef6c7adfc41dee3f2dd2bb2409707d3d21594e3f425f6f6873b5245ec7dd2473b9b14b7f80576e776f3068e65e12da6663c8fff51ab2cdf1960225945dea081c5a38231f62439ad08032e4131a32f5b70566b1b86b7fb0138d4e2497621d71b31580ec36043f2c57330190c8b7d5a408a9ca109ae6dc5b90c6f86b4c15d54d2da991591369cb03c3d9c0c5030e89f7de4a5b6e7975fad4d321b1e01863dc0dbe8d49517006c7587a38b"; + bytes32 vKey = bytes32(0x004e167a367ef584f118c2fac6ffdda82e5349913a165703fb1895f0da412bff); + console2.logBytes(abi.encodePacked(vKey, sp1Proof)); + // TierProof + TaikoData.TierProof memory proof = + TaikoData.TierProof({ tier: 100, data: abi.encodePacked(vKey, sp1Proof) }); + + vm.warp(block.timestamp + 5); + + (IVerifier.Context memory ctx, TaikoData.Transition memory transition) = + _generateTaikoMainnetContextAndTransition(); + + uint64 chainId = L1.getConfig().chainId; + bytes32 pi = LibPublicInput.hashPublicInputs( + transition, address(sp1), address(0), ctx.prover, ctx.metaHash, chainId + ); + console2.log("chainId: ", chainId); + console2.log("Verifier: ", address(sp1)); + console2.log("Prover: ", ctx.prover); + console2.log("MetaHash: "); + console2.logBytes32(ctx.metaHash); + console2.log("Public input"); + console2.logBytes32(pi); + + // `verifyProof()` + sp1.verifyProof(ctx, transition, proof); + + vm.stopPrank(); + } + + function _generateTaikoMainnetContextAndTransition() + internal + pure + returns (IVerifier.Context memory ctx, TaikoData.Transition memory transition) + { + // Context + ctx = IVerifier.Context({ + metaHash: bytes32(0xd7efb262f6f25cc817452a622009a22e5868e53e1f934d899d3ec68d8c4f2c5b), + blobHash: bytes32(0x015cc9688f24b8d2195e46829b3f726ce006884d5fd2760b7cf414bab9a1b231), + prover: address(0x70997970C51812dc3A010C7d01b50e0d17dc79C8), + msgSender: address(0), + blockId: 223_248, //from mainnet + isContesting: false, + blobUsed: true + }); + + // Transition + transition = TaikoData.Transition({ + parentHash: 0x317de24b32f09629524133334ad552a14e3de603d71a9cf9e88d722809f101b3, + blockHash: 0x9966d3cf051d3d1e44e2a740169627506a619257c95374e812ca572de91ed885, + stateRoot: 0x3ae3de1afa16b93a5c7ea20a0b36b43357061f5b8ef857053d68b2735c3df860, + graffiti: 0x8008500000000000000000000000000000000000000000000000000000000000 + }); + } + + // Test `verifyBatchProof()` happy path + function test_sp1_Plonk_verifyBatchProof() public { + vm.startPrank(Emma); + + // proof generation elf vk digest which is not a bn254 hash + // but a sha256 hash from the same Sp1Verifykey. + sp1.setProgramTrusted( + bytes32(0x270b3d1b1fbd613c23185f586ffdda82729a4c8968595c0f76312be15a412bff), true + ); + // proof aggregation elf + sp1.setProgramTrusted( + bytes32(0x00d5ff4ed163b73e75aa1f60c399b3c778df24abe584fc6eee1ce5c444b74bcd), true + ); + + vm.startPrank(address(L1)); + + // Context + IVerifier.ContextV2[] memory ctxs = new IVerifier.ContextV2[](2); + ctxs[0] = IVerifier.ContextV2({ + metaHash: 0x207b2833fb6d804612da24d8785b870a19c7a3f25fa4aaeb9799cd442d65b031, + blobHash: 0x01354e8725e60ad91b32ec4ab19158572a0a5b06b2d4d83f6269c9a7d068f49b, + prover: 0x70997970C51812dc3A010C7d01b50e0d17dc79C8, + msgSender: 0x70997970C51812dc3A010C7d01b50e0d17dc79C8, + blockId: 393_333, + isContesting: false, + blobUsed: true, + tran: TaikoData.Transition({ + parentHash: 0xce519622a374dc014c005d7857de26d952751a9067d3e23ffe14da247aa8a399, + blockHash: 0x941d557653da2214cbf3d30af8d9cadbc7b5f77b6c3e48bca548eba04eb9cd79, + stateRoot: 0x4203a2fd98d268d272acb24d91e25055a779b443ff3e732f2cee7abcf639b5e9, + graffiti: 0x8008500000000000000000000000000000000000000000000000000000000000 + }) + }); + ctxs[1] = IVerifier.ContextV2({ + metaHash: 0x946ba1a9c02fc2f01da49e31cb5be83c118193d0389987c6be616ce76426b44d, + blobHash: 0x01abac8c1fb54f87ff7b0cbf14259b9d5ee7a8de458c587dd6eda43ef8354b4f, + prover: 0x70997970C51812dc3A010C7d01b50e0d17dc79C8, + msgSender: 0x70997970C51812dc3A010C7d01b50e0d17dc79C8, + blockId: 393_334, + isContesting: false, + blobUsed: true, + tran: TaikoData.Transition({ + parentHash: 0x941d557653da2214cbf3d30af8d9cadbc7b5f77b6c3e48bca548eba04eb9cd79, + blockHash: 0xc0dad38646ab264be30995b7b7fd02db65e7115126fb52bfad94c0fc9572287c, + stateRoot: 0x222061caab95b6bd0f8dd398088030979efbe56e282cd566f7abd77838558eb9, + graffiti: 0x8008500000000000000000000000000000000000000000000000000000000000 + }) + }); + + // TierProof + bytes memory data = + hex"00d5ff4ed163b73e75aa1f60c399b3c778df24abe584fc6eee1ce5c444b74bcd270b3d1b1fbd613c23185f586ffdda82729a4c8968595c0f76312be15a412bff54bdcae3236b956a67d15b4682d972d50fbb3632ac950bd712dad2d4cc9c302856c11e6c2ed6722fc3e4904ed204eb05a9f32bae3f8e7d4fbdd854c3d269a33e601c39c90d02026cdcdd55268090e316df3ffc0eee6de2765eb0d767f1455cd35af89da20ade1e61dc074884d5317f0206abb720acf8c023d2740b41fe37f2cb00fe561725269f4321543b30d528ee3e8884ea493fc6b1629e9a7537e65353fb0afd7e8021d502cb556e7a2b600e859f3fc524ad681df470d8d0ccc463775434ca56de661b34a3b620726aed8affc8a90d7b798a92d6500dacd9fb7d43a37c301d70e59d2d192fa85b2f6689bd9a6d47df9ea45163a228c8291e8d6d0ed5d7d7be8bd6391d6496989df139eaff5fca0f9d47eccad8ff6fb7aa0b8bb3da8e73fa4ff825d208b0ce5a639f30501f200c12f8fa1bf5c4ac42c4a58ceb34bbb3b012121f6ff31ed772d57c421a75813f987888e7e3b984bff8465bbfbdd30d45fae9904816a21c99ca4a903ed19af479d4ce0a1b4e78e2a9b3bdb8dde8986e8f028da0dd37e3129a184b4d36427d130075802421e5c693297f4705a030454b105b91f3ce8be111967dd8016ec9aed42e42ed3ab53e1dc42a0b796557e05b658203ae972378db1a109898a02ac97adfe3d5b24e1ab0d49f7702b69d137e23264e5b2c5b6e72fc2b2a4562b793a2c00ead94de8890700aa3c2fe5baf59ab8b7f524d38ba3b71712151edd00307dc3c9f24ea9d1bbac6687c8f30dbe845663f7aaddaec9df8d1fd15ced22fa58272184fe02aad68fd5a90ee249fced2ef955c0af40e02be0621e7162413e629b4428cb929d0a2bd87375dcec17664fec3a5a6cd2f7039723d41f10b77f5f3b7b052db1043c302795d3d739eecd2d2f686c2c474dcc67d9e844ca50bdabc7ac085aeb02aff0b3cbf17aaa0114ba85eff4a938d87db17680a5995a90347b2a5eccaeeb1be204a6dd83da39fe9485822667a43d4a5451f494063075007f152eeb46e0bad0675cf6219b53b36b1ca474f13f6dae87d1efad3c71f89cd05a04a6c76f6703858650a5fd6e2b45be3bf299386595d8eca6c8c55d537e8b3263828c7be68c92bdae0be0ed101f89c0c4c16154867228dc47ff0a4fccb4bb72b7cf8aa2c4a9bd4fd01254e51a7fbf680f408b5ae9c189466625b0f41636d94060e805eb6da30eab1202b65d8226918c4b99a73a6874089dbc5eac08cfab3d7"; + TaikoData.TierProof memory proof = TaikoData.TierProof({ tier: 0, data: data }); + + // `verifyProof()` + sp1.verifyBatchProof(ctxs, proof); + + vm.stopPrank(); + } +} diff --git a/packages/protocol/test/layer1/verifiers/SP1Verifier.t.sol b/packages/protocol/test/layer1/verifiers/SP1Verifier.t.sol new file mode 100644 index 00000000000..329031fdd83 --- /dev/null +++ b/packages/protocol/test/layer1/verifiers/SP1Verifier.t.sol @@ -0,0 +1,160 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "../based/TaikoL1TestBase.sol"; + +contract MockSP1Gateway is ISP1Verifier { + // To simulate failing and succeeding + bool public verifying; + + error SP1_INVALID_PROOF(); + + function setVerifying(bool _verifying) public { + verifying = _verifying; + } + + function verifyProof( + bytes32, /*programVKey*/ + bytes calldata, /*publicValues*/ + bytes calldata /*proofBytes*/ + ) + external + view + { + require(verifying, "SP1Verifier: invalid proof"); + } +} + +contract TestSP1Verifier is TaikoL1TestBase { + MockSP1Gateway sp1Gateway; + + function deployTaikoL1() internal override returns (TaikoL1) { + return + TaikoL1(payable(deployProxy({ name: "taiko", impl: address(new TaikoL1()), data: "" }))); + } + + function setUp() public override { + // Call the TaikoL1TestBase setUp() + super.setUp(); + + sp1Gateway = new MockSP1Gateway(); + sp1Gateway.setVerifying(true); + + // Deploy Taiko's SP1 proof verifier ('remitter') + sp1 = SP1Verifier( + deployProxy({ + name: "tier_zkvm_sp1", + impl: address(new SP1Verifier()), + data: abi.encodeCall(SP1Verifier.init, (address(0), address(addressManager))) + }) + ); + + sp1.setProgramTrusted(bytes32("105"), true); + + registerAddress("sp1_verifier", address(sp1)); + registerAddress("sp1_remote_verifier", address(sp1Gateway)); + } + + // Test `verifyProof()` happy path + function test_verifyProof() external { + vm.stopPrank(); + + // Caller not necessary has to be TaikoL1 contract because there is no keys (as in SGX keys) + // to be front run. + vm.startPrank(Alice); + + bytes32 programVKey = bytes32("105"); + bytes memory sp1Proof = hex"00"; + + // TierProof + TaikoData.TierProof memory proof = + TaikoData.TierProof({ tier: 100, data: abi.encode(programVKey, sp1Proof) }); + + vm.warp(block.timestamp + 5); + + (IVerifier.Context memory ctx, TaikoData.Transition memory transition) = + _getDummyContextAndTransition(); + + // `verifyProof()` + sp1.verifyProof(ctx, transition, proof); + + vm.stopPrank(); + } + + function test_verifyProof_invalidProgramVKeyd() external { + vm.stopPrank(); + + // Caller not necessary has to be TaikoL1 contract because there is no keys (as in SGX keys) + // to be front run. + vm.startPrank(Alice); + + bytes32 programVKey = bytes32("101"); + bytes memory sp1Proof = hex"00"; + + // TierProof + TaikoData.TierProof memory proof = + TaikoData.TierProof({ tier: 100, data: abi.encode(programVKey, sp1Proof) }); + + vm.warp(block.timestamp + 5); + + (IVerifier.Context memory ctx, TaikoData.Transition memory transition) = + _getDummyContextAndTransition(); + + // `verifyProof()` + vm.expectRevert(SP1Verifier.SP1_INVALID_PROGRAM_VKEY.selector); + sp1.verifyProof(ctx, transition, proof); + + vm.stopPrank(); + } + + function test_verifyProof_invalidProof() external { + sp1Gateway.setVerifying(false); + vm.stopPrank(); + + // Caller not necessary has to be TaikoL1 contract because there is no keys (as in SGX keys) + // to be front run. + vm.startPrank(Alice); + + bytes32 programVKey = bytes32("105"); + bytes memory sp1Proof = hex"00"; + + // TierProof + TaikoData.TierProof memory proof = + TaikoData.TierProof({ tier: 100, data: abi.encode(programVKey, sp1Proof) }); + + vm.warp(block.timestamp + 5); + + (IVerifier.Context memory ctx, TaikoData.Transition memory transition) = + _getDummyContextAndTransition(); + + vm.expectRevert(SP1Verifier.SP1_INVALID_PROOF.selector); + sp1.verifyProof(ctx, transition, proof); + + vm.stopPrank(); + } + + function _getDummyContextAndTransition() + internal + pure + returns (IVerifier.Context memory ctx, TaikoData.Transition memory transition) + { + // Context + ctx = IVerifier.Context({ + metaHash: bytes32("ab"), + blobHash: bytes32("cd"), + prover: address(0), + msgSender: address(0), + blockId: 10, + isContesting: false, + blobUsed: false + }); + + // Transition + transition = TaikoData.Transition({ + parentHash: bytes32("12"), + blockHash: bytes32("34"), + stateRoot: bytes32("56"), + graffiti: bytes32("78") + }); + } +} diff --git a/packages/protocol/test/verifiers/SgxVerifier.t.sol b/packages/protocol/test/layer1/verifiers/SgxVerifier.t.sol similarity index 78% rename from packages/protocol/test/verifiers/SgxVerifier.t.sol rename to packages/protocol/test/layer1/verifiers/SgxVerifier.t.sol index 116c9e6c119..2e1b115de9e 100644 --- a/packages/protocol/test/verifiers/SgxVerifier.t.sol +++ b/packages/protocol/test/layer1/verifiers/SgxVerifier.t.sol @@ -1,8 +1,9 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; -import "../L1/TaikoL1TestBase.sol"; +import "src/layer1/verifiers/SgxVerifierBase.sol"; import "../automata-attestation/common/AttestationBase.t.sol"; +import "../based/TaikoL1TestBase.sol"; contract TestSgxVerifier is TaikoL1TestBase, AttestationBase { address internal SGX_Y = @@ -38,9 +39,11 @@ contract TestSgxVerifier is TaikoL1TestBase, AttestationBase { instances[1] = Bob; vm.expectEmit(true, true, true, true); - emit SgxVerifier.InstanceAdded(startInstance, instances[0], address(0), block.timestamp); + emit SgxVerifierBase.InstanceAdded(startInstance, instances[0], address(0), block.timestamp); vm.expectEmit(true, true, true, true); - emit SgxVerifier.InstanceAdded(startInstance + 1, instances[1], address(0), block.timestamp); + emit SgxVerifierBase.InstanceAdded( + startInstance + 1, instances[1], address(0), block.timestamp + ); // `addInstances()` uint256[] memory ids = sv.addInstances(instances); @@ -66,11 +69,11 @@ contract TestSgxVerifier is TaikoL1TestBase, AttestationBase { instances2[1] = David; vm.expectEmit(true, true, true, true); - emit SgxVerifier.InstanceAdded( + emit SgxVerifierBase.InstanceAdded( startInstance + 2, instances2[0], address(0), block.timestamp ); vm.expectEmit(true, true, true, true); - emit SgxVerifier.InstanceAdded( + emit SgxVerifierBase.InstanceAdded( startInstance + 3, instances2[1], address(0), block.timestamp ); @@ -103,7 +106,7 @@ contract TestSgxVerifier is TaikoL1TestBase, AttestationBase { instances[1] = address(0); // `addInstances()` - vm.expectRevert(SgxVerifier.SGX_INVALID_INSTANCE.selector); + vm.expectRevert(SgxVerifierBase.SGX_INVALID_INSTANCE.selector); sv.addInstances(instances); vm.stopPrank(); @@ -117,7 +120,7 @@ contract TestSgxVerifier is TaikoL1TestBase, AttestationBase { instances[1] = Alice; // invalid as duplicate instance // `addInstances()` - vm.expectRevert(SgxVerifier.SGX_ALREADY_ATTESTED.selector); + vm.expectRevert(SgxVerifierBase.SGX_ALREADY_ATTESTED.selector); sv.addInstances(instances); } @@ -161,7 +164,7 @@ contract TestSgxVerifier is TaikoL1TestBase, AttestationBase { vm.prank(Bob, Bob); sv.registerInstance(v3quote); - vm.expectRevert(SgxVerifier.SGX_ALREADY_ATTESTED.selector); + vm.expectRevert(SgxVerifierBase.SGX_ALREADY_ATTESTED.selector); vm.prank(Carol, Carol); sv.registerInstance(v3quote); } @@ -218,7 +221,7 @@ contract TestSgxVerifier is TaikoL1TestBase, AttestationBase { vm.warp(block.timestamp + 5); vm.expectEmit(true, true, true, true); - emit SgxVerifier.InstanceAdded(id, newInstance, KNOWN_ADDRESS, block.timestamp); + emit SgxVerifierBase.InstanceAdded(id, newInstance, KNOWN_ADDRESS, block.timestamp); // `verifyProof()` sv.verifyProof(ctx, transition, proof); @@ -294,7 +297,7 @@ contract TestSgxVerifier is TaikoL1TestBase, AttestationBase { }); // `verifyProof()` - vm.expectRevert(SgxVerifier.SGX_INVALID_PROOF.selector); + vm.expectRevert(SgxVerifierBase.SGX_INVALID_PROOF.selector); sv.verifyProof(ctx, transition, proof); } @@ -375,53 +378,63 @@ contract TestSgxVerifier is TaikoL1TestBase, AttestationBase { TaikoData.TierProof memory proof = TaikoData.TierProof({ tier: 0, data: data }); // `verifyProof()` - vm.expectRevert(SgxVerifier.SGX_INVALID_INSTANCE.selector); + vm.expectRevert(SgxVerifierBase.SGX_INVALID_INSTANCE.selector); sv.verifyProof(ctx, transition, proof); vm.stopPrank(); } - // Test `verifyProof()` call is not taiko or higher tier proof - function test_verifyProof_invalidCaller() public { - vm.startPrank(Alice); // invalid caller + // Test `verifyBatchProof()` happy path + function test_verifyBatchProofs() public { + // setup instances + address newInstance = address(0x6Aa1108c1903E3AeF092FF46E4C506fD3ac567c0); + address[] memory instances = new address[](1); + instances[0] = newInstance; + uint256[] memory ids = sv.addInstances(instances); + console.log("Instance ID: ", ids[0]); + + vm.startPrank(address(L1)); // Context - IVerifier.Context memory ctx = IVerifier.Context({ - metaHash: bytes32("ab"), - blobHash: bytes32("cd"), - prover: Alice, - msgSender: Alice, - blockId: 10, + IVerifier.ContextV2[] memory ctxs = new IVerifier.ContextV2[](2); + ctxs[0] = IVerifier.ContextV2({ + metaHash: 0x207b2833fb6d804612da24d8785b870a19c7a3f25fa4aaeb9799cd442d65b031, + blobHash: 0x01354e8725e60ad91b32ec4ab19158572a0a5b06b2d4d83f6269c9a7d068f49b, + prover: 0x70997970C51812dc3A010C7d01b50e0d17dc79C8, + msgSender: 0x70997970C51812dc3A010C7d01b50e0d17dc79C8, + blockId: 393_333, isContesting: false, - blobUsed: false + blobUsed: true, + tran: TaikoData.Transition({ + parentHash: 0xce519622a374dc014c005d7857de26d952751a9067d3e23ffe14da247aa8a399, + blockHash: 0x941d557653da2214cbf3d30af8d9cadbc7b5f77b6c3e48bca548eba04eb9cd79, + stateRoot: 0x4203a2fd98d268d272acb24d91e25055a779b443ff3e732f2cee7abcf639b5e9, + graffiti: 0x8008500000000000000000000000000000000000000000000000000000000000 + }) }); - - // Transition - TaikoData.Transition memory transition = TaikoData.Transition({ - parentHash: bytes32("12"), - blockHash: bytes32("34"), - stateRoot: bytes32("56"), - graffiti: bytes32("78") + ctxs[1] = IVerifier.ContextV2({ + metaHash: 0x946ba1a9c02fc2f01da49e31cb5be83c118193d0389987c6be616ce76426b44d, + blobHash: 0x01abac8c1fb54f87ff7b0cbf14259b9d5ee7a8de458c587dd6eda43ef8354b4f, + prover: 0x70997970C51812dc3A010C7d01b50e0d17dc79C8, + msgSender: 0x70997970C51812dc3A010C7d01b50e0d17dc79C8, + blockId: 393_334, + isContesting: false, + blobUsed: true, + tran: TaikoData.Transition({ + parentHash: 0x941d557653da2214cbf3d30af8d9cadbc7b5f77b6c3e48bca548eba04eb9cd79, + blockHash: 0xc0dad38646ab264be30995b7b7fd02db65e7115126fb52bfad94c0fc9572287c, + stateRoot: 0x222061caab95b6bd0f8dd398088030979efbe56e282cd566f7abd77838558eb9, + graffiti: 0x8008500000000000000000000000000000000000000000000000000000000000 + }) }); // TierProof - uint32 id = 0; - address newInstance = address(0x33); - - uint64 chainId = L1.getConfig().chainId; - bytes32 signedHash = LibPublicInput.hashPublicInputs( - transition, address(sv), newInstance, ctx.prover, ctx.metaHash, chainId - ); - - (uint8 v, bytes32 r, bytes32 s) = vm.sign(KNOWN_ADDRESS_PRIV_KEY, signedHash); - bytes memory signature = abi.encodePacked(r, s, v); - - bytes memory data = abi.encodePacked(id, newInstance, signature); - TaikoData.TierProof memory proof = TaikoData.TierProof({ tier: 100, data: data }); + bytes memory data = + hex"000000016aa1108c1903e3aef092ff46e4c506fd3ac567c06aa1108c1903e3aef092ff46e4c506fd3ac567c0dda91ea274c36678a0680bae65216b40bd935e646b6364ea669a6de9b58e0cd11e1c1b86765f98ac5a3113fdc08296aa663378e8e2e44cf08db7a4ba6e5f00f21b"; + TaikoData.TierProof memory proof = TaikoData.TierProof({ tier: 0, data: data }); // `verifyProof()` - vm.expectRevert(AddressResolver.RESOLVER_DENIED.selector); - sv.verifyProof(ctx, transition, proof); + sv.verifyBatchProof(ctxs, proof); vm.stopPrank(); } diff --git a/packages/protocol/test/layer1/verifiers/compose/ComposeVerifeir.t.sol b/packages/protocol/test/layer1/verifiers/compose/ComposeVerifeir.t.sol new file mode 100644 index 00000000000..6a738475495 --- /dev/null +++ b/packages/protocol/test/layer1/verifiers/compose/ComposeVerifeir.t.sol @@ -0,0 +1,228 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "src/layer1/verifiers/compose/ComposeVerifier.sol"; +import "test/shared/TaikoTest.sol"; + +contract ComposeVerifierForTest is ComposeVerifier { + uint256 private threshold; + address[] private verifiers; + + function setThreshold(uint256 _threshold) external { + threshold = _threshold; + } + + function getSubVerifiersAndThreshold() + public + view + override + returns (address[] memory, uint256) + { + return (verifiers, threshold); + } + + function addSubVerifier(address _verifier) external { + verifiers.push(_verifier); + } + + function _getAddress(uint64, bytes32 _name) internal view override returns (address) { + if (_name == LibStrings.B_TAIKO) return msg.sender; + else return address(0); + } +} + +contract MockVerifier is IVerifier { + bool private shouldSucceed; + + constructor(bool _shouldSucceed) { + shouldSucceed = _shouldSucceed; + } + + function verifyProof( + Context calldata, + TaikoData.Transition calldata, + TaikoData.TierProof calldata + ) + external + view + override + { + if (!shouldSucceed) { + revert("MockVerifier: Verification failed"); + } + } + + function verifyBatchProof( + ContextV2[] calldata, + TaikoData.TierProof calldata + ) + external + pure + override + { + revert("NOT_IMPLEMENTED"); + } +} + +contract ComposeVerifierTest is TaikoTest { + IVerifier.Context private ctx; + TaikoData.Transition private tran; + + function test_composeVerifeir_invalid_subproof_length() public { + ComposeVerifierForTest composeVerifier = new ComposeVerifierForTest(); + address verifier1 = address(new MockVerifier(true)); + address verifier2 = address(new MockVerifier(true)); + address verifier3 = address(new MockVerifier(true)); + + composeVerifier.addSubVerifier(verifier1); + composeVerifier.addSubVerifier(verifier2); + composeVerifier.addSubVerifier(verifier3); + + ComposeVerifier.SubProof[] memory subProofs = new ComposeVerifier.SubProof[](2); + subProofs[0] = ComposeVerifier.SubProof(verifier1, ""); + subProofs[1] = ComposeVerifier.SubProof(verifier1, ""); + + TaikoData.TierProof memory proof = + TaikoData.TierProof({ tier: 1, data: abi.encode(subProofs) }); + + composeVerifier.setThreshold(1); + + vm.expectRevert(ComposeVerifier.CV_INVALID_SUBPROOF_LENGTH.selector); + composeVerifier.verifyProof(ctx, tran, proof); + } + + function test_composeVerifeir_1_outof_3() public { + ComposeVerifierForTest composeVerifier = new ComposeVerifierForTest(); + address verifier1 = address(new MockVerifier(true)); + address verifier2 = address(new MockVerifier(true)); + address verifier3 = address(new MockVerifier(true)); + + composeVerifier.addSubVerifier(verifier1); + composeVerifier.addSubVerifier(verifier2); + composeVerifier.addSubVerifier(verifier3); + + ComposeVerifier.SubProof[] memory subProofs = new ComposeVerifier.SubProof[](1); + subProofs[0] = ComposeVerifier.SubProof(verifier1, ""); + + TaikoData.TierProof memory proof = + TaikoData.TierProof({ tier: 1, data: abi.encode(subProofs) }); + + composeVerifier.setThreshold(1); + composeVerifier.verifyProof(ctx, tran, proof); + } + + function test_composeVerifeir_2_outof_3() public { + ComposeVerifierForTest composeVerifier = new ComposeVerifierForTest(); + address verifier1 = address(new MockVerifier(true)); + address verifier2 = address(new MockVerifier(true)); + address verifier3 = address(new MockVerifier(true)); + + composeVerifier.addSubVerifier(verifier1); + composeVerifier.addSubVerifier(verifier2); + composeVerifier.addSubVerifier(verifier3); + + ComposeVerifier.SubProof[] memory subProofs = new ComposeVerifier.SubProof[](2); + subProofs[0] = ComposeVerifier.SubProof(verifier1, ""); + subProofs[1] = ComposeVerifier.SubProof(verifier2, ""); + + TaikoData.TierProof memory proof = + TaikoData.TierProof({ tier: 1, data: abi.encode(subProofs) }); + + composeVerifier.setThreshold(2); + composeVerifier.verifyProof(ctx, tran, proof); + } + + function test_composeVerifeir_3_outof_3() public { + ComposeVerifierForTest composeVerifier = new ComposeVerifierForTest(); + address verifier1 = address(new MockVerifier(true)); + address verifier2 = address(new MockVerifier(true)); + address verifier3 = address(new MockVerifier(true)); + + composeVerifier.addSubVerifier(verifier1); + composeVerifier.addSubVerifier(verifier2); + composeVerifier.addSubVerifier(verifier3); + + ComposeVerifier.SubProof[] memory subProofs = new ComposeVerifier.SubProof[](3); + subProofs[0] = ComposeVerifier.SubProof(verifier1, ""); + subProofs[1] = ComposeVerifier.SubProof(verifier2, ""); + subProofs[2] = ComposeVerifier.SubProof(verifier3, ""); + + TaikoData.TierProof memory proof = + TaikoData.TierProof({ tier: 1, data: abi.encode(subProofs) }); + + composeVerifier.setThreshold(3); + composeVerifier.verifyProof(ctx, tran, proof); + } + + function test_composeVerifeir_subproof_failure() public { + ComposeVerifierForTest composeVerifier = new ComposeVerifierForTest(); + address verifier1 = address(new MockVerifier(true)); + address verifier2 = address(new MockVerifier(true)); + address verifier3 = address(new MockVerifier(false)); + + composeVerifier.addSubVerifier(verifier1); + composeVerifier.addSubVerifier(verifier2); + composeVerifier.addSubVerifier(verifier3); + + ComposeVerifier.SubProof[] memory subProofs = new ComposeVerifier.SubProof[](3); + subProofs[0] = ComposeVerifier.SubProof(verifier1, ""); + subProofs[1] = ComposeVerifier.SubProof(verifier2, ""); + subProofs[2] = ComposeVerifier.SubProof(verifier3, ""); + + TaikoData.TierProof memory proof = + TaikoData.TierProof({ tier: 1, data: abi.encode(subProofs) }); + + composeVerifier.setThreshold(3); + + // Expect the verification to fail because one sub proof is invalid + vm.expectRevert("MockVerifier: Verification failed"); + composeVerifier.verifyProof(ctx, tran, proof); + } + + function test_composeVerifeir_2_outof_3_duplicate_subproof() public { + ComposeVerifierForTest composeVerifier = new ComposeVerifierForTest(); + address verifier1 = address(new MockVerifier(true)); + address verifier2 = address(new MockVerifier(true)); + address verifier3 = address(new MockVerifier(true)); + + composeVerifier.addSubVerifier(verifier1); + composeVerifier.addSubVerifier(verifier2); + composeVerifier.addSubVerifier(verifier3); + + ComposeVerifier.SubProof[] memory subProofs = new ComposeVerifier.SubProof[](2); + subProofs[0] = ComposeVerifier.SubProof(verifier1, ""); + subProofs[1] = ComposeVerifier.SubProof(verifier1, ""); + + TaikoData.TierProof memory proof = + TaikoData.TierProof({ tier: 1, data: abi.encode(subProofs) }); + + composeVerifier.setThreshold(2); + vm.expectRevert(ComposeVerifier.CV_SUB_VERIFIER_NOT_FOUND.selector); + composeVerifier.verifyProof(ctx, tran, proof); + } + + function test_composeVerifeir_subproof_verifier_not_found() public { + ComposeVerifierForTest composeVerifier = new ComposeVerifierForTest(); + address verifier1 = address(new MockVerifier(true)); + address verifier2 = address(new MockVerifier(true)); + address verifier3 = address(new MockVerifier(true)); + + composeVerifier.addSubVerifier(verifier1); + composeVerifier.addSubVerifier(verifier2); + composeVerifier.addSubVerifier(verifier3); + + ComposeVerifier.SubProof[] memory subProofs = new ComposeVerifier.SubProof[](3); + subProofs[0] = ComposeVerifier.SubProof(verifier1, ""); + subProofs[1] = ComposeVerifier.SubProof(verifier2, ""); + subProofs[2] = ComposeVerifier.SubProof(address((123)), ""); + + TaikoData.TierProof memory proof = + TaikoData.TierProof({ tier: 1, data: abi.encode(subProofs) }); + + composeVerifier.setThreshold(3); + + // Expect the verification to fail because one sub proof is invalid + vm.expectRevert(ComposeVerifier.CV_SUB_VERIFIER_NOT_FOUND.selector); + composeVerifier.verifyProof(ctx, tran, proof); + } +} diff --git a/packages/protocol/test/L2/DelegateOwner.t.sol b/packages/protocol/test/layer2/DelegateOwner.t.sol similarity index 88% rename from packages/protocol/test/L2/DelegateOwner.t.sol rename to packages/protocol/test/layer2/DelegateOwner.t.sol index 96bf4bc9e37..431219d9508 100644 --- a/packages/protocol/test/L2/DelegateOwner.t.sol +++ b/packages/protocol/test/layer2/DelegateOwner.t.sol @@ -1,8 +1,8 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; -import "../common/TestMulticall3.sol"; -import "../TaikoTest.sol"; +import "../shared/thirdparty/Multicall3.sol"; +import "./TaikoL2Test.sol"; contract Target is EssentialContract { function init(address _owner) external initializer { @@ -10,14 +10,14 @@ contract Target is EssentialContract { } } -contract TestDelegateOwner is TaikoTest { +contract TestDelegateOwner is TaikoL2Test { address public owner; address public remoteOwner; Bridge public bridge; SignalService public signalService; AddressManager public addressManager; DelegateOwner public delegateOwner; - TestMulticall3 public multicall; + Multicall3 public multicall; uint64 remoteChainId = uint64(block.chainid + 1); address remoteBridge = vm.addr(0x2000); @@ -30,7 +30,7 @@ contract TestDelegateOwner is TaikoTest { vm.startPrank(owner); - multicall = new TestMulticall3(); + multicall = new Multicall3(); addressManager = AddressManager( deployProxy({ @@ -45,7 +45,8 @@ contract TestDelegateOwner is TaikoTest { name: "delegate_owner", impl: address(new DelegateOwner()), data: abi.encodeCall( - DelegateOwner.init, (remoteOwner, address(addressManager), remoteChainId) + DelegateOwner.init, + (remoteOwner, address(addressManager), remoteChainId, address(0)) ), registerTo: address(addressManager) }) @@ -94,7 +95,7 @@ contract TestDelegateOwner is TaikoTest { ); vm.expectRevert(DelegateOwner.DO_DRYRUN_SUCCEEDED.selector); - delegateOwner.dryrunMessageInvocation(data); + delegateOwner.dryrunInvocation(data); IBridge.Message memory message; message.from = remoteOwner; @@ -127,7 +128,7 @@ contract TestDelegateOwner is TaikoTest { ); vm.expectRevert(DelegateOwner.DO_DRYRUN_SUCCEEDED.selector); - delegateOwner.dryrunMessageInvocation(data); + delegateOwner.dryrunInvocation(data); IBridge.Message memory message; message.from = remoteOwner; @@ -168,7 +169,7 @@ contract TestDelegateOwner is TaikoTest { }) ); - TestMulticall3.Call3[] memory calls = new TestMulticall3.Call3[](3); + Multicall3.Call3[] memory calls = new Multicall3.Call3[](4); calls[0].target = address(target1); calls[0].allowFailure = false; calls[0].callData = abi.encodeCall(EssentialContract.pause, ()); @@ -181,17 +182,21 @@ contract TestDelegateOwner is TaikoTest { calls[2].allowFailure = false; calls[2].callData = abi.encodeCall(UUPSUpgradeable.upgradeTo, (delegateOwnerImpl2)); + calls[3].target = address(delegateOwner); + calls[3].allowFailure = false; + calls[3].callData = abi.encodeCall(DelegateOwner.setAdmin, (David)); + bytes memory data = abi.encode( DelegateOwner.Call( uint64(0), address(multicall), true, // DELEGATECALL - abi.encodeCall(TestMulticall3.aggregate3, (calls)) + abi.encodeCall(Multicall3.aggregate3, (calls)) ) ); vm.expectRevert(DelegateOwner.DO_DRYRUN_SUCCEEDED.selector); - delegateOwner.dryrunMessageInvocation(data); + delegateOwner.dryrunInvocation(data); IBridge.Message memory message; message.from = remoteOwner; @@ -211,5 +216,6 @@ contract TestDelegateOwner is TaikoTest { assertTrue(target1.paused()); assertEq(target2.impl(), impl2); assertEq(delegateOwner.impl(), delegateOwnerImpl2); + assertEq(delegateOwner.admin(), David); } } diff --git a/packages/protocol/test/layer2/LibEIP1559.t.sol b/packages/protocol/test/layer2/LibEIP1559.t.sol new file mode 100644 index 00000000000..31368b2e494 --- /dev/null +++ b/packages/protocol/test/layer2/LibEIP1559.t.sol @@ -0,0 +1,153 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "./TaikoL2Test.sol"; + +contract TestLibEIP1559 is TaikoL2Test { + using LibMath for uint256; + + function test_ethQty() external { + assertEq(LibEIP1559.ethQty(60_000_000 * 8, 0), 1); + assertEq(LibEIP1559.ethQty(60_000_000 * 8, 60_000_000), 1); + assertEq(LibEIP1559.ethQty(60_000_000 * 8, 60_000_000 * 100), 268_337); + assertEq(LibEIP1559.ethQty(60_000_000 * 8, 60_000_000 * 200), 72_004_899_337); + } + + function test_basefee() external pure { + uint256 basefee; + console2.log("excess, basefee"); + // 1_0000_000 is 0.01 gwei + for (uint64 i; basefee <= 10_000_000;) { + // uint 0.01 gwei + uint64 excess = i * 5_000_000; + uint64 target = 5_000_000 * 8; + + basefee = LibEIP1559.basefee(target, excess); + if (basefee != 0) { + console2.log( + string.concat(Strings.toString(excess), ", ", Strings.toString(basefee)) + ); + } + i += 1; + } + } + + function test_mainnet_min_basefee() external pure { + console2.log("Mainnet minimal basefee: ", LibEIP1559.basefee(5_000_000 * 8, 1_340_000_000)); + } + + function test_change_of_quotient_and_gasIssuancePerSecond() public { + uint64 excess = 150 * 2_000_000; + uint64 target = 4 * 2_000_000; + uint256 unit = 10_000_000; // 0.01 gwei + + // uint 0.01 gwei + uint256 baselineBasefee = LibEIP1559.basefee(target, excess) / unit; + console2.log("baseline basefee: ", baselineBasefee); + + uint256 basefee = LibEIP1559.basefee(target * 2, excess) / unit; + console2.log("basefee will decrease if target increases:", basefee); + + basefee = LibEIP1559.basefee(excess, target / 2) / unit; + console2.log("basefee will increase if target decreases:", basefee); + + console2.log("maintain basefee when target increases"); + { + uint64 newTarget = 5 * 2_000_000; + (uint64 newTarget_, uint64 newExcess_) = + LibEIP1559.adjustExcess(target, newTarget, excess); + assertEq(newTarget_, newTarget, "adjustExcess failed"); + basefee = LibEIP1559.basefee(newTarget_, newExcess_) / unit; + console2.log("old gas excess: ", excess); + console2.log("new gas excess: ", newExcess_); + console2.log("basefee: ", basefee); + assertEq(baselineBasefee, basefee); + } + + console2.log("maintain basefee when target decreases"); + { + uint64 newTarget = 3 * 2_000_000; + (uint64 newTarget_, uint64 newExcess_) = + LibEIP1559.adjustExcess(target, newTarget, excess); + assertEq(newTarget_, newTarget, "adjustExcess failed"); + basefee = LibEIP1559.basefee(newTarget_, newExcess_) / unit; + console2.log("old gas excess: ", excess); + console2.log("new gas excess: ", newExcess_); + console2.log("basefee: ", basefee); + assertEq(baselineBasefee, basefee); + } + } + + function test_change_of_quotient_and_gasIssuancePerSecond2() public { + uint64 excess = 1; + uint64 target = 60_000_000 * 8; + uint256 unit = 10_000_000; // 0.01 gwei + + // uint 0.01 gwei + uint256 baselineBasefee = LibEIP1559.basefee(target, excess) / unit; + console2.log("baseline basefee: ", baselineBasefee); + + console2.log("maintain basefee when target changes"); + uint64 newTarget = 5_000_000 * 8; + (uint64 newTarget_, uint64 newExcess_) = LibEIP1559.adjustExcess(target, newTarget, excess); + assertEq(newTarget_, newTarget, "adjustExcess failed"); + uint256 basefee = LibEIP1559.basefee(newTarget_, newExcess_) / unit; + console2.log("old gas excess: ", excess); + console2.log("new gas excess: ", newExcess_); + console2.log("basefee: ", basefee); + assertEq(baselineBasefee, basefee); + } + + /// forge-config: layer2.fuzz.runs = 1000 + /// forge-config: layer2.fuzz.show-logs = true + function test_fuzz_ethQty(uint64 _gasTarget, uint64 _gasExcess) external { + if (_gasTarget == 0) _gasTarget = 1; + uint256 result = LibEIP1559.ethQty(_gasTarget, _gasExcess); + assertTrue(result > 0); + } + + /// forge-config: layer2.fuzz.runs = 2000 + /// forge-config: layer2.fuzz.show-logs = true + function test_fuzz_basefee(uint64 _gasTarget, uint64 _gasExcess) external { + uint256 result = LibEIP1559.basefee(_gasTarget, _gasExcess); + assertTrue(result >= 1); + } + + /// forge-config: layer2.fuzz.runs = 2000 + /// forge-config: layer2.fuzz.show-logs = true + function test_fuzz_adjustExcess( + uint64 _oldGasTarget, + uint64 _newGasTarget, + uint64 _oldGasExcess + ) + external + { + (uint64 newGasTarget_, uint64 newGasExcess_) = + LibEIP1559.adjustExcess(_oldGasTarget, _newGasTarget, _oldGasExcess); + + if (_oldGasTarget == 0 && _newGasTarget == 0) { + assertEq(newGasTarget_, 0); + assertEq(newGasExcess_, _oldGasExcess); + } else { + assertTrue(newGasTarget_ != 0); + } + } + + /// forge-config: layer2.fuzz.runs = 2000 + /// forge-config: layer2.fuzz.show-logs = true + function test_fuzz_calc1559BaseFee( + uint64 _gasTarget, + uint64 _gasExcess, + uint64 _gasIssuance, + uint32 _parentGasUsed, + uint64 _minGasExcess + ) + external + pure + { + if (_gasTarget == 0) _gasTarget = 1; + LibEIP1559.calc1559BaseFee( + _gasTarget, _gasExcess, _gasIssuance, _parentGasUsed, _minGasExcess + ); + } +} diff --git a/packages/protocol/test/L2/LibL2Signer.sol b/packages/protocol/test/layer2/LibL2Signer.sol similarity index 98% rename from packages/protocol/test/L2/LibL2Signer.sol rename to packages/protocol/test/layer2/LibL2Signer.sol index 52f29867589..42cfc4e8734 100644 --- a/packages/protocol/test/L2/LibL2Signer.sol +++ b/packages/protocol/test/layer2/LibL2Signer.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; -import "../thirdparty/LibUint512Math.sol"; +import "../shared/thirdparty/LibUint512Math.sol"; /// @title LibL2Signer /// @notice This contract allows for signing operations required on Taiko L2. diff --git a/packages/protocol/test/layer2/TaikoL2.t.sol b/packages/protocol/test/layer2/TaikoL2.t.sol new file mode 100644 index 00000000000..f917525f816 --- /dev/null +++ b/packages/protocol/test/layer2/TaikoL2.t.sol @@ -0,0 +1,187 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "./TaikoL2Test.sol"; + +contract TaikoL2ForTest is TaikoL2 { + function skipFeeCheck() public pure override returns (bool) { + return true; + } +} + +contract TaikoL2Tests is TaikoL2Test { + using SafeCast for uint256; + + uint64 public constant L1_CHAIN_ID = 12_345; + uint32 public constant BLOCK_GAS_LIMIT = 30_000_000; + + address public addressManager; + uint64 public anchorBlockId; + TaikoL2ForTest public L2; + + function setUp() public { + addressManager = deployProxy({ + name: "address_manager", + impl: address(new AddressManager()), + data: abi.encodeCall(AddressManager.init, (address(0))) + }); + + SignalService ss = SignalService( + deployProxy({ + name: "signal_service", + impl: address(new SignalService()), + data: abi.encodeCall(SignalService.init, (address(0), addressManager)), + registerTo: addressManager + }) + ); + + L2 = TaikoL2ForTest( + payable( + deployProxy({ + name: "taiko", + impl: address(new TaikoL2ForTest()), + data: abi.encodeCall(TaikoL2.init, (address(0), addressManager, L1_CHAIN_ID, 0)), + registerTo: addressManager + }) + ) + ); + + ss.authorize(address(L2), true); + vm.roll(block.number + 1); + vm.warp(block.timestamp + 30); + vm.deal(address(L2), 100 ether); + } + + // calling anchor in the same block more than once should fail + function test_L2_AnchorTx_revert_in_same_block() external { + vm.fee(1); + + vm.prank(L2.GOLDEN_TOUCH_ADDRESS()); + _anchorV2(BLOCK_GAS_LIMIT); + + vm.prank(L2.GOLDEN_TOUCH_ADDRESS()); + vm.expectRevert(TaikoL2.L2_PUBLIC_INPUT_HASH_MISMATCH.selector); + _anchorV2(BLOCK_GAS_LIMIT); + } + + // calling anchor in the same block more than once should fail + function test_L2_AnchorTx_revert_from_wrong_signer() external { + vm.fee(1); + vm.expectRevert(TaikoL2.L2_INVALID_SENDER.selector); + _anchorV2(BLOCK_GAS_LIMIT); + } + + function test_L2_AnchorTx_signing(bytes32 digest) external { + (uint8 v, uint256 r, uint256 s) = LibL2Signer.signAnchor(digest, uint8(1)); + address signer = ecrecover(digest, v + 27, bytes32(r), bytes32(s)); + assertEq(signer, L2.GOLDEN_TOUCH_ADDRESS()); + + (v, r, s) = LibL2Signer.signAnchor(digest, uint8(2)); + signer = ecrecover(digest, v + 27, bytes32(r), bytes32(s)); + assertEq(signer, L2.GOLDEN_TOUCH_ADDRESS()); + + vm.expectRevert(LibL2Signer.L2_INVALID_GOLDEN_TOUCH_K.selector); + LibL2Signer.signAnchor(digest, uint8(0)); + + vm.expectRevert(LibL2Signer.L2_INVALID_GOLDEN_TOUCH_K.selector); + LibL2Signer.signAnchor(digest, uint8(3)); + } + + function test_L2_withdraw() external { + vm.prank(L2.owner(), L2.owner()); + L2.withdraw(address(0), Alice); + assertEq(address(L2).balance, 0 ether); + assertEq(Alice.balance, 100 ether); + + // Random EOA cannot call withdraw + vm.expectRevert(AddressResolver.RESOLVER_DENIED.selector); + vm.prank(Alice, Alice); + L2.withdraw(address(0), Alice); + } + + function test_L2_getBlockHash() external { + assertEq(L2.getBlockHash(uint64(1000)), 0); + } + + /// forge-config: layer2.fuzz.runs = 2000 + /// forge-config: layer2.fuzz.show-logs = true + function test_fuzz_getBasefeeV2( + uint32 _parentGasUsed, + uint32 _gasIssuancePerSecond, + uint64 _minGasExcess, + uint32 _maxGasIssuancePerBlock, + uint8 _adjustmentQuotient, + uint8 _sharingPctg + ) + external + { + LibSharedData.BaseFeeConfig memory baseFeeConfig = LibSharedData.BaseFeeConfig({ + adjustmentQuotient: _adjustmentQuotient, + sharingPctg: uint8(_sharingPctg % 100), + gasIssuancePerSecond: _gasIssuancePerSecond, + minGasExcess: _minGasExcess, + maxGasIssuancePerBlock: _maxGasIssuancePerBlock + }); + + (uint256 basefee_,,) = + L2.getBasefeeV2(_parentGasUsed, uint64(block.timestamp), baseFeeConfig); + assertTrue(basefee_ != 0, "basefee is 0"); + } + + /// forge-config: layer2.fuzz.runs = 2000 + /// forge-config: layer2.fuzz.show-logs = true + function test_fuzz_anchorV2( + uint32 _parentGasUsed, + uint32 _gasIssuancePerSecond, + uint64 _minGasExcess, + uint32 _maxGasIssuancePerBlock, + uint8 _adjustmentQuotient, + uint8 _sharingPctg + ) + external + { + if (_parentGasUsed == 0) _parentGasUsed = 1; + if (_gasIssuancePerSecond == 0) _gasIssuancePerSecond = 1; + if (_gasIssuancePerSecond == type(uint32).max) _gasIssuancePerSecond -= 1; + if (_adjustmentQuotient == 0) _adjustmentQuotient = 1; + + LibSharedData.BaseFeeConfig memory baseFeeConfig = LibSharedData.BaseFeeConfig({ + adjustmentQuotient: _adjustmentQuotient, + sharingPctg: uint8(_sharingPctg % 100), + gasIssuancePerSecond: _gasIssuancePerSecond, + minGasExcess: _minGasExcess, + maxGasIssuancePerBlock: _maxGasIssuancePerBlock + }); + + bytes32 anchorStateRoot = bytes32(uint256(1)); + vm.prank(L2.GOLDEN_TOUCH_ADDRESS()); + L2.anchorV2(++anchorBlockId, anchorStateRoot, _parentGasUsed, baseFeeConfig); + + (uint256 basefee, uint64 newGasTarget,) = + L2.getBasefeeV2(_parentGasUsed, uint64(block.timestamp), baseFeeConfig); + + assertTrue(basefee != 0, "basefee is 0"); + assertEq(newGasTarget, L2.parentGasTarget()); + + // change the gas issuance to change the gas target + baseFeeConfig.gasIssuancePerSecond += 1; + + (basefee, newGasTarget,) = + L2.getBasefeeV2(_parentGasUsed, uint64(block.timestamp), baseFeeConfig); + + assertTrue(basefee != 0, "basefee is 0"); + assertTrue(newGasTarget != L2.parentGasTarget()); + } + + function _anchorV2(uint32 parentGasUsed) private { + bytes32 anchorStateRoot = randBytes32(); + LibSharedData.BaseFeeConfig memory baseFeeConfig = LibSharedData.BaseFeeConfig({ + adjustmentQuotient: 8, + sharingPctg: 75, + gasIssuancePerSecond: 5_000_000, + minGasExcess: 1_340_000_000, + maxGasIssuancePerBlock: 600_000_000 // two minutes + }); + L2.anchorV2(++anchorBlockId, anchorStateRoot, parentGasUsed, baseFeeConfig); + } +} diff --git a/packages/protocol/test/layer2/TaikoL2Test.sol b/packages/protocol/test/layer2/TaikoL2Test.sol new file mode 100644 index 00000000000..a57ad6c00d7 --- /dev/null +++ b/packages/protocol/test/layer2/TaikoL2Test.sol @@ -0,0 +1,10 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import "src/layer2/DelegateOwner.sol"; +import "src/layer2/based/LibEIP1559.sol"; +import "src/layer2/based/TaikoL2.sol"; +import "test/layer2/LibL2Signer.sol"; +import "test/shared/TaikoTest.sol"; + +abstract contract TaikoL2Test is TaikoTest { } diff --git a/packages/protocol/test/libs/LibFixedPointMath.t.sol b/packages/protocol/test/libs/LibFixedPointMath.t.sol deleted file mode 100644 index 73cf16300ae..00000000000 --- a/packages/protocol/test/libs/LibFixedPointMath.t.sol +++ /dev/null @@ -1,47 +0,0 @@ -// SPDX-License-Identifier: MIT -// Some of the tests are taken from: -// https://github.com/recmo/experiment-solexp/blob/main/src/test/FixedPointMathLib.t.sol -pragma solidity 0.8.24; - -import "../TaikoTest.sol"; - -contract LibFixedPointMathTest is TaikoTest { - function testExp1() public { - assertEq(LibFixedPointMath.exp(-1e18), 367_879_441_171_442_321); - } - - function testExpSmallest() public pure { - int256 y = LibFixedPointMath.exp(-42_139_678_854_452_767_550); - - console2.log("LibFixedPointMath.exp(-42139678854452767550)=", uint256(y)); - } - - function testExpLargest() public pure { - int256 y = LibFixedPointMath.exp(int256(uint256(LibFixedPointMath.MAX_EXP_INPUT))); - console2.log("LibFixedPointMath.exp(135305999368893231588)=", uint256(y)); - } - - function testExpSome() public pure { - int256 y = LibFixedPointMath.exp(5e18); - console2.log("LibFixedPointMath.exp(5e18)=", uint256(y)); - } - - function testExpGas() public view { - uint256 g0 = gasleft(); - LibFixedPointMath.exp(133e18); - uint256 g1 = gasleft(); - LibFixedPointMath.exp(-23e18); - uint256 g2 = gasleft(); - LibFixedPointMath.exp(5e18); - uint256 g3 = gasleft(); - console2.logUint(g0 - g1); - console2.logUint(g1 - g2); - console2.logUint(g2 - g3); - } - - function testExp3() public pure { - LibFixedPointMath.exp(133e18); - LibFixedPointMath.exp(10e18); - LibFixedPointMath.exp(-23e18); - } -} diff --git a/packages/protocol/test/DeployCapability.sol b/packages/protocol/test/shared/DeployCapability.sol similarity index 97% rename from packages/protocol/test/DeployCapability.sol rename to packages/protocol/test/shared/DeployCapability.sol index 4da2b1ff125..fd2a8681bcd 100644 --- a/packages/protocol/test/DeployCapability.sol +++ b/packages/protocol/test/shared/DeployCapability.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; @@ -8,7 +8,7 @@ import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; import "forge-std/src/console2.sol"; import "forge-std/src/Script.sol"; -import "../contracts/common/AddressManager.sol"; +import "src/shared/common/AddressManager.sol"; /// @title DeployCapability abstract contract DeployCapability is Script { diff --git a/packages/protocol/test/HelperContracts.sol b/packages/protocol/test/shared/HelperContracts.sol similarity index 90% rename from packages/protocol/test/HelperContracts.sol rename to packages/protocol/test/shared/HelperContracts.sol index 2253a3be915..769b7a5fed0 100644 --- a/packages/protocol/test/HelperContracts.sol +++ b/packages/protocol/test/shared/HelperContracts.sol @@ -1,8 +1,8 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; -import "../contracts/bridge/Bridge.sol"; -import "../contracts/signal/SignalService.sol"; +import "src/shared/bridge/Bridge.sol"; +import "src/shared/signal/SignalService.sol"; contract BadReceiver { receive() external payable { diff --git a/packages/protocol/test/TaikoTest.sol b/packages/protocol/test/shared/TaikoTest.sol similarity index 66% rename from packages/protocol/test/TaikoTest.sol rename to packages/protocol/test/shared/TaikoTest.sol index 025d9666193..a71bb75ae8f 100644 --- a/packages/protocol/test/TaikoTest.sol +++ b/packages/protocol/test/shared/TaikoTest.sol @@ -1,45 +1,30 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import "forge-std/src/Test.sol"; import "@openzeppelin/contracts/utils/math/SafeCast.sol"; import "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; -import "../contracts/tokenvault/BridgedERC20.sol"; -import "../contracts/tokenvault/BridgedERC721.sol"; -import "../contracts/tokenvault/BridgedERC1155.sol"; -import "../contracts/tokenvault/ERC20Vault.sol"; -import "../contracts/tokenvault/ERC721Vault.sol"; -import "../contracts/tokenvault/ERC1155Vault.sol"; - -import "../contracts/tko/TaikoToken.sol"; -import "../contracts/L1/TaikoL1.sol"; -import "../contracts/verifiers/SgxVerifier.sol"; -import "../contracts/verifiers/RiscZeroVerifier.sol"; -import "../test/L1/TestTierProvider.sol"; -import "../contracts/L1/hooks/AssignmentHook.sol"; -import "../contracts/L1/provers/GuardianProver.sol"; -import "../contracts/bridge/QuotaManager.sol"; - -import "../contracts/L2/DelegateOwner.sol"; - -import "../contracts/team/airdrop/ERC20Airdrop.sol"; - -import "../test/common/erc20/FreeMintERC20.sol"; -import "../test/L2/TaikoL2EIP1559Configurable.sol"; - +import "src/shared/tokenvault/BridgedERC20V2.sol"; +import "src/shared/tokenvault/BridgedERC721.sol"; +import "src/shared/tokenvault/BridgedERC1155.sol"; +import "src/shared/tokenvault/ERC20Vault.sol"; +import "src/shared/tokenvault/ERC721Vault.sol"; +import "src/shared/tokenvault/ERC1155Vault.sol"; +import "./token/FreeMintERC20.sol"; +import "./token/RegularERC20.sol"; +import "./token/MayFailFreeMintERC20.sol"; import "./DeployCapability.sol"; import "./HelperContracts.sol"; -import "./L2/LibL2Signer.sol"; abstract contract TaikoTest is Test, DeployCapability { uint256 private _seed = 0x12345678; address internal Alice = vm.addr(0x1); address internal Bob = vm.addr(0x2); address internal Carol = vm.addr(0x3); - address internal David = randAddress(); - address internal Emma = randAddress(); + address internal David = vm.addr(0x4); + address internal Emma = vm.addr(0x5); address internal Frank = randAddress(); address internal Grace = randAddress(); address internal Henry = randAddress(); diff --git a/packages/protocol/test/bridge/Bridge.t.sol b/packages/protocol/test/shared/bridge/Bridge.t.sol similarity index 96% rename from packages/protocol/test/bridge/Bridge.t.sol rename to packages/protocol/test/shared/bridge/Bridge.t.sol index 8ebf8c9715d..9406a70ce1c 100644 --- a/packages/protocol/test/bridge/Bridge.t.sol +++ b/packages/protocol/test/shared/bridge/Bridge.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import "../TaikoTest.sol"; @@ -40,7 +40,6 @@ contract BridgeTest is TaikoTest { SignalService signalService; SkipProofCheckSignal mockProofSignalService; UntrustedSendMessageRelayer untrustedSenderContract; - DelegateOwner delegateOwner; NonMaliciousContract1 nonmaliciousContract1; MaliciousContract2 maliciousContract2; @@ -86,18 +85,6 @@ contract BridgeTest is TaikoTest { uint64 l1ChainId = uint64(block.chainid); vm.chainId(destChainId); - delegateOwner = DelegateOwner( - payable( - deployProxy({ - name: "delegate_owner", - impl: address(new DelegateOwner()), - data: abi.encodeCall( - DelegateOwner.init, (mockDAO, address(addressManager), l1ChainId) - ) - }) - ) - ); - vm.chainId(l1ChainId); mockProofSignalService = SkipProofCheckSignal( @@ -132,12 +119,6 @@ contract BridgeTest is TaikoTest { register(address(addressManager), "bridge_watchdog", address(uint160(123)), destChainId); - // Otherwise delegateOwner cannot do actions on them, on behalf of the DAO. - destChainBridge.transferOwnership(address(delegateOwner)); - delegateOwner.acceptOwnership(address(destChainBridge)); - mockProofSignalService.transferOwnership(address(delegateOwner)); - delegateOwner.acceptOwnership(address(mockProofSignalService)); - vm.stopPrank(); } diff --git a/packages/protocol/test/bridge/Bridge2.t.sol b/packages/protocol/test/shared/bridge/Bridge2.t.sol similarity index 98% rename from packages/protocol/test/bridge/Bridge2.t.sol rename to packages/protocol/test/shared/bridge/Bridge2.t.sol index 621bf1fa484..95ffe3075b7 100644 --- a/packages/protocol/test/bridge/Bridge2.t.sol +++ b/packages/protocol/test/shared/bridge/Bridge2.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import "../TaikoTest.sol"; diff --git a/packages/protocol/test/bridge/Bridge2_failMessage.t.sol b/packages/protocol/test/shared/bridge/Bridge2_failMessage.t.sol similarity index 99% rename from packages/protocol/test/bridge/Bridge2_failMessage.t.sol rename to packages/protocol/test/shared/bridge/Bridge2_failMessage.t.sol index 6ac17268f65..c677c76daa2 100644 --- a/packages/protocol/test/bridge/Bridge2_failMessage.t.sol +++ b/packages/protocol/test/shared/bridge/Bridge2_failMessage.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import "./Bridge2.t.sol"; diff --git a/packages/protocol/test/bridge/Bridge2_processMessage.t.sol b/packages/protocol/test/shared/bridge/Bridge2_processMessage.t.sol similarity index 99% rename from packages/protocol/test/bridge/Bridge2_processMessage.t.sol rename to packages/protocol/test/shared/bridge/Bridge2_processMessage.t.sol index 76019070a91..5c3ed60b746 100644 --- a/packages/protocol/test/bridge/Bridge2_processMessage.t.sol +++ b/packages/protocol/test/shared/bridge/Bridge2_processMessage.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import "./Bridge2.t.sol"; diff --git a/packages/protocol/test/bridge/Bridge2_recallMessage.t.sol b/packages/protocol/test/shared/bridge/Bridge2_recallMessage.t.sol similarity index 99% rename from packages/protocol/test/bridge/Bridge2_recallMessage.t.sol rename to packages/protocol/test/shared/bridge/Bridge2_recallMessage.t.sol index f23095f0826..d45331ce74e 100644 --- a/packages/protocol/test/bridge/Bridge2_recallMessage.t.sol +++ b/packages/protocol/test/shared/bridge/Bridge2_recallMessage.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import "./Bridge2.t.sol"; diff --git a/packages/protocol/test/bridge/Bridge2_retryMessage.t.sol b/packages/protocol/test/shared/bridge/Bridge2_retryMessage.t.sol similarity index 99% rename from packages/protocol/test/bridge/Bridge2_retryMessage.t.sol rename to packages/protocol/test/shared/bridge/Bridge2_retryMessage.t.sol index b450bc05655..ab4c8a65213 100644 --- a/packages/protocol/test/bridge/Bridge2_retryMessage.t.sol +++ b/packages/protocol/test/shared/bridge/Bridge2_retryMessage.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import "./Bridge2.t.sol"; diff --git a/packages/protocol/test/bridge/Bridge2_sendMessage.t.sol b/packages/protocol/test/shared/bridge/Bridge2_sendMessage.t.sol similarity index 97% rename from packages/protocol/test/bridge/Bridge2_sendMessage.t.sol rename to packages/protocol/test/shared/bridge/Bridge2_sendMessage.t.sol index a0c43980051..b8dded2413d 100644 --- a/packages/protocol/test/bridge/Bridge2_sendMessage.t.sol +++ b/packages/protocol/test/shared/bridge/Bridge2_sendMessage.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import "./Bridge2.t.sol"; @@ -31,7 +31,7 @@ contract BridgeTest2_sendMessage is BridgeTest2 { vm.expectRevert(Bridge.B_INVALID_CHAINID.selector); bridge.sendMessage(message); - // an bridge has been registered for remoteChainId + // a bridge has been registered for remoteChainId message.destChainId = remoteChainId; bridge.sendMessage(message); // id = 0 diff --git a/packages/protocol/test/bridge/QuotaManager.t.sol b/packages/protocol/test/shared/bridge/QuotaManager.t.sol similarity index 99% rename from packages/protocol/test/bridge/QuotaManager.t.sol rename to packages/protocol/test/shared/bridge/QuotaManager.t.sol index 3c7985e6294..fa44f0cc9e6 100644 --- a/packages/protocol/test/bridge/QuotaManager.t.sol +++ b/packages/protocol/test/shared/bridge/QuotaManager.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import "../TaikoTest.sol"; diff --git a/packages/protocol/test/common/AddressManager.t.sol b/packages/protocol/test/shared/common/AddressManager.t.sol similarity index 93% rename from packages/protocol/test/common/AddressManager.t.sol rename to packages/protocol/test/shared/common/AddressManager.t.sol index f4470d43a64..94e64b5c836 100644 --- a/packages/protocol/test/common/AddressManager.t.sol +++ b/packages/protocol/test/shared/common/AddressManager.t.sol @@ -1,10 +1,10 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; -import "../L1/TaikoL1TestBase.sol"; +import "../TaikoTest.sol"; /// @author Kirk Baird -contract TestAddressManager is TaikoL1TestBase { +contract TestAddressManager is TaikoTest { function deployTaikoL1() internal override returns (TaikoL1) { return TaikoL1(payable(deployProxy({ name: "taiko", impl: address(new TaikoL1()), data: "" }))); diff --git a/packages/protocol/test/common/AddressResolver.t.sol b/packages/protocol/test/shared/common/AddressResolver.t.sol similarity index 92% rename from packages/protocol/test/common/AddressResolver.t.sol rename to packages/protocol/test/shared/common/AddressResolver.t.sol index 2cb5a31c6ac..b416c950db2 100644 --- a/packages/protocol/test/common/AddressResolver.t.sol +++ b/packages/protocol/test/shared/common/AddressResolver.t.sol @@ -1,10 +1,10 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; -import "../L1/TaikoL1TestBase.sol"; +import "../TaikoTest.sol"; /// @author Kirk Baird -contract TestAddressResolver is TaikoL1TestBase { +contract TestAddressResolver is TaikoTest { function deployTaikoL1() internal override returns (TaikoL1) { return TaikoL1(payable(deployProxy({ name: "taiko", impl: address(new TaikoL1()), data: "" }))); diff --git a/packages/protocol/test/common/EssentialContract.t.sol b/packages/protocol/test/shared/common/EssentialContract.t.sol similarity index 98% rename from packages/protocol/test/common/EssentialContract.t.sol rename to packages/protocol/test/shared/common/EssentialContract.t.sol index 2012cffebd9..dc9d90eeae3 100644 --- a/packages/protocol/test/common/EssentialContract.t.sol +++ b/packages/protocol/test/shared/common/EssentialContract.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import "../TaikoTest.sol"; diff --git a/packages/protocol/test/libs/LibAddress.t.sol b/packages/protocol/test/shared/common/LibAddress.t.sol similarity index 98% rename from packages/protocol/test/libs/LibAddress.t.sol rename to packages/protocol/test/shared/common/LibAddress.t.sol index 890798cce4a..b575c56e171 100644 --- a/packages/protocol/test/libs/LibAddress.t.sol +++ b/packages/protocol/test/shared/common/LibAddress.t.sol @@ -1,8 +1,8 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import "../TaikoTest.sol"; -import "../../contracts/libs/LibAddress.sol"; +import "src/shared/common/LibAddress.sol"; contract CalldataReceiver { // Returns success diff --git a/packages/protocol/test/libs/LibTrieProof.t.sol b/packages/protocol/test/shared/common/LibTrieProof.t.sol similarity index 99% rename from packages/protocol/test/libs/LibTrieProof.t.sol rename to packages/protocol/test/shared/common/LibTrieProof.t.sol index 69f198ee4a0..08f5d59c309 100644 --- a/packages/protocol/test/libs/LibTrieProof.t.sol +++ b/packages/protocol/test/shared/common/LibTrieProof.t.sol @@ -1,8 +1,8 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; +import "src/shared/common/LibTrieProof.sol"; import "../TaikoTest.sol"; -import "../../contracts/libs/LibTrieProof.sol"; contract TestLibTrieProof is TaikoTest { function test_verifyMerkleProof() public { diff --git a/packages/protocol/test/signal/SignalService.t.sol b/packages/protocol/test/shared/signal/SignalService.t.sol similarity index 99% rename from packages/protocol/test/signal/SignalService.t.sol rename to packages/protocol/test/shared/signal/SignalService.t.sol index c6db7f293fb..289d35fc60e 100644 --- a/packages/protocol/test/signal/SignalService.t.sol +++ b/packages/protocol/test/shared/signal/SignalService.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import "../TaikoTest.sol"; import "forge-std/src/console2.sol"; diff --git a/packages/protocol/test/thirdparty/LibUint512Math.sol b/packages/protocol/test/shared/thirdparty/LibUint512Math.sol similarity index 99% rename from packages/protocol/test/thirdparty/LibUint512Math.sol rename to packages/protocol/test/shared/thirdparty/LibUint512Math.sol index a5077d80061..ae732cf8eba 100644 --- a/packages/protocol/test/thirdparty/LibUint512Math.sol +++ b/packages/protocol/test/shared/thirdparty/LibUint512Math.sol @@ -23,7 +23,7 @@ // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE // SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -pragma solidity 0.8.24; +pragma solidity ^0.8.24; /// @title LibUint512Math library LibUint512Math { diff --git a/packages/protocol/test/shared/thirdparty/Multicall3.sol b/packages/protocol/test/shared/thirdparty/Multicall3.sol new file mode 100644 index 00000000000..38b96a3e872 --- /dev/null +++ b/packages/protocol/test/shared/thirdparty/Multicall3.sol @@ -0,0 +1,256 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +/// @title Multicall3 +/// @notice Aggregate results from multiple function calls +/// @dev Multicall & Multicall2 backwards-compatible +/// @dev Aggregate methods are marked `payable` to save 24 gas per call +/// @author Michael Elliot +/// @author Joshua Levine +/// @author Nick Johnson +/// @author Andreas Bigger +/// @author Matt Solomon +contract Multicall3 { + struct Call { + address target; + bytes callData; + } + + struct Call3 { + address target; + bool allowFailure; + bytes callData; + } + + struct Call3Value { + address target; + bool allowFailure; + uint256 value; + bytes callData; + } + + struct Result { + bool success; + bytes returnData; + } + + /// @notice Backwards-compatible call aggregation with Multicall + /// @param calls An array of Call structs + /// @return blockNumber The block number where the calls were executed + /// @return returnData An array of bytes containing the responses + function aggregate(Call[] calldata calls) + public + payable + returns (uint256 blockNumber, bytes[] memory returnData) + { + blockNumber = block.number; + uint256 length = calls.length; + returnData = new bytes[](length); + Call calldata call; + for (uint256 i = 0; i < length;) { + bool success; + call = calls[i]; + (success, returnData[i]) = call.target.call(call.callData); + require(success, "Multicall3: call failed"); + unchecked { + ++i; + } + } + } + + /// @notice Backwards-compatible with Multicall2 + /// @notice Aggregate calls without requiring success + /// @param requireSuccess If true, require all calls to succeed + /// @param calls An array of Call structs + /// @return returnData An array of Result structs + function tryAggregate( + bool requireSuccess, + Call[] calldata calls + ) + public + payable + returns (Result[] memory returnData) + { + uint256 length = calls.length; + returnData = new Result[](length); + Call calldata call; + for (uint256 i = 0; i < length;) { + Result memory result = returnData[i]; + call = calls[i]; + (result.success, result.returnData) = call.target.call(call.callData); + if (requireSuccess) require(result.success, "Multicall3: call failed"); + unchecked { + ++i; + } + } + } + + /// @notice Backwards-compatible with Multicall2 + /// @notice Aggregate calls and allow failures using tryAggregate + /// @param calls An array of Call structs + /// @return blockNumber The block number where the calls were executed + /// @return blockHash The hash of the block where the calls were executed + /// @return returnData An array of Result structs + function tryBlockAndAggregate( + bool requireSuccess, + Call[] calldata calls + ) + public + payable + returns (uint256 blockNumber, bytes32 blockHash, Result[] memory returnData) + { + blockNumber = block.number; + blockHash = blockhash(block.number); + returnData = tryAggregate(requireSuccess, calls); + } + + /// @notice Backwards-compatible with Multicall2 + /// @notice Aggregate calls and allow failures using tryAggregate + /// @param calls An array of Call structs + /// @return blockNumber The block number where the calls were executed + /// @return blockHash The hash of the block where the calls were executed + /// @return returnData An array of Result structs + function blockAndAggregate(Call[] calldata calls) + public + payable + returns (uint256 blockNumber, bytes32 blockHash, Result[] memory returnData) + { + (blockNumber, blockHash, returnData) = tryBlockAndAggregate(true, calls); + } + + /// @notice Aggregate calls, ensuring each returns success if required + /// @param calls An array of Call3 structs + /// @return returnData An array of Result structs + function aggregate3(Call3[] calldata calls) + public + payable + returns (Result[] memory returnData) + { + uint256 length = calls.length; + returnData = new Result[](length); + Call3 calldata calli; + for (uint256 i = 0; i < length;) { + Result memory result = returnData[i]; + calli = calls[i]; + (result.success, result.returnData) = calli.target.call(calli.callData); + assembly { + // Revert if the call fails and failure is not allowed + // `allowFailure := calldataload(add(calli, 0x20))` and `success := mload(result)` + if iszero(or(calldataload(add(calli, 0x20)), mload(result))) { + // set "Error(string)" signature: bytes32(bytes4(keccak256("Error(string)"))) + mstore(0x00, 0x08c379a000000000000000000000000000000000000000000000000000000000) + // set data offset + mstore(0x04, 0x0000000000000000000000000000000000000000000000000000000000000020) + // set length of revert string + mstore(0x24, 0x0000000000000000000000000000000000000000000000000000000000000017) + // set revert string: bytes32(abi.encodePacked("Multicall3: call failed")) + mstore(0x44, 0x4d756c746963616c6c333a2063616c6c206661696c6564000000000000000000) + revert(0x00, 0x64) + } + } + unchecked { + ++i; + } + } + } + + /// @notice Aggregate calls with a msg value + /// @notice Reverts if msg.value is less than the sum of the call values + /// @param calls An array of Call3Value structs + /// @return returnData An array of Result structs + function aggregate3Value(Call3Value[] calldata calls) + public + payable + returns (Result[] memory returnData) + { + uint256 valAccumulator; + uint256 length = calls.length; + returnData = new Result[](length); + Call3Value calldata calli; + for (uint256 i = 0; i < length;) { + Result memory result = returnData[i]; + calli = calls[i]; + uint256 val = calli.value; + // Humanity will be a Type V Kardashev Civilization before this overflows - andreas + // ~ 10^25 Wei in existence << ~ 10^76 size uint fits in a uint256 + unchecked { + valAccumulator += val; + } + (result.success, result.returnData) = calli.target.call{ value: val }(calli.callData); + assembly { + // Revert if the call fails and failure is not allowed + // `allowFailure := calldataload(add(calli, 0x20))` and `success := mload(result)` + if iszero(or(calldataload(add(calli, 0x20)), mload(result))) { + // set "Error(string)" signature: bytes32(bytes4(keccak256("Error(string)"))) + mstore(0x00, 0x08c379a000000000000000000000000000000000000000000000000000000000) + // set data offset + mstore(0x04, 0x0000000000000000000000000000000000000000000000000000000000000020) + // set length of revert string + mstore(0x24, 0x0000000000000000000000000000000000000000000000000000000000000017) + // set revert string: bytes32(abi.encodePacked("Multicall3: call failed")) + mstore(0x44, 0x4d756c746963616c6c333a2063616c6c206661696c6564000000000000000000) + revert(0x00, 0x84) + } + } + unchecked { + ++i; + } + } + // Finally, make sure the msg.value = SUM(call[0...i].value) + require(msg.value == valAccumulator, "Multicall3: value mismatch"); + } + + /// @notice Returns the block hash for the given block number + /// @param blockNumber The block number + function getBlockHash(uint256 blockNumber) public view returns (bytes32 blockHash) { + blockHash = blockhash(blockNumber); + } + + /// @notice Returns the block number + function getBlockNumber() public view returns (uint256 blockNumber) { + blockNumber = block.number; + } + + /// @notice Returns the block coinbase + function getCurrentBlockCoinbase() public view returns (address coinbase) { + coinbase = block.coinbase; + } + + /// @notice Returns the block difficulty + function getCurrentBlockDifficulty() public view returns (uint256 difficulty) { + difficulty = block.prevrandao; + } + + /// @notice Returns the block gas limit + function getCurrentBlockGasLimit() public view returns (uint256 gaslimit) { + gaslimit = block.gaslimit; + } + + /// @notice Returns the block timestamp + function getCurrentBlockTimestamp() public view returns (uint256 timestamp) { + timestamp = block.timestamp; + } + + /// @notice Returns the (ETH) balance of a given address + function getEthBalance(address addr) public view returns (uint256 balance) { + balance = addr.balance; + } + + /// @notice Returns the block hash of the last block + function getLastBlockHash() public view returns (bytes32 blockHash) { + unchecked { + blockHash = blockhash(block.number - 1); + } + } + + /// @notice Gets the base fee of the given block + /// @notice Can revert if the BASEFEE opcode is not implemented by the given chain + function getBasefee() public view returns (uint256 basefee) { + basefee = block.basefee; + } + + /// @notice Returns the chain id + function getChainId() public view returns (uint256 chainid) { + chainid = block.chainid; + } +} diff --git a/packages/protocol/test/common/erc20/FreeMintERC20.sol b/packages/protocol/test/shared/token/FreeMintERC20.sol similarity index 95% rename from packages/protocol/test/common/erc20/FreeMintERC20.sol rename to packages/protocol/test/shared/token/FreeMintERC20.sol index a928dd80cc8..96e02962edc 100644 --- a/packages/protocol/test/common/erc20/FreeMintERC20.sol +++ b/packages/protocol/test/shared/token/FreeMintERC20.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; diff --git a/packages/protocol/test/common/erc20/MayFailFreeMintERC20.sol b/packages/protocol/test/shared/token/MayFailFreeMintERC20.sol similarity index 98% rename from packages/protocol/test/common/erc20/MayFailFreeMintERC20.sol rename to packages/protocol/test/shared/token/MayFailFreeMintERC20.sol index 58044944f1c..4fe4e76501a 100644 --- a/packages/protocol/test/common/erc20/MayFailFreeMintERC20.sol +++ b/packages/protocol/test/shared/token/MayFailFreeMintERC20.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; diff --git a/packages/protocol/test/common/erc20/RegularERC20.sol b/packages/protocol/test/shared/token/RegularERC20.sol similarity index 90% rename from packages/protocol/test/common/erc20/RegularERC20.sol rename to packages/protocol/test/shared/token/RegularERC20.sol index 4985d937d36..5216f9077af 100644 --- a/packages/protocol/test/common/erc20/RegularERC20.sol +++ b/packages/protocol/test/shared/token/RegularERC20.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; diff --git a/packages/protocol/test/tokenvault/BridgedERC20.t.sol b/packages/protocol/test/shared/tokenvault/BridgedERC20V2.t.sol similarity index 98% rename from packages/protocol/test/tokenvault/BridgedERC20.t.sol rename to packages/protocol/test/shared/tokenvault/BridgedERC20V2.t.sol index 80470c70644..9d07025e40b 100644 --- a/packages/protocol/test/tokenvault/BridgedERC20.t.sol +++ b/packages/protocol/test/shared/tokenvault/BridgedERC20V2.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import "../TaikoTest.sol"; @@ -127,7 +127,7 @@ contract TestBridgedERC20 is TaikoTest { return BridgedERC20( deployProxy({ name: "bridged_token1", - impl: address(new BridgedERC20()), + impl: address(new BridgedERC20V2()), data: abi.encodeCall( BridgedERC20.init, (owner, address(manager), srcToken, srcChainId, srcDecimals, name, name) diff --git a/packages/protocol/test/tokenvault/ERC1155Vault.t.sol b/packages/protocol/test/shared/tokenvault/ERC1155Vault.t.sol similarity index 99% rename from packages/protocol/test/tokenvault/ERC1155Vault.t.sol rename to packages/protocol/test/shared/tokenvault/ERC1155Vault.t.sol index c7a4853e664..6c28e585e7d 100644 --- a/packages/protocol/test/tokenvault/ERC1155Vault.t.sol +++ b/packages/protocol/test/shared/tokenvault/ERC1155Vault.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import "@openzeppelin/contracts/token/ERC1155/ERC1155.sol"; import "../TaikoTest.sol"; diff --git a/packages/protocol/test/tokenvault/ERC20Vault.t.sol b/packages/protocol/test/shared/tokenvault/ERC20Vault.t.sol similarity index 99% rename from packages/protocol/test/tokenvault/ERC20Vault.t.sol rename to packages/protocol/test/shared/tokenvault/ERC20Vault.t.sol index 98f1c9ddc12..1f8804a84f8 100644 --- a/packages/protocol/test/tokenvault/ERC20Vault.t.sol +++ b/packages/protocol/test/shared/tokenvault/ERC20Vault.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import "../TaikoTest.sol"; @@ -61,7 +61,7 @@ contract PrankDestBridge { } } -contract UpdatedBridgedERC20 is BridgedERC20 { +contract UpdatedBridgedERC20 is BridgedERC20V2 { function helloWorld() public pure returns (string memory) { return "helloworld"; } diff --git a/packages/protocol/test/tokenvault/ERC721Vault.t.sol b/packages/protocol/test/shared/tokenvault/ERC721Vault.t.sol similarity index 99% rename from packages/protocol/test/tokenvault/ERC721Vault.t.sol rename to packages/protocol/test/shared/tokenvault/ERC721Vault.t.sol index c43ed5fde0b..0ef70957687 100644 --- a/packages/protocol/test/tokenvault/ERC721Vault.t.sol +++ b/packages/protocol/test/shared/tokenvault/ERC721Vault.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import "@openzeppelin/contracts/token/ERC721/ERC721.sol"; import "../TaikoTest.sol"; diff --git a/packages/protocol/test/thirdparty/LibFixedPointMath.t.sol b/packages/protocol/test/thirdparty/LibFixedPointMath.t.sol deleted file mode 100644 index 917a31bc936..00000000000 --- a/packages/protocol/test/thirdparty/LibFixedPointMath.t.sol +++ /dev/null @@ -1,40 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.24; - -import "../TaikoTest.sol"; - -/// @author Kirk Baird -contract TestLibFixedPointMath is TaikoTest { - function test_exp() external { - assertEq(LibFixedPointMath.exp(1e18), 2_718_281_828_459_045_235); // 2.718281828459045235 - assertEq(LibFixedPointMath.exp(2e18), 7_389_056_098_930_650_227); // 7.389056098930650227 - assertEq(LibFixedPointMath.exp(0), 1_000_000_000_000_000_000); // 1 - assertEq(LibFixedPointMath.exp(-1e18), 367_879_441_171_442_321); // 0.3678794411714423216 - assertEq(LibFixedPointMath.exp(1), 1_000_000_000_000_000_001); //1.000000000000000001 - assertEq(LibFixedPointMath.exp(-1), 999_999_999_999_999_999); //0.9999999999999999990 - - // accurate up to 1e-16% - assertApproxEqRel( - LibFixedPointMath.exp(135e18), - 42_633_899_483_147_210_448_936_866_880_765_989_356_468_745_853_255_281_087_440_011_736_227_864_297_277, - 1 - ); // 42633899483147210448936866880765989356468745853255281087440.011736227864297277 - - // accurate up to 1e-16% - assertApproxEqRel( - LibFixedPointMath.exp(135_305_999_368_893_231_588), - 57_896_044_618_658_097_649_816_762_928_942_336_782_129_491_980_154_662_247_847_962_410_455_084_893_091, - 1 - ); // 57896044618658097649816762928942336782129491980154662247847.962410455084893091 - - assertEq(LibFixedPointMath.exp(-40e18), 4); - - // returns 0 if result is <0.5 - assertEq(LibFixedPointMath.exp(-42_139_678_854_452_767_552), 0); - } - - function test_exp_overflow() external { - vm.expectRevert(LibFixedPointMath.Overflow.selector); - LibFixedPointMath.exp(135_305_999_368_893_231_589); // max input is 135305999368893231588 - } -} diff --git a/packages/protocol/test/thirdparty/optimisim/Bytes.t.sol b/packages/protocol/test/thirdparty/optimisim/Bytes.t.sol deleted file mode 100644 index 7a94ffe63f9..00000000000 --- a/packages/protocol/test/thirdparty/optimisim/Bytes.t.sol +++ /dev/null @@ -1,129 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.24; - -import "../../TaikoTest.sol"; -import "../../../contracts/thirdparty/optimism/Bytes.sol"; -/// @author Kirk Baird - -contract TestBytes is TaikoTest { - function test_toNibbles() external { - // 20 Bytes input - bytes memory someBytes = hex"0123456789012345678901234567890123456789"; - bytes memory nibbles = Bytes.toNibbles(someBytes); - assertEq( - hex"00010203040506070809000102030405060708090001020304050607080900010203040506070809", - nibbles - ); - - // Empty bytes input - bytes memory emptyBytes; - nibbles = Bytes.toNibbles(emptyBytes); - assertEq(nibbles, hex""); - } - - // We test slice using case division based on different input sizes, starts and lengths - function test_slice() external { - // 1. 20 bytes input - bytes memory someBytes = hex"0123456789012345678901234567890123456789"; - - // 1.A. 0 length - // 1.A.i. 0 start - assertEq(Bytes.slice(someBytes, 0, 0), hex""); - - // 1.A.ii. partial start - assertEq(Bytes.slice(someBytes, 7, 0), hex""); - - // 1.A.iii. end start - assertEq(Bytes.slice(someBytes, someBytes.length, 0), hex""); - - // 1.B. full length - // 1.B.i. 0 start - assertEq( - Bytes.slice(someBytes, 0, someBytes.length), - hex"0123456789012345678901234567890123456789" - ); - - // 1.B.ii. partial start - vm.expectRevert("slice_outOfBounds"); - Bytes.slice(someBytes, 7, someBytes.length); - - // 1.C. partial length - // 1.C.i. 0 start - assertEq(Bytes.slice(someBytes, 0, 9), hex"012345678901234567"); - - // 1.C.ii. partial start - assertEq(Bytes.slice(someBytes, 7, 9), hex"456789012345678901"); - - // 1.C.iii. partial start, until exact end of input - assertEq(Bytes.slice(someBytes, 11, 9), hex"234567890123456789"); - - // 1.C.iv. end start - vm.expectRevert("slice_outOfBounds"); - Bytes.slice(someBytes, someBytes.length, 9); - - // 2. 64 byte input - someBytes = - hex"0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"; - - // 2.A. 0 length - // 2.A.i. 0 start - assertEq(Bytes.slice(someBytes, 0, 0), hex""); - - // 2.A.ii. partial start - assertEq(Bytes.slice(someBytes, 7, 0), hex""); - - // 2.A.iii. end start - assertEq(Bytes.slice(someBytes, someBytes.length, 0), hex""); - - // 2.B. full length - // 2.B.i. 0 start - assertEq( - Bytes.slice(someBytes, 0, someBytes.length), - hex"0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - ); - - // 2.B.ii. partial start - vm.expectRevert("slice_outOfBounds"); - Bytes.slice(someBytes, 7, someBytes.length); // TODO Foundry bug - - // 2.C. partial length - // 2.C.i. 0 start - assertEq(Bytes.slice(someBytes, 0, 9), hex"0123456789abcdef01"); - - // 2.C.ii. partial start - assertEq(Bytes.slice(someBytes, 7, 9), hex"ef0123456789abcdef"); - - // 2.C.iii. partial start, until exact end of input - assertEq(Bytes.slice(someBytes, 55, 9), hex"ef0123456789abcdef"); - - // 2.C.iv. end start - vm.expectRevert("slice_outOfBounds"); - Bytes.slice(someBytes, someBytes.length, 9); - - // 3. 0 byte input - someBytes = hex""; - - // 3.A. 0 start - assertEq(Bytes.slice(someBytes, 0, 0), hex""); - - // 3.B. overflow start - vm.expectRevert("slice_outOfBounds"); - Bytes.slice(someBytes, 1, 0); - - // 3.C. overflow length - vm.expectRevert("slice_outOfBounds"); - Bytes.slice(someBytes, 0, 1); - } - - function test_slice2() external { - // 20 byte input - bytes memory someBytes = hex"0123456789012345678901234567890123456789"; - - assertEq(Bytes.slice(someBytes, 0), hex"0123456789012345678901234567890123456789"); - - assertEq(Bytes.slice(someBytes, 10), hex"01234567890123456789"); - - assertEq(Bytes.slice(someBytes, someBytes.length * 1000), hex""); //Doesnt revert if start - // is out of bounds - } -} diff --git a/packages/protocol/test/thirdparty/optimisim/rlp/RLPReader.t.sol b/packages/protocol/test/thirdparty/optimisim/rlp/RLPReader.t.sol deleted file mode 100644 index d9986ce4efc..00000000000 --- a/packages/protocol/test/thirdparty/optimisim/rlp/RLPReader.t.sol +++ /dev/null @@ -1,128 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.24; - -import "../../../TaikoTest.sol"; - -/// @author Kirk Baird -contract TestRLPReader is TaikoTest { - function test_readList_correctList() external { - bytes memory encodedList = hex"c3010203"; // "[0x01, 0x02, 0x03]" - RLPReader.RLPItem[] memory decodedList = RLPReader.readList(encodedList); - assertEq(decodedList.length, 3); - assertEq(RLPReader.readBytes(decodedList[0]), hex"01"); - assertEq(RLPReader.readBytes(decodedList[1]), hex"02"); - assertEq(RLPReader.readBytes(decodedList[2]), hex"03"); - } - - function test_readList_emptyList() external { - bytes memory encodedList = hex"c0"; // "[]" - RLPReader.RLPItem[] memory decodedList = RLPReader.readList(encodedList); - assertEq(decodedList.length, 0); - } - - function test_readList_emptyListNull() external { - bytes memory encodedList = hex"c180"; // "[""]" - RLPReader.RLPItem[] memory decodedList = RLPReader.readList(encodedList); - assertEq(decodedList.length, 1); - assertEq(RLPReader.readBytes(decodedList[0]), hex""); - } - - function test_readList_nestedList() external { - bytes memory encodedList = hex"c3c10102"; // "[["0x01"],"0x02"]" - RLPReader.RLPItem[] memory decodedList = RLPReader.readList(encodedList); - assertEq(decodedList.length, 2); - assertEq(RLPReader.readBytes(decodedList[1]), hex"02"); - RLPReader.RLPItem[] memory nestedDecodedList = RLPReader.readList(decodedList[0]); - assertEq(nestedDecodedList.length, 1); - assertEq(RLPReader.readBytes(nestedDecodedList[0]), hex"01"); - } - - function test_readList_invalidLength() external { - bytes memory encodedList = hex"e1a00000000000000000000000000000000000000000000000000001"; - vm.expectRevert( - "RLPReader: length of content must be greater than list length (short list)" - ); - RLPReader.readList(encodedList); - } - - function test_readList_empty() external { - bytes memory empty = hex""; - vm.expectRevert( - "RLPReader: length of an RLP item must be greater than zero to be decodable" - ); - RLPReader.readList(empty); - } - - function test_readList_null() external { - bytes memory encodedNull = hex"80"; - vm.expectRevert("RLPReader: decoded item type for list is not a list item"); - RLPReader.readList(encodedNull); - } - - function test_readList_nonList() external { - bytes memory encodedNumber = hex"8204d2"; // "1234" - vm.expectRevert("RLPReader: decoded item type for list is not a list item"); - RLPReader.readList(encodedNumber); - } - - function test_readBytes_correctFourBytes() external { - bytes memory encodedBytes = hex"8412345678"; // "0x12345678" - bytes memory decodedBytes = RLPReader.readBytes(encodedBytes); - assertEq(decodedBytes.length, 4); - assertEq(decodedBytes, hex"12345678"); - } - - function test_readBytes_correctSixtyFourBytes() external { - bytes memory encodedBytes = - hex"b8400123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"; - bytes memory decodedBytes = RLPReader.readBytes(encodedBytes); - assertEq(decodedBytes.length, 64); - assertEq( - decodedBytes, - hex"0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - ); - } - - function test_readBytes_null() external { - bytes memory encodedBytes = hex"80"; - assertEq(RLPReader.readBytes(encodedBytes), hex""); - } - - function test_readBytes_empty() external { - bytes memory empty = hex""; - vm.expectRevert( - "RLPReader: length of an RLP item must be greater than zero to be decodable" - ); - RLPReader.readBytes(empty); - } - - function test_readBytes_list() external { - bytes memory encodedList = hex"c3010203"; // "[0x01, 0x02, 0x03]" - vm.expectRevert("RLPReader: decoded item type for bytes is not a data item"); - RLPReader.readBytes(encodedList); - } - - function test_readRawBytes_shortBytes() external { - bytes memory encodedBytes = hex"940123456789012345678901234567890123456789"; - assertEq(RLPReader.readRawBytes(RLPReader.toRLPItem(encodedBytes)), encodedBytes); - } - - function test_readRawBytes_longBytes() external { - bytes memory encodedBytes = - hex"b8400123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"; - assertEq(RLPReader.readRawBytes(RLPReader.toRLPItem(encodedBytes)), encodedBytes); - } - - function test_readRawBytes_empty() external { - bytes memory encodedBytes = hex""; - vm.expectRevert( - "RLPReader: length of an RLP item must be greater than zero to be decodable" - ); - RLPReader.readRawBytes(RLPReader.toRLPItem(encodedBytes)); - } - - function test_readRawBytes_null() external { - bytes memory encodedBytes = hex"80"; - assertEq(RLPReader.readRawBytes(RLPReader.toRLPItem(encodedBytes)), encodedBytes); - } -} diff --git a/packages/protocol/test/thirdparty/optimisim/trie/SecureMerkleTrie.t.sol b/packages/protocol/test/thirdparty/optimisim/trie/SecureMerkleTrie.t.sol deleted file mode 100644 index b679d08611e..00000000000 --- a/packages/protocol/test/thirdparty/optimisim/trie/SecureMerkleTrie.t.sol +++ /dev/null @@ -1,130 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.24; - -import "../../../TaikoTest.sol"; - -/// @author Kirk Baird -contract TestSecureMerkleTrie is TaikoTest { - function test_verifyInclusionProof_simple() external { - bytes memory slot = hex"0000000000000000000000000000000000000000000000000000000000000006"; // hash - // = 0xf652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f - bytes memory value = hex"01"; - // Leaf node (target): - // ["0x3652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f","0x01"] // hash = - // 4c020f5af4649ee703bbfa974846790d332abacef03c89036babb2238c01c337 - // Branch node (root): - // ["0x","0x","0x","0x","0x","0x","0x","0x","0x","0x","0x","0x","0x","0x","0x","0x4c020f5af4649ee703bbfa974846790d332abacef03c89036babb2238c01c337", - // "0x"] // hash = b21a635028fc2f2a4ba5b688497165f7096500771fd493e0695ef750c6c1845c - - bytes32 rootHash = hex"b21a635028fc2f2a4ba5b688497165f7096500771fd493e0695ef750c6c1845c"; - - bytes[] memory proof = new bytes[](2); - proof[0] = - hex"f1808080808080808080808080808080a04c020f5af4649ee703bbfa974846790d332abacef03c89036babb2238c01c33780"; - proof[1] = hex"e2a03652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f01"; - - assertTrue(SecureMerkleTrie.verifyInclusionProof(slot, value, proof, rootHash)); - } - - // based on deployed contract 0xcD5e2bebd3DfE46e4BF96aE2ac7B89B22cc6a982 (SignalService Proxy) - // on Sepolia - function test_verifyInclusionProof_realProof() external { - bytes memory slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; - bytes memory value = hex"01"; - bytes32 rootHash = hex"45e9f670f31850ee0771a6ce85f36721526bc413bd91d58b8b9002adacb418ca"; - - bytes[] memory proof = new bytes[](6); - proof[0] = - hex"f90211a01bf8dc9db1d06b09a1593db05232aa42c2b417e20251d71e8f32086b57573e06a0f541e279cb44d7e034fd4a8fda716291d8bb5cc2fb67249197c373e4405333d9a09ac7f4d030a807bf868f0e9122a537e6ea6f029a3bbae5477f5bec9367477538a012795298d14f24c7876a15303f38c794fe4d22c385d6b15adf136a65287d64aca0db8ff50aeed396a753e2b582a2101807146b9abad224956c8c0b2914e8bc6308a050e2462dd19498a35aabf6a701e90756cd519129c04095fde7b35ced53548967a01d4d98eae2c34085bef8029256fbc79dfd08ce2413742e006c16057ee23d8415a05ee9d91e8763e4ab8bfddb682f1579d91189d77435e69e186788b1236c07b400a06e867457693097e1ac54bca407a9b7241740e64d110e661b71b708776bf951cea038440f0f7488fc76ba3f7a35b1789dd4658b9b206441ef824acb7fe2a3a76a20a0285e98d81740593ef5a9a529c4d733ebe64f15f40732b3a0d0623c1cb71f8ed0a0a80dd18c30ffd2792e4856b13097aad1e5afe7439b7f343cf9ae856d68af2ba7a0c2d74f432cab091d90bae5ec862089ae1272f39108f1cba4f57c7b5671e5c816a0aceebc0b41cf40fe8313c2b524f03e732b8385727de1abae876d9057b2d85e1fa00ee8b4f21e2f328d027884d9ffbac6fac35539a7d74b11d9f17e5a3a185b8386a0e52242d3cc5dd7773ec21fbfae2141144d02ce74ff601c375bda5fff96aef12b80"; - proof[1] = - hex"f90211a09c081fac815d03d3ef97f0f6ec100c24a7057fff79a870a22756b374a67a67eaa008586c30da747166360003b1eed874a0b915ca98cbfa84964f7d88ab8da1989aa0449474ec27502c1a3a5d21050bbfd57cc514adae298412e23f132534ff932dfca08434310370976516d70c7b3b6b33a383e46a94563ec48da41ce3074141c29d37a0912079ec50d4499209c32b2f7dd8d12cb9c152136812df496876fae92d485335a0505627a88c1028e9ce54238f9f5d79e196b9fee338aa642afe511886ed53f04aa0e411917634b30a3767de43f4208ee6a7bef92e63e4afd83b9318da18b5664a6ea03f5bbccdf60e44fa45761b107f34166d4b511d0343af2464afed818dfdc57963a002920171377ba261586e2733d3d0f19696b44848abb95ad91b08484f7cbe74bea0815f25e6680089a62b7219ee2957b19e773d41545fe2140a4dbcd7e8cd3dffd7a0204c53730d2e8b4840012807a3ccfb3dab97a9abcbddea7b470e72c31ed47e64a0e37b499b1b6139944109adfffe5a303f26efc14627a85bdd06f5f67fa18d1f27a070660c887064df8b7d89a942b0553427dd18f06b8bbb39db5365786e780fc749a07b51a6dbe67bad62c92538c859a66937162cb61a000d7e5f21695e490199b18ba0b80c116ca1493c4a017f3189e519614295c4ec23edcaa199f16f64ad9b9527c7a09cea6ec2caee96a5cacbae86e88c15e0f2a5d26d4b75137179fd5666fbb5aa7480"; - proof[2] = - hex"f90211a0edff33fe5c95b4fa868d66431769e22577932ee13b18b1da8ee5419aec59c5e7a09320d0ae25a44b54b44f69b435a3edb6503d0aab80052a4ba2d0069e840ffcf3a084d002a67ee8281c3681b11d948ab4d2a6440a2803f6025b54dcaa4a2bb86047a00104b82f9c6c5a0d3bc9f1af1ccde26293e680e26d525f9d542a9ebb5d623eada02b2522787d006e41d10c12bff567be8eb13ca23784a926eddeda28550bc50843a03d02c42758d7f7107850431572c6275b64a9da09107d588c732a45804ec8b650a0be4b44daa2d677c7163e0b6b8334c39ddb92ae0701b573196ed2e422d08d7f79a0c4c06e7eded093383c6c3e2460462a49d356a4fc3165ec0207490cf62b382653a0d54b62359a6a9c0541e660b151009cc42a48e3ba12b7059e7aa40ea55f7d627fa08ee6a1a4cc20035c4ac7aea9d80dfc1dd13d83b9c9941c180caf0496a261a525a02885741fff2f4e61c3cd76ea387978030d9d0a79d2accdaaa535e9fd69be9dc0a013f67d5965341a354b659eddf810ad1801ed6cdbc85922fbf4f1d5690d4dec5ea0014ce0d9af419fb75af5ebf396786cd3f415429d30e174c864c6f355e46e9e9fa04ad594c616d61e8b911359309131516d9e29d9a435cec91520d0831bcee6752fa06aeb091d8001bf97c0861ea1900e85edad54c00e7d368fae73a5d980a4479a2da07e2aa9f31c59e36b69154fbd34de81c6b1feed1a6ed868813e923d2f98d8c31480"; - proof[3] = - hex"f90211a0d2c363378ebc8717d552d4137cba842e6d00f045121f885d88f1146121c299e5a09f6f5a03356b3033f75fba1956afe0242be8dc508ce83e356ea5f48b3c17b571a0ba32e8ef62fdfc524822241c471024cba2b1d4a6a9d049424e2ac3868435f2eaa0284ecc45af9d2cc173636750eef4fc9c3e8828a5469732571950259cd25b2ae5a0a4a384dba0939acbcc8b14ce2411df265cc91162debb84ffd94f9a5f185e6c04a02542ba4e13a2571665afb8a8d6b5e972e018d1d6f3ae57707d725254530f27aaa05b1f61c8dea59ac83181d4faa4d3c322970f5ecacd0bd07028bc87b6e3174baba02fa86ead02062c2671a3de5460efe03e179184e3602320ab8478aa51239ca5f1a0b0a1ed80fa8eef67af1193c2080d04976d2b28ed3a70ad64afc9d31864ddf0d3a0afd61230c619715051e37d73754063a58da86e17fa9f1f702038b88b762fda4ea0cdb772381aec1978ad17c8c0e13298b1f9ce4b937f45a7b5ade7bce5ec374665a0db07f3614888c57b8ccbddca9e1575e63b663acada279262261b43e8d328ba88a00de0759c749651d9b8960feed63fbeecaaa145f47927e7f2d2d3f56bb802d676a01c3384e31a91e9d39ee8c728c24cf49a2d1c27ed4d96075c760d470e0812731da07e7fc146b9cc0be8af894c7a6cd93b4857011483f299c5b68737de3f0eb53304a0466878f42b7f4b98bdf104bede4313aade1c2cf0186db3e5806b74935129d00e80"; - proof[4] = - hex"f90171a031dde6777fd092b1b9769b2402355e81e3e03e5d5c336f5edc583836ed15cfa580a0bb779ade81cb7fa701d963b9c1ae32d7cf58d926d14217bf96e3b44cdc93426da08cfeef6342385fbb0b452adca5c2ae1c5c651839137c15ce646d2a2011358e0ba0354480a6556b60a6af02f5f138eac24b268af77d85b3a7e241b1c6ec30125e17a08b6d79c69add140fd1bdd694ded36b248961ce0a6c905aac15ae928b925d730f80a0665dd3eb57bd0fd5bf2476a2c7ce190bbe4cfe92862d2ca644ec2f24a5e1545980a0321c382b719c93b3d816c3876a5f36b265186988c4a7994bc5927357f64d82bfa0adbd467e4d446b07a0f755954da22d7480373fdb139e93ec52799aa4239571a980a0a3eed0a41205afb11767756e464a4b99b0cbec8ac9f0919f46b831118a6847f880a0954e8545cb42ac37f2ef0f79f745a03c660dd143a7b621132385060a8345e821a00fe18033d0e53a5d97855111b656f4aefc4b32538df7aba9a01592bb1337d15380"; - proof[5] = hex"e09e3cd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56301"; - - assertTrue(SecureMerkleTrie.verifyInclusionProof(slot, value, proof, rootHash)); - } - - function test_verifyInclusionProof_fakeValue() external { - bytes memory slot = hex"0000000000000000000000000000000000000000000000000000000000000006"; - bytes memory value = hex"ff"; - bytes32 rootHash = hex"b21a635028fc2f2a4ba5b688497165f7096500771fd493e0695ef750c6c1845c"; - - bytes[] memory proof = new bytes[](2); - proof[0] = - hex"f1808080808080808080808080808080a04c020f5af4649ee703bbfa974846790d332abacef03c89036babb2238c01c33780"; - proof[1] = hex"e2a03652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f01"; - - assertFalse(SecureMerkleTrie.verifyInclusionProof(slot, value, proof, rootHash)); - } - - function test_verifyInclusionProof_fakeRoot() external { - bytes memory slot = hex"0000000000000000000000000000000000000000000000000000000000000006"; // hash - // = 0xf652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f - bytes memory value = hex"01"; - // Leaf node (target): - // ["0x3652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f","0x01"] // hash = - // 4c020f5af4649ee703bbfa974846790d332abacef03c89036babb2238c01c337 - // Branch node (root): - // ["0x","0x","0x","0x","0x","0x","0x","0x","0x","0x","0x","0x","0x","0x","0x","0x4c020f5af4649ee703bbfa974846790d332abacef03c89036babb2238c01c337", - // "0x"] // hash = b21a635028fc2f2a4ba5b688497165f7096500771fd493e0695ef750c6c1845c - - bytes32 rootHash = hex"0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"; - - bytes[] memory proof = new bytes[](2); - proof[0] = - hex"f1808080808080808080808080808080a04c020f5af4649ee703bbfa974846790d332abacef03c89036babb2238c01c33780"; - proof[1] = hex"e2a03652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f01"; - - vm.expectRevert("MerkleTrie: invalid root hash"); - SecureMerkleTrie.verifyInclusionProof(slot, value, proof, rootHash); - } - - function test_verifyInclusionProof_fakeIntermediateNode() external { - bytes memory slot = hex"0000000000000000000000000000000000000000000000000000000000000006"; // hash - // = 0xf652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f - bytes memory value = hex"01"; - // Leaf node (target): - // ["0x3123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef","0x01"] // hash = - // 7b074e96d2dcd6ae7a05e7e35c748e067706d28e47bfecf0c0e642f4dff48d17 - // Branch node (root): - // ["0x","0x","0x","0x","0x","0x","0x","0x","0x","0x","0x","0x","0x","0x","0x","0x4c020f5af4649ee703bbfa974846790d332abacef03c89036babb2238c01c337", - // "0x"] // hash = b21a635028fc2f2a4ba5b688497165f7096500771fd493e0695ef750c6c1845c - - bytes32 rootHash = hex"b21a635028fc2f2a4ba5b688497165f7096500771fd493e0695ef750c6c1845c"; - - bytes[] memory proof = new bytes[](2); - proof[0] = - hex"f1808080808080808080808080808080a04c020f5af4649ee703bbfa974846790d332abacef03c89036babb2238c01c33780"; - proof[1] = hex"e2a03123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef01"; - - vm.expectRevert("MerkleTrie: invalid large internal hash"); - SecureMerkleTrie.verifyInclusionProof(slot, value, proof, rootHash); - } - - function test_get() external { - bytes memory slot = hex"0000000000000000000000000000000000000000000000000000000000000006"; // hash - // = 0xf652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f - bytes memory value = hex"01"; - // Leaf node (target): - // ["0x3652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f","0x01"] // hash = - // 4c020f5af4649ee703bbfa974846790d332abacef03c89036babb2238c01c337 - // Branch node (root): - // ["0x","0x","0x","0x","0x","0x","0x","0x","0x","0x","0x","0x","0x","0x","0x","0x4c020f5af4649ee703bbfa974846790d332abacef03c89036babb2238c01c337", - // "0x"] // hash = b21a635028fc2f2a4ba5b688497165f7096500771fd493e0695ef750c6c1845c - - bytes32 rootHash = hex"b21a635028fc2f2a4ba5b688497165f7096500771fd493e0695ef750c6c1845c"; - - bytes[] memory proof = new bytes[](2); - proof[0] = - hex"f1808080808080808080808080808080a04c020f5af4649ee703bbfa974846790d332abacef03c89036babb2238c01c33780"; - proof[1] = hex"e2a03652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f01"; - - bytes memory fetchedValue = SecureMerkleTrie.get(slot, proof, rootHash); - assertEq(fetchedValue, value); - } -} diff --git a/packages/protocol/tsconfig.json b/packages/protocol/tsconfig.json new file mode 100644 index 00000000000..ab68f56d56b --- /dev/null +++ b/packages/protocol/tsconfig.json @@ -0,0 +1,12 @@ +{ + "compilerOptions": { + "target": "es6", + "module": "commonjs", + "lib": ["es6"], + "types": ["node"], + "moduleResolution": "node", + "esModuleInterop": true + }, + "include": ["utils/**/*.ts"], + "exclude": ["node_modules"] +} diff --git a/packages/protocol/utils/airdrop/airdrop_db/example_claimList.json b/packages/protocol/utils/airdrop/airdrop_db/example_claimList.json deleted file mode 100644 index 3208e43309c..00000000000 --- a/packages/protocol/utils/airdrop/airdrop_db/example_claimList.json +++ /dev/null @@ -1,7 +0,0 @@ -[ - { "address": "0x7E5F4552091A69125d5DfCb7b8C2659029395Bdf", "amount": 100 }, - { "address": "0x2B5AD5c4795c026514f8317c7a215E218DcCD6cF", "amount": 100 }, - { "address": "0x6813Eb9362372EEF6200f3b1dbC3f819671cBA69", "amount": 100 }, - { "address": "0x1efF47bc3a10a45D4B230B5d10E37751FE6AA718", "amount": 100 }, - { "address": "0xe1AB8145F7E55DC933d51a18c793F901A3A0b276", "amount": 200 } -] diff --git a/packages/protocol/utils/airdrop/buildMerkleTree.ts b/packages/protocol/utils/airdrop/buildMerkleTree.ts deleted file mode 100644 index f732a115c79..00000000000 --- a/packages/protocol/utils/airdrop/buildMerkleTree.ts +++ /dev/null @@ -1,97 +0,0 @@ -import { MerkleTree } from "merkletreejs/dist/MerkleTree"; -const { ethers } = require("ethers"); -const keccak256 = require("keccak256"); -const fs = require("fs"); - -interface IClaimListData { - address: string; - amount: number; -} - -interface IMerkle { - merkleTree: MerkleTree; - rootHash: string; -} - -async function buildMerkleTree( - allowListDataArr: IClaimListData[], -): Promise { - // create merkle tree - const leafNodes: any = []; - for (let i = 0; i < allowListDataArr.length; i++) { - leafNodes.push(buildLeaf(allowListDataArr[i])); - } - const merkleTree = new MerkleTree(leafNodes, keccak256, { - sortPairs: true, - }); - - const rootHash = merkleTree.getHexRoot(); - - return { - merkleTree, - rootHash, - }; -} - -function buildLeaf(data: IClaimListData) { - const inputData = ethers.utils.defaultAbiCoder.encode( - ["address", "uint256"], - [data.address, data.amount], - ); - - return Buffer.from( - ethers.utils - .keccak256( - ethers.utils.defaultAbiCoder.encode( - ["bytes", "bytes"], - [ - ethers.utils.toUtf8Bytes("CLAIM_TAIKO_AIRDROP"), - inputData, - ], - ), - ) - .slice(2), - "hex", - ); -} - -async function getMerkleProof( - address: string, - amount: number, - claimList: IClaimListData[], -) { - const merkleData = await buildMerkleTree(claimList); - const leaf = buildLeaf({ address, amount }); - - return merkleData.merkleTree.getHexProof(leaf); -} - -async function main() { - const filePath = process.argv[2]; - - if (!filePath) { - console.error( - "Please provide a path to the JSON file as a command-line argument.", - ); - return; - } - - const jsonData = fs.readFileSync(filePath, "utf-8"); - const claimList: IClaimListData[] = JSON.parse(jsonData); - const merkleData = await buildMerkleTree(claimList); - - console.log("Merkle root:", merkleData.rootHash); - console.log("Nr of leaves (entries):", claimList.length); - - const exampleProof = await getMerkleProof( - "0x7E5F4552091A69125d5DfCb7b8C2659029395Bdf", - 100, - claimList, - ); - - console.log("Example proof for Alice (foundry) is: ", exampleProof); -} - -main().catch((error) => { - console.error(error); -}); diff --git a/packages/relayer/.gitignore b/packages/relayer/.gitignore index b2e94840565..ebc976485e7 100644 --- a/packages/relayer/.gitignore +++ b/packages/relayer/.gitignore @@ -66,6 +66,5 @@ terraform.rc .idea -Bridge.json -TaikoL2.json -IHeaderSync.json \ No newline at end of file +# Ignore abi files +bindings/**/*.json diff --git a/packages/relayer/.golangci.yml b/packages/relayer/.golangci.yml index 56dcebe883c..f47cd722a6f 100644 --- a/packages/relayer/.golangci.yml +++ b/packages/relayer/.golangci.yml @@ -9,7 +9,7 @@ # ], output: - format: colored-line-number + formats: colored-line-number linters: enable: @@ -34,6 +34,8 @@ linters-settings: min-complexity: 75 issues: + exclude-dirs: + - contracts/* exclude-rules: # Exclude some linters from running on tests files. - path: _test\.go @@ -42,7 +44,3 @@ issues: - path: / linters: - typecheck - -run: - skip-dirs: - - contracts/* diff --git a/packages/relayer/.l1indexer.example.env b/packages/relayer/.l1indexer.example.env index 8a11abd4a6e..04fda9e1aa0 100644 --- a/packages/relayer/.l1indexer.example.env +++ b/packages/relayer/.l1indexer.example.env @@ -20,4 +20,5 @@ SRC_RPC_URL=wss://l1ws.internal.taiko.xyz DEST_RPC_URL=wss://ws.internal.taiko.xyz CORS_ORIGINS=* NUM_GOROUTINES=50 -BLOCK_BATCH_SIZE=100 \ No newline at end of file +BLOCK_BATCH_SIZE=100 +CONFIRMATIONS_BEFORE_INDEXING=1 \ No newline at end of file diff --git a/packages/relayer/ERC1155Vault.json b/packages/relayer/ERC1155Vault.json deleted file mode 100644 index 5bcfce5cfd9..00000000000 --- a/packages/relayer/ERC1155Vault.json +++ /dev/null @@ -1,1026 +0,0 @@ -[ - { - "type": "function", - "name": "acceptOwnership", - "inputs": [], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "addressManager", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "bridgedToCanonical", - "inputs": [ - { - "name": "btoken", - "type": "address", - "internalType": "address" - } - ], - "outputs": [ - { - "name": "chainId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "addr", - "type": "address", - "internalType": "address" - }, - { - "name": "symbol", - "type": "string", - "internalType": "string" - }, - { - "name": "name", - "type": "string", - "internalType": "string" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "canonicalToBridged", - "inputs": [ - { - "name": "chainId", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "ctoken", - "type": "address", - "internalType": "address" - } - ], - "outputs": [ - { - "name": "btoken", - "type": "address", - "internalType": "address" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "impl", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "inNonReentrant", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "bool", - "internalType": "bool" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "init", - "inputs": [ - { - "name": "_owner", - "type": "address", - "internalType": "address" - }, - { - "name": "_addressManager", - "type": "address", - "internalType": "address" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "lastUnpausedAt", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "uint64", - "internalType": "uint64" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "name", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "stateMutability": "pure" - }, - { - "type": "function", - "name": "onERC1155BatchReceived", - "inputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - }, - { - "name": "", - "type": "address", - "internalType": "address" - }, - { - "name": "", - "type": "uint256[]", - "internalType": "uint256[]" - }, - { - "name": "", - "type": "uint256[]", - "internalType": "uint256[]" - }, - { - "name": "", - "type": "bytes", - "internalType": "bytes" - } - ], - "outputs": [ - { - "name": "", - "type": "bytes4", - "internalType": "bytes4" - } - ], - "stateMutability": "pure" - }, - { - "type": "function", - "name": "onERC1155Received", - "inputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - }, - { - "name": "", - "type": "address", - "internalType": "address" - }, - { - "name": "", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "", - "type": "bytes", - "internalType": "bytes" - } - ], - "outputs": [ - { - "name": "", - "type": "bytes4", - "internalType": "bytes4" - } - ], - "stateMutability": "pure" - }, - { - "type": "function", - "name": "onMessageInvocation", - "inputs": [ - { - "name": "data", - "type": "bytes", - "internalType": "bytes" - } - ], - "outputs": [], - "stateMutability": "payable" - }, - { - "type": "function", - "name": "onMessageRecalled", - "inputs": [ - { - "name": "message", - "type": "tuple", - "internalType": "struct IBridge.Message", - "components": [ - { - "name": "id", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "fee", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "gasLimit", - "type": "uint32", - "internalType": "uint32" - }, - { - "name": "from", - "type": "address", - "internalType": "address" - }, - { - "name": "srcChainId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "srcOwner", - "type": "address", - "internalType": "address" - }, - { - "name": "destChainId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "destOwner", - "type": "address", - "internalType": "address" - }, - { - "name": "to", - "type": "address", - "internalType": "address" - }, - { - "name": "value", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "data", - "type": "bytes", - "internalType": "bytes" - } - ] - }, - { - "name": "msgHash", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "outputs": [], - "stateMutability": "payable" - }, - { - "type": "function", - "name": "owner", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "pause", - "inputs": [], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "paused", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "bool", - "internalType": "bool" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "pendingOwner", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "proxiableUUID", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "renounceOwnership", - "inputs": [], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "resolve", - "inputs": [ - { - "name": "_chainId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "_name", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "_allowZeroAddress", - "type": "bool", - "internalType": "bool" - } - ], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address payable" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "resolve", - "inputs": [ - { - "name": "_name", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "_allowZeroAddress", - "type": "bool", - "internalType": "bool" - } - ], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address payable" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "sendToken", - "inputs": [ - { - "name": "_op", - "type": "tuple", - "internalType": "struct BaseNFTVault.BridgeTransferOp", - "components": [ - { - "name": "destChainId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "destOwner", - "type": "address", - "internalType": "address" - }, - { - "name": "to", - "type": "address", - "internalType": "address" - }, - { - "name": "fee", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "token", - "type": "address", - "internalType": "address" - }, - { - "name": "gasLimit", - "type": "uint32", - "internalType": "uint32" - }, - { - "name": "tokenIds", - "type": "uint256[]", - "internalType": "uint256[]" - }, - { - "name": "amounts", - "type": "uint256[]", - "internalType": "uint256[]" - } - ] - } - ], - "outputs": [ - { - "name": "message_", - "type": "tuple", - "internalType": "struct IBridge.Message", - "components": [ - { - "name": "id", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "fee", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "gasLimit", - "type": "uint32", - "internalType": "uint32" - }, - { - "name": "from", - "type": "address", - "internalType": "address" - }, - { - "name": "srcChainId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "srcOwner", - "type": "address", - "internalType": "address" - }, - { - "name": "destChainId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "destOwner", - "type": "address", - "internalType": "address" - }, - { - "name": "to", - "type": "address", - "internalType": "address" - }, - { - "name": "value", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "data", - "type": "bytes", - "internalType": "bytes" - } - ] - } - ], - "stateMutability": "payable" - }, - { - "type": "function", - "name": "supportsInterface", - "inputs": [ - { - "name": "_interfaceId", - "type": "bytes4", - "internalType": "bytes4" - } - ], - "outputs": [ - { - "name": "", - "type": "bool", - "internalType": "bool" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "transferOwnership", - "inputs": [ - { - "name": "newOwner", - "type": "address", - "internalType": "address" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "unpause", - "inputs": [], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "upgradeTo", - "inputs": [ - { - "name": "newImplementation", - "type": "address", - "internalType": "address" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "upgradeToAndCall", - "inputs": [ - { - "name": "newImplementation", - "type": "address", - "internalType": "address" - }, - { - "name": "data", - "type": "bytes", - "internalType": "bytes" - } - ], - "outputs": [], - "stateMutability": "payable" - }, - { - "type": "event", - "name": "AdminChanged", - "inputs": [ - { - "name": "previousAdmin", - "type": "address", - "indexed": false, - "internalType": "address" - }, - { - "name": "newAdmin", - "type": "address", - "indexed": false, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "BeaconUpgraded", - "inputs": [ - { - "name": "beacon", - "type": "address", - "indexed": true, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "BridgedTokenDeployed", - "inputs": [ - { - "name": "chainId", - "type": "uint64", - "indexed": true, - "internalType": "uint64" - }, - { - "name": "ctoken", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "btoken", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "ctokenSymbol", - "type": "string", - "indexed": false, - "internalType": "string" - }, - { - "name": "ctokenName", - "type": "string", - "indexed": false, - "internalType": "string" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "Initialized", - "inputs": [ - { - "name": "version", - "type": "uint8", - "indexed": false, - "internalType": "uint8" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "OwnershipTransferStarted", - "inputs": [ - { - "name": "previousOwner", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "newOwner", - "type": "address", - "indexed": true, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "OwnershipTransferred", - "inputs": [ - { - "name": "previousOwner", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "newOwner", - "type": "address", - "indexed": true, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "Paused", - "inputs": [ - { - "name": "account", - "type": "address", - "indexed": false, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "TokenReceived", - "inputs": [ - { - "name": "msgHash", - "type": "bytes32", - "indexed": true, - "internalType": "bytes32" - }, - { - "name": "from", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "to", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "srcChainId", - "type": "uint64", - "indexed": false, - "internalType": "uint64" - }, - { - "name": "ctoken", - "type": "address", - "indexed": false, - "internalType": "address" - }, - { - "name": "token", - "type": "address", - "indexed": false, - "internalType": "address" - }, - { - "name": "tokenIds", - "type": "uint256[]", - "indexed": false, - "internalType": "uint256[]" - }, - { - "name": "amounts", - "type": "uint256[]", - "indexed": false, - "internalType": "uint256[]" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "TokenReleased", - "inputs": [ - { - "name": "msgHash", - "type": "bytes32", - "indexed": true, - "internalType": "bytes32" - }, - { - "name": "from", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "ctoken", - "type": "address", - "indexed": false, - "internalType": "address" - }, - { - "name": "token", - "type": "address", - "indexed": false, - "internalType": "address" - }, - { - "name": "tokenIds", - "type": "uint256[]", - "indexed": false, - "internalType": "uint256[]" - }, - { - "name": "amounts", - "type": "uint256[]", - "indexed": false, - "internalType": "uint256[]" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "TokenSent", - "inputs": [ - { - "name": "msgHash", - "type": "bytes32", - "indexed": true, - "internalType": "bytes32" - }, - { - "name": "from", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "to", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "destChainId", - "type": "uint64", - "indexed": false, - "internalType": "uint64" - }, - { - "name": "ctoken", - "type": "address", - "indexed": false, - "internalType": "address" - }, - { - "name": "token", - "type": "address", - "indexed": false, - "internalType": "address" - }, - { - "name": "tokenIds", - "type": "uint256[]", - "indexed": false, - "internalType": "uint256[]" - }, - { - "name": "amounts", - "type": "uint256[]", - "indexed": false, - "internalType": "uint256[]" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "Unpaused", - "inputs": [ - { - "name": "account", - "type": "address", - "indexed": false, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "Upgraded", - "inputs": [ - { - "name": "implementation", - "type": "address", - "indexed": true, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "error", - "name": "ETH_TRANSFER_FAILED", - "inputs": [] - }, - { - "type": "error", - "name": "FUNC_NOT_IMPLEMENTED", - "inputs": [] - }, - { - "type": "error", - "name": "INVALID_PAUSE_STATUS", - "inputs": [] - }, - { - "type": "error", - "name": "REENTRANT_CALL", - "inputs": [] - }, - { - "type": "error", - "name": "RESOLVER_DENIED", - "inputs": [] - }, - { - "type": "error", - "name": "RESOLVER_INVALID_MANAGER", - "inputs": [] - }, - { - "type": "error", - "name": "RESOLVER_UNEXPECTED_CHAINID", - "inputs": [] - }, - { - "type": "error", - "name": "RESOLVER_ZERO_ADDR", - "inputs": [ - { - "name": "chainId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "name", - "type": "bytes32", - "internalType": "bytes32" - } - ] - }, - { - "type": "error", - "name": "VAULT_INTERFACE_NOT_SUPPORTED", - "inputs": [] - }, - { - "type": "error", - "name": "VAULT_INVALID_AMOUNT", - "inputs": [] - }, - { - "type": "error", - "name": "VAULT_INVALID_TOKEN", - "inputs": [] - }, - { - "type": "error", - "name": "VAULT_INVALID_TO_ADDR", - "inputs": [] - }, - { - "type": "error", - "name": "VAULT_PERMISSION_DENIED", - "inputs": [] - }, - { - "type": "error", - "name": "VAULT_TOKEN_ARRAY_MISMATCH", - "inputs": [] - }, - { - "type": "error", - "name": "ZERO_ADDRESS", - "inputs": [] - }, - { - "type": "error", - "name": "ZERO_VALUE", - "inputs": [] - } -] diff --git a/packages/relayer/ERC20Vault.json b/packages/relayer/ERC20Vault.json deleted file mode 100644 index cc2983af776..00000000000 --- a/packages/relayer/ERC20Vault.json +++ /dev/null @@ -1,1102 +0,0 @@ -[ - { - "type": "function", - "name": "MIN_MIGRATION_DELAY", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "acceptOwnership", - "inputs": [], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "addressManager", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "bridgedToCanonical", - "inputs": [ - { - "name": "btoken", - "type": "address", - "internalType": "address" - } - ], - "outputs": [ - { - "name": "chainId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "addr", - "type": "address", - "internalType": "address" - }, - { - "name": "decimals", - "type": "uint8", - "internalType": "uint8" - }, - { - "name": "symbol", - "type": "string", - "internalType": "string" - }, - { - "name": "name", - "type": "string", - "internalType": "string" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "btokenBlacklist", - "inputs": [ - { - "name": "btoken", - "type": "address", - "internalType": "address" - } - ], - "outputs": [ - { - "name": "blacklisted", - "type": "bool", - "internalType": "bool" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "canonicalToBridged", - "inputs": [ - { - "name": "chainId", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "ctoken", - "type": "address", - "internalType": "address" - } - ], - "outputs": [ - { - "name": "btoken", - "type": "address", - "internalType": "address" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "changeBridgedToken", - "inputs": [ - { - "name": "_ctoken", - "type": "tuple", - "internalType": "struct ERC20Vault.CanonicalERC20", - "components": [ - { - "name": "chainId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "addr", - "type": "address", - "internalType": "address" - }, - { - "name": "decimals", - "type": "uint8", - "internalType": "uint8" - }, - { - "name": "symbol", - "type": "string", - "internalType": "string" - }, - { - "name": "name", - "type": "string", - "internalType": "string" - } - ] - }, - { - "name": "_btokenNew", - "type": "address", - "internalType": "address" - } - ], - "outputs": [ - { - "name": "btokenOld_", - "type": "address", - "internalType": "address" - } - ], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "impl", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "inNonReentrant", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "bool", - "internalType": "bool" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "init", - "inputs": [ - { - "name": "_owner", - "type": "address", - "internalType": "address" - }, - { - "name": "_addressManager", - "type": "address", - "internalType": "address" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "lastMigrationStart", - "inputs": [ - { - "name": "chainId", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "ctoken", - "type": "address", - "internalType": "address" - } - ], - "outputs": [ - { - "name": "timestamp", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "lastUnpausedAt", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "uint64", - "internalType": "uint64" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "name", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "stateMutability": "pure" - }, - { - "type": "function", - "name": "onMessageInvocation", - "inputs": [ - { - "name": "_data", - "type": "bytes", - "internalType": "bytes" - } - ], - "outputs": [], - "stateMutability": "payable" - }, - { - "type": "function", - "name": "onMessageRecalled", - "inputs": [ - { - "name": "_message", - "type": "tuple", - "internalType": "struct IBridge.Message", - "components": [ - { - "name": "id", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "fee", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "gasLimit", - "type": "uint32", - "internalType": "uint32" - }, - { - "name": "from", - "type": "address", - "internalType": "address" - }, - { - "name": "srcChainId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "srcOwner", - "type": "address", - "internalType": "address" - }, - { - "name": "destChainId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "destOwner", - "type": "address", - "internalType": "address" - }, - { - "name": "to", - "type": "address", - "internalType": "address" - }, - { - "name": "value", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "data", - "type": "bytes", - "internalType": "bytes" - } - ] - }, - { - "name": "_msgHash", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "outputs": [], - "stateMutability": "payable" - }, - { - "type": "function", - "name": "owner", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "pause", - "inputs": [], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "paused", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "bool", - "internalType": "bool" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "pendingOwner", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "proxiableUUID", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "renounceOwnership", - "inputs": [], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "resolve", - "inputs": [ - { - "name": "_chainId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "_name", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "_allowZeroAddress", - "type": "bool", - "internalType": "bool" - } - ], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address payable" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "resolve", - "inputs": [ - { - "name": "_name", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "_allowZeroAddress", - "type": "bool", - "internalType": "bool" - } - ], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address payable" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "sendToken", - "inputs": [ - { - "name": "_op", - "type": "tuple", - "internalType": "struct ERC20Vault.BridgeTransferOp", - "components": [ - { - "name": "destChainId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "destOwner", - "type": "address", - "internalType": "address" - }, - { - "name": "to", - "type": "address", - "internalType": "address" - }, - { - "name": "fee", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "token", - "type": "address", - "internalType": "address" - }, - { - "name": "gasLimit", - "type": "uint32", - "internalType": "uint32" - }, - { - "name": "amount", - "type": "uint256", - "internalType": "uint256" - } - ] - } - ], - "outputs": [ - { - "name": "message_", - "type": "tuple", - "internalType": "struct IBridge.Message", - "components": [ - { - "name": "id", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "fee", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "gasLimit", - "type": "uint32", - "internalType": "uint32" - }, - { - "name": "from", - "type": "address", - "internalType": "address" - }, - { - "name": "srcChainId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "srcOwner", - "type": "address", - "internalType": "address" - }, - { - "name": "destChainId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "destOwner", - "type": "address", - "internalType": "address" - }, - { - "name": "to", - "type": "address", - "internalType": "address" - }, - { - "name": "value", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "data", - "type": "bytes", - "internalType": "bytes" - } - ] - } - ], - "stateMutability": "payable" - }, - { - "type": "function", - "name": "supportsInterface", - "inputs": [ - { - "name": "_interfaceId", - "type": "bytes4", - "internalType": "bytes4" - } - ], - "outputs": [ - { - "name": "", - "type": "bool", - "internalType": "bool" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "transferOwnership", - "inputs": [ - { - "name": "newOwner", - "type": "address", - "internalType": "address" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "unpause", - "inputs": [], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "upgradeTo", - "inputs": [ - { - "name": "newImplementation", - "type": "address", - "internalType": "address" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "upgradeToAndCall", - "inputs": [ - { - "name": "newImplementation", - "type": "address", - "internalType": "address" - }, - { - "name": "data", - "type": "bytes", - "internalType": "bytes" - } - ], - "outputs": [], - "stateMutability": "payable" - }, - { - "type": "event", - "name": "AdminChanged", - "inputs": [ - { - "name": "previousAdmin", - "type": "address", - "indexed": false, - "internalType": "address" - }, - { - "name": "newAdmin", - "type": "address", - "indexed": false, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "BeaconUpgraded", - "inputs": [ - { - "name": "beacon", - "type": "address", - "indexed": true, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "BridgedTokenChanged", - "inputs": [ - { - "name": "srcChainId", - "type": "uint256", - "indexed": true, - "internalType": "uint256" - }, - { - "name": "ctoken", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "btokenOld", - "type": "address", - "indexed": false, - "internalType": "address" - }, - { - "name": "btokenNew", - "type": "address", - "indexed": false, - "internalType": "address" - }, - { - "name": "ctokenSymbol", - "type": "string", - "indexed": false, - "internalType": "string" - }, - { - "name": "ctokenName", - "type": "string", - "indexed": false, - "internalType": "string" - }, - { - "name": "ctokenDecimal", - "type": "uint8", - "indexed": false, - "internalType": "uint8" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "BridgedTokenDeployed", - "inputs": [ - { - "name": "srcChainId", - "type": "uint256", - "indexed": true, - "internalType": "uint256" - }, - { - "name": "ctoken", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "btoken", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "ctokenSymbol", - "type": "string", - "indexed": false, - "internalType": "string" - }, - { - "name": "ctokenName", - "type": "string", - "indexed": false, - "internalType": "string" - }, - { - "name": "ctokenDecimal", - "type": "uint8", - "indexed": false, - "internalType": "uint8" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "Initialized", - "inputs": [ - { - "name": "version", - "type": "uint8", - "indexed": false, - "internalType": "uint8" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "OwnershipTransferStarted", - "inputs": [ - { - "name": "previousOwner", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "newOwner", - "type": "address", - "indexed": true, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "OwnershipTransferred", - "inputs": [ - { - "name": "previousOwner", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "newOwner", - "type": "address", - "indexed": true, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "Paused", - "inputs": [ - { - "name": "account", - "type": "address", - "indexed": false, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "TokenReceived", - "inputs": [ - { - "name": "msgHash", - "type": "bytes32", - "indexed": true, - "internalType": "bytes32" - }, - { - "name": "from", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "to", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "srcChainId", - "type": "uint64", - "indexed": false, - "internalType": "uint64" - }, - { - "name": "ctoken", - "type": "address", - "indexed": false, - "internalType": "address" - }, - { - "name": "token", - "type": "address", - "indexed": false, - "internalType": "address" - }, - { - "name": "amount", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "TokenReleased", - "inputs": [ - { - "name": "msgHash", - "type": "bytes32", - "indexed": true, - "internalType": "bytes32" - }, - { - "name": "from", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "ctoken", - "type": "address", - "indexed": false, - "internalType": "address" - }, - { - "name": "token", - "type": "address", - "indexed": false, - "internalType": "address" - }, - { - "name": "amount", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "TokenSent", - "inputs": [ - { - "name": "msgHash", - "type": "bytes32", - "indexed": true, - "internalType": "bytes32" - }, - { - "name": "from", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "to", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "destChainId", - "type": "uint64", - "indexed": false, - "internalType": "uint64" - }, - { - "name": "ctoken", - "type": "address", - "indexed": false, - "internalType": "address" - }, - { - "name": "token", - "type": "address", - "indexed": false, - "internalType": "address" - }, - { - "name": "amount", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "Unpaused", - "inputs": [ - { - "name": "account", - "type": "address", - "indexed": false, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "Upgraded", - "inputs": [ - { - "name": "implementation", - "type": "address", - "indexed": true, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "error", - "name": "ETH_TRANSFER_FAILED", - "inputs": [] - }, - { - "type": "error", - "name": "FUNC_NOT_IMPLEMENTED", - "inputs": [] - }, - { - "type": "error", - "name": "INVALID_PAUSE_STATUS", - "inputs": [] - }, - { - "type": "error", - "name": "REENTRANT_CALL", - "inputs": [] - }, - { - "type": "error", - "name": "RESOLVER_DENIED", - "inputs": [] - }, - { - "type": "error", - "name": "RESOLVER_INVALID_MANAGER", - "inputs": [] - }, - { - "type": "error", - "name": "RESOLVER_UNEXPECTED_CHAINID", - "inputs": [] - }, - { - "type": "error", - "name": "RESOLVER_ZERO_ADDR", - "inputs": [ - { - "name": "chainId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "name", - "type": "bytes32", - "internalType": "bytes32" - } - ] - }, - { - "type": "error", - "name": "VAULT_BTOKEN_BLACKLISTED", - "inputs": [] - }, - { - "type": "error", - "name": "VAULT_CTOKEN_MISMATCH", - "inputs": [] - }, - { - "type": "error", - "name": "VAULT_INVALID_AMOUNT", - "inputs": [] - }, - { - "type": "error", - "name": "VAULT_INVALID_NEW_BTOKEN", - "inputs": [] - }, - { - "type": "error", - "name": "VAULT_INVALID_TOKEN", - "inputs": [] - }, - { - "type": "error", - "name": "VAULT_INVALID_TO_ADDR", - "inputs": [] - }, - { - "type": "error", - "name": "VAULT_LAST_MIGRATION_TOO_CLOSE", - "inputs": [] - }, - { - "type": "error", - "name": "VAULT_PERMISSION_DENIED", - "inputs": [] - }, - { - "type": "error", - "name": "ZERO_ADDRESS", - "inputs": [] - }, - { - "type": "error", - "name": "ZERO_VALUE", - "inputs": [] - } -] diff --git a/packages/relayer/ERC721Vault.json b/packages/relayer/ERC721Vault.json deleted file mode 100644 index cabf9b6cf95..00000000000 --- a/packages/relayer/ERC721Vault.json +++ /dev/null @@ -1,982 +0,0 @@ -[ - { - "type": "function", - "name": "acceptOwnership", - "inputs": [], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "addressManager", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "bridgedToCanonical", - "inputs": [ - { - "name": "btoken", - "type": "address", - "internalType": "address" - } - ], - "outputs": [ - { - "name": "chainId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "addr", - "type": "address", - "internalType": "address" - }, - { - "name": "symbol", - "type": "string", - "internalType": "string" - }, - { - "name": "name", - "type": "string", - "internalType": "string" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "canonicalToBridged", - "inputs": [ - { - "name": "chainId", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "ctoken", - "type": "address", - "internalType": "address" - } - ], - "outputs": [ - { - "name": "btoken", - "type": "address", - "internalType": "address" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "impl", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "inNonReentrant", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "bool", - "internalType": "bool" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "init", - "inputs": [ - { - "name": "_owner", - "type": "address", - "internalType": "address" - }, - { - "name": "_addressManager", - "type": "address", - "internalType": "address" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "lastUnpausedAt", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "uint64", - "internalType": "uint64" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "name", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "stateMutability": "pure" - }, - { - "type": "function", - "name": "onERC721Received", - "inputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - }, - { - "name": "", - "type": "address", - "internalType": "address" - }, - { - "name": "", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "", - "type": "bytes", - "internalType": "bytes" - } - ], - "outputs": [ - { - "name": "", - "type": "bytes4", - "internalType": "bytes4" - } - ], - "stateMutability": "pure" - }, - { - "type": "function", - "name": "onMessageInvocation", - "inputs": [ - { - "name": "_data", - "type": "bytes", - "internalType": "bytes" - } - ], - "outputs": [], - "stateMutability": "payable" - }, - { - "type": "function", - "name": "onMessageRecalled", - "inputs": [ - { - "name": "_message", - "type": "tuple", - "internalType": "struct IBridge.Message", - "components": [ - { - "name": "id", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "fee", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "gasLimit", - "type": "uint32", - "internalType": "uint32" - }, - { - "name": "from", - "type": "address", - "internalType": "address" - }, - { - "name": "srcChainId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "srcOwner", - "type": "address", - "internalType": "address" - }, - { - "name": "destChainId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "destOwner", - "type": "address", - "internalType": "address" - }, - { - "name": "to", - "type": "address", - "internalType": "address" - }, - { - "name": "value", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "data", - "type": "bytes", - "internalType": "bytes" - } - ] - }, - { - "name": "_msgHash", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "outputs": [], - "stateMutability": "payable" - }, - { - "type": "function", - "name": "owner", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "pause", - "inputs": [], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "paused", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "bool", - "internalType": "bool" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "pendingOwner", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "proxiableUUID", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "renounceOwnership", - "inputs": [], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "resolve", - "inputs": [ - { - "name": "_chainId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "_name", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "_allowZeroAddress", - "type": "bool", - "internalType": "bool" - } - ], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address payable" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "resolve", - "inputs": [ - { - "name": "_name", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "_allowZeroAddress", - "type": "bool", - "internalType": "bool" - } - ], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address payable" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "sendToken", - "inputs": [ - { - "name": "_op", - "type": "tuple", - "internalType": "struct BaseNFTVault.BridgeTransferOp", - "components": [ - { - "name": "destChainId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "destOwner", - "type": "address", - "internalType": "address" - }, - { - "name": "to", - "type": "address", - "internalType": "address" - }, - { - "name": "fee", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "token", - "type": "address", - "internalType": "address" - }, - { - "name": "gasLimit", - "type": "uint32", - "internalType": "uint32" - }, - { - "name": "tokenIds", - "type": "uint256[]", - "internalType": "uint256[]" - }, - { - "name": "amounts", - "type": "uint256[]", - "internalType": "uint256[]" - } - ] - } - ], - "outputs": [ - { - "name": "message_", - "type": "tuple", - "internalType": "struct IBridge.Message", - "components": [ - { - "name": "id", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "fee", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "gasLimit", - "type": "uint32", - "internalType": "uint32" - }, - { - "name": "from", - "type": "address", - "internalType": "address" - }, - { - "name": "srcChainId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "srcOwner", - "type": "address", - "internalType": "address" - }, - { - "name": "destChainId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "destOwner", - "type": "address", - "internalType": "address" - }, - { - "name": "to", - "type": "address", - "internalType": "address" - }, - { - "name": "value", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "data", - "type": "bytes", - "internalType": "bytes" - } - ] - } - ], - "stateMutability": "payable" - }, - { - "type": "function", - "name": "supportsInterface", - "inputs": [ - { - "name": "_interfaceId", - "type": "bytes4", - "internalType": "bytes4" - } - ], - "outputs": [ - { - "name": "", - "type": "bool", - "internalType": "bool" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "transferOwnership", - "inputs": [ - { - "name": "newOwner", - "type": "address", - "internalType": "address" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "unpause", - "inputs": [], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "upgradeTo", - "inputs": [ - { - "name": "newImplementation", - "type": "address", - "internalType": "address" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "upgradeToAndCall", - "inputs": [ - { - "name": "newImplementation", - "type": "address", - "internalType": "address" - }, - { - "name": "data", - "type": "bytes", - "internalType": "bytes" - } - ], - "outputs": [], - "stateMutability": "payable" - }, - { - "type": "event", - "name": "AdminChanged", - "inputs": [ - { - "name": "previousAdmin", - "type": "address", - "indexed": false, - "internalType": "address" - }, - { - "name": "newAdmin", - "type": "address", - "indexed": false, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "BeaconUpgraded", - "inputs": [ - { - "name": "beacon", - "type": "address", - "indexed": true, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "BridgedTokenDeployed", - "inputs": [ - { - "name": "chainId", - "type": "uint64", - "indexed": true, - "internalType": "uint64" - }, - { - "name": "ctoken", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "btoken", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "ctokenSymbol", - "type": "string", - "indexed": false, - "internalType": "string" - }, - { - "name": "ctokenName", - "type": "string", - "indexed": false, - "internalType": "string" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "Initialized", - "inputs": [ - { - "name": "version", - "type": "uint8", - "indexed": false, - "internalType": "uint8" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "OwnershipTransferStarted", - "inputs": [ - { - "name": "previousOwner", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "newOwner", - "type": "address", - "indexed": true, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "OwnershipTransferred", - "inputs": [ - { - "name": "previousOwner", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "newOwner", - "type": "address", - "indexed": true, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "Paused", - "inputs": [ - { - "name": "account", - "type": "address", - "indexed": false, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "TokenReceived", - "inputs": [ - { - "name": "msgHash", - "type": "bytes32", - "indexed": true, - "internalType": "bytes32" - }, - { - "name": "from", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "to", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "srcChainId", - "type": "uint64", - "indexed": false, - "internalType": "uint64" - }, - { - "name": "ctoken", - "type": "address", - "indexed": false, - "internalType": "address" - }, - { - "name": "token", - "type": "address", - "indexed": false, - "internalType": "address" - }, - { - "name": "tokenIds", - "type": "uint256[]", - "indexed": false, - "internalType": "uint256[]" - }, - { - "name": "amounts", - "type": "uint256[]", - "indexed": false, - "internalType": "uint256[]" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "TokenReleased", - "inputs": [ - { - "name": "msgHash", - "type": "bytes32", - "indexed": true, - "internalType": "bytes32" - }, - { - "name": "from", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "ctoken", - "type": "address", - "indexed": false, - "internalType": "address" - }, - { - "name": "token", - "type": "address", - "indexed": false, - "internalType": "address" - }, - { - "name": "tokenIds", - "type": "uint256[]", - "indexed": false, - "internalType": "uint256[]" - }, - { - "name": "amounts", - "type": "uint256[]", - "indexed": false, - "internalType": "uint256[]" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "TokenSent", - "inputs": [ - { - "name": "msgHash", - "type": "bytes32", - "indexed": true, - "internalType": "bytes32" - }, - { - "name": "from", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "to", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "destChainId", - "type": "uint64", - "indexed": false, - "internalType": "uint64" - }, - { - "name": "ctoken", - "type": "address", - "indexed": false, - "internalType": "address" - }, - { - "name": "token", - "type": "address", - "indexed": false, - "internalType": "address" - }, - { - "name": "tokenIds", - "type": "uint256[]", - "indexed": false, - "internalType": "uint256[]" - }, - { - "name": "amounts", - "type": "uint256[]", - "indexed": false, - "internalType": "uint256[]" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "Unpaused", - "inputs": [ - { - "name": "account", - "type": "address", - "indexed": false, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "Upgraded", - "inputs": [ - { - "name": "implementation", - "type": "address", - "indexed": true, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "error", - "name": "ETH_TRANSFER_FAILED", - "inputs": [] - }, - { - "type": "error", - "name": "FUNC_NOT_IMPLEMENTED", - "inputs": [] - }, - { - "type": "error", - "name": "INVALID_PAUSE_STATUS", - "inputs": [] - }, - { - "type": "error", - "name": "REENTRANT_CALL", - "inputs": [] - }, - { - "type": "error", - "name": "RESOLVER_DENIED", - "inputs": [] - }, - { - "type": "error", - "name": "RESOLVER_INVALID_MANAGER", - "inputs": [] - }, - { - "type": "error", - "name": "RESOLVER_UNEXPECTED_CHAINID", - "inputs": [] - }, - { - "type": "error", - "name": "RESOLVER_ZERO_ADDR", - "inputs": [ - { - "name": "chainId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "name", - "type": "bytes32", - "internalType": "bytes32" - } - ] - }, - { - "type": "error", - "name": "VAULT_INTERFACE_NOT_SUPPORTED", - "inputs": [] - }, - { - "type": "error", - "name": "VAULT_INVALID_AMOUNT", - "inputs": [] - }, - { - "type": "error", - "name": "VAULT_INVALID_TOKEN", - "inputs": [] - }, - { - "type": "error", - "name": "VAULT_INVALID_TO_ADDR", - "inputs": [] - }, - { - "type": "error", - "name": "VAULT_PERMISSION_DENIED", - "inputs": [] - }, - { - "type": "error", - "name": "VAULT_TOKEN_ARRAY_MISMATCH", - "inputs": [] - }, - { - "type": "error", - "name": "ZERO_ADDRESS", - "inputs": [] - }, - { - "type": "error", - "name": "ZERO_VALUE", - "inputs": [] - } -] diff --git a/packages/relayer/ICrossChainSync.json b/packages/relayer/ICrossChainSync.json deleted file mode 100644 index dd612d08085..00000000000 --- a/packages/relayer/ICrossChainSync.json +++ /dev/null @@ -1,74 +0,0 @@ -[ - { - "type": "function", - "name": "getSyncedSnippet", - "inputs": [ - { - "name": "blockId", - "type": "uint64", - "internalType": "uint64" - } - ], - "outputs": [ - { - "name": "snippet", - "type": "tuple", - "internalType": "struct ICrossChainSync.Snippet", - "components": [ - { - "name": "syncedInBlock", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "blockId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "blockHash", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "stateRoot", - "type": "bytes32", - "internalType": "bytes32" - } - ] - } - ], - "stateMutability": "view" - }, - { - "type": "event", - "name": "CrossChainSynced", - "inputs": [ - { - "name": "syncedInBlock", - "type": "uint64", - "indexed": true, - "internalType": "uint64" - }, - { - "name": "blockId", - "type": "uint64", - "indexed": true, - "internalType": "uint64" - }, - { - "name": "blockHash", - "type": "bytes32", - "indexed": false, - "internalType": "bytes32" - }, - { - "name": "stateRoot", - "type": "bytes32", - "indexed": false, - "internalType": "bytes32" - } - ], - "anonymous": false - } -] diff --git a/packages/relayer/QuotaManager.json b/packages/relayer/QuotaManager.json deleted file mode 100644 index 4470ce042c8..00000000000 --- a/packages/relayer/QuotaManager.json +++ /dev/null @@ -1,569 +0,0 @@ -[ - { - "type": "function", - "name": "acceptOwnership", - "inputs": [], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "addressManager", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "availableQuota", - "inputs": [ - { - "name": "_token", - "type": "address", - "internalType": "address" - }, - { - "name": "_leap", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "consumeQuota", - "inputs": [ - { - "name": "_token", - "type": "address", - "internalType": "address" - }, - { - "name": "_amount", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "impl", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "inNonReentrant", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "bool", - "internalType": "bool" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "init", - "inputs": [ - { - "name": "_owner", - "type": "address", - "internalType": "address" - }, - { - "name": "_addressManager", - "type": "address", - "internalType": "address" - }, - { - "name": "_quotaPeriod", - "type": "uint24", - "internalType": "uint24" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "lastUnpausedAt", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "uint64", - "internalType": "uint64" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "owner", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "pause", - "inputs": [], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "paused", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "bool", - "internalType": "bool" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "pendingOwner", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "proxiableUUID", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "quotaPeriod", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "uint24", - "internalType": "uint24" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "renounceOwnership", - "inputs": [], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "resolve", - "inputs": [ - { - "name": "_chainId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "_name", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "_allowZeroAddress", - "type": "bool", - "internalType": "bool" - } - ], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address payable" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "resolve", - "inputs": [ - { - "name": "_name", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "_allowZeroAddress", - "type": "bool", - "internalType": "bool" - } - ], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address payable" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "tokenQuota", - "inputs": [ - { - "name": "token", - "type": "address", - "internalType": "address" - } - ], - "outputs": [ - { - "name": "updatedAt", - "type": "uint48", - "internalType": "uint48" - }, - { - "name": "quota", - "type": "uint104", - "internalType": "uint104" - }, - { - "name": "available", - "type": "uint104", - "internalType": "uint104" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "transferOwnership", - "inputs": [ - { - "name": "newOwner", - "type": "address", - "internalType": "address" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "unpause", - "inputs": [], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "updateQuota", - "inputs": [ - { - "name": "_token", - "type": "address", - "internalType": "address" - }, - { - "name": "_quota", - "type": "uint104", - "internalType": "uint104" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "upgradeTo", - "inputs": [ - { - "name": "newImplementation", - "type": "address", - "internalType": "address" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "upgradeToAndCall", - "inputs": [ - { - "name": "newImplementation", - "type": "address", - "internalType": "address" - }, - { - "name": "data", - "type": "bytes", - "internalType": "bytes" - } - ], - "outputs": [], - "stateMutability": "payable" - }, - { - "type": "event", - "name": "AdminChanged", - "inputs": [ - { - "name": "previousAdmin", - "type": "address", - "indexed": false, - "internalType": "address" - }, - { - "name": "newAdmin", - "type": "address", - "indexed": false, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "BeaconUpgraded", - "inputs": [ - { - "name": "beacon", - "type": "address", - "indexed": true, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "Initialized", - "inputs": [ - { - "name": "version", - "type": "uint8", - "indexed": false, - "internalType": "uint8" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "OwnershipTransferStarted", - "inputs": [ - { - "name": "previousOwner", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "newOwner", - "type": "address", - "indexed": true, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "OwnershipTransferred", - "inputs": [ - { - "name": "previousOwner", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "newOwner", - "type": "address", - "indexed": true, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "Paused", - "inputs": [ - { - "name": "account", - "type": "address", - "indexed": false, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "QuotaUpdated", - "inputs": [ - { - "name": "token", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "oldQuota", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - }, - { - "name": "newQuota", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "Unpaused", - "inputs": [ - { - "name": "account", - "type": "address", - "indexed": false, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "Upgraded", - "inputs": [ - { - "name": "implementation", - "type": "address", - "indexed": true, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "error", - "name": "FUNC_NOT_IMPLEMENTED", - "inputs": [] - }, - { - "type": "error", - "name": "INVALID_PAUSE_STATUS", - "inputs": [] - }, - { - "type": "error", - "name": "QM_INVALID_PARAM", - "inputs": [] - }, - { - "type": "error", - "name": "QM_OUT_OF_QUOTA", - "inputs": [] - }, - { - "type": "error", - "name": "REENTRANT_CALL", - "inputs": [] - }, - { - "type": "error", - "name": "RESOLVER_DENIED", - "inputs": [] - }, - { - "type": "error", - "name": "RESOLVER_INVALID_MANAGER", - "inputs": [] - }, - { - "type": "error", - "name": "RESOLVER_UNEXPECTED_CHAINID", - "inputs": [] - }, - { - "type": "error", - "name": "RESOLVER_ZERO_ADDR", - "inputs": [ - { - "name": "chainId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "name", - "type": "bytes32", - "internalType": "bytes32" - } - ] - }, - { - "type": "error", - "name": "ZERO_ADDRESS", - "inputs": [] - }, - { - "type": "error", - "name": "ZERO_VALUE", - "inputs": [] - } -] diff --git a/packages/relayer/README.md b/packages/relayer/README.md index cbc97800416..a9414d599df 100644 --- a/packages/relayer/README.md +++ b/packages/relayer/README.md @@ -1,9 +1,8 @@ -[![Golang](https://github.com/taikoxyz/taiko-mono/actions/workflows/golang.yml/badge.svg)](https://github.com/taikoxyz/taiko-mono/actions/workflows/golang.yml) [![Relayer](https://codecov.io/gh/taikoxyz/taiko-mono/branch/main/graph/badge.svg?token=E468X2PTJC&flag=relayer)](https://codecov.io/gh/taikoxyz/taiko-mono) # Relayer -A relayer for the Bridge to watch and sync event between Layer 1 and Taiko Layer 2. +A relayer for the Bridge to watch and sync events between Layer 1 and Taiko Layer 2. ## Build the Source diff --git a/packages/relayer/SignalService.json b/packages/relayer/SignalService.json deleted file mode 100644 index baafb1ef1c9..00000000000 --- a/packages/relayer/SignalService.json +++ /dev/null @@ -1,885 +0,0 @@ -[ - { - "type": "function", - "name": "acceptOwnership", - "inputs": [], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "addressManager", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "authorize", - "inputs": [ - { - "name": "_addr", - "type": "address", - "internalType": "address" - }, - { - "name": "_authorize", - "type": "bool", - "internalType": "bool" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "getSignalSlot", - "inputs": [ - { - "name": "_chainId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "_app", - "type": "address", - "internalType": "address" - }, - { - "name": "_signal", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "outputs": [ - { - "name": "", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "stateMutability": "pure" - }, - { - "type": "function", - "name": "getSyncedChainData", - "inputs": [ - { - "name": "_chainId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "_kind", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "_blockId", - "type": "uint64", - "internalType": "uint64" - } - ], - "outputs": [ - { - "name": "blockId_", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "chainData_", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "impl", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "inNonReentrant", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "bool", - "internalType": "bool" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "init", - "inputs": [ - { - "name": "_owner", - "type": "address", - "internalType": "address" - }, - { - "name": "_addressManager", - "type": "address", - "internalType": "address" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "isAuthorized", - "inputs": [ - { - "name": "addr", - "type": "address", - "internalType": "address" - } - ], - "outputs": [ - { - "name": "authorized", - "type": "bool", - "internalType": "bool" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "isChainDataSynced", - "inputs": [ - { - "name": "_chainId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "_kind", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "_blockId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "_chainData", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "outputs": [ - { - "name": "", - "type": "bool", - "internalType": "bool" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "isSignalSent", - "inputs": [ - { - "name": "_app", - "type": "address", - "internalType": "address" - }, - { - "name": "_signal", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "outputs": [ - { - "name": "", - "type": "bool", - "internalType": "bool" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "lastUnpausedAt", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "uint64", - "internalType": "uint64" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "owner", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "pause", - "inputs": [], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "paused", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "bool", - "internalType": "bool" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "pendingOwner", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "proveSignalReceived", - "inputs": [ - { - "name": "_chainId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "_app", - "type": "address", - "internalType": "address" - }, - { - "name": "_signal", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "_proof", - "type": "bytes", - "internalType": "bytes" - } - ], - "outputs": [ - { - "name": "numCacheOps_", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "proxiableUUID", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "renounceOwnership", - "inputs": [], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "resolve", - "inputs": [ - { - "name": "_chainId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "_name", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "_allowZeroAddress", - "type": "bool", - "internalType": "bool" - } - ], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address payable" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "resolve", - "inputs": [ - { - "name": "_name", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "_allowZeroAddress", - "type": "bool", - "internalType": "bool" - } - ], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address payable" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "sendSignal", - "inputs": [ - { - "name": "_signal", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "outputs": [ - { - "name": "", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "signalForChainData", - "inputs": [ - { - "name": "_chainId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "_kind", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "_blockId", - "type": "uint64", - "internalType": "uint64" - } - ], - "outputs": [ - { - "name": "", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "stateMutability": "pure" - }, - { - "type": "function", - "name": "syncChainData", - "inputs": [ - { - "name": "_chainId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "_kind", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "_blockId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "_chainData", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "outputs": [ - { - "name": "", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "topBlockId", - "inputs": [ - { - "name": "chainId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "kind", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "outputs": [ - { - "name": "blockId", - "type": "uint64", - "internalType": "uint64" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "transferOwnership", - "inputs": [ - { - "name": "newOwner", - "type": "address", - "internalType": "address" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "unpause", - "inputs": [], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "upgradeTo", - "inputs": [ - { - "name": "newImplementation", - "type": "address", - "internalType": "address" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "upgradeToAndCall", - "inputs": [ - { - "name": "newImplementation", - "type": "address", - "internalType": "address" - }, - { - "name": "data", - "type": "bytes", - "internalType": "bytes" - } - ], - "outputs": [], - "stateMutability": "payable" - }, - { - "type": "function", - "name": "verifySignalReceived", - "inputs": [ - { - "name": "_chainId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "_app", - "type": "address", - "internalType": "address" - }, - { - "name": "_signal", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "_proof", - "type": "bytes", - "internalType": "bytes" - } - ], - "outputs": [], - "stateMutability": "view" - }, - { - "type": "event", - "name": "AdminChanged", - "inputs": [ - { - "name": "previousAdmin", - "type": "address", - "indexed": false, - "internalType": "address" - }, - { - "name": "newAdmin", - "type": "address", - "indexed": false, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "Authorized", - "inputs": [ - { - "name": "addr", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "authorized", - "type": "bool", - "indexed": false, - "internalType": "bool" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "BeaconUpgraded", - "inputs": [ - { - "name": "beacon", - "type": "address", - "indexed": true, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "ChainDataSynced", - "inputs": [ - { - "name": "chainId", - "type": "uint64", - "indexed": true, - "internalType": "uint64" - }, - { - "name": "blockId", - "type": "uint64", - "indexed": true, - "internalType": "uint64" - }, - { - "name": "kind", - "type": "bytes32", - "indexed": true, - "internalType": "bytes32" - }, - { - "name": "data", - "type": "bytes32", - "indexed": false, - "internalType": "bytes32" - }, - { - "name": "signal", - "type": "bytes32", - "indexed": false, - "internalType": "bytes32" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "Initialized", - "inputs": [ - { - "name": "version", - "type": "uint8", - "indexed": false, - "internalType": "uint8" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "OwnershipTransferStarted", - "inputs": [ - { - "name": "previousOwner", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "newOwner", - "type": "address", - "indexed": true, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "OwnershipTransferred", - "inputs": [ - { - "name": "previousOwner", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "newOwner", - "type": "address", - "indexed": true, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "Paused", - "inputs": [ - { - "name": "account", - "type": "address", - "indexed": false, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "SignalSent", - "inputs": [ - { - "name": "app", - "type": "address", - "indexed": false, - "internalType": "address" - }, - { - "name": "signal", - "type": "bytes32", - "indexed": false, - "internalType": "bytes32" - }, - { - "name": "slot", - "type": "bytes32", - "indexed": false, - "internalType": "bytes32" - }, - { - "name": "value", - "type": "bytes32", - "indexed": false, - "internalType": "bytes32" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "Unpaused", - "inputs": [ - { - "name": "account", - "type": "address", - "indexed": false, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "Upgraded", - "inputs": [ - { - "name": "implementation", - "type": "address", - "indexed": true, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "error", - "name": "FUNC_NOT_IMPLEMENTED", - "inputs": [] - }, - { - "type": "error", - "name": "INVALID_PAUSE_STATUS", - "inputs": [] - }, - { - "type": "error", - "name": "LTP_INVALID_ACCOUNT_PROOF", - "inputs": [] - }, - { - "type": "error", - "name": "LTP_INVALID_INCLUSION_PROOF", - "inputs": [] - }, - { - "type": "error", - "name": "REENTRANT_CALL", - "inputs": [] - }, - { - "type": "error", - "name": "RESOLVER_DENIED", - "inputs": [] - }, - { - "type": "error", - "name": "RESOLVER_INVALID_MANAGER", - "inputs": [] - }, - { - "type": "error", - "name": "RESOLVER_UNEXPECTED_CHAINID", - "inputs": [] - }, - { - "type": "error", - "name": "RESOLVER_ZERO_ADDR", - "inputs": [ - { - "name": "chainId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "name", - "type": "bytes32", - "internalType": "bytes32" - } - ] - }, - { - "type": "error", - "name": "SS_EMPTY_PROOF", - "inputs": [] - }, - { - "type": "error", - "name": "SS_INVALID_HOPS_WITH_LOOP", - "inputs": [] - }, - { - "type": "error", - "name": "SS_INVALID_LAST_HOP_CHAINID", - "inputs": [] - }, - { - "type": "error", - "name": "SS_INVALID_MID_HOP_CHAINID", - "inputs": [] - }, - { - "type": "error", - "name": "SS_INVALID_STATE", - "inputs": [] - }, - { - "type": "error", - "name": "SS_SIGNAL_NOT_FOUND", - "inputs": [] - }, - { - "type": "error", - "name": "SS_UNAUTHORIZED", - "inputs": [] - }, - { - "type": "error", - "name": "ZERO_ADDRESS", - "inputs": [] - }, - { - "type": "error", - "name": "ZERO_VALUE", - "inputs": [] - } -] diff --git a/packages/relayer/api/api.go b/packages/relayer/api/api.go index e7b72bd1477..ebff088719b 100644 --- a/packages/relayer/api/api.go +++ b/packages/relayer/api/api.go @@ -2,7 +2,6 @@ package api import ( "context" - "database/sql" "fmt" "log/slog" nethttp "net/http" @@ -17,19 +16,13 @@ import ( "github.com/taikoxyz/taiko-mono/packages/relayer/pkg/repo" "github.com/taikoxyz/taiko-mono/packages/relayer/pkg/utils" "github.com/urfave/cli/v2" - "gorm.io/gorm" ) -type DB interface { - DB() (*sql.DB, error) - GormDB() *gorm.DB -} - type API struct { srv *http.Server httpPort uint64 ctx context.Context - wg *sync.WaitGroup + wg sync.WaitGroup srcEthClient *ethclient.Client } @@ -84,7 +77,6 @@ func InitFromConfig(ctx context.Context, api *API, cfg *Config) (err error) { api.srv = srv api.httpPort = cfg.HTTPPort api.ctx = ctx - api.wg = &sync.WaitGroup{} api.srcEthClient = srcEthClient return nil @@ -112,7 +104,7 @@ func (api *API) Start() error { go func() { if err := backoff.Retry(func() error { - return utils.ScanBlocks(api.ctx, api.srcEthClient, api.wg) + return utils.ScanBlocks(api.ctx, api.srcEthClient, &api.wg) }, backoff.NewConstantBackOff(5*time.Second)); err != nil { slog.Error("scan blocks backoff retry", "error", err) } diff --git a/packages/relayer/api/config.go b/packages/relayer/api/config.go index 9c25d25e5a5..22b320cecc3 100644 --- a/packages/relayer/api/config.go +++ b/packages/relayer/api/config.go @@ -28,7 +28,7 @@ type Config struct { ProcessingFeeMultiplier float64 DestTaikoAddress common.Address HTTPPort uint64 - OpenDBFunc func() (DB, error) + OpenDBFunc func() (db.DB, error) } // NewConfigFromCliContext creates a new config instance from command line flags. @@ -47,7 +47,7 @@ func NewConfigFromCliContext(c *cli.Context) (*Config, error) { DestRPCUrl: c.String(flags.DestRPCUrl.Name), ProcessingFeeMultiplier: c.Float64(flags.ProcessingFeeMultiplier.Name), DestTaikoAddress: common.HexToAddress(c.String(flags.DestTaikoAddress.Name)), - OpenDBFunc: func() (DB, error) { + OpenDBFunc: func() (db.DB, error) { return db.OpenDBConnection(db.DBConnectionOpts{ Name: c.String(flags.DatabaseUsername.Name), Password: c.String(flags.DatabasePassword.Name), @@ -56,7 +56,7 @@ func NewConfigFromCliContext(c *cli.Context) (*Config, error) { MaxIdleConns: c.Uint64(flags.DatabaseMaxIdleConns.Name), MaxOpenConns: c.Uint64(flags.DatabaseMaxOpenConns.Name), MaxConnLifetime: c.Uint64(flags.DatabaseConnMaxLifetime.Name), - OpenFunc: func(dsn string) (*db.DB, error) { + OpenFunc: func(dsn string) (db.DB, error) { gormDB, err := gorm.Open(mysql.Open(dsn), &gorm.Config{ Logger: logger.Default.LogMode(logger.Silent), }) diff --git a/packages/relayer/api/config_test.go b/packages/relayer/api/config_test.go index 0e07a99668d..9176b3a8856 100644 --- a/packages/relayer/api/config_test.go +++ b/packages/relayer/api/config_test.go @@ -4,9 +4,11 @@ import ( "testing" "github.com/stretchr/testify/assert" + "github.com/urfave/cli/v2" + "github.com/taikoxyz/taiko-mono/packages/relayer/cmd/flags" + "github.com/taikoxyz/taiko-mono/packages/relayer/pkg/db" "github.com/taikoxyz/taiko-mono/packages/relayer/pkg/mock" - "github.com/urfave/cli/v2" ) var ( @@ -47,7 +49,7 @@ func TestNewConfigFromCliContext(t *testing.T) { assert.Equal(t, "destRpcUrl", c.DestRPCUrl) assert.Equal(t, destTaikoAddress, c.DestTaikoAddress.Hex()) - c.OpenDBFunc = func() (DB, error) { + c.OpenDBFunc = func() (db.DB, error) { return &mock.DB{}, nil } diff --git a/packages/relayer/bindings/bridge/Bridge.go b/packages/relayer/bindings/bridge/Bridge.go index 6e31225296b..97be0a48852 100644 --- a/packages/relayer/bindings/bridge/Bridge.go +++ b/packages/relayer/bindings/bridge/Bridge.go @@ -31,9 +31,10 @@ var ( // BridgeProcessingStats is an auto generated low-level Go binding around an user-defined struct. type BridgeProcessingStats struct { - GasUsedInFeeCalc uint32 - ProofSize uint32 - NumCacheOps uint32 + GasUsedInFeeCalc uint32 + ProofSize uint32 + NumCacheOps uint32 + ProcessedByRelayer bool } // IBridgeContext is an auto generated low-level Go binding around an user-defined struct. @@ -60,7 +61,7 @@ type IBridgeMessage struct { // BridgeMetaData contains all meta data concerning the Bridge contract. var BridgeMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"receive\",\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"GAS_OVERHEAD\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"GAS_RESERVE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addressManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"context\",\"inputs\":[],\"outputs\":[{\"name\":\"ctx_\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Context\",\"components\":[{\"name\":\"msgHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"failMessage\",\"inputs\":[{\"name\":\"_message\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getMessageMinGasLimit\",\"inputs\":[{\"name\":\"dataLength\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"hashMessage\",\"inputs\":[{\"name\":\"_message\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"impl\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"inNonReentrant\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"init\",\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_addressManager\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"init2\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isDestChainEnabled\",\"inputs\":[{\"name\":\"_chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"enabled_\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"destBridge_\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isMessageFailed\",\"inputs\":[{\"name\":\"_message\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"_proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isMessageReceived\",\"inputs\":[{\"name\":\"_message\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"_proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isMessageSent\",\"inputs\":[{\"name\":\"_message\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"messageStatus\",\"inputs\":[{\"name\":\"msgHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumIBridge.Status\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"nextMessageId\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"processMessage\",\"inputs\":[{\"name\":\"_message\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"_proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"status_\",\"type\":\"uint8\",\"internalType\":\"enumIBridge.Status\"},{\"name\":\"reason_\",\"type\":\"uint8\",\"internalType\":\"enumIBridge.StatusReason\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"recallMessage\",\"inputs\":[{\"name\":\"_message\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"_proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"retryMessage\",\"inputs\":[{\"name\":\"_message\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"_isLastAttempt\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"selfDelegate\",\"inputs\":[{\"name\":\"_anyToken\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"sendMessage\",\"inputs\":[{\"name\":\"_message\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[{\"name\":\"msgHash_\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"message_\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"signalForFailedMessage\",\"inputs\":[{\"name\":\"_msgHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeTo\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"event\",\"name\":\"AdminChanged\",\"inputs\":[{\"name\":\"previousAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconUpgraded\",\"inputs\":[{\"name\":\"beacon\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MessageProcessed\",\"inputs\":[{\"name\":\"msgHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"message\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"stats\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structBridge.ProcessingStats\",\"components\":[{\"name\":\"gasUsedInFeeCalc\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"proofSize\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"numCacheOps\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MessageSent\",\"inputs\":[{\"name\":\"msgHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"message\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MessageStatusChanged\",\"inputs\":[{\"name\":\"msgHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"enumIBridge.Status\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"B_INSUFFICIENT_GAS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_CONTEXT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_FEE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_GAS_LIMIT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_VALUE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_MESSAGE_NOT_SENT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_OUT_OF_ETH_QUOTA\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_PERMISSION_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_RETRY_FAILED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_SIGNAL_NOT_RECEIVED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ETH_TRANSFER_FAILED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FUNC_NOT_IMPLEMENTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"REENTRANT_CALL\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_INVALID_MANAGER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_UNEXPECTED_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_ZERO_ADDR\",\"inputs\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ZERO_ADDRESS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_VALUE\",\"inputs\":[]}]", + ABI: "[{\"type\":\"function\",\"name\":\"GAS_OVERHEAD\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"GAS_RESERVE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"RELAYER_MAX_PROOF_BYTES\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addressManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"context\",\"inputs\":[],\"outputs\":[{\"name\":\"ctx_\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Context\",\"components\":[{\"name\":\"msgHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"failMessage\",\"inputs\":[{\"name\":\"_message\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getMessageMinGasLimit\",\"inputs\":[{\"name\":\"dataLength\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"hashMessage\",\"inputs\":[{\"name\":\"_message\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"impl\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"inNonReentrant\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"init\",\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_addressManager\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"init2\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isDestChainEnabled\",\"inputs\":[{\"name\":\"_chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"enabled_\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"destBridge_\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isMessageFailed\",\"inputs\":[{\"name\":\"_message\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"_proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isMessageReceived\",\"inputs\":[{\"name\":\"_message\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"_proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isMessageSent\",\"inputs\":[{\"name\":\"_message\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"messageStatus\",\"inputs\":[{\"name\":\"msgHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumIBridge.Status\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"nextMessageId\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"processMessage\",\"inputs\":[{\"name\":\"_message\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"_proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"status_\",\"type\":\"uint8\",\"internalType\":\"enumIBridge.Status\"},{\"name\":\"reason_\",\"type\":\"uint8\",\"internalType\":\"enumIBridge.StatusReason\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"recallMessage\",\"inputs\":[{\"name\":\"_message\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"_proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"retryMessage\",\"inputs\":[{\"name\":\"_message\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"_isLastAttempt\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"selfDelegate\",\"inputs\":[{\"name\":\"_anyToken\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"sendMessage\",\"inputs\":[{\"name\":\"_message\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[{\"name\":\"msgHash_\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"message_\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"signalForFailedMessage\",\"inputs\":[{\"name\":\"_msgHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeTo\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"event\",\"name\":\"AdminChanged\",\"inputs\":[{\"name\":\"previousAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconUpgraded\",\"inputs\":[{\"name\":\"beacon\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MessageProcessed\",\"inputs\":[{\"name\":\"msgHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"message\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"stats\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structBridge.ProcessingStats\",\"components\":[{\"name\":\"gasUsedInFeeCalc\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"proofSize\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"numCacheOps\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"processedByRelayer\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MessageSent\",\"inputs\":[{\"name\":\"msgHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"message\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MessageStatusChanged\",\"inputs\":[{\"name\":\"msgHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"enumIBridge.Status\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"B_INSUFFICIENT_GAS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_CONTEXT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_FEE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_GAS_LIMIT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_VALUE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_MESSAGE_NOT_SENT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_OUT_OF_ETH_QUOTA\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_PERMISSION_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_PROOF_TOO_LARGE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_RETRY_FAILED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_SIGNAL_NOT_RECEIVED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ETH_TRANSFER_FAILED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FUNC_NOT_IMPLEMENTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"REENTRANT_CALL\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_INVALID_MANAGER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_UNEXPECTED_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_ZERO_ADDR\",\"inputs\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ZERO_ADDRESS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_VALUE\",\"inputs\":[]}]", } // BridgeABI is the input ABI used to generate the binding from. @@ -271,6 +272,37 @@ func (_Bridge *BridgeCallerSession) GASRESERVE() (uint32, error) { return _Bridge.Contract.GASRESERVE(&_Bridge.CallOpts) } +// RELAYERMAXPROOFBYTES is a free data retrieval call binding the contract method 0x422770fa. +// +// Solidity: function RELAYER_MAX_PROOF_BYTES() view returns(uint256) +func (_Bridge *BridgeCaller) RELAYERMAXPROOFBYTES(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _Bridge.contract.Call(opts, &out, "RELAYER_MAX_PROOF_BYTES") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// RELAYERMAXPROOFBYTES is a free data retrieval call binding the contract method 0x422770fa. +// +// Solidity: function RELAYER_MAX_PROOF_BYTES() view returns(uint256) +func (_Bridge *BridgeSession) RELAYERMAXPROOFBYTES() (*big.Int, error) { + return _Bridge.Contract.RELAYERMAXPROOFBYTES(&_Bridge.CallOpts) +} + +// RELAYERMAXPROOFBYTES is a free data retrieval call binding the contract method 0x422770fa. +// +// Solidity: function RELAYER_MAX_PROOF_BYTES() view returns(uint256) +func (_Bridge *BridgeCallerSession) RELAYERMAXPROOFBYTES() (*big.Int, error) { + return _Bridge.Contract.RELAYERMAXPROOFBYTES(&_Bridge.CallOpts) +} + // AddressManager is a free data retrieval call binding the contract method 0x3ab76e9f. // // Solidity: function addressManager() view returns(address) @@ -1220,27 +1252,6 @@ func (_Bridge *BridgeTransactorSession) UpgradeToAndCall(newImplementation commo return _Bridge.Contract.UpgradeToAndCall(&_Bridge.TransactOpts, newImplementation, data) } -// Receive is a paid mutator transaction binding the contract receive function. -// -// Solidity: receive() payable returns() -func (_Bridge *BridgeTransactor) Receive(opts *bind.TransactOpts) (*types.Transaction, error) { - return _Bridge.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 (_Bridge *BridgeSession) Receive() (*types.Transaction, error) { - return _Bridge.Contract.Receive(&_Bridge.TransactOpts) -} - -// Receive is a paid mutator transaction binding the contract receive function. -// -// Solidity: receive() payable returns() -func (_Bridge *BridgeTransactorSession) Receive() (*types.Transaction, error) { - return _Bridge.Contract.Receive(&_Bridge.TransactOpts) -} - // BridgeAdminChangedIterator is returned from FilterAdminChanged and is used to iterate over the raw logs and unpacked data for AdminChanged events raised by the Bridge contract. type BridgeAdminChangedIterator struct { Event *BridgeAdminChanged // Event containing the contract specifics and raw log @@ -1729,9 +1740,9 @@ type BridgeMessageProcessed struct { Raw types.Log // Blockchain specific contextual infos } -// FilterMessageProcessed is a free log retrieval operation binding the contract event 0xdaa934be05606f60ac49cd6e2ca4fbb3a5c15680dd3304880ea6abb590486e3d. +// FilterMessageProcessed is a free log retrieval operation binding the contract event 0x8580f507761043ecdd2bdca084d6fb0109150b3d9842d854d34e3dea6d69387d. // -// Solidity: event MessageProcessed(bytes32 indexed msgHash, (uint64,uint64,uint32,address,uint64,address,uint64,address,address,uint256,bytes) message, (uint32,uint32,uint32) stats) +// Solidity: event MessageProcessed(bytes32 indexed msgHash, (uint64,uint64,uint32,address,uint64,address,uint64,address,address,uint256,bytes) message, (uint32,uint32,uint32,bool) stats) func (_Bridge *BridgeFilterer) FilterMessageProcessed(opts *bind.FilterOpts, msgHash [][32]byte) (*BridgeMessageProcessedIterator, error) { var msgHashRule []interface{} @@ -1746,9 +1757,9 @@ func (_Bridge *BridgeFilterer) FilterMessageProcessed(opts *bind.FilterOpts, msg return &BridgeMessageProcessedIterator{contract: _Bridge.contract, event: "MessageProcessed", logs: logs, sub: sub}, nil } -// WatchMessageProcessed is a free log subscription operation binding the contract event 0xdaa934be05606f60ac49cd6e2ca4fbb3a5c15680dd3304880ea6abb590486e3d. +// WatchMessageProcessed is a free log subscription operation binding the contract event 0x8580f507761043ecdd2bdca084d6fb0109150b3d9842d854d34e3dea6d69387d. // -// Solidity: event MessageProcessed(bytes32 indexed msgHash, (uint64,uint64,uint32,address,uint64,address,uint64,address,address,uint256,bytes) message, (uint32,uint32,uint32) stats) +// Solidity: event MessageProcessed(bytes32 indexed msgHash, (uint64,uint64,uint32,address,uint64,address,uint64,address,address,uint256,bytes) message, (uint32,uint32,uint32,bool) stats) func (_Bridge *BridgeFilterer) WatchMessageProcessed(opts *bind.WatchOpts, sink chan<- *BridgeMessageProcessed, msgHash [][32]byte) (event.Subscription, error) { var msgHashRule []interface{} @@ -1788,9 +1799,9 @@ func (_Bridge *BridgeFilterer) WatchMessageProcessed(opts *bind.WatchOpts, sink }), nil } -// ParseMessageProcessed is a log parse operation binding the contract event 0xdaa934be05606f60ac49cd6e2ca4fbb3a5c15680dd3304880ea6abb590486e3d. +// ParseMessageProcessed is a log parse operation binding the contract event 0x8580f507761043ecdd2bdca084d6fb0109150b3d9842d854d34e3dea6d69387d. // -// Solidity: event MessageProcessed(bytes32 indexed msgHash, (uint64,uint64,uint32,address,uint64,address,uint64,address,address,uint256,bytes) message, (uint32,uint32,uint32) stats) +// Solidity: event MessageProcessed(bytes32 indexed msgHash, (uint64,uint64,uint32,address,uint64,address,uint64,address,address,uint256,bytes) message, (uint32,uint32,uint32,bool) stats) func (_Bridge *BridgeFilterer) ParseMessageProcessed(log types.Log) (*BridgeMessageProcessed, error) { event := new(BridgeMessageProcessed) if err := _Bridge.contract.UnpackLog(event, "MessageProcessed", log); err != nil { diff --git a/packages/relayer/bindings/erc1155vault/ERC1155Vault.go b/packages/relayer/bindings/erc1155vault/ERC1155Vault.go index 23c51136d1d..43e11874c90 100644 --- a/packages/relayer/bindings/erc1155vault/ERC1155Vault.go +++ b/packages/relayer/bindings/erc1155vault/ERC1155Vault.go @@ -58,7 +58,7 @@ type IBridgeMessage struct { // ERC1155VaultMetaData contains all meta data concerning the ERC1155Vault contract. var ERC1155VaultMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addressManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"bridgedToCanonical\",\"inputs\":[{\"name\":\"btoken\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"symbol\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"name\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"canonicalToBridged\",\"inputs\":[{\"name\":\"chainId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"ctoken\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"btoken\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"impl\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"inNonReentrant\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"init\",\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_addressManager\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"name\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"onERC1155BatchReceived\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"onERC1155Received\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"onMessageInvocation\",\"inputs\":[{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"onMessageRecalled\",\"inputs\":[{\"name\":\"message\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"msgHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sendToken\",\"inputs\":[{\"name\":\"_op\",\"type\":\"tuple\",\"internalType\":\"structBaseNFTVault.BridgeTransferOp\",\"components\":[{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"tokenIds\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"amounts\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]}],\"outputs\":[{\"name\":\"message_\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"supportsInterface\",\"inputs\":[{\"name\":\"_interfaceId\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeTo\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"event\",\"name\":\"AdminChanged\",\"inputs\":[{\"name\":\"previousAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconUpgraded\",\"inputs\":[{\"name\":\"beacon\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BridgedTokenDeployed\",\"inputs\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"ctoken\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"btoken\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"ctokenSymbol\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"ctokenName\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TokenReceived\",\"inputs\":[{\"name\":\"msgHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"ctoken\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"tokenIds\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"},{\"name\":\"amounts\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TokenReleased\",\"inputs\":[{\"name\":\"msgHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"ctoken\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"tokenIds\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"},{\"name\":\"amounts\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TokenSent\",\"inputs\":[{\"name\":\"msgHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"ctoken\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"tokenIds\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"},{\"name\":\"amounts\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"ETH_TRANSFER_FAILED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FUNC_NOT_IMPLEMENTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"REENTRANT_CALL\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_INVALID_MANAGER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_UNEXPECTED_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_ZERO_ADDR\",\"inputs\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"VAULT_INTERFACE_NOT_SUPPORTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_AMOUNT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_TOKEN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_TO_ADDR\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_PERMISSION_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_TOKEN_ARRAY_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_ADDRESS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_VALUE\",\"inputs\":[]}]", + ABI: "[{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addressManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"bridgedToCanonical\",\"inputs\":[{\"name\":\"btoken\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"symbol\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"name\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"canonicalToBridged\",\"inputs\":[{\"name\":\"chainId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"ctoken\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"btoken\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"impl\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"inNonReentrant\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"init\",\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_addressManager\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"name\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"onERC1155BatchReceived\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"onERC1155Received\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"onMessageInvocation\",\"inputs\":[{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"onMessageRecalled\",\"inputs\":[{\"name\":\"message\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"msgHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sendToken\",\"inputs\":[{\"name\":\"_op\",\"type\":\"tuple\",\"internalType\":\"structBaseNFTVault.BridgeTransferOp\",\"components\":[{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"tokenIds\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"amounts\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]}],\"outputs\":[{\"name\":\"message_\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"supportsInterface\",\"inputs\":[{\"name\":\"_interfaceId\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeTo\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"event\",\"name\":\"AdminChanged\",\"inputs\":[{\"name\":\"previousAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconUpgraded\",\"inputs\":[{\"name\":\"beacon\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BridgedTokenDeployed\",\"inputs\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"ctoken\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"btoken\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"ctokenSymbol\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"ctokenName\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TokenReceived\",\"inputs\":[{\"name\":\"msgHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"ctoken\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"tokenIds\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"},{\"name\":\"amounts\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TokenReleased\",\"inputs\":[{\"name\":\"msgHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"ctoken\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"tokenIds\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"},{\"name\":\"amounts\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TokenSent\",\"inputs\":[{\"name\":\"msgHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"ctoken\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"tokenIds\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"},{\"name\":\"amounts\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"ETH_TRANSFER_FAILED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FUNC_NOT_IMPLEMENTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"REENTRANT_CALL\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_INVALID_MANAGER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_UNEXPECTED_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_ZERO_ADDR\",\"inputs\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"VAULT_INSUFFICIENT_FEE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INTERFACE_NOT_SUPPORTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_AMOUNT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_TOKEN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_TO_ADDR\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_PERMISSION_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_TOKEN_ARRAY_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_ADDRESS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_VALUE\",\"inputs\":[]}]", } // ERC1155VaultABI is the input ABI used to generate the binding from. diff --git a/packages/relayer/bindings/erc20vault/ERC20Vault.go b/packages/relayer/bindings/erc20vault/ERC20Vault.go index ccbe17c07a5..877b253c36a 100644 --- a/packages/relayer/bindings/erc20vault/ERC20Vault.go +++ b/packages/relayer/bindings/erc20vault/ERC20Vault.go @@ -66,7 +66,7 @@ type IBridgeMessage struct { // ERC20VaultMetaData contains all meta data concerning the ERC20Vault contract. var ERC20VaultMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"function\",\"name\":\"MIN_MIGRATION_DELAY\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addressManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"bridgedToCanonical\",\"inputs\":[{\"name\":\"btoken\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"decimals\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"symbol\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"name\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"btokenBlacklist\",\"inputs\":[{\"name\":\"btoken\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"blacklisted\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"canonicalToBridged\",\"inputs\":[{\"name\":\"chainId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"ctoken\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"btoken\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"changeBridgedToken\",\"inputs\":[{\"name\":\"_ctoken\",\"type\":\"tuple\",\"internalType\":\"structERC20Vault.CanonicalERC20\",\"components\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"decimals\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"symbol\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"name\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"name\":\"_btokenNew\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"btokenOld_\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"impl\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"inNonReentrant\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"init\",\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_addressManager\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"lastMigrationStart\",\"inputs\":[{\"name\":\"chainId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"ctoken\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"timestamp\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"name\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"onMessageInvocation\",\"inputs\":[{\"name\":\"_data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"onMessageRecalled\",\"inputs\":[{\"name\":\"_message\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"_msgHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sendToken\",\"inputs\":[{\"name\":\"_op\",\"type\":\"tuple\",\"internalType\":\"structERC20Vault.BridgeTransferOp\",\"components\":[{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[{\"name\":\"message_\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"supportsInterface\",\"inputs\":[{\"name\":\"_interfaceId\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeTo\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"event\",\"name\":\"AdminChanged\",\"inputs\":[{\"name\":\"previousAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconUpgraded\",\"inputs\":[{\"name\":\"beacon\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BridgedTokenChanged\",\"inputs\":[{\"name\":\"srcChainId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"ctoken\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"btokenOld\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"btokenNew\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"ctokenSymbol\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"ctokenName\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"ctokenDecimal\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BridgedTokenDeployed\",\"inputs\":[{\"name\":\"srcChainId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"ctoken\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"btoken\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"ctokenSymbol\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"ctokenName\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"ctokenDecimal\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TokenReceived\",\"inputs\":[{\"name\":\"msgHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"ctoken\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TokenReleased\",\"inputs\":[{\"name\":\"msgHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"ctoken\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TokenSent\",\"inputs\":[{\"name\":\"msgHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"ctoken\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"ETH_TRANSFER_FAILED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FUNC_NOT_IMPLEMENTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"REENTRANT_CALL\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_INVALID_MANAGER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_UNEXPECTED_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_ZERO_ADDR\",\"inputs\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"VAULT_BTOKEN_BLACKLISTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_CTOKEN_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_AMOUNT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_NEW_BTOKEN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_TOKEN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_TO_ADDR\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_LAST_MIGRATION_TOO_CLOSE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_PERMISSION_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_ADDRESS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_VALUE\",\"inputs\":[]}]", + ABI: "[{\"type\":\"function\",\"name\":\"MIN_MIGRATION_DELAY\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addressManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"bridgedToCanonical\",\"inputs\":[{\"name\":\"btoken\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"decimals\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"symbol\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"name\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"btokenDenylist\",\"inputs\":[{\"name\":\"btoken\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"denied\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"canonicalToBridged\",\"inputs\":[{\"name\":\"chainId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"ctoken\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"btoken\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"changeBridgedToken\",\"inputs\":[{\"name\":\"_ctoken\",\"type\":\"tuple\",\"internalType\":\"structERC20Vault.CanonicalERC20\",\"components\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"decimals\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"symbol\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"name\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"name\":\"_btokenNew\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"btokenOld_\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"impl\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"inNonReentrant\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"init\",\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_addressManager\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"lastMigrationStart\",\"inputs\":[{\"name\":\"chainId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"ctoken\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"timestamp\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"name\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"onMessageInvocation\",\"inputs\":[{\"name\":\"_data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"onMessageRecalled\",\"inputs\":[{\"name\":\"_message\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"_msgHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sendToken\",\"inputs\":[{\"name\":\"_op\",\"type\":\"tuple\",\"internalType\":\"structERC20Vault.BridgeTransferOp\",\"components\":[{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[{\"name\":\"message_\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"supportsInterface\",\"inputs\":[{\"name\":\"_interfaceId\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeTo\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"event\",\"name\":\"AdminChanged\",\"inputs\":[{\"name\":\"previousAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconUpgraded\",\"inputs\":[{\"name\":\"beacon\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BridgedTokenChanged\",\"inputs\":[{\"name\":\"srcChainId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"ctoken\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"btokenOld\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"btokenNew\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"ctokenSymbol\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"ctokenName\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"ctokenDecimal\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BridgedTokenDeployed\",\"inputs\":[{\"name\":\"srcChainId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"ctoken\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"btoken\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"ctokenSymbol\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"ctokenName\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"ctokenDecimal\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TokenReceived\",\"inputs\":[{\"name\":\"msgHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"ctoken\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TokenReleased\",\"inputs\":[{\"name\":\"msgHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"ctoken\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TokenSent\",\"inputs\":[{\"name\":\"msgHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"canonicalChainId\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"ctoken\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"ETH_TRANSFER_FAILED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FUNC_NOT_IMPLEMENTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"REENTRANT_CALL\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_INVALID_MANAGER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_UNEXPECTED_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_ZERO_ADDR\",\"inputs\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"VAULT_BTOKEN_BLACKLISTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_CTOKEN_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INSUFFICIENT_FEE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_AMOUNT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_CTOKEN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_NEW_BTOKEN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_TOKEN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_TO_ADDR\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_LAST_MIGRATION_TOO_CLOSE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_PERMISSION_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_ADDRESS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_VALUE\",\"inputs\":[]}]", } // ERC20VaultABI is the input ABI used to generate the binding from. @@ -337,12 +337,12 @@ func (_ERC20Vault *ERC20VaultCallerSession) BridgedToCanonical(btoken common.Add return _ERC20Vault.Contract.BridgedToCanonical(&_ERC20Vault.CallOpts, btoken) } -// BtokenBlacklist is a free data retrieval call binding the contract method 0xcaec3e4e. +// BtokenDenylist is a free data retrieval call binding the contract method 0x0e7eeb79. // -// Solidity: function btokenBlacklist(address btoken) view returns(bool blacklisted) -func (_ERC20Vault *ERC20VaultCaller) BtokenBlacklist(opts *bind.CallOpts, btoken common.Address) (bool, error) { +// Solidity: function btokenDenylist(address btoken) view returns(bool denied) +func (_ERC20Vault *ERC20VaultCaller) BtokenDenylist(opts *bind.CallOpts, btoken common.Address) (bool, error) { var out []interface{} - err := _ERC20Vault.contract.Call(opts, &out, "btokenBlacklist", btoken) + err := _ERC20Vault.contract.Call(opts, &out, "btokenDenylist", btoken) if err != nil { return *new(bool), err @@ -354,18 +354,18 @@ func (_ERC20Vault *ERC20VaultCaller) BtokenBlacklist(opts *bind.CallOpts, btoken } -// BtokenBlacklist is a free data retrieval call binding the contract method 0xcaec3e4e. +// BtokenDenylist is a free data retrieval call binding the contract method 0x0e7eeb79. // -// Solidity: function btokenBlacklist(address btoken) view returns(bool blacklisted) -func (_ERC20Vault *ERC20VaultSession) BtokenBlacklist(btoken common.Address) (bool, error) { - return _ERC20Vault.Contract.BtokenBlacklist(&_ERC20Vault.CallOpts, btoken) +// Solidity: function btokenDenylist(address btoken) view returns(bool denied) +func (_ERC20Vault *ERC20VaultSession) BtokenDenylist(btoken common.Address) (bool, error) { + return _ERC20Vault.Contract.BtokenDenylist(&_ERC20Vault.CallOpts, btoken) } -// BtokenBlacklist is a free data retrieval call binding the contract method 0xcaec3e4e. +// BtokenDenylist is a free data retrieval call binding the contract method 0x0e7eeb79. // -// Solidity: function btokenBlacklist(address btoken) view returns(bool blacklisted) -func (_ERC20Vault *ERC20VaultCallerSession) BtokenBlacklist(btoken common.Address) (bool, error) { - return _ERC20Vault.Contract.BtokenBlacklist(&_ERC20Vault.CallOpts, btoken) +// Solidity: function btokenDenylist(address btoken) view returns(bool denied) +func (_ERC20Vault *ERC20VaultCallerSession) BtokenDenylist(btoken common.Address) (bool, error) { + return _ERC20Vault.Contract.BtokenDenylist(&_ERC20Vault.CallOpts, btoken) } // CanonicalToBridged is a free data retrieval call binding the contract method 0x67090ccf. @@ -2590,19 +2590,20 @@ func (it *ERC20VaultTokenSentIterator) Close() error { // ERC20VaultTokenSent represents a TokenSent event raised by the ERC20Vault contract. type ERC20VaultTokenSent struct { - MsgHash [32]byte - From common.Address - To common.Address - DestChainId uint64 - Ctoken common.Address - Token common.Address - Amount *big.Int - Raw types.Log // Blockchain specific contextual infos + MsgHash [32]byte + From common.Address + To common.Address + CanonicalChainId uint64 + DestChainId uint64 + Ctoken common.Address + Token common.Address + Amount *big.Int + Raw types.Log // Blockchain specific contextual infos } -// FilterTokenSent is a free log retrieval operation binding the contract event 0xeb8a69f21b7a981e25f90d9f1e2ab7fa5bdbfddbc0ac160344145fc5caa6ddd2. +// FilterTokenSent is a free log retrieval operation binding the contract event 0x256f5c87f6ab8d238ac244067613227eb6e2cd65299121135d4f778e8581e03d. // -// Solidity: event TokenSent(bytes32 indexed msgHash, address indexed from, address indexed to, uint64 destChainId, address ctoken, address token, uint256 amount) +// Solidity: event TokenSent(bytes32 indexed msgHash, address indexed from, address indexed to, uint64 canonicalChainId, uint64 destChainId, address ctoken, address token, uint256 amount) func (_ERC20Vault *ERC20VaultFilterer) FilterTokenSent(opts *bind.FilterOpts, msgHash [][32]byte, from []common.Address, to []common.Address) (*ERC20VaultTokenSentIterator, error) { var msgHashRule []interface{} @@ -2625,9 +2626,9 @@ func (_ERC20Vault *ERC20VaultFilterer) FilterTokenSent(opts *bind.FilterOpts, ms return &ERC20VaultTokenSentIterator{contract: _ERC20Vault.contract, event: "TokenSent", logs: logs, sub: sub}, nil } -// WatchTokenSent is a free log subscription operation binding the contract event 0xeb8a69f21b7a981e25f90d9f1e2ab7fa5bdbfddbc0ac160344145fc5caa6ddd2. +// WatchTokenSent is a free log subscription operation binding the contract event 0x256f5c87f6ab8d238ac244067613227eb6e2cd65299121135d4f778e8581e03d. // -// Solidity: event TokenSent(bytes32 indexed msgHash, address indexed from, address indexed to, uint64 destChainId, address ctoken, address token, uint256 amount) +// Solidity: event TokenSent(bytes32 indexed msgHash, address indexed from, address indexed to, uint64 canonicalChainId, uint64 destChainId, address ctoken, address token, uint256 amount) func (_ERC20Vault *ERC20VaultFilterer) WatchTokenSent(opts *bind.WatchOpts, sink chan<- *ERC20VaultTokenSent, msgHash [][32]byte, from []common.Address, to []common.Address) (event.Subscription, error) { var msgHashRule []interface{} @@ -2675,9 +2676,9 @@ func (_ERC20Vault *ERC20VaultFilterer) WatchTokenSent(opts *bind.WatchOpts, sink }), nil } -// ParseTokenSent is a log parse operation binding the contract event 0xeb8a69f21b7a981e25f90d9f1e2ab7fa5bdbfddbc0ac160344145fc5caa6ddd2. +// ParseTokenSent is a log parse operation binding the contract event 0x256f5c87f6ab8d238ac244067613227eb6e2cd65299121135d4f778e8581e03d. // -// Solidity: event TokenSent(bytes32 indexed msgHash, address indexed from, address indexed to, uint64 destChainId, address ctoken, address token, uint256 amount) +// Solidity: event TokenSent(bytes32 indexed msgHash, address indexed from, address indexed to, uint64 canonicalChainId, uint64 destChainId, address ctoken, address token, uint256 amount) func (_ERC20Vault *ERC20VaultFilterer) ParseTokenSent(log types.Log) (*ERC20VaultTokenSent, error) { event := new(ERC20VaultTokenSent) if err := _ERC20Vault.contract.UnpackLog(event, "TokenSent", log); err != nil { diff --git a/packages/relayer/bindings/erc721vault/ERC721Vault.go b/packages/relayer/bindings/erc721vault/ERC721Vault.go index e972df37ff2..3cf53e85f9d 100644 --- a/packages/relayer/bindings/erc721vault/ERC721Vault.go +++ b/packages/relayer/bindings/erc721vault/ERC721Vault.go @@ -58,7 +58,7 @@ type IBridgeMessage struct { // ERC721VaultMetaData contains all meta data concerning the ERC721Vault contract. var ERC721VaultMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addressManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"bridgedToCanonical\",\"inputs\":[{\"name\":\"btoken\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"symbol\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"name\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"canonicalToBridged\",\"inputs\":[{\"name\":\"chainId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"ctoken\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"btoken\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"impl\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"inNonReentrant\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"init\",\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_addressManager\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"name\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"onERC721Received\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"onMessageInvocation\",\"inputs\":[{\"name\":\"_data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"onMessageRecalled\",\"inputs\":[{\"name\":\"_message\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"_msgHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sendToken\",\"inputs\":[{\"name\":\"_op\",\"type\":\"tuple\",\"internalType\":\"structBaseNFTVault.BridgeTransferOp\",\"components\":[{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"tokenIds\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"amounts\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]}],\"outputs\":[{\"name\":\"message_\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"supportsInterface\",\"inputs\":[{\"name\":\"_interfaceId\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeTo\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"event\",\"name\":\"AdminChanged\",\"inputs\":[{\"name\":\"previousAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconUpgraded\",\"inputs\":[{\"name\":\"beacon\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BridgedTokenDeployed\",\"inputs\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"ctoken\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"btoken\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"ctokenSymbol\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"ctokenName\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TokenReceived\",\"inputs\":[{\"name\":\"msgHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"ctoken\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"tokenIds\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"},{\"name\":\"amounts\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TokenReleased\",\"inputs\":[{\"name\":\"msgHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"ctoken\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"tokenIds\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"},{\"name\":\"amounts\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TokenSent\",\"inputs\":[{\"name\":\"msgHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"ctoken\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"tokenIds\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"},{\"name\":\"amounts\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"ETH_TRANSFER_FAILED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FUNC_NOT_IMPLEMENTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"REENTRANT_CALL\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_INVALID_MANAGER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_UNEXPECTED_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_ZERO_ADDR\",\"inputs\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"VAULT_INTERFACE_NOT_SUPPORTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_AMOUNT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_TOKEN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_TO_ADDR\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_PERMISSION_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_TOKEN_ARRAY_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_ADDRESS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_VALUE\",\"inputs\":[]}]", + ABI: "[{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addressManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"bridgedToCanonical\",\"inputs\":[{\"name\":\"btoken\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"symbol\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"name\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"canonicalToBridged\",\"inputs\":[{\"name\":\"chainId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"ctoken\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"btoken\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"impl\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"inNonReentrant\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"init\",\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_addressManager\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"name\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"onERC721Received\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"onMessageInvocation\",\"inputs\":[{\"name\":\"_data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"onMessageRecalled\",\"inputs\":[{\"name\":\"_message\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"_msgHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sendToken\",\"inputs\":[{\"name\":\"_op\",\"type\":\"tuple\",\"internalType\":\"structBaseNFTVault.BridgeTransferOp\",\"components\":[{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"tokenIds\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"amounts\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]}],\"outputs\":[{\"name\":\"message_\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fee\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"supportsInterface\",\"inputs\":[{\"name\":\"_interfaceId\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeTo\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"event\",\"name\":\"AdminChanged\",\"inputs\":[{\"name\":\"previousAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconUpgraded\",\"inputs\":[{\"name\":\"beacon\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BridgedTokenDeployed\",\"inputs\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"ctoken\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"btoken\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"ctokenSymbol\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"ctokenName\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TokenReceived\",\"inputs\":[{\"name\":\"msgHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"ctoken\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"tokenIds\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"},{\"name\":\"amounts\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TokenReleased\",\"inputs\":[{\"name\":\"msgHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"ctoken\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"tokenIds\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"},{\"name\":\"amounts\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TokenSent\",\"inputs\":[{\"name\":\"msgHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"ctoken\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"tokenIds\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"},{\"name\":\"amounts\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"ETH_TRANSFER_FAILED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FUNC_NOT_IMPLEMENTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"REENTRANT_CALL\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_INVALID_MANAGER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_UNEXPECTED_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_ZERO_ADDR\",\"inputs\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"VAULT_INSUFFICIENT_FEE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INTERFACE_NOT_SUPPORTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_AMOUNT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_TOKEN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_INVALID_TO_ADDR\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_PERMISSION_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VAULT_TOKEN_ARRAY_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_ADDRESS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_VALUE\",\"inputs\":[]}]", } // ERC721VaultABI is the input ABI used to generate the binding from. diff --git a/packages/relayer/bindings/quotamanager/QuotaManager.go b/packages/relayer/bindings/quotamanager/QuotaManager.go index 87a30a38535..e953f0e8769 100644 --- a/packages/relayer/bindings/quotamanager/QuotaManager.go +++ b/packages/relayer/bindings/quotamanager/QuotaManager.go @@ -31,7 +31,7 @@ var ( // QuotaManagerMetaData contains all meta data concerning the QuotaManager contract. var QuotaManagerMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addressManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"availableQuota\",\"inputs\":[{\"name\":\"_token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_leap\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"consumeQuota\",\"inputs\":[{\"name\":\"_token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"impl\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"inNonReentrant\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"init\",\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_addressManager\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_quotaPeriod\",\"type\":\"uint24\",\"internalType\":\"uint24\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"quotaPeriod\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint24\",\"internalType\":\"uint24\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"tokenQuota\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"updatedAt\",\"type\":\"uint48\",\"internalType\":\"uint48\"},{\"name\":\"quota\",\"type\":\"uint104\",\"internalType\":\"uint104\"},{\"name\":\"available\",\"type\":\"uint104\",\"internalType\":\"uint104\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateQuota\",\"inputs\":[{\"name\":\"_token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_quota\",\"type\":\"uint104\",\"internalType\":\"uint104\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeTo\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"event\",\"name\":\"AdminChanged\",\"inputs\":[{\"name\":\"previousAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconUpgraded\",\"inputs\":[{\"name\":\"beacon\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"QuotaUpdated\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"oldQuota\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"newQuota\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"FUNC_NOT_IMPLEMENTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"QM_INVALID_PARAM\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"QM_OUT_OF_QUOTA\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"REENTRANT_CALL\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_INVALID_MANAGER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_UNEXPECTED_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_ZERO_ADDR\",\"inputs\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ZERO_ADDRESS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_VALUE\",\"inputs\":[]}]", + ABI: "[{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addressManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"availableQuota\",\"inputs\":[{\"name\":\"_token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_leap\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"consumeQuota\",\"inputs\":[{\"name\":\"_token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"impl\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"inNonReentrant\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"init\",\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_addressManager\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_quotaPeriod\",\"type\":\"uint24\",\"internalType\":\"uint24\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"quotaPeriod\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint24\",\"internalType\":\"uint24\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setQuotaPeriod\",\"inputs\":[{\"name\":\"_quotaPeriod\",\"type\":\"uint24\",\"internalType\":\"uint24\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"tokenQuota\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"updatedAt\",\"type\":\"uint48\",\"internalType\":\"uint48\"},{\"name\":\"quota\",\"type\":\"uint104\",\"internalType\":\"uint104\"},{\"name\":\"available\",\"type\":\"uint104\",\"internalType\":\"uint104\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateQuota\",\"inputs\":[{\"name\":\"_token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_quota\",\"type\":\"uint104\",\"internalType\":\"uint104\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeTo\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"event\",\"name\":\"AdminChanged\",\"inputs\":[{\"name\":\"previousAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconUpgraded\",\"inputs\":[{\"name\":\"beacon\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"QuotaPeriodUpdated\",\"inputs\":[{\"name\":\"quotaPeriod\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"QuotaUpdated\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"oldQuota\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"newQuota\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"FUNC_NOT_IMPLEMENTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"QM_INVALID_PARAM\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"QM_OUT_OF_QUOTA\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"REENTRANT_CALL\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_INVALID_MANAGER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_UNEXPECTED_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_ZERO_ADDR\",\"inputs\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ZERO_ADDRESS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_VALUE\",\"inputs\":[]}]", } // QuotaManagerABI is the input ABI used to generate the binding from. @@ -707,6 +707,27 @@ func (_QuotaManager *QuotaManagerTransactorSession) RenounceOwnership() (*types. return _QuotaManager.Contract.RenounceOwnership(&_QuotaManager.TransactOpts) } +// SetQuotaPeriod is a paid mutator transaction binding the contract method 0xb91d1651. +// +// Solidity: function setQuotaPeriod(uint24 _quotaPeriod) returns() +func (_QuotaManager *QuotaManagerTransactor) SetQuotaPeriod(opts *bind.TransactOpts, _quotaPeriod *big.Int) (*types.Transaction, error) { + return _QuotaManager.contract.Transact(opts, "setQuotaPeriod", _quotaPeriod) +} + +// SetQuotaPeriod is a paid mutator transaction binding the contract method 0xb91d1651. +// +// Solidity: function setQuotaPeriod(uint24 _quotaPeriod) returns() +func (_QuotaManager *QuotaManagerSession) SetQuotaPeriod(_quotaPeriod *big.Int) (*types.Transaction, error) { + return _QuotaManager.Contract.SetQuotaPeriod(&_QuotaManager.TransactOpts, _quotaPeriod) +} + +// SetQuotaPeriod is a paid mutator transaction binding the contract method 0xb91d1651. +// +// Solidity: function setQuotaPeriod(uint24 _quotaPeriod) returns() +func (_QuotaManager *QuotaManagerTransactorSession) SetQuotaPeriod(_quotaPeriod *big.Int) (*types.Transaction, error) { + return _QuotaManager.Contract.SetQuotaPeriod(&_QuotaManager.TransactOpts, _quotaPeriod) +} + // TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b. // // Solidity: function transferOwnership(address newOwner) returns() @@ -1665,6 +1686,140 @@ func (_QuotaManager *QuotaManagerFilterer) ParsePaused(log types.Log) (*QuotaMan return event, nil } +// QuotaManagerQuotaPeriodUpdatedIterator is returned from FilterQuotaPeriodUpdated and is used to iterate over the raw logs and unpacked data for QuotaPeriodUpdated events raised by the QuotaManager contract. +type QuotaManagerQuotaPeriodUpdatedIterator struct { + Event *QuotaManagerQuotaPeriodUpdated // 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 *QuotaManagerQuotaPeriodUpdatedIterator) 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(QuotaManagerQuotaPeriodUpdated) + 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(QuotaManagerQuotaPeriodUpdated) + 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 *QuotaManagerQuotaPeriodUpdatedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *QuotaManagerQuotaPeriodUpdatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// QuotaManagerQuotaPeriodUpdated represents a QuotaPeriodUpdated event raised by the QuotaManager contract. +type QuotaManagerQuotaPeriodUpdated struct { + QuotaPeriod *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterQuotaPeriodUpdated is a free log retrieval operation binding the contract event 0x714cf57ffe172b008fcbb807b801535a5edc28672cff603865d82fc2708287ba. +// +// Solidity: event QuotaPeriodUpdated(uint256 quotaPeriod) +func (_QuotaManager *QuotaManagerFilterer) FilterQuotaPeriodUpdated(opts *bind.FilterOpts) (*QuotaManagerQuotaPeriodUpdatedIterator, error) { + + logs, sub, err := _QuotaManager.contract.FilterLogs(opts, "QuotaPeriodUpdated") + if err != nil { + return nil, err + } + return &QuotaManagerQuotaPeriodUpdatedIterator{contract: _QuotaManager.contract, event: "QuotaPeriodUpdated", logs: logs, sub: sub}, nil +} + +// WatchQuotaPeriodUpdated is a free log subscription operation binding the contract event 0x714cf57ffe172b008fcbb807b801535a5edc28672cff603865d82fc2708287ba. +// +// Solidity: event QuotaPeriodUpdated(uint256 quotaPeriod) +func (_QuotaManager *QuotaManagerFilterer) WatchQuotaPeriodUpdated(opts *bind.WatchOpts, sink chan<- *QuotaManagerQuotaPeriodUpdated) (event.Subscription, error) { + + logs, sub, err := _QuotaManager.contract.WatchLogs(opts, "QuotaPeriodUpdated") + 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(QuotaManagerQuotaPeriodUpdated) + if err := _QuotaManager.contract.UnpackLog(event, "QuotaPeriodUpdated", 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 +} + +// ParseQuotaPeriodUpdated is a log parse operation binding the contract event 0x714cf57ffe172b008fcbb807b801535a5edc28672cff603865d82fc2708287ba. +// +// Solidity: event QuotaPeriodUpdated(uint256 quotaPeriod) +func (_QuotaManager *QuotaManagerFilterer) ParseQuotaPeriodUpdated(log types.Log) (*QuotaManagerQuotaPeriodUpdated, error) { + event := new(QuotaManagerQuotaPeriodUpdated) + if err := _QuotaManager.contract.UnpackLog(event, "QuotaPeriodUpdated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + // QuotaManagerQuotaUpdatedIterator is returned from FilterQuotaUpdated and is used to iterate over the raw logs and unpacked data for QuotaUpdated events raised by the QuotaManager contract. type QuotaManagerQuotaUpdatedIterator struct { Event *QuotaManagerQuotaUpdated // Event containing the contract specifics and raw log diff --git a/packages/relayer/bindings/taikol1/TaikoL1.go b/packages/relayer/bindings/taikol1/TaikoL1.go index 6aa08ced8a5..0ca11edfd8f 100644 --- a/packages/relayer/bindings/taikol1/TaikoL1.go +++ b/packages/relayer/bindings/taikol1/TaikoL1.go @@ -61,13 +61,14 @@ type TaikoDataBlockMetadata struct { // TaikoDataConfig is an auto generated low-level Go binding around an user-defined struct. type TaikoDataConfig struct { - ChainId uint64 - BlockMaxProposals uint64 - BlockRingBufferSize uint64 - MaxBlocksToVerifyPerProposal uint64 - BlockMaxGasLimit uint32 - LivenessBond *big.Int - BlockSyncThreshold uint8 + ChainId uint64 + BlockMaxProposals uint64 + BlockRingBufferSize uint64 + MaxBlocksToVerify uint64 + BlockMaxGasLimit uint32 + LivenessBond *big.Int + StateRootSyncInternal uint8 + CheckEOAForCalldataDA bool } // TaikoDataEthDeposit is an auto generated low-level Go binding around an user-defined struct. @@ -120,7 +121,7 @@ type TaikoDataTransitionState struct { // TaikoL1MetaData contains all meta data concerning the TaikoL1 contract. var TaikoL1MetaData = &bind.MetaData{ - ABI: "[{\"type\":\"receive\",\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addressManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getBlock\",\"inputs\":[{\"name\":\"_blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"blk_\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.Block\",\"components\":[{\"name\":\"metaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"assignedProver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"livenessBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"proposedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"proposedIn\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nextTransitionId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"verifiedTransitionId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getConfig\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.Config\",\"components\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blockMaxProposals\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blockRingBufferSize\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxBlocksToVerifyPerProposal\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blockMaxGasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"livenessBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"blockSyncThreshold\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStateVariables\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.SlotA\",\"components\":[{\"name\":\"genesisHeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"genesisTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastSyncedBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastSynecdAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.SlotB\",\"components\":[{\"name\":\"numBlocks\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastVerifiedBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"provingPaused\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"__reservedB1\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"__reservedB2\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"__reservedB3\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"lastUnpausedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getTransition\",\"inputs\":[{\"name\":\"_blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_tid\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.TransitionState\",\"components\":[{\"name\":\"key\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"prover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"validityBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"contester\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"contestBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"tier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"__reserved1\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getTransition\",\"inputs\":[{\"name\":\"_blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.TransitionState\",\"components\":[{\"name\":\"key\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"prover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"validityBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"contester\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"contestBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"tier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"__reserved1\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"impl\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"inNonReentrant\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"init\",\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_addressManager\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_genesisBlockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_toPause\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"init2\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseProving\",\"inputs\":[{\"name\":\"_pause\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proposeBlock\",\"inputs\":[{\"name\":\"_params\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"_txList\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"meta_\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.BlockMetadata\",\"components\":[{\"name\":\"l1Hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"difficulty\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blobHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"extraData\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"depositsHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"coinbase\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"l1Height\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minTier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"blobUsed\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"parentMetaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"deposits_\",\"type\":\"tuple[]\",\"internalType\":\"structTaikoData.EthDeposit[]\",\"components\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"proveBlock\",\"inputs\":[{\"name\":\"_blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_input\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resetGenesisHash\",\"inputs\":[{\"name\":\"_genesisBlockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"slotA\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.SlotA\",\"components\":[{\"name\":\"genesisHeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"genesisTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastSyncedBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastSynecdAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"slotB\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.SlotB\",\"components\":[{\"name\":\"numBlocks\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastVerifiedBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"provingPaused\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"__reservedB1\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"__reservedB2\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"__reservedB3\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"lastUnpausedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"state\",\"inputs\":[],\"outputs\":[{\"name\":\"__reserve1\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"slotA\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.SlotA\",\"components\":[{\"name\":\"genesisHeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"genesisTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastSyncedBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastSynecdAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"name\":\"slotB\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.SlotB\",\"components\":[{\"name\":\"numBlocks\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastVerifiedBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"provingPaused\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"__reservedB1\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"__reservedB2\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"__reservedB3\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"lastUnpausedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeTo\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"verifyBlocks\",\"inputs\":[{\"name\":\"_maxBlocksToVerify\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AdminChanged\",\"inputs\":[{\"name\":\"previousAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconUpgraded\",\"inputs\":[{\"name\":\"beacon\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BlockProposed\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"assignedProver\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"livenessBond\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"meta\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.BlockMetadata\",\"components\":[{\"name\":\"l1Hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"difficulty\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blobHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"extraData\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"depositsHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"coinbase\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"l1Height\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minTier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"blobUsed\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"parentMetaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"depositsProcessed\",\"type\":\"tuple[]\",\"indexed\":false,\"internalType\":\"structTaikoData.EthDeposit[]\",\"components\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BlockProposed\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"assignedProver\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"livenessBond\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"meta\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.BlockMetadata\",\"components\":[{\"name\":\"l1Hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"difficulty\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blobHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"extraData\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"depositsHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"coinbase\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"l1Height\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minTier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"blobUsed\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"parentMetaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"depositsProcessed\",\"type\":\"tuple[]\",\"indexed\":false,\"internalType\":\"structTaikoData.EthDeposit[]\",\"components\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BlockVerified\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"prover\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BlockVerified\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"prover\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ProvingPaused\",\"inputs\":[{\"name\":\"paused\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ProvingPaused\",\"inputs\":[{\"name\":\"paused\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StateVariablesUpdated\",\"inputs\":[{\"name\":\"slotB\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.SlotB\",\"components\":[{\"name\":\"numBlocks\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastVerifiedBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"provingPaused\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"__reservedB1\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"__reservedB2\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"__reservedB3\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"lastUnpausedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StateVariablesUpdated\",\"inputs\":[{\"name\":\"slotB\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.SlotB\",\"components\":[{\"name\":\"numBlocks\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastVerifiedBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"provingPaused\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"__reservedB1\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"__reservedB2\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"__reservedB3\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"lastUnpausedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TransitionContested\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"tran\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.Transition\",\"components\":[{\"name\":\"parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"graffiti\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"contester\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"contestBond\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TransitionContested\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"tran\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.Transition\",\"components\":[{\"name\":\"parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"graffiti\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"contester\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"contestBond\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TransitionProved\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"tran\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.Transition\",\"components\":[{\"name\":\"parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"graffiti\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"prover\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"validityBond\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TransitionProved\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"tran\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.Transition\",\"components\":[{\"name\":\"parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"graffiti\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"prover\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"validityBond\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"ETH_TRANSFER_FAILED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FUNC_NOT_IMPLEMENTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_ALREADY_CONTESTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_ALREADY_CONTESTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_ALREADY_PROVED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_ALREADY_PROVED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOB_NOT_AVAILABLE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOB_NOT_AVAILABLE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOB_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOB_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOCK_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOCK_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOCK_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_CANNOT_CONTEST\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_CANNOT_CONTEST\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_BLOCK_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_BLOCK_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_BLOCK_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_CONFIG\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_CONFIG\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_GENESIS_HASH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_GENESIS_HASH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_HOOK\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_HOOK\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_PARAM\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_PROVER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_PROVER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_SIG\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_SIG\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_TIER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_TIER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_TRANSITION\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_TRANSITION\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_LIVENESS_BOND_NOT_RECEIVED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_LIVENESS_BOND_NOT_RECEIVED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_NOT_ASSIGNED_PROVER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_NOT_ASSIGNED_PROVER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_PROVING_PAUSED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_RECEIVE_DISABLED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TOO_LATE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TOO_LATE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TOO_MANY_BLOCKS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TOO_MANY_BLOCKS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TRANSITION_ID_ZERO\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TRANSITION_ID_ZERO\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TRANSITION_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TRANSITION_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNAUTHORIZED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNAUTHORIZED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNEXPECTED_PARENT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNEXPECTED_PARENT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNEXPECTED_TRANSITION_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNEXPECTED_TRANSITION_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"REENTRANT_CALL\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_INVALID_MANAGER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_UNEXPECTED_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_ZERO_ADDR\",\"inputs\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ZERO_ADDRESS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_VALUE\",\"inputs\":[]}]", + ABI: "[{\"type\":\"receive\",\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addressManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getBlock\",\"inputs\":[{\"name\":\"_blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"blk_\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.Block\",\"components\":[{\"name\":\"metaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"assignedProver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"livenessBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"proposedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"proposedIn\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nextTransitionId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"verifiedTransitionId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getConfig\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.Config\",\"components\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blockMaxProposals\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blockRingBufferSize\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxBlocksToVerify\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blockMaxGasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"livenessBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"stateRootSyncInternal\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"checkEOAForCalldataDA\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"getLastSyncedBlock\",\"inputs\":[],\"outputs\":[{\"name\":\"blockId_\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blockHash_\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot_\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getLastVerifiedBlock\",\"inputs\":[],\"outputs\":[{\"name\":\"blockId_\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blockHash_\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot_\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStateVariables\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.SlotA\",\"components\":[{\"name\":\"genesisHeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"genesisTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastSyncedBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastSynecdAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.SlotB\",\"components\":[{\"name\":\"numBlocks\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastVerifiedBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"provingPaused\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"__reservedB1\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"__reservedB2\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"__reservedB3\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"lastUnpausedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getTransition\",\"inputs\":[{\"name\":\"_blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_tid\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.TransitionState\",\"components\":[{\"name\":\"key\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"prover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"validityBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"contester\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"contestBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"tier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"__reserved1\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getTransition\",\"inputs\":[{\"name\":\"_blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.TransitionState\",\"components\":[{\"name\":\"key\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"prover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"validityBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"contester\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"contestBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"tier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"__reserved1\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"impl\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"inNonReentrant\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"init\",\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_addressManager\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_genesisBlockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_toPause\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"init2\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseProving\",\"inputs\":[{\"name\":\"_pause\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proposeBlock\",\"inputs\":[{\"name\":\"_params\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"_txList\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"meta_\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.BlockMetadata\",\"components\":[{\"name\":\"l1Hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"difficulty\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blobHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"extraData\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"depositsHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"coinbase\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"l1Height\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minTier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"blobUsed\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"parentMetaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"deposits_\",\"type\":\"tuple[]\",\"internalType\":\"structTaikoData.EthDeposit[]\",\"components\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"proveBlock\",\"inputs\":[{\"name\":\"_blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_input\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"state\",\"inputs\":[],\"outputs\":[{\"name\":\"__reserve1\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"slotA\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.SlotA\",\"components\":[{\"name\":\"genesisHeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"genesisTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastSyncedBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastSynecdAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"name\":\"slotB\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.SlotB\",\"components\":[{\"name\":\"numBlocks\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastVerifiedBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"provingPaused\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"__reservedB1\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"__reservedB2\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"__reservedB3\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"lastUnpausedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeTo\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"verifyBlocks\",\"inputs\":[{\"name\":\"_maxBlocksToVerify\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AdminChanged\",\"inputs\":[{\"name\":\"previousAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconUpgraded\",\"inputs\":[{\"name\":\"beacon\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BlockProposed\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"assignedProver\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"livenessBond\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"meta\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.BlockMetadata\",\"components\":[{\"name\":\"l1Hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"difficulty\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blobHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"extraData\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"depositsHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"coinbase\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"l1Height\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minTier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"blobUsed\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"parentMetaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"depositsProcessed\",\"type\":\"tuple[]\",\"indexed\":false,\"internalType\":\"structTaikoData.EthDeposit[]\",\"components\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BlockProposed\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"assignedProver\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"livenessBond\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"meta\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.BlockMetadata\",\"components\":[{\"name\":\"l1Hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"difficulty\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blobHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"extraData\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"depositsHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"coinbase\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"l1Height\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minTier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"blobUsed\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"parentMetaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"depositsProcessed\",\"type\":\"tuple[]\",\"indexed\":false,\"internalType\":\"structTaikoData.EthDeposit[]\",\"components\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BlockVerified\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"prover\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BlockVerified\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"prover\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"CalldataTxList\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"txList\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"CalldataTxList\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"txList\",\"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\":\"OwnershipTransferStarted\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ProvingPaused\",\"inputs\":[{\"name\":\"paused\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ProvingPaused\",\"inputs\":[{\"name\":\"paused\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StateVariablesUpdated\",\"inputs\":[{\"name\":\"slotB\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.SlotB\",\"components\":[{\"name\":\"numBlocks\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastVerifiedBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"provingPaused\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"__reservedB1\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"__reservedB2\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"__reservedB3\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"lastUnpausedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TransitionContested\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"tran\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.Transition\",\"components\":[{\"name\":\"parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"graffiti\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"contester\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"contestBond\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TransitionContested\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"tran\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.Transition\",\"components\":[{\"name\":\"parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"graffiti\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"contester\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"contestBond\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TransitionProved\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"tran\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.Transition\",\"components\":[{\"name\":\"parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"graffiti\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"prover\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"validityBond\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TransitionProved\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"tran\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.Transition\",\"components\":[{\"name\":\"parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"graffiti\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"prover\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"validityBond\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"ETH_TRANSFER_FAILED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FUNC_NOT_IMPLEMENTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_ALREADY_CONTESTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_ALREADY_CONTESTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_ALREADY_PROVED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_ALREADY_PROVED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BATCH_TRANSFER_FAILED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BATCH_TRANSFER_FAILED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOB_NOT_AVAILABLE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOB_NOT_AVAILABLE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOB_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOB_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOCK_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOCK_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOCK_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_CANNOT_CONTEST\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_CANNOT_CONTEST\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_BLOCK_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_BLOCK_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_BLOCK_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_CONFIG\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_GENESIS_HASH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_GENESIS_HASH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_PARAM\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_SIG\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_SIG\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_TIER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_TIER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_TRANSITION\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_TRANSITION\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_LIVENESS_BOND_NOT_RECEIVED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_NOT_ASSIGNED_PROVER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_NOT_ASSIGNED_PROVER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_NO_HOOKS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_PROVING_PAUSED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_RECEIVE_DISABLED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TOO_LATE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TOO_MANY_BLOCKS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TOO_MANY_BLOCKS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TRANSITION_ID_ZERO\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TRANSITION_ID_ZERO\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TRANSITION_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TRANSITION_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNEXPECTED_PARENT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNEXPECTED_PARENT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNEXPECTED_TRANSITION_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNEXPECTED_TRANSITION_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"REENTRANT_CALL\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_INVALID_MANAGER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_UNEXPECTED_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_ZERO_ADDR\",\"inputs\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ZERO_ADDRESS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_VALUE\",\"inputs\":[]}]", } // TaikoL1ABI is the input ABI used to generate the binding from. @@ -333,7 +334,7 @@ func (_TaikoL1 *TaikoL1CallerSession) GetBlock(_blockId uint64) (TaikoDataBlock, // GetConfig is a free data retrieval call binding the contract method 0xc3f909d4. // -// Solidity: function getConfig() view returns((uint64,uint64,uint64,uint64,uint32,uint96,uint8)) +// Solidity: function getConfig() pure returns((uint64,uint64,uint64,uint64,uint32,uint96,uint8,bool)) func (_TaikoL1 *TaikoL1Caller) GetConfig(opts *bind.CallOpts) (TaikoDataConfig, error) { var out []interface{} err := _TaikoL1.contract.Call(opts, &out, "getConfig") @@ -350,18 +351,118 @@ func (_TaikoL1 *TaikoL1Caller) GetConfig(opts *bind.CallOpts) (TaikoDataConfig, // GetConfig is a free data retrieval call binding the contract method 0xc3f909d4. // -// Solidity: function getConfig() view returns((uint64,uint64,uint64,uint64,uint32,uint96,uint8)) +// Solidity: function getConfig() pure returns((uint64,uint64,uint64,uint64,uint32,uint96,uint8,bool)) func (_TaikoL1 *TaikoL1Session) GetConfig() (TaikoDataConfig, error) { return _TaikoL1.Contract.GetConfig(&_TaikoL1.CallOpts) } // GetConfig is a free data retrieval call binding the contract method 0xc3f909d4. // -// Solidity: function getConfig() view returns((uint64,uint64,uint64,uint64,uint32,uint96,uint8)) +// Solidity: function getConfig() pure returns((uint64,uint64,uint64,uint64,uint32,uint96,uint8,bool)) func (_TaikoL1 *TaikoL1CallerSession) GetConfig() (TaikoDataConfig, error) { return _TaikoL1.Contract.GetConfig(&_TaikoL1.CallOpts) } +// GetLastSyncedBlock is a free data retrieval call binding the contract method 0x9413caa9. +// +// Solidity: function getLastSyncedBlock() view returns(uint64 blockId_, bytes32 blockHash_, bytes32 stateRoot_) +func (_TaikoL1 *TaikoL1Caller) GetLastSyncedBlock(opts *bind.CallOpts) (struct { + BlockId uint64 + BlockHash [32]byte + StateRoot [32]byte +}, error) { + var out []interface{} + err := _TaikoL1.contract.Call(opts, &out, "getLastSyncedBlock") + + outstruct := new(struct { + BlockId uint64 + BlockHash [32]byte + StateRoot [32]byte + }) + if err != nil { + return *outstruct, err + } + + outstruct.BlockId = *abi.ConvertType(out[0], new(uint64)).(*uint64) + outstruct.BlockHash = *abi.ConvertType(out[1], new([32]byte)).(*[32]byte) + outstruct.StateRoot = *abi.ConvertType(out[2], new([32]byte)).(*[32]byte) + + return *outstruct, err + +} + +// GetLastSyncedBlock is a free data retrieval call binding the contract method 0x9413caa9. +// +// Solidity: function getLastSyncedBlock() view returns(uint64 blockId_, bytes32 blockHash_, bytes32 stateRoot_) +func (_TaikoL1 *TaikoL1Session) GetLastSyncedBlock() (struct { + BlockId uint64 + BlockHash [32]byte + StateRoot [32]byte +}, error) { + return _TaikoL1.Contract.GetLastSyncedBlock(&_TaikoL1.CallOpts) +} + +// GetLastSyncedBlock is a free data retrieval call binding the contract method 0x9413caa9. +// +// Solidity: function getLastSyncedBlock() view returns(uint64 blockId_, bytes32 blockHash_, bytes32 stateRoot_) +func (_TaikoL1 *TaikoL1CallerSession) GetLastSyncedBlock() (struct { + BlockId uint64 + BlockHash [32]byte + StateRoot [32]byte +}, error) { + return _TaikoL1.Contract.GetLastSyncedBlock(&_TaikoL1.CallOpts) +} + +// GetLastVerifiedBlock is a free data retrieval call binding the contract method 0x26af7986. +// +// Solidity: function getLastVerifiedBlock() view returns(uint64 blockId_, bytes32 blockHash_, bytes32 stateRoot_) +func (_TaikoL1 *TaikoL1Caller) GetLastVerifiedBlock(opts *bind.CallOpts) (struct { + BlockId uint64 + BlockHash [32]byte + StateRoot [32]byte +}, error) { + var out []interface{} + err := _TaikoL1.contract.Call(opts, &out, "getLastVerifiedBlock") + + outstruct := new(struct { + BlockId uint64 + BlockHash [32]byte + StateRoot [32]byte + }) + if err != nil { + return *outstruct, err + } + + outstruct.BlockId = *abi.ConvertType(out[0], new(uint64)).(*uint64) + outstruct.BlockHash = *abi.ConvertType(out[1], new([32]byte)).(*[32]byte) + outstruct.StateRoot = *abi.ConvertType(out[2], new([32]byte)).(*[32]byte) + + return *outstruct, err + +} + +// GetLastVerifiedBlock is a free data retrieval call binding the contract method 0x26af7986. +// +// Solidity: function getLastVerifiedBlock() view returns(uint64 blockId_, bytes32 blockHash_, bytes32 stateRoot_) +func (_TaikoL1 *TaikoL1Session) GetLastVerifiedBlock() (struct { + BlockId uint64 + BlockHash [32]byte + StateRoot [32]byte +}, error) { + return _TaikoL1.Contract.GetLastVerifiedBlock(&_TaikoL1.CallOpts) +} + +// GetLastVerifiedBlock is a free data retrieval call binding the contract method 0x26af7986. +// +// Solidity: function getLastVerifiedBlock() view returns(uint64 blockId_, bytes32 blockHash_, bytes32 stateRoot_) +func (_TaikoL1 *TaikoL1CallerSession) GetLastVerifiedBlock() (struct { + BlockId uint64 + BlockHash [32]byte + StateRoot [32]byte +}, error) { + return _TaikoL1.Contract.GetLastVerifiedBlock(&_TaikoL1.CallOpts) +} + // GetStateVariables is a free data retrieval call binding the contract method 0xdde89cf5. // // Solidity: function getStateVariables() view returns((uint64,uint64,uint64,uint64), (uint64,uint64,bool,uint8,uint16,uint32,uint64)) @@ -735,68 +836,6 @@ func (_TaikoL1 *TaikoL1CallerSession) Resolve0(_name [32]byte, _allowZeroAddress return _TaikoL1.Contract.Resolve0(&_TaikoL1.CallOpts, _name, _allowZeroAddress) } -// SlotA is a free data retrieval call binding the contract method 0xc7821568. -// -// Solidity: function slotA() view returns((uint64,uint64,uint64,uint64)) -func (_TaikoL1 *TaikoL1Caller) SlotA(opts *bind.CallOpts) (TaikoDataSlotA, error) { - var out []interface{} - err := _TaikoL1.contract.Call(opts, &out, "slotA") - - if err != nil { - return *new(TaikoDataSlotA), err - } - - out0 := *abi.ConvertType(out[0], new(TaikoDataSlotA)).(*TaikoDataSlotA) - - return out0, err - -} - -// SlotA is a free data retrieval call binding the contract method 0xc7821568. -// -// Solidity: function slotA() view returns((uint64,uint64,uint64,uint64)) -func (_TaikoL1 *TaikoL1Session) SlotA() (TaikoDataSlotA, error) { - return _TaikoL1.Contract.SlotA(&_TaikoL1.CallOpts) -} - -// SlotA is a free data retrieval call binding the contract method 0xc7821568. -// -// Solidity: function slotA() view returns((uint64,uint64,uint64,uint64)) -func (_TaikoL1 *TaikoL1CallerSession) SlotA() (TaikoDataSlotA, error) { - return _TaikoL1.Contract.SlotA(&_TaikoL1.CallOpts) -} - -// SlotB is a free data retrieval call binding the contract method 0x19e8dce2. -// -// Solidity: function slotB() view returns((uint64,uint64,bool,uint8,uint16,uint32,uint64)) -func (_TaikoL1 *TaikoL1Caller) SlotB(opts *bind.CallOpts) (TaikoDataSlotB, error) { - var out []interface{} - err := _TaikoL1.contract.Call(opts, &out, "slotB") - - if err != nil { - return *new(TaikoDataSlotB), err - } - - out0 := *abi.ConvertType(out[0], new(TaikoDataSlotB)).(*TaikoDataSlotB) - - return out0, err - -} - -// SlotB is a free data retrieval call binding the contract method 0x19e8dce2. -// -// Solidity: function slotB() view returns((uint64,uint64,bool,uint8,uint16,uint32,uint64)) -func (_TaikoL1 *TaikoL1Session) SlotB() (TaikoDataSlotB, error) { - return _TaikoL1.Contract.SlotB(&_TaikoL1.CallOpts) -} - -// SlotB is a free data retrieval call binding the contract method 0x19e8dce2. -// -// Solidity: function slotB() view returns((uint64,uint64,bool,uint8,uint16,uint32,uint64)) -func (_TaikoL1 *TaikoL1CallerSession) SlotB() (TaikoDataSlotB, error) { - return _TaikoL1.Contract.SlotB(&_TaikoL1.CallOpts) -} - // State is a free data retrieval call binding the contract method 0xc19d93fb. // // Solidity: function state() view returns(bytes32 __reserve1, (uint64,uint64,uint64,uint64) slotA, (uint64,uint64,bool,uint8,uint16,uint32,uint64) slotB) @@ -1015,27 +1054,6 @@ func (_TaikoL1 *TaikoL1TransactorSession) RenounceOwnership() (*types.Transactio return _TaikoL1.Contract.RenounceOwnership(&_TaikoL1.TransactOpts) } -// ResetGenesisHash is a paid mutator transaction binding the contract method 0xb008bedb. -// -// Solidity: function resetGenesisHash(bytes32 _genesisBlockHash) returns() -func (_TaikoL1 *TaikoL1Transactor) ResetGenesisHash(opts *bind.TransactOpts, _genesisBlockHash [32]byte) (*types.Transaction, error) { - return _TaikoL1.contract.Transact(opts, "resetGenesisHash", _genesisBlockHash) -} - -// ResetGenesisHash is a paid mutator transaction binding the contract method 0xb008bedb. -// -// Solidity: function resetGenesisHash(bytes32 _genesisBlockHash) returns() -func (_TaikoL1 *TaikoL1Session) ResetGenesisHash(_genesisBlockHash [32]byte) (*types.Transaction, error) { - return _TaikoL1.Contract.ResetGenesisHash(&_TaikoL1.TransactOpts, _genesisBlockHash) -} - -// ResetGenesisHash is a paid mutator transaction binding the contract method 0xb008bedb. -// -// Solidity: function resetGenesisHash(bytes32 _genesisBlockHash) returns() -func (_TaikoL1 *TaikoL1TransactorSession) ResetGenesisHash(_genesisBlockHash [32]byte) (*types.Transaction, error) { - return _TaikoL1.Contract.ResetGenesisHash(&_TaikoL1.TransactOpts, _genesisBlockHash) -} - // TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b. // // Solidity: function transferOwnership(address newOwner) returns() @@ -2065,6 +2083,296 @@ func (_TaikoL1 *TaikoL1Filterer) ParseBlockVerified0(log types.Log) (*TaikoL1Blo return event, nil } +// TaikoL1CalldataTxListIterator is returned from FilterCalldataTxList and is used to iterate over the raw logs and unpacked data for CalldataTxList events raised by the TaikoL1 contract. +type TaikoL1CalldataTxListIterator struct { + Event *TaikoL1CalldataTxList // 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 *TaikoL1CalldataTxListIterator) 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(TaikoL1CalldataTxList) + 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(TaikoL1CalldataTxList) + 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 *TaikoL1CalldataTxListIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *TaikoL1CalldataTxListIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// TaikoL1CalldataTxList represents a CalldataTxList event raised by the TaikoL1 contract. +type TaikoL1CalldataTxList struct { + BlockId *big.Int + TxList []byte + Raw types.Log // Blockchain specific contextual infos +} + +// FilterCalldataTxList is a free log retrieval operation binding the contract event 0xa07bc5e8f00f6065c8727821591c519efd2348e4ff0c26560a85592e85b6f418. +// +// Solidity: event CalldataTxList(uint256 indexed blockId, bytes txList) +func (_TaikoL1 *TaikoL1Filterer) FilterCalldataTxList(opts *bind.FilterOpts, blockId []*big.Int) (*TaikoL1CalldataTxListIterator, error) { + + var blockIdRule []interface{} + for _, blockIdItem := range blockId { + blockIdRule = append(blockIdRule, blockIdItem) + } + + logs, sub, err := _TaikoL1.contract.FilterLogs(opts, "CalldataTxList", blockIdRule) + if err != nil { + return nil, err + } + return &TaikoL1CalldataTxListIterator{contract: _TaikoL1.contract, event: "CalldataTxList", logs: logs, sub: sub}, nil +} + +// WatchCalldataTxList is a free log subscription operation binding the contract event 0xa07bc5e8f00f6065c8727821591c519efd2348e4ff0c26560a85592e85b6f418. +// +// Solidity: event CalldataTxList(uint256 indexed blockId, bytes txList) +func (_TaikoL1 *TaikoL1Filterer) WatchCalldataTxList(opts *bind.WatchOpts, sink chan<- *TaikoL1CalldataTxList, blockId []*big.Int) (event.Subscription, error) { + + var blockIdRule []interface{} + for _, blockIdItem := range blockId { + blockIdRule = append(blockIdRule, blockIdItem) + } + + logs, sub, err := _TaikoL1.contract.WatchLogs(opts, "CalldataTxList", blockIdRule) + 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(TaikoL1CalldataTxList) + if err := _TaikoL1.contract.UnpackLog(event, "CalldataTxList", 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 +} + +// ParseCalldataTxList is a log parse operation binding the contract event 0xa07bc5e8f00f6065c8727821591c519efd2348e4ff0c26560a85592e85b6f418. +// +// Solidity: event CalldataTxList(uint256 indexed blockId, bytes txList) +func (_TaikoL1 *TaikoL1Filterer) ParseCalldataTxList(log types.Log) (*TaikoL1CalldataTxList, error) { + event := new(TaikoL1CalldataTxList) + if err := _TaikoL1.contract.UnpackLog(event, "CalldataTxList", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// TaikoL1CalldataTxList0Iterator is returned from FilterCalldataTxList0 and is used to iterate over the raw logs and unpacked data for CalldataTxList0 events raised by the TaikoL1 contract. +type TaikoL1CalldataTxList0Iterator struct { + Event *TaikoL1CalldataTxList0 // 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 *TaikoL1CalldataTxList0Iterator) 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(TaikoL1CalldataTxList0) + 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(TaikoL1CalldataTxList0) + 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 *TaikoL1CalldataTxList0Iterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *TaikoL1CalldataTxList0Iterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// TaikoL1CalldataTxList0 represents a CalldataTxList0 event raised by the TaikoL1 contract. +type TaikoL1CalldataTxList0 struct { + BlockId *big.Int + TxList []byte + Raw types.Log // Blockchain specific contextual infos +} + +// FilterCalldataTxList0 is a free log retrieval operation binding the contract event 0xa07bc5e8f00f6065c8727821591c519efd2348e4ff0c26560a85592e85b6f418. +// +// Solidity: event CalldataTxList(uint256 indexed blockId, bytes txList) +func (_TaikoL1 *TaikoL1Filterer) FilterCalldataTxList0(opts *bind.FilterOpts, blockId []*big.Int) (*TaikoL1CalldataTxList0Iterator, error) { + + var blockIdRule []interface{} + for _, blockIdItem := range blockId { + blockIdRule = append(blockIdRule, blockIdItem) + } + + logs, sub, err := _TaikoL1.contract.FilterLogs(opts, "CalldataTxList0", blockIdRule) + if err != nil { + return nil, err + } + return &TaikoL1CalldataTxList0Iterator{contract: _TaikoL1.contract, event: "CalldataTxList0", logs: logs, sub: sub}, nil +} + +// WatchCalldataTxList0 is a free log subscription operation binding the contract event 0xa07bc5e8f00f6065c8727821591c519efd2348e4ff0c26560a85592e85b6f418. +// +// Solidity: event CalldataTxList(uint256 indexed blockId, bytes txList) +func (_TaikoL1 *TaikoL1Filterer) WatchCalldataTxList0(opts *bind.WatchOpts, sink chan<- *TaikoL1CalldataTxList0, blockId []*big.Int) (event.Subscription, error) { + + var blockIdRule []interface{} + for _, blockIdItem := range blockId { + blockIdRule = append(blockIdRule, blockIdItem) + } + + logs, sub, err := _TaikoL1.contract.WatchLogs(opts, "CalldataTxList0", blockIdRule) + 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(TaikoL1CalldataTxList0) + if err := _TaikoL1.contract.UnpackLog(event, "CalldataTxList0", 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 +} + +// ParseCalldataTxList0 is a log parse operation binding the contract event 0xa07bc5e8f00f6065c8727821591c519efd2348e4ff0c26560a85592e85b6f418. +// +// Solidity: event CalldataTxList(uint256 indexed blockId, bytes txList) +func (_TaikoL1 *TaikoL1Filterer) ParseCalldataTxList0(log types.Log) (*TaikoL1CalldataTxList0, error) { + event := new(TaikoL1CalldataTxList0) + if err := _TaikoL1.contract.UnpackLog(event, "CalldataTxList0", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + // TaikoL1InitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the TaikoL1 contract. type TaikoL1InitializedIterator struct { Event *TaikoL1Initialized // Event containing the contract specifics and raw log @@ -3041,140 +3349,6 @@ func (_TaikoL1 *TaikoL1Filterer) ParseStateVariablesUpdated(log types.Log) (*Tai return event, nil } -// TaikoL1StateVariablesUpdated0Iterator is returned from FilterStateVariablesUpdated0 and is used to iterate over the raw logs and unpacked data for StateVariablesUpdated0 events raised by the TaikoL1 contract. -type TaikoL1StateVariablesUpdated0Iterator struct { - Event *TaikoL1StateVariablesUpdated0 // 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 *TaikoL1StateVariablesUpdated0Iterator) 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(TaikoL1StateVariablesUpdated0) - 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(TaikoL1StateVariablesUpdated0) - 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 *TaikoL1StateVariablesUpdated0Iterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *TaikoL1StateVariablesUpdated0Iterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// TaikoL1StateVariablesUpdated0 represents a StateVariablesUpdated0 event raised by the TaikoL1 contract. -type TaikoL1StateVariablesUpdated0 struct { - SlotB TaikoDataSlotB - Raw types.Log // Blockchain specific contextual infos -} - -// FilterStateVariablesUpdated0 is a free log retrieval operation binding the contract event 0xdf66aee38ea9fe523cfd238705d455a354305a646748dbb931898b51cee4727b. -// -// Solidity: event StateVariablesUpdated((uint64,uint64,bool,uint8,uint16,uint32,uint64) slotB) -func (_TaikoL1 *TaikoL1Filterer) FilterStateVariablesUpdated0(opts *bind.FilterOpts) (*TaikoL1StateVariablesUpdated0Iterator, error) { - - logs, sub, err := _TaikoL1.contract.FilterLogs(opts, "StateVariablesUpdated0") - if err != nil { - return nil, err - } - return &TaikoL1StateVariablesUpdated0Iterator{contract: _TaikoL1.contract, event: "StateVariablesUpdated0", logs: logs, sub: sub}, nil -} - -// WatchStateVariablesUpdated0 is a free log subscription operation binding the contract event 0xdf66aee38ea9fe523cfd238705d455a354305a646748dbb931898b51cee4727b. -// -// Solidity: event StateVariablesUpdated((uint64,uint64,bool,uint8,uint16,uint32,uint64) slotB) -func (_TaikoL1 *TaikoL1Filterer) WatchStateVariablesUpdated0(opts *bind.WatchOpts, sink chan<- *TaikoL1StateVariablesUpdated0) (event.Subscription, error) { - - logs, sub, err := _TaikoL1.contract.WatchLogs(opts, "StateVariablesUpdated0") - 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(TaikoL1StateVariablesUpdated0) - if err := _TaikoL1.contract.UnpackLog(event, "StateVariablesUpdated0", 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 -} - -// ParseStateVariablesUpdated0 is a log parse operation binding the contract event 0xdf66aee38ea9fe523cfd238705d455a354305a646748dbb931898b51cee4727b. -// -// Solidity: event StateVariablesUpdated((uint64,uint64,bool,uint8,uint16,uint32,uint64) slotB) -func (_TaikoL1 *TaikoL1Filterer) ParseStateVariablesUpdated0(log types.Log) (*TaikoL1StateVariablesUpdated0, error) { - event := new(TaikoL1StateVariablesUpdated0) - if err := _TaikoL1.contract.UnpackLog(event, "StateVariablesUpdated0", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - // TaikoL1TransitionContestedIterator is returned from FilterTransitionContested and is used to iterate over the raw logs and unpacked data for TransitionContested events raised by the TaikoL1 contract. type TaikoL1TransitionContestedIterator struct { Event *TaikoL1TransitionContested // Event containing the contract specifics and raw log diff --git a/packages/relayer/bridge/bridge.go b/packages/relayer/bridge/bridge.go index bcfc22e603d..7c60ace3337 100644 --- a/packages/relayer/bridge/bridge.go +++ b/packages/relayer/bridge/bridge.go @@ -45,15 +45,13 @@ type Bridge struct { srcBridge relayer.Bridge destBridge relayer.Bridge - mu *sync.Mutex - addr common.Address backOffRetryInterval time.Duration backOffMaxRetries uint64 ethClientTimeout time.Duration - wg *sync.WaitGroup + wg sync.WaitGroup srcChainId *big.Int destChainId *big.Int @@ -121,9 +119,6 @@ func InitFromConfig(ctx context.Context, b *Bridge, cfg *Config) error { b.srcChainId = srcChainID b.destChainId = destChainID - b.wg = &sync.WaitGroup{} - b.mu = &sync.Mutex{} - b.backOffRetryInterval = time.Duration(cfg.BackoffRetryInterval) * time.Second b.backOffMaxRetries = cfg.BackOffMaxRetrys b.ethClientTimeout = time.Duration(cfg.ETHClientTimeout) * time.Second diff --git a/packages/relayer/cmd/flags/common.go b/packages/relayer/cmd/flags/common.go index c56cbdd31da..30eb6d87beb 100644 --- a/packages/relayer/cmd/flags/common.go +++ b/packages/relayer/cmd/flags/common.go @@ -105,12 +105,14 @@ var ( Usage: "Retry interval in seconds when there is an error", Category: processorCategory, Value: 12, + EnvVars: []string{"BACKOFF_RETRY_INTERVAL"}, } BackOffMaxRetrys = &cli.Uint64Flag{ Name: "backoff.maxRetrys", Usage: "Max retry times when there is an error", Category: processorCategory, - Value: 3, + Value: 5, + EnvVars: []string{"BACKOFF_MAX_RETRYS"}, } ) diff --git a/packages/relayer/cmd/flags/indexer.go b/packages/relayer/cmd/flags/indexer.go index 45eb322c047..4ca08198afe 100644 --- a/packages/relayer/cmd/flags/indexer.go +++ b/packages/relayer/cmd/flags/indexer.go @@ -1,6 +1,8 @@ package flags import ( + "time" + "github.com/urfave/cli/v2" ) @@ -69,12 +71,23 @@ var ( Category: indexerCategory, EnvVars: []string{"SRC_TAIKO_ADDRESS"}, } - NumLatestBlocksToIgnoreWhenCrawling = &cli.Uint64Flag{ - Name: "numLatestBlocksToIgnoreWhenCrawling", - Usage: "Number of blocks to ignore when crawling chain, should be higher for L2-L1 indexing due to delay", - Value: 1000, + NumLatestBlocksEndWhenCrawling = &cli.Uint64Flag{ + Name: "numLatestBlocksEndWhenCrawling", + Usage: `Number of blocks to ignore from the end when crawling chain, + should be higher for L2-L1 indexing due to delay + `, + Value: 300, + Category: indexerCategory, + EnvVars: []string{"NUM_LATEST_BLOCKS_END_WHEN_CRAWLING"}, + } + NumLatestBlocksStartWhenCrawling = &cli.Uint64Flag{ + Name: "numLatestBlocksStartWhenCrawling", + Usage: `Number of latest blocks to index from the start when crawling chain. + The default value is to cover past 7 days. + `, + Value: 50400, Category: indexerCategory, - EnvVars: []string{"NUM_LATEST_BLOCKS_TO_IGNORE_WHEN_CRAWLING"}, + EnvVars: []string{"NUM_LATEST_BLOCKS_START_WHEN_CRAWLING"}, } EventName = &cli.StringFlag{ Name: "event", @@ -89,6 +102,27 @@ var ( Category: indexerCategory, EnvVars: []string{"TARGET_BLOCK_NUMBER"}, } + MinFeeToIndex = &cli.Uint64Flag{ + Name: "minFeeToIndex", + Usage: "Minimum fee to index and add to the queue (will still be saved to database)", + Category: indexerCategory, + Value: 0, + EnvVars: []string{"MIN_FEE_TO_INDEX"}, + } + WaitForConfirmationTimeout = &cli.DurationFlag{ + Name: "waitForConfirmationTimeout", + Usage: "Timeout waiting for confirmations", + Value: 5 * time.Minute, + Category: indexerCategory, + EnvVars: []string{"WAIT_FOR_CONFIRMATION_TIMEOUT"}, + } + IndexingConfirmations = &cli.Uint64Flag{ + Name: "confirmations", + Usage: "Confirmations to wait for on source chain before indexing an event", + Value: 1, + Category: indexerCategory, + EnvVars: []string{"CONFIRMATIONS_BEFORE_INDEXING"}, + } ) var IndexerFlags = MergeFlags(CommonFlags, QueueFlags, []cli.Flag{ @@ -101,7 +135,11 @@ var IndexerFlags = MergeFlags(CommonFlags, QueueFlags, []cli.Flag{ SubscriptionBackoff, SyncMode, WatchMode, - NumLatestBlocksToIgnoreWhenCrawling, + NumLatestBlocksEndWhenCrawling, + NumLatestBlocksStartWhenCrawling, EventName, + MinFeeToIndex, TargetBlockNumber, + WaitForConfirmationTimeout, + IndexingConfirmations, }) diff --git a/packages/relayer/cmd/flags/processor.go b/packages/relayer/cmd/flags/processor.go index 17bc5e5d7c7..2005681a068 100644 --- a/packages/relayer/cmd/flags/processor.go +++ b/packages/relayer/cmd/flags/processor.go @@ -143,6 +143,13 @@ var ( Required: false, EnvVars: []string{"DEST_QUOTA_MANAGER_ADDRESS"}, } + MinFeeToProcess = &cli.Uint64Flag{ + Name: "minFeeToProcess", + Usage: "Minimum fee to process", + Category: processorCategory, + Value: 0, + EnvVars: []string{"MIN_FEE_TO_PROCESS"}, + } ) var ProcessorFlags = MergeFlags(CommonFlags, QueueFlags, TxmgrFlags, []cli.Flag{ @@ -166,5 +173,6 @@ var ProcessorFlags = MergeFlags(CommonFlags, QueueFlags, TxmgrFlags, []cli.Flag{ CacheOption, UnprofitableMessageQueueExpiration, MaxMessageRetries, + MinFeeToProcess, DestQuotaManagerAddress, }) diff --git a/packages/relayer/db.go b/packages/relayer/db.go deleted file mode 100644 index 02798e0e236..00000000000 --- a/packages/relayer/db.go +++ /dev/null @@ -1,28 +0,0 @@ -package relayer - -import ( - "database/sql" - - "github.com/cyberhorsey/errors" - "gorm.io/gorm" -) - -var ( - ErrNoDB = errors.Validation.NewWithKeyAndDetail("ERR_NO_DB", "DB is required") -) - -type DBConnectionOpts struct { - Name string - Password string - Host string - Database string - MaxIdleConns uint64 - MaxOpenConns uint64 - MaxConnLifetime uint64 - OpenFunc func(dsn string) (DB, error) -} - -type DB interface { - DB() (*sql.DB, error) - GormDB() *gorm.DB -} diff --git a/packages/relayer/docs/docs.go b/packages/relayer/docs/docs.go index 622106df9d1..dde35e98426 100644 --- a/packages/relayer/docs/docs.go +++ b/packages/relayer/docs/docs.go @@ -17,7 +17,7 @@ const docTemplate = `{ }, "license": { "name": "MIT", - "url": "https://github.com/taikoxyz/taiko-mono/blob/main/LICENSE.md" + "url": "https://github.com/taikoxyz/taiko-mono/blob/main/LICENSE" }, "version": "{{.Version}}" }, diff --git a/packages/relayer/docs/swagger.json b/packages/relayer/docs/swagger.json index 028b3a5e083..42ff334167b 100644 --- a/packages/relayer/docs/swagger.json +++ b/packages/relayer/docs/swagger.json @@ -10,7 +10,7 @@ }, "license": { "name": "MIT", - "url": "https://github.com/taikoxyz/taiko-mono/blob/main/LICENSE.md" + "url": "https://github.com/taikoxyz/taiko-mono/blob/main/LICENSE" }, "version": "1.0" }, diff --git a/packages/relayer/docs/swagger.yaml b/packages/relayer/docs/swagger.yaml index 8e35602519f..1760c3aab6f 100644 --- a/packages/relayer/docs/swagger.yaml +++ b/packages/relayer/docs/swagger.yaml @@ -47,7 +47,7 @@ info: url: https://community.taiko.xyz/ license: name: MIT - url: https://github.com/taikoxyz/taiko-mono/blob/main/LICENSE.md + url: https://github.com/taikoxyz/taiko-mono/blob/main/LICENSE termsOfService: http://swagger.io/terms/ title: Taiko Bridge Relayer API version: "1.0" diff --git a/packages/relayer/event.go b/packages/relayer/event.go index c9c0092d98d..2389c40de91 100644 --- a/packages/relayer/event.go +++ b/packages/relayer/event.go @@ -4,6 +4,7 @@ import ( "context" "math/big" "net/http" + "time" "github.com/ethereum/go-ethereum/common" "github.com/morkid/paginate" @@ -51,27 +52,36 @@ func (e EventType) String() string { // into the Data field to be unmarshalled into a concrete struct // dependant on the name of the event type Event struct { - ID int `json:"id"` - Name string `json:"name"` - Data datatypes.JSON `json:"data"` - Status EventStatus `json:"status"` - EventType EventType `json:"eventType"` - ChainID int64 `json:"chainID"` - DestChainID int64 `json:"destChainID"` - SyncedChainID uint64 `json:"syncedChainID"` - EmittedBlockID uint64 `json:"emittedBlockID"` - BlockID uint64 `json:"blockID"` - SyncedInBlockID uint64 `json:"syncedInBlockID"` - SyncData string `json:"syncData"` - Kind string `json:"kind"` - CanonicalTokenAddress string `json:"canonicalTokenAddress"` - CanonicalTokenSymbol string `json:"canonicalTokenSymbol"` - CanonicalTokenName string `json:"canonicalTokenName"` - CanonicalTokenDecimals uint8 `json:"canonicalTokenDecimals"` - Amount string `json:"amount"` - MsgHash string `json:"msgHash"` - MessageOwner string `json:"messageOwner"` - Event string `json:"event"` + ID int `json:"id"` + Name string `json:"name"` + Data datatypes.JSON `json:"data"` + Status EventStatus `json:"status"` + EventType EventType `json:"eventType"` + ChainID int64 `json:"chainID"` + DestChainID int64 `json:"destChainID"` + SyncedChainID uint64 `json:"syncedChainID"` + EmittedBlockID uint64 `json:"emittedBlockID"` + BlockID uint64 `json:"blockID"` + SyncedInBlockID uint64 `json:"syncedInBlockID"` + SyncData string `json:"syncData"` + Kind string `json:"kind"` + CanonicalTokenAddress string `json:"canonicalTokenAddress"` + CanonicalTokenSymbol string `json:"canonicalTokenSymbol"` + CanonicalTokenName string `json:"canonicalTokenName"` + CanonicalTokenDecimals uint8 `json:"canonicalTokenDecimals"` + Amount string `json:"amount"` + MsgHash string `json:"msgHash"` + MessageOwner string `json:"messageOwner"` + Event string `json:"event"` + ClaimedBy string `json:"claimedBy" gorm:"-"` + ProcessedTxHash string `json:"processedTxHash" gorm:"-"` + Fee *uint64 `json:"fee"` + DestChainBaseFee *uint64 `json:"destChainBaseFee"` + GasTipCap *uint64 `json:"gasTipCap"` + GasLimit *uint64 `json:"gasLimit"` + IsProfitable *bool `json:"isProfitable"` + EstimatedOnchainFee *uint64 `json:"estimatedOnchainFee"` + IsProfitableEvaluatedAt *time.Time `json:"isProfitableEvaluatedAt"` } // SaveEventOpts @@ -98,6 +108,16 @@ type SaveEventOpts struct { SyncedInBlockID uint64 } +type UpdateFeesAndProfitabilityOpts struct { + Fee uint64 + DestChainBaseFee uint64 + GasTipCap uint64 + GasLimit uint64 + IsProfitable bool + EstimatedOnchainFee uint64 + IsProfitableEvaluatedAt time.Time +} + type FindAllByAddressOpts struct { Address common.Address EventType *EventType @@ -108,13 +128,15 @@ type FindAllByAddressOpts struct { // EventRepository is used to interact with events in the store type EventRepository interface { - Save(ctx context.Context, opts SaveEventOpts) (*Event, error) + Close() error + Save(ctx context.Context, opts *SaveEventOpts) (*Event, error) UpdateStatus(ctx context.Context, id int, status EventStatus) error + UpdateFeesAndProfitability(ctx context.Context, id int, opts *UpdateFeesAndProfitabilityOpts) error FindAllByAddress( ctx context.Context, req *http.Request, opts FindAllByAddressOpts, - ) (paginate.Page, error) + ) (*paginate.Page, error) FirstByMsgHash( ctx context.Context, msgHash string, @@ -138,6 +160,7 @@ type EventRepository interface { ) (uint64, error) DeleteAllAfterBlockID(blockID uint64, srcChainID uint64, destChainID uint64) error FindLatestBlockID( + ctx context.Context, event string, srcChainID uint64, destChainID uint64, diff --git a/packages/relayer/indexer/config.go b/packages/relayer/indexer/config.go index 39172cea167..9e313af5641 100644 --- a/packages/relayer/indexer/config.go +++ b/packages/relayer/indexer/config.go @@ -36,53 +36,61 @@ type Config struct { QueueHost string QueuePort uint64 // rpc configs - SrcRPCUrl string - DestRPCUrl string - ETHClientTimeout uint64 - BlockBatchSize uint64 - NumGoroutines uint64 - SubscriptionBackoff uint64 - SyncMode SyncMode - WatchMode WatchMode - NumLatestBlocksToIgnoreWhenCrawling uint64 - EventName string - TargetBlockNumber *uint64 - BackOffRetryInterval time.Duration - BackOffMaxRetries uint64 - OpenQueueFunc func() (queue.Queue, error) - OpenDBFunc func() (DB, error) + SrcRPCUrl string + DestRPCUrl string + ETHClientTimeout uint64 + BlockBatchSize uint64 + NumGoroutines uint64 + SubscriptionBackoff uint64 + SyncMode SyncMode + WatchMode WatchMode + NumLatestBlocksEndWhenCrawling uint64 + NumLatestBlocksStartWhenCrawling uint64 + EventName string + TargetBlockNumber *uint64 + BackOffRetryInterval time.Duration + BackOffMaxRetries uint64 + MinFeeToIndex uint64 + OpenQueueFunc func() (queue.Queue, error) + OpenDBFunc func() (db.DB, error) + ConfirmationTimeout time.Duration + Confirmations uint64 } // NewConfigFromCliContext creates a new config instance from command line flags. func NewConfigFromCliContext(c *cli.Context) (*Config, error) { return &Config{ - SrcBridgeAddress: common.HexToAddress(c.String(flags.SrcBridgeAddress.Name)), - SrcTaikoAddress: common.HexToAddress(c.String(flags.SrcTaikoAddress.Name)), - SrcSignalServiceAddress: common.HexToAddress(c.String(flags.SrcSignalServiceAddress.Name)), - DestBridgeAddress: common.HexToAddress(c.String(flags.DestBridgeAddress.Name)), - DatabaseUsername: c.String(flags.DatabaseUsername.Name), - DatabasePassword: c.String(flags.DatabasePassword.Name), - DatabaseName: c.String(flags.DatabaseName.Name), - DatabaseHost: c.String(flags.DatabaseHost.Name), - DatabaseMaxIdleConns: c.Uint64(flags.DatabaseMaxIdleConns.Name), - DatabaseMaxOpenConns: c.Uint64(flags.DatabaseMaxOpenConns.Name), - DatabaseMaxConnLifetime: c.Uint64(flags.DatabaseConnMaxLifetime.Name), - QueueUsername: c.String(flags.QueueUsername.Name), - QueuePassword: c.String(flags.QueuePassword.Name), - QueuePort: c.Uint64(flags.QueuePort.Name), - QueueHost: c.String(flags.QueueHost.Name), - SrcRPCUrl: c.String(flags.SrcRPCUrl.Name), - DestRPCUrl: c.String(flags.DestRPCUrl.Name), - BlockBatchSize: c.Uint64(flags.BlockBatchSize.Name), - NumGoroutines: c.Uint64(flags.MaxNumGoroutines.Name), - SubscriptionBackoff: c.Uint64(flags.SubscriptionBackoff.Name), - WatchMode: WatchMode(c.String(flags.WatchMode.Name)), - SyncMode: SyncMode(c.String(flags.SyncMode.Name)), - ETHClientTimeout: c.Uint64(flags.ETHClientTimeout.Name), - NumLatestBlocksToIgnoreWhenCrawling: c.Uint64(flags.NumLatestBlocksToIgnoreWhenCrawling.Name), - EventName: c.String(flags.EventName.Name), - BackOffMaxRetries: c.Uint64(flags.BackOffMaxRetrys.Name), - BackOffRetryInterval: c.Duration(flags.BackOffRetryInterval.Name), + SrcBridgeAddress: common.HexToAddress(c.String(flags.SrcBridgeAddress.Name)), + SrcTaikoAddress: common.HexToAddress(c.String(flags.SrcTaikoAddress.Name)), + SrcSignalServiceAddress: common.HexToAddress(c.String(flags.SrcSignalServiceAddress.Name)), + DestBridgeAddress: common.HexToAddress(c.String(flags.DestBridgeAddress.Name)), + DatabaseUsername: c.String(flags.DatabaseUsername.Name), + DatabasePassword: c.String(flags.DatabasePassword.Name), + DatabaseName: c.String(flags.DatabaseName.Name), + DatabaseHost: c.String(flags.DatabaseHost.Name), + DatabaseMaxIdleConns: c.Uint64(flags.DatabaseMaxIdleConns.Name), + DatabaseMaxOpenConns: c.Uint64(flags.DatabaseMaxOpenConns.Name), + DatabaseMaxConnLifetime: c.Uint64(flags.DatabaseConnMaxLifetime.Name), + QueueUsername: c.String(flags.QueueUsername.Name), + QueuePassword: c.String(flags.QueuePassword.Name), + QueuePort: c.Uint64(flags.QueuePort.Name), + QueueHost: c.String(flags.QueueHost.Name), + SrcRPCUrl: c.String(flags.SrcRPCUrl.Name), + DestRPCUrl: c.String(flags.DestRPCUrl.Name), + BlockBatchSize: c.Uint64(flags.BlockBatchSize.Name), + NumGoroutines: c.Uint64(flags.MaxNumGoroutines.Name), + SubscriptionBackoff: c.Uint64(flags.SubscriptionBackoff.Name), + WatchMode: WatchMode(c.String(flags.WatchMode.Name)), + SyncMode: SyncMode(c.String(flags.SyncMode.Name)), + ETHClientTimeout: c.Uint64(flags.ETHClientTimeout.Name), + NumLatestBlocksEndWhenCrawling: c.Uint64(flags.NumLatestBlocksEndWhenCrawling.Name), + NumLatestBlocksStartWhenCrawling: c.Uint64(flags.NumLatestBlocksStartWhenCrawling.Name), + EventName: c.String(flags.EventName.Name), + BackOffMaxRetries: c.Uint64(flags.BackOffMaxRetrys.Name), + BackOffRetryInterval: c.Duration(flags.BackOffRetryInterval.Name), + MinFeeToIndex: c.Uint64(flags.MinFeeToIndex.Name), + ConfirmationTimeout: c.Duration(flags.WaitForConfirmationTimeout.Name), + Confirmations: c.Uint64(flags.IndexingConfirmations.Name), TargetBlockNumber: func() *uint64 { if c.IsSet(flags.TargetBlockNumber.Name) { value := c.Uint64(flags.TargetBlockNumber.Name) @@ -90,7 +98,7 @@ func NewConfigFromCliContext(c *cli.Context) (*Config, error) { } return nil }(), - OpenDBFunc: func() (DB, error) { + OpenDBFunc: func() (db.DB, error) { return db.OpenDBConnection(db.DBConnectionOpts{ Name: c.String(flags.DatabaseUsername.Name), Password: c.String(flags.DatabasePassword.Name), @@ -99,7 +107,7 @@ func NewConfigFromCliContext(c *cli.Context) (*Config, error) { MaxIdleConns: c.Uint64(flags.DatabaseMaxIdleConns.Name), MaxOpenConns: c.Uint64(flags.DatabaseMaxOpenConns.Name), MaxConnLifetime: c.Uint64(flags.DatabaseConnMaxLifetime.Name), - OpenFunc: func(dsn string) (*db.DB, error) { + OpenFunc: func(dsn string) (db.DB, error) { gormDB, err := gorm.Open(mysql.Open(dsn), &gorm.Config{ Logger: logger.Default.LogMode(logger.Silent), }) diff --git a/packages/relayer/indexer/config_test.go b/packages/relayer/indexer/config_test.go index cb10cd313a4..fab17163b88 100644 --- a/packages/relayer/indexer/config_test.go +++ b/packages/relayer/indexer/config_test.go @@ -5,11 +5,13 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/stretchr/testify/assert" + "github.com/urfave/cli/v2" + "github.com/taikoxyz/taiko-mono/packages/relayer" "github.com/taikoxyz/taiko-mono/packages/relayer/cmd/flags" + "github.com/taikoxyz/taiko-mono/packages/relayer/pkg/db" "github.com/taikoxyz/taiko-mono/packages/relayer/pkg/mock" "github.com/taikoxyz/taiko-mono/packages/relayer/pkg/queue" - "github.com/urfave/cli/v2" ) var ( @@ -69,7 +71,7 @@ func TestNewConfigFromCliContext(t *testing.T) { assert.Equal(t, WatchMode(watchMode), c.WatchMode) assert.Equal(t, eventName, c.EventName) - c.OpenDBFunc = func() (DB, error) { + c.OpenDBFunc = func() (db.DB, error) { return &mock.DB{}, nil } diff --git a/packages/relayer/indexer/handle_chain_data_synced_event.go b/packages/relayer/indexer/handle_chain_data_synced_event.go index ecd307cff0c..23b1b6d7c11 100644 --- a/packages/relayer/indexer/handle_chain_data_synced_event.go +++ b/packages/relayer/indexer/handle_chain_data_synced_event.go @@ -3,7 +3,6 @@ package indexer import ( "context" "encoding/json" - "math/big" "log/slog" @@ -16,7 +15,6 @@ import ( // handleChainDataSyncedEvent handles an individual ChainDataSynced event func (i *Indexer) handleChainDataSyncedEvent( ctx context.Context, - chainID *big.Int, event *signalservice.SignalServiceChainDataSynced, waitForConfirmations bool, ) error { @@ -34,7 +32,7 @@ func (i *Indexer) handleChainDataSyncedEvent( // we need to wait for confirmations to confirm this event is not being reverted, // removed, or reorged now. - confCtx, confCtxCancel := context.WithTimeout(ctx, defaultCtxTimeout) + confCtx, confCtxCancel := context.WithTimeout(ctx, i.cfg.ConfirmationTimeout) defer confCtxCancel() @@ -42,7 +40,7 @@ func (i *Indexer) handleChainDataSyncedEvent( if err := relayer.WaitConfirmations( confCtx, i.srcEthClient, - uint64(defaultConfirmations), + i.confirmations, event.Raw.TxHash, ); err != nil { return err @@ -54,7 +52,7 @@ func (i *Indexer) handleChainDataSyncedEvent( return errors.Wrap(err, "json.Marshal(event)") } - opts := relayer.SaveEventOpts{ + _, err = i.eventRepo.Save(ctx, &relayer.SaveEventOpts{ Name: relayer.EventNameChainDataSynced, Event: relayer.EventNameChainDataSynced, Data: string(marshaled), @@ -67,14 +65,16 @@ func (i *Indexer) handleChainDataSyncedEvent( SyncData: common.BytesToHash(event.Data[:]).Hex(), Kind: common.BytesToHash(event.Kind[:]).Hex(), SyncedInBlockID: event.Raw.BlockNumber, - } - - _, err = i.eventRepo.Save(ctx, opts) + }) if err != nil { return errors.Wrap(err, "i.eventRepo.Save") } - slog.Info("chainDataSynced event saved") + slog.Info("chainDataSynced event saved", + "srcChainId", i.srcChainId, + "destChainId", i.destChainId, + "SyncedChainID", event.ChainId, + ) relayer.ChainDataSyncedEventsIndexed.Inc() diff --git a/packages/relayer/indexer/handle_message_processed_event.go b/packages/relayer/indexer/handle_message_processed_event.go index dd232374dcb..aab50ac4ebd 100644 --- a/packages/relayer/indexer/handle_message_processed_event.go +++ b/packages/relayer/indexer/handle_message_processed_event.go @@ -45,14 +45,14 @@ func (i *Indexer) handleMessageProcessedEvent( if waitForConfirmations { // we need to wait for confirmations to confirm this event is not being reverted, // removed, or reorged now. - confCtx, confCtxCancel := context.WithTimeout(ctx, defaultCtxTimeout) + confCtx, confCtxCancel := context.WithTimeout(ctx, i.cfg.ConfirmationTimeout) defer confCtxCancel() if err := relayer.WaitConfirmations( confCtx, i.srcEthClient, - uint64(defaultConfirmations), + i.confirmations, event.Raw.TxHash, ); err != nil { return err diff --git a/packages/relayer/indexer/handle_message_sent_event.go b/packages/relayer/indexer/handle_message_sent_event.go index d7d541baf88..e176e144b70 100644 --- a/packages/relayer/indexer/handle_message_sent_event.go +++ b/packages/relayer/indexer/handle_message_sent_event.go @@ -4,7 +4,6 @@ import ( "context" "encoding/json" "math/big" - "time" "log/slog" @@ -16,11 +15,6 @@ import ( "github.com/taikoxyz/taiko-mono/packages/relayer/pkg/queue" ) -var ( - defaultCtxTimeout = 3 * time.Minute - defaultConfirmations = 5 -) - // handleMessageSentEvent handles an individual MessageSent event func (i *Indexer) handleMessageSentEvent( ctx context.Context, @@ -56,14 +50,14 @@ func (i *Indexer) handleMessageSentEvent( if waitForConfirmations { // we need to wait for confirmations to confirm this event is not being reverted, // removed, or reorged now. - confCtx, confCtxCancel := context.WithTimeout(ctx, defaultCtxTimeout) + confCtx, confCtxCancel := context.WithTimeout(ctx, i.cfg.ConfirmationTimeout) defer confCtxCancel() if err := relayer.WaitConfirmations( confCtx, i.srcEthClient, - uint64(defaultConfirmations), + i.confirmations, event.Raw.TxHash, ); err != nil { return err @@ -101,6 +95,20 @@ func (i *Indexer) handleMessageSentEvent( return nil } + // we shouldnt add messages to the queue that will be determined + // unprocessable. + if event.Message.GasLimit == 0 { + slog.Warn("Zero gaslimit message found, will be unprocessable") + return nil + } + + if i.minFeeToIndex != 0 && event.Message.Fee < i.minFeeToIndex { + slog.Warn("Fee is less than minFeeToIndex, not adding to queue", + "fee", event.Message.Fee, + "minFeeToIndex", i.minFeeToIndex, + ) + } + msg := queue.QueueMessageSentBody{ ID: id, Event: event, diff --git a/packages/relayer/indexer/handle_message_status_changed_event.go b/packages/relayer/indexer/handle_message_status_changed_event.go index 4cf9ebffc04..df449e3a4f9 100644 --- a/packages/relayer/indexer/handle_message_status_changed_event.go +++ b/packages/relayer/indexer/handle_message_status_changed_event.go @@ -33,7 +33,7 @@ func (i *Indexer) handleMessageStatusChangedEvent( return nil } - _, err = i.eventRepo.Save(ctx, relayer.SaveEventOpts{ + _, err = i.eventRepo.Save(ctx, &relayer.SaveEventOpts{ Name: relayer.EventNameMessageStatusChanged, Data: string(marshaled), ChainID: chainID, diff --git a/packages/relayer/indexer/indexer.go b/packages/relayer/indexer/indexer.go index dfc0f36e89d..fd5cc8b2557 100644 --- a/packages/relayer/indexer/indexer.go +++ b/packages/relayer/indexer/indexer.go @@ -2,7 +2,6 @@ package indexer import ( "context" - "database/sql" "fmt" "log/slog" "math/big" @@ -17,6 +16,9 @@ import ( "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/ethclient" + "github.com/urfave/cli/v2" + "golang.org/x/sync/errgroup" + "github.com/taikoxyz/taiko-mono/packages/relayer" "github.com/taikoxyz/taiko-mono/packages/relayer/bindings/bridge" "github.com/taikoxyz/taiko-mono/packages/relayer/bindings/signalservice" @@ -24,9 +26,6 @@ import ( "github.com/taikoxyz/taiko-mono/packages/relayer/pkg/queue" "github.com/taikoxyz/taiko-mono/packages/relayer/pkg/repo" "github.com/taikoxyz/taiko-mono/packages/relayer/pkg/utils" - "github.com/urfave/cli/v2" - "golang.org/x/sync/errgroup" - "gorm.io/gorm" ) var ( @@ -74,12 +73,6 @@ type ethClient interface { TransactionByHash(ctx context.Context, txHash common.Hash) (*types.Transaction, bool, error) } -// DB is a local interface that lets us narrow down a database type for testing. -type DB interface { - DB() (*sql.DB, error) - GormDB() *gorm.DB -} - // Indexer is the main struct of this package, containing all dependencies necessary for indexing // relayer-related chain data. All database repositories, contract implementations, // and configurations will be injected here. @@ -114,19 +107,22 @@ type Indexer struct { ethClientTimeout time.Duration - wg *sync.WaitGroup + wg sync.WaitGroup - numLatestBlocksToIgnoreWhenCrawling uint64 + numLatestBlocksEndWhenCrawling uint64 + numLatestBlocksStartWhenCrawling uint64 targetBlockNumber *uint64 ctx context.Context - mu *sync.Mutex - eventName string + minFeeToIndex uint64 + cfg *Config + + confirmations uint64 } // InitFromCli inits a new Indexer from command line or environment variables. @@ -229,22 +225,25 @@ func InitFromConfig(ctx context.Context, i *Indexer, cfg *Config) (err error) { i.syncMode = cfg.SyncMode i.watchMode = cfg.WatchMode - i.wg = &sync.WaitGroup{} - i.ethClientTimeout = time.Duration(cfg.ETHClientTimeout) * time.Second - i.numLatestBlocksToIgnoreWhenCrawling = cfg.NumLatestBlocksToIgnoreWhenCrawling + i.numLatestBlocksEndWhenCrawling = cfg.NumLatestBlocksEndWhenCrawling + i.numLatestBlocksStartWhenCrawling = cfg.NumLatestBlocksStartWhenCrawling i.targetBlockNumber = cfg.TargetBlockNumber - i.mu = &sync.Mutex{} - i.eventName = cfg.EventName i.cfg = cfg + i.confirmations = cfg.Confirmations + i.ctx = ctx + i.minFeeToIndex = i.cfg.MinFeeToIndex + + slog.Info("minFeeToIndex", "minFeeToIndex", i.minFeeToIndex) + return nil } @@ -257,6 +256,11 @@ func (i *Indexer) Name() string { // context is stopped externally by cmd/main.go shutdown. func (i *Indexer) Close(ctx context.Context) { i.wg.Wait() + + // Close db connection. + if err := i.eventRepo.Close(); err != nil { + slog.Error("Failed to close db connection", "err", err) + } } // Start starts the indexer, which should initialize the queue, add to wait groups, @@ -274,17 +278,15 @@ func (i *Indexer) Start() error { } // set the initial processing block, which will vary by sync mode. - if err := i.setInitialIndexingBlockByMode(i.ctx, i.syncMode, i.srcChainId); err != nil { + if err := i.setInitialIndexingBlockByMode(i.syncMode, i.srcChainId); err != nil { return errors.Wrap(err, "i.setInitialIndexingBlockByMode") } - i.wg.Add(1) - - go i.eventLoop(i.ctx, i.latestIndexedBlockNumber) + go i.eventLoop(i.ctx) go func() { if err := backoff.Retry(func() error { - return utils.ScanBlocks(i.ctx, i.srcEthClient, i.wg) + return utils.ScanBlocks(i.ctx, i.srcEthClient, &i.wg) }, backoff.NewConstantBackOff(5*time.Second)); err != nil { slog.Error("scan blocks backoff retry", "error", err) } @@ -293,17 +295,11 @@ func (i *Indexer) Start() error { return nil } -func (i *Indexer) eventLoop(ctx context.Context, startBlockID uint64) { +func (i *Indexer) eventLoop(ctx context.Context) { + i.wg.Add(1) defer i.wg.Done() - var d time.Duration = 10 * time.Second - - if i.watchMode == CrawlPastBlocks { - d = 10 * time.Minute - } - - t := time.NewTicker(d) - + t := time.NewTicker(10 * time.Second) defer t.Stop() for { @@ -333,6 +329,15 @@ func (i *Indexer) filter(ctx context.Context) error { // ignore latest N blocks if we are crawling past blocks, they are probably in queue already // and are not "missed", have just not been processed. if i.watchMode == CrawlPastBlocks { + if i.numLatestBlocksEndWhenCrawling > i.numLatestBlocksStartWhenCrawling { + slog.Error("Invalid configuration", + "numLatestBlocksEndWhenCrawling", i.numLatestBlocksEndWhenCrawling, + "numLatestBlocksStartWhenCrawling", i.numLatestBlocksStartWhenCrawling, + ) + + return errors.New("numLatestBlocksStartWhenCrawling must be greater than numLatestBlocksEndWhenCrawling") + } + // if targetBlockNumber is not nil, we are just going to process a singular block. if i.targetBlockNumber != nil { slog.Info("targetBlockNumber is set", "targetBlockNumber", *i.targetBlockNumber) @@ -342,15 +347,19 @@ func (i *Indexer) filter(ctx context.Context) error { endBlockID = i.latestIndexedBlockNumber + 1 } else { // set the initial processing block back to either 0 or the genesis block again. - if err := i.setInitialIndexingBlockByMode(i.ctx, i.syncMode, i.srcChainId); err != nil { + if err := i.setInitialIndexingBlockByMode(i.syncMode, i.srcChainId); err != nil { return errors.Wrap(err, "i.setInitialIndexingBlockByMode") } - if endBlockID > i.numLatestBlocksToIgnoreWhenCrawling { + if i.latestIndexedBlockNumber < endBlockID-i.numLatestBlocksStartWhenCrawling { + i.latestIndexedBlockNumber = endBlockID - i.numLatestBlocksStartWhenCrawling + } + + if endBlockID > i.numLatestBlocksEndWhenCrawling { // otherwise, we need to set the endBlockID as the greater of the two: // either the endBlockID minus the number of latest blocks to ignore, // or endBlockID. - endBlockID -= i.numLatestBlocksToIgnoreWhenCrawling + endBlockID -= i.numLatestBlocksEndWhenCrawling } } } @@ -384,7 +393,9 @@ func (i *Indexer) filter(ctx context.Context) error { switch i.eventName { case relayer.EventNameMessageSent: if err := i.withRetry(func() error { return i.indexMessageSentEvents(ctx, filterOpts) }); err != nil { - return errors.Wrap(err, "i.indexMessageSentEvents") + // We will skip the error after retrying, as we want the indexer to continue. + slog.Error("i.indexMessageSentEvents", "error", err) + relayer.MessageSentEventsAfterRetryErrorCount.Inc() } // we dont want to watch for message status changed events @@ -393,17 +404,20 @@ func (i *Indexer) filter(ctx context.Context) error { // since they are related. if i.watchMode != CrawlPastBlocks { if err := i.withRetry(func() error { return i.indexMessageStatusChangedEvents(ctx, filterOpts) }); err != nil { - return errors.Wrap(err, "i.indexMessageStatusChangedEvents") + slog.Error("i.indexMessageStatusChangedEvents", "error", err) + relayer.MessageStatusChangedEventsAfterRetryErrorCount.Inc() } // we also want to index chain data synced events. if err := i.withRetry(func() error { return i.indexChainDataSyncedEvents(ctx, filterOpts) }); err != nil { - return errors.Wrap(err, "i.indexChainDataSyncedEvents") + slog.Error("i.indexChainDataSyncedEvents", "error", err) + relayer.ChainDataSyncedEventsAfterRetryErrorCount.Inc() } } case relayer.EventNameMessageProcessed: if err := i.withRetry(func() error { return i.indexMessageProcessedEvents(ctx, filterOpts) }); err != nil { - return errors.Wrap(err, "i.indexMessageProcessedEvents") + slog.Error("i.indexMessageProcessedEvents", "error", err) + relayer.MessageProcessedEventsAfterRetryErrorCount.Inc() } } @@ -462,7 +476,7 @@ func (i *Indexer) indexMessageSentEvents(ctx context.Context, } func (i *Indexer) checkReorg(ctx context.Context, emittedInBlockNumber uint64) error { - n, err := i.eventRepo.FindLatestBlockID(i.eventName, i.srcChainId.Uint64(), i.destChainId.Uint64()) + n, err := i.eventRepo.FindLatestBlockID(ctx, i.eventName, i.srcChainId.Uint64(), i.destChainId.Uint64()) if err != nil { return err } @@ -589,7 +603,7 @@ func (i *Indexer) indexChainDataSyncedEvents(ctx context.Context, event := chainDataSyncedEvents.Event group.Go(func() error { - err := i.handleChainDataSyncedEvent(ctx, i.srcChainId, event, true) + err := i.handleChainDataSyncedEvent(ctx, event, true) if err != nil { relayer.MessageStatusChangedEventsIndexingErrors.Inc() diff --git a/packages/relayer/indexer/indexer_test.go b/packages/relayer/indexer/indexer_test.go index ca5a150ab36..8af5555ca1d 100644 --- a/packages/relayer/indexer/indexer_test.go +++ b/packages/relayer/indexer/indexer_test.go @@ -2,7 +2,6 @@ package indexer import ( "context" - "sync" "time" "github.com/taikoxyz/taiko-mono/packages/relayer" @@ -28,15 +27,12 @@ func newTestService(syncMode SyncMode, watchMode WatchMode) (*Indexer, relayer.B syncMode: syncMode, watchMode: watchMode, - wg: &sync.WaitGroup{}, - ctx: context.Background(), srcChainId: mock.MockChainID, destChainId: mock.MockChainID, ethClientTimeout: 10 * time.Second, - mu: &sync.Mutex{}, eventName: relayer.EventNameMessageSent, }, b } diff --git a/packages/relayer/indexer/save_event_to_db.go b/packages/relayer/indexer/save_event_to_db.go index 0c15c0c57dc..08b485315a2 100644 --- a/packages/relayer/indexer/save_event_to_db.go +++ b/packages/relayer/indexer/save_event_to_db.go @@ -3,6 +3,7 @@ package indexer import ( "context" "fmt" + "log/slog" "math/big" "github.com/pkg/errors" @@ -23,7 +24,14 @@ func (i *Indexer) saveEventToDB( ) (int, error) { eventType, canonicalToken, amount, err := relayer.DecodeMessageData(eventData, eventValue) if err != nil { - return 0, errors.Wrap(err, "eventTypeAmountAndCanonicalTokenFromEvent(event)") + slog.Error("error decoding message data", "error", err.Error()) + + return 0, errors.Wrap(err, "relayer.DecodeMessageData") + } + + if eventType == relayer.EventTypeSendETH { + canonicalToken = nil + amount = eventValue } // check if we have an existing event already. this is mostly likely only true @@ -63,7 +71,7 @@ func (i *Indexer) saveEventToDB( opts.CanonicalTokenDecimals = canonicalToken.TokenDecimals() } - e, err := i.eventRepo.Save(ctx, opts) + e, err := i.eventRepo.Save(ctx, &opts) if err != nil { return 0, errors.Wrap(err, "svc.eventRepo.Save") } diff --git a/packages/relayer/indexer/set_initial_Indexing_block_by_mode.go b/packages/relayer/indexer/set_initial_Indexing_block_by_mode.go index 49b295deb4a..a556e7f3cd7 100644 --- a/packages/relayer/indexer/set_initial_Indexing_block_by_mode.go +++ b/packages/relayer/indexer/set_initial_Indexing_block_by_mode.go @@ -1,7 +1,6 @@ package indexer import ( - "context" "math/big" "github.com/pkg/errors" @@ -11,7 +10,6 @@ import ( // setInitialIndexingBlockByMode takes in a SyncMode and determines how we should // start our indexing func (i *Indexer) setInitialIndexingBlockByMode( - ctx context.Context, mode SyncMode, chainID *big.Int, ) error { @@ -30,6 +28,7 @@ func (i *Indexer) setInitialIndexingBlockByMode( case Sync: // get most recently processed block height from the DB latest, err := i.eventRepo.FindLatestBlockID( + i.ctx, i.eventName, chainID.Uint64(), i.destChainId.Uint64(), diff --git a/packages/relayer/indexer/set_initial_indexing_block_by_mode_test.go b/packages/relayer/indexer/set_initial_indexing_block_by_mode_test.go index 9806c5a7457..50fc51834f3 100644 --- a/packages/relayer/indexer/set_initial_indexing_block_by_mode_test.go +++ b/packages/relayer/indexer/set_initial_indexing_block_by_mode_test.go @@ -1,7 +1,6 @@ package indexer import ( - "context" "math/big" "testing" @@ -51,7 +50,6 @@ func Test_setInitialIndexingBlockByMode(t *testing.T) { t.Run(tt.name, func(t *testing.T) { svc, _ := newTestService(tt.mode, FilterAndSubscribe) err := svc.setInitialIndexingBlockByMode( - context.Background(), tt.mode, tt.chainID, ) diff --git a/packages/relayer/migrations/1708366667_alter_events_add_dest_owner.sql b/packages/relayer/migrations/1708366667_alter_events_add_dest_owner.sql new file mode 100644 index 00000000000..8ad5fec0d26 --- /dev/null +++ b/packages/relayer/migrations/1708366667_alter_events_add_dest_owner.sql @@ -0,0 +1,9 @@ +-- +goose Up +-- +goose StatementBegin +ALTER TABLE `events` ADD COLUMN `dest_owner_json` VARCHAR(255) AS (JSON_UNQUOTE(JSON_EXTRACT(`data`, '$.Message.DestOwner'))) STORED; +-- +goose StatementEnd + +-- +goose Down +-- +goose StatementBegin +ALTER TABLE `events` DROP COLUMN `dest_owner_json`; +-- +goose StatementEnd \ No newline at end of file diff --git a/packages/relayer/migrations/1708366668_index_data.sql b/packages/relayer/migrations/1708366668_index_data.sql new file mode 100644 index 00000000000..5dcd01f260c --- /dev/null +++ b/packages/relayer/migrations/1708366668_index_data.sql @@ -0,0 +1,33 @@ +-- +goose Up +-- +goose StatementBegin +ALTER TABLE `events` +ADD INDEX `message_owner_event_type_chain_id_event_data_index` (`message_owner`, `dest_owner_json`, `event_type`, `chain_id`, `event`), +ADD INDEX `message_owner_event_type_chain_id_data_index` (`message_owner`, `dest_owner_json`, `event_type`, `chain_id`), +ADD INDEX `message_owner_event_type_data_index` (`message_owner`, `dest_owner_json`, `event_type`), +ADD INDEX `message_owner_data_index` (`message_owner`, `dest_owner_json`), +ADD INDEX `message_owner_chain_id_data_index` (`message_owner`, `dest_owner_json`, `chain_id`), +ADD INDEX `message_owner_event_data_index` (`message_owner`, `dest_owner_json`, `event`), +ADD INDEX `msg_hash_event_data_index` (`msg_hash`, `dest_owner_json`, `event`), +ADD INDEX `data_event_type_chain_id_index` (`event_type`,`dest_owner_json`, `chain_id`), +ADD INDEX `data_event_type_index` (`dest_owner_json`, `event_type`), +ADD INDEX `data_index` (`dest_owner_json`), +ADD INDEX `data_chain_id_index` (`dest_owner_json`, `chain_id`), +ADD INDEX `data_event_index` (`dest_owner_json`, `event`); + +-- +goose StatementEnd +-- +goose Down +-- +goose StatementBegin +ALTER TABLE `events` + DROP INDEX `message_owner_event_type_chain_id_event_data_index`, + DROP INDEX `message_owner_event_type_chain_id_data_index`, + DROP INDEX `message_owner_event_type_data_index`, + DROP INDEX `message_owner_data_index`, + DROP INDEX `message_owner_chain_id_data_index`, + DROP INDEX `message_owner_event_data_index`, + DROP INDEX `msg_hash_event_data_index`, + DROP INDEX `data_event_type_chain_id_index`, + DROP INDEX `data_event_type_index`, + DROP INDEX `data_index`, + DROP INDEX `data_chain_id_index`, + DROP INDEX `data_event_index`; +-- +goose StatementEnd diff --git a/packages/relayer/migrations/1708366669_alert_events_is_profitable.sql b/packages/relayer/migrations/1708366669_alert_events_is_profitable.sql new file mode 100644 index 00000000000..d9eda80f57b --- /dev/null +++ b/packages/relayer/migrations/1708366669_alert_events_is_profitable.sql @@ -0,0 +1,23 @@ +-- +goose Up +-- +goose StatementBegin +ALTER TABLE `events` +ADD COLUMN `fee` BIGINT UNSIGNED NULL, +ADD COLUMN `dest_chain_base_fee` BIGINT UNSIGNED NULL, +ADD COLUMN `gas_tip_cap` BIGINT UNSIGNED NULL, +ADD COLUMN `gas_limit` BIGINT UNSIGNED NULL, +ADD COLUMN `is_profitable` BOOLEAN NULL, +ADD COLUMN `estimated_onchain_fee` BIGINT UNSIGNED NULL, +ADD COLUMN `is_profitable_evaluated_at` TIMESTAMP NULL; + +-- +goose StatementEnd +-- +goose Down +-- +goose StatementBegin +ALTER TABLE `events` +DROP COLUMN `fee`, +DROP COLUMN `dest_chain_base_fee`, +DROP COLUMN `gas_tip_cap`, +DROP COLUMN `gas_limit`, +DROP COLUMN `is_profitable`, +DROP COLUMN `estimated_onchain_fee`, +DROP COLUMN `is_profitable_evaluated_at`; +-- +goose StatementEnd diff --git a/packages/relayer/pkg/db/db.go b/packages/relayer/pkg/db/db.go index e2d19c61ca0..1610c161873 100644 --- a/packages/relayer/pkg/db/db.go +++ b/packages/relayer/pkg/db/db.go @@ -1,36 +1,43 @@ package db import ( - "database/sql" "fmt" "time" + "database/sql" + "github.com/cyberhorsey/errors" "gorm.io/gorm" ) -type DB struct { +var ( + ErrNoDB = errors.Validation.NewWithKeyAndDetail("ERR_NO_DB", "no db") +) + +// DB is a local interface that lets us narrow down a database type for testing. +type DB interface { + DB() (*sql.DB, error) + GormDB() *gorm.DB +} + +type Database struct { gormdb *gorm.DB } -func (db *DB) DB() (*sql.DB, error) { +func (db *Database) DB() (*sql.DB, error) { return db.gormdb.DB() } -func (db *DB) GormDB() *gorm.DB { +func (db *Database) GormDB() *gorm.DB { return db.gormdb } -func New(gormdb *gorm.DB) *DB { - return &DB{ +func New(gormdb *gorm.DB) DB { + return &Database{ gormdb: gormdb, } } -var ( - ErrNoDB = errors.Validation.NewWithKeyAndDetail("ERR_NO_DB", "DB is required") -) - type DBConnectionOpts struct { Name string Password string @@ -39,10 +46,10 @@ type DBConnectionOpts struct { MaxIdleConns uint64 MaxOpenConns uint64 MaxConnLifetime uint64 - OpenFunc func(dsn string) (*DB, error) + OpenFunc func(dsn string) (DB, error) } -func OpenDBConnection(opts DBConnectionOpts) (*DB, error) { +func OpenDBConnection(opts DBConnectionOpts) (DB, error) { dsn := "" if opts.Password == "" { dsn = fmt.Sprintf( diff --git a/packages/relayer/pkg/http/get_block_info.go b/packages/relayer/pkg/http/get_block_info.go index 0ad1b1eab13..30eb629258c 100644 --- a/packages/relayer/pkg/http/get_block_info.go +++ b/packages/relayer/pkg/http/get_block_info.go @@ -80,6 +80,7 @@ func (srv *Server) GetBlockInfo(c echo.Context) error { } latestProcessedSrcBlock, err := srv.eventRepo.FindLatestBlockID( + c.Request().Context(), relayer.EventNameMessageSent, srcChainID.Uint64(), destChainID.Uint64(), @@ -89,6 +90,7 @@ func (srv *Server) GetBlockInfo(c echo.Context) error { } latestProcessedDestBlock, err := srv.eventRepo.FindLatestBlockID( + c.Request().Context(), relayer.EventNameMessageSent, destChainID.Uint64(), srcChainID.Uint64(), diff --git a/packages/relayer/pkg/http/get_events_by_address.go b/packages/relayer/pkg/http/get_events_by_address.go index b1e0f6357fc..d136deb7050 100644 --- a/packages/relayer/pkg/http/get_events_by_address.go +++ b/packages/relayer/pkg/http/get_events_by_address.go @@ -1,7 +1,10 @@ package http import ( + "encoding/json" + "errors" "html" + "math" "math/big" "net/http" "strconv" @@ -12,6 +15,48 @@ import ( "github.com/taikoxyz/taiko-mono/packages/relayer" ) +type JSONData struct { + Raw Raw `json:"Raw"` +} +type Raw struct { + Data string `json:"data"` + Topics []string `json:"topics"` + Address string `json:"address"` + Removed bool `json:"removed"` + LogIndex string `json:"logIndex"` + BlockHash string `json:"blockHash"` + BlockNumber string `json:"blockNumber"` + TransactionHash string `json:"transactionHash"` + TransactionIndex string `json:"transactionIndex"` +} + +type Stats struct { + ProofSize int `json:"ProofSize"` + NumCacheOps int `json:"NumCacheOps"` + GasUsedInFeeCalc int `json:"GasUsedInFeeCalc"` +} + +type Message struct { + Id int `json:"Id"` + To string `json:"To"` + Fee int64 `json:"Fee"` + Data string `json:"Data"` + From string `json:"From"` + Value int64 `json:"Value"` + GasLimit int `json:"GasLimit"` + SrcOwner string `json:"SrcOwner"` + DestOwner string `json:"DestOwner"` + SrcChainId int `json:"SrcChainId"` + DestChainId int `json:"DestChainId"` +} + +type DataStruct struct { + Raw Raw `json:"Raw"` + Stats Stats `json:"Stats"` + Message Message `json:"Message"` + MsgHash string `json:"MsgHash"` +} + // GetEventsByAddress // // returns events by address @@ -66,5 +111,69 @@ func (srv *Server) GetEventsByAddress(c echo.Context) error { return webutils.LogAndRenderErrors(c, http.StatusUnprocessableEntity, err) } + // get processed message tx and claimedBy + for i := range *page.Items.(*[]relayer.Event) { + v := &(*page.Items.(*[]relayer.Event))[i] + + msgProcessedEvent, err := srv.eventRepo.FirstByEventAndMsgHash( + c.Request().Context(), + relayer.EventNameMessageStatusChanged, + v.MsgHash, + ) + if err != nil { + continue + } + + if msgProcessedEvent == nil { + continue + } + + r := &JSONData{} + + if err := json.Unmarshal(msgProcessedEvent.Data, r); err != nil { + return webutils.LogAndRenderErrors(c, http.StatusUnprocessableEntity, err) + } + + if r.Raw.TransactionIndex == "" || r.Raw.TransactionHash == "" { + continue + } + + var ethClient ethClient + + if new(big.Int).SetInt64(msgProcessedEvent.ChainID).Cmp(srv.srcChainID) == 0 { + ethClient = srv.srcEthClient + } else { + ethClient = srv.destEthClient + } + + tx, _, err := ethClient.TransactionByHash( + c.Request().Context(), + common.HexToHash(r.Raw.TransactionHash), + ) + if err != nil { + return webutils.LogAndRenderErrors(c, http.StatusUnprocessableEntity, err) + } + + txIndex, err := strconv.ParseInt(r.Raw.TransactionIndex[2:], 16, 64) + if err != nil { + return webutils.LogAndRenderErrors(c, http.StatusUnprocessableEntity, err) + } + if txIndex < 0 || txIndex > math.MaxUint32 { + return webutils.LogAndRenderErrors(c, http.StatusUnprocessableEntity, errors.New("transaction index out of range")) + } + + sender, err := ethClient.TransactionSender( + c.Request().Context(), + tx, + common.HexToHash(r.Raw.BlockHash), + uint(txIndex), + ) + if err == nil { + v.ClaimedBy = sender.Hex() + } + + v.ProcessedTxHash = r.Raw.TransactionHash + } + return c.JSON(http.StatusOK, page) } diff --git a/packages/relayer/pkg/http/get_events_by_address_test.go b/packages/relayer/pkg/http/get_events_by_address_test.go index 665ac21b354..479e4502b4e 100644 --- a/packages/relayer/pkg/http/get_events_by_address_test.go +++ b/packages/relayer/pkg/http/get_events_by_address_test.go @@ -15,9 +15,9 @@ import ( ) func Test_GetEventsByAddress(t *testing.T) { - srv := newTestServer("") + srv := newTestServer() - _, err := srv.eventRepo.Save(context.Background(), relayer.SaveEventOpts{ + _, err := srv.eventRepo.Save(context.Background(), &relayer.SaveEventOpts{ Name: "name", Data: `{"Owner": "0x0000000000000000000000000000000000000123"}`, ChainID: big.NewInt(167001), diff --git a/packages/relayer/pkg/http/get_recommended_processing_fees.go b/packages/relayer/pkg/http/get_recommended_processing_fees.go index 63887d8766d..48e3271a88b 100644 --- a/packages/relayer/pkg/http/get_recommended_processing_fees.go +++ b/packages/relayer/pkg/http/get_recommended_processing_fees.go @@ -122,14 +122,14 @@ func (srv *Server) GetRecommendedProcessingFees(c echo.Context) error { for _, f := range feeTypes { fees = append(fees, fee{ Type: f.String(), - Amount: srv.getCost(c.Request().Context(), uint64(f), destGasTipCap, destBaseFee, Layer1).String(), + Amount: srv.getCost(uint64(f), destGasTipCap, destBaseFee, Layer1).String(), DestChainID: srcChainID.Uint64(), GasLimit: strconv.Itoa(int(f)), }) fees = append(fees, fee{ Type: f.String(), - Amount: srv.getCost(c.Request().Context(), uint64(f), srcGasTipCap, srcBaseFee, Layer2).String(), + Amount: srv.getCost(uint64(f), srcGasTipCap, srcBaseFee, Layer2).String(), DestChainID: destChainID.Uint64(), GasLimit: strconv.Itoa(int(f)), }) @@ -143,7 +143,6 @@ func (srv *Server) GetRecommendedProcessingFees(c echo.Context) error { } func (srv *Server) getCost( - ctx context.Context, gasLimit uint64, gasTipCap *big.Int, baseFee *big.Int, @@ -151,7 +150,7 @@ func (srv *Server) getCost( ) *big.Int { cost := new(big.Int).Mul( new(big.Int).SetUint64(gasLimit), - new(big.Int).Add(gasTipCap, baseFee)) + new(big.Int).Add(gasTipCap, new(big.Int).Mul(baseFee, big.NewInt(2)))) if destLayer == Layer2 { return cost diff --git a/packages/relayer/pkg/http/server.go b/packages/relayer/pkg/http/server.go index e6f5ee0dfb1..0ef5d961ecf 100644 --- a/packages/relayer/pkg/http/server.go +++ b/packages/relayer/pkg/http/server.go @@ -2,10 +2,12 @@ package http import ( "context" + "log/slog" "math/big" "net/http" "os" + "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" "github.com/labstack/echo/v4/middleware" "github.com/taikoxyz/taiko-mono/packages/relayer" @@ -19,6 +21,12 @@ type ethClient interface { ChainID(ctx context.Context) (*big.Int, error) SuggestGasTipCap(ctx context.Context) (*big.Int, error) BlockByNumber(ctx context.Context, number *big.Int) (*types.Block, error) + TransactionByHash(ctx context.Context, hash common.Hash) (*types.Transaction, bool, error) + TransactionSender(ctx context.Context, + tx *types.Transaction, + blockHash common.Hash, + txIndex uint, + ) (common.Address, error) } // @title Taiko Bridge Relayer API @@ -30,15 +38,17 @@ type ethClient interface { // @contact.email info@taiko.xyz // @license.name MIT -// @license.url https://github.com/taikoxyz/taiko-mono/blob/main/LICENSE.md +// @license.url https://github.com/taikoxyz/taiko-mono/blob/main/LICENSE // @host relayer.hekla.taiko.xyz -// Server represents an relayer http server instance. +// Server represents a relayer http server instance. type Server struct { echo *echo.Echo eventRepo relayer.EventRepository srcEthClient ethClient + srcChainID *big.Int destEthClient ethClient + destChainID *big.Int processingFeeMultiplier float64 taikoL2 *taikol2.TaikoL2 } @@ -82,6 +92,16 @@ func NewServer(opts NewServerOpts) (*Server, error) { return nil, err } + srcChainID, err := opts.SrcEthClient.ChainID(context.Background()) + if err != nil { + return nil, err + } + + destChainID, err := opts.DestEthClient.ChainID(context.Background()) + if err != nil { + return nil, err + } + srv := &Server{ echo: opts.Echo, eventRepo: opts.EventRepo, @@ -89,6 +109,8 @@ func NewServer(opts NewServerOpts) (*Server, error) { destEthClient: opts.DestEthClient, processingFeeMultiplier: opts.ProcessingFeeMultiplier, taikoL2: opts.TaikoL2, + srcChainID: srcChainID, + destChainID: destChainID, } corsOrigins := opts.CorsOrigins @@ -109,6 +131,11 @@ func (srv *Server) Start(address string) error { // Shutdown shuts down the HTTP server func (srv *Server) Shutdown(ctx context.Context) error { + // Close db connection. + if err := srv.eventRepo.Close(); err != nil { + slog.Error("Failed to close db connection", "err", err) + } + return srv.echo.Shutdown(ctx) } diff --git a/packages/relayer/pkg/http/server_test.go b/packages/relayer/pkg/http/server_test.go index 324744e45cc..061861158b9 100644 --- a/packages/relayer/pkg/http/server_test.go +++ b/packages/relayer/pkg/http/server_test.go @@ -14,7 +14,7 @@ import ( "github.com/taikoxyz/taiko-mono/packages/relayer/pkg/repo" ) -func newTestServer(url string) *Server { +func newTestServer() *Server { _ = godotenv.Load("../.test.env") srv := &Server{ @@ -75,16 +75,6 @@ func Test_NewServer(t *testing.T) { }, relayer.ErrNoEventRepository, }, - { - "noCorsOrigins", - NewServerOpts{ - Echo: echo.New(), - EventRepo: &repo.EventRepository{}, - SrcEthClient: &mock.EthClient{}, - DestEthClient: &mock.EthClient{}, - }, - relayer.ErrNoCORSOrigins, - }, { "noHttpFramework", NewServerOpts{ @@ -104,7 +94,7 @@ func Test_NewServer(t *testing.T) { } func Test_Health(t *testing.T) { - srv := newTestServer("") + srv := newTestServer() req, _ := http.NewRequest(echo.GET, "/healthz", nil) rec := httptest.NewRecorder() @@ -117,7 +107,7 @@ func Test_Health(t *testing.T) { } func Test_Root(t *testing.T) { - srv := newTestServer("") + srv := newTestServer() req, _ := http.NewRequest(echo.GET, "/", nil) rec := httptest.NewRecorder() @@ -130,7 +120,7 @@ func Test_Root(t *testing.T) { } func Test_StartShutdown(t *testing.T) { - srv := newTestServer("") + srv := newTestServer() go func() { _ = srv.Start(":3928") diff --git a/packages/relayer/pkg/mock/eth_client.go b/packages/relayer/pkg/mock/eth_client.go index b851a747d30..9cbe1cf1976 100644 --- a/packages/relayer/pkg/mock/eth_client.go +++ b/packages/relayer/pkg/mock/eth_client.go @@ -137,3 +137,19 @@ func (c *EthClient) SubscribeNewHead(ctx context.Context, ch chan<- *types.Heade return s, nil } + +// nolint: lll +func (c *EthClient) TransactionSender(ctx context.Context, tx *types.Transaction, blockHash common.Hash, txIndex uint) (common.Address, error) { + return common.Address{}, nil +} + +func (c *EthClient) BalanceAt( + ctx context.Context, + account common.Address, + blockNumber *big.Int) (*big.Int, error) { + return big.NewInt(100), nil +} + +func (c *EthClient) CodeAt(ctx context.Context, account common.Address, blockNumber *big.Int) ([]byte, error) { + return []byte{}, nil +} diff --git a/packages/relayer/pkg/mock/event_repository.go b/packages/relayer/pkg/mock/event_repository.go index 6e5d5bffe88..f3593bbd7e1 100644 --- a/packages/relayer/pkg/mock/event_repository.go +++ b/packages/relayer/pkg/mock/event_repository.go @@ -6,6 +6,7 @@ import ( "errors" "math/rand" "net/http" + "time" "github.com/morkid/paginate" "github.com/taikoxyz/taiko-mono/packages/relayer" @@ -21,7 +22,12 @@ func NewEventRepository() *EventRepository { events: make([]*relayer.Event, 0), } } -func (r *EventRepository) Save(ctx context.Context, opts relayer.SaveEventOpts) (*relayer.Event, error) { + +func (r *EventRepository) Close() error { + return nil +} + +func (r *EventRepository) Save(ctx context.Context, opts *relayer.SaveEventOpts) (*relayer.Event, error) { r.events = append(r.events, &relayer.Event{ ID: rand.Int(), // nolint: gosec Data: datatypes.JSON(opts.Data), @@ -62,35 +68,77 @@ func (r *EventRepository) UpdateStatus(ctx context.Context, id int, status relay return nil } +func (r *EventRepository) UpdateFeesAndProfitability( + ctx context.Context, + id int, opts *relayer.UpdateFeesAndProfitabilityOpts, +) error { + var event *relayer.Event + + var index int + + // Find the event by ID + for i, e := range r.events { + if e.ID == id { + event = e + index = i + + break + } + } + + if event == nil { + return nil // Or return an appropriate error if the event is not found + } + + // Update the event fields + event.Fee = &opts.Fee + event.DestChainBaseFee = &opts.DestChainBaseFee + event.GasTipCap = &opts.GasTipCap + event.GasLimit = &opts.GasLimit + event.IsProfitable = &opts.IsProfitable + event.EstimatedOnchainFee = &opts.EstimatedOnchainFee + currentTime := time.Now().UTC() + event.IsProfitableEvaluatedAt = ¤tTime + + // Save the updated event back to the slice + r.events[index] = event + + return nil +} + func (r *EventRepository) FindAllByAddress( ctx context.Context, req *http.Request, opts relayer.FindAllByAddressOpts, -) (paginate.Page, error) { +) (*paginate.Page, error) { type d struct { Owner string `json:"Owner"` } - events := make([]*relayer.Event, 0) + appendToSlice := func(slice *[]relayer.Event, elements ...relayer.Event) { + *slice = append(*slice, elements...) + } + + events := &[]relayer.Event{} for _, e := range r.events { m, err := e.Data.MarshalJSON() if err != nil { - return paginate.Page{}, err + return nil, err } data := &d{} if err := json.Unmarshal(m, data); err != nil { - return paginate.Page{}, err + return nil, err } if data.Owner == opts.Address.Hex() { - events = append(events, e) + appendToSlice(events, *e) break } } - return paginate.Page{ + return &paginate.Page{ Items: events, }, nil } @@ -162,6 +210,7 @@ func (r *EventRepository) DeleteAllAfterBlockID(blockID uint64, srcChainID uint6 // GetLatestBlockID get latest block id func (r *EventRepository) FindLatestBlockID( + ctx context.Context, event string, srcChainID uint64, destChainID uint64, diff --git a/packages/relayer/pkg/mock/mock_tx_sender.go b/packages/relayer/pkg/mock/mock_tx_sender.go index df88966b6ae..5dd941b5fd0 100644 --- a/packages/relayer/pkg/mock/mock_tx_sender.go +++ b/packages/relayer/pkg/mock/mock_tx_sender.go @@ -2,10 +2,12 @@ package mock import ( "context" + "math/big" "github.com/ethereum-optimism/optimism/op-service/txmgr" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/rpc" ) type TxManager struct { @@ -34,3 +36,20 @@ func (t *TxManager) Close() { func (t *TxManager) IsClosed() bool { return false } + +func (t *TxManager) SendAsync(ctx context.Context, candidate txmgr.TxCandidate, ch chan txmgr.SendResponse) { + panic("unimplemented") +} + +func (t *TxManager) SuggestGasPriceCaps(ctx context.Context) ( + tipCap *big.Int, + baseFee *big.Int, + blobBaseFee *big.Int, + err error, +) { + panic("unimplemented") +} + +func (t *TxManager) API() rpc.API { + panic("unimplemented") +} diff --git a/packages/relayer/pkg/repo/containers_test.go b/packages/relayer/pkg/repo/containers_test.go index 67f186da3bc..c18e06f4c72 100644 --- a/packages/relayer/pkg/repo/containers_test.go +++ b/packages/relayer/pkg/repo/containers_test.go @@ -6,12 +6,13 @@ import ( "testing" "github.com/pressly/goose/v3" - "github.com/taikoxyz/taiko-mono/packages/relayer/pkg/db" "github.com/testcontainers/testcontainers-go" "github.com/testcontainers/testcontainers-go/wait" "gorm.io/driver/mysql" "gorm.io/gorm" "gorm.io/gorm/logger" + + "github.com/taikoxyz/taiko-mono/packages/relayer/pkg/db" ) var ( @@ -20,7 +21,7 @@ var ( dbPassword = "password" ) -func testMysql(t *testing.T) (DB, func(), error) { +func testMysql(t *testing.T) (db.DB, func(), error) { req := testcontainers.ContainerRequest{ Image: "mysql:latest", ExposedPorts: []string{"3306/tcp", "33060/tcp"}, diff --git a/packages/relayer/pkg/repo/db.go b/packages/relayer/pkg/repo/db.go deleted file mode 100644 index 1c8a35dbca3..00000000000 --- a/packages/relayer/pkg/repo/db.go +++ /dev/null @@ -1,17 +0,0 @@ -package repo - -import ( - "database/sql" - - "github.com/cyberhorsey/errors" - "gorm.io/gorm" -) - -var ( - ErrNoDB = errors.Validation.NewWithKeyAndDetail("ERR_NO_DB", "no db") -) - -type DB interface { - DB() (*sql.DB, error) - GormDB() *gorm.DB -} diff --git a/packages/relayer/pkg/repo/event.go b/packages/relayer/pkg/repo/event.go index 8dccbf74df0..b07b1758553 100644 --- a/packages/relayer/pkg/repo/event.go +++ b/packages/relayer/pkg/repo/event.go @@ -2,32 +2,43 @@ package repo import ( "context" - "strings" - "net/http" + "strings" "github.com/morkid/paginate" "github.com/pkg/errors" - "github.com/taikoxyz/taiko-mono/packages/relayer" "gorm.io/datatypes" "gorm.io/gorm" + + "github.com/taikoxyz/taiko-mono/packages/relayer" + "github.com/taikoxyz/taiko-mono/packages/relayer/pkg/db" ) type EventRepository struct { - db DB + db db.DB } -func NewEventRepository(db DB) (*EventRepository, error) { - if db == nil { - return nil, ErrNoDB +func NewEventRepository(dbHandler db.DB) (*EventRepository, error) { + if dbHandler == nil { + return nil, db.ErrNoDB } return &EventRepository{ - db: db, + db: dbHandler, }, nil } -func (r *EventRepository) Save(ctx context.Context, opts relayer.SaveEventOpts) (*relayer.Event, error) { +// Close closes the database connection. +func (r *EventRepository) Close() error { + sqlDB, err := r.db.DB() + if err != nil { + return err + } + + return sqlDB.Close() +} + +func (r *EventRepository) Save(ctx context.Context, opts *relayer.SaveEventOpts) (*relayer.Event, error) { e := &relayer.Event{ Data: datatypes.JSON(opts.Data), Status: opts.Status, @@ -51,22 +62,66 @@ func (r *EventRepository) Save(ctx context.Context, opts relayer.SaveEventOpts) EmittedBlockID: opts.EmittedBlockID, } - if err := r.db.GormDB().Create(e).Error; err != nil { + if err := r.db.GormDB().WithContext(ctx).Create(e).Error; err != nil { return nil, errors.Wrap(err, "r.db.Create") } return e, nil } +func (r *EventRepository) UpdateFeesAndProfitability( + ctx context.Context, + id int, + opts *relayer.UpdateFeesAndProfitabilityOpts, +) error { + tx := r.db.GormDB().WithContext(ctx) + tx = tx.Model(&relayer.Event{}) + tx = tx.Where("id = ?", id) + + // check if existed. + var count int64 + if err := tx.Count(&count).Error; err != nil { + return errors.Wrap(err, "r.db.Count") + } + + if count == 0 { + return gorm.ErrRecordNotFound + } + + err := tx.Updates(map[string]interface{}{ + "fee": opts.Fee, + "dest_chain_base_fee": opts.DestChainBaseFee, + "gas_tip_cap": opts.GasTipCap, + "gas_limit": opts.GasLimit, + "is_profitable": opts.IsProfitable, + "estimated_onchain_fee": opts.EstimatedOnchainFee, + "is_profitable_evaluated_at": opts.IsProfitableEvaluatedAt, + }).Error + + if err != nil { + return errors.Wrap(err, "r.db.Commit") + } + + return nil +} + func (r *EventRepository) UpdateStatus(ctx context.Context, id int, status relayer.EventStatus) error { - e := &relayer.Event{} - if err := r.db.GormDB().Where("id = ?", id).First(e).Error; err != nil { - return errors.Wrap(err, "r.db.First") + tx := r.db.GormDB().WithContext(ctx) + tx = tx.Model(&relayer.Event{}) + tx = tx.Where("id = ?", id) + + // check if existed. + var count int64 + if err := tx.Count(&count).Error; err != nil { + return errors.Wrap(err, "r.db.Count") + } + + if count == 0 { + return gorm.ErrRecordNotFound } - e.Status = status - if err := r.db.GormDB().Save(e).Error; err != nil { - return errors.Wrap(err, "r.db.Save") + if err := tx.Update("status", status).Error; err != nil { + return errors.Wrap(err, "tx.Commit") } return nil @@ -78,7 +133,7 @@ func (r *EventRepository) FirstByMsgHash( ) (*relayer.Event, error) { e := &relayer.Event{} // find all message sent events - if err := r.db.GormDB().Where("msg_hash = ?", msgHash). + if err := r.db.GormDB().WithContext(ctx).Where("msg_hash = ?", msgHash). First(&e).Error; err != nil { if err == gorm.ErrRecordNotFound { return nil, nil @@ -97,7 +152,7 @@ func (r *EventRepository) FirstByEventAndMsgHash( ) (*relayer.Event, error) { e := &relayer.Event{} // find all message sent events - if err := r.db.GormDB().Where("msg_hash = ?", msgHash). + if err := r.db.GormDB().WithContext(ctx).Where("msg_hash = ?", msgHash). Where("event = ?", event). First(&e).Error; err != nil { if err == gorm.ErrRecordNotFound { @@ -114,13 +169,18 @@ func (r *EventRepository) FindAllByAddress( ctx context.Context, req *http.Request, opts relayer.FindAllByAddressOpts, -) (paginate.Page, error) { +) (*paginate.Page, error) { pg := paginate.New(&paginate.Config{ DefaultSize: 100, }) - q := r.db.GormDB(). - Model(&relayer.Event{}).Where("message_owner = ?", strings.ToLower(opts.Address.Hex())) + q := r.db.GormDB().WithContext(ctx). + Model(&relayer.Event{}). + Where( + "dest_owner_json = ? OR message_owner = ?", + strings.ToLower(opts.Address.Hex()), + strings.ToLower(opts.Address.Hex()), + ) if opts.EventType != nil { q = q.Where("event_type = ?", *opts.EventType) @@ -141,15 +201,18 @@ func (r *EventRepository) FindAllByAddress( reqCtx := pg.With(q) page := reqCtx.Request(req).Response(&[]relayer.Event{}) + if page.Error { + return nil, page.RawError + } - return page, nil + return &page, nil } func (r *EventRepository) Delete( ctx context.Context, id int, ) error { - return r.db.GormDB().Delete(relayer.Event{}, id).Error + return r.db.GormDB().WithContext(ctx).Delete(relayer.Event{}, id).Error } func (r *EventRepository) ChainDataSyncedEventByBlockNumberOrGreater( @@ -160,7 +223,7 @@ func (r *EventRepository) ChainDataSyncedEventByBlockNumberOrGreater( ) (*relayer.Event, error) { e := &relayer.Event{} // find all message sent events - if err := r.db.GormDB().Where("name = ?", relayer.EventNameChainDataSynced). + if err := r.db.GormDB().WithContext(ctx).Where("name = ?", relayer.EventNameChainDataSynced). Where("chain_id = ?", srcChainId). Where("synced_chain_id = ?", syncedChainId). Where("block_id >= ?", blockNumber). @@ -184,7 +247,7 @@ func (r *EventRepository) LatestChainDataSyncedEvent( ) (uint64, error) { blockID := 0 // find all message sent events - if err := r.db.GormDB().Table("events"). + if err := r.db.GormDB().WithContext(ctx).Table("events"). Where("chain_id = ?", srcChainId). Where("synced_chain_id = ?", syncedChainId). Select("COALESCE(MAX(block_id), 0)"). @@ -210,16 +273,18 @@ WHERE block_id >= ? AND chain_id = ? AND dest_chain_id = ?` // GetLatestBlockID get latest block id func (r *EventRepository) FindLatestBlockID( + ctx context.Context, event string, srcChainID uint64, destChainID uint64, ) (uint64, error) { - q := `SELECT COALESCE(MAX(emitted_block_id), 0) + q := `SELECT COALESCE(MAX(emitted_block_id), 0) FROM events WHERE chain_id = ? AND dest_chain_id = ? AND event = ?` var b uint64 - if err := r.db.GormDB().Table("events").Raw(q, srcChainID, destChainID, event).Scan(&b).Error; err != nil { + if err := r.db.GormDB().WithContext(ctx).Table("events"). + Raw(q, srcChainID, destChainID, event).Scan(&b).Error; err != nil { return 0, err } diff --git a/packages/relayer/pkg/repo/event_test.go b/packages/relayer/pkg/repo/event_test.go index cbcf840770e..b363466ef4a 100644 --- a/packages/relayer/pkg/repo/event_test.go +++ b/packages/relayer/pkg/repo/event_test.go @@ -10,10 +10,11 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/morkid/paginate" - "github.com/taikoxyz/taiko-mono/packages/relayer" - "github.com/taikoxyz/taiko-mono/packages/relayer/pkg/db" "gopkg.in/go-playground/assert.v1" "gorm.io/datatypes" + + "github.com/taikoxyz/taiko-mono/packages/relayer" + "github.com/taikoxyz/taiko-mono/packages/relayer/pkg/db" ) var testMsgHash = "0x1" @@ -85,18 +86,18 @@ var testEvents = []relayer.Event{ func Test_NewEventRepo(t *testing.T) { tests := []struct { name string - db DB + db db.DB wantErr error }{ { "success", - &db.DB{}, + &db.Database{}, nil, }, { "noDb", nil, - ErrNoDB, + db.ErrNoDB, }, } @@ -118,12 +119,12 @@ func TestIntegration_Event_Save(t *testing.T) { assert.Equal(t, nil, err) tests := []struct { name string - opts relayer.SaveEventOpts + opts *relayer.SaveEventOpts wantErr error }{ { "success", - relayer.SaveEventOpts{ + &relayer.SaveEventOpts{ Name: "test", ChainID: big.NewInt(1), DestChainID: big.NewInt(2), @@ -184,7 +185,7 @@ func TestIntegration_Event_UpdateStatus(t *testing.T) { t.Run(tt.name, func(t *testing.T) { if tt.name == "success" { _, err := eventRepo.Save(context.Background(), - relayer.SaveEventOpts{ + &relayer.SaveEventOpts{ Name: "test", ChainID: big.NewInt(1), DestChainID: big.NewInt(2), @@ -223,7 +224,7 @@ func TestIntegration_Event_FindAllByAddress(t *testing.T) { addr := common.HexToAddress("0x71C7656EC7ab88b098defB751B7401B5f6d8976F") - _, err = eventRepo.Save(context.Background(), relayer.SaveEventOpts{ + _, err = eventRepo.Save(context.Background(), &relayer.SaveEventOpts{ Name: "name", Data: fmt.Sprintf(`{"Message": {"Owner": "%s"}}`, strings.ToLower(addr.Hex())), ChainID: big.NewInt(1), @@ -243,7 +244,7 @@ func TestIntegration_Event_FindAllByAddress(t *testing.T) { assert.Equal(t, nil, err) - _, err = eventRepo.Save(context.Background(), relayer.SaveEventOpts{ + _, err = eventRepo.Save(context.Background(), &relayer.SaveEventOpts{ Name: "name", Data: fmt.Sprintf(`{"Message": {"Owner": "%s"}}`, strings.ToLower(addr.Hex())), ChainID: big.NewInt(1), @@ -262,7 +263,7 @@ func TestIntegration_Event_FindAllByAddress(t *testing.T) { }) assert.Equal(t, nil, err) - _, err = eventRepo.Save(context.Background(), relayer.SaveEventOpts{ + _, err = eventRepo.Save(context.Background(), &relayer.SaveEventOpts{ Name: "name", Data: fmt.Sprintf(`{"Message": {"Owner": "%s"}}`, strings.ToLower(addr.Hex())), ChainID: big.NewInt(1), @@ -443,7 +444,7 @@ func TestIntegration_Event_FirstByMsgHash(t *testing.T) { eventRepo, err := NewEventRepository(db) assert.Equal(t, nil, err) - _, err = eventRepo.Save(context.Background(), relayer.SaveEventOpts{ + _, err = eventRepo.Save(context.Background(), &relayer.SaveEventOpts{ Name: "name", Data: fmt.Sprintf(`{"Message": {"Owner": "%s"}}`, strings.ToLower(addr.Hex())), ChainID: big.NewInt(1), diff --git a/packages/relayer/pkg/utils/scan_blocks.go b/packages/relayer/pkg/utils/scan_blocks.go index ec62c24a724..d6da257ebc5 100644 --- a/packages/relayer/pkg/utils/scan_blocks.go +++ b/packages/relayer/pkg/utils/scan_blocks.go @@ -15,10 +15,7 @@ type headSubscriber interface { func ScanBlocks(ctx context.Context, ethClient headSubscriber, wg *sync.WaitGroup) error { wg.Add(1) - - defer func() { - wg.Done() - }() + defer wg.Done() headers := make(chan *types.Header) diff --git a/packages/relayer/processor/can_process_message.go b/packages/relayer/processor/can_process_message.go index 9e5db2875f1..7772ba5d530 100644 --- a/packages/relayer/processor/can_process_message.go +++ b/packages/relayer/processor/can_process_message.go @@ -16,7 +16,7 @@ import ( // or its processed, failed, and is in Retriable or Failed state, where the user // should finish manually. func canProcessMessage( - ctx context.Context, + _ context.Context, eventStatus relayer.EventStatus, messageOwner common.Address, relayerAddress common.Address, diff --git a/packages/relayer/processor/config.go b/packages/relayer/processor/config.go index e11daa7daaf..06410b53bea 100644 --- a/packages/relayer/processor/config.go +++ b/packages/relayer/processor/config.go @@ -7,15 +7,16 @@ import ( "github.com/ethereum-optimism/optimism/op-service/txmgr" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/crypto" + "github.com/urfave/cli/v2" + "gorm.io/driver/mysql" + "gorm.io/gorm" + "gorm.io/gorm/logger" + "github.com/taikoxyz/taiko-mono/packages/relayer/cmd/flags" "github.com/taikoxyz/taiko-mono/packages/relayer/pkg/db" pkgFlags "github.com/taikoxyz/taiko-mono/packages/relayer/pkg/flags" "github.com/taikoxyz/taiko-mono/packages/relayer/pkg/queue" "github.com/taikoxyz/taiko-mono/packages/relayer/pkg/queue/rabbitmq" - "github.com/urfave/cli/v2" - "gorm.io/driver/mysql" - "gorm.io/gorm" - "gorm.io/gorm/logger" ) // hopConfig is a config struct that must be provided for an individual @@ -76,7 +77,7 @@ type Config struct { DestRPCUrl string ETHClientTimeout uint64 OpenQueueFunc func() (queue.Queue, error) - OpenDBFunc func() (DB, error) + OpenDBFunc func() (db.DB, error) hopConfigs []hopConfig @@ -86,6 +87,7 @@ type Config struct { TxmgrConfigs *txmgr.CLIConfig MaxMessageRetries uint64 + MinFeeToProcess uint64 } // NewConfigFromCliContext creates a new config instance from command line flags. @@ -176,7 +178,8 @@ func NewConfigFromCliContext(c *cli.Context) (*Config, error) { c, ), MaxMessageRetries: c.Uint64(flags.MaxMessageRetries.Name), - OpenDBFunc: func() (DB, error) { + MinFeeToProcess: c.Uint64(flags.MinFeeToProcess.Name), + OpenDBFunc: func() (db.DB, error) { return db.OpenDBConnection(db.DBConnectionOpts{ Name: c.String(flags.DatabaseUsername.Name), Password: c.String(flags.DatabasePassword.Name), @@ -185,7 +188,7 @@ func NewConfigFromCliContext(c *cli.Context) (*Config, error) { MaxIdleConns: c.Uint64(flags.DatabaseMaxIdleConns.Name), MaxOpenConns: c.Uint64(flags.DatabaseMaxOpenConns.Name), MaxConnLifetime: c.Uint64(flags.DatabaseConnMaxLifetime.Name), - OpenFunc: func(dsn string) (*db.DB, error) { + OpenFunc: func(dsn string) (db.DB, error) { gormDB, err := gorm.Open(mysql.Open(dsn), &gorm.Config{ Logger: logger.Default.LogMode(logger.Silent), }) diff --git a/packages/relayer/processor/config_test.go b/packages/relayer/processor/config_test.go index 63e5c8191a3..b9f6ebd8df5 100644 --- a/packages/relayer/processor/config_test.go +++ b/packages/relayer/processor/config_test.go @@ -5,10 +5,12 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/stretchr/testify/assert" + "github.com/urfave/cli/v2" + "github.com/taikoxyz/taiko-mono/packages/relayer/cmd/flags" + "github.com/taikoxyz/taiko-mono/packages/relayer/pkg/db" "github.com/taikoxyz/taiko-mono/packages/relayer/pkg/mock" "github.com/taikoxyz/taiko-mono/packages/relayer/pkg/queue" - "github.com/urfave/cli/v2" ) var ( @@ -71,7 +73,7 @@ func TestNewConfigFromCliContext(t *testing.T) { assert.Equal(t, uint64(100), c.QueuePrefetch) assert.Equal(t, true, c.EnableTaikoL2) - c.OpenDBFunc = func() (DB, error) { + c.OpenDBFunc = func() (db.DB, error) { return &mock.DB{}, nil } diff --git a/packages/relayer/processor/is_profitable.go b/packages/relayer/processor/is_profitable.go index 62d91e875cb..f4081a88220 100644 --- a/packages/relayer/processor/is_profitable.go +++ b/packages/relayer/processor/is_profitable.go @@ -2,8 +2,8 @@ package processor import ( "context" - "log/slog" + "time" "github.com/pkg/errors" "github.com/taikoxyz/taiko-mono/packages/relayer" @@ -18,6 +18,7 @@ var ( // profitable. Otherwise, we compare it to the estimated cost. func (p *Processor) isProfitable( ctx context.Context, + id int, fee uint64, gasLimit uint64, destChainBaseFee uint64, @@ -34,9 +35,9 @@ func (p *Processor) isProfitable( return shouldProcess, errImpossible } - // if processing fee is higher than baseFee * gasLimit, + // if processing fee is higher than baseFee * 2 +gasTipCap + gasLimit, // we should process. - estimatedOnchainFee := (destChainBaseFee + gasTipCap) * uint64(gasLimit) + estimatedOnchainFee := ((destChainBaseFee * 2) + gasTipCap) * uint64(gasLimit) if fee > estimatedOnchainFee { shouldProcess = true } @@ -44,11 +45,26 @@ func (p *Processor) isProfitable( slog.Info("isProfitable", "processingFee", fee, "destChainBaseFee", destChainBaseFee, + "gasTipCap", gasTipCap, "gasLimit", gasLimit, "shouldProcess", shouldProcess, "estimatedOnchainFee", estimatedOnchainFee, ) + opts := relayer.UpdateFeesAndProfitabilityOpts{ + Fee: fee, + DestChainBaseFee: destChainBaseFee, + GasTipCap: gasTipCap, + GasLimit: gasLimit, + IsProfitable: shouldProcess, + EstimatedOnchainFee: estimatedOnchainFee, + IsProfitableEvaluatedAt: time.Now().UTC(), + } + + if err := p.eventRepo.UpdateFeesAndProfitability(ctx, id, &opts); err != nil { + slog.Error("failed to update event", "error", err) + } + if !shouldProcess { relayer.UnprofitableMessagesDetected.Inc() diff --git a/packages/relayer/processor/is_profitable_test.go b/packages/relayer/processor/is_profitable_test.go index 639118eac7a..f4e942999ba 100644 --- a/packages/relayer/processor/is_profitable_test.go +++ b/packages/relayer/processor/is_profitable_test.go @@ -11,6 +11,7 @@ func Test_isProfitable(t *testing.T) { p := newTestProcessor(true) tests := []struct { + id int name string fee uint64 gasLimit uint64 @@ -20,6 +21,7 @@ func Test_isProfitable(t *testing.T) { wantErr error }{ { + 0, "zeroProcessingFee", 0, 1, @@ -29,8 +31,9 @@ func Test_isProfitable(t *testing.T) { errImpossible, }, { + 1, "profitable", - 600000000600001, + 7000000000600001, 600000, 1000000000, 1, @@ -38,6 +41,7 @@ func Test_isProfitable(t *testing.T) { nil, }, { + 2, "unprofitable", 590000000600000, 600000, @@ -52,6 +56,7 @@ func Test_isProfitable(t *testing.T) { t.Run(tt.name, func(t *testing.T) { profitable, err := p.isProfitable( context.Background(), + tt.id, tt.fee, tt.gasLimit, tt.baseFee, diff --git a/packages/relayer/processor/process_message.go b/packages/relayer/processor/process_message.go index 6022b80ca87..d5921fa57f4 100644 --- a/packages/relayer/processor/process_message.go +++ b/packages/relayer/processor/process_message.go @@ -6,6 +6,7 @@ import ( "encoding/json" "fmt" "log/slog" + "math" "math/big" "strings" "time" @@ -69,6 +70,12 @@ func (p *Processor) processMessage( return false, 0, errors.Wrap(err, "json.Unmarshal") } + if msgBody.Event == nil { + slog.Warn("empty msgBody", "id", msgBody.ID) + + return false, 0, errors.New("empty message body") + } + slog.Info("message received", "srcTxHash", msgBody.Event.Raw.TxHash.Hex()) // check if we already processing this hash @@ -104,10 +111,19 @@ func (p *Processor) processMessage( return false, msgBody.TimesRetried, nil } - if err := p.waitForConfirmations(ctx, msgBody.Event.Raw.TxHash, msgBody.Event.Raw.BlockNumber); err != nil { - return false, msgBody.TimesRetried, err + // we never want to process messages below a certain fee, if set. + // return a nil error, and we will successfully acknowledge this. + if p.minFeeToProcess != 0 && msgBody.Event.Message.Fee < p.minFeeToProcess { + slog.Warn("minFeeToProcess not met", + "minFeeToProcess", p.minFeeToProcess, + "fee", msgBody.Event.Message.Fee, + "srcTxHash", msgBody.Event.Raw.TxHash.Hex(), + ) + + return false, msgBody.TimesRetried, nil } + // check message process eligibility before waiting for confirmations to process eventStatus, err := p.eventStatusFromMsgHash(ctx, msgBody.Event.MsgHash) if err != nil { return false, msgBody.TimesRetried, errors.Wrap(err, "p.eventStatusFromMsgHash") @@ -123,6 +139,10 @@ func (p *Processor) processMessage( return false, msgBody.TimesRetried, nil } + if err := p.waitForConfirmations(ctx, msgBody.Event.Raw.TxHash); err != nil { + return false, msgBody.TimesRetried, err + } + // check paused status paused, err := p.destBridge.Paused(&bind.CallOpts{ Context: ctx, @@ -182,7 +202,7 @@ func (p *Processor) processMessage( return false, msgBody.TimesRetried, err } - _, err = p.sendProcessMessageCall(ctx, msgBody.Event, encodedSignalProof) + _, err = p.sendProcessMessageCall(ctx, msgBody.ID, msgBody.Event, encodedSignalProof) if err != nil { return false, msgBody.TimesRetried, err } @@ -237,18 +257,12 @@ func (p *Processor) generateEncodedSignalProof(ctx context.Context, var hopChainID *big.Int for _, hop := range p.hops { - hop.blockNum = blockNum - event, err := p.waitHeaderSynced(ctx, hopEthClient, hop.chainID.Uint64(), blockNum) if err != nil { return nil, errors.Wrap(err, "p.waitHeaderSynced") } - if err != nil { - return nil, errors.Wrap(err, "hop.headerSyncer.GetSyncedSnippet") - } - blockNum = event.SyncedInBlockID hopEthClient = hop.ethClient @@ -384,9 +398,12 @@ func (p *Processor) generateEncodedSignalProof(ctx context.Context, // after estimating gas, and checking profitability. func (p *Processor) sendProcessMessageCall( ctx context.Context, + id int, event *bridge.BridgeMessageSent, proof []byte, ) (*types.Receipt, error) { + defer p.logRelayerBalance(ctx) + received, err := p.destBridge.IsMessageReceived(nil, event.Message, proof) if err != nil { return nil, err @@ -419,14 +436,27 @@ func (p *Processor) sendProcessMessageCall( return nil, err } - // mul by 1.05 for padding - gasLimit := uint64(float64(event.Message.GasLimit) * 1.05) + gasLimit := uint64(float64(event.Message.GasLimit)) + + // if destination address is a contract, add padding. check message.to + // to see if it is a contract address. + code, err := p.destEthClient.CodeAt(ctx, event.Message.To, nil) + if err != nil { + return nil, err + } + + if len(code) != 0 { + gasLimit = uint64(float64(gasLimit) * 1.1) + } else { + gasLimit = uint64(float64(gasLimit) * 1.05) + } - var estimatedCost uint64 = 0 + var estimatedMaxCost uint64 if bool(p.profitableOnly) { profitable, err := p.isProfitable( ctx, + id, event.Message.Fee, gasLimit, baseFee.Uint64(), @@ -439,9 +469,8 @@ func (p *Processor) sendProcessMessageCall( return nil, relayer.ErrUnprofitable } - // now simulate the transaction and lets confirm - // it is profitable + // now simulate the transaction and lets confirm it is profitable auth, err := bind.NewKeyedTransactorWithChainID(p.ecdsaKey, p.destChainId) if err != nil { return nil, err @@ -469,7 +498,7 @@ func (p *Processor) sendProcessMessageCall( return nil, relayer.ErrUnprofitable } - estimatedCost = gasUsed * (baseFee.Uint64() + gasTipCap.Uint64()) + estimatedMaxCost = gasUsed * ((baseFee.Uint64() * 2) + gasTipCap.Uint64()) } // we should check event status one more time, after we have waiting for @@ -489,7 +518,6 @@ func (p *Processor) sendProcessMessageCall( uint64(event.Message.GasLimit), ) { slog.Error("can not process message after waiting for confirmations", "err", errUnprocessable) - return nil, errUnprocessable } @@ -528,10 +556,10 @@ func (p *Processor) sendProcessMessageCall( slog.Info("tx cost", "txHash", hex.EncodeToString(receipt.TxHash.Bytes()), "srcTxHash", event.Raw.TxHash.Hex(), "actualCost", cost, - "estimatedCost", estimatedCost, + "estimatedMaxCost", estimatedMaxCost, ) - if cost > estimatedCost { + if cost > estimatedMaxCost { relayer.UnprofitableMessageAfterTransacting.Inc() } else { relayer.ProfitableMessageAfterTransacting.Inc() @@ -545,6 +573,29 @@ func (p *Processor) sendProcessMessageCall( return receipt, nil } +// retrieve the balance of the relayer and set Prometheus +func (p *Processor) logRelayerBalance(ctx context.Context) { + balance, err := p.destEthClient.BalanceAt(ctx, p.relayerAddr, nil) + if err != nil { + slog.Warn("Failed to retrieve relayer balance", "error", err) + return + } + + balanceFloat := new(big.Float).SetInt(balance) + balanceEth := new(big.Float).Quo( + balanceFloat, + big.NewFloat(math.Pow10(18)), + ) + + slog.Info("Relayer balance", + "relayerAddress", p.relayerAddr, + "balance", balanceEth.Text('f', 18), + ) + + balanceEthFloat, _ := balanceEth.Float64() + relayer.RelayerKeyBalanceGauge.Set(balanceEthFloat) +} + // saveMessageStatusChangedEvent writes the MessageStatusChanged event to the // database after a message is processed func (p *Processor) saveMessageStatusChangedEvent( @@ -575,7 +626,7 @@ func (p *Processor) saveMessageStatusChangedEvent( // keep same format as other raw events data := fmt.Sprintf(`{"Raw":{"transactionHash": "%v"}}`, receipt.TxHash.Hex()) - _, err = p.eventRepo.Save(ctx, relayer.SaveEventOpts{ + _, err = p.eventRepo.Save(ctx, &relayer.SaveEventOpts{ Name: relayer.EventNameMessageStatusChanged, Data: data, EmittedBlockID: event.Raw.BlockNumber, diff --git a/packages/relayer/processor/process_message_test.go b/packages/relayer/processor/process_message_test.go index 114a17e7635..704f541b3a5 100644 --- a/packages/relayer/processor/process_message_test.go +++ b/packages/relayer/processor/process_message_test.go @@ -20,6 +20,7 @@ func Test_sendProcessMessageCall(t *testing.T) { _, err := p.sendProcessMessageCall( context.Background(), + 1, &bridge.BridgeMessageSent{ Message: bridge.IBridgeMessage{ Id: 1, diff --git a/packages/relayer/processor/processor.go b/packages/relayer/processor/processor.go index b36c6191b9b..d0f550caf83 100644 --- a/packages/relayer/processor/processor.go +++ b/packages/relayer/processor/processor.go @@ -3,16 +3,19 @@ package processor import ( "context" "crypto/ecdsa" - "database/sql" + "encoding/json" "errors" "fmt" "log/slog" "math/big" "os" + "strings" "sync" "time" "github.com/cenkalti/backoff/v4" + "github.com/ethereum-optimism/optimism/op-service/txmgr" + txmgrMetrics "github.com/ethereum-optimism/optimism/op-service/txmgr/metrics" "github.com/ethereum/go-ethereum" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" @@ -21,10 +24,7 @@ import ( "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/rpc" "github.com/urfave/cli/v2" - "gorm.io/gorm" - "github.com/ethereum-optimism/optimism/op-service/txmgr" - txmgrMetrics "github.com/ethereum-optimism/optimism/op-service/txmgr/metrics" "github.com/taikoxyz/taiko-mono/packages/relayer" "github.com/taikoxyz/taiko-mono/packages/relayer/bindings/bridge" "github.com/taikoxyz/taiko-mono/packages/relayer/bindings/erc1155vault" @@ -39,11 +39,6 @@ import ( "github.com/taikoxyz/taiko-mono/packages/relayer/pkg/utils" ) -type DB interface { - DB() (*sql.DB, error) - GormDB() *gorm.DB -} - // ethClient is a slimmed down interface of a go-ethereum ethclient.Client // we can use for mocking and testing type ethClient interface { @@ -58,6 +53,8 @@ type ethClient interface { ChainID(ctx context.Context) (*big.Int, error) SubscribeNewHead(ctx context.Context, ch chan<- *types.Header) (ethereum.Subscription, error) EstimateGas(ctx context.Context, msg ethereum.CallMsg) (uint64, error) + BalanceAt(ctx context.Context, account common.Address, blockNumber *big.Int) (*big.Int, error) + CodeAt(ctx context.Context, account common.Address, blockNumber *big.Int) ([]byte, error) } // hop is a struct which needs to be created based on the config parameters @@ -70,7 +67,6 @@ type hop struct { taikoAddress common.Address ethClient ethClient caller relayer.Caller - blockNum uint64 } // Processor is the main struct which handles message processing and queue @@ -100,8 +96,6 @@ type Processor struct { prover *proof.Prover - mu *sync.Mutex - relayerAddr common.Address srcSignalServiceAddress common.Address @@ -118,7 +112,7 @@ type Processor struct { msgCh chan queue.Message - wg *sync.WaitGroup + wg sync.WaitGroup srcChainId *big.Int destChainId *big.Int @@ -134,7 +128,9 @@ type Processor struct { maxMessageRetries uint64 processingTxHashes map[common.Hash]bool - processingTxHashMu *sync.Mutex + processingTxHashMu sync.Mutex + + minFeeToProcess uint64 } // InitFromCli creates a new processor from a cli context @@ -360,8 +356,6 @@ func InitFromConfig(ctx context.Context, p *Processor, cfg *Config) error { p.srcSignalServiceAddress = cfg.SrcSignalServiceAddress p.msgCh = make(chan queue.Message) - p.wg = &sync.WaitGroup{} - p.mu = &sync.Mutex{} p.srcCaller = srcRpcClient p.backOffRetryInterval = time.Duration(cfg.BackoffRetryInterval) * time.Second @@ -373,7 +367,10 @@ func InitFromConfig(ctx context.Context, p *Processor, cfg *Config) error { p.maxMessageRetries = cfg.MaxMessageRetries p.processingTxHashes = make(map[common.Hash]bool, 0) - p.processingTxHashMu = &sync.Mutex{} + + p.minFeeToProcess = p.cfg.MinFeeToProcess + + slog.Info("minFeeToProcess", "minFeeToProcess", p.minFeeToProcess) return nil } @@ -386,6 +383,11 @@ func (p *Processor) Close(ctx context.Context) { p.cancel() p.wg.Wait() + + // Close db connection. + if err := p.eventRepo.Close(); err != nil { + slog.Error("Failed to close db connection", "err", err) + } } func (p *Processor) Start() error { @@ -415,7 +417,7 @@ func (p *Processor) Start() error { go func() { if err := backoff.Retry(func() error { slog.Info("attempting backoff queue subscription") - if err := p.queue.Subscribe(ctx, p.msgCh, p.wg); err != nil { + if err := p.queue.Subscribe(ctx, p.msgCh, &p.wg); err != nil { slog.Error("processor queue subscription error", "err", err.Error()) return err } @@ -426,13 +428,11 @@ func (p *Processor) Start() error { } }() - p.wg.Add(1) - go p.eventLoop(ctx) go func() { if err := backoff.Retry(func() error { - return utils.ScanBlocks(ctx, p.srcEthClient, p.wg) + return utils.ScanBlocks(ctx, p.srcEthClient, &p.wg) }, backoff.NewConstantBackOff(5*time.Second)); err != nil { slog.Error("scan blocks backoff retry", "error", err) } @@ -448,9 +448,8 @@ func (p *Processor) queueName() string { // eventLoop is the main event loop of a Processor which should read // messages from a queue and then process them. func (p *Processor) eventLoop(ctx context.Context) { - defer func() { - p.wg.Done() - }() + p.wg.Add(1) + defer p.wg.Done() for { select { @@ -488,14 +487,14 @@ func (p *Processor) eventLoop(ctx context.Context) { if err := p.queue.Ack(ctx, m); err != nil { slog.Error("Err acking message", "err", err.Error()) } - case errors.Is(err, context.Canceled): - slog.Error("process message failed due to context cancel", "err", err.Error()) - - // we want to negatively acknowledge the message and make sure - // we requeue it - if err := p.queue.Nack(ctx, m, true); err != nil { - slog.Error("Err nacking message", "err", err.Error()) - } + case errors.Is(err, context.Canceled) || + strings.Contains(err.Error(), "timeout") || + strings.Contains(err.Error(), "i/o") || + strings.Contains(err.Error(), "connect") || + strings.Contains(err.Error(), "failed to get tx into the mempool"): + // we want to do nothing, just log, and the message will be re-picked up + // by another consumer. no need to nack or ack. + slog.Error("process message failed", "err", err.Error()) default: slog.Error("process message failed", "err", err.Error()) @@ -510,11 +509,19 @@ func (p *Processor) eventLoop(ctx context.Context) { } if shouldRequeue { - // we want to negatively acknowledge the message and make sure - // we requeue it + // we want to negatively acknowledge the message if err := p.queue.Nack(ctx, m, true); err != nil { slog.Error("Err nacking message", "err", err.Error()) } + + marshalledMsg, err := json.Marshal(msg) + if err != nil { + slog.Error("err marshaling queue message", "err", err.Error()) + } else { + if err := p.queue.Publish(ctx, p.queueName(), marshalledMsg, nil, nil); err != nil { + slog.Error("err publishing to queue", "err", err.Error()) + } + } } else { // otherwise if no error, we can acknowledge it successfully. if err := p.queue.Ack(ctx, m); err != nil { diff --git a/packages/relayer/processor/processor_test.go b/packages/relayer/processor/processor_test.go index 5b4582c1a39..2eb87863ea8 100644 --- a/packages/relayer/processor/processor_test.go +++ b/packages/relayer/processor/processor_test.go @@ -1,7 +1,6 @@ package processor import ( - "sync" "time" "github.com/ethereum/go-ethereum/common" @@ -28,7 +27,6 @@ func newTestProcessor(profitableOnly bool) *Processor { destEthClient: &mock.EthClient{}, destERC20Vault: &mock.TokenVault{}, srcSignalService: &mock.SignalService{}, - mu: &sync.Mutex{}, ecdsaKey: privateKey, prover: prover, srcCaller: &mock.Caller{}, @@ -49,6 +47,5 @@ func newTestProcessor(profitableOnly bool) *Processor { maxMessageRetries: 5, destQuotaManager: &mock.QuotaManager{}, processingTxHashes: make(map[common.Hash]bool, 0), - processingTxHashMu: &sync.Mutex{}, } } diff --git a/packages/relayer/processor/wait_for_confirmations.go b/packages/relayer/processor/wait_for_confirmations.go index df2ecf981fa..d6fdfcadb97 100644 --- a/packages/relayer/processor/wait_for_confirmations.go +++ b/packages/relayer/processor/wait_for_confirmations.go @@ -10,7 +10,7 @@ import ( // waitForConfirmations waits for the given transaction to reach N confs // before returning -func (p *Processor) waitForConfirmations(ctx context.Context, txHash common.Hash, blockNumber uint64) error { +func (p *Processor) waitForConfirmations(ctx context.Context, txHash common.Hash) error { ctx, cancelFunc := context.WithTimeout(ctx, time.Duration(p.confTimeoutInSeconds)*time.Second) defer cancelFunc() diff --git a/packages/relayer/processor/wait_for_confirmations_test.go b/packages/relayer/processor/wait_for_confirmations_test.go index c787dd00263..ec26d5ce0a3 100644 --- a/packages/relayer/processor/wait_for_confirmations_test.go +++ b/packages/relayer/processor/wait_for_confirmations_test.go @@ -11,6 +11,6 @@ import ( func Test_waitForConfirmations(t *testing.T) { p := newTestProcessor(true) - err := p.waitForConfirmations(context.TODO(), mock.SucceedTxHash, uint64(mock.BlockNum)) + err := p.waitForConfirmations(context.TODO(), mock.SucceedTxHash) assert.Nil(t, err) } diff --git a/packages/relayer/processor/wait_header_synced.go b/packages/relayer/processor/wait_header_synced.go index 47acae12baf..6e957f55e75 100644 --- a/packages/relayer/processor/wait_header_synced.go +++ b/packages/relayer/processor/wait_header_synced.go @@ -8,7 +8,7 @@ import ( "github.com/taikoxyz/taiko-mono/packages/relayer" ) -// waitHeaderSynced waits for a event to appear in the database from the indexer +// waitHeaderSynced waits for an event to appear in the database from the indexer // for the type "ChainDataSynced" to be greater or less than the given blockNum. // this is used to make sure a valid proof can be generated and verified on chain. func (p *Processor) waitHeaderSynced( diff --git a/packages/relayer/prometheus.go b/packages/relayer/prometheus.go index 80cafab8db6..a586bd84c2d 100644 --- a/packages/relayer/prometheus.go +++ b/packages/relayer/prometheus.go @@ -130,4 +130,24 @@ var ( Name: "unprofitable_message_after_transacting_ops_total", Help: "The total number of processed events that ended up unprofitable", }) + MessageSentEventsAfterRetryErrorCount = promauto.NewCounter(prometheus.CounterOpts{ + Name: "message_sent_events_after_retry_error_count", + Help: "The total number of errors logged for MessageSent events after retries", + }) + MessageStatusChangedEventsAfterRetryErrorCount = promauto.NewCounter(prometheus.CounterOpts{ + Name: "message_status_changed_events_after_retry_error_count", + Help: "The total number of errors logged for MessageStatusChanged events after retries", + }) + ChainDataSyncedEventsAfterRetryErrorCount = promauto.NewCounter(prometheus.CounterOpts{ + Name: "chain_data_synced_events_after_retry_error_count", + Help: "The total number of errors logged for ChainDataSynced events after retries", + }) + MessageProcessedEventsAfterRetryErrorCount = promauto.NewCounter(prometheus.CounterOpts{ + Name: "message_processed_events_after_retry_error_count", + Help: "The total number of errors logged for MessageProcessed events after retries", + }) + RelayerKeyBalanceGauge = promauto.NewGauge(prometheus.GaugeOpts{ + Name: "relayer_key_balance", + Help: "Current balance of the relayer key", + }) ) diff --git a/packages/relayer/scripts/abigen.sh b/packages/relayer/scripts/abigen.sh index 2a25191ffee..57aab341fcb 100755 --- a/packages/relayer/scripts/abigen.sh +++ b/packages/relayer/scripts/abigen.sh @@ -1,4 +1,4 @@ -#/bin/sh +#!/bin/sh if [ ! -d "../protocol/out" ]; then echo "ABI not generated in protocol package yet. Please run npm install && npx hardhat compile in ../protocol" @@ -11,9 +11,9 @@ names=("ERC1155Vault" "ERC721Vault" "ERC20Vault" "Bridge" "TaikoL2" "TaikoL1" "S for (( i = 0; i < ${#paths[@]}; ++i )); do - jq .abi ../protocol/out/${paths[i]}/${names[i]}.json > ${names[i]}.json lower=$(echo "${names[i]}" | tr '[:upper:]' '[:lower:]') - abigen --abi ${names[i]}.json \ + jq .abi ../protocol/out/${paths[i]}/${names[i]}.json > bindings/$lower/${names[i]}.json + abigen --abi bindings/$lower/${names[i]}.json \ --pkg $lower \ --type ${names[i]} \ --out bindings/$lower/${names[i]}.go diff --git a/packages/relayer/scripts/swagger.sh b/packages/relayer/scripts/swagger.sh index 2ba0cac2c3a..3a45b8beaac 100755 --- a/packages/relayer/scripts/swagger.sh +++ b/packages/relayer/scripts/swagger.sh @@ -1,3 +1,3 @@ -#/bin/sh +#!/bin/sh -swag init -g server.go -d pkg/http --parseDependency \ No newline at end of file +swag init -g server.go -d pkg/http --parseDependency diff --git a/packages/relayer/types.go b/packages/relayer/types.go index 83a1532ca66..657d22d63d9 100644 --- a/packages/relayer/types.go +++ b/packages/relayer/types.go @@ -6,6 +6,7 @@ import ( "fmt" "math/big" "time" + "unicode/utf8" "log/slog" @@ -21,17 +22,6 @@ var ( ZeroAddress = common.HexToAddress("0x0000000000000000000000000000000000000000") ) -// IsInSlice determines whether v is in slice s -func IsInSlice[T comparable](v T, s []T) bool { - for _, e := range s { - if v == e { - return true - } - } - - return false -} - type confirmer interface { TransactionReceipt(ctx context.Context, txHash common.Hash) (*types.Receipt, error) BlockNumber(ctx context.Context) (uint64, error) @@ -155,7 +145,20 @@ func decodeDataAsERC20(decodedData []byte) (CanonicalToken, *big.Int, error) { return token, big.NewInt(0), errors.New("data for BigInt is invalid") } - canonicalTokenData := decodedData[offset.Int64()+canonicalTokenDataStartingindex*32:] + // Calculate the starting index for canonicalTokenData + startIndex := offset.Int64() + canonicalTokenDataStartingindex*32 + + // Boundary check + if startIndex >= int64(len(decodedData)) || startIndex < 0 { + slog.Warn("startIndex greater than decodedData length", + "startIndex", startIndex, + "lenDecodedData", int64(len(decodedData)), + ) + + return token, big.NewInt(0), errors.New("calculated index is out of bounds") + } + + canonicalTokenData := decodedData[startIndex:] types := []string{"uint64", "address", "uint8", "string", "string"} values, err := decodeABI(types, canonicalTokenData) @@ -164,11 +167,37 @@ func decodeDataAsERC20(decodedData []byte) (CanonicalToken, *big.Int, error) { return token, big.NewInt(0), err } - token.ChainId = values[0].(uint64) - token.Addr = values[1].(common.Address) - token.Decimals = uint8(values[2].(uint8)) - token.Symbol = values[3].(string) - token.Name = values[4].(string) + // Type assertions and validations + chainId, ok := values[0].(uint64) + if !ok { + return token, big.NewInt(0), errors.New("invalid chainId type") + } + + addr, ok := values[1].(common.Address) + if !ok { + return token, big.NewInt(0), errors.New("invalid address type") + } + + decimals, ok := values[2].(uint8) + if !ok { + return token, big.NewInt(0), errors.New("invalid decimals type") + } + + symbol, ok := values[3].(string) + if !ok || !utf8.ValidString(symbol) { + return token, big.NewInt(0), errors.New("invalid symbol string") + } + + name, ok := values[4].(string) + if !ok || !utf8.ValidString(name) { + return token, big.NewInt(0), errors.New("invalid name string") + } + + token.ChainId = chainId + token.Addr = addr + token.Decimals = decimals + token.Symbol = symbol + token.Name = name amount, ok := new(big.Int).SetString(common.Bytes2Hex((chunks[canonicalTokenDataStartingindex+3])), 16) if !ok { @@ -190,7 +219,20 @@ func decodeDataAsNFT(decodedData []byte) (EventType, CanonicalToken, *big.Int, e return EventTypeSendETH, token, big.NewInt(0), errors.New("data for BigInt is invalid") } - canonicalTokenData := decodedData[offset.Int64()+canonicalTokenDataStartingindex*32:] + // Calculate the starting index for canonicalTokenData + startIndex := offset.Int64() + canonicalTokenDataStartingindex*32 + + // Boundary check + if startIndex >= int64(len(decodedData)) || startIndex < 0 { + slog.Warn("startIndex greater than decodedData length", + "startIndex", startIndex, + "lenDecodedData", int64(len(decodedData)), + ) + + return EventTypeSendETH, token, big.NewInt(0), errors.New("calculated index is out of bounds") + } + + canonicalTokenData := decodedData[startIndex:] types := []string{"uint64", "address", "string", "string"} values, err := decodeABI(types, canonicalTokenData) @@ -199,10 +241,31 @@ func decodeDataAsNFT(decodedData []byte) (EventType, CanonicalToken, *big.Int, e return EventTypeSendETH, token, big.NewInt(0), err } - token.ChainId = values[0].(uint64) - token.Addr = values[1].(common.Address) - token.Symbol = values[2].(string) - token.Name = values[3].(string) + // Type assertions and validations + chainId, ok := values[0].(uint64) + if !ok { + return EventTypeSendETH, token, big.NewInt(0), errors.New("invalid chainId type") + } + + addr, ok := values[1].(common.Address) + if !ok { + return EventTypeSendETH, token, big.NewInt(0), errors.New("invalid address type") + } + + symbol, ok := values[2].(string) + if !ok || !utf8.ValidString(symbol) { + return EventTypeSendETH, token, big.NewInt(0), errors.New("invalid symbol string") + } + + name, ok := values[3].(string) + if !ok || !utf8.ValidString(name) { + return EventTypeSendETH, token, big.NewInt(0), errors.New("invalid name string") + } + + token.ChainId = chainId + token.Addr = addr + token.Symbol = symbol + token.Name = name if offset.Int64() == 128 { amount := big.NewInt(1) diff --git a/packages/relayer/types_test.go b/packages/relayer/types_test.go index 0444a7d7148..069f1229512 100644 --- a/packages/relayer/types_test.go +++ b/packages/relayer/types_test.go @@ -13,16 +13,6 @@ import ( "github.com/stretchr/testify/assert" ) -func Test_IsInSlice(t *testing.T) { - if IsInSlice("fake", []string{}) { - t.Fatal() - } - - if !IsInSlice("real", []string{"real"}) { - t.Fatal() - } -} - type mockConfirmer struct { } diff --git a/packages/relayer/watchdog/config.go b/packages/relayer/watchdog/config.go index cbb91160b3d..b73fb9af15f 100644 --- a/packages/relayer/watchdog/config.go +++ b/packages/relayer/watchdog/config.go @@ -55,7 +55,7 @@ type Config struct { DestRPCUrl string ETHClientTimeout uint64 OpenQueueFunc func() (queue.Queue, error) - OpenDBFunc func() (DB, error) + OpenDBFunc func() (db.DB, error) SrcTxmgrConfigs *txmgr.CLIConfig DestTxmgrConfigs *txmgr.CLIConfig @@ -94,7 +94,7 @@ func NewConfigFromCliContext(c *cli.Context) (*Config, error) { BackoffRetryInterval: c.Uint64(flags.BackOffRetryInterval.Name), BackOffMaxRetrys: c.Uint64(flags.BackOffMaxRetrys.Name), ETHClientTimeout: c.Uint64(flags.ETHClientTimeout.Name), - OpenDBFunc: func() (DB, error) { + OpenDBFunc: func() (db.DB, error) { return db.OpenDBConnection(db.DBConnectionOpts{ Name: c.String(flags.DatabaseUsername.Name), Password: c.String(flags.DatabasePassword.Name), @@ -103,7 +103,7 @@ func NewConfigFromCliContext(c *cli.Context) (*Config, error) { MaxIdleConns: c.Uint64(flags.DatabaseMaxIdleConns.Name), MaxOpenConns: c.Uint64(flags.DatabaseMaxOpenConns.Name), MaxConnLifetime: c.Uint64(flags.DatabaseConnMaxLifetime.Name), - OpenFunc: func(dsn string) (*db.DB, error) { + OpenFunc: func(dsn string) (db.DB, error) { gormDB, err := gorm.Open(mysql.Open(dsn), &gorm.Config{ Logger: logger.Default.LogMode(logger.Silent), }) diff --git a/packages/relayer/watchdog/config_test.go b/packages/relayer/watchdog/config_test.go index 29f93142b99..727d24a8a12 100644 --- a/packages/relayer/watchdog/config_test.go +++ b/packages/relayer/watchdog/config_test.go @@ -5,10 +5,12 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/stretchr/testify/assert" + "github.com/urfave/cli/v2" + "github.com/taikoxyz/taiko-mono/packages/relayer/cmd/flags" + "github.com/taikoxyz/taiko-mono/packages/relayer/pkg/db" "github.com/taikoxyz/taiko-mono/packages/relayer/pkg/mock" "github.com/taikoxyz/taiko-mono/packages/relayer/pkg/queue" - "github.com/urfave/cli/v2" ) var ( @@ -64,7 +66,7 @@ func TestNewConfigFromCliContext(t *testing.T) { assert.Equal(t, uint64(10), c.ETHClientTimeout) assert.Equal(t, uint64(100), c.QueuePrefetch) - c.OpenDBFunc = func() (DB, error) { + c.OpenDBFunc = func() (db.DB, error) { return &mock.DB{}, nil } diff --git a/packages/relayer/watchdog/watchdog.go b/packages/relayer/watchdog/watchdog.go index 8de4f9df6c5..36ed241793f 100644 --- a/packages/relayer/watchdog/watchdog.go +++ b/packages/relayer/watchdog/watchdog.go @@ -3,7 +3,6 @@ package watchdog import ( "context" "crypto/ecdsa" - "database/sql" "encoding/json" "fmt" "log/slog" @@ -14,6 +13,7 @@ import ( "github.com/cenkalti/backoff/v4" "github.com/cyberhorsey/errors" "github.com/ethereum-optimism/optimism/op-service/txmgr" + txmgrMetrics "github.com/ethereum-optimism/optimism/op-service/txmgr/metrics" "github.com/ethereum/go-ethereum" "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" @@ -21,23 +21,15 @@ import ( "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/ethclient" "github.com/ethereum/go-ethereum/log" - "github.com/urfave/cli/v2" - "gorm.io/gorm" - - txmgrMetrics "github.com/ethereum-optimism/optimism/op-service/txmgr/metrics" "github.com/taikoxyz/taiko-mono/packages/relayer" "github.com/taikoxyz/taiko-mono/packages/relayer/bindings/bridge" "github.com/taikoxyz/taiko-mono/packages/relayer/pkg/encoding" "github.com/taikoxyz/taiko-mono/packages/relayer/pkg/queue" "github.com/taikoxyz/taiko-mono/packages/relayer/pkg/repo" "github.com/taikoxyz/taiko-mono/packages/relayer/pkg/utils" + "github.com/urfave/cli/v2" ) -type DB interface { - DB() (*sql.DB, error) - GormDB() *gorm.DB -} - type ethClient interface { PendingNonceAt(ctx context.Context, account common.Address) (uint64, error) TransactionReceipt(ctx context.Context, txHash common.Hash) (*types.Receipt, error) @@ -66,8 +58,6 @@ type Watchdog struct { srcBridge relayer.Bridge destBridge relayer.Bridge - mu *sync.Mutex - watchdogAddr common.Address confirmations uint64 @@ -80,7 +70,7 @@ type Watchdog struct { msgCh chan queue.Message - wg *sync.WaitGroup + wg sync.WaitGroup srcChainId *big.Int destChainId *big.Int @@ -194,8 +184,6 @@ func InitFromConfig(ctx context.Context, w *Watchdog, cfg *Config) error { w.confirmations = cfg.Confirmations w.msgCh = make(chan queue.Message) - w.wg = &sync.WaitGroup{} - w.mu = &sync.Mutex{} w.backOffRetryInterval = time.Duration(cfg.BackoffRetryInterval) * time.Second w.backOffMaxRetries = cfg.BackOffMaxRetrys @@ -214,6 +202,11 @@ func (w *Watchdog) Close(ctx context.Context) { w.cancel() w.wg.Wait() + + // Close db connection. + if err := w.eventRepo.Close(); err != nil { + slog.Error("Failed to close db connection", "err", err) + } } func (w *Watchdog) Start() error { @@ -230,7 +223,7 @@ func (w *Watchdog) Start() error { go func() { if err := backoff.Retry(func() error { slog.Info("attempting backoff queue subscription") - if err := w.queue.Subscribe(ctx, w.msgCh, w.wg); err != nil { + if err := w.queue.Subscribe(ctx, w.msgCh, &w.wg); err != nil { slog.Error("processor queue subscription error", "err", err.Error()) return err } @@ -247,7 +240,7 @@ func (w *Watchdog) Start() error { go func() { if err := backoff.Retry(func() error { - return utils.ScanBlocks(ctx, w.srcEthClient, w.wg) + return utils.ScanBlocks(ctx, w.srcEthClient, &w.wg) }, backoff.NewConstantBackOff(5*time.Second)); err != nil { slog.Error("scan blocks backoff retry", "error", err) } diff --git a/packages/snaefell-ui/CHANGELOG.md b/packages/snaefell-ui/CHANGELOG.md index db6d597731b..069e06f044f 100644 --- a/packages/snaefell-ui/CHANGELOG.md +++ b/packages/snaefell-ui/CHANGELOG.md @@ -1,5 +1,27 @@ # Changelog +## [1.1.0](https://github.com/taikoxyz/taiko-mono/compare/snaefell-ui-v1.0.0...snaefell-ui-v1.1.0) (2024-06-18) + + +### Features + +* **nfts:** snaefell ui fixes ([#17391](https://github.com/taikoxyz/taiko-mono/issues/17391)) ([14a9939](https://github.com/taikoxyz/taiko-mono/commit/14a9939f417ba73fd32c35099a067ae8b56e99bb)) +* **nfts:** snaefell-ui pre-mint disclaimer ([#17484](https://github.com/taikoxyz/taiko-mono/issues/17484)) ([99731fa](https://github.com/taikoxyz/taiko-mono/commit/99731fa66a6e961d7d964b9dec43de5bfaa905bc)) +* **nfts:** snaefell-v2 contract, ui adaptations ([#17614](https://github.com/taikoxyz/taiko-mono/issues/17614)) ([728657f](https://github.com/taikoxyz/taiko-mono/commit/728657f379f755e72b1a93ff4c70998cdeed26ac)) + + +### Bug Fixes + +* **nfts:** snaefell day1 fixes ([#17420](https://github.com/taikoxyz/taiko-mono/issues/17420)) ([34f1ae2](https://github.com/taikoxyz/taiko-mono/commit/34f1ae238a6f209d6cefdb6adf6d4b42236dfe82)) +* **nfts:** snaefell fixes, v3 ([#17401](https://github.com/taikoxyz/taiko-mono/issues/17401)) ([7f40e3a](https://github.com/taikoxyz/taiko-mono/commit/7f40e3a20b3cdce375990e24cd22cd71f913fc01)) +* **nfts:** snaefell ui chains modal and counters ([#17395](https://github.com/taikoxyz/taiko-mono/issues/17395)) ([91d1a34](https://github.com/taikoxyz/taiko-mono/commit/91d1a34ee0ebdbff09b1b7c8205934104a3b8382)) +* **nfts:** snaefell ui fixes v4 ([#17414](https://github.com/taikoxyz/taiko-mono/issues/17414)) ([ee9b711](https://github.com/taikoxyz/taiko-mono/commit/ee9b711b854f3df1b8bdea91be352e53222ac4bc)) +* **nfts:** snaefell-ui figma implementations ([#17400](https://github.com/taikoxyz/taiko-mono/issues/17400)) ([cca2358](https://github.com/taikoxyz/taiko-mono/commit/cca235839ac099b351a60966dd00ce59bfd9dcd2)) +* **nfts:** snaefell-ui fix date ([#17425](https://github.com/taikoxyz/taiko-mono/issues/17425)) ([5bb8bf4](https://github.com/taikoxyz/taiko-mono/commit/5bb8bf458c5828e91e021a1b5ef481a0b2785de5)) +* **nfts:** snaefell-ui fixes ([#17398](https://github.com/taikoxyz/taiko-mono/issues/17398)) ([53b74f2](https://github.com/taikoxyz/taiko-mono/commit/53b74f20a9e1581973f3a47390d792d2f6921f96)) +* **nfts:** snaefell-ui scroll fixes ([#17402](https://github.com/taikoxyz/taiko-mono/issues/17402)) ([a72e187](https://github.com/taikoxyz/taiko-mono/commit/a72e18753c77912b69f6317394b9b95a9b61d660)) +* **nfts:** snaefell-ui, show success panel after user has minted permanently ([#17447](https://github.com/taikoxyz/taiko-mono/issues/17447)) ([efb7610](https://github.com/taikoxyz/taiko-mono/commit/efb7610417160c0c44524badcd6e5c6e590da051)) + ## 1.0.0 (2024-05-28) diff --git a/packages/snaefell-ui/package.json b/packages/snaefell-ui/package.json index 4d80c0222bc..c90aa48f828 100644 --- a/packages/snaefell-ui/package.json +++ b/packages/snaefell-ui/package.json @@ -1,6 +1,6 @@ { "name": "snaefell-ui", - "version": "1.0.0", + "version": "1.1.0", "description": "", "main": "index.js", "scripts": { @@ -15,7 +15,7 @@ "format": "prettier --write ./src", "test:integration": "playwright test", "test:unit": "vitest", - "start": "npm run generate:abi && vite dev --open", + "start": "vite dev --open", "generate:abi": "cd ../nfts && pnpm compile && cd - && wagmi generate" }, "devDependencies": { @@ -23,7 +23,7 @@ "@chromatic-com/storybook": "^1.3.1", "@playwright/test": "^1.28.1", "@sveltejs/adapter-auto": "^3.0.0", - "@sveltejs/kit": "^2.0.0", + "@sveltejs/kit": "^2.5.21", "@sveltejs/vite-plugin-svelte": "^3.0.0", "@types/eslint": "^8.56.0", "@types/jest": "^29.5.12", @@ -60,7 +60,7 @@ "@wagmi/cli": "^2.1.8", "@wagmi/connectors": "^5.0.6", "@wagmi/core": "^2.10.4", - "@web3modal/common": "^4.2.2", + "@web3modal/common": "^5.0.11", "@web3modal/ui": "^4.2.2", "@web3modal/wagmi": "^4.2.2", "@zerodevx/svelte-toast": "^0.9.5", diff --git a/packages/snaefell-ui/src/components/modals/MintDisclaimer.modal/MintDisclaimer.modal.svelte b/packages/snaefell-ui/src/components/modals/MintDisclaimer.modal/MintDisclaimer.modal.svelte index d0c154414d8..876325f3400 100644 --- a/packages/snaefell-ui/src/components/modals/MintDisclaimer.modal/MintDisclaimer.modal.svelte +++ b/packages/snaefell-ui/src/components/modals/MintDisclaimer.modal/MintDisclaimer.modal.svelte @@ -4,7 +4,7 @@ import { browser } from '$app/environment'; import { Button } from '$components/core/Button'; import { account } from '$stores/account'; - import { Modal, ModalBody, ModalFooter, ModalTitle } from '$ui/Modal'; + import { Modal, ModalBody, ModalTitle } from '$ui/Modal'; import { bodyWrapperClasses, @@ -44,13 +44,12 @@ I agree to the terms and conditions mentioned above. - - +
-
+
diff --git a/packages/snaefell-ui/src/components/modals/MintDisclaimer.modal/classes.ts b/packages/snaefell-ui/src/components/modals/MintDisclaimer.modal/classes.ts index cb7a271949e..6100a65bc33 100644 --- a/packages/snaefell-ui/src/components/modals/MintDisclaimer.modal/classes.ts +++ b/packages/snaefell-ui/src/components/modals/MintDisclaimer.modal/classes.ts @@ -9,7 +9,16 @@ export const modalTitleClasses = classNames( 'border-border-divider-default', ); export const bodyWrapperClasses = classNames('text-content-primary', 'py-4'); -export const footerWrapperClasses = classNames('w-full', 'flex', 'flex-row', 'items-center', 'justify-center', 'gap-4'); +export const footerWrapperClasses = classNames( + 'w-full', + 'flex', + 'flex-row', + 'items-center', + 'justify-center', + 'gap-4', + 'my-6', + 'md:mb-6', +); export const spinnerSmWrapper = classNames( 'bg-interactive-tertiary', 'rounded-md', diff --git a/packages/snaefell-ui/src/generated/abi/index.ts b/packages/snaefell-ui/src/generated/abi/index.ts index 6238c3ac833..f83de706149 100644 --- a/packages/snaefell-ui/src/generated/abi/index.ts +++ b/packages/snaefell-ui/src/generated/abi/index.ts @@ -3,7 +3,8 @@ ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /** - * + * - + * - [__View Contract on Taiko Mainnet Taikoscan__](https://taikoscan.network/address/0xA5804b2a764f9808858355c1f1832588f47ab654) */ export const snaefellTokenAbi = [ { @@ -37,6 +38,13 @@ export const snaefellTokenAbi = [ outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], stateMutability: 'view', }, + { + type: 'function', + inputs: [], + name: 'baseURI', + outputs: [{ name: '', internalType: 'string', type: 'string' }], + stateMutability: 'view', + }, { type: 'function', inputs: [], @@ -284,6 +292,13 @@ export const snaefellTokenAbi = [ outputs: [], stateMutability: 'nonpayable', }, + { + type: 'function', + inputs: [{ name: '_rootURI', internalType: 'string', type: 'string' }], + name: 'updateBaseURI', + outputs: [], + stateMutability: 'nonpayable', + }, { type: 'function', inputs: [ @@ -581,15 +596,17 @@ export const snaefellTokenAbi = [ ] as const; /** - * + * - + * - [__View Contract on Taiko Mainnet Taikoscan__](https://taikoscan.network/address/0xA5804b2a764f9808858355c1f1832588f47ab654) */ export const snaefellTokenAddress = { - 31337: '0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0', - 167000: '0xD57b9EE8f597801e82018ed44e07E9065645B0c1', + 31337: '0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512', + 167000: '0xA5804b2a764f9808858355c1f1832588f47ab654', } as const; /** - * + * - + * - [__View Contract on Taiko Mainnet Taikoscan__](https://taikoscan.network/address/0xA5804b2a764f9808858355c1f1832588f47ab654) */ export const snaefellTokenConfig = { address: snaefellTokenAddress, diff --git a/packages/snaefell-ui/src/lib/ipfs/config.ts b/packages/snaefell-ui/src/lib/ipfs/config.ts deleted file mode 100644 index ce6b37a9aab..00000000000 --- a/packages/snaefell-ui/src/lib/ipfs/config.ts +++ /dev/null @@ -1 +0,0 @@ -export { PUBLIC_IPFS_GATEWAY } from '$env/static/public'; diff --git a/packages/snaefell-ui/src/lib/ipfs/get.ts b/packages/snaefell-ui/src/lib/ipfs/get.ts index f43218d7068..a0aa7c91445 100644 --- a/packages/snaefell-ui/src/lib/ipfs/get.ts +++ b/packages/snaefell-ui/src/lib/ipfs/get.ts @@ -1,6 +1,4 @@ -import { PUBLIC_IPFS_GATEWAY } from './config'; - -export default async function get(hash: string, json?: boolean): Promise { - const response = await fetch(`${PUBLIC_IPFS_GATEWAY}${hash}`); +export default async function get(tokenURI: string, json?: boolean): Promise { + const response = await fetch(tokenURI); return json ? response.json() : response.text(); } diff --git a/packages/snaefell-ui/src/lib/ipfs/getMetadata.ts b/packages/snaefell-ui/src/lib/ipfs/getMetadata.ts index a402e91fc8d..eb0edcafbfc 100644 --- a/packages/snaefell-ui/src/lib/ipfs/getMetadata.ts +++ b/packages/snaefell-ui/src/lib/ipfs/getMetadata.ts @@ -1,6 +1,4 @@ -import { IpfsError } from '../error'; import Token from '../token'; -import { PUBLIC_IPFS_GATEWAY } from './config'; import get from './get'; export interface ITokenMetadata { @@ -10,16 +8,6 @@ export interface ITokenMetadata { } export default async function getMetadata(tokenId: number): Promise { const tokenURI = await Token.tokenURI(tokenId); - const hash = tokenURI.split('ipfs://').pop(); - if (!hash) throw new IpfsError('Invalid token URI:' + tokenURI); - const metadata = (await get(hash, true)) as ITokenMetadata; - - const imageHash = metadata.image.split('ipfs://').pop(); - - if (!imageHash) throw new IpfsError('Invalid image URI:' + metadata.image); - - return { - ...metadata, - image: `${PUBLIC_IPFS_GATEWAY}${imageHash}`, - }; + const metadata = (await get(tokenURI, true)) as ITokenMetadata; + return metadata; } diff --git a/packages/snaefell-ui/src/lib/util/isCountdownActive.ts b/packages/snaefell-ui/src/lib/util/isCountdownActive.ts deleted file mode 100644 index cff30d478c1..00000000000 --- a/packages/snaefell-ui/src/lib/util/isCountdownActive.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { PUBLIC_LAUNCH_DATE } from '$env/static/public'; - -export default function isCountdownActive(): boolean { - const launchDate = new Date(PUBLIC_LAUNCH_DATE); - return Date.now() < launchDate.getTime(); -} diff --git a/packages/snaefell-ui/src/lib/wagmi/watcher.ts b/packages/snaefell-ui/src/lib/wagmi/watcher.ts index 5572430c272..31001fdc7b8 100644 --- a/packages/snaefell-ui/src/lib/wagmi/watcher.ts +++ b/packages/snaefell-ui/src/lib/wagmi/watcher.ts @@ -20,7 +20,7 @@ export async function startWatching() { refreshUserBalance(); // We need to check if the chain is supported, and if not // we present the user with a modal to switch networks. - const isLocalHost = window.location.hostname === 'localhost'; + const isLocalHost = false; //window.location.hostname === 'localhost'; const isSupportedChainId = isLocalHost ? isSupportedChain(Number(data.chainId)) : data.chainId === taiko.id; const isConnected = data.address !== undefined; diff --git a/packages/snaefell-ui/vite.config.ts b/packages/snaefell-ui/vite.config.ts index 081d527adfa..c0aeaec2a0a 100644 --- a/packages/snaefell-ui/vite.config.ts +++ b/packages/snaefell-ui/vite.config.ts @@ -11,6 +11,12 @@ export default defineConfig({ }, optimizeDeps: { exclude: ['@urql/svelte'], - } + }, + /* + define: { + 'process.env': { + 'PUBLIC_WALLETCONNECT_PROJECT_ID': '' + } + }*/ // other properties }) diff --git a/packages/snaefell-ui/wagmi.config.ts b/packages/snaefell-ui/wagmi.config.ts index 575a4db7419..5d780a54c2a 100644 --- a/packages/snaefell-ui/wagmi.config.ts +++ b/packages/snaefell-ui/wagmi.config.ts @@ -40,7 +40,7 @@ function generateWhitelistJson() { mkdirSync(whitelistDir, { recursive: true }); } generateNetworkWhitelist('mainnet') - generateNetworkWhitelist('hardhat') + // generateNetworkWhitelist('hardhat') } generateWhitelistJson(); diff --git a/packages/supplementary-contracts/contracts/blacklist/IMinimalBlacklist.sol b/packages/supplementary-contracts/contracts/blacklist/IMinimalBlacklist.sol index cd70fd7879a..25f1c089aef 100644 --- a/packages/supplementary-contracts/contracts/blacklist/IMinimalBlacklist.sol +++ b/packages/supplementary-contracts/contracts/blacklist/IMinimalBlacklist.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; /// @title Minimal Blacklist Interface interface IMinimalBlacklist { diff --git a/packages/supplementary-contracts/deployments/blacklist/hekla.json b/packages/supplementary-contracts/deployments/blacklist/hekla.json new file mode 100644 index 00000000000..84a53c5c7c2 --- /dev/null +++ b/packages/supplementary-contracts/deployments/blacklist/hekla.json @@ -0,0 +1,3 @@ +{ + "Blacklist": "0xD10a2c799F61A89B8f6D8C695c48A4F38684ab30" +} diff --git a/packages/supplementary-contracts/deployments/blacklist/mainnet.json b/packages/supplementary-contracts/deployments/blacklist/mainnet.json new file mode 100644 index 00000000000..bcadc7ecfea --- /dev/null +++ b/packages/supplementary-contracts/deployments/blacklist/mainnet.json @@ -0,0 +1,3 @@ +{ + "Blacklist": "0x5e3052424E51a62c4FDFf4F1dD42300F59c9C57A" +} diff --git a/packages/supplementary-contracts/package.json b/packages/supplementary-contracts/package.json index 83b8293a862..ba6c6f93d6e 100644 --- a/packages/supplementary-contracts/package.json +++ b/packages/supplementary-contracts/package.json @@ -9,7 +9,9 @@ "layout": "./deployments/gen-layouts.sh", "fmt:sol": "forge fmt", "lint:sol": "forge fmt && pnpm solhint 'contracts/**/*.sol'", - "test": "forge test -vvv --match-path test/*.t.sol" + "test": "forge test -vvv --match-path test/*.t.sol", + "deploy:blacklist:hekla": "forge script script/blacklist/Deploy.sol --rpc-url https://rpc.hekla.taiko.xyz --broadcast --gas-estimate-multiplier 200", + "deploy:blacklist:mainnet": "forge script script/blacklist/Deploy.sol --rpc-url https://rpc.mainnet.taiko.xyz --broadcast --gas-estimate-multiplier 100" }, "devDependencies": { "@types/node": "^20.11.30", @@ -33,7 +35,7 @@ "@openzeppelin/contracts-upgradeable": "4.9.6", "ds-test": "github:dapphub/ds-test#e282159d5170298eb2455a6c05280ab5a73a4ef0", "forge-std": "github:foundry-rs/forge-std#v1.7.5", - "merkletreejs": "^0.3.11", + "merkletreejs": "^0.4.0", "p256-verifier": "github:taikoxyz/p256-verifier#v0.1.0", "solady": "github:Vectorized/solady#v0.0.167" } diff --git a/packages/supplementary-contracts/script/blacklist/Deploy.data.json b/packages/supplementary-contracts/script/blacklist/Deploy.data.json index 415c666f0a7..f0f0137813c 100644 --- a/packages/supplementary-contracts/script/blacklist/Deploy.data.json +++ b/packages/supplementary-contracts/script/blacklist/Deploy.data.json @@ -1,6 +1,6 @@ { - "admin": "0xf8ff2AF0DC1D5BA4811f22aCb02936A1529fd2Be", - "updater": "0xf8ff2AF0DC1D5BA4811f22aCb02936A1529fd2Be", + "admin": "0x7d70236E2517f5B95247AF1d806A9E3C328a7860", + "updater": "0x7d70236E2517f5B95247AF1d806A9E3C328a7860", "blacklist": [ "0x098B716B8Aaf21512996dC57EB0615e2383E2f96", "0xa0e1c89Ef1a489c9C7dE96311eD5Ce5D32c20E4B", @@ -155,6 +155,155 @@ "0x175d44451403Edf28469dF03A9280c1197ADb92c", "0x21B8d56BDA776bbE68655A16895afd96F5534feD", "0xE950DC316b836e4EeFb8308bf32Bf7C72a1358FF", - "0x19F8f2B0915Daa12a3f5C9CF01dF9E24D53794F7" + "0x19F8f2B0915Daa12a3f5C9CF01dF9E24D53794F7", + "0xB9C144ee9Db3850BB5c1598f9b1B03CD68812e30", + "0x683279542eD04d7C60DC56E4EA230fe621eDD4Ca", + "0x29E866A8471DA4f89b4AFF3FD41c801d8027058b", + "0xa2C13a6913D1DF18ff4f5de2bc342023Cd683C38", + "0x5c913285DD9421EDc9d8f1000A35D9bbDF0DCb62", + "0x4ee49B318B785BC358f947BfdCec46dFA12b1Ac1", + "0x6d9999D1aC0027F1E3Dc1e3F154e3366726743b7", + "0x4342F35851fa88873496A49F55ECF79671042bF9", + "0xb226eFF9Be0F679CfB703626C911113513B63bd4", + "0x93ff385916cfcDDA8EB0858276B0074e061E98F4", + "0x29aC5D7972C8B672bF2Ae60eFbc1bEFf48F1F038", + "0xA241038Cb362BDAbd55fDa08233de6f75c764C63", + "0x3d96638B127463e136dAaD12d9bfEAeaFA5437De", + "0x60E9c48A50828c4DC4e36D28fc7EF1b25124e002", + "0xB4c9105B0bF3785C30676D13D210D698Dde84F11", + "0xa4426fA0F0e53Cd06dc41d4fEcF4Bf8783dC5a27", + "0x509BBc835912dF27Fb19837b604b92664A5B8FF1", + "0x08103076D7b1219c7135D89fC0a1c90D26FB307F", + "0x2Cfd96Fb65a990F1b5193992a47e0b6D918Df0Dc", + "0xB33e272E9B62409a53dA0171Eaf88eFef8eE4692", + "0x64FF010064656dF2FC55a3b7D99420Bc4A07c56A", + "0xcDc7306b3c9E0F2947a7B62A137eF90806901f37", + "0xAF5c672f943cd547B7938158A46D08b584c492E8", + "0xAd5e1B0Ed51b625519f81D43117b479DE7e9AbDC", + "0xF8f5811d342DdC2a6320C205856977CfE3289f29", + "0xdd8BD6CEDE3D9eD2D453216df394C5bC8b05046a", + "0x72a2B878e6A909192b0aD91AF976494Ba5143855", + "0xBa5613D19214eD93844AabD24F1102040aceae4f", + "0xaf00a8b4e83A005921D0f878d20006DE0cDA044C", + "0x1a903fe2f732F96bAa7292A05f4121766dD7e07a", + "0xB84F419FD6DC9C30cCAA6ecbF5d194Af065A33ff", + "0xb787c56Bd3c21FB6C18Ceb9a3E49637ab7cD4Dd9", + "0xE2189aa87c1Ad7654bE7Ee258f348d6484F68165", + "0xbdaD5D2d23c0d5D6B17E402a79658f787328ee08", + "0xA189b646c8983253De9eE06C815c51171F265f81", + "0x660888f021BB7da1004869C6a51059Ed97d9e7c0", + "0x1dCFB0dB0D1A774Da525F1200E2c549Bf8A9DC70", + "0x4BA67EC73A7aBF9E015eeFC1979053CE0E56B369", + "0xF46dC57a0d8B614a0e8571217316d24B840ED9BC", + "0x3099cE94b9dDB6715B1169F61Aa0e16ad818Ce89", + "0x24317cAB3C632E0B1eD0d21De1E0a009359B1296", + "0xb692c229A8622Ad1dB19b18065E69B2b6116b9ef", + "0xC478e784b91b19665470CeAaCfa39Ba17D0f6183", + "0xEF8F0d7684D4405B5c51AEF023675946D5992b29", + "0xE9F41a0090fcc7eaf626037003AAD44B17098E7C", + "0x57B7F15C80461E83Ee56daE6a813A57f41E9b61d", + "0x05431cD62F011Cb44Ec803Fe4AC96FAC651CA494", + "0xcaFd650401708ca4f65a22340D07f78E18f8C332", + "0xbB7Cc747f5279Fde28b0878C928D92Eb6c90deBd", + "0x0f883a80a11Ba4057c265ad3a4C0c4e3869ac4c3", + "0xab2ECcf82a5b66396419da7a6e9fbF6630Bb7521", + "0xEc1C61c1c5cfEaA49141C24fB88815052D2fa6B1", + "0x7282aB49b58C7c493F49F2d5D1a723BdEd47C420", + "0x688c0a468ad7BE8Dc2e1cB92cc1b9b6fdca84d5A", + "0x5065d72003878656670f8C67498924704108C00C", + "0x8B59C939bE050814e56D69A68B7c8E485f79f9c3", + "0x38c104275141eaaE188dE0017eFf125FEb87F218", + "0xEe74356635A216A1fC89D4921495124c1533b0C8", + "0x394702830B44476C919389Cb7bA3726a1A885F3A", + "0xBA7770994a63d874127bC6eF8a0c78CCd5174E13", + "0x4edb34De5A54B42cDb88D7E535EC767AcdCa9Ce1", + "0x9c6F685403491272E6CF6258c32ccaA8E9A1ed21", + "0xdd7B2F2b821Ff20ee52A8787b3D9614b91A2b8B1", + "0xE86d78381c4cd7B4a67278e1194cA7bABc363Af9", + "0x873415F6633A0C42b8717bC898354638F52b13f3", + "0xB439b0844D0D9aF237FF37dc2379f07B6CD06171", + "0x796e3F689D8d475Dc82ce801440B184A76e68175", + "0xCe5CDb2Da5A7F30163126388Dd22a1e8084a9ad1", + "0x85204a5E932b69455822033F33E378DFF4Bb8960", + "0x588137e7c1Fce64a78e092611609B259bb524DaE", + "0x6De556d0d262BCC52fc5594abCcBc3b78524Ae17", + "0x52539Ea869f7162BC18f9c3C2dB595f2Cd69f63b", + "0xA706009f64b8eeDE2005546d18d2cbB87DDd95dF", + "0xD1799f7B0Bb7F48b0e997358eEEac349bA776c49", + "0x8fe67f559f6D6dED602E954d45897ebEE5F7FFec", + "0x464E1e588Bb3f49D039Ab8C4D5E33bB47fF8915C", + "0x9905d5753a005cd3e13D71bD030f0B6654703B81", + "0x4d7bF7e16fA37867b4Efcf7c05BD3d889ACB6ac9", + "0x026649F79905E4c5Fa26DafFbD905B3522d37e10", + "0x160EE9Bc0a0Fa051C6fEE189e9107669ed07DB0a", + "0x84a6b0C091c57313E3350B1C9d59472517f60D41", + "0x6d9807d18374F33213DE86917937544A7095e39e", + "0x9c9a2d9826b7c7e95D686e5714Fb0eF948EbC6B8", + "0x6aca843DD19AE4bfA43b6C53fC2e0c3a0bF6a002", + "0x381a0241a2A6e0217376A44C113707D5F9993e1b", + "0xC12B1050553c11993ed3A6aaB6818de7EC4DE4E2", + "0xc3F6b750Ab8b42D0455Cc90cac0E7B1F6bb6953a", + "0x07C35EF7A4AC953F5B8bBC79E6D497d114c38e6E", + "0x0395c16F061E8D2d79DFadF957fFcb97F2D765D3", + "0x6FFE37F348CCB189aC63BfB69ba6B4Aa0beDC3FB", + "0x7C22a14E676657Ebd573B7BE96AcFb21f09171dc", + "0xEC5568Bb595a311D2060506437D0f16Da8B8562D", + "0xea3D4D7f3484a683c39494D0b2A62C83cD52E8d4", + "0xDbd300Eba0F755Bb06DA769A4E1A84E4330068AF", + "0xE7eeb97861761e0AEE35F3e5dE42e1501C283495", + "0x0DC74caBcfB00ab5Fdeef60088685A71fef97003", + "0x45d993393f7B3Fe781935e1155118C7f830d4415", + "0x96BCa503a3ae8bEb794DaD2602202BB5ECD4AAE6", + "0x3Ad16031c0b29A2a6B7A3FBB5996649e39f4127b", + "0x8Cc38ceC2535DE89f2D573F6a50E74a717B45829", + "0x9fE7EDeDcd7DCF206cBe7F00bD23A6e70b398d74", + "0xa58b94936C196d5263b54232EB7D6C2B99A745b4", + "0xd8C860D789Ec1c6aE9631B680E6555F25Bc28331", + "0x6AEF558e7ebE574D692c2acd4C47232fd54e62b6", + "0xea99b1e741779a99646B7F9D57aF0F8264d94020", + "0x924eC99107E0F6fF59Ab33460ae6be9E8A6f5017", + "0x9a80ba749a649B2604d796e01D8A64Cc7B58ff78", + "0x904F40730023CC632c9dF65606dA0809D00D3B9a", + "0x9ECEc759D9F899Db97C6decDe38731f0A9DB449d", + "0xD6AFE7BA2E3c42C6A2729b861F33B54F8b2E6f2F", + "0xDE367Ba53E9EDC9381Ce00cDBba3DB01497E7974", + "0x37C4334EB5d24DCcCCfEBCC54680C433313EB040", + "0x87cCe15D359633EB901889E1B7CBa95c21053C19", + "0xE0B61B1EE0aa4Cb23d8667fda8F720F9f707c4B1", + "0x697F9Ab686b2834ACd86750B8A9Fd9f26b1f640e", + "0x6873a48E3A67E240D62E6Ec510900C0b9480cF8C", + "0x855980B2B60d8E3b60CFCf92413e3E3aF04AA101", + "0x435f6Fef6f7c1CadcD77CCB4ef1AD66C27FcFe79", + "0x735026cA2D9a0Cd24Da088eD3E1853EDe083Fc97", + "0x41ad8DD494057E87cE16dAeb20A06649E8ca2B50", + "0x87dFedBFD4FBBFDb8153fec55c82A983c299e5ad", + "0xEaA132575a13F88B715738562C7c1A545EC24300", + "0x3D3Aa68b54df9666CB6670A93aBE7A80CA01fbc3", + "0x7135603DAF6E50a76c3603582bdC2f33Fc558494", + "0x321186Ed48B0112Cc7Ed232e621d932c6EB84c61", + "0xc1B906579E383bE6Cb1B1Cc737DBA2e63CCEFa04", + "0x9471e8B1903Ef7f65f4002cFCE147b2646b6BB0f", + "0xc3fd682bdfb5ABab39Eb2c92E3411978e0b57E3f", + "0x477992B48247c889d50c9B0A87B2b2E34cbCA623", + "0x049dD5F736B851419cde65BB94DcE74d48324269", + "0xD9E6718b1C294CCe6EBC67eb6eBdbc02c343E489", + "0x830a02416Fc210C6F50A5afe65384F6c88132BE7", + "0x1b39f5ee1Fb4958F2E4049f69B53F78b75Bf1888", + "0x1742289017b61C48A5B4340666711AEd2Db72B4E", + "0x523c2937b6A1A0df143032033d6824dce499ddBF", + "0xB0a5eA798249fb30E9E1c81d475B051279962BB2", + "0xd2c7EeDBE8D68b045388A79b65915253dB582385", + "0xc1b44b014cD87d88BB04e176ba9324e086e9cd73", + "0x9D9854f6C9588bF5A56158a47090E0DFAC89d596", + "0x40eF5243c64BFa49301adF18b09A79A190CFa266", + "0xCF3c579061fB243aeFab480055B49e9038e6E488", + "0x0117Ce17Bc661d9bc331A328DC57C05d99B087D3", + "0xB2de33b99A59877d0780D4315690a600f47B5996", + "0xd50c9d01223F0EC1184A82eBEA3730Bdbc82238e", + "0x1F4a6756Da7592fc0f9a031D127d016ACc0BfcB2", + "0x63c9E4f81716dEBc57dB9Fbc60600106a44B9964", + "0xB7Cd2CEF367bf5536d7fdF6c491CE158D2651d97", + "0x1aa4a66Ef0cfA99cA9D39FdAD2B05489744C972a", + "0x3150BdCdA1b41E0F2A550955839F6b2C723aD0B7" ] } diff --git a/packages/supplementary-contracts/script/blacklist/Deploy.sol b/packages/supplementary-contracts/script/blacklist/Deploy.sol index f3ce0ced2c0..67ee1c65a2a 100644 --- a/packages/supplementary-contracts/script/blacklist/Deploy.sol +++ b/packages/supplementary-contracts/script/blacklist/Deploy.sol @@ -9,25 +9,75 @@ import "../../contracts/blacklist/Blacklist.sol"; contract DeployBlacklist is Script { using stdJson for string; - function setUp() public { } + uint256 public chainId; + + string public lowercaseNetworkKey; + string public uppercaseNetworkKey; + string public jsonLocation; + + uint256 public deployerPrivateKey; + address public deployerAddress; + + function getPrivateKey() public view returns (uint256) { + string memory lookupKey = string.concat(uppercaseNetworkKey, "_PRIVATE_KEY"); + return vm.envUint(lookupKey); + } + + function getContractJsonLocation() public view returns (string memory) { + string memory root = vm.projectRoot(); + return string.concat(root, "/deployments/blacklist/", lowercaseNetworkKey, ".json"); + } + + function setUp() public { + // load all network configs + chainId = block.chainid; + + if (chainId == 31_337) { + lowercaseNetworkKey = "localhost"; + uppercaseNetworkKey = "LOCALHOST"; + } else if (chainId == 17_000) { + lowercaseNetworkKey = "holesky"; + uppercaseNetworkKey = "HOLESKY"; + } else if (chainId == 167_001) { + lowercaseNetworkKey = "devnet"; + uppercaseNetworkKey = "DEVNET"; + } else if (chainId == 11_155_111) { + lowercaseNetworkKey = "sepolia"; + uppercaseNetworkKey = "SEPOLIA"; + } else if (chainId == 167_008) { + lowercaseNetworkKey = "katla"; + uppercaseNetworkKey = "KATLA"; + } else if (chainId == 167_000) { + lowercaseNetworkKey = "mainnet"; + uppercaseNetworkKey = "MAINNET"; + } else if (chainId == 167_009) { + lowercaseNetworkKey = "hekla"; + uppercaseNetworkKey = "HEKLA"; + } else { + revert("Unsupported chainId"); + } + + deployerPrivateKey = getPrivateKey(); + deployerAddress = vm.addr(deployerPrivateKey); + jsonLocation = getContractJsonLocation(); + } function run() external { string memory path = "/script/blacklist/Deploy.data.json"; string memory json = vm.readFile(string.concat(vm.projectRoot(), path)); - // get admin address - bytes memory rawPortion = json.parseRaw(".admin"); - address admin = abi.decode(rawPortion, (address)); - // get updater address - rawPortion = json.parseRaw(".updater"); - address updater = abi.decode(rawPortion, (address)); // get initial blacklist - rawPortion = json.parseRaw(".blacklist"); + bytes memory rawPortion = json.parseRaw(".blacklist"); address[] memory blacklist = abi.decode(rawPortion, (address[])); - vm.startBroadcast(); + vm.startBroadcast(deployerPrivateKey); + + Blacklist target = new Blacklist(deployerAddress, deployerAddress, blacklist); + console2.log("Blacklist deployed to ", address(target)); + + string memory finalJson = vm.serializeAddress("", "Blacklist", address(target)); + vm.writeJson(finalJson, jsonLocation); - Blacklist target = new Blacklist(admin, updater, blacklist); - console2.log("Deployed!\n", address(target)); + vm.stopBroadcast(); } } diff --git a/packages/supplementary-contracts/script/utils/safe_batch_transfer.py b/packages/supplementary-contracts/script/utils/safe_batch_transfer.py new file mode 100644 index 00000000000..915443a3932 --- /dev/null +++ b/packages/supplementary-contracts/script/utils/safe_batch_transfer.py @@ -0,0 +1,89 @@ +import json +import sys +import time + +# Taiko Labs Wallet (on Taiko): 0x7aEeed56d1B21baD7b66f1357A6Ed51DA848a698 +#:Token Bridged USDC (Stargate) 0x19e26B0638bf63aa9fa4d14c6baF8D52eBE86C5C (DECIMAL 6) +def generate_json(input_file_path, safe_address, token_address, decimals): + transactions = [] + multiplier = 10 ** decimals + total_amount = 0 + num_recipients = 0 + + with open(input_file_path, mode='r') as file: + for line in file: + parts = line.strip().split() + if len(parts) != 2: + print(f"Invalid line format: {line}") + continue + recipient = parts[0] + amount = int(parts[1]) * multiplier + total_amount += amount + num_recipients += 1 + + print(f"Recipient: {recipient}, Amount: {amount}") + + transactions.append({ + "to": token_address, + "value": "0", + "data": None, + "contractMethod": { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transfer", + "payable": False + }, + "contractInputsValues": { + "to": recipient, + "amount": str(amount) + } + }) + + print(f"Number of Recipients: {num_recipients}") + print(f"Total Token Amount: {total_amount}") + + result = { + "version": "1.0", + "chainId": "167000", + "createdAt": int(time.time()), + "meta": { + "name": "Transactions Batch", + "description": "", + "txBuilderVersion": "1.16.5", + "createdFromSafeAddress": safe_address + }, + "transactions": transactions + } + + print("safe_batch_transfers.json created") + with open("safe_batch_transfers.json", 'w') as json_file: + json.dump(result, json_file, indent=4) + +if __name__ == "__main__": + if len(sys.argv) != 5: + print("Usage: python3 safe_batch_transfer.py ") + sys.exit(1) + + input_file_path = sys.argv[1] + print(f"input file: {input_file_path}") + + safe_address = sys.argv[2] + print(f"safe address: {safe_address}") + + token_address = sys.argv[3] + print(f"token address: {token_address}") + + decimals = int(sys.argv[4]) + print(f"decimals: {decimals}") + + generate_json(input_file_path, safe_address, token_address, decimals) diff --git a/packages/taiko-client/.golangci.yml b/packages/taiko-client/.golangci.yml index 680090bcc94..53d4dc4b38f 100644 --- a/packages/taiko-client/.golangci.yml +++ b/packages/taiko-client/.golangci.yml @@ -3,21 +3,10 @@ run: timeout: 20m tests: true - skip-dirs-use-default: true - skip-files: - - bindings/gen_taiko_l1.go - - bindings/gen_taiko_l2.go issues: - # List of regexps of issue texts to exclude. - # - # But independently of this option we use default exclude patterns, - # it can be disabled by `exclude-use-default: false`. - # To list all excluded by default patterns execute `golangci-lint run --help` - # - # Default: https://golangci-lint.run/usage/false-positives/#default-exclusions - exclude: - - abcdef + exclude-dirs: + - bindings linters: disable-all: true @@ -35,7 +24,6 @@ linters: - goimports - gosimple - govet - - gosec - gofmt - ineffassign - importas @@ -43,13 +31,12 @@ linters: - makezero - misspell - misspell - - megacheck - - revive + - gosimple + - staticcheck - staticcheck - sqlclosecheck - staticcheck - stylecheck - - typecheck - unconvert - unused - whitespace diff --git a/packages/taiko-client/.swaggo b/packages/taiko-client/.swaggo index 8cc34d878a4..e69de29bb2d 100644 --- a/packages/taiko-client/.swaggo +++ b/packages/taiko-client/.swaggo @@ -1,2 +0,0 @@ -replace common.Address string -replace encoding.TierFee uint64 \ No newline at end of file diff --git a/packages/taiko-client/CHANGELOG.md b/packages/taiko-client/CHANGELOG.md index 49713e514e6..4e605d12020 100644 --- a/packages/taiko-client/CHANGELOG.md +++ b/packages/taiko-client/CHANGELOG.md @@ -1,5 +1,583 @@ # Changelog +## [0.42.1](https://github.com/taikoxyz/taiko-mono/compare/taiko-alethia-client-v0.42.0...taiko-alethia-client-v0.42.1) (2025-01-07) + + +### Chores + +* **taiko-client:** always use `blockID` instead of `height` for L2 blocks in logs ([#18719](https://github.com/taikoxyz/taiko-mono/issues/18719)) ([a02b96d](https://github.com/taikoxyz/taiko-mono/commit/a02b96d609b17070fd0b071127d84c21e1f3a8ef)) +* **taiko-client:** improve proposer gas estimation ([#18727](https://github.com/taikoxyz/taiko-mono/issues/18727)) ([6aed5b3](https://github.com/taikoxyz/taiko-mono/commit/6aed5b3bc5f46e089784405133fcf83c6befe495)) + +## [0.42.0](https://github.com/taikoxyz/taiko-mono/compare/taiko-alethia-client-v0.41.1...taiko-alethia-client-v0.42.0) (2025-01-06) + + +### Features + +* **taiko-client:** build blob transactions when gas estimation failed ([#18712](https://github.com/taikoxyz/taiko-mono/issues/18712)) ([6c0ef37](https://github.com/taikoxyz/taiko-mono/commit/6c0ef3706ebae8059b9ff554f45c2dcad00c0535)) +* **taiko-client:** introduce `TxBuilderWithFallback` ([#18690](https://github.com/taikoxyz/taiko-mono/issues/18690)) ([f1d7b20](https://github.com/taikoxyz/taiko-mono/commit/f1d7b20b722b1e15db3f3f2953c8afb89287537f)) +* **taiko-client:** remove an unused flag for proposer ([#18709](https://github.com/taikoxyz/taiko-mono/issues/18709)) ([6fb1fd2](https://github.com/taikoxyz/taiko-mono/commit/6fb1fd25696a5251d864e8869c4a360e9915d787)) + + +### Bug Fixes + +* **taiko-client:** add [#18442](https://github.com/taikoxyz/taiko-mono/issues/18442) back ([#18685](https://github.com/taikoxyz/taiko-mono/issues/18685)) ([abc0554](https://github.com/taikoxyz/taiko-mono/commit/abc0554eb0b0a640a8b1a4e9762f7d691b089d40)) +* **taiko-client:** add timestamp as a new parameter to getBasefeeV2 ([#18691](https://github.com/taikoxyz/taiko-mono/issues/18691)) ([4a4d908](https://github.com/taikoxyz/taiko-mono/commit/4a4d908b0290046d1098d943a9ebc685c7ca533e)) +* **taiko-client:** fix blob transactions estimation when proposing ([#18703](https://github.com/taikoxyz/taiko-mono/issues/18703)) ([395ac5f](https://github.com/taikoxyz/taiko-mono/commit/395ac5fdfb0d8eccae96fafda423d19766a94556)) +* **taiko-client:** fix proposing fee estimation ([#18702](https://github.com/taikoxyz/taiko-mono/issues/18702)) ([13a5b1b](https://github.com/taikoxyz/taiko-mono/commit/13a5b1b50e0bf9f030449af49cb0b58ce4288729)) + + +### Chores + +* **taiko-client:** add more metrics for `TxBuilderWithFallback` ([#18711](https://github.com/taikoxyz/taiko-mono/issues/18711)) ([b62d390](https://github.com/taikoxyz/taiko-mono/commit/b62d3906a650d8b58ad1d45b068638823ce05121)) +* **taiko-client:** add more proof generation metrics ([#18715](https://github.com/taikoxyz/taiko-mono/issues/18715)) ([ae07365](https://github.com/taikoxyz/taiko-mono/commit/ae07365e560c51bcc197335d0ac0ba61964f0b49)) +* **taiko-client:** cleanup pre-ontake prover code ([#18677](https://github.com/taikoxyz/taiko-mono/issues/18677)) ([fef6884](https://github.com/taikoxyz/taiko-mono/commit/fef6884bc318e4f09d9c59930a0565cc15e25996)) +* **taiko-client:** fix docs ([#18698](https://github.com/taikoxyz/taiko-mono/issues/18698)) ([fc545ee](https://github.com/taikoxyz/taiko-mono/commit/fc545ee89fd907a20161195ef174e7d96d4beae3)) +* **taiko-client:** improve prover logs ([#18718](https://github.com/taikoxyz/taiko-mono/issues/18718)) ([3246071](https://github.com/taikoxyz/taiko-mono/commit/32460713052351789f3d7b452ccd0251a000e2f8)) +* **taiko-client:** more cost estimation metrics ([#18713](https://github.com/taikoxyz/taiko-mono/issues/18713)) ([b9bd6ea](https://github.com/taikoxyz/taiko-mono/commit/b9bd6ea479da8943b96ddca00a3bbb0e8148774c)) +* **taiko-client:** optimize logging ([#18674](https://github.com/taikoxyz/taiko-mono/issues/18674)) ([60bda60](https://github.com/taikoxyz/taiko-mono/commit/60bda60df922e5dd04f6186f8a67d7cb56351c6d)) +* **taiko-client:** remove some unused flags ([#18678](https://github.com/taikoxyz/taiko-mono/issues/18678)) ([63f9d26](https://github.com/taikoxyz/taiko-mono/commit/63f9d26b42518a995e093d7db6bc43ef3b57ecca)) + + +### Tests + +* **taiko-client:** add more fallback proposing tests ([#18705](https://github.com/taikoxyz/taiko-mono/issues/18705)) ([0e8ef0d](https://github.com/taikoxyz/taiko-mono/commit/0e8ef0d6df36cc05956574b38dabdbbd83f7ce5a)) + +## [0.41.1](https://github.com/taikoxyz/taiko-mono/compare/taiko-alethia-client-v0.41.0...taiko-alethia-client-v0.41.1) (2024-12-30) + + +### Chores + +* **taiko-client:** cleanup pre-ontake proposer code ([#18672](https://github.com/taikoxyz/taiko-mono/issues/18672)) ([a52d9a7](https://github.com/taikoxyz/taiko-mono/commit/a52d9a79bb99027061f4719a62361157365a5625)) + +## [0.41.0](https://github.com/taikoxyz/taiko-mono/compare/taiko-alethia-client-v0.40.0...taiko-alethia-client-v0.41.0) (2024-12-30) + + +### Features + +* **protocol:** introduce `AssembleAnchorV2Tx` method in `AnchorTxConstructor` ([#17850](https://github.com/taikoxyz/taiko-mono/issues/17850)) ([f71b178](https://github.com/taikoxyz/taiko-mono/commit/f71b1780eb98ff3cbbcf7def4388837f33e3fe37)) +* **protocol:** introduce risc0 proof ([#17877](https://github.com/taikoxyz/taiko-mono/issues/17877)) ([bcb57cb](https://github.com/taikoxyz/taiko-mono/commit/bcb57cb81d12d0c09656582ad9140b38015b3a58)) +* **protocol:** propose a batch blocks conditionally ([#18570](https://github.com/taikoxyz/taiko-mono/issues/18570)) ([e846f62](https://github.com/taikoxyz/taiko-mono/commit/e846f6289fea0b046ddcfcdfaf46f3727efbdf11)) +* **taiko-client:** add `proposer_pool_content_fetch_time` metric ([#18190](https://github.com/taikoxyz/taiko-mono/issues/18190)) ([35579df](https://github.com/taikoxyz/taiko-mono/commit/35579dfa938562969da2395492f4472c300574dd)) +* **taiko-client:** add `RaikoZKVMHostEndpoint` and rename ([#17926](https://github.com/taikoxyz/taiko-mono/issues/17926)) ([0838f79](https://github.com/taikoxyz/taiko-mono/commit/0838f7993015fc9fc9cacfb3da7b100d52bc856c)) +* **taiko-client:** add chain ID to `TryDecompress()` ([#18444](https://github.com/taikoxyz/taiko-mono/issues/18444)) ([10d99d5](https://github.com/taikoxyz/taiko-mono/commit/10d99d50d3866a6e233d9e3749ea5eb753335815)) +* **taiko-client:** add optional `l1.private` ([#17962](https://github.com/taikoxyz/taiko-mono/issues/17962)) ([9274f2d](https://github.com/taikoxyz/taiko-mono/commit/9274f2dc90f18c58cc208146f584c9f9715d3d60)) +* **taiko-client:** add two more new ZK related metrics ([#18043](https://github.com/taikoxyz/taiko-mono/issues/18043)) ([e43eeac](https://github.com/taikoxyz/taiko-mono/commit/e43eeacb5b7a3d1fc412ffafc39f329f68ff7b40)) +* **taiko-client:** allow `--l1.beacon` to be optional when a blob server is given ([#18094](https://github.com/taikoxyz/taiko-mono/issues/18094)) ([f4d47a3](https://github.com/taikoxyz/taiko-mono/commit/f4d47a3f988462605f04106b14394bb400fc9669)) +* **taiko-client:** catch raiko deserialization errors ([#18644](https://github.com/taikoxyz/taiko-mono/issues/18644)) ([98a98fd](https://github.com/taikoxyz/taiko-mono/commit/98a98fd4636e3cd5f3ec019493a72880e141f494)) +* **taiko-client:** changes based on the latest basefee improvements ([#17911](https://github.com/taikoxyz/taiko-mono/issues/17911)) ([0c10ac9](https://github.com/taikoxyz/taiko-mono/commit/0c10ac9c4973d3ef8a5e35a8646516639b328fa0)) +* **taiko-client:** client changes based on [#18150](https://github.com/taikoxyz/taiko-mono/issues/18150) ([#18350](https://github.com/taikoxyz/taiko-mono/issues/18350)) ([ddc6473](https://github.com/taikoxyz/taiko-mono/commit/ddc647327e8d58f5a2def5b902ad06800982544b)) +* **taiko-client:** client changes for `ontake` fork ([#17746](https://github.com/taikoxyz/taiko-mono/issues/17746)) ([2aabf3d](https://github.com/taikoxyz/taiko-mono/commit/2aabf3de3456ce8cbd56d15be336d08445b9f242)) +* **taiko-client:** client updates based on [#17871](https://github.com/taikoxyz/taiko-mono/issues/17871) ([#17873](https://github.com/taikoxyz/taiko-mono/issues/17873)) ([dbed3ab](https://github.com/taikoxyz/taiko-mono/commit/dbed3aba3d7f49f982f6335b79f5d5b096f890a3)) +* **taiko-client:** compatible changes for `lastProposedIn` ([#18442](https://github.com/taikoxyz/taiko-mono/issues/18442)) ([28f32a7](https://github.com/taikoxyz/taiko-mono/commit/28f32a790cc680ecb3e6345221e4183af4f34b2e)) +* **taiko-client:** enable proof aggregation (batch proofs) ([#18163](https://github.com/taikoxyz/taiko-mono/issues/18163)) ([7642961](https://github.com/taikoxyz/taiko-mono/commit/7642961a9031840183f4d00d0a4c19fdb8a68058)) +* **taiko-client:** improve `ProofBuffer` ([#18627](https://github.com/taikoxyz/taiko-mono/issues/18627)) ([c386589](https://github.com/taikoxyz/taiko-mono/commit/c3865896523712afa108be810e75b511e7ecc0c4)) +* **taiko-client:** improve some logs in zk producer ([#18117](https://github.com/taikoxyz/taiko-mono/issues/18117)) ([109595e](https://github.com/taikoxyz/taiko-mono/commit/109595e7b285709833a782ee0959fd1a815ef706)) +* **taiko-client:** introduce `BasefeeSharingPctg` in `BlockMetadata` ([#17853](https://github.com/taikoxyz/taiko-mono/issues/17853)) ([5f2d696](https://github.com/taikoxyz/taiko-mono/commit/5f2d6961b9d077e47f34bf7f5d1fbffaf380bde1)) +* **taiko-client:** introduce `CalculateBaseFee()` method ([#17989](https://github.com/taikoxyz/taiko-mono/issues/17989)) ([fdee419](https://github.com/taikoxyz/taiko-mono/commit/fdee4195541e5c675561cf34c5e1a9e3e3990bbf)) +* **taiko-client:** introduce `TaikoDataBlockV2` ([#17936](https://github.com/taikoxyz/taiko-mono/issues/17936)) ([c608116](https://github.com/taikoxyz/taiko-mono/commit/c608116523922fa4664968dc73608a118b5b97ba)) +* **taiko-client:** introduce `TaikoL2.GetBasefeeV2` ([#18660](https://github.com/taikoxyz/taiko-mono/issues/18660)) ([4abfaa9](https://github.com/taikoxyz/taiko-mono/commit/4abfaa9e28a619c1edfa82548a00eae0790f784b)) +* **taiko-client:** introduce `TierZkVMRisc0ID` ([#17915](https://github.com/taikoxyz/taiko-mono/issues/17915)) ([96aa5c2](https://github.com/taikoxyz/taiko-mono/commit/96aa5c2a5cd096ac3560fe17106ec042a877bfc1)) +* **taiko-client:** introduce `TxMgrSelector` for proposer / prover ([#17986](https://github.com/taikoxyz/taiko-mono/issues/17986)) ([6eb298f](https://github.com/taikoxyz/taiko-mono/commit/6eb298f31723e838ac4261fbecbfcfce371d8606)) +* **taiko-client:** introduce sp1 zk proof ([#18003](https://github.com/taikoxyz/taiko-mono/issues/18003)) ([492c208](https://github.com/taikoxyz/taiko-mono/commit/492c208b97e8fa08eb3e11b0a8712a5542eba660)) +* **taiko-client:** make p2p-sync required ([#18571](https://github.com/taikoxyz/taiko-mono/issues/18571)) ([de92b28](https://github.com/taikoxyz/taiko-mono/commit/de92b28c03b747845a8a1aa26991307d1ed47fd0)) +* **taiko-client:** optimising statistics on proof request times ([#17976](https://github.com/taikoxyz/taiko-mono/issues/17976)) ([791f44f](https://github.com/taikoxyz/taiko-mono/commit/791f44f381fa362f24c4beff5b5b25c47929bbc4)) +* **taiko-client:** optimize aggregation loggingain ([#18643](https://github.com/taikoxyz/taiko-mono/issues/18643)) ([688a426](https://github.com/taikoxyz/taiko-mono/commit/688a42646d185694c7cfd2bc091084dd782782f5)) +* **taiko-client:** remove `basefeeSharingPctg` from metadata ([#17890](https://github.com/taikoxyz/taiko-mono/issues/17890)) ([57c8f6f](https://github.com/taikoxyz/taiko-mono/commit/57c8f6f3a8f920bab8fecd75bfa36a6b71ef808d)) +* **taiko-client:** remove an unused field in prover ([#18024](https://github.com/taikoxyz/taiko-mono/issues/18024)) ([5d416d2](https://github.com/taikoxyz/taiko-mono/commit/5d416d2366e485b242818fb1a15eb0281cb7cedf)) +* **taiko-client:** remove an unused filed in proposer ([#18021](https://github.com/taikoxyz/taiko-mono/issues/18021)) ([64fdf5c](https://github.com/taikoxyz/taiko-mono/commit/64fdf5c80708b14d2cefadfbd78ee59810df3f65)) +* **taiko-client:** remove an unused package ([#18668](https://github.com/taikoxyz/taiko-mono/issues/18668)) ([e1af55a](https://github.com/taikoxyz/taiko-mono/commit/e1af55abcf99ba4a1de6cc22072a457f45ad55be)) +* **taiko-client:** remove the legacy `290` tier ([#18035](https://github.com/taikoxyz/taiko-mono/issues/18035)) ([5064037](https://github.com/taikoxyz/taiko-mono/commit/50640377db773763c3ccba1bc4f342cd1e497147)) +* **taiko-client:** revert pr 18442 ([#18450](https://github.com/taikoxyz/taiko-mono/issues/18450)) ([0706f0a](https://github.com/taikoxyz/taiko-mono/commit/0706f0aee9c318d8de298f98480a46de6337937c)) +* **taiko-client:** revert pr-18571 ([#18648](https://github.com/taikoxyz/taiko-mono/issues/18648)) ([842f812](https://github.com/taikoxyz/taiko-mono/commit/842f8122305f8cbf3153bb645e3107abb4af3cf4)) +* **taiko-client:** support `TaikoL1.proposeBlocksV2` ([#18116](https://github.com/taikoxyz/taiko-mono/issues/18116)) ([d0c0fed](https://github.com/taikoxyz/taiko-mono/commit/d0c0fed57c8b8ba139b65d0215df1976358e7635)) +* **taiko-client:** update `BlockParamsV2` struct ([#17893](https://github.com/taikoxyz/taiko-mono/issues/17893)) ([a1043a8](https://github.com/taikoxyz/taiko-mono/commit/a1043a85631892e0b03e0f9f4bb850d4e9a70967)) +* **taiko-client:** update `OntakeForkHeight` in mainnet ([#18253](https://github.com/taikoxyz/taiko-mono/issues/18253)) ([21c6235](https://github.com/taikoxyz/taiko-mono/commit/21c62355575adae6d99e1a117f357c6429d79b4c)) +* **taiko-client:** update `ontakeForkHeight` to Sep 24, 2024 ([#18047](https://github.com/taikoxyz/taiko-mono/issues/18047)) ([a1ff620](https://github.com/taikoxyz/taiko-mono/commit/a1ff620507e4a8077705c981c3622e3787a55ecd)) +* **taiko-client:** update contract binding & add `Proposer` ([#18053](https://github.com/taikoxyz/taiko-mono/issues/18053)) ([d0554a2](https://github.com/taikoxyz/taiko-mono/commit/d0554a208c4913751ff5b273f3e96ca298279d14)) +* **taiko-client:** update contract bingdings ([#18182](https://github.com/taikoxyz/taiko-mono/issues/18182)) ([8954764](https://github.com/taikoxyz/taiko-mono/commit/8954764d96c256408c1cfd77deb1621da288a33c)) +* **taiko-client:** update Go contract bindings ([#17869](https://github.com/taikoxyz/taiko-mono/issues/17869)) ([d9bd72b](https://github.com/taikoxyz/taiko-mono/commit/d9bd72b76aa0bed4ccfe834053f6561a53e1367d)) +* **taiko-client:** update Go contract bindings ([#17885](https://github.com/taikoxyz/taiko-mono/issues/17885)) ([3179074](https://github.com/taikoxyz/taiko-mono/commit/31790747cfc743b218d5a3568b9d70b64df5a86c)) +* **taiko-client:** update Go contract bindings ([#17997](https://github.com/taikoxyz/taiko-mono/issues/17997)) ([606114f](https://github.com/taikoxyz/taiko-mono/commit/606114faa0b5642055455f07cbd7ec2c3c23b00c)) +* **taiko-client:** update Go contract bindings ([#18012](https://github.com/taikoxyz/taiko-mono/issues/18012)) ([7f054ca](https://github.com/taikoxyz/taiko-mono/commit/7f054ca4505313f8fc500cdb28bf223a254424e2)) +* **taiko-client:** update Go contract bindings ([#18381](https://github.com/taikoxyz/taiko-mono/issues/18381)) ([71cfc5c](https://github.com/taikoxyz/taiko-mono/commit/71cfc5ce1ef06dcf099a4ce9b22bea6100406148)) +* **taiko-client:** update Go contract bindings ([#18384](https://github.com/taikoxyz/taiko-mono/issues/18384)) ([8dd14a1](https://github.com/taikoxyz/taiko-mono/commit/8dd14a1b4b21ce77ed3aac935b1d2c950e11e729)) +* **taiko-client:** update Go contract bindings ([#18462](https://github.com/taikoxyz/taiko-mono/issues/18462)) ([bc0ee99](https://github.com/taikoxyz/taiko-mono/commit/bc0ee9952234cc6722d3a0e9d9ebd92bca706999)) +* **taiko-client:** update Go contract bindings after protocol restructure ([#18075](https://github.com/taikoxyz/taiko-mono/issues/18075)) ([57f4953](https://github.com/taikoxyz/taiko-mono/commit/57f49530828e6da2d28ab3979576befdee626c7d)) +* **taiko-client:** update hekla's protocol config ([#17955](https://github.com/taikoxyz/taiko-mono/issues/17955)) ([4b6a70d](https://github.com/taikoxyz/taiko-mono/commit/4b6a70dd4fb22146ee6702b8484a4a2b4fbce6c2)) +* **taiko-client:** update ontake basefee calculation ([#17892](https://github.com/taikoxyz/taiko-mono/issues/17892)) ([6972dea](https://github.com/taikoxyz/taiko-mono/commit/6972dea313edbc9a30617d2f7aea2dfc9230c432)) +* **taiko-client:** update protocol configs temporarily ([#17999](https://github.com/taikoxyz/taiko-mono/issues/17999)) ([7893700](https://github.com/taikoxyz/taiko-mono/commit/789370090ffb7d985b2d9d55bf4efec8495df6bd)) +* **taiko-client:** update prover balance check to include bond balance ([#18092](https://github.com/taikoxyz/taiko-mono/issues/18092)) ([5d5ca74](https://github.com/taikoxyz/taiko-mono/commit/5d5ca74970f88493ea75b14a13fe852f840f019a)) +* **taiko-client:** use `proveBlocks` by default for post ontake blocks ([#18042](https://github.com/taikoxyz/taiko-mono/issues/18042)) ([15709af](https://github.com/taikoxyz/taiko-mono/commit/15709af1520251f4baeba7d2bbbc8de841bee718)) + + +### Bug Fixes + +* **protocol:** fix issue in mainnet deployment script ([#18283](https://github.com/taikoxyz/taiko-mono/issues/18283)) ([5c371a1](https://github.com/taikoxyz/taiko-mono/commit/5c371a181af444999f611e03774ec096ffbd1226)) +* **taiko-client:** dont check l1heightInAnchor vs l1Height when detecting reorg ([#18110](https://github.com/taikoxyz/taiko-mono/issues/18110)) ([7ed9b6f](https://github.com/taikoxyz/taiko-mono/commit/7ed9b6f647fd1611e036ce12e4fd96696ef231ea)) +* **taiko-client:** fix `GetBasefeeV2` usage ([#18664](https://github.com/taikoxyz/taiko-mono/issues/18664)) ([03537c7](https://github.com/taikoxyz/taiko-mono/commit/03537c7d86700427976da556fed88ea4df5299d7)) +* **taiko-client:** fix `lastVerifiedBlockHash` fetch ([#18277](https://github.com/taikoxyz/taiko-mono/issues/18277)) ([8512f45](https://github.com/taikoxyz/taiko-mono/commit/8512f456f033130ecb0e5493a3c36be025908228)) +* **taiko-client:** fix blob server API URL when fetching blob data ([#18109](https://github.com/taikoxyz/taiko-mono/issues/18109)) ([7230dfd](https://github.com/taikoxyz/taiko-mono/commit/7230dfd1150edc7c08be6f97a46c1184a0b2d289)) +* **taiko-client:** fix CallOpts and `TestTreasuryIncome` test case ([#18000](https://github.com/taikoxyz/taiko-mono/issues/18000)) ([5707a08](https://github.com/taikoxyz/taiko-mono/commit/5707a08ffab3c981f0f23bcb8c7833176903d183)) +* **taiko-client:** fix path parsing in `/eth/v1/config/spec` ([#18295](https://github.com/taikoxyz/taiko-mono/issues/18295)) ([6633c80](https://github.com/taikoxyz/taiko-mono/commit/6633c80fbcabb6f06ce5467501da4207bc84be84)) +* **taiko-client:** fix process in handling empty proof ([#18128](https://github.com/taikoxyz/taiko-mono/issues/18128)) ([d6d90d8](https://github.com/taikoxyz/taiko-mono/commit/d6d90d887be8955f844c52c4fb100fa46d66fa47)) +* **taiko-client:** fix revert case when propose blob blocks ([#18185](https://github.com/taikoxyz/taiko-mono/issues/18185)) ([656e757](https://github.com/taikoxyz/taiko-mono/commit/656e757d629131cb03af894269ef447c39e9741e)) +* **taiko-client:** fix some issues about `calculateBaseFee` ([#17978](https://github.com/taikoxyz/taiko-mono/issues/17978)) ([b010efe](https://github.com/taikoxyz/taiko-mono/commit/b010efe195259e7c98e0ad6fb91b0c6484ae2b80)) +* **taiko-client:** fix timestamp calculation n `CalculateBaseFee()` ([#18057](https://github.com/taikoxyz/taiko-mono/issues/18057)) ([78c876e](https://github.com/taikoxyz/taiko-mono/commit/78c876e5df27d9e0fffc9e0fbf7ecbe518533025)) +* **taiko-client:** fix zk status recognition ([#17946](https://github.com/taikoxyz/taiko-mono/issues/17946)) ([164e476](https://github.com/taikoxyz/taiko-mono/commit/164e47686f41cbb119a230c7a1ad56ef4d0b3117)) +* **taiko-client:** improve prover balance check based on 18092 ([#18129](https://github.com/taikoxyz/taiko-mono/issues/18129)) ([b6cd50b](https://github.com/taikoxyz/taiko-mono/commit/b6cd50b61577d1eaa7aa29bd3e728271bcd4996f)) +* **taiko-client:** initialize private mempool transaction sender in `InitFromConfig` ([#18005](https://github.com/taikoxyz/taiko-mono/issues/18005)) ([58f1c85](https://github.com/taikoxyz/taiko-mono/commit/58f1c85ad471a545f8f00bfd32b3241657f38e8f)) +* **taiko-client:** prints logs when using `privateTxMgr` ([#17980](https://github.com/taikoxyz/taiko-mono/issues/17980)) ([a0c3388](https://github.com/taikoxyz/taiko-mono/commit/a0c33882ca00fb834001abac95b6ade656d55e87)) +* **taiko-client:** record `lastProposedAt` after ontake fork ([#18166](https://github.com/taikoxyz/taiko-mono/issues/18166)) ([ea0ca90](https://github.com/taikoxyz/taiko-mono/commit/ea0ca9040cc3d1d9fec50777d40b3cf69803c115)) +* **taiko-client:** revert path changes about SocialScan endpoint ([#18119](https://github.com/taikoxyz/taiko-mono/issues/18119)) ([38fa03a](https://github.com/taikoxyz/taiko-mono/commit/38fa03ab78d9cf4e70df8c623a74a4d69cf85682)) +* **taiko-client:** temp support tier 290 ([#18030](https://github.com/taikoxyz/taiko-mono/issues/18030)) ([f1aeac3](https://github.com/taikoxyz/taiko-mono/commit/f1aeac39d3c2ce06578a64bbe8a2fe4343d212f4)) +* **taiko-client:** use proposed at, not timestamp when fetching blob ([#18055](https://github.com/taikoxyz/taiko-mono/issues/18055)) ([32d95c1](https://github.com/taikoxyz/taiko-mono/commit/32d95c1d9e887e886da57e580554413b4f3a19c5)) +* **taiko-client:** valid status check in `BatchGetBlocksProofStatus` ([#18595](https://github.com/taikoxyz/taiko-mono/issues/18595)) ([ec5f599](https://github.com/taikoxyz/taiko-mono/commit/ec5f5999750f70efe58cc061c5856250dcef5ce2)) + + +### Chores + +* **main:** release taiko-client 0.30.0 ([#17770](https://github.com/taikoxyz/taiko-mono/issues/17770)) ([92879e9](https://github.com/taikoxyz/taiko-mono/commit/92879e91fba74118e701065513c5a0937393d299)) +* **main:** release taiko-client 0.31.0 ([#17952](https://github.com/taikoxyz/taiko-mono/issues/17952)) ([1d09fd2](https://github.com/taikoxyz/taiko-mono/commit/1d09fd229376c211914cdb3ec59a46774deed70b)) +* **main:** release taiko-client 0.32.0 ([#17956](https://github.com/taikoxyz/taiko-mono/issues/17956)) ([3a0bfa7](https://github.com/taikoxyz/taiko-mono/commit/3a0bfa7173345d35e2a7d2b0303a6ab4cfc9da0f)) +* **main:** release taiko-client 0.33.0 ([#17988](https://github.com/taikoxyz/taiko-mono/issues/17988)) ([c4653e5](https://github.com/taikoxyz/taiko-mono/commit/c4653e5f67a57e1debc02b98cabfed95e2edc2b4)) +* **main:** release taiko-client 0.33.1 ([#18008](https://github.com/taikoxyz/taiko-mono/issues/18008)) ([af794de](https://github.com/taikoxyz/taiko-mono/commit/af794de19672b7890e82fed1f58671ec574eb159)) +* **main:** release taiko-client 0.34.0 ([#18013](https://github.com/taikoxyz/taiko-mono/issues/18013)) ([cd5a6d9](https://github.com/taikoxyz/taiko-mono/commit/cd5a6d99a49237edfe417d82847cc47821bccbfd)) +* **main:** release taiko-client 0.34.1 ([#18031](https://github.com/taikoxyz/taiko-mono/issues/18031)) ([428dd49](https://github.com/taikoxyz/taiko-mono/commit/428dd49fb678ddeb5a942d4ed924ce760709a350)) +* **main:** release taiko-client 0.35.0 ([#18036](https://github.com/taikoxyz/taiko-mono/issues/18036)) ([61f31b6](https://github.com/taikoxyz/taiko-mono/commit/61f31b6a0fedd53c6e6cce3e208dc731f8b0ce4c)) +* **main:** release taiko-client 0.36.0 ([#18076](https://github.com/taikoxyz/taiko-mono/issues/18076)) ([d895cd8](https://github.com/taikoxyz/taiko-mono/commit/d895cd8c0b9a7ab6de94fe80ac8f6d6f686d11f4)) +* **main:** release taiko-client 0.37.0 ([#18093](https://github.com/taikoxyz/taiko-mono/issues/18093)) ([02a71dd](https://github.com/taikoxyz/taiko-mono/commit/02a71dd26e0650b39754fbac7100e6e9b5d0ce38)) +* **main:** release taiko-client 0.38.0 ([#18191](https://github.com/taikoxyz/taiko-mono/issues/18191)) ([f3ed20b](https://github.com/taikoxyz/taiko-mono/commit/f3ed20bca65cfb87a182f6876795983a4b3cd792)) +* **main:** release taiko-client 0.39.0 ([#18247](https://github.com/taikoxyz/taiko-mono/issues/18247)) ([be08e8b](https://github.com/taikoxyz/taiko-mono/commit/be08e8b846f798bb8259bfa0ae73bd729a5aaf79)) +* **main:** release taiko-client 0.39.1 ([#18278](https://github.com/taikoxyz/taiko-mono/issues/18278)) ([191480d](https://github.com/taikoxyz/taiko-mono/commit/191480d06159951aa6db0c550a0cc576917a7935)) +* **main:** release taiko-client 0.39.2 ([#18284](https://github.com/taikoxyz/taiko-mono/issues/18284)) ([52a9362](https://github.com/taikoxyz/taiko-mono/commit/52a936299487ee4db83e88ba740aec025561a2b9)) +* **main:** release taiko-client 0.40.0 ([#18436](https://github.com/taikoxyz/taiko-mono/issues/18436)) ([2a82c94](https://github.com/taikoxyz/taiko-mono/commit/2a82c945a2f6436a36f393105621bb011d8a4325)) +* **protocol:** remove reliance on taiko contracts and update golangci-lint ([#18151](https://github.com/taikoxyz/taiko-mono/issues/18151)) ([92f571a](https://github.com/taikoxyz/taiko-mono/commit/92f571a15daa4ad300b4665bbace9248c439fd11)) +* **protocol:** revert `TAIKO_TOKEN` name changes in `DeployOnL1` ([#17927](https://github.com/taikoxyz/taiko-mono/issues/17927)) ([cf1a15f](https://github.com/taikoxyz/taiko-mono/commit/cf1a15f46344e60448c5fdcbcae02521fb5b7c04)) +* **repo:** fix broken links ([#18635](https://github.com/taikoxyz/taiko-mono/issues/18635)) ([8e53a6e](https://github.com/taikoxyz/taiko-mono/commit/8e53a6e6a2654b8a599fe1df187e2fd88c22d96e)) +* **taiko-client:** add `BaseFeeConfig.SharingPctg` to mainnet protocol config ([#18341](https://github.com/taikoxyz/taiko-mono/issues/18341)) ([75d14a7](https://github.com/taikoxyz/taiko-mono/commit/75d14a7afac83b4578a3c32456a28ae70373d5cb)) +* **taiko-client:** add hive tests to workflow ([#17897](https://github.com/taikoxyz/taiko-mono/issues/17897)) ([323d728](https://github.com/taikoxyz/taiko-mono/commit/323d7285d83b83adfd220747fb3f55b5cd72d877)) +* **taiko-client:** bump dependencies ([#18202](https://github.com/taikoxyz/taiko-mono/issues/18202)) ([219a7e8](https://github.com/taikoxyz/taiko-mono/commit/219a7e87c09c7e4ac8d545c65c77a29e6f818701)) +* **taiko-client:** don't use color prefix in log's terminal handler ([#17991](https://github.com/taikoxyz/taiko-mono/issues/17991)) ([1675cec](https://github.com/taikoxyz/taiko-mono/commit/1675cecab5773d1c4fdf82b8e000a6f5bebddfc6)) +* **taiko-client:** fix lint errors ([#17969](https://github.com/taikoxyz/taiko-mono/issues/17969)) ([eedec99](https://github.com/taikoxyz/taiko-mono/commit/eedec991c92d5fcd418cde4db9d16c9b36122a0a)) +* **taiko-client:** improve `proofBuffer` logs ([#18669](https://github.com/taikoxyz/taiko-mono/issues/18669)) ([3b0d786](https://github.com/taikoxyz/taiko-mono/commit/3b0d786fe42205394a8a293aa6e5913e158323c4)) +* **taiko-client:** keep env vars same with the flag name ([#17964](https://github.com/taikoxyz/taiko-mono/issues/17964)) ([d08a1de](https://github.com/taikoxyz/taiko-mono/commit/d08a1de8a36a4bac484bf0390728cb8ed87b3a0b)) +* **taiko-client:** revert building changes ([#18174](https://github.com/taikoxyz/taiko-mono/issues/18174)) ([485b2ee](https://github.com/taikoxyz/taiko-mono/commit/485b2ee9a4bf4e16b9d0ab7b704eba0b0a46996c)) +* **taiko-client:** try cross-compile taiko-client to speed up docker building ([#18171](https://github.com/taikoxyz/taiko-mono/issues/18171)) ([9dbad24](https://github.com/taikoxyz/taiko-mono/commit/9dbad24cefcd260e2b452c9e8a46fcbe5f327cb4)) +* **taiko-client:** update `hive_tests.sh` ([#17923](https://github.com/taikoxyz/taiko-mono/issues/17923)) ([05d49b0](https://github.com/taikoxyz/taiko-mono/commit/05d49b07f9131bc034d00ad6cb7b7868a9af2bfc)) +* **taiko-client:** update CI badge and path ([#18441](https://github.com/taikoxyz/taiko-mono/issues/18441)) ([6aef03e](https://github.com/taikoxyz/taiko-mono/commit/6aef03e87eaf3cdbfb7637bd6122525f75c611f0)) +* **taiko-client:** update docker-compose config ([#18330](https://github.com/taikoxyz/taiko-mono/issues/18330)) ([74e4ca4](https://github.com/taikoxyz/taiko-mono/commit/74e4ca4aaef07af4958a7b61c95e385022b1cf3c)) +* **taiko-client:** update Go contract bindings generation script ([#18324](https://github.com/taikoxyz/taiko-mono/issues/18324)) ([4f698a0](https://github.com/taikoxyz/taiko-mono/commit/4f698a02bb1714caf527629a637323a9964cdb11)) + + +### Documentation + +* **taiko-client:** update readme how to do integration test ([#18256](https://github.com/taikoxyz/taiko-mono/issues/18256)) ([b12b32e](https://github.com/taikoxyz/taiko-mono/commit/b12b32e92b5803f15047a6da2b73135f12b9406d)) + + +### Code Refactoring + +* **taiko-client:** move `utils` package from `internal/` to `pkg/` ([#18516](https://github.com/taikoxyz/taiko-mono/issues/18516)) ([b674857](https://github.com/taikoxyz/taiko-mono/commit/b67485732832fb90849179a7a8c8093f2228eb5a)) + + +### Tests + +* **taiko-client:** cleanup pre-ontake tests ([#18647](https://github.com/taikoxyz/taiko-mono/issues/18647)) ([b577b3b](https://github.com/taikoxyz/taiko-mono/commit/b577b3b40f51bf35efe46151e459d37b87548614)) +* **taiko-client:** disable docker pull in hive test ([#18101](https://github.com/taikoxyz/taiko-mono/issues/18101)) ([95c9da2](https://github.com/taikoxyz/taiko-mono/commit/95c9da29fdd432de156f331802b79703a2311898)) +* **taiko-client:** fix some lint issues for `taiko-client` ([#18517](https://github.com/taikoxyz/taiko-mono/issues/18517)) ([ac7eba6](https://github.com/taikoxyz/taiko-mono/commit/ac7eba69bfe13f026bc6e08074ebaec5dcb067eb)) +* **taiko-client:** introduce `taiko-reth` as another L2 node in testing ([#18223](https://github.com/taikoxyz/taiko-mono/issues/18223)) ([e856273](https://github.com/taikoxyz/taiko-mono/commit/e85627365d423fd8353b5bff92e80978774e9c50)) +* **taiko-client:** introduce `TestProposeTxListOntake` ([#18167](https://github.com/taikoxyz/taiko-mono/issues/18167)) ([5023226](https://github.com/taikoxyz/taiko-mono/commit/5023226a7aa2e7355e835f9447b17eb85c60032a)) +* **taiko-client:** introduce blob-server and blob-l1-beacon hive tests ([#18121](https://github.com/taikoxyz/taiko-mono/issues/18121)) ([c544fe8](https://github.com/taikoxyz/taiko-mono/commit/c544fe8c33e26bfae951fb15c423aec2b749d092)) +* **taiko-client:** introduce multi nodes hive test ([#17981](https://github.com/taikoxyz/taiko-mono/issues/17981)) ([9910863](https://github.com/taikoxyz/taiko-mono/commit/9910863865ecf7f583552e74f6a5d2e1a4060dca)) +* **taiko-client:** introduce reorg hive test ([#17965](https://github.com/taikoxyz/taiko-mono/issues/17965)) ([ab601ee](https://github.com/taikoxyz/taiko-mono/commit/ab601eea813190a314555c1773a982de16da0e59)) +* **taiko-client:** introduce TestTxPoolContentWithMinTip test case ([#18285](https://github.com/taikoxyz/taiko-mono/issues/18285)) ([d572f4c](https://github.com/taikoxyz/taiko-mono/commit/d572f4c412e59094ea9a4c5ff0b0667c9c04bd66)) +* **taiko-client:** open container logs and close build image logs ([#17959](https://github.com/taikoxyz/taiko-mono/issues/17959)) ([b541201](https://github.com/taikoxyz/taiko-mono/commit/b54120141f0e18f1912db66d28390d2a92af36c9)) +* **taiko-client:** remove an unnecessary test ([#18218](https://github.com/taikoxyz/taiko-mono/issues/18218)) ([d624e29](https://github.com/taikoxyz/taiko-mono/commit/d624e29ce1c0ae9ef6704d96516d632600213e13)) +* **taiko-client:** skip `TestCheckL1ReorgToSameHeightFork` temporarily ([#18522](https://github.com/taikoxyz/taiko-mono/issues/18522)) ([385fed2](https://github.com/taikoxyz/taiko-mono/commit/385fed2ce273d131635c54e99a11704a4ed385b8)) +* **taiko-client:** support full sync and snap sync in hive test ([#17995](https://github.com/taikoxyz/taiko-mono/issues/17995)) ([831198b](https://github.com/taikoxyz/taiko-mono/commit/831198baecc5f0e10c5c8fac1c04f9dad320c63c)) +* **taiko-client:** support multi clusters reorg hive test ([#17987](https://github.com/taikoxyz/taiko-mono/issues/17987)) ([28d9072](https://github.com/taikoxyz/taiko-mono/commit/28d90729adc391cb04b58fa2c32a9e3bfbd989a5)) +* **taiko-client:** update hive dependence and fix bug about hive test ([#17930](https://github.com/taikoxyz/taiko-mono/issues/17930)) ([dd40a4e](https://github.com/taikoxyz/taiko-mono/commit/dd40a4e6696b9c27135823cd545e7e5249a66e8c)) +* **taiko-client:** update HIVE test configurations ([#17950](https://github.com/taikoxyz/taiko-mono/issues/17950)) ([4818274](https://github.com/taikoxyz/taiko-mono/commit/4818274860e8d626e5456479a520229e7c17f31c)) +* **taiko-client:** upgrade full sync and snap sync hive tests ([#18010](https://github.com/taikoxyz/taiko-mono/issues/18010)) ([1d18c17](https://github.com/taikoxyz/taiko-mono/commit/1d18c170566aed645e2e03b024e7fe2f2a01756d)) +* **taiko-client:** use env names which defined in flag configs ([#17921](https://github.com/taikoxyz/taiko-mono/issues/17921)) ([196b74e](https://github.com/taikoxyz/taiko-mono/commit/196b74eb2b4498bc3e6511915e011a885fcc530f)) + + +### Workflow + +* **protocol:** avoid installing `netcat` in action ([#18159](https://github.com/taikoxyz/taiko-mono/issues/18159)) ([7e27d1d](https://github.com/taikoxyz/taiko-mono/commit/7e27d1de388755b167d864df37133bfedafa2462)) +* **protocol:** trigger patch release (1.10.1) ([#18358](https://github.com/taikoxyz/taiko-mono/issues/18358)) ([f4f4796](https://github.com/taikoxyz/taiko-mono/commit/f4f4796488059b02c79d6fb15170df58dd31dc4e)) +* **repo:** change to trigger hive test manually ([#18514](https://github.com/taikoxyz/taiko-mono/issues/18514)) ([63dec66](https://github.com/taikoxyz/taiko-mono/commit/63dec6695b3e330ba7bd69857743741d7608e2a4)) +* **repo:** update go mod and use random port ([#18515](https://github.com/taikoxyz/taiko-mono/issues/18515)) ([3c2e943](https://github.com/taikoxyz/taiko-mono/commit/3c2e943ab2d6ff636ad69dc7e93df34d8f549c4d)) + + +### Build + +* **deps:** bump github.com/stretchr/testify from 1.9.0 to 1.10.0 ([#18539](https://github.com/taikoxyz/taiko-mono/issues/18539)) ([79f3fab](https://github.com/taikoxyz/taiko-mono/commit/79f3fab5f1d1ec1bb4ee18afb9268b622e894780)) +* **deps:** bump golang.org/x/sync from 0.9.0 to 0.10.0 ([#18560](https://github.com/taikoxyz/taiko-mono/issues/18560)) ([3d51970](https://github.com/taikoxyz/taiko-mono/commit/3d51970aa0953bbfecaeebf76ea7e664c875c0e4)) + +## [0.40.0](https://github.com/taikoxyz/taiko-mono/compare/taiko-client-v0.39.2...taiko-client-v0.40.0) (2024-12-23) + + +### Features + +* **protocol:** propose a batch blocks conditionally ([#18570](https://github.com/taikoxyz/taiko-mono/issues/18570)) ([e846f62](https://github.com/taikoxyz/taiko-mono/commit/e846f6289fea0b046ddcfcdfaf46f3727efbdf11)) +* **taiko-client:** add chain ID to `TryDecompress()` ([#18444](https://github.com/taikoxyz/taiko-mono/issues/18444)) ([10d99d5](https://github.com/taikoxyz/taiko-mono/commit/10d99d50d3866a6e233d9e3749ea5eb753335815)) +* **taiko-client:** client changes based on [#18150](https://github.com/taikoxyz/taiko-mono/issues/18150) ([#18350](https://github.com/taikoxyz/taiko-mono/issues/18350)) ([ddc6473](https://github.com/taikoxyz/taiko-mono/commit/ddc647327e8d58f5a2def5b902ad06800982544b)) +* **taiko-client:** compatible changes for `lastProposedIn` ([#18442](https://github.com/taikoxyz/taiko-mono/issues/18442)) ([28f32a7](https://github.com/taikoxyz/taiko-mono/commit/28f32a790cc680ecb3e6345221e4183af4f34b2e)) +* **taiko-client:** enable proof aggregation (batch proofs) ([#18163](https://github.com/taikoxyz/taiko-mono/issues/18163)) ([7642961](https://github.com/taikoxyz/taiko-mono/commit/7642961a9031840183f4d00d0a4c19fdb8a68058)) +* **taiko-client:** improve `ProofBuffer` ([#18627](https://github.com/taikoxyz/taiko-mono/issues/18627)) ([c386589](https://github.com/taikoxyz/taiko-mono/commit/c3865896523712afa108be810e75b511e7ecc0c4)) +* **taiko-client:** make p2p-sync required ([#18571](https://github.com/taikoxyz/taiko-mono/issues/18571)) ([de92b28](https://github.com/taikoxyz/taiko-mono/commit/de92b28c03b747845a8a1aa26991307d1ed47fd0)) +* **taiko-client:** revert pr 18442 ([#18450](https://github.com/taikoxyz/taiko-mono/issues/18450)) ([0706f0a](https://github.com/taikoxyz/taiko-mono/commit/0706f0aee9c318d8de298f98480a46de6337937c)) +* **taiko-client:** update Go contract bindings ([#18381](https://github.com/taikoxyz/taiko-mono/issues/18381)) ([71cfc5c](https://github.com/taikoxyz/taiko-mono/commit/71cfc5ce1ef06dcf099a4ce9b22bea6100406148)) +* **taiko-client:** update Go contract bindings ([#18384](https://github.com/taikoxyz/taiko-mono/issues/18384)) ([8dd14a1](https://github.com/taikoxyz/taiko-mono/commit/8dd14a1b4b21ce77ed3aac935b1d2c950e11e729)) +* **taiko-client:** update Go contract bindings ([#18462](https://github.com/taikoxyz/taiko-mono/issues/18462)) ([bc0ee99](https://github.com/taikoxyz/taiko-mono/commit/bc0ee9952234cc6722d3a0e9d9ebd92bca706999)) + + +### Bug Fixes + +* **taiko-client:** valid status check in `BatchGetBlocksProofStatus` ([#18595](https://github.com/taikoxyz/taiko-mono/issues/18595)) ([ec5f599](https://github.com/taikoxyz/taiko-mono/commit/ec5f5999750f70efe58cc061c5856250dcef5ce2)) + + +### Chores + +* **taiko-client:** add `BaseFeeConfig.SharingPctg` to mainnet protocol config ([#18341](https://github.com/taikoxyz/taiko-mono/issues/18341)) ([75d14a7](https://github.com/taikoxyz/taiko-mono/commit/75d14a7afac83b4578a3c32456a28ae70373d5cb)) +* **taiko-client:** update CI badge and path ([#18441](https://github.com/taikoxyz/taiko-mono/issues/18441)) ([6aef03e](https://github.com/taikoxyz/taiko-mono/commit/6aef03e87eaf3cdbfb7637bd6122525f75c611f0)) +* **taiko-client:** update docker-compose config ([#18330](https://github.com/taikoxyz/taiko-mono/issues/18330)) ([74e4ca4](https://github.com/taikoxyz/taiko-mono/commit/74e4ca4aaef07af4958a7b61c95e385022b1cf3c)) +* **taiko-client:** update Go contract bindings generation script ([#18324](https://github.com/taikoxyz/taiko-mono/issues/18324)) ([4f698a0](https://github.com/taikoxyz/taiko-mono/commit/4f698a02bb1714caf527629a637323a9964cdb11)) + + +### Code Refactoring + +* **taiko-client:** move `utils` package from `internal/` to `pkg/` ([#18516](https://github.com/taikoxyz/taiko-mono/issues/18516)) ([b674857](https://github.com/taikoxyz/taiko-mono/commit/b67485732832fb90849179a7a8c8093f2228eb5a)) + + +### Tests + +* **taiko-client:** fix some lint issues for `taiko-client` ([#18517](https://github.com/taikoxyz/taiko-mono/issues/18517)) ([ac7eba6](https://github.com/taikoxyz/taiko-mono/commit/ac7eba69bfe13f026bc6e08074ebaec5dcb067eb)) +* **taiko-client:** introduce TestTxPoolContentWithMinTip test case ([#18285](https://github.com/taikoxyz/taiko-mono/issues/18285)) ([d572f4c](https://github.com/taikoxyz/taiko-mono/commit/d572f4c412e59094ea9a4c5ff0b0667c9c04bd66)) +* **taiko-client:** skip `TestCheckL1ReorgToSameHeightFork` temporarily ([#18522](https://github.com/taikoxyz/taiko-mono/issues/18522)) ([385fed2](https://github.com/taikoxyz/taiko-mono/commit/385fed2ce273d131635c54e99a11704a4ed385b8)) + + +### Workflow + +* **protocol:** trigger patch release (1.10.1) ([#18358](https://github.com/taikoxyz/taiko-mono/issues/18358)) ([f4f4796](https://github.com/taikoxyz/taiko-mono/commit/f4f4796488059b02c79d6fb15170df58dd31dc4e)) +* **repo:** change to trigger hive test manually ([#18514](https://github.com/taikoxyz/taiko-mono/issues/18514)) ([63dec66](https://github.com/taikoxyz/taiko-mono/commit/63dec6695b3e330ba7bd69857743741d7608e2a4)) +* **repo:** update go mod and use random port ([#18515](https://github.com/taikoxyz/taiko-mono/issues/18515)) ([3c2e943](https://github.com/taikoxyz/taiko-mono/commit/3c2e943ab2d6ff636ad69dc7e93df34d8f549c4d)) + + +### Build + +* **deps:** bump github.com/stretchr/testify from 1.9.0 to 1.10.0 ([#18539](https://github.com/taikoxyz/taiko-mono/issues/18539)) ([79f3fab](https://github.com/taikoxyz/taiko-mono/commit/79f3fab5f1d1ec1bb4ee18afb9268b622e894780)) +* **deps:** bump golang.org/x/sync from 0.9.0 to 0.10.0 ([#18560](https://github.com/taikoxyz/taiko-mono/issues/18560)) ([3d51970](https://github.com/taikoxyz/taiko-mono/commit/3d51970aa0953bbfecaeebf76ea7e664c875c0e4)) + +## [0.39.2](https://github.com/taikoxyz/taiko-mono/compare/taiko-client-v0.39.1...taiko-client-v0.39.2) (2024-10-24) + + +### Bug Fixes + +* **protocol:** fix issue in mainnet deployment script ([#18283](https://github.com/taikoxyz/taiko-mono/issues/18283)) ([5c371a1](https://github.com/taikoxyz/taiko-mono/commit/5c371a181af444999f611e03774ec096ffbd1226)) +* **taiko-client:** fix path parsing in `/eth/v1/config/spec` ([#18295](https://github.com/taikoxyz/taiko-mono/issues/18295)) ([6633c80](https://github.com/taikoxyz/taiko-mono/commit/6633c80fbcabb6f06ce5467501da4207bc84be84)) + +## [0.39.1](https://github.com/taikoxyz/taiko-mono/compare/taiko-client-v0.39.0...taiko-client-v0.39.1) (2024-10-22) + + +### Bug Fixes + +* **taiko-client:** fix `lastVerifiedBlockHash` fetch ([#18277](https://github.com/taikoxyz/taiko-mono/issues/18277)) ([8512f45](https://github.com/taikoxyz/taiko-mono/commit/8512f456f033130ecb0e5493a3c36be025908228)) + +## [0.39.0](https://github.com/taikoxyz/taiko-mono/compare/taiko-client-v0.38.0...taiko-client-v0.39.0) (2024-10-21) + + +### Features + +* **taiko-client:** update `OntakeForkHeight` in mainnet ([#18253](https://github.com/taikoxyz/taiko-mono/issues/18253)) ([21c6235](https://github.com/taikoxyz/taiko-mono/commit/21c62355575adae6d99e1a117f357c6429d79b4c)) + + +### Documentation + +* **taiko-client:** update readme how to do integration test ([#18256](https://github.com/taikoxyz/taiko-mono/issues/18256)) ([b12b32e](https://github.com/taikoxyz/taiko-mono/commit/b12b32e92b5803f15047a6da2b73135f12b9406d)) + + +### Tests + +* **taiko-client:** introduce `taiko-reth` as another L2 node in testing ([#18223](https://github.com/taikoxyz/taiko-mono/issues/18223)) ([e856273](https://github.com/taikoxyz/taiko-mono/commit/e85627365d423fd8353b5bff92e80978774e9c50)) + +## [0.38.0](https://github.com/taikoxyz/taiko-mono/compare/taiko-client-v0.37.0...taiko-client-v0.38.0) (2024-10-09) + + +### Features + +* **taiko-client:** add `proposer_pool_content_fetch_time` metric ([#18190](https://github.com/taikoxyz/taiko-mono/issues/18190)) ([35579df](https://github.com/taikoxyz/taiko-mono/commit/35579dfa938562969da2395492f4472c300574dd)) + + +### Chores + +* **taiko-client:** bump dependencies ([#18202](https://github.com/taikoxyz/taiko-mono/issues/18202)) ([219a7e8](https://github.com/taikoxyz/taiko-mono/commit/219a7e87c09c7e4ac8d545c65c77a29e6f818701)) + + +### Tests + +* **taiko-client:** remove an unnecessary test ([#18218](https://github.com/taikoxyz/taiko-mono/issues/18218)) ([d624e29](https://github.com/taikoxyz/taiko-mono/commit/d624e29ce1c0ae9ef6704d96516d632600213e13)) + +## [0.37.0](https://github.com/taikoxyz/taiko-mono/compare/taiko-client-v0.36.0...taiko-client-v0.37.0) (2024-09-28) + + +### Features + +* **taiko-client:** allow `--l1.beacon` to be optional when a blob server is given ([#18094](https://github.com/taikoxyz/taiko-mono/issues/18094)) ([f4d47a3](https://github.com/taikoxyz/taiko-mono/commit/f4d47a3f988462605f04106b14394bb400fc9669)) +* **taiko-client:** improve some logs in zk producer ([#18117](https://github.com/taikoxyz/taiko-mono/issues/18117)) ([109595e](https://github.com/taikoxyz/taiko-mono/commit/109595e7b285709833a782ee0959fd1a815ef706)) +* **taiko-client:** support `TaikoL1.proposeBlocksV2` ([#18116](https://github.com/taikoxyz/taiko-mono/issues/18116)) ([d0c0fed](https://github.com/taikoxyz/taiko-mono/commit/d0c0fed57c8b8ba139b65d0215df1976358e7635)) +* **taiko-client:** update contract bingdings ([#18182](https://github.com/taikoxyz/taiko-mono/issues/18182)) ([8954764](https://github.com/taikoxyz/taiko-mono/commit/8954764d96c256408c1cfd77deb1621da288a33c)) +* **taiko-client:** update prover balance check to include bond balance ([#18092](https://github.com/taikoxyz/taiko-mono/issues/18092)) ([5d5ca74](https://github.com/taikoxyz/taiko-mono/commit/5d5ca74970f88493ea75b14a13fe852f840f019a)) + + +### Bug Fixes + +* **taiko-client:** dont check l1heightInAnchor vs l1Height when detecting reorg ([#18110](https://github.com/taikoxyz/taiko-mono/issues/18110)) ([7ed9b6f](https://github.com/taikoxyz/taiko-mono/commit/7ed9b6f647fd1611e036ce12e4fd96696ef231ea)) +* **taiko-client:** fix blob server API URL when fetching blob data ([#18109](https://github.com/taikoxyz/taiko-mono/issues/18109)) ([7230dfd](https://github.com/taikoxyz/taiko-mono/commit/7230dfd1150edc7c08be6f97a46c1184a0b2d289)) +* **taiko-client:** fix process in handling empty proof ([#18128](https://github.com/taikoxyz/taiko-mono/issues/18128)) ([d6d90d8](https://github.com/taikoxyz/taiko-mono/commit/d6d90d887be8955f844c52c4fb100fa46d66fa47)) +* **taiko-client:** fix revert case when propose blob blocks ([#18185](https://github.com/taikoxyz/taiko-mono/issues/18185)) ([656e757](https://github.com/taikoxyz/taiko-mono/commit/656e757d629131cb03af894269ef447c39e9741e)) +* **taiko-client:** improve prover balance check based on 18092 ([#18129](https://github.com/taikoxyz/taiko-mono/issues/18129)) ([b6cd50b](https://github.com/taikoxyz/taiko-mono/commit/b6cd50b61577d1eaa7aa29bd3e728271bcd4996f)) +* **taiko-client:** record `lastProposedAt` after ontake fork ([#18166](https://github.com/taikoxyz/taiko-mono/issues/18166)) ([ea0ca90](https://github.com/taikoxyz/taiko-mono/commit/ea0ca9040cc3d1d9fec50777d40b3cf69803c115)) +* **taiko-client:** revert path changes about SocialScan endpoint ([#18119](https://github.com/taikoxyz/taiko-mono/issues/18119)) ([38fa03a](https://github.com/taikoxyz/taiko-mono/commit/38fa03ab78d9cf4e70df8c623a74a4d69cf85682)) + + +### Chores + +* **protocol:** remove reliance on taiko contracts and update golangci-lint ([#18151](https://github.com/taikoxyz/taiko-mono/issues/18151)) ([92f571a](https://github.com/taikoxyz/taiko-mono/commit/92f571a15daa4ad300b4665bbace9248c439fd11)) +* **taiko-client:** revert building changes ([#18174](https://github.com/taikoxyz/taiko-mono/issues/18174)) ([485b2ee](https://github.com/taikoxyz/taiko-mono/commit/485b2ee9a4bf4e16b9d0ab7b704eba0b0a46996c)) +* **taiko-client:** try cross-compile taiko-client to speed up docker building ([#18171](https://github.com/taikoxyz/taiko-mono/issues/18171)) ([9dbad24](https://github.com/taikoxyz/taiko-mono/commit/9dbad24cefcd260e2b452c9e8a46fcbe5f327cb4)) + + +### Tests + +* **taiko-client:** disable docker pull in hive test ([#18101](https://github.com/taikoxyz/taiko-mono/issues/18101)) ([95c9da2](https://github.com/taikoxyz/taiko-mono/commit/95c9da29fdd432de156f331802b79703a2311898)) +* **taiko-client:** introduce `TestProposeTxListOntake` ([#18167](https://github.com/taikoxyz/taiko-mono/issues/18167)) ([5023226](https://github.com/taikoxyz/taiko-mono/commit/5023226a7aa2e7355e835f9447b17eb85c60032a)) +* **taiko-client:** introduce blob-server and blob-l1-beacon hive tests ([#18121](https://github.com/taikoxyz/taiko-mono/issues/18121)) ([c544fe8](https://github.com/taikoxyz/taiko-mono/commit/c544fe8c33e26bfae951fb15c423aec2b749d092)) +* **taiko-client:** upgrade full sync and snap sync hive tests ([#18010](https://github.com/taikoxyz/taiko-mono/issues/18010)) ([1d18c17](https://github.com/taikoxyz/taiko-mono/commit/1d18c170566aed645e2e03b024e7fe2f2a01756d)) + + +### Workflow + +* **protocol:** avoid installing `netcat` in action ([#18159](https://github.com/taikoxyz/taiko-mono/issues/18159)) ([7e27d1d](https://github.com/taikoxyz/taiko-mono/commit/7e27d1de388755b167d864df37133bfedafa2462)) + +## [0.36.0](https://github.com/taikoxyz/taiko-mono/compare/taiko-client-v0.35.0...taiko-client-v0.36.0) (2024-09-12) + + +### Features + +* **taiko-client:** update Go contract bindings after protocol restructure ([#18075](https://github.com/taikoxyz/taiko-mono/issues/18075)) ([57f4953](https://github.com/taikoxyz/taiko-mono/commit/57f49530828e6da2d28ab3979576befdee626c7d)) + +## [0.35.0](https://github.com/taikoxyz/taiko-mono/compare/taiko-client-v0.34.1...taiko-client-v0.35.0) (2024-09-10) + + +### Features + +* **taiko-client:** add two more new ZK related metrics ([#18043](https://github.com/taikoxyz/taiko-mono/issues/18043)) ([e43eeac](https://github.com/taikoxyz/taiko-mono/commit/e43eeacb5b7a3d1fc412ffafc39f329f68ff7b40)) +* **taiko-client:** remove the legacy `290` tier ([#18035](https://github.com/taikoxyz/taiko-mono/issues/18035)) ([5064037](https://github.com/taikoxyz/taiko-mono/commit/50640377db773763c3ccba1bc4f342cd1e497147)) +* **taiko-client:** update `ontakeForkHeight` to Sep 24, 2024 ([#18047](https://github.com/taikoxyz/taiko-mono/issues/18047)) ([a1ff620](https://github.com/taikoxyz/taiko-mono/commit/a1ff620507e4a8077705c981c3622e3787a55ecd)) +* **taiko-client:** update contract binding & add `Proposer` ([#18053](https://github.com/taikoxyz/taiko-mono/issues/18053)) ([d0554a2](https://github.com/taikoxyz/taiko-mono/commit/d0554a208c4913751ff5b273f3e96ca298279d14)) +* **taiko-client:** use `proveBlocks` by default for post ontake blocks ([#18042](https://github.com/taikoxyz/taiko-mono/issues/18042)) ([15709af](https://github.com/taikoxyz/taiko-mono/commit/15709af1520251f4baeba7d2bbbc8de841bee718)) + + +### Bug Fixes + +* **taiko-client:** use proposed at, not timestamp when fetching blob ([#18055](https://github.com/taikoxyz/taiko-mono/issues/18055)) ([32d95c1](https://github.com/taikoxyz/taiko-mono/commit/32d95c1d9e887e886da57e580554413b4f3a19c5)) + +## [0.34.1](https://github.com/taikoxyz/taiko-mono/compare/taiko-client-v0.34.0...taiko-client-v0.34.1) (2024-09-04) + + +### Bug Fixes + +* **taiko-client:** temp support tier 290 ([#18030](https://github.com/taikoxyz/taiko-mono/issues/18030)) ([f1aeac3](https://github.com/taikoxyz/taiko-mono/commit/f1aeac39d3c2ce06578a64bbe8a2fe4343d212f4)) + +## [0.34.0](https://github.com/taikoxyz/taiko-mono/compare/taiko-client-v0.33.1...taiko-client-v0.34.0) (2024-09-02) + + +### Features + +* **taiko-client:** introduce sp1 zk proof ([#18003](https://github.com/taikoxyz/taiko-mono/issues/18003)) ([492c208](https://github.com/taikoxyz/taiko-mono/commit/492c208b97e8fa08eb3e11b0a8712a5542eba660)) +* **taiko-client:** remove an unused field in prover ([#18024](https://github.com/taikoxyz/taiko-mono/issues/18024)) ([5d416d2](https://github.com/taikoxyz/taiko-mono/commit/5d416d2366e485b242818fb1a15eb0281cb7cedf)) +* **taiko-client:** remove an unused filed in proposer ([#18021](https://github.com/taikoxyz/taiko-mono/issues/18021)) ([64fdf5c](https://github.com/taikoxyz/taiko-mono/commit/64fdf5c80708b14d2cefadfbd78ee59810df3f65)) +* **taiko-client:** update Go contract bindings ([#18012](https://github.com/taikoxyz/taiko-mono/issues/18012)) ([7f054ca](https://github.com/taikoxyz/taiko-mono/commit/7f054ca4505313f8fc500cdb28bf223a254424e2)) + +## [0.33.1](https://github.com/taikoxyz/taiko-mono/compare/taiko-client-v0.33.0...taiko-client-v0.33.1) (2024-08-30) + + +### Bug Fixes + +* **taiko-client:** initialize private mempool transaction sender in `InitFromConfig` ([#18005](https://github.com/taikoxyz/taiko-mono/issues/18005)) ([58f1c85](https://github.com/taikoxyz/taiko-mono/commit/58f1c85ad471a545f8f00bfd32b3241657f38e8f)) + +## [0.33.0](https://github.com/taikoxyz/taiko-mono/compare/taiko-client-v0.32.0...taiko-client-v0.33.0) (2024-08-29) + + +### Features + +* **taiko-client:** introduce `CalculateBaseFee()` method ([#17989](https://github.com/taikoxyz/taiko-mono/issues/17989)) ([fdee419](https://github.com/taikoxyz/taiko-mono/commit/fdee4195541e5c675561cf34c5e1a9e3e3990bbf)) +* **taiko-client:** introduce `TxMgrSelector` for proposer / prover ([#17986](https://github.com/taikoxyz/taiko-mono/issues/17986)) ([6eb298f](https://github.com/taikoxyz/taiko-mono/commit/6eb298f31723e838ac4261fbecbfcfce371d8606)) +* **taiko-client:** update Go contract bindings ([#17997](https://github.com/taikoxyz/taiko-mono/issues/17997)) ([606114f](https://github.com/taikoxyz/taiko-mono/commit/606114faa0b5642055455f07cbd7ec2c3c23b00c)) +* **taiko-client:** update protocol configs temporarily ([#17999](https://github.com/taikoxyz/taiko-mono/issues/17999)) ([7893700](https://github.com/taikoxyz/taiko-mono/commit/789370090ffb7d985b2d9d55bf4efec8495df6bd)) + + +### Bug Fixes + +* **taiko-client:** fix CallOpts and `TestTreasuryIncome` test case ([#18000](https://github.com/taikoxyz/taiko-mono/issues/18000)) ([5707a08](https://github.com/taikoxyz/taiko-mono/commit/5707a08ffab3c981f0f23bcb8c7833176903d183)) + + +### Chores + +* **taiko-client:** don't use color prefix in log's terminal handler ([#17991](https://github.com/taikoxyz/taiko-mono/issues/17991)) ([1675cec](https://github.com/taikoxyz/taiko-mono/commit/1675cecab5773d1c4fdf82b8e000a6f5bebddfc6)) + + +### Tests + +* **taiko-client:** support full sync and snap sync in hive test ([#17995](https://github.com/taikoxyz/taiko-mono/issues/17995)) ([831198b](https://github.com/taikoxyz/taiko-mono/commit/831198baecc5f0e10c5c8fac1c04f9dad320c63c)) +* **taiko-client:** support multi clusters reorg hive test ([#17987](https://github.com/taikoxyz/taiko-mono/issues/17987)) ([28d9072](https://github.com/taikoxyz/taiko-mono/commit/28d90729adc391cb04b58fa2c32a9e3bfbd989a5)) + +## [0.32.0](https://github.com/taikoxyz/taiko-mono/compare/taiko-client-v0.31.0...taiko-client-v0.32.0) (2024-08-27) + + +### Features + +* **taiko-client:** add optional `l1.private` ([#17962](https://github.com/taikoxyz/taiko-mono/issues/17962)) ([9274f2d](https://github.com/taikoxyz/taiko-mono/commit/9274f2dc90f18c58cc208146f584c9f9715d3d60)) +* **taiko-client:** optimising statistics on proof request times ([#17976](https://github.com/taikoxyz/taiko-mono/issues/17976)) ([791f44f](https://github.com/taikoxyz/taiko-mono/commit/791f44f381fa362f24c4beff5b5b25c47929bbc4)) + + +### Bug Fixes + +* **taiko-client:** fix some issues about `calculateBaseFee` ([#17978](https://github.com/taikoxyz/taiko-mono/issues/17978)) ([b010efe](https://github.com/taikoxyz/taiko-mono/commit/b010efe195259e7c98e0ad6fb91b0c6484ae2b80)) +* **taiko-client:** prints logs when using `privateTxMgr` ([#17980](https://github.com/taikoxyz/taiko-mono/issues/17980)) ([a0c3388](https://github.com/taikoxyz/taiko-mono/commit/a0c33882ca00fb834001abac95b6ade656d55e87)) + + +### Chores + +* **taiko-client:** fix lint errors ([#17969](https://github.com/taikoxyz/taiko-mono/issues/17969)) ([eedec99](https://github.com/taikoxyz/taiko-mono/commit/eedec991c92d5fcd418cde4db9d16c9b36122a0a)) +* **taiko-client:** keep env vars same with the flag name ([#17964](https://github.com/taikoxyz/taiko-mono/issues/17964)) ([d08a1de](https://github.com/taikoxyz/taiko-mono/commit/d08a1de8a36a4bac484bf0390728cb8ed87b3a0b)) + + +### Tests + +* **taiko-client:** introduce multi nodes hive test ([#17981](https://github.com/taikoxyz/taiko-mono/issues/17981)) ([9910863](https://github.com/taikoxyz/taiko-mono/commit/9910863865ecf7f583552e74f6a5d2e1a4060dca)) +* **taiko-client:** introduce reorg hive test ([#17965](https://github.com/taikoxyz/taiko-mono/issues/17965)) ([ab601ee](https://github.com/taikoxyz/taiko-mono/commit/ab601eea813190a314555c1773a982de16da0e59)) +* **taiko-client:** open container logs and close build image logs ([#17959](https://github.com/taikoxyz/taiko-mono/issues/17959)) ([b541201](https://github.com/taikoxyz/taiko-mono/commit/b54120141f0e18f1912db66d28390d2a92af36c9)) +* **taiko-client:** update HIVE test configurations ([#17950](https://github.com/taikoxyz/taiko-mono/issues/17950)) ([4818274](https://github.com/taikoxyz/taiko-mono/commit/4818274860e8d626e5456479a520229e7c17f31c)) + +## [0.31.0](https://github.com/taikoxyz/taiko-mono/compare/taiko-client-v0.30.0...taiko-client-v0.31.0) (2024-08-20) + + +### Features + +* **taiko-client:** update hekla's protocol config ([#17955](https://github.com/taikoxyz/taiko-mono/issues/17955)) ([4b6a70d](https://github.com/taikoxyz/taiko-mono/commit/4b6a70dd4fb22146ee6702b8484a4a2b4fbce6c2)) + +## [0.30.0](https://github.com/taikoxyz/taiko-mono/compare/taiko-client-v0.29.0...taiko-client-v0.30.0) (2024-08-19) + + +### Features + +* **protocol:** introduce `AssembleAnchorV2Tx` method in `AnchorTxConstructor` ([#17850](https://github.com/taikoxyz/taiko-mono/issues/17850)) ([f71b178](https://github.com/taikoxyz/taiko-mono/commit/f71b1780eb98ff3cbbcf7def4388837f33e3fe37)) +* **protocol:** introduce risc0 proof ([#17877](https://github.com/taikoxyz/taiko-mono/issues/17877)) ([bcb57cb](https://github.com/taikoxyz/taiko-mono/commit/bcb57cb81d12d0c09656582ad9140b38015b3a58)) +* **taiko-client:** add `RaikoZKVMHostEndpoint` and rename ([#17926](https://github.com/taikoxyz/taiko-mono/issues/17926)) ([0838f79](https://github.com/taikoxyz/taiko-mono/commit/0838f7993015fc9fc9cacfb3da7b100d52bc856c)) +* **taiko-client:** changes based on the latest basefee improvements ([#17911](https://github.com/taikoxyz/taiko-mono/issues/17911)) ([0c10ac9](https://github.com/taikoxyz/taiko-mono/commit/0c10ac9c4973d3ef8a5e35a8646516639b328fa0)) +* **taiko-client:** client changes for `ontake` fork ([#17746](https://github.com/taikoxyz/taiko-mono/issues/17746)) ([2aabf3d](https://github.com/taikoxyz/taiko-mono/commit/2aabf3de3456ce8cbd56d15be336d08445b9f242)) +* **taiko-client:** client updates based on [#17871](https://github.com/taikoxyz/taiko-mono/issues/17871) ([#17873](https://github.com/taikoxyz/taiko-mono/issues/17873)) ([dbed3ab](https://github.com/taikoxyz/taiko-mono/commit/dbed3aba3d7f49f982f6335b79f5d5b096f890a3)) +* **taiko-client:** introduce `BasefeeSharingPctg` in `BlockMetadata` ([#17853](https://github.com/taikoxyz/taiko-mono/issues/17853)) ([5f2d696](https://github.com/taikoxyz/taiko-mono/commit/5f2d6961b9d077e47f34bf7f5d1fbffaf380bde1)) +* **taiko-client:** introduce `TaikoDataBlockV2` ([#17936](https://github.com/taikoxyz/taiko-mono/issues/17936)) ([c608116](https://github.com/taikoxyz/taiko-mono/commit/c608116523922fa4664968dc73608a118b5b97ba)) +* **taiko-client:** introduce `TierZkVMRisc0ID` ([#17915](https://github.com/taikoxyz/taiko-mono/issues/17915)) ([96aa5c2](https://github.com/taikoxyz/taiko-mono/commit/96aa5c2a5cd096ac3560fe17106ec042a877bfc1)) +* **taiko-client:** remove `basefeeSharingPctg` from metadata ([#17890](https://github.com/taikoxyz/taiko-mono/issues/17890)) ([57c8f6f](https://github.com/taikoxyz/taiko-mono/commit/57c8f6f3a8f920bab8fecd75bfa36a6b71ef808d)) +* **taiko-client:** update `BlockParamsV2` struct ([#17893](https://github.com/taikoxyz/taiko-mono/issues/17893)) ([a1043a8](https://github.com/taikoxyz/taiko-mono/commit/a1043a85631892e0b03e0f9f4bb850d4e9a70967)) +* **taiko-client:** update Go contract bindings ([#17869](https://github.com/taikoxyz/taiko-mono/issues/17869)) ([d9bd72b](https://github.com/taikoxyz/taiko-mono/commit/d9bd72b76aa0bed4ccfe834053f6561a53e1367d)) +* **taiko-client:** update Go contract bindings ([#17885](https://github.com/taikoxyz/taiko-mono/issues/17885)) ([3179074](https://github.com/taikoxyz/taiko-mono/commit/31790747cfc743b218d5a3568b9d70b64df5a86c)) +* **taiko-client:** update ontake basefee calculation ([#17892](https://github.com/taikoxyz/taiko-mono/issues/17892)) ([6972dea](https://github.com/taikoxyz/taiko-mono/commit/6972dea313edbc9a30617d2f7aea2dfc9230c432)) + + +### Bug Fixes + +* **taiko-client:** avoid seting nil value to `GuardianProverHeartbeater` ([#17802](https://github.com/taikoxyz/taiko-mono/issues/17802)) ([4076324](https://github.com/taikoxyz/taiko-mono/commit/40763241b5f2960f019d6be7e1040c65765f938a)) +* **taiko-client:** fix zk status recognition ([#17946](https://github.com/taikoxyz/taiko-mono/issues/17946)) ([164e476](https://github.com/taikoxyz/taiko-mono/commit/164e47686f41cbb119a230c7a1ad56ef4d0b3117)) + + +### Chores + +* **protocol:** revert `TAIKO_TOKEN` name changes in `DeployOnL1` ([#17927](https://github.com/taikoxyz/taiko-mono/issues/17927)) ([cf1a15f](https://github.com/taikoxyz/taiko-mono/commit/cf1a15f46344e60448c5fdcbcae02521fb5b7c04)) +* **taiko-client:** add hive tests to workflow ([#17897](https://github.com/taikoxyz/taiko-mono/issues/17897)) ([323d728](https://github.com/taikoxyz/taiko-mono/commit/323d7285d83b83adfd220747fb3f55b5cd72d877)) +* **taiko-client:** update `hive_tests.sh` ([#17923](https://github.com/taikoxyz/taiko-mono/issues/17923)) ([05d49b0](https://github.com/taikoxyz/taiko-mono/commit/05d49b07f9131bc034d00ad6cb7b7868a9af2bfc)) + + +### Code Refactoring + +* **taiko-client:** rm unused `L1_NODE_HTTP_ENDPOINT` ([#17768](https://github.com/taikoxyz/taiko-mono/issues/17768)) ([73c7aee](https://github.com/taikoxyz/taiko-mono/commit/73c7aeeffaffbf875af84e8be595af828877be2b)) + + +### Tests + +* **taiko-client:** update hive dependence and fix bug about hive test ([#17930](https://github.com/taikoxyz/taiko-mono/issues/17930)) ([dd40a4e](https://github.com/taikoxyz/taiko-mono/commit/dd40a4e6696b9c27135823cd545e7e5249a66e8c)) +* **taiko-client:** use env names which defined in flag configs ([#17921](https://github.com/taikoxyz/taiko-mono/issues/17921)) ([196b74e](https://github.com/taikoxyz/taiko-mono/commit/196b74eb2b4498bc3e6511915e011a885fcc530f)) + +## [0.29.0](https://github.com/taikoxyz/taiko-mono/compare/taiko-client-v0.28.0...taiko-client-v0.29.0) (2024-07-05) + + +### Features + +* **taiko-client:** add `--epoch.minTip` flag ([#17726](https://github.com/taikoxyz/taiko-mono/issues/17726)) ([a331e9d](https://github.com/taikoxyz/taiko-mono/commit/a331e9d88b72f5f07e43a711dd9a3ac913c4d4f6)) +* **taiko-client:** add `defaultRequestTimeout` for `SGXProofProducer` ([#17724](https://github.com/taikoxyz/taiko-mono/issues/17724)) ([e301451](https://github.com/taikoxyz/taiko-mono/commit/e3014519cebaef6a5a37d7982121c39f5b82ee27)) +* **taiko-client:** add proof status check before generating proof ([#17711](https://github.com/taikoxyz/taiko-mono/issues/17711)) ([9a8e15e](https://github.com/taikoxyz/taiko-mono/commit/9a8e15eccb720dda3a703937aae5c8ae3dc495c2)) +* **taiko-client:** call `CreateAccessList` ([#17691](https://github.com/taikoxyz/taiko-mono/issues/17691)) ([9bb4b9c](https://github.com/taikoxyz/taiko-mono/commit/9bb4b9c94f3bc2a8fef1c793d13bf749d8c0614f)) +* **taiko-client:** improve `ProverProvenByGuardianGauge` metric ([#17703](https://github.com/taikoxyz/taiko-mono/issues/17703)) ([c88fcd1](https://github.com/taikoxyz/taiko-mono/commit/c88fcd11fa29beb6a7529e5b8bf172a6a9cd6ecd)) +* **taiko-client:** introduce `--epoch.allowZeroInterval` flag ([#17727](https://github.com/taikoxyz/taiko-mono/issues/17727)) ([e76890d](https://github.com/taikoxyz/taiko-mono/commit/e76890d9223cdd68d3d97202a9a12a1f6d9b217f)) +* **taiko-client:** introduce `AccessList` ([#17676](https://github.com/taikoxyz/taiko-mono/issues/17676)) ([3c95477](https://github.com/taikoxyz/taiko-mono/commit/3c95477a284ac94c7e3ce85c9cefdadc1aaacd06)) +* **taiko-client:** introduce `TryDecompressHekla()` ([#17735](https://github.com/taikoxyz/taiko-mono/issues/17735)) ([67a7a37](https://github.com/taikoxyz/taiko-mono/commit/67a7a372a3931a0959a2422c753e97bddaa35961)) +* **taiko-client:** make request timeout to raiko configurable ([#17728](https://github.com/taikoxyz/taiko-mono/issues/17728)) ([f8f796c](https://github.com/taikoxyz/taiko-mono/commit/f8f796cc87e1d2398af299716960c9d03cdfcb35)) +* **taiko-client:** remove prover server package ([#17748](https://github.com/taikoxyz/taiko-mono/issues/17748)) ([b064ea0](https://github.com/taikoxyz/taiko-mono/commit/b064ea0a22413a7856cd7d41a2ac92a0beeba556)) +* **taiko-client:** revert access list changes ([#17694](https://github.com/taikoxyz/taiko-mono/issues/17694)) ([fd15dab](https://github.com/taikoxyz/taiko-mono/commit/fd15dabc01666fdbee949a9ecb6805d2ce8fc7f9)) +* **taiko-client:** update bindings && fix tests ([#17680](https://github.com/taikoxyz/taiko-mono/issues/17680)) ([10b95e1](https://github.com/taikoxyz/taiko-mono/commit/10b95e1c54dfe77de2badbe77439c2449cc9a65e)) +* **taiko-client:** update Go contract bindings ([#17733](https://github.com/taikoxyz/taiko-mono/issues/17733)) ([9d18504](https://github.com/taikoxyz/taiko-mono/commit/9d185041c7fe9c3787f1a73f89bb0dc6cfce32bc)) + + +### Code Refactoring + +* **taiko-client:** rm tier fee related flag ([#17750](https://github.com/taikoxyz/taiko-mono/issues/17750)) ([b41437b](https://github.com/taikoxyz/taiko-mono/commit/b41437b47a8ad3bc68edbfb8d9aea6b2fbbe9b05)) +* **taiko-client:** rm unused code and refactor ([#17723](https://github.com/taikoxyz/taiko-mono/issues/17723)) ([8c9a032](https://github.com/taikoxyz/taiko-mono/commit/8c9a0329b2702d68e18ba97c506c5d1ad20c92c7)) +* **taiko-client:** rm unused tier fee ([#17740](https://github.com/taikoxyz/taiko-mono/issues/17740)) ([3e139fa](https://github.com/taikoxyz/taiko-mono/commit/3e139fa4114807d68d02d2af30c7d5ad3759ec38)) + +## [0.28.0](https://github.com/taikoxyz/taiko-mono/compare/taiko-client-v0.27.1...taiko-client-v0.28.0) (2024-06-24) + + +### Features + +* **taiko-client:** improve some comments in prover ([#17668](https://github.com/taikoxyz/taiko-mono/issues/17668)) ([e7afcfe](https://github.com/taikoxyz/taiko-mono/commit/e7afcfe18399240fbac04a7d90a52fe17edcab67)) + + +### Chores + +* **taiko-client:** revert the failed cross-compilation ([#17670](https://github.com/taikoxyz/taiko-mono/issues/17670)) ([0a1de79](https://github.com/taikoxyz/taiko-mono/commit/0a1de792eaf0c17de1b873a465febe1dca9ce16a)) + +## [0.27.1](https://github.com/taikoxyz/taiko-mono/compare/taiko-client-v0.27.0...taiko-client-v0.27.1) (2024-06-24) + + +### Bug Fixes + +* **taiko-client:** remove Go build cache ([#17661](https://github.com/taikoxyz/taiko-mono/issues/17661)) ([f6075f7](https://github.com/taikoxyz/taiko-mono/commit/f6075f75ca57b8136e7edfed2b73912c79ccec63)) + +## [0.27.0](https://github.com/taikoxyz/taiko-mono/compare/taiko-client-v0.26.0...taiko-client-v0.27.0) (2024-06-24) + + +### Features + +* **taiko-client:** build using cross-compilation ([#17564](https://github.com/taikoxyz/taiko-mono/issues/17564)) ([e66a0c8](https://github.com/taikoxyz/taiko-mono/commit/e66a0c889eade8e323255d3129faa4fd512d5c94)) +* **taiko-client:** disable hook in client ([#17642](https://github.com/taikoxyz/taiko-mono/issues/17642)) ([099ce22](https://github.com/taikoxyz/taiko-mono/commit/099ce22139e8c545a46369dce158de4b9bb6297e)) +* **taiko-client:** update Go contract bindings ([#17568](https://github.com/taikoxyz/taiko-mono/issues/17568)) ([f190919](https://github.com/taikoxyz/taiko-mono/commit/f19091941362609b736bbbf1eee28fc459fc324a)) + +## [0.26.0](https://github.com/taikoxyz/taiko-mono/compare/taiko-client-v0.25.0...taiko-client-v0.26.0) (2024-06-08) + + +### Features + +* **taiko-client:** allow hooks to be empty if prover and proposer are the same address ([#17520](https://github.com/taikoxyz/taiko-mono/issues/17520)) ([2db6d2c](https://github.com/taikoxyz/taiko-mono/commit/2db6d2c3a978b75f0f57337f1481d1a1066594ea)) + + +### Bug Fixes + +* **taiko-client:** fix an address check in `AssignProver` ([#17526](https://github.com/taikoxyz/taiko-mono/issues/17526)) ([d6001d3](https://github.com/taikoxyz/taiko-mono/commit/d6001d3f52bed12ff962c7558b9fc173fc964ddb)) + ## [0.25.0](https://github.com/taikoxyz/taiko-mono/compare/taiko-client-v0.24.0...taiko-client-v0.25.0) (2024-06-04) diff --git a/packages/taiko-client/Dockerfile b/packages/taiko-client/Dockerfile index 6e3a83944b6..12edb318ae7 100644 --- a/packages/taiko-client/Dockerfile +++ b/packages/taiko-client/Dockerfile @@ -1,4 +1,4 @@ -FROM golang:1.21-alpine as builder +FROM golang:1.23-alpine as builder RUN apk update && apk add --no-cache --update gcc musl-dev linux-headers git make build-base @@ -10,8 +10,7 @@ COPY packages/taiko-client/ packages/taiko-client/ WORKDIR /build/packages/taiko-client -RUN --mount=type=cache,target=/root/.cache/go-build,sharing=locked \ - make build +RUN make build FROM alpine:latest @@ -20,5 +19,7 @@ RUN apk add --no-cache ca-certificates libstdc++ COPY --from=builder /build/packages/taiko-client/bin/taiko-client /usr/local/bin/ EXPOSE 6060 +EXPOSE 1234 +EXPOSE 1235 ENTRYPOINT ["taiko-client"] diff --git a/packages/taiko-client/Makefile b/packages/taiko-client/Makefile index e375ef6799f..3bfdd7396e6 100644 --- a/packages/taiko-client/Makefile +++ b/packages/taiko-client/Makefile @@ -14,15 +14,20 @@ clean: lint: @go install golang.org/x/tools/cmd/goimports@latest \ - && go install github.com/golangci/golangci-lint/cmd/golangci-lint@v1.56.2 \ + && go install github.com/golangci/golangci-lint/cmd/golangci-lint@v1.60 \ && goimports -local "github.com/taikoxyz/taiko-mono/packages/taiko-client" -w ./ \ && golangci-lint run -test: lint +test: @PACKAGE=${PACKAGE} \ + L2_NODE=$${L2_NODE:-l2_geth} \ RUN_TESTS=true \ ./integration_test/entrypoint.sh +# HIVE_BASE_DIR(the path of git@github.com:taikoxyz/hive.git) is necessary when run hive_test in local environment. +hive_tests: + @sh ./integration_test/hive_tests.sh + dev_net: @COMPILE_PROTOCOL=${COMPILE_PROTOCOL} \ ./integration_test/entrypoint.sh @@ -35,5 +40,6 @@ gen_bindings: clean \ lint \ test \ + hive_tests \ dev_net \ gen_bindings diff --git a/packages/taiko-client/README.md b/packages/taiko-client/README.md index 5ba73def53c..70ff96eadbe 100644 --- a/packages/taiko-client/README.md +++ b/packages/taiko-client/README.md @@ -1,11 +1,11 @@ # taiko-client -[![CI](https://github.com/taikoxyz/taiko-mono/actions/workflows/taiko-client-test.yml/badge.svg)](https://github.com/taikoxyz/taiko-mono/actions/workflows/taiko-client-test.yml) +[![CI](https://github.com/taikoxyz/taiko-mono/actions/workflows/taiko-client--test.yml/badge.svg)](https://github.com/taikoxyz/taiko-mono/actions/workflows/taiko-client-test.yml) -Taiko protocol's client software implementation in Go. Learn more about Taiko nodes with [the docs](https://docs.taiko.xyz/core-concepts/taiko-nodes/). +Taiko protocol's client software implementation in Go. Learn more about Taiko nodes with [the docs](https://docs.taiko.xyz/taiko-protocol/taiko-nodes). ## Project structure diff --git a/packages/taiko-client/bindings/.githead b/packages/taiko-client/bindings/.githead index c574c41185b..98ef6c34a28 100644 --- a/packages/taiko-client/bindings/.githead +++ b/packages/taiko-client/bindings/.githead @@ -1 +1 @@ -3ae25fdfc1452c0088afd2711dfbdbbefb670efc +54d27a0c7ac9afb266a3a7deb19947d1ef0c78e7 diff --git a/packages/taiko-client/bindings/encoding/custom_error.go b/packages/taiko-client/bindings/encoding/custom_error.go index 0c78ab8b8da..f453500c4e7 100644 --- a/packages/taiko-client/bindings/encoding/custom_error.go +++ b/packages/taiko-client/bindings/encoding/custom_error.go @@ -89,6 +89,12 @@ func getErrorData(err error) string { return errData } } + + // Anvil node custom errors with reasons, example: + // execution reverted: custom error 1a83d90e:, reason: 0x1a83d90e" + if strings.Contains(err.Error(), "custom error") && strings.Contains(err.Error(), "reason") { + return "0x" + err.Error()[len(err.Error())-8:len(err.Error())] + } // Anvil node custom errors, example: // "execution reverted: custom error 712eb087:" if strings.Contains(err.Error(), "custom error") { diff --git a/packages/taiko-client/bindings/encoding/input.go b/packages/taiko-client/bindings/encoding/input.go index 2aa5b021efc..cf6aa6ab893 100644 --- a/packages/taiko-client/bindings/encoding/input.go +++ b/packages/taiko-client/bindings/encoding/input.go @@ -1,17 +1,15 @@ package encoding import ( - "bytes" - "encoding/binary" "errors" "fmt" + "math/big" "github.com/ethereum/go-ethereum/accounts/abi" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/log" "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/metadata" ) // ABI arguments marshaling components. @@ -73,6 +71,118 @@ var ( Name: "sender", Type: "address", }, + { + Name: "blobTxListOffset", + Type: "uint32", + }, + { + Name: "blobTxListLength", + Type: "uint32", + }, + } + blockMetadataV2Components = []abi.ArgumentMarshaling{ + { + Name: "anchorBlockHash", + Type: "bytes32", + }, + { + Name: "difficulty", + Type: "bytes32", + }, + { + Name: "blobHash", + Type: "bytes32", + }, + { + Name: "extraData", + Type: "bytes32", + }, + { + Name: "coinbase", + Type: "address", + }, + { + Name: "id", + Type: "uint64", + }, + { + Name: "gasLimit", + Type: "uint32", + }, + { + Name: "timestamp", + Type: "uint64", + }, + { + Name: "anchorBlockId", + Type: "uint64", + }, + { + Name: "minTier", + Type: "uint16", + }, + { + Name: "blobUsed", + Type: "bool", + }, + { + Name: "parentMetaHash", + Type: "bytes32", + }, + { + Name: "proposer", + Type: "address", + }, + { + Name: "livenessBond", + Type: "uint96", + }, + { + Name: "proposedAt", + Type: "uint64", + }, + { + Name: "proposedIn", + Type: "uint64", + }, + { + Name: "blobTxListOffset", + Type: "uint32", + }, + { + Name: "blobTxListLength", + Type: "uint32", + }, + { + Name: "blobIndex", + Type: "uint8", + }, + { + Name: "baseFeeConfig", + Type: "tuple", + Components: []abi.ArgumentMarshaling{ + { + Name: "adjustmentQuotient", + Type: "uint8", + }, + { + Name: "sharingPctg", + Type: "uint8", + }, + { + Name: "gasIssuancePerSecond", + Type: "uint32", + }, + { + Name: "minGasExcess", + Type: "uint64", + }, + { + Name: "maxGasIssuancePerBlock", + Type: "uint32", + }, + }, + }, } transitionComponents = []abi.ArgumentMarshaling{ { @@ -137,104 +247,92 @@ var ( Name: "signature", Type: "bytes", }, - } - proverAssignmentComponents = []abi.ArgumentMarshaling{ { - Name: "feeToken", - Type: "address", + Name: "l1StateBlockNumber", + Type: "uint32", }, { - Name: "expiry", + Name: "timestamp", Type: "uint64", }, { - Name: "maxBlockId", - Type: "uint64", + Name: "blobTxListOffset", + Type: "uint32", }, { - Name: "maxProposedIn", - Type: "uint64", + Name: "blobTxListLength", + Type: "uint32", }, { - Name: "metaHash", - Type: "bytes32", + Name: "blobIndex", + Type: "uint8", + }, + } + blockParamsV2Components = []abi.ArgumentMarshaling{ + { + Name: "proposer", + Type: "address", + }, + { + Name: "coinbase", + Type: "address", }, { Name: "parentMetaHash", Type: "bytes32", }, { - Name: "tierFees", - Type: "tuple[]", - Components: []abi.ArgumentMarshaling{ - { - Name: "tier", - Type: "uint16", - }, - { - Name: "fee", - Type: "uint128", - }, - }, + Name: "anchorBlockId", + Type: "uint64", }, { - Name: "signature", - Type: "bytes", + Name: "timestamp", + Type: "uint64", }, - } - assignmentHookInputComponents = []abi.ArgumentMarshaling{ { - Name: "assignment", - Type: "tuple", - Components: proverAssignmentComponents, + Name: "blobTxListOffset", + Type: "uint32", }, { - Name: "tip", - Type: "uint256", + Name: "blobTxListLength", + Type: "uint32", + }, + { + Name: "blobIndex", + Type: "uint8", }, } ) var ( - assignmentHookInputType, _ = abi.NewType("tuple", "AssignmentHook.Input", assignmentHookInputComponents) - assignmentHookInputArgs = abi.Arguments{{Name: "AssignmentHook.Input", Type: assignmentHookInputType}} - blockParamsComponentsType, _ = abi.NewType("tuple", "TaikoData.BlockParams", blockParamsComponents) - blockParamsComponentsArgs = abi.Arguments{{Name: "TaikoData.BlockParams", Type: blockParamsComponentsType}} - // ProverAssignmentPayload - bytes32Type, _ = abi.NewType("bytes32", "", nil) - addressType, _ = abi.NewType("address", "", nil) - uint64Type, _ = abi.NewType("uint64", "", nil) - tierFeesType, _ = abi.NewType( - "tuple[]", - "", - []abi.ArgumentMarshaling{ - { - Name: "tier", - Type: "uint16", - }, - { - Name: "fee", - Type: "uint128", - }, - }, - ) - proverAssignmentHashPayloadArgs = abi.Arguments{ - {Name: "_assignment.metaHash", Type: bytes32Type}, - {Name: "_assignment.parentMetaHash", Type: bytes32Type}, - {Name: "_assignment.feeToken", Type: addressType}, - {Name: "_assignment.expiry", Type: uint64Type}, - {Name: "_assignment.maxBlockId", Type: uint64Type}, - {Name: "_assignment.maxProposedIn", Type: uint64Type}, - {Name: "_assignment.tierFees", Type: tierFeesType}, - } - blockMetadataComponentsType, _ = abi.NewType("tuple", "TaikoData.BlockMetadata", blockMetadataComponents) - transitionComponentsType, _ = abi.NewType("tuple", "TaikoData.Transition", transitionComponents) - tierProofComponentsType, _ = abi.NewType("tuple", "TaikoData.TierProof", tierProofComponents) - proveBlockInputArgs = abi.Arguments{ + blockParamsComponentsType, _ = abi.NewType("tuple", "TaikoData.BlockParams", blockParamsComponents) + blockParamsComponentsArgs = abi.Arguments{{Name: "TaikoData.BlockParams", Type: blockParamsComponentsType}} + blockParamsV2ComponentsType, _ = abi.NewType("tuple", "TaikoData.BlockParamsV2", blockParamsV2Components) + blockParamsV2ComponentsArgs = abi.Arguments{{Name: "TaikoData.BlockParamsV2", Type: blockParamsV2ComponentsType}} + blockMetadataComponentsType, _ = abi.NewType("tuple", "TaikoData.BlockMetadata", blockMetadataComponents) + blockMetadataV2ComponentsType, _ = abi.NewType("tuple", "TaikoData.BlockMetadataV2", blockMetadataV2Components) + transitionComponentsType, _ = abi.NewType("tuple", "TaikoData.Transition", transitionComponents) + tierProofComponentsType, _ = abi.NewType("tuple", "TaikoData.TierProof", tierProofComponents) + proveBlockInputArgs = abi.Arguments{ {Name: "TaikoData.BlockMetadata", Type: blockMetadataComponentsType}, {Name: "TaikoData.Transition", Type: transitionComponentsType}, {Name: "TaikoData.TierProof", Type: tierProofComponentsType}, } + proveOntakeBlockInputArgs = abi.Arguments{ + {Name: "TaikoData.BlockMetadataV2", Type: blockMetadataV2ComponentsType}, + {Name: "TaikoData.Transition", Type: transitionComponentsType}, + {Name: "TaikoData.TierProof", Type: tierProofComponentsType}, + } + stringType, _ = abi.NewType("string", "TAIKO_DIFFICULTY", nil) + uint64Type, _ = abi.NewType("uint64", "local.b.numBlocks", nil) + difficultyCalculationInputArgs = abi.Arguments{{Type: stringType}, {Type: uint64Type}} + proveBlocksInputArgs = abi.Arguments{ + {Name: "TaikoData.BlockMetadata", Type: blockMetadataV2ComponentsType}, + {Name: "TaikoData.Transition", Type: transitionComponentsType}, + } + proveBlocksBatchProofArgs = abi.Arguments{ + {Name: "TaikoData.TierProof", Type: tierProofComponentsType}, + } ) // Contract ABIs. @@ -247,7 +345,6 @@ var ( LibProvingABI *abi.ABI LibUtilsABI *abi.ABI LibVerifyingABI *abi.ABI - AssignmentHookABI *abi.ABI SGXVerifierABI *abi.ABI GuardianVerifierABI *abi.ABI ProverSetABI *abi.ABI @@ -290,10 +387,6 @@ func init() { log.Crit("Get LibVerifying ABI error", "error", err) } - if AssignmentHookABI, err = bindings.AssignmentHookMetaData.GetAbi(); err != nil { - log.Crit("Get AssignmentHook ABI error", "error", err) - } - if SGXVerifierABI, err = bindings.SgxVerifierMetaData.GetAbi(); err != nil { log.Crit("Get SGXVerifier ABI error", err) } @@ -314,7 +407,6 @@ func init() { LibProvingABI.Errors, LibUtilsABI.Errors, LibVerifyingABI.Errors, - AssignmentHookABI.Errors, SGXVerifierABI.Errors, GuardianVerifierABI.Errors, ProverSetABI.Errors, @@ -330,68 +422,91 @@ func EncodeBlockParams(params *BlockParams) ([]byte, error) { return b, nil } -// EncodeAssignmentHookInput performs the solidity `abi.encode` for the given input -func EncodeAssignmentHookInput(input *AssignmentHookInput) ([]byte, error) { - b, err := assignmentHookInputArgs.Pack(input) +// EncodeBlockParamsOntake performs the solidity `abi.encode` for the given ontake blockParams. +func EncodeBlockParamsOntake(params *BlockParamsV2) ([]byte, error) { + b, err := blockParamsV2ComponentsArgs.Pack(params) if err != nil { - return nil, fmt.Errorf("failed to abi.encode assignment hook input params, %w", err) + return nil, fmt.Errorf("failed to abi.encode ontake block params, %w", err) } return b, nil } -// EncodeProverAssignmentPayload performs the solidity `abi.encode` for the given proverAssignment payload. -func EncodeProverAssignmentPayload( - chainID uint64, - taikoAddress common.Address, - assignmentHookAddress common.Address, - blockProposer common.Address, - assignedProver common.Address, - blobHash common.Hash, - feeToken common.Address, - expiry uint64, - maxBlockID uint64, - maxProposedIn uint64, - tierFees []TierFee, +// EncodeProveBlockInput performs the solidity `abi.encode` for the given TaikoL1.proveBlock input. +func EncodeProveBlockInput( + meta metadata.TaikoBlockMetaData, + transition *bindings.TaikoDataTransition, + tierProof *bindings.TaikoDataTierProof, ) ([]byte, error) { - hashBytesPayload, err := proverAssignmentHashPayloadArgs.Pack( - common.Hash{}, - common.Hash{}, - feeToken, - expiry, - maxBlockID, - maxProposedIn, - tierFees, + var ( + b []byte + err error ) + if meta.IsOntakeBlock() { + if b, err = proveOntakeBlockInputArgs.Pack( + meta.(*metadata.TaikoDataBlockMetadataOntake).InnerMetadata(), + transition, + tierProof, + ); err != nil { + return nil, fmt.Errorf("failed to abi.encode TakoL1.proveBlock input after ontake fork, %w", err) + } + } else { + if b, err = proveBlockInputArgs.Pack( + meta.(*metadata.TaikoDataBlockMetadataLegacy).InnerMetadata(), + transition, + tierProof, + ); err != nil { + return nil, fmt.Errorf("failed to abi.encode TakoL1.proveBlock input, %w", err) + } + } + + return b, nil +} + +// EncodeDifficultCalcutionParams performs the solidity `abi.encode` for the +// `block.difficulty` hash payload. +func EncodeDifficultyCalcutionParams(numBlocks uint64) ([]byte, error) { + b, err := difficultyCalculationInputArgs.Pack("TAIKO_DIFFICULTY", numBlocks) if err != nil { - return nil, fmt.Errorf("failed to abi.encode prover assignment hash payload, %w", err) - } - - chainIDBytes := make([]byte, 8) - binary.BigEndian.PutUint64(chainIDBytes, chainID) - - return bytes.Join([][]byte{ - common.RightPadBytes([]byte("PROVER_ASSIGNMENT"), 32), - chainIDBytes, - taikoAddress.Bytes(), - blockProposer.Bytes(), - assignedProver.Bytes(), - blobHash.Bytes(), - crypto.Keccak256Hash(hashBytesPayload).Bytes(), - assignmentHookAddress.Bytes(), - }, nil), nil + return nil, fmt.Errorf("failed to abi.encode `block.difficulty` hash payload, %w", err) + } + return b, nil } -// EncodeProveBlockInput performs the solidity `abi.encode` for the given TaikoL1.proveBlock input. -func EncodeProveBlockInput( - meta *bindings.TaikoDataBlockMetadata, - transition *bindings.TaikoDataTransition, +// EncodeProveBlocksInput performs the solidity `abi.encode` for the given TaikoL1.proveBlocks input. +func EncodeProveBlocksInput( + metas []metadata.TaikoBlockMetaData, + transitions []bindings.TaikoDataTransition, +) ([][]byte, error) { + if len(metas) != len(transitions) { + return nil, fmt.Errorf("both arrays of TaikoBlockMetaData and TaikoDataTransition must be equal in length") + } + b := make([][]byte, 0, len(metas)) + for i := range metas { + input, err := proveBlocksInputArgs.Pack( + metas[i].(*metadata.TaikoDataBlockMetadataOntake).InnerMetadata(), + transitions[i], + ) + if err != nil { + return nil, fmt.Errorf("failed to abi.encode TaikoL1.proveBlocks input item after ontake fork, %w", err) + } + + b = append(b, input) + } + + return b, nil +} + +// EncodeProveBlocksBatchProof performs the solidity `abi.encode` for the given TaikoL1.proveBlocks batchProof. +func EncodeProveBlocksBatchProof( tierProof *bindings.TaikoDataTierProof, ) ([]byte, error) { - b, err := proveBlockInputArgs.Pack(meta, transition, tierProof) + input, err := proveBlocksBatchProofArgs.Pack( + tierProof, + ) if err != nil { - return nil, fmt.Errorf("failed to abi.encode TakoL1.proveBlock input, %w", err) + return nil, fmt.Errorf("failed to abi.encode TaikoL1.proveBlocks input item after ontake fork, %w", err) } - return b, nil + return input, nil } // UnpackTxListBytes unpacks the input data of a TaikoL1.proposeBlock transaction, and returns the txList bytes. @@ -402,7 +517,7 @@ func UnpackTxListBytes(txData []byte) ([]byte, error) { } // Only check for safety. - if method.Name != "proposeBlock" { + if method.Name != "proposeBlock" && method.Name != "proposeBlockV2" { return nil, fmt.Errorf("invalid method name: %s", method.Name) } @@ -420,3 +535,13 @@ func UnpackTxListBytes(txData []byte) ([]byte, error) { return inputs, nil } + +// EncodeBaseFeeConfig encodes the block.extraData field from the given base fee config. +func EncodeBaseFeeConfig(baseFeeConfig *bindings.LibSharedDataBaseFeeConfig) [32]byte { + var ( + bytes32Value [32]byte + uintValue = new(big.Int).SetUint64(uint64(baseFeeConfig.SharingPctg)) + ) + copy(bytes32Value[32-len(uintValue.Bytes()):], uintValue.Bytes()) + return bytes32Value +} diff --git a/packages/taiko-client/bindings/encoding/input_test.go b/packages/taiko-client/bindings/encoding/input_test.go index ea99ad7a9f2..761bcef252a 100644 --- a/packages/taiko-client/bindings/encoding/input_test.go +++ b/packages/taiko-client/bindings/encoding/input_test.go @@ -2,7 +2,6 @@ package encoding import ( "context" - "math/big" "os" "testing" @@ -16,43 +15,6 @@ import ( "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings" ) -func TestEncodeProverAssignmentPayload(t *testing.T) { - encoded, err := EncodeProverAssignmentPayload( - randomHash().Big().Uint64(), - common.BytesToAddress(randomBytes(20)), - common.BytesToAddress(randomBytes(20)), - common.BytesToAddress(randomBytes(20)), - common.BytesToAddress(randomBytes(20)), - common.BytesToHash(randomBytes(32)), - common.BytesToAddress(randomBytes(20)), - 120, - 1024, - 0, - []TierFee{{Tier: 0, Fee: common.Big1}}, - ) - - require.Nil(t, err) - require.NotNil(t, encoded) -} - -func TestEncodeAssignmentHookInput(t *testing.T) { - encoded, err := EncodeAssignmentHookInput(&AssignmentHookInput{ - Assignment: &ProverAssignment{ - FeeToken: common.Address{}, - Expiry: 1, - MaxBlockId: 1, - MaxProposedIn: 1, - MetaHash: [32]byte{0xff}, - TierFees: []TierFee{{Tier: 0, Fee: common.Big1}}, - Signature: []byte{0xff}, - }, - Tip: big.NewInt(1), - }) - - require.Nil(t, err) - require.NotNil(t, encoded) -} - func TestUnpackTxListBytes(t *testing.T) { _, err := UnpackTxListBytes(randomBytes(1024)) require.NotNil(t, err) @@ -65,14 +27,14 @@ func TestUnpackTxListBytes(t *testing.T) { ) require.ErrorContains(t, err, "no method with id") - cli, err := ethclient.Dial(os.Getenv("L1_NODE_WS_ENDPOINT")) + cli, err := ethclient.Dial(os.Getenv("L1_WS")) require.Nil(t, err) chainID, err := cli.ChainID(context.Background()) require.Nil(t, err) taikoL1, err := bindings.NewTaikoL1Client( - common.HexToAddress(os.Getenv("TAIKO_L1_ADDRESS")), + common.HexToAddress(os.Getenv("TAIKO_L1")), cli, ) require.Nil(t, err) @@ -88,7 +50,7 @@ func TestUnpackTxListBytes(t *testing.T) { txListBytes := randomBytes(1024) - tx, err := taikoL1.ProposeBlock( + tx, err := taikoL1.ProposeBlockV2( opts, randomBytes(1024), txListBytes, diff --git a/packages/taiko-client/bindings/encoding/struct.go b/packages/taiko-client/bindings/encoding/struct.go index e230bb94e18..1997f2e3f84 100644 --- a/packages/taiko-client/bindings/encoding/struct.go +++ b/packages/taiko-client/bindings/encoding/struct.go @@ -6,23 +6,20 @@ import ( "github.com/ethereum/go-ethereum/beacon/engine" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" + + "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings" ) // Tier IDs defined in protocol. var ( TierOptimisticID uint16 = 100 TierSgxID uint16 = 200 + TierZkVMRisc0ID uint16 = 250 + TierZkVMSp1ID uint16 = 251 TierSgxAndZkVMID uint16 = 300 TierGuardianMinorityID uint16 = 900 TierGuardianMajorityID uint16 = 1000 - ProtocolTiers = []uint16{ - TierOptimisticID, - TierSgxID, - TierSgxAndZkVMID, - TierGuardianMinorityID, - TierGuardianMajorityID, - } - GoldenTouchPrivKey = "92954368afd3caa1f3ce3ead0069c1af414054aefe1ef9aeacc1bf426222ce38" + GoldenTouchPrivKey = "92954368afd3caa1f3ce3ead0069c1af414054aefe1ef9aeacc1bf426222ce38" ) // HookCall should be same with TaikoData.HookCall @@ -33,12 +30,29 @@ type HookCall struct { // BlockParams should be same with TaikoData.BlockParams. type BlockParams struct { - AssignedProver common.Address - Coinbase common.Address - ExtraData [32]byte - ParentMetaHash [32]byte - HookCalls []HookCall - Signature []byte + AssignedProver common.Address + Coinbase common.Address + ExtraData [32]byte + ParentMetaHash [32]byte + HookCalls []HookCall + Signature []byte + L1StateBlockNumber uint32 + Timestamp uint64 + BlobTxListOffset uint32 + BlobTxListLength uint32 + BlobIndex uint8 +} + +// BlockParamsV2 should be same with TaikoData.BlockParamsV2. +type BlockParamsV2 struct { + Proposer common.Address + Coinbase common.Address + ParentMetaHash [32]byte + AnchorBlockId uint64 + Timestamp uint64 + BlobTxListOffset uint32 + BlobTxListLength uint32 + BlobIndex uint8 } // TierFee should be same with TaikoData.TierFee. @@ -47,24 +61,6 @@ type TierFee struct { Fee *big.Int } -// ProverAssignment should be same with TaikoData.ProverAssignment. -type ProverAssignment struct { - FeeToken common.Address - Expiry uint64 - MaxBlockId uint64 // nolint: revive,stylecheck - MaxProposedIn uint64 - MetaHash [32]byte - ParentMetaHash [32]byte - TierFees []TierFee - Signature []byte -} - -// AssignmentHookInput should be same as AssignmentHook.Input -type AssignmentHookInput struct { - Assignment *ProverAssignment - Tip *big.Int -} - // ToExecutableData converts a GETH *types.Header to *engine.ExecutableData. func ToExecutableData(header *types.Header) *engine.ExecutableData { executableData := &engine.ExecutableData{ @@ -91,6 +87,66 @@ func ToExecutableData(header *types.Header) *engine.ExecutableData { return executableData } +// TransitionProvedEventToV2 converts a *bindings.TaikoL1ClientTransitionProved +// to *bindings.TaikoL1ClientTransitionProvedV2. +func TransitionProvedEventToV2( + e *bindings.TaikoL1ClientTransitionProved, + proposedIn uint64, +) *bindings.TaikoL1ClientTransitionProvedV2 { + return &bindings.TaikoL1ClientTransitionProvedV2{ + BlockId: e.BlockId, + Tran: e.Tran, + Prover: e.Prover, + ValidityBond: e.ValidityBond, + Tier: e.Tier, + ProposedIn: proposedIn, + Raw: e.Raw, + } +} + +// TransitionContestedEventToV2 converts a *bindings.TaikoL1ClientTransitionContested +// to *bindings.TaikoL1ClientTransitionContestedV2. +func TransitionContestedEventToV2( + e *bindings.TaikoL1ClientTransitionContested, + proposedIn uint64, +) *bindings.TaikoL1ClientTransitionContestedV2 { + return &bindings.TaikoL1ClientTransitionContestedV2{ + BlockId: e.BlockId, + Tran: e.Tran, + Contester: e.Contester, + ContestBond: e.ContestBond, + Tier: e.Tier, + ProposedIn: proposedIn, + Raw: e.Raw, + } +} + +// BlockVerifiedEventToV2 converts a *bindings.TaikoL1ClientBlockVerified to *bindings.TaikoL1ClientBlockVerifiedV2. +func BlockVerifiedEventToV2(e *bindings.TaikoL1ClientBlockVerified) *bindings.TaikoL1ClientBlockVerifiedV2 { + return &bindings.TaikoL1ClientBlockVerifiedV2{ + BlockId: e.BlockId, + Prover: e.Prover, + BlockHash: e.BlockHash, + Tier: e.Tier, + Raw: e.Raw, + } +} + +// BlockVerifiedEventToV2 converts a *bindings.TaikoDataBlock to *bindings.TaikoDataBlockV2. +func TaikoDataBlockToV2(b *bindings.TaikoDataBlock) *bindings.TaikoDataBlockV2 { + return &bindings.TaikoDataBlockV2{ + MetaHash: b.MetaHash, + AssignedProver: b.AssignedProver, + LivenessBond: b.LivenessBond, + BlockId: b.BlockId, + ProposedAt: b.ProposedAt, + ProposedIn: b.ProposedIn, + NextTransitionId: big.NewInt(int64(b.NextTransitionId)), + LivenessBondReturned: false, + VerifiedTransitionId: big.NewInt(int64(b.VerifiedTransitionId)), + } +} + // BloomToBytes converts a types.Bloom to [8][32]byte slice. func BloomToBytes(bloom types.Bloom) [8][32]byte { b := [8][32]byte{} diff --git a/packages/taiko-client/bindings/encoding/struct_test.go b/packages/taiko-client/bindings/encoding/struct_test.go index 8caf76b66ad..96763b69222 100644 --- a/packages/taiko-client/bindings/encoding/struct_test.go +++ b/packages/taiko-client/bindings/encoding/struct_test.go @@ -11,7 +11,7 @@ import ( "github.com/ethereum/go-ethereum/log" "github.com/stretchr/testify/require" - "github.com/taikoxyz/taiko-mono/packages/taiko-client/internal/utils" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/utils" ) var ( diff --git a/packages/taiko-client/bindings/gen_address_manager.go b/packages/taiko-client/bindings/gen_address_manager.go index ea9f99a412e..f7f31e0f586 100644 --- a/packages/taiko-client/bindings/gen_address_manager.go +++ b/packages/taiko-client/bindings/gen_address_manager.go @@ -31,7 +31,7 @@ var ( // AddressManagerMetaData contains all meta data concerning the AddressManager contract. var AddressManagerMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addressManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAddress\",\"inputs\":[{\"name\":\"_chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"impl\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"inNonReentrant\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"init\",\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"init2\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setAddress\",\"inputs\":[{\"name\":\"_chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_newAddress\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeTo\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"event\",\"name\":\"AddressSet\",\"inputs\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"name\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"newAddress\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"oldAddress\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AdminChanged\",\"inputs\":[{\"name\":\"previousAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconUpgraded\",\"inputs\":[{\"name\":\"beacon\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AM_ADDRESS_ALREADY_SET\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FUNC_NOT_IMPLEMENTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"REENTRANT_CALL\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_INVALID_MANAGER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_UNEXPECTED_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_ZERO_ADDR\",\"inputs\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ZERO_ADDRESS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_VALUE\",\"inputs\":[]}]", + ABI: "[{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addressManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAddress\",\"inputs\":[{\"name\":\"_chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"impl\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"inNonReentrant\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"init\",\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"init2\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setAddress\",\"inputs\":[{\"name\":\"_chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_newAddress\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeTo\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"event\",\"name\":\"AddressSet\",\"inputs\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"name\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"newAddress\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"oldAddress\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AdminChanged\",\"inputs\":[{\"name\":\"previousAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconUpgraded\",\"inputs\":[{\"name\":\"beacon\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AM_ADDRESS_ALREADY_SET\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FUNC_NOT_IMPLEMENTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"REENTRANT_CALL\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_INVALID_MANAGER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_UNEXPECTED_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_ZERO_ADDR\",\"inputs\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ZERO_ADDRESS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_VALUE\",\"inputs\":[]}]", } // AddressManagerABI is the input ABI used to generate the binding from. diff --git a/packages/taiko-client/bindings/gen_assignment_hook.go b/packages/taiko-client/bindings/gen_assignment_hook.go deleted file mode 100644 index 5c327c3ac1f..00000000000 --- a/packages/taiko-client/bindings/gen_assignment_hook.go +++ /dev/null @@ -1,2026 +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 - _ = abi.ConvertType -) - -// AssignmentHookProverAssignment is an auto generated low-level Go binding around an user-defined struct. -type AssignmentHookProverAssignment struct { - FeeToken common.Address - Expiry uint64 - MaxBlockId uint64 - MaxProposedIn uint64 - MetaHash [32]byte - ParentMetaHash [32]byte - TierFees []TaikoDataTierFee - Signature []byte -} - -// TaikoDataTierFee is an auto generated low-level Go binding around an user-defined struct. -type TaikoDataTierFee struct { - Tier uint16 - Fee *big.Int -} - -// AssignmentHookMetaData contains all meta data concerning the AssignmentHook contract. -var AssignmentHookMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"function\",\"name\":\"MAX_GAS_PAYING_PROVER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addressManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"hashAssignment\",\"inputs\":[{\"name\":\"_assignment\",\"type\":\"tuple\",\"internalType\":\"structAssignmentHook.ProverAssignment\",\"components\":[{\"name\":\"feeToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"expiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxProposedIn\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"metaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"parentMetaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"tierFees\",\"type\":\"tuple[]\",\"internalType\":\"structTaikoData.TierFee[]\",\"components\":[{\"name\":\"tier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"fee\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"_taikoL1Address\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_blockProposer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_assignedProver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_blobHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"impl\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"inNonReentrant\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"init\",\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_addressManager\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"onBlockProposed\",\"inputs\":[{\"name\":\"_blk\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.Block\",\"components\":[{\"name\":\"metaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"assignedProver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"livenessBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"proposedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"proposedIn\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nextTransitionId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"verifiedTransitionId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"_meta\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.BlockMetadata\",\"components\":[{\"name\":\"l1Hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"difficulty\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blobHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"extraData\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"depositsHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"coinbase\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"l1Height\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minTier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"blobUsed\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"parentMetaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"_data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeTo\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"event\",\"name\":\"AdminChanged\",\"inputs\":[{\"name\":\"previousAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconUpgraded\",\"inputs\":[{\"name\":\"beacon\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"EtherPaymentFailed\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"maxGas\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"ETH_TRANSFER_FAILED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FUNC_NOT_IMPLEMENTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"HOOK_ASSIGNMENT_EXPIRED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"HOOK_ASSIGNMENT_INVALID_SIG\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"HOOK_TIER_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"REENTRANT_CALL\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_INVALID_MANAGER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_UNEXPECTED_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_ZERO_ADDR\",\"inputs\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ZERO_ADDRESS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_VALUE\",\"inputs\":[]}]", -} - -// AssignmentHookABI is the input ABI used to generate the binding from. -// Deprecated: Use AssignmentHookMetaData.ABI instead. -var AssignmentHookABI = AssignmentHookMetaData.ABI - -// AssignmentHook is an auto generated Go binding around an Ethereum contract. -type AssignmentHook struct { - AssignmentHookCaller // Read-only binding to the contract - AssignmentHookTransactor // Write-only binding to the contract - AssignmentHookFilterer // Log filterer for contract events -} - -// AssignmentHookCaller is an auto generated read-only Go binding around an Ethereum contract. -type AssignmentHookCaller struct { - contract *bind.BoundContract // Generic contract wrapper for the low level calls -} - -// AssignmentHookTransactor is an auto generated write-only Go binding around an Ethereum contract. -type AssignmentHookTransactor struct { - contract *bind.BoundContract // Generic contract wrapper for the low level calls -} - -// AssignmentHookFilterer is an auto generated log filtering Go binding around an Ethereum contract events. -type AssignmentHookFilterer struct { - contract *bind.BoundContract // Generic contract wrapper for the low level calls -} - -// AssignmentHookSession is an auto generated Go binding around an Ethereum contract, -// with pre-set call and transact options. -type AssignmentHookSession struct { - Contract *AssignmentHook // 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 -} - -// AssignmentHookCallerSession is an auto generated read-only Go binding around an Ethereum contract, -// with pre-set call options. -type AssignmentHookCallerSession struct { - Contract *AssignmentHookCaller // Generic contract caller binding to set the session for - CallOpts bind.CallOpts // Call options to use throughout this session -} - -// AssignmentHookTransactorSession is an auto generated write-only Go binding around an Ethereum contract, -// with pre-set transact options. -type AssignmentHookTransactorSession struct { - Contract *AssignmentHookTransactor // Generic contract transactor binding to set the session for - TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session -} - -// AssignmentHookRaw is an auto generated low-level Go binding around an Ethereum contract. -type AssignmentHookRaw struct { - Contract *AssignmentHook // Generic contract binding to access the raw methods on -} - -// AssignmentHookCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. -type AssignmentHookCallerRaw struct { - Contract *AssignmentHookCaller // Generic read-only contract binding to access the raw methods on -} - -// AssignmentHookTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. -type AssignmentHookTransactorRaw struct { - Contract *AssignmentHookTransactor // Generic write-only contract binding to access the raw methods on -} - -// NewAssignmentHook creates a new instance of AssignmentHook, bound to a specific deployed contract. -func NewAssignmentHook(address common.Address, backend bind.ContractBackend) (*AssignmentHook, error) { - contract, err := bindAssignmentHook(address, backend, backend, backend) - if err != nil { - return nil, err - } - return &AssignmentHook{AssignmentHookCaller: AssignmentHookCaller{contract: contract}, AssignmentHookTransactor: AssignmentHookTransactor{contract: contract}, AssignmentHookFilterer: AssignmentHookFilterer{contract: contract}}, nil -} - -// NewAssignmentHookCaller creates a new read-only instance of AssignmentHook, bound to a specific deployed contract. -func NewAssignmentHookCaller(address common.Address, caller bind.ContractCaller) (*AssignmentHookCaller, error) { - contract, err := bindAssignmentHook(address, caller, nil, nil) - if err != nil { - return nil, err - } - return &AssignmentHookCaller{contract: contract}, nil -} - -// NewAssignmentHookTransactor creates a new write-only instance of AssignmentHook, bound to a specific deployed contract. -func NewAssignmentHookTransactor(address common.Address, transactor bind.ContractTransactor) (*AssignmentHookTransactor, error) { - contract, err := bindAssignmentHook(address, nil, transactor, nil) - if err != nil { - return nil, err - } - return &AssignmentHookTransactor{contract: contract}, nil -} - -// NewAssignmentHookFilterer creates a new log filterer instance of AssignmentHook, bound to a specific deployed contract. -func NewAssignmentHookFilterer(address common.Address, filterer bind.ContractFilterer) (*AssignmentHookFilterer, error) { - contract, err := bindAssignmentHook(address, nil, nil, filterer) - if err != nil { - return nil, err - } - return &AssignmentHookFilterer{contract: contract}, nil -} - -// bindAssignmentHook binds a generic wrapper to an already deployed contract. -func bindAssignmentHook(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { - parsed, err := AssignmentHookMetaData.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 (_AssignmentHook *AssignmentHookRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { - return _AssignmentHook.Contract.AssignmentHookCaller.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 (_AssignmentHook *AssignmentHookRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { - return _AssignmentHook.Contract.AssignmentHookTransactor.contract.Transfer(opts) -} - -// Transact invokes the (paid) contract method with params as input values. -func (_AssignmentHook *AssignmentHookRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { - return _AssignmentHook.Contract.AssignmentHookTransactor.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 (_AssignmentHook *AssignmentHookCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { - return _AssignmentHook.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 (_AssignmentHook *AssignmentHookTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { - return _AssignmentHook.Contract.contract.Transfer(opts) -} - -// Transact invokes the (paid) contract method with params as input values. -func (_AssignmentHook *AssignmentHookTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { - return _AssignmentHook.Contract.contract.Transact(opts, method, params...) -} - -// MAXGASPAYINGPROVER is a free data retrieval call binding the contract method 0x12925031. -// -// Solidity: function MAX_GAS_PAYING_PROVER() view returns(uint256) -func (_AssignmentHook *AssignmentHookCaller) MAXGASPAYINGPROVER(opts *bind.CallOpts) (*big.Int, error) { - var out []interface{} - err := _AssignmentHook.contract.Call(opts, &out, "MAX_GAS_PAYING_PROVER") - - if err != nil { - return *new(*big.Int), err - } - - out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) - - return out0, err - -} - -// MAXGASPAYINGPROVER is a free data retrieval call binding the contract method 0x12925031. -// -// Solidity: function MAX_GAS_PAYING_PROVER() view returns(uint256) -func (_AssignmentHook *AssignmentHookSession) MAXGASPAYINGPROVER() (*big.Int, error) { - return _AssignmentHook.Contract.MAXGASPAYINGPROVER(&_AssignmentHook.CallOpts) -} - -// MAXGASPAYINGPROVER is a free data retrieval call binding the contract method 0x12925031. -// -// Solidity: function MAX_GAS_PAYING_PROVER() view returns(uint256) -func (_AssignmentHook *AssignmentHookCallerSession) MAXGASPAYINGPROVER() (*big.Int, error) { - return _AssignmentHook.Contract.MAXGASPAYINGPROVER(&_AssignmentHook.CallOpts) -} - -// AddressManager is a free data retrieval call binding the contract method 0x3ab76e9f. -// -// Solidity: function addressManager() view returns(address) -func (_AssignmentHook *AssignmentHookCaller) AddressManager(opts *bind.CallOpts) (common.Address, error) { - var out []interface{} - err := _AssignmentHook.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 (_AssignmentHook *AssignmentHookSession) AddressManager() (common.Address, error) { - return _AssignmentHook.Contract.AddressManager(&_AssignmentHook.CallOpts) -} - -// AddressManager is a free data retrieval call binding the contract method 0x3ab76e9f. -// -// Solidity: function addressManager() view returns(address) -func (_AssignmentHook *AssignmentHookCallerSession) AddressManager() (common.Address, error) { - return _AssignmentHook.Contract.AddressManager(&_AssignmentHook.CallOpts) -} - -// HashAssignment is a free data retrieval call binding the contract method 0xaf3a0228. -// -// Solidity: function hashAssignment((address,uint64,uint64,uint64,bytes32,bytes32,(uint16,uint128)[],bytes) _assignment, address _taikoL1Address, address _blockProposer, address _assignedProver, bytes32 _blobHash) view returns(bytes32) -func (_AssignmentHook *AssignmentHookCaller) HashAssignment(opts *bind.CallOpts, _assignment AssignmentHookProverAssignment, _taikoL1Address common.Address, _blockProposer common.Address, _assignedProver common.Address, _blobHash [32]byte) ([32]byte, error) { - var out []interface{} - err := _AssignmentHook.contract.Call(opts, &out, "hashAssignment", _assignment, _taikoL1Address, _blockProposer, _assignedProver, _blobHash) - - if err != nil { - return *new([32]byte), err - } - - out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) - - return out0, err - -} - -// HashAssignment is a free data retrieval call binding the contract method 0xaf3a0228. -// -// Solidity: function hashAssignment((address,uint64,uint64,uint64,bytes32,bytes32,(uint16,uint128)[],bytes) _assignment, address _taikoL1Address, address _blockProposer, address _assignedProver, bytes32 _blobHash) view returns(bytes32) -func (_AssignmentHook *AssignmentHookSession) HashAssignment(_assignment AssignmentHookProverAssignment, _taikoL1Address common.Address, _blockProposer common.Address, _assignedProver common.Address, _blobHash [32]byte) ([32]byte, error) { - return _AssignmentHook.Contract.HashAssignment(&_AssignmentHook.CallOpts, _assignment, _taikoL1Address, _blockProposer, _assignedProver, _blobHash) -} - -// HashAssignment is a free data retrieval call binding the contract method 0xaf3a0228. -// -// Solidity: function hashAssignment((address,uint64,uint64,uint64,bytes32,bytes32,(uint16,uint128)[],bytes) _assignment, address _taikoL1Address, address _blockProposer, address _assignedProver, bytes32 _blobHash) view returns(bytes32) -func (_AssignmentHook *AssignmentHookCallerSession) HashAssignment(_assignment AssignmentHookProverAssignment, _taikoL1Address common.Address, _blockProposer common.Address, _assignedProver common.Address, _blobHash [32]byte) ([32]byte, error) { - return _AssignmentHook.Contract.HashAssignment(&_AssignmentHook.CallOpts, _assignment, _taikoL1Address, _blockProposer, _assignedProver, _blobHash) -} - -// Impl is a free data retrieval call binding the contract method 0x8abf6077. -// -// Solidity: function impl() view returns(address) -func (_AssignmentHook *AssignmentHookCaller) Impl(opts *bind.CallOpts) (common.Address, error) { - var out []interface{} - err := _AssignmentHook.contract.Call(opts, &out, "impl") - - if err != nil { - return *new(common.Address), err - } - - out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) - - return out0, err - -} - -// Impl is a free data retrieval call binding the contract method 0x8abf6077. -// -// Solidity: function impl() view returns(address) -func (_AssignmentHook *AssignmentHookSession) Impl() (common.Address, error) { - return _AssignmentHook.Contract.Impl(&_AssignmentHook.CallOpts) -} - -// Impl is a free data retrieval call binding the contract method 0x8abf6077. -// -// Solidity: function impl() view returns(address) -func (_AssignmentHook *AssignmentHookCallerSession) Impl() (common.Address, error) { - return _AssignmentHook.Contract.Impl(&_AssignmentHook.CallOpts) -} - -// InNonReentrant is a free data retrieval call binding the contract method 0x3075db56. -// -// Solidity: function inNonReentrant() view returns(bool) -func (_AssignmentHook *AssignmentHookCaller) InNonReentrant(opts *bind.CallOpts) (bool, error) { - var out []interface{} - err := _AssignmentHook.contract.Call(opts, &out, "inNonReentrant") - - if err != nil { - return *new(bool), err - } - - out0 := *abi.ConvertType(out[0], new(bool)).(*bool) - - return out0, err - -} - -// InNonReentrant is a free data retrieval call binding the contract method 0x3075db56. -// -// Solidity: function inNonReentrant() view returns(bool) -func (_AssignmentHook *AssignmentHookSession) InNonReentrant() (bool, error) { - return _AssignmentHook.Contract.InNonReentrant(&_AssignmentHook.CallOpts) -} - -// InNonReentrant is a free data retrieval call binding the contract method 0x3075db56. -// -// Solidity: function inNonReentrant() view returns(bool) -func (_AssignmentHook *AssignmentHookCallerSession) InNonReentrant() (bool, error) { - return _AssignmentHook.Contract.InNonReentrant(&_AssignmentHook.CallOpts) -} - -// LastUnpausedAt is a free data retrieval call binding the contract method 0xe07baba6. -// -// Solidity: function lastUnpausedAt() view returns(uint64) -func (_AssignmentHook *AssignmentHookCaller) LastUnpausedAt(opts *bind.CallOpts) (uint64, error) { - var out []interface{} - err := _AssignmentHook.contract.Call(opts, &out, "lastUnpausedAt") - - if err != nil { - return *new(uint64), err - } - - out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) - - return out0, err - -} - -// LastUnpausedAt is a free data retrieval call binding the contract method 0xe07baba6. -// -// Solidity: function lastUnpausedAt() view returns(uint64) -func (_AssignmentHook *AssignmentHookSession) LastUnpausedAt() (uint64, error) { - return _AssignmentHook.Contract.LastUnpausedAt(&_AssignmentHook.CallOpts) -} - -// LastUnpausedAt is a free data retrieval call binding the contract method 0xe07baba6. -// -// Solidity: function lastUnpausedAt() view returns(uint64) -func (_AssignmentHook *AssignmentHookCallerSession) LastUnpausedAt() (uint64, error) { - return _AssignmentHook.Contract.LastUnpausedAt(&_AssignmentHook.CallOpts) -} - -// Owner is a free data retrieval call binding the contract method 0x8da5cb5b. -// -// Solidity: function owner() view returns(address) -func (_AssignmentHook *AssignmentHookCaller) Owner(opts *bind.CallOpts) (common.Address, error) { - var out []interface{} - err := _AssignmentHook.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 (_AssignmentHook *AssignmentHookSession) Owner() (common.Address, error) { - return _AssignmentHook.Contract.Owner(&_AssignmentHook.CallOpts) -} - -// Owner is a free data retrieval call binding the contract method 0x8da5cb5b. -// -// Solidity: function owner() view returns(address) -func (_AssignmentHook *AssignmentHookCallerSession) Owner() (common.Address, error) { - return _AssignmentHook.Contract.Owner(&_AssignmentHook.CallOpts) -} - -// Paused is a free data retrieval call binding the contract method 0x5c975abb. -// -// Solidity: function paused() view returns(bool) -func (_AssignmentHook *AssignmentHookCaller) Paused(opts *bind.CallOpts) (bool, error) { - var out []interface{} - err := _AssignmentHook.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 (_AssignmentHook *AssignmentHookSession) Paused() (bool, error) { - return _AssignmentHook.Contract.Paused(&_AssignmentHook.CallOpts) -} - -// Paused is a free data retrieval call binding the contract method 0x5c975abb. -// -// Solidity: function paused() view returns(bool) -func (_AssignmentHook *AssignmentHookCallerSession) Paused() (bool, error) { - return _AssignmentHook.Contract.Paused(&_AssignmentHook.CallOpts) -} - -// PendingOwner is a free data retrieval call binding the contract method 0xe30c3978. -// -// Solidity: function pendingOwner() view returns(address) -func (_AssignmentHook *AssignmentHookCaller) PendingOwner(opts *bind.CallOpts) (common.Address, error) { - var out []interface{} - err := _AssignmentHook.contract.Call(opts, &out, "pendingOwner") - - if err != nil { - return *new(common.Address), err - } - - out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) - - return out0, err - -} - -// PendingOwner is a free data retrieval call binding the contract method 0xe30c3978. -// -// Solidity: function pendingOwner() view returns(address) -func (_AssignmentHook *AssignmentHookSession) PendingOwner() (common.Address, error) { - return _AssignmentHook.Contract.PendingOwner(&_AssignmentHook.CallOpts) -} - -// PendingOwner is a free data retrieval call binding the contract method 0xe30c3978. -// -// Solidity: function pendingOwner() view returns(address) -func (_AssignmentHook *AssignmentHookCallerSession) PendingOwner() (common.Address, error) { - return _AssignmentHook.Contract.PendingOwner(&_AssignmentHook.CallOpts) -} - -// ProxiableUUID is a free data retrieval call binding the contract method 0x52d1902d. -// -// Solidity: function proxiableUUID() view returns(bytes32) -func (_AssignmentHook *AssignmentHookCaller) ProxiableUUID(opts *bind.CallOpts) ([32]byte, error) { - var out []interface{} - err := _AssignmentHook.contract.Call(opts, &out, "proxiableUUID") - - if err != nil { - return *new([32]byte), err - } - - out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) - - return out0, err - -} - -// ProxiableUUID is a free data retrieval call binding the contract method 0x52d1902d. -// -// Solidity: function proxiableUUID() view returns(bytes32) -func (_AssignmentHook *AssignmentHookSession) ProxiableUUID() ([32]byte, error) { - return _AssignmentHook.Contract.ProxiableUUID(&_AssignmentHook.CallOpts) -} - -// ProxiableUUID is a free data retrieval call binding the contract method 0x52d1902d. -// -// Solidity: function proxiableUUID() view returns(bytes32) -func (_AssignmentHook *AssignmentHookCallerSession) ProxiableUUID() ([32]byte, error) { - return _AssignmentHook.Contract.ProxiableUUID(&_AssignmentHook.CallOpts) -} - -// Resolve is a free data retrieval call binding the contract method 0x3eb6b8cf. -// -// Solidity: function resolve(uint64 _chainId, bytes32 _name, bool _allowZeroAddress) view returns(address) -func (_AssignmentHook *AssignmentHookCaller) Resolve(opts *bind.CallOpts, _chainId uint64, _name [32]byte, _allowZeroAddress bool) (common.Address, error) { - var out []interface{} - err := _AssignmentHook.contract.Call(opts, &out, "resolve", _chainId, _name, _allowZeroAddress) - - 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 0x3eb6b8cf. -// -// Solidity: function resolve(uint64 _chainId, bytes32 _name, bool _allowZeroAddress) view returns(address) -func (_AssignmentHook *AssignmentHookSession) Resolve(_chainId uint64, _name [32]byte, _allowZeroAddress bool) (common.Address, error) { - return _AssignmentHook.Contract.Resolve(&_AssignmentHook.CallOpts, _chainId, _name, _allowZeroAddress) -} - -// Resolve is a free data retrieval call binding the contract method 0x3eb6b8cf. -// -// Solidity: function resolve(uint64 _chainId, bytes32 _name, bool _allowZeroAddress) view returns(address) -func (_AssignmentHook *AssignmentHookCallerSession) Resolve(_chainId uint64, _name [32]byte, _allowZeroAddress bool) (common.Address, error) { - return _AssignmentHook.Contract.Resolve(&_AssignmentHook.CallOpts, _chainId, _name, _allowZeroAddress) -} - -// Resolve0 is a free data retrieval call binding the contract method 0xa86f9d9e. -// -// Solidity: function resolve(bytes32 _name, bool _allowZeroAddress) view returns(address) -func (_AssignmentHook *AssignmentHookCaller) Resolve0(opts *bind.CallOpts, _name [32]byte, _allowZeroAddress bool) (common.Address, error) { - var out []interface{} - err := _AssignmentHook.contract.Call(opts, &out, "resolve0", _name, _allowZeroAddress) - - if err != nil { - return *new(common.Address), err - } - - out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) - - return out0, err - -} - -// Resolve0 is a free data retrieval call binding the contract method 0xa86f9d9e. -// -// Solidity: function resolve(bytes32 _name, bool _allowZeroAddress) view returns(address) -func (_AssignmentHook *AssignmentHookSession) Resolve0(_name [32]byte, _allowZeroAddress bool) (common.Address, error) { - return _AssignmentHook.Contract.Resolve0(&_AssignmentHook.CallOpts, _name, _allowZeroAddress) -} - -// Resolve0 is a free data retrieval call binding the contract method 0xa86f9d9e. -// -// Solidity: function resolve(bytes32 _name, bool _allowZeroAddress) view returns(address) -func (_AssignmentHook *AssignmentHookCallerSession) Resolve0(_name [32]byte, _allowZeroAddress bool) (common.Address, error) { - return _AssignmentHook.Contract.Resolve0(&_AssignmentHook.CallOpts, _name, _allowZeroAddress) -} - -// AcceptOwnership is a paid mutator transaction binding the contract method 0x79ba5097. -// -// Solidity: function acceptOwnership() returns() -func (_AssignmentHook *AssignmentHookTransactor) AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) { - return _AssignmentHook.contract.Transact(opts, "acceptOwnership") -} - -// AcceptOwnership is a paid mutator transaction binding the contract method 0x79ba5097. -// -// Solidity: function acceptOwnership() returns() -func (_AssignmentHook *AssignmentHookSession) AcceptOwnership() (*types.Transaction, error) { - return _AssignmentHook.Contract.AcceptOwnership(&_AssignmentHook.TransactOpts) -} - -// AcceptOwnership is a paid mutator transaction binding the contract method 0x79ba5097. -// -// Solidity: function acceptOwnership() returns() -func (_AssignmentHook *AssignmentHookTransactorSession) AcceptOwnership() (*types.Transaction, error) { - return _AssignmentHook.Contract.AcceptOwnership(&_AssignmentHook.TransactOpts) -} - -// Init is a paid mutator transaction binding the contract method 0xf09a4016. -// -// Solidity: function init(address _owner, address _addressManager) returns() -func (_AssignmentHook *AssignmentHookTransactor) Init(opts *bind.TransactOpts, _owner common.Address, _addressManager common.Address) (*types.Transaction, error) { - return _AssignmentHook.contract.Transact(opts, "init", _owner, _addressManager) -} - -// Init is a paid mutator transaction binding the contract method 0xf09a4016. -// -// Solidity: function init(address _owner, address _addressManager) returns() -func (_AssignmentHook *AssignmentHookSession) Init(_owner common.Address, _addressManager common.Address) (*types.Transaction, error) { - return _AssignmentHook.Contract.Init(&_AssignmentHook.TransactOpts, _owner, _addressManager) -} - -// Init is a paid mutator transaction binding the contract method 0xf09a4016. -// -// Solidity: function init(address _owner, address _addressManager) returns() -func (_AssignmentHook *AssignmentHookTransactorSession) Init(_owner common.Address, _addressManager common.Address) (*types.Transaction, error) { - return _AssignmentHook.Contract.Init(&_AssignmentHook.TransactOpts, _owner, _addressManager) -} - -// OnBlockProposed is a paid mutator transaction binding the contract method 0x36b6ea4e. -// -// Solidity: function onBlockProposed((bytes32,address,uint96,uint64,uint64,uint64,uint32,uint32) _blk, (bytes32,bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address) _meta, bytes _data) payable returns() -func (_AssignmentHook *AssignmentHookTransactor) OnBlockProposed(opts *bind.TransactOpts, _blk TaikoDataBlock, _meta TaikoDataBlockMetadata, _data []byte) (*types.Transaction, error) { - return _AssignmentHook.contract.Transact(opts, "onBlockProposed", _blk, _meta, _data) -} - -// OnBlockProposed is a paid mutator transaction binding the contract method 0x36b6ea4e. -// -// Solidity: function onBlockProposed((bytes32,address,uint96,uint64,uint64,uint64,uint32,uint32) _blk, (bytes32,bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address) _meta, bytes _data) payable returns() -func (_AssignmentHook *AssignmentHookSession) OnBlockProposed(_blk TaikoDataBlock, _meta TaikoDataBlockMetadata, _data []byte) (*types.Transaction, error) { - return _AssignmentHook.Contract.OnBlockProposed(&_AssignmentHook.TransactOpts, _blk, _meta, _data) -} - -// OnBlockProposed is a paid mutator transaction binding the contract method 0x36b6ea4e. -// -// Solidity: function onBlockProposed((bytes32,address,uint96,uint64,uint64,uint64,uint32,uint32) _blk, (bytes32,bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address) _meta, bytes _data) payable returns() -func (_AssignmentHook *AssignmentHookTransactorSession) OnBlockProposed(_blk TaikoDataBlock, _meta TaikoDataBlockMetadata, _data []byte) (*types.Transaction, error) { - return _AssignmentHook.Contract.OnBlockProposed(&_AssignmentHook.TransactOpts, _blk, _meta, _data) -} - -// Pause is a paid mutator transaction binding the contract method 0x8456cb59. -// -// Solidity: function pause() returns() -func (_AssignmentHook *AssignmentHookTransactor) Pause(opts *bind.TransactOpts) (*types.Transaction, error) { - return _AssignmentHook.contract.Transact(opts, "pause") -} - -// Pause is a paid mutator transaction binding the contract method 0x8456cb59. -// -// Solidity: function pause() returns() -func (_AssignmentHook *AssignmentHookSession) Pause() (*types.Transaction, error) { - return _AssignmentHook.Contract.Pause(&_AssignmentHook.TransactOpts) -} - -// Pause is a paid mutator transaction binding the contract method 0x8456cb59. -// -// Solidity: function pause() returns() -func (_AssignmentHook *AssignmentHookTransactorSession) Pause() (*types.Transaction, error) { - return _AssignmentHook.Contract.Pause(&_AssignmentHook.TransactOpts) -} - -// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6. -// -// Solidity: function renounceOwnership() returns() -func (_AssignmentHook *AssignmentHookTransactor) RenounceOwnership(opts *bind.TransactOpts) (*types.Transaction, error) { - return _AssignmentHook.contract.Transact(opts, "renounceOwnership") -} - -// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6. -// -// Solidity: function renounceOwnership() returns() -func (_AssignmentHook *AssignmentHookSession) RenounceOwnership() (*types.Transaction, error) { - return _AssignmentHook.Contract.RenounceOwnership(&_AssignmentHook.TransactOpts) -} - -// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6. -// -// Solidity: function renounceOwnership() returns() -func (_AssignmentHook *AssignmentHookTransactorSession) RenounceOwnership() (*types.Transaction, error) { - return _AssignmentHook.Contract.RenounceOwnership(&_AssignmentHook.TransactOpts) -} - -// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b. -// -// Solidity: function transferOwnership(address newOwner) returns() -func (_AssignmentHook *AssignmentHookTransactor) TransferOwnership(opts *bind.TransactOpts, newOwner common.Address) (*types.Transaction, error) { - return _AssignmentHook.contract.Transact(opts, "transferOwnership", newOwner) -} - -// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b. -// -// Solidity: function transferOwnership(address newOwner) returns() -func (_AssignmentHook *AssignmentHookSession) TransferOwnership(newOwner common.Address) (*types.Transaction, error) { - return _AssignmentHook.Contract.TransferOwnership(&_AssignmentHook.TransactOpts, newOwner) -} - -// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b. -// -// Solidity: function transferOwnership(address newOwner) returns() -func (_AssignmentHook *AssignmentHookTransactorSession) TransferOwnership(newOwner common.Address) (*types.Transaction, error) { - return _AssignmentHook.Contract.TransferOwnership(&_AssignmentHook.TransactOpts, newOwner) -} - -// Unpause is a paid mutator transaction binding the contract method 0x3f4ba83a. -// -// Solidity: function unpause() returns() -func (_AssignmentHook *AssignmentHookTransactor) Unpause(opts *bind.TransactOpts) (*types.Transaction, error) { - return _AssignmentHook.contract.Transact(opts, "unpause") -} - -// Unpause is a paid mutator transaction binding the contract method 0x3f4ba83a. -// -// Solidity: function unpause() returns() -func (_AssignmentHook *AssignmentHookSession) Unpause() (*types.Transaction, error) { - return _AssignmentHook.Contract.Unpause(&_AssignmentHook.TransactOpts) -} - -// Unpause is a paid mutator transaction binding the contract method 0x3f4ba83a. -// -// Solidity: function unpause() returns() -func (_AssignmentHook *AssignmentHookTransactorSession) Unpause() (*types.Transaction, error) { - return _AssignmentHook.Contract.Unpause(&_AssignmentHook.TransactOpts) -} - -// UpgradeTo is a paid mutator transaction binding the contract method 0x3659cfe6. -// -// Solidity: function upgradeTo(address newImplementation) returns() -func (_AssignmentHook *AssignmentHookTransactor) UpgradeTo(opts *bind.TransactOpts, newImplementation common.Address) (*types.Transaction, error) { - return _AssignmentHook.contract.Transact(opts, "upgradeTo", newImplementation) -} - -// UpgradeTo is a paid mutator transaction binding the contract method 0x3659cfe6. -// -// Solidity: function upgradeTo(address newImplementation) returns() -func (_AssignmentHook *AssignmentHookSession) UpgradeTo(newImplementation common.Address) (*types.Transaction, error) { - return _AssignmentHook.Contract.UpgradeTo(&_AssignmentHook.TransactOpts, newImplementation) -} - -// UpgradeTo is a paid mutator transaction binding the contract method 0x3659cfe6. -// -// Solidity: function upgradeTo(address newImplementation) returns() -func (_AssignmentHook *AssignmentHookTransactorSession) UpgradeTo(newImplementation common.Address) (*types.Transaction, error) { - return _AssignmentHook.Contract.UpgradeTo(&_AssignmentHook.TransactOpts, newImplementation) -} - -// UpgradeToAndCall is a paid mutator transaction binding the contract method 0x4f1ef286. -// -// Solidity: function upgradeToAndCall(address newImplementation, bytes data) payable returns() -func (_AssignmentHook *AssignmentHookTransactor) UpgradeToAndCall(opts *bind.TransactOpts, newImplementation common.Address, data []byte) (*types.Transaction, error) { - return _AssignmentHook.contract.Transact(opts, "upgradeToAndCall", newImplementation, data) -} - -// UpgradeToAndCall is a paid mutator transaction binding the contract method 0x4f1ef286. -// -// Solidity: function upgradeToAndCall(address newImplementation, bytes data) payable returns() -func (_AssignmentHook *AssignmentHookSession) UpgradeToAndCall(newImplementation common.Address, data []byte) (*types.Transaction, error) { - return _AssignmentHook.Contract.UpgradeToAndCall(&_AssignmentHook.TransactOpts, newImplementation, data) -} - -// UpgradeToAndCall is a paid mutator transaction binding the contract method 0x4f1ef286. -// -// Solidity: function upgradeToAndCall(address newImplementation, bytes data) payable returns() -func (_AssignmentHook *AssignmentHookTransactorSession) UpgradeToAndCall(newImplementation common.Address, data []byte) (*types.Transaction, error) { - return _AssignmentHook.Contract.UpgradeToAndCall(&_AssignmentHook.TransactOpts, newImplementation, data) -} - -// AssignmentHookAdminChangedIterator is returned from FilterAdminChanged and is used to iterate over the raw logs and unpacked data for AdminChanged events raised by the AssignmentHook contract. -type AssignmentHookAdminChangedIterator struct { - Event *AssignmentHookAdminChanged // 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 *AssignmentHookAdminChangedIterator) 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(AssignmentHookAdminChanged) - 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(AssignmentHookAdminChanged) - 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 *AssignmentHookAdminChangedIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *AssignmentHookAdminChangedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// AssignmentHookAdminChanged represents a AdminChanged event raised by the AssignmentHook contract. -type AssignmentHookAdminChanged struct { - PreviousAdmin common.Address - NewAdmin common.Address - Raw types.Log // Blockchain specific contextual infos -} - -// FilterAdminChanged is a free log retrieval operation binding the contract event 0x7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f. -// -// Solidity: event AdminChanged(address previousAdmin, address newAdmin) -func (_AssignmentHook *AssignmentHookFilterer) FilterAdminChanged(opts *bind.FilterOpts) (*AssignmentHookAdminChangedIterator, error) { - - logs, sub, err := _AssignmentHook.contract.FilterLogs(opts, "AdminChanged") - if err != nil { - return nil, err - } - return &AssignmentHookAdminChangedIterator{contract: _AssignmentHook.contract, event: "AdminChanged", logs: logs, sub: sub}, nil -} - -// WatchAdminChanged is a free log subscription operation binding the contract event 0x7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f. -// -// Solidity: event AdminChanged(address previousAdmin, address newAdmin) -func (_AssignmentHook *AssignmentHookFilterer) WatchAdminChanged(opts *bind.WatchOpts, sink chan<- *AssignmentHookAdminChanged) (event.Subscription, error) { - - logs, sub, err := _AssignmentHook.contract.WatchLogs(opts, "AdminChanged") - 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(AssignmentHookAdminChanged) - if err := _AssignmentHook.contract.UnpackLog(event, "AdminChanged", 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 -} - -// ParseAdminChanged is a log parse operation binding the contract event 0x7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f. -// -// Solidity: event AdminChanged(address previousAdmin, address newAdmin) -func (_AssignmentHook *AssignmentHookFilterer) ParseAdminChanged(log types.Log) (*AssignmentHookAdminChanged, error) { - event := new(AssignmentHookAdminChanged) - if err := _AssignmentHook.contract.UnpackLog(event, "AdminChanged", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// AssignmentHookBeaconUpgradedIterator is returned from FilterBeaconUpgraded and is used to iterate over the raw logs and unpacked data for BeaconUpgraded events raised by the AssignmentHook contract. -type AssignmentHookBeaconUpgradedIterator struct { - Event *AssignmentHookBeaconUpgraded // 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 *AssignmentHookBeaconUpgradedIterator) 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(AssignmentHookBeaconUpgraded) - 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(AssignmentHookBeaconUpgraded) - 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 *AssignmentHookBeaconUpgradedIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *AssignmentHookBeaconUpgradedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// AssignmentHookBeaconUpgraded represents a BeaconUpgraded event raised by the AssignmentHook contract. -type AssignmentHookBeaconUpgraded struct { - Beacon common.Address - Raw types.Log // Blockchain specific contextual infos -} - -// FilterBeaconUpgraded is a free log retrieval operation binding the contract event 0x1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e. -// -// Solidity: event BeaconUpgraded(address indexed beacon) -func (_AssignmentHook *AssignmentHookFilterer) FilterBeaconUpgraded(opts *bind.FilterOpts, beacon []common.Address) (*AssignmentHookBeaconUpgradedIterator, error) { - - var beaconRule []interface{} - for _, beaconItem := range beacon { - beaconRule = append(beaconRule, beaconItem) - } - - logs, sub, err := _AssignmentHook.contract.FilterLogs(opts, "BeaconUpgraded", beaconRule) - if err != nil { - return nil, err - } - return &AssignmentHookBeaconUpgradedIterator{contract: _AssignmentHook.contract, event: "BeaconUpgraded", logs: logs, sub: sub}, nil -} - -// WatchBeaconUpgraded is a free log subscription operation binding the contract event 0x1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e. -// -// Solidity: event BeaconUpgraded(address indexed beacon) -func (_AssignmentHook *AssignmentHookFilterer) WatchBeaconUpgraded(opts *bind.WatchOpts, sink chan<- *AssignmentHookBeaconUpgraded, beacon []common.Address) (event.Subscription, error) { - - var beaconRule []interface{} - for _, beaconItem := range beacon { - beaconRule = append(beaconRule, beaconItem) - } - - logs, sub, err := _AssignmentHook.contract.WatchLogs(opts, "BeaconUpgraded", beaconRule) - 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(AssignmentHookBeaconUpgraded) - if err := _AssignmentHook.contract.UnpackLog(event, "BeaconUpgraded", 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 -} - -// ParseBeaconUpgraded is a log parse operation binding the contract event 0x1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e. -// -// Solidity: event BeaconUpgraded(address indexed beacon) -func (_AssignmentHook *AssignmentHookFilterer) ParseBeaconUpgraded(log types.Log) (*AssignmentHookBeaconUpgraded, error) { - event := new(AssignmentHookBeaconUpgraded) - if err := _AssignmentHook.contract.UnpackLog(event, "BeaconUpgraded", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// AssignmentHookEtherPaymentFailedIterator is returned from FilterEtherPaymentFailed and is used to iterate over the raw logs and unpacked data for EtherPaymentFailed events raised by the AssignmentHook contract. -type AssignmentHookEtherPaymentFailedIterator struct { - Event *AssignmentHookEtherPaymentFailed // 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 *AssignmentHookEtherPaymentFailedIterator) 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(AssignmentHookEtherPaymentFailed) - 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(AssignmentHookEtherPaymentFailed) - 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 *AssignmentHookEtherPaymentFailedIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *AssignmentHookEtherPaymentFailedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// AssignmentHookEtherPaymentFailed represents a EtherPaymentFailed event raised by the AssignmentHook contract. -type AssignmentHookEtherPaymentFailed struct { - To common.Address - MaxGas *big.Int - Raw types.Log // Blockchain specific contextual infos -} - -// FilterEtherPaymentFailed is a free log retrieval operation binding the contract event 0x193fbe934858a5b7669033de55612da355d11604360d59535b5bfaa25c42209e. -// -// Solidity: event EtherPaymentFailed(address to, uint256 maxGas) -func (_AssignmentHook *AssignmentHookFilterer) FilterEtherPaymentFailed(opts *bind.FilterOpts) (*AssignmentHookEtherPaymentFailedIterator, error) { - - logs, sub, err := _AssignmentHook.contract.FilterLogs(opts, "EtherPaymentFailed") - if err != nil { - return nil, err - } - return &AssignmentHookEtherPaymentFailedIterator{contract: _AssignmentHook.contract, event: "EtherPaymentFailed", logs: logs, sub: sub}, nil -} - -// WatchEtherPaymentFailed is a free log subscription operation binding the contract event 0x193fbe934858a5b7669033de55612da355d11604360d59535b5bfaa25c42209e. -// -// Solidity: event EtherPaymentFailed(address to, uint256 maxGas) -func (_AssignmentHook *AssignmentHookFilterer) WatchEtherPaymentFailed(opts *bind.WatchOpts, sink chan<- *AssignmentHookEtherPaymentFailed) (event.Subscription, error) { - - logs, sub, err := _AssignmentHook.contract.WatchLogs(opts, "EtherPaymentFailed") - 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(AssignmentHookEtherPaymentFailed) - if err := _AssignmentHook.contract.UnpackLog(event, "EtherPaymentFailed", 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 -} - -// ParseEtherPaymentFailed is a log parse operation binding the contract event 0x193fbe934858a5b7669033de55612da355d11604360d59535b5bfaa25c42209e. -// -// Solidity: event EtherPaymentFailed(address to, uint256 maxGas) -func (_AssignmentHook *AssignmentHookFilterer) ParseEtherPaymentFailed(log types.Log) (*AssignmentHookEtherPaymentFailed, error) { - event := new(AssignmentHookEtherPaymentFailed) - if err := _AssignmentHook.contract.UnpackLog(event, "EtherPaymentFailed", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// AssignmentHookInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the AssignmentHook contract. -type AssignmentHookInitializedIterator struct { - Event *AssignmentHookInitialized // 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 *AssignmentHookInitializedIterator) 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(AssignmentHookInitialized) - 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(AssignmentHookInitialized) - 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 *AssignmentHookInitializedIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *AssignmentHookInitializedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// AssignmentHookInitialized represents a Initialized event raised by the AssignmentHook contract. -type AssignmentHookInitialized 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 (_AssignmentHook *AssignmentHookFilterer) FilterInitialized(opts *bind.FilterOpts) (*AssignmentHookInitializedIterator, error) { - - logs, sub, err := _AssignmentHook.contract.FilterLogs(opts, "Initialized") - if err != nil { - return nil, err - } - return &AssignmentHookInitializedIterator{contract: _AssignmentHook.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 (_AssignmentHook *AssignmentHookFilterer) WatchInitialized(opts *bind.WatchOpts, sink chan<- *AssignmentHookInitialized) (event.Subscription, error) { - - logs, sub, err := _AssignmentHook.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(AssignmentHookInitialized) - if err := _AssignmentHook.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 (_AssignmentHook *AssignmentHookFilterer) ParseInitialized(log types.Log) (*AssignmentHookInitialized, error) { - event := new(AssignmentHookInitialized) - if err := _AssignmentHook.contract.UnpackLog(event, "Initialized", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// AssignmentHookOwnershipTransferStartedIterator is returned from FilterOwnershipTransferStarted and is used to iterate over the raw logs and unpacked data for OwnershipTransferStarted events raised by the AssignmentHook contract. -type AssignmentHookOwnershipTransferStartedIterator struct { - Event *AssignmentHookOwnershipTransferStarted // 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 *AssignmentHookOwnershipTransferStartedIterator) 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(AssignmentHookOwnershipTransferStarted) - 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(AssignmentHookOwnershipTransferStarted) - 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 *AssignmentHookOwnershipTransferStartedIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *AssignmentHookOwnershipTransferStartedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// AssignmentHookOwnershipTransferStarted represents a OwnershipTransferStarted event raised by the AssignmentHook contract. -type AssignmentHookOwnershipTransferStarted struct { - PreviousOwner common.Address - NewOwner common.Address - Raw types.Log // Blockchain specific contextual infos -} - -// FilterOwnershipTransferStarted is a free log retrieval operation binding the contract event 0x38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e22700. -// -// Solidity: event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner) -func (_AssignmentHook *AssignmentHookFilterer) FilterOwnershipTransferStarted(opts *bind.FilterOpts, previousOwner []common.Address, newOwner []common.Address) (*AssignmentHookOwnershipTransferStartedIterator, 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 := _AssignmentHook.contract.FilterLogs(opts, "OwnershipTransferStarted", previousOwnerRule, newOwnerRule) - if err != nil { - return nil, err - } - return &AssignmentHookOwnershipTransferStartedIterator{contract: _AssignmentHook.contract, event: "OwnershipTransferStarted", logs: logs, sub: sub}, nil -} - -// WatchOwnershipTransferStarted is a free log subscription operation binding the contract event 0x38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e22700. -// -// Solidity: event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner) -func (_AssignmentHook *AssignmentHookFilterer) WatchOwnershipTransferStarted(opts *bind.WatchOpts, sink chan<- *AssignmentHookOwnershipTransferStarted, 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 := _AssignmentHook.contract.WatchLogs(opts, "OwnershipTransferStarted", 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(AssignmentHookOwnershipTransferStarted) - if err := _AssignmentHook.contract.UnpackLog(event, "OwnershipTransferStarted", 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 -} - -// ParseOwnershipTransferStarted is a log parse operation binding the contract event 0x38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e22700. -// -// Solidity: event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner) -func (_AssignmentHook *AssignmentHookFilterer) ParseOwnershipTransferStarted(log types.Log) (*AssignmentHookOwnershipTransferStarted, error) { - event := new(AssignmentHookOwnershipTransferStarted) - if err := _AssignmentHook.contract.UnpackLog(event, "OwnershipTransferStarted", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// AssignmentHookOwnershipTransferredIterator is returned from FilterOwnershipTransferred and is used to iterate over the raw logs and unpacked data for OwnershipTransferred events raised by the AssignmentHook contract. -type AssignmentHookOwnershipTransferredIterator struct { - Event *AssignmentHookOwnershipTransferred // 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 *AssignmentHookOwnershipTransferredIterator) 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(AssignmentHookOwnershipTransferred) - 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(AssignmentHookOwnershipTransferred) - 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 *AssignmentHookOwnershipTransferredIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *AssignmentHookOwnershipTransferredIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// AssignmentHookOwnershipTransferred represents a OwnershipTransferred event raised by the AssignmentHook contract. -type AssignmentHookOwnershipTransferred 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 (_AssignmentHook *AssignmentHookFilterer) FilterOwnershipTransferred(opts *bind.FilterOpts, previousOwner []common.Address, newOwner []common.Address) (*AssignmentHookOwnershipTransferredIterator, 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 := _AssignmentHook.contract.FilterLogs(opts, "OwnershipTransferred", previousOwnerRule, newOwnerRule) - if err != nil { - return nil, err - } - return &AssignmentHookOwnershipTransferredIterator{contract: _AssignmentHook.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 (_AssignmentHook *AssignmentHookFilterer) WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *AssignmentHookOwnershipTransferred, 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 := _AssignmentHook.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(AssignmentHookOwnershipTransferred) - if err := _AssignmentHook.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 (_AssignmentHook *AssignmentHookFilterer) ParseOwnershipTransferred(log types.Log) (*AssignmentHookOwnershipTransferred, error) { - event := new(AssignmentHookOwnershipTransferred) - if err := _AssignmentHook.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// AssignmentHookPausedIterator is returned from FilterPaused and is used to iterate over the raw logs and unpacked data for Paused events raised by the AssignmentHook contract. -type AssignmentHookPausedIterator struct { - Event *AssignmentHookPaused // 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 *AssignmentHookPausedIterator) 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(AssignmentHookPaused) - 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(AssignmentHookPaused) - 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 *AssignmentHookPausedIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *AssignmentHookPausedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// AssignmentHookPaused represents a Paused event raised by the AssignmentHook contract. -type AssignmentHookPaused struct { - Account common.Address - Raw types.Log // Blockchain specific contextual infos -} - -// FilterPaused is a free log retrieval operation binding the contract event 0x62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258. -// -// Solidity: event Paused(address account) -func (_AssignmentHook *AssignmentHookFilterer) FilterPaused(opts *bind.FilterOpts) (*AssignmentHookPausedIterator, error) { - - logs, sub, err := _AssignmentHook.contract.FilterLogs(opts, "Paused") - if err != nil { - return nil, err - } - return &AssignmentHookPausedIterator{contract: _AssignmentHook.contract, event: "Paused", logs: logs, sub: sub}, nil -} - -// WatchPaused is a free log subscription operation binding the contract event 0x62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258. -// -// Solidity: event Paused(address account) -func (_AssignmentHook *AssignmentHookFilterer) WatchPaused(opts *bind.WatchOpts, sink chan<- *AssignmentHookPaused) (event.Subscription, error) { - - logs, sub, err := _AssignmentHook.contract.WatchLogs(opts, "Paused") - 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(AssignmentHookPaused) - if err := _AssignmentHook.contract.UnpackLog(event, "Paused", 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 -} - -// ParsePaused is a log parse operation binding the contract event 0x62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258. -// -// Solidity: event Paused(address account) -func (_AssignmentHook *AssignmentHookFilterer) ParsePaused(log types.Log) (*AssignmentHookPaused, error) { - event := new(AssignmentHookPaused) - if err := _AssignmentHook.contract.UnpackLog(event, "Paused", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// AssignmentHookUnpausedIterator is returned from FilterUnpaused and is used to iterate over the raw logs and unpacked data for Unpaused events raised by the AssignmentHook contract. -type AssignmentHookUnpausedIterator struct { - Event *AssignmentHookUnpaused // 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 *AssignmentHookUnpausedIterator) 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(AssignmentHookUnpaused) - 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(AssignmentHookUnpaused) - 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 *AssignmentHookUnpausedIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *AssignmentHookUnpausedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// AssignmentHookUnpaused represents a Unpaused event raised by the AssignmentHook contract. -type AssignmentHookUnpaused struct { - Account common.Address - Raw types.Log // Blockchain specific contextual infos -} - -// FilterUnpaused is a free log retrieval operation binding the contract event 0x5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa. -// -// Solidity: event Unpaused(address account) -func (_AssignmentHook *AssignmentHookFilterer) FilterUnpaused(opts *bind.FilterOpts) (*AssignmentHookUnpausedIterator, error) { - - logs, sub, err := _AssignmentHook.contract.FilterLogs(opts, "Unpaused") - if err != nil { - return nil, err - } - return &AssignmentHookUnpausedIterator{contract: _AssignmentHook.contract, event: "Unpaused", logs: logs, sub: sub}, nil -} - -// WatchUnpaused is a free log subscription operation binding the contract event 0x5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa. -// -// Solidity: event Unpaused(address account) -func (_AssignmentHook *AssignmentHookFilterer) WatchUnpaused(opts *bind.WatchOpts, sink chan<- *AssignmentHookUnpaused) (event.Subscription, error) { - - logs, sub, err := _AssignmentHook.contract.WatchLogs(opts, "Unpaused") - 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(AssignmentHookUnpaused) - if err := _AssignmentHook.contract.UnpackLog(event, "Unpaused", 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 -} - -// ParseUnpaused is a log parse operation binding the contract event 0x5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa. -// -// Solidity: event Unpaused(address account) -func (_AssignmentHook *AssignmentHookFilterer) ParseUnpaused(log types.Log) (*AssignmentHookUnpaused, error) { - event := new(AssignmentHookUnpaused) - if err := _AssignmentHook.contract.UnpackLog(event, "Unpaused", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// AssignmentHookUpgradedIterator is returned from FilterUpgraded and is used to iterate over the raw logs and unpacked data for Upgraded events raised by the AssignmentHook contract. -type AssignmentHookUpgradedIterator struct { - Event *AssignmentHookUpgraded // 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 *AssignmentHookUpgradedIterator) 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(AssignmentHookUpgraded) - 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(AssignmentHookUpgraded) - 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 *AssignmentHookUpgradedIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *AssignmentHookUpgradedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// AssignmentHookUpgraded represents a Upgraded event raised by the AssignmentHook contract. -type AssignmentHookUpgraded struct { - Implementation common.Address - Raw types.Log // Blockchain specific contextual infos -} - -// FilterUpgraded is a free log retrieval operation binding the contract event 0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b. -// -// Solidity: event Upgraded(address indexed implementation) -func (_AssignmentHook *AssignmentHookFilterer) FilterUpgraded(opts *bind.FilterOpts, implementation []common.Address) (*AssignmentHookUpgradedIterator, error) { - - var implementationRule []interface{} - for _, implementationItem := range implementation { - implementationRule = append(implementationRule, implementationItem) - } - - logs, sub, err := _AssignmentHook.contract.FilterLogs(opts, "Upgraded", implementationRule) - if err != nil { - return nil, err - } - return &AssignmentHookUpgradedIterator{contract: _AssignmentHook.contract, event: "Upgraded", logs: logs, sub: sub}, nil -} - -// WatchUpgraded is a free log subscription operation binding the contract event 0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b. -// -// Solidity: event Upgraded(address indexed implementation) -func (_AssignmentHook *AssignmentHookFilterer) WatchUpgraded(opts *bind.WatchOpts, sink chan<- *AssignmentHookUpgraded, implementation []common.Address) (event.Subscription, error) { - - var implementationRule []interface{} - for _, implementationItem := range implementation { - implementationRule = append(implementationRule, implementationItem) - } - - logs, sub, err := _AssignmentHook.contract.WatchLogs(opts, "Upgraded", implementationRule) - 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(AssignmentHookUpgraded) - if err := _AssignmentHook.contract.UnpackLog(event, "Upgraded", 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 -} - -// ParseUpgraded is a log parse operation binding the contract event 0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b. -// -// Solidity: event Upgraded(address indexed implementation) -func (_AssignmentHook *AssignmentHookFilterer) ParseUpgraded(log types.Log) (*AssignmentHookUpgraded, error) { - event := new(AssignmentHookUpgraded) - if err := _AssignmentHook.contract.UnpackLog(event, "Upgraded", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} diff --git a/packages/taiko-client/bindings/gen_guardian_prover.go b/packages/taiko-client/bindings/gen_guardian_prover.go index 8b42670d6f3..546b89e0554 100644 --- a/packages/taiko-client/bindings/gen_guardian_prover.go +++ b/packages/taiko-client/bindings/gen_guardian_prover.go @@ -40,6 +40,18 @@ type IVerifierContext struct { MsgSender common.Address } +// IVerifierContextV2 is an auto generated low-level Go binding around an user-defined struct. +type IVerifierContextV2 struct { + MetaHash [32]byte + BlobHash [32]byte + Prover common.Address + BlockId uint64 + IsContesting bool + BlobUsed bool + MsgSender common.Address + Tran TaikoDataTransition +} + // TaikoDataTierProof is an auto generated low-level Go binding around an user-defined struct. type TaikoDataTierProof struct { Tier uint16 @@ -48,7 +60,7 @@ type TaikoDataTierProof struct { // GuardianProverMetaData contains all meta data concerning the GuardianProver contract. var GuardianProverMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addressManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"approvals\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"proofHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"approvalBits\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"approve\",\"inputs\":[{\"name\":\"_meta\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.BlockMetadata\",\"components\":[{\"name\":\"l1Hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"difficulty\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blobHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"extraData\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"depositsHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"coinbase\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"l1Height\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minTier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"blobUsed\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"parentMetaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"_tran\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.Transition\",\"components\":[{\"name\":\"parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"graffiti\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"_proof\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.TierProof\",\"components\":[{\"name\":\"tier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[{\"name\":\"approved_\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"enableProvingAutoPause\",\"inputs\":[{\"name\":\"_enable\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"enableTaikoTokenAllowance\",\"inputs\":[{\"name\":\"_enable\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"guardianIds\",\"inputs\":[{\"name\":\"guardian\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"id\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"guardians\",\"inputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"impl\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"inNonReentrant\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"init\",\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_addressManager\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"latestProofHash\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"blockId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"minGuardians\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"numGuardians\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseTaikoProving\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"provingAutoPauseEnabled\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setGuardians\",\"inputs\":[{\"name\":\"_newGuardians\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"_minGuardians\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"_clearData\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeTo\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"verifyProof\",\"inputs\":[{\"name\":\"_ctx\",\"type\":\"tuple\",\"internalType\":\"structIVerifier.Context\",\"components\":[{\"name\":\"metaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blobHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"prover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"isContesting\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"blobUsed\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"msgSender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.Transition\",\"components\":[{\"name\":\"parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"graffiti\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.TierProof\",\"components\":[{\"name\":\"tier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdrawTaikoToken\",\"inputs\":[{\"name\":\"_to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AdminChanged\",\"inputs\":[{\"name\":\"previousAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Approved\",\"inputs\":[{\"name\":\"operationId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"approvalBits\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"minGuardiansReached\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconUpgraded\",\"inputs\":[{\"name\":\"beacon\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ConflictingProofs\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"guardian\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"currentProofHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"newProofHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"provingPaused\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"GuardianApproval\",\"inputs\":[{\"name\":\"addr\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"approved\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"},{\"name\":\"proofData\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"GuardiansUpdated\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"guardians\",\"type\":\"address[]\",\"indexed\":false,\"internalType\":\"address[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ProvingAutoPauseEnabled\",\"inputs\":[{\"name\":\"enabled\",\"type\":\"bool\",\"indexed\":true,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"FUNC_NOT_IMPLEMENTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GP_INVALID_GUARDIAN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GP_INVALID_GUARDIAN_SET\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GP_INVALID_MIN_GUARDIANS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GP_INVALID_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GV_PERMISSION_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GV_ZERO_ADDRESS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"REENTRANT_CALL\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_INVALID_MANAGER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_UNEXPECTED_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_ZERO_ADDR\",\"inputs\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ZERO_ADDRESS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_VALUE\",\"inputs\":[]}]", + ABI: "[{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addressManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"approvals\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"proofHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"approvalBits\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"approveV2\",\"inputs\":[{\"name\":\"_metaV2\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.BlockMetadataV2\",\"components\":[{\"name\":\"anchorBlockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"difficulty\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blobHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"extraData\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"coinbase\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"anchorBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minTier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"blobUsed\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"parentMetaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proposer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"livenessBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"proposedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"proposedIn\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blobTxListOffset\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"blobTxListLength\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"blobIndex\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"baseFeeConfig\",\"type\":\"tuple\",\"internalType\":\"structLibSharedData.BaseFeeConfig\",\"components\":[{\"name\":\"adjustmentQuotient\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"sharingPctg\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"gasIssuancePerSecond\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"minGasExcess\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxGasIssuancePerBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}]},{\"name\":\"_tran\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.Transition\",\"components\":[{\"name\":\"parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"graffiti\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"_proof\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.TierProof\",\"components\":[{\"name\":\"tier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"enableBondAllowance\",\"inputs\":[{\"name\":\"_enable\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"enableProvingAutoPause\",\"inputs\":[{\"name\":\"_enable\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"guardianIds\",\"inputs\":[{\"name\":\"guardian\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"id\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"guardians\",\"inputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"impl\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"inNonReentrant\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"init\",\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_rollupAddressManager\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"latestProofHash\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"blockId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"minGuardians\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"numGuardians\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseTaikoProving\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"provingAutoPauseEnabled\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setGuardians\",\"inputs\":[{\"name\":\"_newGuardians\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"_minGuardians\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"_clearData\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeTo\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"verifyBatchProof\",\"inputs\":[{\"name\":\"_ctxs\",\"type\":\"tuple[]\",\"internalType\":\"structIVerifier.ContextV2[]\",\"components\":[{\"name\":\"metaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blobHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"prover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"isContesting\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"blobUsed\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"msgSender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"tran\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.Transition\",\"components\":[{\"name\":\"parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"graffiti\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}]},{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.TierProof\",\"components\":[{\"name\":\"tier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"verifyProof\",\"inputs\":[{\"name\":\"_ctx\",\"type\":\"tuple\",\"internalType\":\"structIVerifier.Context\",\"components\":[{\"name\":\"metaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blobHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"prover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"isContesting\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"blobUsed\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"msgSender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.Transition\",\"components\":[{\"name\":\"parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"graffiti\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.TierProof\",\"components\":[{\"name\":\"tier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdrawBond\",\"inputs\":[{\"name\":\"_to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AdminChanged\",\"inputs\":[{\"name\":\"previousAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Approved\",\"inputs\":[{\"name\":\"operationId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"approvalBits\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"minGuardiansReached\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconUpgraded\",\"inputs\":[{\"name\":\"beacon\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ConflictingProofs\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"guardian\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"currentProofHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"newProofHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"provingPaused\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"GuardianApproval\",\"inputs\":[{\"name\":\"addr\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"approved\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"},{\"name\":\"proofData\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"GuardiansUpdated\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"guardians\",\"type\":\"address[]\",\"indexed\":false,\"internalType\":\"address[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ProvingAutoPauseEnabled\",\"inputs\":[{\"name\":\"enabled\",\"type\":\"bool\",\"indexed\":true,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"ETH_TRANSFER_FAILED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FUNC_NOT_IMPLEMENTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GP_BOND_NOT_ERC20\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GP_INVALID_GUARDIAN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GP_INVALID_GUARDIAN_SET\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GP_INVALID_MIN_GUARDIANS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GP_INVALID_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GV_PERMISSION_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GV_ZERO_ADDRESS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"REENTRANT_CALL\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_INVALID_MANAGER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_UNEXPECTED_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_ZERO_ADDR\",\"inputs\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ZERO_ADDRESS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_VALUE\",\"inputs\":[]}]", } // GuardianProverABI is the input ABI used to generate the binding from. @@ -724,6 +736,35 @@ func (_GuardianProver *GuardianProverCallerSession) Resolve0(_name [32]byte, _al return _GuardianProver.Contract.Resolve0(&_GuardianProver.CallOpts, _name, _allowZeroAddress) } +// VerifyBatchProof is a free data retrieval call binding the contract method 0x7103b6da. +// +// Solidity: function verifyBatchProof((bytes32,bytes32,address,uint64,bool,bool,address,(bytes32,bytes32,bytes32,bytes32))[] _ctxs, (uint16,bytes) ) view returns() +func (_GuardianProver *GuardianProverCaller) VerifyBatchProof(opts *bind.CallOpts, _ctxs []IVerifierContextV2, arg1 TaikoDataTierProof) error { + var out []interface{} + err := _GuardianProver.contract.Call(opts, &out, "verifyBatchProof", _ctxs, arg1) + + if err != nil { + return err + } + + return err + +} + +// VerifyBatchProof is a free data retrieval call binding the contract method 0x7103b6da. +// +// Solidity: function verifyBatchProof((bytes32,bytes32,address,uint64,bool,bool,address,(bytes32,bytes32,bytes32,bytes32))[] _ctxs, (uint16,bytes) ) view returns() +func (_GuardianProver *GuardianProverSession) VerifyBatchProof(_ctxs []IVerifierContextV2, arg1 TaikoDataTierProof) error { + return _GuardianProver.Contract.VerifyBatchProof(&_GuardianProver.CallOpts, _ctxs, arg1) +} + +// VerifyBatchProof is a free data retrieval call binding the contract method 0x7103b6da. +// +// Solidity: function verifyBatchProof((bytes32,bytes32,address,uint64,bool,bool,address,(bytes32,bytes32,bytes32,bytes32))[] _ctxs, (uint16,bytes) ) view returns() +func (_GuardianProver *GuardianProverCallerSession) VerifyBatchProof(_ctxs []IVerifierContextV2, arg1 TaikoDataTierProof) error { + return _GuardianProver.Contract.VerifyBatchProof(&_GuardianProver.CallOpts, _ctxs, arg1) +} + // VerifyProof is a free data retrieval call binding the contract method 0x21e89968. // // Solidity: function verifyProof((bytes32,bytes32,address,uint64,bool,bool,address) _ctx, (bytes32,bytes32,bytes32,bytes32) , (uint16,bytes) ) view returns() @@ -805,25 +846,46 @@ func (_GuardianProver *GuardianProverTransactorSession) AcceptOwnership() (*type return _GuardianProver.Contract.AcceptOwnership(&_GuardianProver.TransactOpts) } -// Approve is a paid mutator transaction binding the contract method 0x98984761. +// ApproveV2 is a paid mutator transaction binding the contract method 0x360d230a. +// +// Solidity: function approveV2((bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address,uint96,uint64,uint64,uint32,uint32,uint8,(uint8,uint8,uint32,uint64,uint32)) _metaV2, (bytes32,bytes32,bytes32,bytes32) _tran, (uint16,bytes) _proof) returns(bool) +func (_GuardianProver *GuardianProverTransactor) ApproveV2(opts *bind.TransactOpts, _metaV2 TaikoDataBlockMetadataV2, _tran TaikoDataTransition, _proof TaikoDataTierProof) (*types.Transaction, error) { + return _GuardianProver.contract.Transact(opts, "approveV2", _metaV2, _tran, _proof) +} + +// ApproveV2 is a paid mutator transaction binding the contract method 0x360d230a. +// +// Solidity: function approveV2((bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address,uint96,uint64,uint64,uint32,uint32,uint8,(uint8,uint8,uint32,uint64,uint32)) _metaV2, (bytes32,bytes32,bytes32,bytes32) _tran, (uint16,bytes) _proof) returns(bool) +func (_GuardianProver *GuardianProverSession) ApproveV2(_metaV2 TaikoDataBlockMetadataV2, _tran TaikoDataTransition, _proof TaikoDataTierProof) (*types.Transaction, error) { + return _GuardianProver.Contract.ApproveV2(&_GuardianProver.TransactOpts, _metaV2, _tran, _proof) +} + +// ApproveV2 is a paid mutator transaction binding the contract method 0x360d230a. +// +// Solidity: function approveV2((bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address,uint96,uint64,uint64,uint32,uint32,uint8,(uint8,uint8,uint32,uint64,uint32)) _metaV2, (bytes32,bytes32,bytes32,bytes32) _tran, (uint16,bytes) _proof) returns(bool) +func (_GuardianProver *GuardianProverTransactorSession) ApproveV2(_metaV2 TaikoDataBlockMetadataV2, _tran TaikoDataTransition, _proof TaikoDataTierProof) (*types.Transaction, error) { + return _GuardianProver.Contract.ApproveV2(&_GuardianProver.TransactOpts, _metaV2, _tran, _proof) +} + +// EnableBondAllowance is a paid mutator transaction binding the contract method 0x640b4cac. // -// Solidity: function approve((bytes32,bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address) _meta, (bytes32,bytes32,bytes32,bytes32) _tran, (uint16,bytes) _proof) returns(bool approved_) -func (_GuardianProver *GuardianProverTransactor) Approve(opts *bind.TransactOpts, _meta TaikoDataBlockMetadata, _tran TaikoDataTransition, _proof TaikoDataTierProof) (*types.Transaction, error) { - return _GuardianProver.contract.Transact(opts, "approve", _meta, _tran, _proof) +// Solidity: function enableBondAllowance(bool _enable) returns() +func (_GuardianProver *GuardianProverTransactor) EnableBondAllowance(opts *bind.TransactOpts, _enable bool) (*types.Transaction, error) { + return _GuardianProver.contract.Transact(opts, "enableBondAllowance", _enable) } -// Approve is a paid mutator transaction binding the contract method 0x98984761. +// EnableBondAllowance is a paid mutator transaction binding the contract method 0x640b4cac. // -// Solidity: function approve((bytes32,bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address) _meta, (bytes32,bytes32,bytes32,bytes32) _tran, (uint16,bytes) _proof) returns(bool approved_) -func (_GuardianProver *GuardianProverSession) Approve(_meta TaikoDataBlockMetadata, _tran TaikoDataTransition, _proof TaikoDataTierProof) (*types.Transaction, error) { - return _GuardianProver.Contract.Approve(&_GuardianProver.TransactOpts, _meta, _tran, _proof) +// Solidity: function enableBondAllowance(bool _enable) returns() +func (_GuardianProver *GuardianProverSession) EnableBondAllowance(_enable bool) (*types.Transaction, error) { + return _GuardianProver.Contract.EnableBondAllowance(&_GuardianProver.TransactOpts, _enable) } -// Approve is a paid mutator transaction binding the contract method 0x98984761. +// EnableBondAllowance is a paid mutator transaction binding the contract method 0x640b4cac. // -// Solidity: function approve((bytes32,bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address) _meta, (bytes32,bytes32,bytes32,bytes32) _tran, (uint16,bytes) _proof) returns(bool approved_) -func (_GuardianProver *GuardianProverTransactorSession) Approve(_meta TaikoDataBlockMetadata, _tran TaikoDataTransition, _proof TaikoDataTierProof) (*types.Transaction, error) { - return _GuardianProver.Contract.Approve(&_GuardianProver.TransactOpts, _meta, _tran, _proof) +// Solidity: function enableBondAllowance(bool _enable) returns() +func (_GuardianProver *GuardianProverTransactorSession) EnableBondAllowance(_enable bool) (*types.Transaction, error) { + return _GuardianProver.Contract.EnableBondAllowance(&_GuardianProver.TransactOpts, _enable) } // EnableProvingAutoPause is a paid mutator transaction binding the contract method 0xe93640db. @@ -847,46 +909,25 @@ func (_GuardianProver *GuardianProverTransactorSession) EnableProvingAutoPause(_ return _GuardianProver.Contract.EnableProvingAutoPause(&_GuardianProver.TransactOpts, _enable) } -// EnableTaikoTokenAllowance is a paid mutator transaction binding the contract method 0x8e1bacd7. -// -// Solidity: function enableTaikoTokenAllowance(bool _enable) returns() -func (_GuardianProver *GuardianProverTransactor) EnableTaikoTokenAllowance(opts *bind.TransactOpts, _enable bool) (*types.Transaction, error) { - return _GuardianProver.contract.Transact(opts, "enableTaikoTokenAllowance", _enable) -} - -// EnableTaikoTokenAllowance is a paid mutator transaction binding the contract method 0x8e1bacd7. -// -// Solidity: function enableTaikoTokenAllowance(bool _enable) returns() -func (_GuardianProver *GuardianProverSession) EnableTaikoTokenAllowance(_enable bool) (*types.Transaction, error) { - return _GuardianProver.Contract.EnableTaikoTokenAllowance(&_GuardianProver.TransactOpts, _enable) -} - -// EnableTaikoTokenAllowance is a paid mutator transaction binding the contract method 0x8e1bacd7. -// -// Solidity: function enableTaikoTokenAllowance(bool _enable) returns() -func (_GuardianProver *GuardianProverTransactorSession) EnableTaikoTokenAllowance(_enable bool) (*types.Transaction, error) { - return _GuardianProver.Contract.EnableTaikoTokenAllowance(&_GuardianProver.TransactOpts, _enable) -} - // Init is a paid mutator transaction binding the contract method 0xf09a4016. // -// Solidity: function init(address _owner, address _addressManager) returns() -func (_GuardianProver *GuardianProverTransactor) Init(opts *bind.TransactOpts, _owner common.Address, _addressManager common.Address) (*types.Transaction, error) { - return _GuardianProver.contract.Transact(opts, "init", _owner, _addressManager) +// Solidity: function init(address _owner, address _rollupAddressManager) returns() +func (_GuardianProver *GuardianProverTransactor) Init(opts *bind.TransactOpts, _owner common.Address, _rollupAddressManager common.Address) (*types.Transaction, error) { + return _GuardianProver.contract.Transact(opts, "init", _owner, _rollupAddressManager) } // Init is a paid mutator transaction binding the contract method 0xf09a4016. // -// Solidity: function init(address _owner, address _addressManager) returns() -func (_GuardianProver *GuardianProverSession) Init(_owner common.Address, _addressManager common.Address) (*types.Transaction, error) { - return _GuardianProver.Contract.Init(&_GuardianProver.TransactOpts, _owner, _addressManager) +// Solidity: function init(address _owner, address _rollupAddressManager) returns() +func (_GuardianProver *GuardianProverSession) Init(_owner common.Address, _rollupAddressManager common.Address) (*types.Transaction, error) { + return _GuardianProver.Contract.Init(&_GuardianProver.TransactOpts, _owner, _rollupAddressManager) } // Init is a paid mutator transaction binding the contract method 0xf09a4016. // -// Solidity: function init(address _owner, address _addressManager) returns() -func (_GuardianProver *GuardianProverTransactorSession) Init(_owner common.Address, _addressManager common.Address) (*types.Transaction, error) { - return _GuardianProver.Contract.Init(&_GuardianProver.TransactOpts, _owner, _addressManager) +// Solidity: function init(address _owner, address _rollupAddressManager) returns() +func (_GuardianProver *GuardianProverTransactorSession) Init(_owner common.Address, _rollupAddressManager common.Address) (*types.Transaction, error) { + return _GuardianProver.Contract.Init(&_GuardianProver.TransactOpts, _owner, _rollupAddressManager) } // Pause is a paid mutator transaction binding the contract method 0x8456cb59. @@ -1057,25 +1098,25 @@ func (_GuardianProver *GuardianProverTransactorSession) UpgradeToAndCall(newImpl return _GuardianProver.Contract.UpgradeToAndCall(&_GuardianProver.TransactOpts, newImplementation, data) } -// WithdrawTaikoToken is a paid mutator transaction binding the contract method 0x694074c0. +// WithdrawBond is a paid mutator transaction binding the contract method 0xca288f18. // -// Solidity: function withdrawTaikoToken(address _to, uint256 _amount) returns() -func (_GuardianProver *GuardianProverTransactor) WithdrawTaikoToken(opts *bind.TransactOpts, _to common.Address, _amount *big.Int) (*types.Transaction, error) { - return _GuardianProver.contract.Transact(opts, "withdrawTaikoToken", _to, _amount) +// Solidity: function withdrawBond(address _to, uint256 _amount) returns() +func (_GuardianProver *GuardianProverTransactor) WithdrawBond(opts *bind.TransactOpts, _to common.Address, _amount *big.Int) (*types.Transaction, error) { + return _GuardianProver.contract.Transact(opts, "withdrawBond", _to, _amount) } -// WithdrawTaikoToken is a paid mutator transaction binding the contract method 0x694074c0. +// WithdrawBond is a paid mutator transaction binding the contract method 0xca288f18. // -// Solidity: function withdrawTaikoToken(address _to, uint256 _amount) returns() -func (_GuardianProver *GuardianProverSession) WithdrawTaikoToken(_to common.Address, _amount *big.Int) (*types.Transaction, error) { - return _GuardianProver.Contract.WithdrawTaikoToken(&_GuardianProver.TransactOpts, _to, _amount) +// Solidity: function withdrawBond(address _to, uint256 _amount) returns() +func (_GuardianProver *GuardianProverSession) WithdrawBond(_to common.Address, _amount *big.Int) (*types.Transaction, error) { + return _GuardianProver.Contract.WithdrawBond(&_GuardianProver.TransactOpts, _to, _amount) } -// WithdrawTaikoToken is a paid mutator transaction binding the contract method 0x694074c0. +// WithdrawBond is a paid mutator transaction binding the contract method 0xca288f18. // -// Solidity: function withdrawTaikoToken(address _to, uint256 _amount) returns() -func (_GuardianProver *GuardianProverTransactorSession) WithdrawTaikoToken(_to common.Address, _amount *big.Int) (*types.Transaction, error) { - return _GuardianProver.Contract.WithdrawTaikoToken(&_GuardianProver.TransactOpts, _to, _amount) +// Solidity: function withdrawBond(address _to, uint256 _amount) returns() +func (_GuardianProver *GuardianProverTransactorSession) WithdrawBond(_to common.Address, _amount *big.Int) (*types.Transaction, error) { + return _GuardianProver.Contract.WithdrawBond(&_GuardianProver.TransactOpts, _to, _amount) } // GuardianProverAdminChangedIterator is returned from FilterAdminChanged and is used to iterate over the raw logs and unpacked data for AdminChanged events raised by the GuardianProver contract. diff --git a/packages/taiko-client/bindings/gen_lib_proposing.go b/packages/taiko-client/bindings/gen_lib_proposing.go index 3e35789ee88..133643b6ce6 100644 --- a/packages/taiko-client/bindings/gen_lib_proposing.go +++ b/packages/taiko-client/bindings/gen_lib_proposing.go @@ -31,7 +31,7 @@ var ( // LibProposingMetaData contains all meta data concerning the LibProposing contract. var LibProposingMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"event\",\"name\":\"BlockProposed\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"assignedProver\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"livenessBond\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"meta\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.BlockMetadata\",\"components\":[{\"name\":\"l1Hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"difficulty\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blobHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"extraData\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"depositsHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"coinbase\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"l1Height\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minTier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"blobUsed\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"parentMetaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"depositsProcessed\",\"type\":\"tuple[]\",\"indexed\":false,\"internalType\":\"structTaikoData.EthDeposit[]\",\"components\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"L1_BLOB_NOT_AVAILABLE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOB_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_HOOK\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_PROVER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_SIG\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_LIVENESS_BOND_NOT_RECEIVED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TOO_MANY_BLOCKS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNAUTHORIZED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNEXPECTED_PARENT\",\"inputs\":[]}]", + ABI: "[{\"type\":\"event\",\"name\":\"BlockProposedV2\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"meta\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.BlockMetadataV2\",\"components\":[{\"name\":\"anchorBlockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"difficulty\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blobHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"extraData\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"coinbase\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"anchorBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minTier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"blobUsed\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"parentMetaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proposer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"livenessBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"proposedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"proposedIn\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blobTxListOffset\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"blobTxListLength\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"blobIndex\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"baseFeeConfig\",\"type\":\"tuple\",\"internalType\":\"structLibSharedData.BaseFeeConfig\",\"components\":[{\"name\":\"adjustmentQuotient\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"sharingPctg\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"gasIssuancePerSecond\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"minGasExcess\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxGasIssuancePerBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"CalldataTxList\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"txList\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"L1_BLOB_NOT_AVAILABLE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOB_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_FORK_HEIGHT_ERROR\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_ANCHOR_BLOCK\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_CUSTOM_PROPOSER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_PARAMS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_PROPOSER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_TIMESTAMP\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TOO_MANY_BLOCKS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNEXPECTED_PARENT\",\"inputs\":[]}]", } // LibProposingABI is the input ABI used to generate the binding from. @@ -180,9 +180,9 @@ func (_LibProposing *LibProposingTransactorRaw) Transact(opts *bind.TransactOpts return _LibProposing.Contract.contract.Transact(opts, method, params...) } -// LibProposingBlockProposedIterator is returned from FilterBlockProposed and is used to iterate over the raw logs and unpacked data for BlockProposed events raised by the LibProposing contract. -type LibProposingBlockProposedIterator struct { - Event *LibProposingBlockProposed // Event containing the contract specifics and raw log +// LibProposingBlockProposedV2Iterator is returned from FilterBlockProposedV2 and is used to iterate over the raw logs and unpacked data for BlockProposedV2 events raised by the LibProposing contract. +type LibProposingBlockProposedV2Iterator struct { + Event *LibProposingBlockProposedV2 // 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 @@ -196,7 +196,7 @@ type LibProposingBlockProposedIterator struct { // 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 *LibProposingBlockProposedIterator) Next() bool { +func (it *LibProposingBlockProposedV2Iterator) Next() bool { // If the iterator failed, stop iterating if it.fail != nil { return false @@ -205,7 +205,7 @@ func (it *LibProposingBlockProposedIterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(LibProposingBlockProposed) + it.Event = new(LibProposingBlockProposedV2) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -220,7 +220,7 @@ func (it *LibProposingBlockProposedIterator) Next() bool { // Iterator still in progress, wait for either a data or an error event select { case log := <-it.logs: - it.Event = new(LibProposingBlockProposed) + it.Event = new(LibProposingBlockProposedV2) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -236,63 +236,197 @@ func (it *LibProposingBlockProposedIterator) Next() bool { } // Error returns any retrieval or parsing error occurred during filtering. -func (it *LibProposingBlockProposedIterator) Error() error { +func (it *LibProposingBlockProposedV2Iterator) Error() error { return it.fail } // Close terminates the iteration process, releasing any pending underlying // resources. -func (it *LibProposingBlockProposedIterator) Close() error { +func (it *LibProposingBlockProposedV2Iterator) Close() error { it.sub.Unsubscribe() return nil } -// LibProposingBlockProposed represents a BlockProposed event raised by the LibProposing contract. -type LibProposingBlockProposed struct { - BlockId *big.Int - AssignedProver common.Address - LivenessBond *big.Int - Meta TaikoDataBlockMetadata - DepositsProcessed []TaikoDataEthDeposit - Raw types.Log // Blockchain specific contextual infos +// LibProposingBlockProposedV2 represents a BlockProposedV2 event raised by the LibProposing contract. +type LibProposingBlockProposedV2 struct { + BlockId *big.Int + Meta TaikoDataBlockMetadataV2 + Raw types.Log // Blockchain specific contextual infos } -// FilterBlockProposed is a free log retrieval operation binding the contract event 0xcda4e564245eb15494bc6da29f6a42e1941cf57f5314bf35bab8a1fca0a9c60a. +// FilterBlockProposedV2 is a free log retrieval operation binding the contract event 0xefe9c6c0b5cbd9c0eed2d1e9c00cfc1a010d6f1aff50f7facd665a639b622b26. // -// Solidity: event BlockProposed(uint256 indexed blockId, address indexed assignedProver, uint96 livenessBond, (bytes32,bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address) meta, (address,uint96,uint64)[] depositsProcessed) -func (_LibProposing *LibProposingFilterer) FilterBlockProposed(opts *bind.FilterOpts, blockId []*big.Int, assignedProver []common.Address) (*LibProposingBlockProposedIterator, error) { +// Solidity: event BlockProposedV2(uint256 indexed blockId, (bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address,uint96,uint64,uint64,uint32,uint32,uint8,(uint8,uint8,uint32,uint64,uint32)) meta) +func (_LibProposing *LibProposingFilterer) FilterBlockProposedV2(opts *bind.FilterOpts, blockId []*big.Int) (*LibProposingBlockProposedV2Iterator, error) { var blockIdRule []interface{} for _, blockIdItem := range blockId { blockIdRule = append(blockIdRule, blockIdItem) } - var assignedProverRule []interface{} - for _, assignedProverItem := range assignedProver { - assignedProverRule = append(assignedProverRule, assignedProverItem) + + logs, sub, err := _LibProposing.contract.FilterLogs(opts, "BlockProposedV2", blockIdRule) + if err != nil { + return nil, err } + return &LibProposingBlockProposedV2Iterator{contract: _LibProposing.contract, event: "BlockProposedV2", logs: logs, sub: sub}, nil +} - logs, sub, err := _LibProposing.contract.FilterLogs(opts, "BlockProposed", blockIdRule, assignedProverRule) +// WatchBlockProposedV2 is a free log subscription operation binding the contract event 0xefe9c6c0b5cbd9c0eed2d1e9c00cfc1a010d6f1aff50f7facd665a639b622b26. +// +// Solidity: event BlockProposedV2(uint256 indexed blockId, (bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address,uint96,uint64,uint64,uint32,uint32,uint8,(uint8,uint8,uint32,uint64,uint32)) meta) +func (_LibProposing *LibProposingFilterer) WatchBlockProposedV2(opts *bind.WatchOpts, sink chan<- *LibProposingBlockProposedV2, blockId []*big.Int) (event.Subscription, error) { + + var blockIdRule []interface{} + for _, blockIdItem := range blockId { + blockIdRule = append(blockIdRule, blockIdItem) + } + + logs, sub, err := _LibProposing.contract.WatchLogs(opts, "BlockProposedV2", blockIdRule) if err != nil { return nil, err } - return &LibProposingBlockProposedIterator{contract: _LibProposing.contract, event: "BlockProposed", logs: logs, sub: sub}, nil + 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(LibProposingBlockProposedV2) + if err := _LibProposing.contract.UnpackLog(event, "BlockProposedV2", 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 +} + +// ParseBlockProposedV2 is a log parse operation binding the contract event 0xefe9c6c0b5cbd9c0eed2d1e9c00cfc1a010d6f1aff50f7facd665a639b622b26. +// +// Solidity: event BlockProposedV2(uint256 indexed blockId, (bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address,uint96,uint64,uint64,uint32,uint32,uint8,(uint8,uint8,uint32,uint64,uint32)) meta) +func (_LibProposing *LibProposingFilterer) ParseBlockProposedV2(log types.Log) (*LibProposingBlockProposedV2, error) { + event := new(LibProposingBlockProposedV2) + if err := _LibProposing.contract.UnpackLog(event, "BlockProposedV2", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// LibProposingCalldataTxListIterator is returned from FilterCalldataTxList and is used to iterate over the raw logs and unpacked data for CalldataTxList events raised by the LibProposing contract. +type LibProposingCalldataTxListIterator struct { + Event *LibProposingCalldataTxList // 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 *LibProposingCalldataTxListIterator) 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(LibProposingCalldataTxList) + 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(LibProposingCalldataTxList) + 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 *LibProposingCalldataTxListIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *LibProposingCalldataTxListIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// LibProposingCalldataTxList represents a CalldataTxList event raised by the LibProposing contract. +type LibProposingCalldataTxList struct { + BlockId *big.Int + TxList []byte + Raw types.Log // Blockchain specific contextual infos } -// WatchBlockProposed is a free log subscription operation binding the contract event 0xcda4e564245eb15494bc6da29f6a42e1941cf57f5314bf35bab8a1fca0a9c60a. +// FilterCalldataTxList is a free log retrieval operation binding the contract event 0xa07bc5e8f00f6065c8727821591c519efd2348e4ff0c26560a85592e85b6f418. // -// Solidity: event BlockProposed(uint256 indexed blockId, address indexed assignedProver, uint96 livenessBond, (bytes32,bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address) meta, (address,uint96,uint64)[] depositsProcessed) -func (_LibProposing *LibProposingFilterer) WatchBlockProposed(opts *bind.WatchOpts, sink chan<- *LibProposingBlockProposed, blockId []*big.Int, assignedProver []common.Address) (event.Subscription, error) { +// Solidity: event CalldataTxList(uint256 indexed blockId, bytes txList) +func (_LibProposing *LibProposingFilterer) FilterCalldataTxList(opts *bind.FilterOpts, blockId []*big.Int) (*LibProposingCalldataTxListIterator, error) { var blockIdRule []interface{} for _, blockIdItem := range blockId { blockIdRule = append(blockIdRule, blockIdItem) } - var assignedProverRule []interface{} - for _, assignedProverItem := range assignedProver { - assignedProverRule = append(assignedProverRule, assignedProverItem) + + logs, sub, err := _LibProposing.contract.FilterLogs(opts, "CalldataTxList", blockIdRule) + if err != nil { + return nil, err + } + return &LibProposingCalldataTxListIterator{contract: _LibProposing.contract, event: "CalldataTxList", logs: logs, sub: sub}, nil +} + +// WatchCalldataTxList is a free log subscription operation binding the contract event 0xa07bc5e8f00f6065c8727821591c519efd2348e4ff0c26560a85592e85b6f418. +// +// Solidity: event CalldataTxList(uint256 indexed blockId, bytes txList) +func (_LibProposing *LibProposingFilterer) WatchCalldataTxList(opts *bind.WatchOpts, sink chan<- *LibProposingCalldataTxList, blockId []*big.Int) (event.Subscription, error) { + + var blockIdRule []interface{} + for _, blockIdItem := range blockId { + blockIdRule = append(blockIdRule, blockIdItem) } - logs, sub, err := _LibProposing.contract.WatchLogs(opts, "BlockProposed", blockIdRule, assignedProverRule) + logs, sub, err := _LibProposing.contract.WatchLogs(opts, "CalldataTxList", blockIdRule) if err != nil { return nil, err } @@ -302,8 +436,8 @@ func (_LibProposing *LibProposingFilterer) WatchBlockProposed(opts *bind.WatchOp select { case log := <-logs: // New log arrived, parse the event and forward to the user - event := new(LibProposingBlockProposed) - if err := _LibProposing.contract.UnpackLog(event, "BlockProposed", log); err != nil { + event := new(LibProposingCalldataTxList) + if err := _LibProposing.contract.UnpackLog(event, "CalldataTxList", log); err != nil { return err } event.Raw = log @@ -324,12 +458,12 @@ func (_LibProposing *LibProposingFilterer) WatchBlockProposed(opts *bind.WatchOp }), nil } -// ParseBlockProposed is a log parse operation binding the contract event 0xcda4e564245eb15494bc6da29f6a42e1941cf57f5314bf35bab8a1fca0a9c60a. +// ParseCalldataTxList is a log parse operation binding the contract event 0xa07bc5e8f00f6065c8727821591c519efd2348e4ff0c26560a85592e85b6f418. // -// Solidity: event BlockProposed(uint256 indexed blockId, address indexed assignedProver, uint96 livenessBond, (bytes32,bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address) meta, (address,uint96,uint64)[] depositsProcessed) -func (_LibProposing *LibProposingFilterer) ParseBlockProposed(log types.Log) (*LibProposingBlockProposed, error) { - event := new(LibProposingBlockProposed) - if err := _LibProposing.contract.UnpackLog(event, "BlockProposed", log); err != nil { +// Solidity: event CalldataTxList(uint256 indexed blockId, bytes txList) +func (_LibProposing *LibProposingFilterer) ParseCalldataTxList(log types.Log) (*LibProposingCalldataTxList, error) { + event := new(LibProposingCalldataTxList) + if err := _LibProposing.contract.UnpackLog(event, "CalldataTxList", log); err != nil { return nil, err } event.Raw = log diff --git a/packages/taiko-client/bindings/gen_lib_proving.go b/packages/taiko-client/bindings/gen_lib_proving.go index a95a8249d99..07079d73e3e 100644 --- a/packages/taiko-client/bindings/gen_lib_proving.go +++ b/packages/taiko-client/bindings/gen_lib_proving.go @@ -31,7 +31,7 @@ var ( // LibProvingMetaData contains all meta data concerning the LibProving contract. var LibProvingMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"event\",\"name\":\"ProvingPaused\",\"inputs\":[{\"name\":\"paused\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TransitionContested\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"tran\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.Transition\",\"components\":[{\"name\":\"parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"graffiti\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"contester\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"contestBond\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TransitionProved\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"tran\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.Transition\",\"components\":[{\"name\":\"parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"graffiti\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"prover\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"validityBond\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"L1_ALREADY_CONTESTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_ALREADY_PROVED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOCK_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_CANNOT_CONTEST\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_BLOCK_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_TIER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_TRANSITION\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_NOT_ASSIGNED_PROVER\",\"inputs\":[]}]", + ABI: "[{\"type\":\"event\",\"name\":\"BlockVerifiedV2\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"prover\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BondCredited\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BondDebited\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BondDeposited\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ProvingPaused\",\"inputs\":[{\"name\":\"paused\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TransitionContestedV2\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"tran\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.Transition\",\"components\":[{\"name\":\"parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"graffiti\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"contester\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"contestBond\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"proposedIn\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TransitionProvedV2\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"tran\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.Transition\",\"components\":[{\"name\":\"parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"graffiti\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"prover\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"validityBond\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"proposedIn\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"L1_ALREADY_CONTESTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_ALREADY_PROVED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOCK_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOCK_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_CANNOT_CONTEST\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_DIFF_VERIFIER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_ETH_NOT_PAID_AS_BOND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_BLOCK_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_MSG_VALUE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_PARAMS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_TIER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_TRANSITION\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_NOT_ASSIGNED_PROVER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_PROVING_PAUSED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TRANSITION_ID_ZERO\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNEXPECTED_TRANSITION_ID\",\"inputs\":[]}]", } // LibProvingABI is the input ABI used to generate the binding from. @@ -180,6 +180,598 @@ func (_LibProving *LibProvingTransactorRaw) Transact(opts *bind.TransactOpts, me return _LibProving.Contract.contract.Transact(opts, method, params...) } +// LibProvingBlockVerifiedV2Iterator is returned from FilterBlockVerifiedV2 and is used to iterate over the raw logs and unpacked data for BlockVerifiedV2 events raised by the LibProving contract. +type LibProvingBlockVerifiedV2Iterator struct { + Event *LibProvingBlockVerifiedV2 // 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 *LibProvingBlockVerifiedV2Iterator) 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(LibProvingBlockVerifiedV2) + 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(LibProvingBlockVerifiedV2) + 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 *LibProvingBlockVerifiedV2Iterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *LibProvingBlockVerifiedV2Iterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// LibProvingBlockVerifiedV2 represents a BlockVerifiedV2 event raised by the LibProving contract. +type LibProvingBlockVerifiedV2 struct { + BlockId *big.Int + Prover common.Address + BlockHash [32]byte + Tier uint16 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterBlockVerifiedV2 is a free log retrieval operation binding the contract event 0xe5a390d9800811154279af0c1a80d3bdf558ea91f1301e7c6ec3c1ad83e80aef. +// +// Solidity: event BlockVerifiedV2(uint256 indexed blockId, address indexed prover, bytes32 blockHash, uint16 tier) +func (_LibProving *LibProvingFilterer) FilterBlockVerifiedV2(opts *bind.FilterOpts, blockId []*big.Int, prover []common.Address) (*LibProvingBlockVerifiedV2Iterator, error) { + + var blockIdRule []interface{} + for _, blockIdItem := range blockId { + blockIdRule = append(blockIdRule, blockIdItem) + } + var proverRule []interface{} + for _, proverItem := range prover { + proverRule = append(proverRule, proverItem) + } + + logs, sub, err := _LibProving.contract.FilterLogs(opts, "BlockVerifiedV2", blockIdRule, proverRule) + if err != nil { + return nil, err + } + return &LibProvingBlockVerifiedV2Iterator{contract: _LibProving.contract, event: "BlockVerifiedV2", logs: logs, sub: sub}, nil +} + +// WatchBlockVerifiedV2 is a free log subscription operation binding the contract event 0xe5a390d9800811154279af0c1a80d3bdf558ea91f1301e7c6ec3c1ad83e80aef. +// +// Solidity: event BlockVerifiedV2(uint256 indexed blockId, address indexed prover, bytes32 blockHash, uint16 tier) +func (_LibProving *LibProvingFilterer) WatchBlockVerifiedV2(opts *bind.WatchOpts, sink chan<- *LibProvingBlockVerifiedV2, blockId []*big.Int, prover []common.Address) (event.Subscription, error) { + + var blockIdRule []interface{} + for _, blockIdItem := range blockId { + blockIdRule = append(blockIdRule, blockIdItem) + } + var proverRule []interface{} + for _, proverItem := range prover { + proverRule = append(proverRule, proverItem) + } + + logs, sub, err := _LibProving.contract.WatchLogs(opts, "BlockVerifiedV2", blockIdRule, proverRule) + 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(LibProvingBlockVerifiedV2) + if err := _LibProving.contract.UnpackLog(event, "BlockVerifiedV2", 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 +} + +// ParseBlockVerifiedV2 is a log parse operation binding the contract event 0xe5a390d9800811154279af0c1a80d3bdf558ea91f1301e7c6ec3c1ad83e80aef. +// +// Solidity: event BlockVerifiedV2(uint256 indexed blockId, address indexed prover, bytes32 blockHash, uint16 tier) +func (_LibProving *LibProvingFilterer) ParseBlockVerifiedV2(log types.Log) (*LibProvingBlockVerifiedV2, error) { + event := new(LibProvingBlockVerifiedV2) + if err := _LibProving.contract.UnpackLog(event, "BlockVerifiedV2", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// LibProvingBondCreditedIterator is returned from FilterBondCredited and is used to iterate over the raw logs and unpacked data for BondCredited events raised by the LibProving contract. +type LibProvingBondCreditedIterator struct { + Event *LibProvingBondCredited // 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 *LibProvingBondCreditedIterator) 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(LibProvingBondCredited) + 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(LibProvingBondCredited) + 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 *LibProvingBondCreditedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *LibProvingBondCreditedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// LibProvingBondCredited represents a BondCredited event raised by the LibProving contract. +type LibProvingBondCredited struct { + User common.Address + BlockId *big.Int + Amount *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterBondCredited is a free log retrieval operation binding the contract event 0x767672484792852973001cc22546fd96c3d7466da3c383e42741793dce5e4169. +// +// Solidity: event BondCredited(address indexed user, uint256 blockId, uint256 amount) +func (_LibProving *LibProvingFilterer) FilterBondCredited(opts *bind.FilterOpts, user []common.Address) (*LibProvingBondCreditedIterator, error) { + + var userRule []interface{} + for _, userItem := range user { + userRule = append(userRule, userItem) + } + + logs, sub, err := _LibProving.contract.FilterLogs(opts, "BondCredited", userRule) + if err != nil { + return nil, err + } + return &LibProvingBondCreditedIterator{contract: _LibProving.contract, event: "BondCredited", logs: logs, sub: sub}, nil +} + +// WatchBondCredited is a free log subscription operation binding the contract event 0x767672484792852973001cc22546fd96c3d7466da3c383e42741793dce5e4169. +// +// Solidity: event BondCredited(address indexed user, uint256 blockId, uint256 amount) +func (_LibProving *LibProvingFilterer) WatchBondCredited(opts *bind.WatchOpts, sink chan<- *LibProvingBondCredited, user []common.Address) (event.Subscription, error) { + + var userRule []interface{} + for _, userItem := range user { + userRule = append(userRule, userItem) + } + + logs, sub, err := _LibProving.contract.WatchLogs(opts, "BondCredited", userRule) + 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(LibProvingBondCredited) + if err := _LibProving.contract.UnpackLog(event, "BondCredited", 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 +} + +// ParseBondCredited is a log parse operation binding the contract event 0x767672484792852973001cc22546fd96c3d7466da3c383e42741793dce5e4169. +// +// Solidity: event BondCredited(address indexed user, uint256 blockId, uint256 amount) +func (_LibProving *LibProvingFilterer) ParseBondCredited(log types.Log) (*LibProvingBondCredited, error) { + event := new(LibProvingBondCredited) + if err := _LibProving.contract.UnpackLog(event, "BondCredited", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// LibProvingBondDebitedIterator is returned from FilterBondDebited and is used to iterate over the raw logs and unpacked data for BondDebited events raised by the LibProving contract. +type LibProvingBondDebitedIterator struct { + Event *LibProvingBondDebited // 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 *LibProvingBondDebitedIterator) 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(LibProvingBondDebited) + 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(LibProvingBondDebited) + 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 *LibProvingBondDebitedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *LibProvingBondDebitedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// LibProvingBondDebited represents a BondDebited event raised by the LibProving contract. +type LibProvingBondDebited struct { + User common.Address + BlockId *big.Int + Amount *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterBondDebited is a free log retrieval operation binding the contract event 0xf4636413c66bd7ef2a1d735c30d22543acb0fba1b0892503bef0734b237c3f37. +// +// Solidity: event BondDebited(address indexed user, uint256 blockId, uint256 amount) +func (_LibProving *LibProvingFilterer) FilterBondDebited(opts *bind.FilterOpts, user []common.Address) (*LibProvingBondDebitedIterator, error) { + + var userRule []interface{} + for _, userItem := range user { + userRule = append(userRule, userItem) + } + + logs, sub, err := _LibProving.contract.FilterLogs(opts, "BondDebited", userRule) + if err != nil { + return nil, err + } + return &LibProvingBondDebitedIterator{contract: _LibProving.contract, event: "BondDebited", logs: logs, sub: sub}, nil +} + +// WatchBondDebited is a free log subscription operation binding the contract event 0xf4636413c66bd7ef2a1d735c30d22543acb0fba1b0892503bef0734b237c3f37. +// +// Solidity: event BondDebited(address indexed user, uint256 blockId, uint256 amount) +func (_LibProving *LibProvingFilterer) WatchBondDebited(opts *bind.WatchOpts, sink chan<- *LibProvingBondDebited, user []common.Address) (event.Subscription, error) { + + var userRule []interface{} + for _, userItem := range user { + userRule = append(userRule, userItem) + } + + logs, sub, err := _LibProving.contract.WatchLogs(opts, "BondDebited", userRule) + 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(LibProvingBondDebited) + if err := _LibProving.contract.UnpackLog(event, "BondDebited", 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 +} + +// ParseBondDebited is a log parse operation binding the contract event 0xf4636413c66bd7ef2a1d735c30d22543acb0fba1b0892503bef0734b237c3f37. +// +// Solidity: event BondDebited(address indexed user, uint256 blockId, uint256 amount) +func (_LibProving *LibProvingFilterer) ParseBondDebited(log types.Log) (*LibProvingBondDebited, error) { + event := new(LibProvingBondDebited) + if err := _LibProving.contract.UnpackLog(event, "BondDebited", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// LibProvingBondDepositedIterator is returned from FilterBondDeposited and is used to iterate over the raw logs and unpacked data for BondDeposited events raised by the LibProving contract. +type LibProvingBondDepositedIterator struct { + Event *LibProvingBondDeposited // 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 *LibProvingBondDepositedIterator) 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(LibProvingBondDeposited) + 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(LibProvingBondDeposited) + 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 *LibProvingBondDepositedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *LibProvingBondDepositedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// LibProvingBondDeposited represents a BondDeposited event raised by the LibProving contract. +type LibProvingBondDeposited struct { + User common.Address + Amount *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterBondDeposited is a free log retrieval operation binding the contract event 0x8ed8c6869618197b68315ade66e75ed3906c97b111fa3ab81e5760046825c7db. +// +// Solidity: event BondDeposited(address indexed user, uint256 amount) +func (_LibProving *LibProvingFilterer) FilterBondDeposited(opts *bind.FilterOpts, user []common.Address) (*LibProvingBondDepositedIterator, error) { + + var userRule []interface{} + for _, userItem := range user { + userRule = append(userRule, userItem) + } + + logs, sub, err := _LibProving.contract.FilterLogs(opts, "BondDeposited", userRule) + if err != nil { + return nil, err + } + return &LibProvingBondDepositedIterator{contract: _LibProving.contract, event: "BondDeposited", logs: logs, sub: sub}, nil +} + +// WatchBondDeposited is a free log subscription operation binding the contract event 0x8ed8c6869618197b68315ade66e75ed3906c97b111fa3ab81e5760046825c7db. +// +// Solidity: event BondDeposited(address indexed user, uint256 amount) +func (_LibProving *LibProvingFilterer) WatchBondDeposited(opts *bind.WatchOpts, sink chan<- *LibProvingBondDeposited, user []common.Address) (event.Subscription, error) { + + var userRule []interface{} + for _, userItem := range user { + userRule = append(userRule, userItem) + } + + logs, sub, err := _LibProving.contract.WatchLogs(opts, "BondDeposited", userRule) + 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(LibProvingBondDeposited) + if err := _LibProving.contract.UnpackLog(event, "BondDeposited", 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 +} + +// ParseBondDeposited is a log parse operation binding the contract event 0x8ed8c6869618197b68315ade66e75ed3906c97b111fa3ab81e5760046825c7db. +// +// Solidity: event BondDeposited(address indexed user, uint256 amount) +func (_LibProving *LibProvingFilterer) ParseBondDeposited(log types.Log) (*LibProvingBondDeposited, error) { + event := new(LibProvingBondDeposited) + if err := _LibProving.contract.UnpackLog(event, "BondDeposited", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + // LibProvingProvingPausedIterator is returned from FilterProvingPaused and is used to iterate over the raw logs and unpacked data for ProvingPaused events raised by the LibProving contract. type LibProvingProvingPausedIterator struct { Event *LibProvingProvingPaused // Event containing the contract specifics and raw log @@ -314,9 +906,9 @@ func (_LibProving *LibProvingFilterer) ParseProvingPaused(log types.Log) (*LibPr return event, nil } -// LibProvingTransitionContestedIterator is returned from FilterTransitionContested and is used to iterate over the raw logs and unpacked data for TransitionContested events raised by the LibProving contract. -type LibProvingTransitionContestedIterator struct { - Event *LibProvingTransitionContested // Event containing the contract specifics and raw log +// LibProvingTransitionContestedV2Iterator is returned from FilterTransitionContestedV2 and is used to iterate over the raw logs and unpacked data for TransitionContestedV2 events raised by the LibProving contract. +type LibProvingTransitionContestedV2Iterator struct { + Event *LibProvingTransitionContestedV2 // 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 @@ -330,7 +922,7 @@ type LibProvingTransitionContestedIterator struct { // 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 *LibProvingTransitionContestedIterator) Next() bool { +func (it *LibProvingTransitionContestedV2Iterator) Next() bool { // If the iterator failed, stop iterating if it.fail != nil { return false @@ -339,7 +931,7 @@ func (it *LibProvingTransitionContestedIterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(LibProvingTransitionContested) + it.Event = new(LibProvingTransitionContestedV2) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -354,7 +946,7 @@ func (it *LibProvingTransitionContestedIterator) Next() bool { // Iterator still in progress, wait for either a data or an error event select { case log := <-it.logs: - it.Event = new(LibProvingTransitionContested) + it.Event = new(LibProvingTransitionContestedV2) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -370,55 +962,56 @@ func (it *LibProvingTransitionContestedIterator) Next() bool { } // Error returns any retrieval or parsing error occurred during filtering. -func (it *LibProvingTransitionContestedIterator) Error() error { +func (it *LibProvingTransitionContestedV2Iterator) Error() error { return it.fail } // Close terminates the iteration process, releasing any pending underlying // resources. -func (it *LibProvingTransitionContestedIterator) Close() error { +func (it *LibProvingTransitionContestedV2Iterator) Close() error { it.sub.Unsubscribe() return nil } -// LibProvingTransitionContested represents a TransitionContested event raised by the LibProving contract. -type LibProvingTransitionContested struct { +// LibProvingTransitionContestedV2 represents a TransitionContestedV2 event raised by the LibProving contract. +type LibProvingTransitionContestedV2 struct { BlockId *big.Int Tran TaikoDataTransition Contester common.Address ContestBond *big.Int Tier uint16 + ProposedIn uint64 Raw types.Log // Blockchain specific contextual infos } -// FilterTransitionContested is a free log retrieval operation binding the contract event 0xb4c0a86c1ff239277697775b1e91d3375fd3a5ef6b345aa4e2f6001c890558f6. +// FilterTransitionContestedV2 is a free log retrieval operation binding the contract event 0x53b2379d5e9bcacdfe56b4a51c3fd92ebfff4b1e8e8638f7f7e85163260a6f99. // -// Solidity: event TransitionContested(uint256 indexed blockId, (bytes32,bytes32,bytes32,bytes32) tran, address contester, uint96 contestBond, uint16 tier) -func (_LibProving *LibProvingFilterer) FilterTransitionContested(opts *bind.FilterOpts, blockId []*big.Int) (*LibProvingTransitionContestedIterator, error) { +// Solidity: event TransitionContestedV2(uint256 indexed blockId, (bytes32,bytes32,bytes32,bytes32) tran, address contester, uint96 contestBond, uint16 tier, uint64 proposedIn) +func (_LibProving *LibProvingFilterer) FilterTransitionContestedV2(opts *bind.FilterOpts, blockId []*big.Int) (*LibProvingTransitionContestedV2Iterator, error) { var blockIdRule []interface{} for _, blockIdItem := range blockId { blockIdRule = append(blockIdRule, blockIdItem) } - logs, sub, err := _LibProving.contract.FilterLogs(opts, "TransitionContested", blockIdRule) + logs, sub, err := _LibProving.contract.FilterLogs(opts, "TransitionContestedV2", blockIdRule) if err != nil { return nil, err } - return &LibProvingTransitionContestedIterator{contract: _LibProving.contract, event: "TransitionContested", logs: logs, sub: sub}, nil + return &LibProvingTransitionContestedV2Iterator{contract: _LibProving.contract, event: "TransitionContestedV2", logs: logs, sub: sub}, nil } -// WatchTransitionContested is a free log subscription operation binding the contract event 0xb4c0a86c1ff239277697775b1e91d3375fd3a5ef6b345aa4e2f6001c890558f6. +// WatchTransitionContestedV2 is a free log subscription operation binding the contract event 0x53b2379d5e9bcacdfe56b4a51c3fd92ebfff4b1e8e8638f7f7e85163260a6f99. // -// Solidity: event TransitionContested(uint256 indexed blockId, (bytes32,bytes32,bytes32,bytes32) tran, address contester, uint96 contestBond, uint16 tier) -func (_LibProving *LibProvingFilterer) WatchTransitionContested(opts *bind.WatchOpts, sink chan<- *LibProvingTransitionContested, blockId []*big.Int) (event.Subscription, error) { +// Solidity: event TransitionContestedV2(uint256 indexed blockId, (bytes32,bytes32,bytes32,bytes32) tran, address contester, uint96 contestBond, uint16 tier, uint64 proposedIn) +func (_LibProving *LibProvingFilterer) WatchTransitionContestedV2(opts *bind.WatchOpts, sink chan<- *LibProvingTransitionContestedV2, blockId []*big.Int) (event.Subscription, error) { var blockIdRule []interface{} for _, blockIdItem := range blockId { blockIdRule = append(blockIdRule, blockIdItem) } - logs, sub, err := _LibProving.contract.WatchLogs(opts, "TransitionContested", blockIdRule) + logs, sub, err := _LibProving.contract.WatchLogs(opts, "TransitionContestedV2", blockIdRule) if err != nil { return nil, err } @@ -428,8 +1021,8 @@ func (_LibProving *LibProvingFilterer) WatchTransitionContested(opts *bind.Watch select { case log := <-logs: // New log arrived, parse the event and forward to the user - event := new(LibProvingTransitionContested) - if err := _LibProving.contract.UnpackLog(event, "TransitionContested", log); err != nil { + event := new(LibProvingTransitionContestedV2) + if err := _LibProving.contract.UnpackLog(event, "TransitionContestedV2", log); err != nil { return err } event.Raw = log @@ -450,21 +1043,21 @@ func (_LibProving *LibProvingFilterer) WatchTransitionContested(opts *bind.Watch }), nil } -// ParseTransitionContested is a log parse operation binding the contract event 0xb4c0a86c1ff239277697775b1e91d3375fd3a5ef6b345aa4e2f6001c890558f6. +// ParseTransitionContestedV2 is a log parse operation binding the contract event 0x53b2379d5e9bcacdfe56b4a51c3fd92ebfff4b1e8e8638f7f7e85163260a6f99. // -// Solidity: event TransitionContested(uint256 indexed blockId, (bytes32,bytes32,bytes32,bytes32) tran, address contester, uint96 contestBond, uint16 tier) -func (_LibProving *LibProvingFilterer) ParseTransitionContested(log types.Log) (*LibProvingTransitionContested, error) { - event := new(LibProvingTransitionContested) - if err := _LibProving.contract.UnpackLog(event, "TransitionContested", log); err != nil { +// Solidity: event TransitionContestedV2(uint256 indexed blockId, (bytes32,bytes32,bytes32,bytes32) tran, address contester, uint96 contestBond, uint16 tier, uint64 proposedIn) +func (_LibProving *LibProvingFilterer) ParseTransitionContestedV2(log types.Log) (*LibProvingTransitionContestedV2, error) { + event := new(LibProvingTransitionContestedV2) + if err := _LibProving.contract.UnpackLog(event, "TransitionContestedV2", log); err != nil { return nil, err } event.Raw = log return event, nil } -// LibProvingTransitionProvedIterator is returned from FilterTransitionProved and is used to iterate over the raw logs and unpacked data for TransitionProved events raised by the LibProving contract. -type LibProvingTransitionProvedIterator struct { - Event *LibProvingTransitionProved // Event containing the contract specifics and raw log +// LibProvingTransitionProvedV2Iterator is returned from FilterTransitionProvedV2 and is used to iterate over the raw logs and unpacked data for TransitionProvedV2 events raised by the LibProving contract. +type LibProvingTransitionProvedV2Iterator struct { + Event *LibProvingTransitionProvedV2 // 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 @@ -478,7 +1071,7 @@ type LibProvingTransitionProvedIterator struct { // 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 *LibProvingTransitionProvedIterator) Next() bool { +func (it *LibProvingTransitionProvedV2Iterator) Next() bool { // If the iterator failed, stop iterating if it.fail != nil { return false @@ -487,7 +1080,7 @@ func (it *LibProvingTransitionProvedIterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(LibProvingTransitionProved) + it.Event = new(LibProvingTransitionProvedV2) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -502,7 +1095,7 @@ func (it *LibProvingTransitionProvedIterator) Next() bool { // Iterator still in progress, wait for either a data or an error event select { case log := <-it.logs: - it.Event = new(LibProvingTransitionProved) + it.Event = new(LibProvingTransitionProvedV2) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -518,55 +1111,56 @@ func (it *LibProvingTransitionProvedIterator) Next() bool { } // Error returns any retrieval or parsing error occurred during filtering. -func (it *LibProvingTransitionProvedIterator) Error() error { +func (it *LibProvingTransitionProvedV2Iterator) Error() error { return it.fail } // Close terminates the iteration process, releasing any pending underlying // resources. -func (it *LibProvingTransitionProvedIterator) Close() error { +func (it *LibProvingTransitionProvedV2Iterator) Close() error { it.sub.Unsubscribe() return nil } -// LibProvingTransitionProved represents a TransitionProved event raised by the LibProving contract. -type LibProvingTransitionProved struct { +// LibProvingTransitionProvedV2 represents a TransitionProvedV2 event raised by the LibProving contract. +type LibProvingTransitionProvedV2 struct { BlockId *big.Int Tran TaikoDataTransition Prover common.Address ValidityBond *big.Int Tier uint16 + ProposedIn uint64 Raw types.Log // Blockchain specific contextual infos } -// FilterTransitionProved is a free log retrieval operation binding the contract event 0xc195e4be3b936845492b8be4b1cf604db687a4d79ad84d979499c136f8e6701f. +// FilterTransitionProvedV2 is a free log retrieval operation binding the contract event 0x11a9112e5724f21b226e2535a95a264a80c9626ed4c0923faaa9fa6556467488. // -// Solidity: event TransitionProved(uint256 indexed blockId, (bytes32,bytes32,bytes32,bytes32) tran, address prover, uint96 validityBond, uint16 tier) -func (_LibProving *LibProvingFilterer) FilterTransitionProved(opts *bind.FilterOpts, blockId []*big.Int) (*LibProvingTransitionProvedIterator, error) { +// Solidity: event TransitionProvedV2(uint256 indexed blockId, (bytes32,bytes32,bytes32,bytes32) tran, address prover, uint96 validityBond, uint16 tier, uint64 proposedIn) +func (_LibProving *LibProvingFilterer) FilterTransitionProvedV2(opts *bind.FilterOpts, blockId []*big.Int) (*LibProvingTransitionProvedV2Iterator, error) { var blockIdRule []interface{} for _, blockIdItem := range blockId { blockIdRule = append(blockIdRule, blockIdItem) } - logs, sub, err := _LibProving.contract.FilterLogs(opts, "TransitionProved", blockIdRule) + logs, sub, err := _LibProving.contract.FilterLogs(opts, "TransitionProvedV2", blockIdRule) if err != nil { return nil, err } - return &LibProvingTransitionProvedIterator{contract: _LibProving.contract, event: "TransitionProved", logs: logs, sub: sub}, nil + return &LibProvingTransitionProvedV2Iterator{contract: _LibProving.contract, event: "TransitionProvedV2", logs: logs, sub: sub}, nil } -// WatchTransitionProved is a free log subscription operation binding the contract event 0xc195e4be3b936845492b8be4b1cf604db687a4d79ad84d979499c136f8e6701f. +// WatchTransitionProvedV2 is a free log subscription operation binding the contract event 0x11a9112e5724f21b226e2535a95a264a80c9626ed4c0923faaa9fa6556467488. // -// Solidity: event TransitionProved(uint256 indexed blockId, (bytes32,bytes32,bytes32,bytes32) tran, address prover, uint96 validityBond, uint16 tier) -func (_LibProving *LibProvingFilterer) WatchTransitionProved(opts *bind.WatchOpts, sink chan<- *LibProvingTransitionProved, blockId []*big.Int) (event.Subscription, error) { +// Solidity: event TransitionProvedV2(uint256 indexed blockId, (bytes32,bytes32,bytes32,bytes32) tran, address prover, uint96 validityBond, uint16 tier, uint64 proposedIn) +func (_LibProving *LibProvingFilterer) WatchTransitionProvedV2(opts *bind.WatchOpts, sink chan<- *LibProvingTransitionProvedV2, blockId []*big.Int) (event.Subscription, error) { var blockIdRule []interface{} for _, blockIdItem := range blockId { blockIdRule = append(blockIdRule, blockIdItem) } - logs, sub, err := _LibProving.contract.WatchLogs(opts, "TransitionProved", blockIdRule) + logs, sub, err := _LibProving.contract.WatchLogs(opts, "TransitionProvedV2", blockIdRule) if err != nil { return nil, err } @@ -576,8 +1170,8 @@ func (_LibProving *LibProvingFilterer) WatchTransitionProved(opts *bind.WatchOpt select { case log := <-logs: // New log arrived, parse the event and forward to the user - event := new(LibProvingTransitionProved) - if err := _LibProving.contract.UnpackLog(event, "TransitionProved", log); err != nil { + event := new(LibProvingTransitionProvedV2) + if err := _LibProving.contract.UnpackLog(event, "TransitionProvedV2", log); err != nil { return err } event.Raw = log @@ -598,12 +1192,12 @@ func (_LibProving *LibProvingFilterer) WatchTransitionProved(opts *bind.WatchOpt }), nil } -// ParseTransitionProved is a log parse operation binding the contract event 0xc195e4be3b936845492b8be4b1cf604db687a4d79ad84d979499c136f8e6701f. +// ParseTransitionProvedV2 is a log parse operation binding the contract event 0x11a9112e5724f21b226e2535a95a264a80c9626ed4c0923faaa9fa6556467488. // -// Solidity: event TransitionProved(uint256 indexed blockId, (bytes32,bytes32,bytes32,bytes32) tran, address prover, uint96 validityBond, uint16 tier) -func (_LibProving *LibProvingFilterer) ParseTransitionProved(log types.Log) (*LibProvingTransitionProved, error) { - event := new(LibProvingTransitionProved) - if err := _LibProving.contract.UnpackLog(event, "TransitionProved", log); err != nil { +// Solidity: event TransitionProvedV2(uint256 indexed blockId, (bytes32,bytes32,bytes32,bytes32) tran, address prover, uint96 validityBond, uint16 tier, uint64 proposedIn) +func (_LibProving *LibProvingFilterer) ParseTransitionProvedV2(log types.Log) (*LibProvingTransitionProvedV2, error) { + event := new(LibProvingTransitionProvedV2) + if err := _LibProving.contract.UnpackLog(event, "TransitionProvedV2", log); err != nil { return nil, err } event.Raw = log diff --git a/packages/taiko-client/bindings/gen_lib_utils.go b/packages/taiko-client/bindings/gen_lib_utils.go index 09043e7ebba..640b9986040 100644 --- a/packages/taiko-client/bindings/gen_lib_utils.go +++ b/packages/taiko-client/bindings/gen_lib_utils.go @@ -31,7 +31,7 @@ var ( // LibUtilsMetaData contains all meta data concerning the LibUtils contract. var LibUtilsMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"error\",\"name\":\"L1_BLOCK_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_BLOCK_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TRANSITION_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNEXPECTED_TRANSITION_ID\",\"inputs\":[]}]", + ABI: "[{\"type\":\"event\",\"name\":\"BlockVerifiedV2\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"prover\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"L1_INVALID_BLOCK_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_GENESIS_HASH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_PARAMS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TRANSITION_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNEXPECTED_TRANSITION_ID\",\"inputs\":[]}]", } // LibUtilsABI is the input ABI used to generate the binding from. @@ -179,3 +179,158 @@ func (_LibUtils *LibUtilsTransactorRaw) Transfer(opts *bind.TransactOpts) (*type func (_LibUtils *LibUtilsTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { return _LibUtils.Contract.contract.Transact(opts, method, params...) } + +// LibUtilsBlockVerifiedV2Iterator is returned from FilterBlockVerifiedV2 and is used to iterate over the raw logs and unpacked data for BlockVerifiedV2 events raised by the LibUtils contract. +type LibUtilsBlockVerifiedV2Iterator struct { + Event *LibUtilsBlockVerifiedV2 // 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 *LibUtilsBlockVerifiedV2Iterator) 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(LibUtilsBlockVerifiedV2) + 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(LibUtilsBlockVerifiedV2) + 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 *LibUtilsBlockVerifiedV2Iterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *LibUtilsBlockVerifiedV2Iterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// LibUtilsBlockVerifiedV2 represents a BlockVerifiedV2 event raised by the LibUtils contract. +type LibUtilsBlockVerifiedV2 struct { + BlockId *big.Int + Prover common.Address + BlockHash [32]byte + Tier uint16 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterBlockVerifiedV2 is a free log retrieval operation binding the contract event 0xe5a390d9800811154279af0c1a80d3bdf558ea91f1301e7c6ec3c1ad83e80aef. +// +// Solidity: event BlockVerifiedV2(uint256 indexed blockId, address indexed prover, bytes32 blockHash, uint16 tier) +func (_LibUtils *LibUtilsFilterer) FilterBlockVerifiedV2(opts *bind.FilterOpts, blockId []*big.Int, prover []common.Address) (*LibUtilsBlockVerifiedV2Iterator, error) { + + var blockIdRule []interface{} + for _, blockIdItem := range blockId { + blockIdRule = append(blockIdRule, blockIdItem) + } + var proverRule []interface{} + for _, proverItem := range prover { + proverRule = append(proverRule, proverItem) + } + + logs, sub, err := _LibUtils.contract.FilterLogs(opts, "BlockVerifiedV2", blockIdRule, proverRule) + if err != nil { + return nil, err + } + return &LibUtilsBlockVerifiedV2Iterator{contract: _LibUtils.contract, event: "BlockVerifiedV2", logs: logs, sub: sub}, nil +} + +// WatchBlockVerifiedV2 is a free log subscription operation binding the contract event 0xe5a390d9800811154279af0c1a80d3bdf558ea91f1301e7c6ec3c1ad83e80aef. +// +// Solidity: event BlockVerifiedV2(uint256 indexed blockId, address indexed prover, bytes32 blockHash, uint16 tier) +func (_LibUtils *LibUtilsFilterer) WatchBlockVerifiedV2(opts *bind.WatchOpts, sink chan<- *LibUtilsBlockVerifiedV2, blockId []*big.Int, prover []common.Address) (event.Subscription, error) { + + var blockIdRule []interface{} + for _, blockIdItem := range blockId { + blockIdRule = append(blockIdRule, blockIdItem) + } + var proverRule []interface{} + for _, proverItem := range prover { + proverRule = append(proverRule, proverItem) + } + + logs, sub, err := _LibUtils.contract.WatchLogs(opts, "BlockVerifiedV2", blockIdRule, proverRule) + 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(LibUtilsBlockVerifiedV2) + if err := _LibUtils.contract.UnpackLog(event, "BlockVerifiedV2", 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 +} + +// ParseBlockVerifiedV2 is a log parse operation binding the contract event 0xe5a390d9800811154279af0c1a80d3bdf558ea91f1301e7c6ec3c1ad83e80aef. +// +// Solidity: event BlockVerifiedV2(uint256 indexed blockId, address indexed prover, bytes32 blockHash, uint16 tier) +func (_LibUtils *LibUtilsFilterer) ParseBlockVerifiedV2(log types.Log) (*LibUtilsBlockVerifiedV2, error) { + event := new(LibUtilsBlockVerifiedV2) + if err := _LibUtils.contract.UnpackLog(event, "BlockVerifiedV2", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} diff --git a/packages/taiko-client/bindings/gen_lib_verifying.go b/packages/taiko-client/bindings/gen_lib_verifying.go index 7e8dba63910..92626c25e59 100644 --- a/packages/taiko-client/bindings/gen_lib_verifying.go +++ b/packages/taiko-client/bindings/gen_lib_verifying.go @@ -31,7 +31,7 @@ var ( // LibVerifyingMetaData contains all meta data concerning the LibVerifying contract. var LibVerifyingMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"event\",\"name\":\"BlockVerified\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"prover\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StateVariablesUpdated\",\"inputs\":[{\"name\":\"slotB\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.SlotB\",\"components\":[{\"name\":\"numBlocks\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastVerifiedBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"provingPaused\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"__reservedB1\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"__reservedB2\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"__reservedB3\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"lastUnpausedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"L1_BLOCK_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_CONFIG\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_GENESIS_HASH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TOO_LATE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TRANSITION_ID_ZERO\",\"inputs\":[]}]", + ABI: "[{\"type\":\"error\",\"name\":\"L1_BLOCK_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TRANSITION_ID_ZERO\",\"inputs\":[]}]", } // LibVerifyingABI is the input ABI used to generate the binding from. @@ -179,293 +179,3 @@ func (_LibVerifying *LibVerifyingTransactorRaw) Transfer(opts *bind.TransactOpts func (_LibVerifying *LibVerifyingTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { return _LibVerifying.Contract.contract.Transact(opts, method, params...) } - -// LibVerifyingBlockVerifiedIterator is returned from FilterBlockVerified and is used to iterate over the raw logs and unpacked data for BlockVerified events raised by the LibVerifying contract. -type LibVerifyingBlockVerifiedIterator struct { - Event *LibVerifyingBlockVerified // 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 *LibVerifyingBlockVerifiedIterator) 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(LibVerifyingBlockVerified) - 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(LibVerifyingBlockVerified) - 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 *LibVerifyingBlockVerifiedIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *LibVerifyingBlockVerifiedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// LibVerifyingBlockVerified represents a BlockVerified event raised by the LibVerifying contract. -type LibVerifyingBlockVerified struct { - BlockId *big.Int - Prover common.Address - BlockHash [32]byte - StateRoot [32]byte - Tier uint16 - Raw types.Log // Blockchain specific contextual infos -} - -// FilterBlockVerified is a free log retrieval operation binding the contract event 0xdecbd2c61cbda254917d6fd4c980a470701e8f9f1b744f6ad163ca70ca5db289. -// -// Solidity: event BlockVerified(uint256 indexed blockId, address indexed prover, bytes32 blockHash, bytes32 stateRoot, uint16 tier) -func (_LibVerifying *LibVerifyingFilterer) FilterBlockVerified(opts *bind.FilterOpts, blockId []*big.Int, prover []common.Address) (*LibVerifyingBlockVerifiedIterator, error) { - - var blockIdRule []interface{} - for _, blockIdItem := range blockId { - blockIdRule = append(blockIdRule, blockIdItem) - } - var proverRule []interface{} - for _, proverItem := range prover { - proverRule = append(proverRule, proverItem) - } - - logs, sub, err := _LibVerifying.contract.FilterLogs(opts, "BlockVerified", blockIdRule, proverRule) - if err != nil { - return nil, err - } - return &LibVerifyingBlockVerifiedIterator{contract: _LibVerifying.contract, event: "BlockVerified", logs: logs, sub: sub}, nil -} - -// WatchBlockVerified is a free log subscription operation binding the contract event 0xdecbd2c61cbda254917d6fd4c980a470701e8f9f1b744f6ad163ca70ca5db289. -// -// Solidity: event BlockVerified(uint256 indexed blockId, address indexed prover, bytes32 blockHash, bytes32 stateRoot, uint16 tier) -func (_LibVerifying *LibVerifyingFilterer) WatchBlockVerified(opts *bind.WatchOpts, sink chan<- *LibVerifyingBlockVerified, blockId []*big.Int, prover []common.Address) (event.Subscription, error) { - - var blockIdRule []interface{} - for _, blockIdItem := range blockId { - blockIdRule = append(blockIdRule, blockIdItem) - } - var proverRule []interface{} - for _, proverItem := range prover { - proverRule = append(proverRule, proverItem) - } - - logs, sub, err := _LibVerifying.contract.WatchLogs(opts, "BlockVerified", blockIdRule, proverRule) - 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(LibVerifyingBlockVerified) - if err := _LibVerifying.contract.UnpackLog(event, "BlockVerified", 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 -} - -// ParseBlockVerified is a log parse operation binding the contract event 0xdecbd2c61cbda254917d6fd4c980a470701e8f9f1b744f6ad163ca70ca5db289. -// -// Solidity: event BlockVerified(uint256 indexed blockId, address indexed prover, bytes32 blockHash, bytes32 stateRoot, uint16 tier) -func (_LibVerifying *LibVerifyingFilterer) ParseBlockVerified(log types.Log) (*LibVerifyingBlockVerified, error) { - event := new(LibVerifyingBlockVerified) - if err := _LibVerifying.contract.UnpackLog(event, "BlockVerified", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// LibVerifyingStateVariablesUpdatedIterator is returned from FilterStateVariablesUpdated and is used to iterate over the raw logs and unpacked data for StateVariablesUpdated events raised by the LibVerifying contract. -type LibVerifyingStateVariablesUpdatedIterator struct { - Event *LibVerifyingStateVariablesUpdated // 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 *LibVerifyingStateVariablesUpdatedIterator) 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(LibVerifyingStateVariablesUpdated) - 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(LibVerifyingStateVariablesUpdated) - 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 *LibVerifyingStateVariablesUpdatedIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *LibVerifyingStateVariablesUpdatedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// LibVerifyingStateVariablesUpdated represents a StateVariablesUpdated event raised by the LibVerifying contract. -type LibVerifyingStateVariablesUpdated struct { - SlotB TaikoDataSlotB - Raw types.Log // Blockchain specific contextual infos -} - -// FilterStateVariablesUpdated is a free log retrieval operation binding the contract event 0xdf66aee38ea9fe523cfd238705d455a354305a646748dbb931898b51cee4727b. -// -// Solidity: event StateVariablesUpdated((uint64,uint64,bool,uint8,uint16,uint32,uint64) slotB) -func (_LibVerifying *LibVerifyingFilterer) FilterStateVariablesUpdated(opts *bind.FilterOpts) (*LibVerifyingStateVariablesUpdatedIterator, error) { - - logs, sub, err := _LibVerifying.contract.FilterLogs(opts, "StateVariablesUpdated") - if err != nil { - return nil, err - } - return &LibVerifyingStateVariablesUpdatedIterator{contract: _LibVerifying.contract, event: "StateVariablesUpdated", logs: logs, sub: sub}, nil -} - -// WatchStateVariablesUpdated is a free log subscription operation binding the contract event 0xdf66aee38ea9fe523cfd238705d455a354305a646748dbb931898b51cee4727b. -// -// Solidity: event StateVariablesUpdated((uint64,uint64,bool,uint8,uint16,uint32,uint64) slotB) -func (_LibVerifying *LibVerifyingFilterer) WatchStateVariablesUpdated(opts *bind.WatchOpts, sink chan<- *LibVerifyingStateVariablesUpdated) (event.Subscription, error) { - - logs, sub, err := _LibVerifying.contract.WatchLogs(opts, "StateVariablesUpdated") - 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(LibVerifyingStateVariablesUpdated) - if err := _LibVerifying.contract.UnpackLog(event, "StateVariablesUpdated", 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 -} - -// ParseStateVariablesUpdated is a log parse operation binding the contract event 0xdf66aee38ea9fe523cfd238705d455a354305a646748dbb931898b51cee4727b. -// -// Solidity: event StateVariablesUpdated((uint64,uint64,bool,uint8,uint16,uint32,uint64) slotB) -func (_LibVerifying *LibVerifyingFilterer) ParseStateVariablesUpdated(log types.Log) (*LibVerifyingStateVariablesUpdated, error) { - event := new(LibVerifyingStateVariablesUpdated) - if err := _LibVerifying.contract.UnpackLog(event, "StateVariablesUpdated", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} diff --git a/packages/taiko-client/bindings/gen_prover_set.go b/packages/taiko-client/bindings/gen_prover_set.go index 65aeb3cadad..9ce5ee76b8a 100644 --- a/packages/taiko-client/bindings/gen_prover_set.go +++ b/packages/taiko-client/bindings/gen_prover_set.go @@ -31,7 +31,7 @@ var ( // ProverSetMetaData contains all meta data concerning the ProverSet contract. var ProverSetMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"receive\",\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addressManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"admin\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"delegate\",\"inputs\":[{\"name\":\"_delegatee\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"enableProver\",\"inputs\":[{\"name\":\"_prover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_isProver\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"impl\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"inNonReentrant\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"init\",\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_admin\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_addressManager\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isProver\",\"inputs\":[{\"name\":\"prover\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"isProver\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isValidSignature\",\"inputs\":[{\"name\":\"_hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"magicValue_\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proveBlock\",\"inputs\":[{\"name\":\"_blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_input\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeTo\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"withdrawToAdmin\",\"inputs\":[{\"name\":\"_amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AdminChanged\",\"inputs\":[{\"name\":\"previousAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconUpgraded\",\"inputs\":[{\"name\":\"beacon\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BlockProvenBy\",\"inputs\":[{\"name\":\"prover\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"blockId\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ProverEnabled\",\"inputs\":[{\"name\":\"prover\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"enabled\",\"type\":\"bool\",\"indexed\":true,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"FUNC_NOT_IMPLEMENTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"INVALID_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PERMISSION_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"REENTRANT_CALL\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_INVALID_MANAGER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_UNEXPECTED_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_ZERO_ADDR\",\"inputs\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ZERO_ADDRESS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_VALUE\",\"inputs\":[]}]", + ABI: "[{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addressManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"admin\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"approveAllowance\",\"inputs\":[{\"name\":\"_address\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_allowance\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegate\",\"inputs\":[{\"name\":\"_delegatee\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"depositBond\",\"inputs\":[{\"name\":\"_amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"enableProver\",\"inputs\":[{\"name\":\"_prover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_isProver\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"impl\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"inNonReentrant\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"init\",\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_admin\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_rollupAddressManager\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isProver\",\"inputs\":[{\"name\":\"prover\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"isProver\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isValidSignature\",\"inputs\":[{\"name\":\"_hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"magicValue_\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proposeBlockV2\",\"inputs\":[{\"name\":\"_params\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"_txList\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"proposeBlocksV2\",\"inputs\":[{\"name\":\"_paramsArr\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"_txListArr\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"proposeBlocksV2Conditionally\",\"inputs\":[{\"name\":\"_params\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"_txList\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"proveBlock\",\"inputs\":[{\"name\":\"_blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_input\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"proveBlocks\",\"inputs\":[{\"name\":\"_blockId\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"},{\"name\":\"_input\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"_batchProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeTo\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"withdrawBond\",\"inputs\":[{\"name\":\"_amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawEtherToAdmin\",\"inputs\":[{\"name\":\"_amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawToAdmin\",\"inputs\":[{\"name\":\"_amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AdminChanged\",\"inputs\":[{\"name\":\"previousAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconUpgraded\",\"inputs\":[{\"name\":\"beacon\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ProverEnabled\",\"inputs\":[{\"name\":\"prover\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"enabled\",\"type\":\"bool\",\"indexed\":true,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"ETH_TRANSFER_FAILED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FUNC_NOT_IMPLEMENTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"INVALID_BOND_TOKEN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"INVALID_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NOT_FIRST_PROPOSAL\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PERMISSION_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"REENTRANT_CALL\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_INVALID_MANAGER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_UNEXPECTED_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_ZERO_ADDR\",\"inputs\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ZERO_ADDRESS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_VALUE\",\"inputs\":[]}]", } // ProverSetABI is the input ABI used to generate the binding from. @@ -604,6 +604,27 @@ func (_ProverSet *ProverSetTransactorSession) AcceptOwnership() (*types.Transact return _ProverSet.Contract.AcceptOwnership(&_ProverSet.TransactOpts) } +// ApproveAllowance is a paid mutator transaction binding the contract method 0x0a1553a5. +// +// Solidity: function approveAllowance(address _address, uint256 _allowance) returns() +func (_ProverSet *ProverSetTransactor) ApproveAllowance(opts *bind.TransactOpts, _address common.Address, _allowance *big.Int) (*types.Transaction, error) { + return _ProverSet.contract.Transact(opts, "approveAllowance", _address, _allowance) +} + +// ApproveAllowance is a paid mutator transaction binding the contract method 0x0a1553a5. +// +// Solidity: function approveAllowance(address _address, uint256 _allowance) returns() +func (_ProverSet *ProverSetSession) ApproveAllowance(_address common.Address, _allowance *big.Int) (*types.Transaction, error) { + return _ProverSet.Contract.ApproveAllowance(&_ProverSet.TransactOpts, _address, _allowance) +} + +// ApproveAllowance is a paid mutator transaction binding the contract method 0x0a1553a5. +// +// Solidity: function approveAllowance(address _address, uint256 _allowance) returns() +func (_ProverSet *ProverSetTransactorSession) ApproveAllowance(_address common.Address, _allowance *big.Int) (*types.Transaction, error) { + return _ProverSet.Contract.ApproveAllowance(&_ProverSet.TransactOpts, _address, _allowance) +} + // Delegate is a paid mutator transaction binding the contract method 0x5c19a95c. // // Solidity: function delegate(address _delegatee) returns() @@ -625,6 +646,27 @@ func (_ProverSet *ProverSetTransactorSession) Delegate(_delegatee common.Address return _ProverSet.Contract.Delegate(&_ProverSet.TransactOpts, _delegatee) } +// DepositBond is a paid mutator transaction binding the contract method 0x4dcb05f9. +// +// Solidity: function depositBond(uint256 _amount) returns() +func (_ProverSet *ProverSetTransactor) DepositBond(opts *bind.TransactOpts, _amount *big.Int) (*types.Transaction, error) { + return _ProverSet.contract.Transact(opts, "depositBond", _amount) +} + +// DepositBond is a paid mutator transaction binding the contract method 0x4dcb05f9. +// +// Solidity: function depositBond(uint256 _amount) returns() +func (_ProverSet *ProverSetSession) DepositBond(_amount *big.Int) (*types.Transaction, error) { + return _ProverSet.Contract.DepositBond(&_ProverSet.TransactOpts, _amount) +} + +// DepositBond is a paid mutator transaction binding the contract method 0x4dcb05f9. +// +// Solidity: function depositBond(uint256 _amount) returns() +func (_ProverSet *ProverSetTransactorSession) DepositBond(_amount *big.Int) (*types.Transaction, error) { + return _ProverSet.Contract.DepositBond(&_ProverSet.TransactOpts, _amount) +} + // EnableProver is a paid mutator transaction binding the contract method 0xcb4cd0a4. // // Solidity: function enableProver(address _prover, bool _isProver) returns() @@ -648,23 +690,23 @@ func (_ProverSet *ProverSetTransactorSession) EnableProver(_prover common.Addres // Init is a paid mutator transaction binding the contract method 0x184b9559. // -// Solidity: function init(address _owner, address _admin, address _addressManager) returns() -func (_ProverSet *ProverSetTransactor) Init(opts *bind.TransactOpts, _owner common.Address, _admin common.Address, _addressManager common.Address) (*types.Transaction, error) { - return _ProverSet.contract.Transact(opts, "init", _owner, _admin, _addressManager) +// Solidity: function init(address _owner, address _admin, address _rollupAddressManager) returns() +func (_ProverSet *ProverSetTransactor) Init(opts *bind.TransactOpts, _owner common.Address, _admin common.Address, _rollupAddressManager common.Address) (*types.Transaction, error) { + return _ProverSet.contract.Transact(opts, "init", _owner, _admin, _rollupAddressManager) } // Init is a paid mutator transaction binding the contract method 0x184b9559. // -// Solidity: function init(address _owner, address _admin, address _addressManager) returns() -func (_ProverSet *ProverSetSession) Init(_owner common.Address, _admin common.Address, _addressManager common.Address) (*types.Transaction, error) { - return _ProverSet.Contract.Init(&_ProverSet.TransactOpts, _owner, _admin, _addressManager) +// Solidity: function init(address _owner, address _admin, address _rollupAddressManager) returns() +func (_ProverSet *ProverSetSession) Init(_owner common.Address, _admin common.Address, _rollupAddressManager common.Address) (*types.Transaction, error) { + return _ProverSet.Contract.Init(&_ProverSet.TransactOpts, _owner, _admin, _rollupAddressManager) } // Init is a paid mutator transaction binding the contract method 0x184b9559. // -// Solidity: function init(address _owner, address _admin, address _addressManager) returns() -func (_ProverSet *ProverSetTransactorSession) Init(_owner common.Address, _admin common.Address, _addressManager common.Address) (*types.Transaction, error) { - return _ProverSet.Contract.Init(&_ProverSet.TransactOpts, _owner, _admin, _addressManager) +// Solidity: function init(address _owner, address _admin, address _rollupAddressManager) returns() +func (_ProverSet *ProverSetTransactorSession) Init(_owner common.Address, _admin common.Address, _rollupAddressManager common.Address) (*types.Transaction, error) { + return _ProverSet.Contract.Init(&_ProverSet.TransactOpts, _owner, _admin, _rollupAddressManager) } // Pause is a paid mutator transaction binding the contract method 0x8456cb59. @@ -688,6 +730,69 @@ func (_ProverSet *ProverSetTransactorSession) Pause() (*types.Transaction, error return _ProverSet.Contract.Pause(&_ProverSet.TransactOpts) } +// ProposeBlockV2 is a paid mutator transaction binding the contract method 0x648885fb. +// +// Solidity: function proposeBlockV2(bytes _params, bytes _txList) returns() +func (_ProverSet *ProverSetTransactor) ProposeBlockV2(opts *bind.TransactOpts, _params []byte, _txList []byte) (*types.Transaction, error) { + return _ProverSet.contract.Transact(opts, "proposeBlockV2", _params, _txList) +} + +// ProposeBlockV2 is a paid mutator transaction binding the contract method 0x648885fb. +// +// Solidity: function proposeBlockV2(bytes _params, bytes _txList) returns() +func (_ProverSet *ProverSetSession) ProposeBlockV2(_params []byte, _txList []byte) (*types.Transaction, error) { + return _ProverSet.Contract.ProposeBlockV2(&_ProverSet.TransactOpts, _params, _txList) +} + +// ProposeBlockV2 is a paid mutator transaction binding the contract method 0x648885fb. +// +// Solidity: function proposeBlockV2(bytes _params, bytes _txList) returns() +func (_ProverSet *ProverSetTransactorSession) ProposeBlockV2(_params []byte, _txList []byte) (*types.Transaction, error) { + return _ProverSet.Contract.ProposeBlockV2(&_ProverSet.TransactOpts, _params, _txList) +} + +// ProposeBlocksV2 is a paid mutator transaction binding the contract method 0x0c8f4a10. +// +// Solidity: function proposeBlocksV2(bytes[] _paramsArr, bytes[] _txListArr) returns() +func (_ProverSet *ProverSetTransactor) ProposeBlocksV2(opts *bind.TransactOpts, _paramsArr [][]byte, _txListArr [][]byte) (*types.Transaction, error) { + return _ProverSet.contract.Transact(opts, "proposeBlocksV2", _paramsArr, _txListArr) +} + +// ProposeBlocksV2 is a paid mutator transaction binding the contract method 0x0c8f4a10. +// +// Solidity: function proposeBlocksV2(bytes[] _paramsArr, bytes[] _txListArr) returns() +func (_ProverSet *ProverSetSession) ProposeBlocksV2(_paramsArr [][]byte, _txListArr [][]byte) (*types.Transaction, error) { + return _ProverSet.Contract.ProposeBlocksV2(&_ProverSet.TransactOpts, _paramsArr, _txListArr) +} + +// ProposeBlocksV2 is a paid mutator transaction binding the contract method 0x0c8f4a10. +// +// Solidity: function proposeBlocksV2(bytes[] _paramsArr, bytes[] _txListArr) returns() +func (_ProverSet *ProverSetTransactorSession) ProposeBlocksV2(_paramsArr [][]byte, _txListArr [][]byte) (*types.Transaction, error) { + return _ProverSet.Contract.ProposeBlocksV2(&_ProverSet.TransactOpts, _paramsArr, _txListArr) +} + +// ProposeBlocksV2Conditionally is a paid mutator transaction binding the contract method 0xe4882785. +// +// Solidity: function proposeBlocksV2Conditionally(bytes[] _params, bytes[] _txList) returns() +func (_ProverSet *ProverSetTransactor) ProposeBlocksV2Conditionally(opts *bind.TransactOpts, _params [][]byte, _txList [][]byte) (*types.Transaction, error) { + return _ProverSet.contract.Transact(opts, "proposeBlocksV2Conditionally", _params, _txList) +} + +// ProposeBlocksV2Conditionally is a paid mutator transaction binding the contract method 0xe4882785. +// +// Solidity: function proposeBlocksV2Conditionally(bytes[] _params, bytes[] _txList) returns() +func (_ProverSet *ProverSetSession) ProposeBlocksV2Conditionally(_params [][]byte, _txList [][]byte) (*types.Transaction, error) { + return _ProverSet.Contract.ProposeBlocksV2Conditionally(&_ProverSet.TransactOpts, _params, _txList) +} + +// ProposeBlocksV2Conditionally is a paid mutator transaction binding the contract method 0xe4882785. +// +// Solidity: function proposeBlocksV2Conditionally(bytes[] _params, bytes[] _txList) returns() +func (_ProverSet *ProverSetTransactorSession) ProposeBlocksV2Conditionally(_params [][]byte, _txList [][]byte) (*types.Transaction, error) { + return _ProverSet.Contract.ProposeBlocksV2Conditionally(&_ProverSet.TransactOpts, _params, _txList) +} + // ProveBlock is a paid mutator transaction binding the contract method 0x10d008bd. // // Solidity: function proveBlock(uint64 _blockId, bytes _input) returns() @@ -709,6 +814,27 @@ func (_ProverSet *ProverSetTransactorSession) ProveBlock(_blockId uint64, _input return _ProverSet.Contract.ProveBlock(&_ProverSet.TransactOpts, _blockId, _input) } +// ProveBlocks is a paid mutator transaction binding the contract method 0x440b6e18. +// +// Solidity: function proveBlocks(uint64[] _blockId, bytes[] _input, bytes _batchProof) returns() +func (_ProverSet *ProverSetTransactor) ProveBlocks(opts *bind.TransactOpts, _blockId []uint64, _input [][]byte, _batchProof []byte) (*types.Transaction, error) { + return _ProverSet.contract.Transact(opts, "proveBlocks", _blockId, _input, _batchProof) +} + +// ProveBlocks is a paid mutator transaction binding the contract method 0x440b6e18. +// +// Solidity: function proveBlocks(uint64[] _blockId, bytes[] _input, bytes _batchProof) returns() +func (_ProverSet *ProverSetSession) ProveBlocks(_blockId []uint64, _input [][]byte, _batchProof []byte) (*types.Transaction, error) { + return _ProverSet.Contract.ProveBlocks(&_ProverSet.TransactOpts, _blockId, _input, _batchProof) +} + +// ProveBlocks is a paid mutator transaction binding the contract method 0x440b6e18. +// +// Solidity: function proveBlocks(uint64[] _blockId, bytes[] _input, bytes _batchProof) returns() +func (_ProverSet *ProverSetTransactorSession) ProveBlocks(_blockId []uint64, _input [][]byte, _batchProof []byte) (*types.Transaction, error) { + return _ProverSet.Contract.ProveBlocks(&_ProverSet.TransactOpts, _blockId, _input, _batchProof) +} + // RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6. // // Solidity: function renounceOwnership() returns() @@ -814,6 +940,48 @@ func (_ProverSet *ProverSetTransactorSession) UpgradeToAndCall(newImplementation return _ProverSet.Contract.UpgradeToAndCall(&_ProverSet.TransactOpts, newImplementation, data) } +// WithdrawBond is a paid mutator transaction binding the contract method 0xc3daab96. +// +// Solidity: function withdrawBond(uint256 _amount) returns() +func (_ProverSet *ProverSetTransactor) WithdrawBond(opts *bind.TransactOpts, _amount *big.Int) (*types.Transaction, error) { + return _ProverSet.contract.Transact(opts, "withdrawBond", _amount) +} + +// WithdrawBond is a paid mutator transaction binding the contract method 0xc3daab96. +// +// Solidity: function withdrawBond(uint256 _amount) returns() +func (_ProverSet *ProverSetSession) WithdrawBond(_amount *big.Int) (*types.Transaction, error) { + return _ProverSet.Contract.WithdrawBond(&_ProverSet.TransactOpts, _amount) +} + +// WithdrawBond is a paid mutator transaction binding the contract method 0xc3daab96. +// +// Solidity: function withdrawBond(uint256 _amount) returns() +func (_ProverSet *ProverSetTransactorSession) WithdrawBond(_amount *big.Int) (*types.Transaction, error) { + return _ProverSet.Contract.WithdrawBond(&_ProverSet.TransactOpts, _amount) +} + +// WithdrawEtherToAdmin is a paid mutator transaction binding the contract method 0x7ddb9fec. +// +// Solidity: function withdrawEtherToAdmin(uint256 _amount) returns() +func (_ProverSet *ProverSetTransactor) WithdrawEtherToAdmin(opts *bind.TransactOpts, _amount *big.Int) (*types.Transaction, error) { + return _ProverSet.contract.Transact(opts, "withdrawEtherToAdmin", _amount) +} + +// WithdrawEtherToAdmin is a paid mutator transaction binding the contract method 0x7ddb9fec. +// +// Solidity: function withdrawEtherToAdmin(uint256 _amount) returns() +func (_ProverSet *ProverSetSession) WithdrawEtherToAdmin(_amount *big.Int) (*types.Transaction, error) { + return _ProverSet.Contract.WithdrawEtherToAdmin(&_ProverSet.TransactOpts, _amount) +} + +// WithdrawEtherToAdmin is a paid mutator transaction binding the contract method 0x7ddb9fec. +// +// Solidity: function withdrawEtherToAdmin(uint256 _amount) returns() +func (_ProverSet *ProverSetTransactorSession) WithdrawEtherToAdmin(_amount *big.Int) (*types.Transaction, error) { + return _ProverSet.Contract.WithdrawEtherToAdmin(&_ProverSet.TransactOpts, _amount) +} + // WithdrawToAdmin is a paid mutator transaction binding the contract method 0x8bd809fd. // // Solidity: function withdrawToAdmin(uint256 _amount) returns() @@ -835,27 +1003,6 @@ func (_ProverSet *ProverSetTransactorSession) WithdrawToAdmin(_amount *big.Int) return _ProverSet.Contract.WithdrawToAdmin(&_ProverSet.TransactOpts, _amount) } -// Receive is a paid mutator transaction binding the contract receive function. -// -// Solidity: receive() payable returns() -func (_ProverSet *ProverSetTransactor) Receive(opts *bind.TransactOpts) (*types.Transaction, error) { - return _ProverSet.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 (_ProverSet *ProverSetSession) Receive() (*types.Transaction, error) { - return _ProverSet.Contract.Receive(&_ProverSet.TransactOpts) -} - -// Receive is a paid mutator transaction binding the contract receive function. -// -// Solidity: receive() payable returns() -func (_ProverSet *ProverSetTransactorSession) Receive() (*types.Transaction, error) { - return _ProverSet.Contract.Receive(&_ProverSet.TransactOpts) -} - // ProverSetAdminChangedIterator is returned from FilterAdminChanged and is used to iterate over the raw logs and unpacked data for AdminChanged events raised by the ProverSet contract. type ProverSetAdminChangedIterator struct { Event *ProverSetAdminChanged // Event containing the contract specifics and raw log @@ -1135,159 +1282,6 @@ func (_ProverSet *ProverSetFilterer) ParseBeaconUpgraded(log types.Log) (*Prover return event, nil } -// ProverSetBlockProvenByIterator is returned from FilterBlockProvenBy and is used to iterate over the raw logs and unpacked data for BlockProvenBy events raised by the ProverSet contract. -type ProverSetBlockProvenByIterator struct { - Event *ProverSetBlockProvenBy // 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 *ProverSetBlockProvenByIterator) 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(ProverSetBlockProvenBy) - 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(ProverSetBlockProvenBy) - 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 *ProverSetBlockProvenByIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *ProverSetBlockProvenByIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// ProverSetBlockProvenBy represents a BlockProvenBy event raised by the ProverSet contract. -type ProverSetBlockProvenBy struct { - Prover common.Address - BlockId uint64 - Raw types.Log // Blockchain specific contextual infos -} - -// FilterBlockProvenBy is a free log retrieval operation binding the contract event 0x97c6d17699a8ef67a471a4e5025eb88ae673f626a5eb443e0539af38b4e56746. -// -// Solidity: event BlockProvenBy(address indexed prover, uint64 indexed blockId) -func (_ProverSet *ProverSetFilterer) FilterBlockProvenBy(opts *bind.FilterOpts, prover []common.Address, blockId []uint64) (*ProverSetBlockProvenByIterator, error) { - - var proverRule []interface{} - for _, proverItem := range prover { - proverRule = append(proverRule, proverItem) - } - var blockIdRule []interface{} - for _, blockIdItem := range blockId { - blockIdRule = append(blockIdRule, blockIdItem) - } - - logs, sub, err := _ProverSet.contract.FilterLogs(opts, "BlockProvenBy", proverRule, blockIdRule) - if err != nil { - return nil, err - } - return &ProverSetBlockProvenByIterator{contract: _ProverSet.contract, event: "BlockProvenBy", logs: logs, sub: sub}, nil -} - -// WatchBlockProvenBy is a free log subscription operation binding the contract event 0x97c6d17699a8ef67a471a4e5025eb88ae673f626a5eb443e0539af38b4e56746. -// -// Solidity: event BlockProvenBy(address indexed prover, uint64 indexed blockId) -func (_ProverSet *ProverSetFilterer) WatchBlockProvenBy(opts *bind.WatchOpts, sink chan<- *ProverSetBlockProvenBy, prover []common.Address, blockId []uint64) (event.Subscription, error) { - - var proverRule []interface{} - for _, proverItem := range prover { - proverRule = append(proverRule, proverItem) - } - var blockIdRule []interface{} - for _, blockIdItem := range blockId { - blockIdRule = append(blockIdRule, blockIdItem) - } - - logs, sub, err := _ProverSet.contract.WatchLogs(opts, "BlockProvenBy", proverRule, blockIdRule) - 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(ProverSetBlockProvenBy) - if err := _ProverSet.contract.UnpackLog(event, "BlockProvenBy", 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 -} - -// ParseBlockProvenBy is a log parse operation binding the contract event 0x97c6d17699a8ef67a471a4e5025eb88ae673f626a5eb443e0539af38b4e56746. -// -// Solidity: event BlockProvenBy(address indexed prover, uint64 indexed blockId) -func (_ProverSet *ProverSetFilterer) ParseBlockProvenBy(log types.Log) (*ProverSetBlockProvenBy, error) { - event := new(ProverSetBlockProvenBy) - if err := _ProverSet.contract.UnpackLog(event, "BlockProvenBy", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - // ProverSetInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the ProverSet contract. type ProverSetInitializedIterator struct { Event *ProverSetInitialized // Event containing the contract specifics and raw log diff --git a/packages/taiko-client/bindings/gen_sgx_verifier.go b/packages/taiko-client/bindings/gen_sgx_verifier.go index f8923ffefa9..a782f3a5269 100644 --- a/packages/taiko-client/bindings/gen_sgx_verifier.go +++ b/packages/taiko-client/bindings/gen_sgx_verifier.go @@ -88,7 +88,7 @@ type V3StructQEAuthData struct { // SgxVerifierMetaData contains all meta data concerning the SgxVerifier contract. var SgxVerifierMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"function\",\"name\":\"INSTANCE_EXPIRY\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"INSTANCE_VALIDITY_DELAY\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addInstances\",\"inputs\":[{\"name\":\"_instances\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addressManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"addressRegistered\",\"inputs\":[{\"name\":\"instanceAddress\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"alreadyAttested\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"deleteInstances\",\"inputs\":[{\"name\":\"_ids\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"impl\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"inNonReentrant\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"init\",\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_addressManager\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"instances\",\"inputs\":[{\"name\":\"instanceId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"validSince\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"nextInstanceId\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"registerInstance\",\"inputs\":[{\"name\":\"_attestation\",\"type\":\"tuple\",\"internalType\":\"structV3Struct.ParsedV3QuoteStruct\",\"components\":[{\"name\":\"header\",\"type\":\"tuple\",\"internalType\":\"structV3Struct.Header\",\"components\":[{\"name\":\"version\",\"type\":\"bytes2\",\"internalType\":\"bytes2\"},{\"name\":\"attestationKeyType\",\"type\":\"bytes2\",\"internalType\":\"bytes2\"},{\"name\":\"teeType\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"},{\"name\":\"qeSvn\",\"type\":\"bytes2\",\"internalType\":\"bytes2\"},{\"name\":\"pceSvn\",\"type\":\"bytes2\",\"internalType\":\"bytes2\"},{\"name\":\"qeVendorId\",\"type\":\"bytes16\",\"internalType\":\"bytes16\"},{\"name\":\"userData\",\"type\":\"bytes20\",\"internalType\":\"bytes20\"}]},{\"name\":\"localEnclaveReport\",\"type\":\"tuple\",\"internalType\":\"structV3Struct.EnclaveReport\",\"components\":[{\"name\":\"cpuSvn\",\"type\":\"bytes16\",\"internalType\":\"bytes16\"},{\"name\":\"miscSelect\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"},{\"name\":\"reserved1\",\"type\":\"bytes28\",\"internalType\":\"bytes28\"},{\"name\":\"attributes\",\"type\":\"bytes16\",\"internalType\":\"bytes16\"},{\"name\":\"mrEnclave\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"reserved2\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"mrSigner\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"reserved3\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"isvProdId\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"isvSvn\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"reserved4\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"reportData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"v3AuthData\",\"type\":\"tuple\",\"internalType\":\"structV3Struct.ECDSAQuoteV3AuthData\",\"components\":[{\"name\":\"ecdsa256BitSignature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"ecdsaAttestationKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"pckSignedQeReport\",\"type\":\"tuple\",\"internalType\":\"structV3Struct.EnclaveReport\",\"components\":[{\"name\":\"cpuSvn\",\"type\":\"bytes16\",\"internalType\":\"bytes16\"},{\"name\":\"miscSelect\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"},{\"name\":\"reserved1\",\"type\":\"bytes28\",\"internalType\":\"bytes28\"},{\"name\":\"attributes\",\"type\":\"bytes16\",\"internalType\":\"bytes16\"},{\"name\":\"mrEnclave\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"reserved2\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"mrSigner\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"reserved3\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"isvProdId\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"isvSvn\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"reserved4\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"reportData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"qeReportSignature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"qeAuthData\",\"type\":\"tuple\",\"internalType\":\"structV3Struct.QEAuthData\",\"components\":[{\"name\":\"parsedDataSize\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"certification\",\"type\":\"tuple\",\"internalType\":\"structV3Struct.CertificationData\",\"components\":[{\"name\":\"certType\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"certDataSize\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"decodedCertDataArray\",\"type\":\"bytes[3]\",\"internalType\":\"bytes[3]\"}]}]}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeTo\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"verifyProof\",\"inputs\":[{\"name\":\"_ctx\",\"type\":\"tuple\",\"internalType\":\"structIVerifier.Context\",\"components\":[{\"name\":\"metaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blobHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"prover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"isContesting\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"blobUsed\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"msgSender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"_tran\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.Transition\",\"components\":[{\"name\":\"parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"graffiti\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"_proof\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.TierProof\",\"components\":[{\"name\":\"tier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AdminChanged\",\"inputs\":[{\"name\":\"previousAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconUpgraded\",\"inputs\":[{\"name\":\"beacon\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InstanceAdded\",\"inputs\":[{\"name\":\"id\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"instance\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"replaced\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"validSince\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InstanceDeleted\",\"inputs\":[{\"name\":\"id\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"instance\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"FUNC_NOT_IMPLEMENTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"REENTRANT_CALL\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_INVALID_MANAGER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_UNEXPECTED_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_ZERO_ADDR\",\"inputs\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"SGX_ALREADY_ATTESTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SGX_INVALID_ATTESTATION\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SGX_INVALID_INSTANCE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SGX_INVALID_PROOF\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SGX_RA_NOT_SUPPORTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_ADDRESS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_VALUE\",\"inputs\":[]}]", + ABI: "[{\"type\":\"function\",\"name\":\"INSTANCE_EXPIRY\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"INSTANCE_VALIDITY_DELAY\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addInstances\",\"inputs\":[{\"name\":\"_instances\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addressManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"addressRegistered\",\"inputs\":[{\"name\":\"instanceAddress\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"alreadyAttested\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"deleteInstances\",\"inputs\":[{\"name\":\"_ids\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"impl\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"inNonReentrant\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"init\",\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_rollupAddressManager\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"instances\",\"inputs\":[{\"name\":\"instanceId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"validSince\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"nextInstanceId\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"registerInstance\",\"inputs\":[{\"name\":\"_attestation\",\"type\":\"tuple\",\"internalType\":\"structV3Struct.ParsedV3QuoteStruct\",\"components\":[{\"name\":\"header\",\"type\":\"tuple\",\"internalType\":\"structV3Struct.Header\",\"components\":[{\"name\":\"version\",\"type\":\"bytes2\",\"internalType\":\"bytes2\"},{\"name\":\"attestationKeyType\",\"type\":\"bytes2\",\"internalType\":\"bytes2\"},{\"name\":\"teeType\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"},{\"name\":\"qeSvn\",\"type\":\"bytes2\",\"internalType\":\"bytes2\"},{\"name\":\"pceSvn\",\"type\":\"bytes2\",\"internalType\":\"bytes2\"},{\"name\":\"qeVendorId\",\"type\":\"bytes16\",\"internalType\":\"bytes16\"},{\"name\":\"userData\",\"type\":\"bytes20\",\"internalType\":\"bytes20\"}]},{\"name\":\"localEnclaveReport\",\"type\":\"tuple\",\"internalType\":\"structV3Struct.EnclaveReport\",\"components\":[{\"name\":\"cpuSvn\",\"type\":\"bytes16\",\"internalType\":\"bytes16\"},{\"name\":\"miscSelect\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"},{\"name\":\"reserved1\",\"type\":\"bytes28\",\"internalType\":\"bytes28\"},{\"name\":\"attributes\",\"type\":\"bytes16\",\"internalType\":\"bytes16\"},{\"name\":\"mrEnclave\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"reserved2\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"mrSigner\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"reserved3\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"isvProdId\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"isvSvn\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"reserved4\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"reportData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"v3AuthData\",\"type\":\"tuple\",\"internalType\":\"structV3Struct.ECDSAQuoteV3AuthData\",\"components\":[{\"name\":\"ecdsa256BitSignature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"ecdsaAttestationKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"pckSignedQeReport\",\"type\":\"tuple\",\"internalType\":\"structV3Struct.EnclaveReport\",\"components\":[{\"name\":\"cpuSvn\",\"type\":\"bytes16\",\"internalType\":\"bytes16\"},{\"name\":\"miscSelect\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"},{\"name\":\"reserved1\",\"type\":\"bytes28\",\"internalType\":\"bytes28\"},{\"name\":\"attributes\",\"type\":\"bytes16\",\"internalType\":\"bytes16\"},{\"name\":\"mrEnclave\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"reserved2\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"mrSigner\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"reserved3\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"isvProdId\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"isvSvn\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"reserved4\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"reportData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"qeReportSignature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"qeAuthData\",\"type\":\"tuple\",\"internalType\":\"structV3Struct.QEAuthData\",\"components\":[{\"name\":\"parsedDataSize\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"certification\",\"type\":\"tuple\",\"internalType\":\"structV3Struct.CertificationData\",\"components\":[{\"name\":\"certType\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"certDataSize\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"decodedCertDataArray\",\"type\":\"bytes[3]\",\"internalType\":\"bytes[3]\"}]}]}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeTo\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"verifyBatchProof\",\"inputs\":[{\"name\":\"_ctxs\",\"type\":\"tuple[]\",\"internalType\":\"structIVerifier.ContextV2[]\",\"components\":[{\"name\":\"metaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blobHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"prover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"isContesting\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"blobUsed\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"msgSender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"tran\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.Transition\",\"components\":[{\"name\":\"parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"graffiti\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}]},{\"name\":\"_proof\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.TierProof\",\"components\":[{\"name\":\"tier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"verifyProof\",\"inputs\":[{\"name\":\"_ctx\",\"type\":\"tuple\",\"internalType\":\"structIVerifier.Context\",\"components\":[{\"name\":\"metaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blobHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"prover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"isContesting\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"blobUsed\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"msgSender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"_tran\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.Transition\",\"components\":[{\"name\":\"parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"graffiti\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"_proof\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.TierProof\",\"components\":[{\"name\":\"tier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AdminChanged\",\"inputs\":[{\"name\":\"previousAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconUpgraded\",\"inputs\":[{\"name\":\"beacon\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InstanceAdded\",\"inputs\":[{\"name\":\"id\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"instance\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"replaced\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"validSince\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InstanceDeleted\",\"inputs\":[{\"name\":\"id\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"instance\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"FUNC_NOT_IMPLEMENTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"REENTRANT_CALL\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_INVALID_MANAGER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_UNEXPECTED_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_ZERO_ADDR\",\"inputs\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"SGX_ALREADY_ATTESTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SGX_INVALID_ATTESTATION\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SGX_INVALID_INSTANCE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SGX_INVALID_PROOF\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SGX_RA_NOT_SUPPORTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_ADDRESS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_VALUE\",\"inputs\":[]}]", } // SgxVerifierABI is the input ABI used to generate the binding from. @@ -781,23 +781,23 @@ func (_SgxVerifier *SgxVerifierTransactorSession) DeleteInstances(_ids []*big.In // Init is a paid mutator transaction binding the contract method 0xf09a4016. // -// Solidity: function init(address _owner, address _addressManager) returns() -func (_SgxVerifier *SgxVerifierTransactor) Init(opts *bind.TransactOpts, _owner common.Address, _addressManager common.Address) (*types.Transaction, error) { - return _SgxVerifier.contract.Transact(opts, "init", _owner, _addressManager) +// Solidity: function init(address _owner, address _rollupAddressManager) returns() +func (_SgxVerifier *SgxVerifierTransactor) Init(opts *bind.TransactOpts, _owner common.Address, _rollupAddressManager common.Address) (*types.Transaction, error) { + return _SgxVerifier.contract.Transact(opts, "init", _owner, _rollupAddressManager) } // Init is a paid mutator transaction binding the contract method 0xf09a4016. // -// Solidity: function init(address _owner, address _addressManager) returns() -func (_SgxVerifier *SgxVerifierSession) Init(_owner common.Address, _addressManager common.Address) (*types.Transaction, error) { - return _SgxVerifier.Contract.Init(&_SgxVerifier.TransactOpts, _owner, _addressManager) +// Solidity: function init(address _owner, address _rollupAddressManager) returns() +func (_SgxVerifier *SgxVerifierSession) Init(_owner common.Address, _rollupAddressManager common.Address) (*types.Transaction, error) { + return _SgxVerifier.Contract.Init(&_SgxVerifier.TransactOpts, _owner, _rollupAddressManager) } // Init is a paid mutator transaction binding the contract method 0xf09a4016. // -// Solidity: function init(address _owner, address _addressManager) returns() -func (_SgxVerifier *SgxVerifierTransactorSession) Init(_owner common.Address, _addressManager common.Address) (*types.Transaction, error) { - return _SgxVerifier.Contract.Init(&_SgxVerifier.TransactOpts, _owner, _addressManager) +// Solidity: function init(address _owner, address _rollupAddressManager) returns() +func (_SgxVerifier *SgxVerifierTransactorSession) Init(_owner common.Address, _rollupAddressManager common.Address) (*types.Transaction, error) { + return _SgxVerifier.Contract.Init(&_SgxVerifier.TransactOpts, _owner, _rollupAddressManager) } // Pause is a paid mutator transaction binding the contract method 0x8456cb59. @@ -947,6 +947,27 @@ func (_SgxVerifier *SgxVerifierTransactorSession) UpgradeToAndCall(newImplementa return _SgxVerifier.Contract.UpgradeToAndCall(&_SgxVerifier.TransactOpts, newImplementation, data) } +// VerifyBatchProof is a paid mutator transaction binding the contract method 0x7103b6da. +// +// Solidity: function verifyBatchProof((bytes32,bytes32,address,uint64,bool,bool,address,(bytes32,bytes32,bytes32,bytes32))[] _ctxs, (uint16,bytes) _proof) returns() +func (_SgxVerifier *SgxVerifierTransactor) VerifyBatchProof(opts *bind.TransactOpts, _ctxs []IVerifierContextV2, _proof TaikoDataTierProof) (*types.Transaction, error) { + return _SgxVerifier.contract.Transact(opts, "verifyBatchProof", _ctxs, _proof) +} + +// VerifyBatchProof is a paid mutator transaction binding the contract method 0x7103b6da. +// +// Solidity: function verifyBatchProof((bytes32,bytes32,address,uint64,bool,bool,address,(bytes32,bytes32,bytes32,bytes32))[] _ctxs, (uint16,bytes) _proof) returns() +func (_SgxVerifier *SgxVerifierSession) VerifyBatchProof(_ctxs []IVerifierContextV2, _proof TaikoDataTierProof) (*types.Transaction, error) { + return _SgxVerifier.Contract.VerifyBatchProof(&_SgxVerifier.TransactOpts, _ctxs, _proof) +} + +// VerifyBatchProof is a paid mutator transaction binding the contract method 0x7103b6da. +// +// Solidity: function verifyBatchProof((bytes32,bytes32,address,uint64,bool,bool,address,(bytes32,bytes32,bytes32,bytes32))[] _ctxs, (uint16,bytes) _proof) returns() +func (_SgxVerifier *SgxVerifierTransactorSession) VerifyBatchProof(_ctxs []IVerifierContextV2, _proof TaikoDataTierProof) (*types.Transaction, error) { + return _SgxVerifier.Contract.VerifyBatchProof(&_SgxVerifier.TransactOpts, _ctxs, _proof) +} + // VerifyProof is a paid mutator transaction binding the contract method 0x21e89968. // // Solidity: function verifyProof((bytes32,bytes32,address,uint64,bool,bool,address) _ctx, (bytes32,bytes32,bytes32,bytes32) _tran, (uint16,bytes) _proof) returns() diff --git a/packages/taiko-client/bindings/gen_taiko_l1.go b/packages/taiko-client/bindings/gen_taiko_l1.go index 96d1bf12ceb..6c18d3621ea 100644 --- a/packages/taiko-client/bindings/gen_taiko_l1.go +++ b/packages/taiko-client/bindings/gen_taiko_l1.go @@ -29,6 +29,15 @@ var ( _ = abi.ConvertType ) +// LibSharedDataBaseFeeConfig is an auto generated low-level Go binding around an user-defined struct. +type LibSharedDataBaseFeeConfig struct { + AdjustmentQuotient uint8 + SharingPctg uint8 + GasIssuancePerSecond uint32 + MinGasExcess uint64 + MaxGasIssuancePerBlock uint32 +} + // TaikoDataBlock is an auto generated low-level Go binding around an user-defined struct. type TaikoDataBlock struct { MetaHash [32]byte @@ -59,15 +68,55 @@ type TaikoDataBlockMetadata struct { Sender common.Address } +// TaikoDataBlockMetadataV2 is an auto generated low-level Go binding around an user-defined struct. +type TaikoDataBlockMetadataV2 struct { + AnchorBlockHash [32]byte + Difficulty [32]byte + BlobHash [32]byte + ExtraData [32]byte + Coinbase common.Address + Id uint64 + GasLimit uint32 + Timestamp uint64 + AnchorBlockId uint64 + MinTier uint16 + BlobUsed bool + ParentMetaHash [32]byte + Proposer common.Address + LivenessBond *big.Int + ProposedAt uint64 + ProposedIn uint64 + BlobTxListOffset uint32 + BlobTxListLength uint32 + BlobIndex uint8 + BaseFeeConfig LibSharedDataBaseFeeConfig +} + +// TaikoDataBlockV2 is an auto generated low-level Go binding around an user-defined struct. +type TaikoDataBlockV2 struct { + MetaHash [32]byte + AssignedProver common.Address + LivenessBond *big.Int + BlockId uint64 + ProposedAt uint64 + ProposedIn uint64 + NextTransitionId *big.Int + LivenessBondReturned bool + VerifiedTransitionId *big.Int +} + // TaikoDataConfig is an auto generated low-level Go binding around an user-defined struct. type TaikoDataConfig struct { - ChainId uint64 - BlockMaxProposals uint64 - BlockRingBufferSize uint64 - MaxBlocksToVerifyPerProposal uint64 - BlockMaxGasLimit uint32 - LivenessBond *big.Int - BlockSyncThreshold uint8 + ChainId uint64 + BlockMaxProposals uint64 + BlockRingBufferSize uint64 + MaxBlocksToVerify uint64 + BlockMaxGasLimit uint32 + LivenessBond *big.Int + StateRootSyncInternal uint8 + MaxAnchorHeightOffset uint64 + BaseFeeConfig LibSharedDataBaseFeeConfig + OntakeForkHeight uint64 } // TaikoDataEthDeposit is an auto generated low-level Go binding around an user-defined struct. @@ -87,6 +136,14 @@ type TaikoDataSlotA struct { // TaikoDataSlotB is an auto generated low-level Go binding around an user-defined struct. type TaikoDataSlotB struct { + NumBlocks uint64 + LastVerifiedBlockId uint64 + ProvingPaused bool + LastProposedIn *big.Int + LastUnpausedAt uint64 +} + +type TaikoDataSlotBV1 struct { NumBlocks uint64 LastVerifiedBlockId uint64 ProvingPaused bool @@ -120,7 +177,7 @@ type TaikoDataTransitionState struct { // TaikoL1ClientMetaData contains all meta data concerning the TaikoL1Client contract. var TaikoL1ClientMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"receive\",\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addressManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getBlock\",\"inputs\":[{\"name\":\"_blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"blk_\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.Block\",\"components\":[{\"name\":\"metaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"assignedProver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"livenessBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"proposedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"proposedIn\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nextTransitionId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"verifiedTransitionId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getConfig\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.Config\",\"components\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blockMaxProposals\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blockRingBufferSize\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxBlocksToVerifyPerProposal\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blockMaxGasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"livenessBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"blockSyncThreshold\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStateVariables\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.SlotA\",\"components\":[{\"name\":\"genesisHeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"genesisTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastSyncedBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastSynecdAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.SlotB\",\"components\":[{\"name\":\"numBlocks\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastVerifiedBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"provingPaused\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"__reservedB1\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"__reservedB2\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"__reservedB3\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"lastUnpausedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getTransition\",\"inputs\":[{\"name\":\"_blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_tid\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.TransitionState\",\"components\":[{\"name\":\"key\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"prover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"validityBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"contester\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"contestBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"tier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"__reserved1\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getTransition\",\"inputs\":[{\"name\":\"_blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.TransitionState\",\"components\":[{\"name\":\"key\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"prover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"validityBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"contester\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"contestBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"tier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"__reserved1\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"impl\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"inNonReentrant\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"init\",\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_addressManager\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_genesisBlockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_toPause\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"init2\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseProving\",\"inputs\":[{\"name\":\"_pause\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proposeBlock\",\"inputs\":[{\"name\":\"_params\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"_txList\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"meta_\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.BlockMetadata\",\"components\":[{\"name\":\"l1Hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"difficulty\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blobHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"extraData\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"depositsHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"coinbase\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"l1Height\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minTier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"blobUsed\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"parentMetaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"deposits_\",\"type\":\"tuple[]\",\"internalType\":\"structTaikoData.EthDeposit[]\",\"components\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"proveBlock\",\"inputs\":[{\"name\":\"_blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_input\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resetGenesisHash\",\"inputs\":[{\"name\":\"_genesisBlockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"slotA\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.SlotA\",\"components\":[{\"name\":\"genesisHeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"genesisTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastSyncedBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastSynecdAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"slotB\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.SlotB\",\"components\":[{\"name\":\"numBlocks\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastVerifiedBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"provingPaused\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"__reservedB1\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"__reservedB2\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"__reservedB3\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"lastUnpausedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"state\",\"inputs\":[],\"outputs\":[{\"name\":\"__reserve1\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"slotA\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.SlotA\",\"components\":[{\"name\":\"genesisHeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"genesisTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastSyncedBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastSynecdAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"name\":\"slotB\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.SlotB\",\"components\":[{\"name\":\"numBlocks\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastVerifiedBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"provingPaused\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"__reservedB1\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"__reservedB2\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"__reservedB3\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"lastUnpausedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeTo\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"verifyBlocks\",\"inputs\":[{\"name\":\"_maxBlocksToVerify\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AdminChanged\",\"inputs\":[{\"name\":\"previousAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconUpgraded\",\"inputs\":[{\"name\":\"beacon\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BlockProposed\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"assignedProver\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"livenessBond\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"meta\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.BlockMetadata\",\"components\":[{\"name\":\"l1Hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"difficulty\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blobHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"extraData\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"depositsHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"coinbase\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"l1Height\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minTier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"blobUsed\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"parentMetaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"depositsProcessed\",\"type\":\"tuple[]\",\"indexed\":false,\"internalType\":\"structTaikoData.EthDeposit[]\",\"components\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BlockProposed\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"assignedProver\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"livenessBond\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"meta\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.BlockMetadata\",\"components\":[{\"name\":\"l1Hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"difficulty\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blobHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"extraData\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"depositsHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"coinbase\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"l1Height\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minTier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"blobUsed\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"parentMetaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"depositsProcessed\",\"type\":\"tuple[]\",\"indexed\":false,\"internalType\":\"structTaikoData.EthDeposit[]\",\"components\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BlockVerified\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"prover\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BlockVerified\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"prover\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ProvingPaused\",\"inputs\":[{\"name\":\"paused\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ProvingPaused\",\"inputs\":[{\"name\":\"paused\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StateVariablesUpdated\",\"inputs\":[{\"name\":\"slotB\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.SlotB\",\"components\":[{\"name\":\"numBlocks\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastVerifiedBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"provingPaused\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"__reservedB1\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"__reservedB2\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"__reservedB3\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"lastUnpausedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StateVariablesUpdated\",\"inputs\":[{\"name\":\"slotB\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.SlotB\",\"components\":[{\"name\":\"numBlocks\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastVerifiedBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"provingPaused\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"__reservedB1\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"__reservedB2\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"__reservedB3\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"lastUnpausedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TransitionContested\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"tran\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.Transition\",\"components\":[{\"name\":\"parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"graffiti\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"contester\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"contestBond\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TransitionContested\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"tran\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.Transition\",\"components\":[{\"name\":\"parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"graffiti\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"contester\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"contestBond\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TransitionProved\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"tran\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.Transition\",\"components\":[{\"name\":\"parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"graffiti\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"prover\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"validityBond\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TransitionProved\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"tran\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.Transition\",\"components\":[{\"name\":\"parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"graffiti\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"prover\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"validityBond\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"ETH_TRANSFER_FAILED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FUNC_NOT_IMPLEMENTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_ALREADY_CONTESTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_ALREADY_CONTESTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_ALREADY_PROVED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_ALREADY_PROVED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOB_NOT_AVAILABLE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOB_NOT_AVAILABLE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOB_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOB_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOCK_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOCK_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOCK_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_CANNOT_CONTEST\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_CANNOT_CONTEST\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_BLOCK_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_BLOCK_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_BLOCK_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_CONFIG\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_CONFIG\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_GENESIS_HASH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_GENESIS_HASH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_HOOK\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_HOOK\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_PARAM\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_PROVER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_PROVER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_SIG\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_SIG\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_TIER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_TIER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_TRANSITION\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_TRANSITION\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_LIVENESS_BOND_NOT_RECEIVED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_LIVENESS_BOND_NOT_RECEIVED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_NOT_ASSIGNED_PROVER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_NOT_ASSIGNED_PROVER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_PROVING_PAUSED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_RECEIVE_DISABLED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TOO_LATE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TOO_LATE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TOO_MANY_BLOCKS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TOO_MANY_BLOCKS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TRANSITION_ID_ZERO\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TRANSITION_ID_ZERO\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TRANSITION_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TRANSITION_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNAUTHORIZED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNAUTHORIZED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNEXPECTED_PARENT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNEXPECTED_PARENT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNEXPECTED_TRANSITION_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNEXPECTED_TRANSITION_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"REENTRANT_CALL\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_INVALID_MANAGER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_UNEXPECTED_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_ZERO_ADDR\",\"inputs\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ZERO_ADDRESS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_VALUE\",\"inputs\":[]}]", + ABI: "[{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addressManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"bondBalanceOf\",\"inputs\":[{\"name\":\"_user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"depositBond\",\"inputs\":[{\"name\":\"_amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"getBlock\",\"inputs\":[{\"name\":\"_blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"blk_\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.Block\",\"components\":[{\"name\":\"metaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"assignedProver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"livenessBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"proposedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"proposedIn\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nextTransitionId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"verifiedTransitionId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getBlockV2\",\"inputs\":[{\"name\":\"_blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"blk_\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.BlockV2\",\"components\":[{\"name\":\"metaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"assignedProver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"livenessBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"proposedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"proposedIn\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nextTransitionId\",\"type\":\"uint24\",\"internalType\":\"uint24\"},{\"name\":\"livenessBondReturned\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"verifiedTransitionId\",\"type\":\"uint24\",\"internalType\":\"uint24\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getConfig\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.Config\",\"components\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blockMaxProposals\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blockRingBufferSize\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxBlocksToVerify\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blockMaxGasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"livenessBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"stateRootSyncInternal\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"maxAnchorHeightOffset\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"baseFeeConfig\",\"type\":\"tuple\",\"internalType\":\"structLibSharedData.BaseFeeConfig\",\"components\":[{\"name\":\"adjustmentQuotient\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"sharingPctg\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"gasIssuancePerSecond\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"minGasExcess\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxGasIssuancePerBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"ontakeForkHeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"getLastSyncedBlock\",\"inputs\":[],\"outputs\":[{\"name\":\"blockId_\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blockHash_\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot_\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"verifiedAt_\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getLastVerifiedBlock\",\"inputs\":[],\"outputs\":[{\"name\":\"blockId_\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blockHash_\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot_\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"verifiedAt_\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStateVariables\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.SlotA\",\"components\":[{\"name\":\"genesisHeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"genesisTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastSyncedBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastSynecdAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.SlotB\",\"components\":[{\"name\":\"numBlocks\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastVerifiedBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"provingPaused\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"lastProposedIn\",\"type\":\"uint56\",\"internalType\":\"uint56\"},{\"name\":\"lastUnpausedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getTransition\",\"inputs\":[{\"name\":\"_blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_tid\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.TransitionState\",\"components\":[{\"name\":\"key\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"prover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"validityBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"contester\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"contestBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"tier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"__reserved1\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getTransition\",\"inputs\":[{\"name\":\"_blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.TransitionState\",\"components\":[{\"name\":\"key\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"prover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"validityBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"contester\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"contestBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"tier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"__reserved1\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getTransitions\",\"inputs\":[{\"name\":\"_blockIds\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"},{\"name\":\"_parentHashes\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structTaikoData.TransitionState[]\",\"components\":[{\"name\":\"key\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"prover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"validityBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"contester\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"contestBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"tier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"__reserved1\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getVerifiedBlockProver\",\"inputs\":[{\"name\":\"_blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"prover_\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"impl\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"inNonReentrant\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"init\",\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_rollupAddressManager\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_genesisBlockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_toPause\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"init2\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"init3\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"lastProposedIn\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint56\",\"internalType\":\"uint56\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseProving\",\"inputs\":[{\"name\":\"_pause\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proposeBlockV2\",\"inputs\":[{\"name\":\"_params\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"_txList\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"meta_\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.BlockMetadataV2\",\"components\":[{\"name\":\"anchorBlockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"difficulty\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blobHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"extraData\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"coinbase\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"anchorBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minTier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"blobUsed\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"parentMetaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proposer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"livenessBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"proposedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"proposedIn\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blobTxListOffset\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"blobTxListLength\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"blobIndex\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"baseFeeConfig\",\"type\":\"tuple\",\"internalType\":\"structLibSharedData.BaseFeeConfig\",\"components\":[{\"name\":\"adjustmentQuotient\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"sharingPctg\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"gasIssuancePerSecond\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"minGasExcess\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxGasIssuancePerBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}]}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"proposeBlocksV2\",\"inputs\":[{\"name\":\"_paramsArr\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"_txListArr\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"}],\"outputs\":[{\"name\":\"metaArr_\",\"type\":\"tuple[]\",\"internalType\":\"structTaikoData.BlockMetadataV2[]\",\"components\":[{\"name\":\"anchorBlockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"difficulty\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blobHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"extraData\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"coinbase\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"anchorBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minTier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"blobUsed\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"parentMetaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proposer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"livenessBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"proposedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"proposedIn\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blobTxListOffset\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"blobTxListLength\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"blobIndex\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"baseFeeConfig\",\"type\":\"tuple\",\"internalType\":\"structLibSharedData.BaseFeeConfig\",\"components\":[{\"name\":\"adjustmentQuotient\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"sharingPctg\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"gasIssuancePerSecond\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"minGasExcess\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxGasIssuancePerBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}]}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"proveBlock\",\"inputs\":[{\"name\":\"_blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_input\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"proveBlocks\",\"inputs\":[{\"name\":\"_blockIds\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"},{\"name\":\"_inputs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"_batchProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"state\",\"inputs\":[],\"outputs\":[{\"name\":\"__reserve1\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"slotA\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.SlotA\",\"components\":[{\"name\":\"genesisHeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"genesisTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastSyncedBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastSynecdAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"name\":\"slotB\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.SlotB\",\"components\":[{\"name\":\"numBlocks\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastVerifiedBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"provingPaused\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"lastProposedIn\",\"type\":\"uint56\",\"internalType\":\"uint56\"},{\"name\":\"lastUnpausedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeTo\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"verifyBlocks\",\"inputs\":[{\"name\":\"_maxBlocksToVerify\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawBond\",\"inputs\":[{\"name\":\"_amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AdminChanged\",\"inputs\":[{\"name\":\"previousAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconUpgraded\",\"inputs\":[{\"name\":\"beacon\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BlockProposed\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"assignedProver\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"livenessBond\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"meta\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.BlockMetadata\",\"components\":[{\"name\":\"l1Hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"difficulty\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blobHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"extraData\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"depositsHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"coinbase\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"l1Height\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minTier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"blobUsed\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"parentMetaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"depositsProcessed\",\"type\":\"tuple[]\",\"indexed\":false,\"internalType\":\"structTaikoData.EthDeposit[]\",\"components\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BlockProposedV2\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"meta\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.BlockMetadataV2\",\"components\":[{\"name\":\"anchorBlockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"difficulty\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blobHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"extraData\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"coinbase\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"anchorBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minTier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"blobUsed\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"parentMetaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proposer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"livenessBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"proposedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"proposedIn\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blobTxListOffset\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"blobTxListLength\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"blobIndex\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"baseFeeConfig\",\"type\":\"tuple\",\"internalType\":\"structLibSharedData.BaseFeeConfig\",\"components\":[{\"name\":\"adjustmentQuotient\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"sharingPctg\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"gasIssuancePerSecond\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"minGasExcess\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxGasIssuancePerBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BlockProposedV2\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"meta\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.BlockMetadataV2\",\"components\":[{\"name\":\"anchorBlockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"difficulty\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blobHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"extraData\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"coinbase\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"anchorBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minTier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"blobUsed\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"parentMetaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proposer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"livenessBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"proposedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"proposedIn\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blobTxListOffset\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"blobTxListLength\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"blobIndex\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"baseFeeConfig\",\"type\":\"tuple\",\"internalType\":\"structLibSharedData.BaseFeeConfig\",\"components\":[{\"name\":\"adjustmentQuotient\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"sharingPctg\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"gasIssuancePerSecond\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"minGasExcess\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxGasIssuancePerBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BlockVerified\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"prover\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BlockVerifiedV2\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"prover\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BlockVerifiedV2\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"prover\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BondCredited\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BondCredited\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BondDebited\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BondDebited\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BondDeposited\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BondDeposited\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BondWithdrawn\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"CalldataTxList\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"txList\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"CalldataTxList\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"txList\",\"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\":\"OwnershipTransferStarted\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ProvingPaused\",\"inputs\":[{\"name\":\"paused\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StateVariablesUpdated\",\"inputs\":[{\"name\":\"slotB\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.SlotB\",\"components\":[{\"name\":\"numBlocks\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastVerifiedBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"provingPaused\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"lastProposedIn\",\"type\":\"uint56\",\"internalType\":\"uint56\"},{\"name\":\"lastUnpausedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TransitionContested\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"tran\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.Transition\",\"components\":[{\"name\":\"parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"graffiti\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"contester\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"contestBond\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TransitionContestedV2\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"tran\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.Transition\",\"components\":[{\"name\":\"parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"graffiti\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"contester\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"contestBond\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"proposedIn\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TransitionProved\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"tran\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.Transition\",\"components\":[{\"name\":\"parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"graffiti\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"prover\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"validityBond\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TransitionProvedV2\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"tran\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.Transition\",\"components\":[{\"name\":\"parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"graffiti\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"prover\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"validityBond\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"proposedIn\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"FUNC_NOT_IMPLEMENTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOB_NOT_AVAILABLE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOB_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOCK_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_ETH_NOT_PAID_AS_BOND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_FORK_HEIGHT_ERROR\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_FORK_HEIGHT_ERROR\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_ANCHOR_BLOCK\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_BLOCK_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_CUSTOM_PROPOSER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_MSG_VALUE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_PARAMS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_PROPOSER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_TIMESTAMP\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_PROVING_PAUSED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TOO_MANY_BLOCKS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TRANSITION_ID_ZERO\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TRANSITION_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNEXPECTED_PARENT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNEXPECTED_TRANSITION_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"REENTRANT_CALL\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_INVALID_MANAGER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_UNEXPECTED_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_ZERO_ADDR\",\"inputs\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ZERO_ADDRESS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_VALUE\",\"inputs\":[]}]", } // TaikoL1ClientABI is the input ABI used to generate the binding from. @@ -300,6 +357,37 @@ func (_TaikoL1Client *TaikoL1ClientCallerSession) AddressManager() (common.Addre return _TaikoL1Client.Contract.AddressManager(&_TaikoL1Client.CallOpts) } +// BondBalanceOf is a free data retrieval call binding the contract method 0xa9c2c835. +// +// Solidity: function bondBalanceOf(address _user) view returns(uint256) +func (_TaikoL1Client *TaikoL1ClientCaller) BondBalanceOf(opts *bind.CallOpts, _user common.Address) (*big.Int, error) { + var out []interface{} + err := _TaikoL1Client.contract.Call(opts, &out, "bondBalanceOf", _user) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// BondBalanceOf is a free data retrieval call binding the contract method 0xa9c2c835. +// +// Solidity: function bondBalanceOf(address _user) view returns(uint256) +func (_TaikoL1Client *TaikoL1ClientSession) BondBalanceOf(_user common.Address) (*big.Int, error) { + return _TaikoL1Client.Contract.BondBalanceOf(&_TaikoL1Client.CallOpts, _user) +} + +// BondBalanceOf is a free data retrieval call binding the contract method 0xa9c2c835. +// +// Solidity: function bondBalanceOf(address _user) view returns(uint256) +func (_TaikoL1Client *TaikoL1ClientCallerSession) BondBalanceOf(_user common.Address) (*big.Int, error) { + return _TaikoL1Client.Contract.BondBalanceOf(&_TaikoL1Client.CallOpts, _user) +} + // GetBlock is a free data retrieval call binding the contract method 0x5fa15e79. // // Solidity: function getBlock(uint64 _blockId) view returns((bytes32,address,uint96,uint64,uint64,uint64,uint32,uint32) blk_) @@ -331,9 +419,40 @@ func (_TaikoL1Client *TaikoL1ClientCallerSession) GetBlock(_blockId uint64) (Tai return _TaikoL1Client.Contract.GetBlock(&_TaikoL1Client.CallOpts, _blockId) } +// GetBlockV2 is a free data retrieval call binding the contract method 0x3f0c544a. +// +// Solidity: function getBlockV2(uint64 _blockId) view returns((bytes32,address,uint96,uint64,uint64,uint64,uint24,bool,uint24) blk_) +func (_TaikoL1Client *TaikoL1ClientCaller) GetBlockV2(opts *bind.CallOpts, _blockId uint64) (TaikoDataBlockV2, error) { + var out []interface{} + err := _TaikoL1Client.contract.Call(opts, &out, "getBlockV2", _blockId) + + if err != nil { + return *new(TaikoDataBlockV2), err + } + + out0 := *abi.ConvertType(out[0], new(TaikoDataBlockV2)).(*TaikoDataBlockV2) + + return out0, err + +} + +// GetBlockV2 is a free data retrieval call binding the contract method 0x3f0c544a. +// +// Solidity: function getBlockV2(uint64 _blockId) view returns((bytes32,address,uint96,uint64,uint64,uint64,uint24,bool,uint24) blk_) +func (_TaikoL1Client *TaikoL1ClientSession) GetBlockV2(_blockId uint64) (TaikoDataBlockV2, error) { + return _TaikoL1Client.Contract.GetBlockV2(&_TaikoL1Client.CallOpts, _blockId) +} + +// GetBlockV2 is a free data retrieval call binding the contract method 0x3f0c544a. +// +// Solidity: function getBlockV2(uint64 _blockId) view returns((bytes32,address,uint96,uint64,uint64,uint64,uint24,bool,uint24) blk_) +func (_TaikoL1Client *TaikoL1ClientCallerSession) GetBlockV2(_blockId uint64) (TaikoDataBlockV2, error) { + return _TaikoL1Client.Contract.GetBlockV2(&_TaikoL1Client.CallOpts, _blockId) +} + // GetConfig is a free data retrieval call binding the contract method 0xc3f909d4. // -// Solidity: function getConfig() view returns((uint64,uint64,uint64,uint64,uint32,uint96,uint8)) +// Solidity: function getConfig() pure returns((uint64,uint64,uint64,uint64,uint32,uint96,uint8,uint64,(uint8,uint8,uint32,uint64,uint32),uint64)) func (_TaikoL1Client *TaikoL1ClientCaller) GetConfig(opts *bind.CallOpts) (TaikoDataConfig, error) { var out []interface{} err := _TaikoL1Client.contract.Call(opts, &out, "getConfig") @@ -350,21 +469,131 @@ func (_TaikoL1Client *TaikoL1ClientCaller) GetConfig(opts *bind.CallOpts) (Taiko // GetConfig is a free data retrieval call binding the contract method 0xc3f909d4. // -// Solidity: function getConfig() view returns((uint64,uint64,uint64,uint64,uint32,uint96,uint8)) +// Solidity: function getConfig() pure returns((uint64,uint64,uint64,uint64,uint32,uint96,uint8,uint64,(uint8,uint8,uint32,uint64,uint32),uint64)) func (_TaikoL1Client *TaikoL1ClientSession) GetConfig() (TaikoDataConfig, error) { return _TaikoL1Client.Contract.GetConfig(&_TaikoL1Client.CallOpts) } // GetConfig is a free data retrieval call binding the contract method 0xc3f909d4. // -// Solidity: function getConfig() view returns((uint64,uint64,uint64,uint64,uint32,uint96,uint8)) +// Solidity: function getConfig() pure returns((uint64,uint64,uint64,uint64,uint32,uint96,uint8,uint64,(uint8,uint8,uint32,uint64,uint32),uint64)) func (_TaikoL1Client *TaikoL1ClientCallerSession) GetConfig() (TaikoDataConfig, error) { return _TaikoL1Client.Contract.GetConfig(&_TaikoL1Client.CallOpts) } +// GetLastSyncedBlock is a free data retrieval call binding the contract method 0x9413caa9. +// +// Solidity: function getLastSyncedBlock() view returns(uint64 blockId_, bytes32 blockHash_, bytes32 stateRoot_, uint64 verifiedAt_) +func (_TaikoL1Client *TaikoL1ClientCaller) GetLastSyncedBlock(opts *bind.CallOpts) (struct { + BlockId uint64 + BlockHash [32]byte + StateRoot [32]byte + VerifiedAt uint64 +}, error) { + var out []interface{} + err := _TaikoL1Client.contract.Call(opts, &out, "getLastSyncedBlock") + + outstruct := new(struct { + BlockId uint64 + BlockHash [32]byte + StateRoot [32]byte + VerifiedAt uint64 + }) + if err != nil { + return *outstruct, err + } + + outstruct.BlockId = *abi.ConvertType(out[0], new(uint64)).(*uint64) + outstruct.BlockHash = *abi.ConvertType(out[1], new([32]byte)).(*[32]byte) + outstruct.StateRoot = *abi.ConvertType(out[2], new([32]byte)).(*[32]byte) + outstruct.VerifiedAt = *abi.ConvertType(out[3], new(uint64)).(*uint64) + + return *outstruct, err + +} + +// GetLastSyncedBlock is a free data retrieval call binding the contract method 0x9413caa9. +// +// Solidity: function getLastSyncedBlock() view returns(uint64 blockId_, bytes32 blockHash_, bytes32 stateRoot_, uint64 verifiedAt_) +func (_TaikoL1Client *TaikoL1ClientSession) GetLastSyncedBlock() (struct { + BlockId uint64 + BlockHash [32]byte + StateRoot [32]byte + VerifiedAt uint64 +}, error) { + return _TaikoL1Client.Contract.GetLastSyncedBlock(&_TaikoL1Client.CallOpts) +} + +// GetLastSyncedBlock is a free data retrieval call binding the contract method 0x9413caa9. +// +// Solidity: function getLastSyncedBlock() view returns(uint64 blockId_, bytes32 blockHash_, bytes32 stateRoot_, uint64 verifiedAt_) +func (_TaikoL1Client *TaikoL1ClientCallerSession) GetLastSyncedBlock() (struct { + BlockId uint64 + BlockHash [32]byte + StateRoot [32]byte + VerifiedAt uint64 +}, error) { + return _TaikoL1Client.Contract.GetLastSyncedBlock(&_TaikoL1Client.CallOpts) +} + +// GetLastVerifiedBlock is a free data retrieval call binding the contract method 0x26af7986. +// +// Solidity: function getLastVerifiedBlock() view returns(uint64 blockId_, bytes32 blockHash_, bytes32 stateRoot_, uint64 verifiedAt_) +func (_TaikoL1Client *TaikoL1ClientCaller) GetLastVerifiedBlock(opts *bind.CallOpts) (struct { + BlockId uint64 + BlockHash [32]byte + StateRoot [32]byte + VerifiedAt uint64 +}, error) { + var out []interface{} + err := _TaikoL1Client.contract.Call(opts, &out, "getLastVerifiedBlock") + + outstruct := new(struct { + BlockId uint64 + BlockHash [32]byte + StateRoot [32]byte + VerifiedAt uint64 + }) + if err != nil { + return *outstruct, err + } + + outstruct.BlockId = *abi.ConvertType(out[0], new(uint64)).(*uint64) + outstruct.BlockHash = *abi.ConvertType(out[1], new([32]byte)).(*[32]byte) + outstruct.StateRoot = *abi.ConvertType(out[2], new([32]byte)).(*[32]byte) + outstruct.VerifiedAt = *abi.ConvertType(out[3], new(uint64)).(*uint64) + + return *outstruct, err + +} + +// GetLastVerifiedBlock is a free data retrieval call binding the contract method 0x26af7986. +// +// Solidity: function getLastVerifiedBlock() view returns(uint64 blockId_, bytes32 blockHash_, bytes32 stateRoot_, uint64 verifiedAt_) +func (_TaikoL1Client *TaikoL1ClientSession) GetLastVerifiedBlock() (struct { + BlockId uint64 + BlockHash [32]byte + StateRoot [32]byte + VerifiedAt uint64 +}, error) { + return _TaikoL1Client.Contract.GetLastVerifiedBlock(&_TaikoL1Client.CallOpts) +} + +// GetLastVerifiedBlock is a free data retrieval call binding the contract method 0x26af7986. +// +// Solidity: function getLastVerifiedBlock() view returns(uint64 blockId_, bytes32 blockHash_, bytes32 stateRoot_, uint64 verifiedAt_) +func (_TaikoL1Client *TaikoL1ClientCallerSession) GetLastVerifiedBlock() (struct { + BlockId uint64 + BlockHash [32]byte + StateRoot [32]byte + VerifiedAt uint64 +}, error) { + return _TaikoL1Client.Contract.GetLastVerifiedBlock(&_TaikoL1Client.CallOpts) +} + // GetStateVariables is a free data retrieval call binding the contract method 0xdde89cf5. // -// Solidity: function getStateVariables() view returns((uint64,uint64,uint64,uint64), (uint64,uint64,bool,uint8,uint16,uint32,uint64)) +// Solidity: function getStateVariables() view returns((uint64,uint64,uint64,uint64), (uint64,uint64,bool,uint56,uint64)) func (_TaikoL1Client *TaikoL1ClientCaller) GetStateVariables(opts *bind.CallOpts) (TaikoDataSlotA, TaikoDataSlotB, error) { var out []interface{} err := _TaikoL1Client.contract.Call(opts, &out, "getStateVariables") @@ -380,16 +609,31 @@ func (_TaikoL1Client *TaikoL1ClientCaller) GetStateVariables(opts *bind.CallOpts } +func (_TaikoL1Client *TaikoL1ClientCaller) GetStateVariablesV1(opts *bind.CallOpts) (TaikoDataSlotA, TaikoDataSlotBV1, error) { + var out []interface{} + err := _TaikoL1Client.contract.Call(opts, &out, "getStateVariables") + + if err != nil { + return *new(TaikoDataSlotA), *new(TaikoDataSlotBV1), err + } + + out0 := *abi.ConvertType(out[0], new(TaikoDataSlotA)).(*TaikoDataSlotA) + out1 := *abi.ConvertType(out[1], new(TaikoDataSlotB)).(*TaikoDataSlotBV1) + + return out0, out1, err + +} + // GetStateVariables is a free data retrieval call binding the contract method 0xdde89cf5. // -// Solidity: function getStateVariables() view returns((uint64,uint64,uint64,uint64), (uint64,uint64,bool,uint8,uint16,uint32,uint64)) +// Solidity: function getStateVariables() view returns((uint64,uint64,uint64,uint64), (uint64,uint64,bool,uint56,uint64)) func (_TaikoL1Client *TaikoL1ClientSession) GetStateVariables() (TaikoDataSlotA, TaikoDataSlotB, error) { return _TaikoL1Client.Contract.GetStateVariables(&_TaikoL1Client.CallOpts) } // GetStateVariables is a free data retrieval call binding the contract method 0xdde89cf5. // -// Solidity: function getStateVariables() view returns((uint64,uint64,uint64,uint64), (uint64,uint64,bool,uint8,uint16,uint32,uint64)) +// Solidity: function getStateVariables() view returns((uint64,uint64,uint64,uint64), (uint64,uint64,bool,uint56,uint64)) func (_TaikoL1Client *TaikoL1ClientCallerSession) GetStateVariables() (TaikoDataSlotA, TaikoDataSlotB, error) { return _TaikoL1Client.Contract.GetStateVariables(&_TaikoL1Client.CallOpts) } @@ -456,6 +700,68 @@ func (_TaikoL1Client *TaikoL1ClientCallerSession) GetTransition0(_blockId uint64 return _TaikoL1Client.Contract.GetTransition0(&_TaikoL1Client.CallOpts, _blockId, _parentHash) } +// GetTransitions is a free data retrieval call binding the contract method 0xb89c61bc. +// +// Solidity: function getTransitions(uint64[] _blockIds, bytes32[] _parentHashes) view returns((bytes32,bytes32,bytes32,address,uint96,address,uint96,uint64,uint16,uint8)[]) +func (_TaikoL1Client *TaikoL1ClientCaller) GetTransitions(opts *bind.CallOpts, _blockIds []uint64, _parentHashes [][32]byte) ([]TaikoDataTransitionState, error) { + var out []interface{} + err := _TaikoL1Client.contract.Call(opts, &out, "getTransitions", _blockIds, _parentHashes) + + if err != nil { + return *new([]TaikoDataTransitionState), err + } + + out0 := *abi.ConvertType(out[0], new([]TaikoDataTransitionState)).(*[]TaikoDataTransitionState) + + return out0, err + +} + +// GetTransitions is a free data retrieval call binding the contract method 0xb89c61bc. +// +// Solidity: function getTransitions(uint64[] _blockIds, bytes32[] _parentHashes) view returns((bytes32,bytes32,bytes32,address,uint96,address,uint96,uint64,uint16,uint8)[]) +func (_TaikoL1Client *TaikoL1ClientSession) GetTransitions(_blockIds []uint64, _parentHashes [][32]byte) ([]TaikoDataTransitionState, error) { + return _TaikoL1Client.Contract.GetTransitions(&_TaikoL1Client.CallOpts, _blockIds, _parentHashes) +} + +// GetTransitions is a free data retrieval call binding the contract method 0xb89c61bc. +// +// Solidity: function getTransitions(uint64[] _blockIds, bytes32[] _parentHashes) view returns((bytes32,bytes32,bytes32,address,uint96,address,uint96,uint64,uint16,uint8)[]) +func (_TaikoL1Client *TaikoL1ClientCallerSession) GetTransitions(_blockIds []uint64, _parentHashes [][32]byte) ([]TaikoDataTransitionState, error) { + return _TaikoL1Client.Contract.GetTransitions(&_TaikoL1Client.CallOpts, _blockIds, _parentHashes) +} + +// GetVerifiedBlockProver is a free data retrieval call binding the contract method 0x6074b8c1. +// +// Solidity: function getVerifiedBlockProver(uint64 _blockId) view returns(address prover_) +func (_TaikoL1Client *TaikoL1ClientCaller) GetVerifiedBlockProver(opts *bind.CallOpts, _blockId uint64) (common.Address, error) { + var out []interface{} + err := _TaikoL1Client.contract.Call(opts, &out, "getVerifiedBlockProver", _blockId) + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// GetVerifiedBlockProver is a free data retrieval call binding the contract method 0x6074b8c1. +// +// Solidity: function getVerifiedBlockProver(uint64 _blockId) view returns(address prover_) +func (_TaikoL1Client *TaikoL1ClientSession) GetVerifiedBlockProver(_blockId uint64) (common.Address, error) { + return _TaikoL1Client.Contract.GetVerifiedBlockProver(&_TaikoL1Client.CallOpts, _blockId) +} + +// GetVerifiedBlockProver is a free data retrieval call binding the contract method 0x6074b8c1. +// +// Solidity: function getVerifiedBlockProver(uint64 _blockId) view returns(address prover_) +func (_TaikoL1Client *TaikoL1ClientCallerSession) GetVerifiedBlockProver(_blockId uint64) (common.Address, error) { + return _TaikoL1Client.Contract.GetVerifiedBlockProver(&_TaikoL1Client.CallOpts, _blockId) +} + // Impl is a free data retrieval call binding the contract method 0x8abf6077. // // Solidity: function impl() view returns(address) @@ -518,6 +824,37 @@ func (_TaikoL1Client *TaikoL1ClientCallerSession) InNonReentrant() (bool, error) return _TaikoL1Client.Contract.InNonReentrant(&_TaikoL1Client.CallOpts) } +// LastProposedIn is a free data retrieval call binding the contract method 0x5979f17c. +// +// Solidity: function lastProposedIn() view returns(uint56) +func (_TaikoL1Client *TaikoL1ClientCaller) LastProposedIn(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _TaikoL1Client.contract.Call(opts, &out, "lastProposedIn") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// LastProposedIn is a free data retrieval call binding the contract method 0x5979f17c. +// +// Solidity: function lastProposedIn() view returns(uint56) +func (_TaikoL1Client *TaikoL1ClientSession) LastProposedIn() (*big.Int, error) { + return _TaikoL1Client.Contract.LastProposedIn(&_TaikoL1Client.CallOpts) +} + +// LastProposedIn is a free data retrieval call binding the contract method 0x5979f17c. +// +// Solidity: function lastProposedIn() view returns(uint56) +func (_TaikoL1Client *TaikoL1ClientCallerSession) LastProposedIn() (*big.Int, error) { + return _TaikoL1Client.Contract.LastProposedIn(&_TaikoL1Client.CallOpts) +} + // LastUnpausedAt is a free data retrieval call binding the contract method 0xe07baba6. // // Solidity: function lastUnpausedAt() view returns(uint64) @@ -735,71 +1072,9 @@ func (_TaikoL1Client *TaikoL1ClientCallerSession) Resolve0(_name [32]byte, _allo return _TaikoL1Client.Contract.Resolve0(&_TaikoL1Client.CallOpts, _name, _allowZeroAddress) } -// SlotA is a free data retrieval call binding the contract method 0xc7821568. -// -// Solidity: function slotA() view returns((uint64,uint64,uint64,uint64)) -func (_TaikoL1Client *TaikoL1ClientCaller) SlotA(opts *bind.CallOpts) (TaikoDataSlotA, error) { - var out []interface{} - err := _TaikoL1Client.contract.Call(opts, &out, "slotA") - - if err != nil { - return *new(TaikoDataSlotA), err - } - - out0 := *abi.ConvertType(out[0], new(TaikoDataSlotA)).(*TaikoDataSlotA) - - return out0, err - -} - -// SlotA is a free data retrieval call binding the contract method 0xc7821568. -// -// Solidity: function slotA() view returns((uint64,uint64,uint64,uint64)) -func (_TaikoL1Client *TaikoL1ClientSession) SlotA() (TaikoDataSlotA, error) { - return _TaikoL1Client.Contract.SlotA(&_TaikoL1Client.CallOpts) -} - -// SlotA is a free data retrieval call binding the contract method 0xc7821568. -// -// Solidity: function slotA() view returns((uint64,uint64,uint64,uint64)) -func (_TaikoL1Client *TaikoL1ClientCallerSession) SlotA() (TaikoDataSlotA, error) { - return _TaikoL1Client.Contract.SlotA(&_TaikoL1Client.CallOpts) -} - -// SlotB is a free data retrieval call binding the contract method 0x19e8dce2. -// -// Solidity: function slotB() view returns((uint64,uint64,bool,uint8,uint16,uint32,uint64)) -func (_TaikoL1Client *TaikoL1ClientCaller) SlotB(opts *bind.CallOpts) (TaikoDataSlotB, error) { - var out []interface{} - err := _TaikoL1Client.contract.Call(opts, &out, "slotB") - - if err != nil { - return *new(TaikoDataSlotB), err - } - - out0 := *abi.ConvertType(out[0], new(TaikoDataSlotB)).(*TaikoDataSlotB) - - return out0, err - -} - -// SlotB is a free data retrieval call binding the contract method 0x19e8dce2. -// -// Solidity: function slotB() view returns((uint64,uint64,bool,uint8,uint16,uint32,uint64)) -func (_TaikoL1Client *TaikoL1ClientSession) SlotB() (TaikoDataSlotB, error) { - return _TaikoL1Client.Contract.SlotB(&_TaikoL1Client.CallOpts) -} - -// SlotB is a free data retrieval call binding the contract method 0x19e8dce2. -// -// Solidity: function slotB() view returns((uint64,uint64,bool,uint8,uint16,uint32,uint64)) -func (_TaikoL1Client *TaikoL1ClientCallerSession) SlotB() (TaikoDataSlotB, error) { - return _TaikoL1Client.Contract.SlotB(&_TaikoL1Client.CallOpts) -} - // State is a free data retrieval call binding the contract method 0xc19d93fb. // -// Solidity: function state() view returns(bytes32 __reserve1, (uint64,uint64,uint64,uint64) slotA, (uint64,uint64,bool,uint8,uint16,uint32,uint64) slotB) +// Solidity: function state() view returns(bytes32 __reserve1, (uint64,uint64,uint64,uint64) slotA, (uint64,uint64,bool,uint56,uint64) slotB) func (_TaikoL1Client *TaikoL1ClientCaller) State(opts *bind.CallOpts) (struct { Reserve1 [32]byte SlotA TaikoDataSlotA @@ -827,7 +1102,7 @@ func (_TaikoL1Client *TaikoL1ClientCaller) State(opts *bind.CallOpts) (struct { // State is a free data retrieval call binding the contract method 0xc19d93fb. // -// Solidity: function state() view returns(bytes32 __reserve1, (uint64,uint64,uint64,uint64) slotA, (uint64,uint64,bool,uint8,uint16,uint32,uint64) slotB) +// Solidity: function state() view returns(bytes32 __reserve1, (uint64,uint64,uint64,uint64) slotA, (uint64,uint64,bool,uint56,uint64) slotB) func (_TaikoL1Client *TaikoL1ClientSession) State() (struct { Reserve1 [32]byte SlotA TaikoDataSlotA @@ -838,7 +1113,7 @@ func (_TaikoL1Client *TaikoL1ClientSession) State() (struct { // State is a free data retrieval call binding the contract method 0xc19d93fb. // -// Solidity: function state() view returns(bytes32 __reserve1, (uint64,uint64,uint64,uint64) slotA, (uint64,uint64,bool,uint8,uint16,uint32,uint64) slotB) +// Solidity: function state() view returns(bytes32 __reserve1, (uint64,uint64,uint64,uint64) slotA, (uint64,uint64,bool,uint56,uint64) slotB) func (_TaikoL1Client *TaikoL1ClientCallerSession) State() (struct { Reserve1 [32]byte SlotA TaikoDataSlotA @@ -868,25 +1143,46 @@ func (_TaikoL1Client *TaikoL1ClientTransactorSession) AcceptOwnership() (*types. return _TaikoL1Client.Contract.AcceptOwnership(&_TaikoL1Client.TransactOpts) } +// DepositBond is a paid mutator transaction binding the contract method 0x4dcb05f9. +// +// Solidity: function depositBond(uint256 _amount) payable returns() +func (_TaikoL1Client *TaikoL1ClientTransactor) DepositBond(opts *bind.TransactOpts, _amount *big.Int) (*types.Transaction, error) { + return _TaikoL1Client.contract.Transact(opts, "depositBond", _amount) +} + +// DepositBond is a paid mutator transaction binding the contract method 0x4dcb05f9. +// +// Solidity: function depositBond(uint256 _amount) payable returns() +func (_TaikoL1Client *TaikoL1ClientSession) DepositBond(_amount *big.Int) (*types.Transaction, error) { + return _TaikoL1Client.Contract.DepositBond(&_TaikoL1Client.TransactOpts, _amount) +} + +// DepositBond is a paid mutator transaction binding the contract method 0x4dcb05f9. +// +// Solidity: function depositBond(uint256 _amount) payable returns() +func (_TaikoL1Client *TaikoL1ClientTransactorSession) DepositBond(_amount *big.Int) (*types.Transaction, error) { + return _TaikoL1Client.Contract.DepositBond(&_TaikoL1Client.TransactOpts, _amount) +} + // Init is a paid mutator transaction binding the contract method 0x29d1b62f. // -// Solidity: function init(address _owner, address _addressManager, bytes32 _genesisBlockHash, bool _toPause) returns() -func (_TaikoL1Client *TaikoL1ClientTransactor) Init(opts *bind.TransactOpts, _owner common.Address, _addressManager common.Address, _genesisBlockHash [32]byte, _toPause bool) (*types.Transaction, error) { - return _TaikoL1Client.contract.Transact(opts, "init", _owner, _addressManager, _genesisBlockHash, _toPause) +// Solidity: function init(address _owner, address _rollupAddressManager, bytes32 _genesisBlockHash, bool _toPause) returns() +func (_TaikoL1Client *TaikoL1ClientTransactor) Init(opts *bind.TransactOpts, _owner common.Address, _rollupAddressManager common.Address, _genesisBlockHash [32]byte, _toPause bool) (*types.Transaction, error) { + return _TaikoL1Client.contract.Transact(opts, "init", _owner, _rollupAddressManager, _genesisBlockHash, _toPause) } // Init is a paid mutator transaction binding the contract method 0x29d1b62f. // -// Solidity: function init(address _owner, address _addressManager, bytes32 _genesisBlockHash, bool _toPause) returns() -func (_TaikoL1Client *TaikoL1ClientSession) Init(_owner common.Address, _addressManager common.Address, _genesisBlockHash [32]byte, _toPause bool) (*types.Transaction, error) { - return _TaikoL1Client.Contract.Init(&_TaikoL1Client.TransactOpts, _owner, _addressManager, _genesisBlockHash, _toPause) +// Solidity: function init(address _owner, address _rollupAddressManager, bytes32 _genesisBlockHash, bool _toPause) returns() +func (_TaikoL1Client *TaikoL1ClientSession) Init(_owner common.Address, _rollupAddressManager common.Address, _genesisBlockHash [32]byte, _toPause bool) (*types.Transaction, error) { + return _TaikoL1Client.Contract.Init(&_TaikoL1Client.TransactOpts, _owner, _rollupAddressManager, _genesisBlockHash, _toPause) } // Init is a paid mutator transaction binding the contract method 0x29d1b62f. // -// Solidity: function init(address _owner, address _addressManager, bytes32 _genesisBlockHash, bool _toPause) returns() -func (_TaikoL1Client *TaikoL1ClientTransactorSession) Init(_owner common.Address, _addressManager common.Address, _genesisBlockHash [32]byte, _toPause bool) (*types.Transaction, error) { - return _TaikoL1Client.Contract.Init(&_TaikoL1Client.TransactOpts, _owner, _addressManager, _genesisBlockHash, _toPause) +// Solidity: function init(address _owner, address _rollupAddressManager, bytes32 _genesisBlockHash, bool _toPause) returns() +func (_TaikoL1Client *TaikoL1ClientTransactorSession) Init(_owner common.Address, _rollupAddressManager common.Address, _genesisBlockHash [32]byte, _toPause bool) (*types.Transaction, error) { + return _TaikoL1Client.Contract.Init(&_TaikoL1Client.TransactOpts, _owner, _rollupAddressManager, _genesisBlockHash, _toPause) } // Init2 is a paid mutator transaction binding the contract method 0x069489a2. @@ -910,6 +1206,27 @@ func (_TaikoL1Client *TaikoL1ClientTransactorSession) Init2() (*types.Transactio return _TaikoL1Client.Contract.Init2(&_TaikoL1Client.TransactOpts) } +// Init3 is a paid mutator transaction binding the contract method 0x486e3cd7. +// +// Solidity: function init3() returns() +func (_TaikoL1Client *TaikoL1ClientTransactor) Init3(opts *bind.TransactOpts) (*types.Transaction, error) { + return _TaikoL1Client.contract.Transact(opts, "init3") +} + +// Init3 is a paid mutator transaction binding the contract method 0x486e3cd7. +// +// Solidity: function init3() returns() +func (_TaikoL1Client *TaikoL1ClientSession) Init3() (*types.Transaction, error) { + return _TaikoL1Client.Contract.Init3(&_TaikoL1Client.TransactOpts) +} + +// Init3 is a paid mutator transaction binding the contract method 0x486e3cd7. +// +// Solidity: function init3() returns() +func (_TaikoL1Client *TaikoL1ClientTransactorSession) Init3() (*types.Transaction, error) { + return _TaikoL1Client.Contract.Init3(&_TaikoL1Client.TransactOpts) +} + // Pause is a paid mutator transaction binding the contract method 0x8456cb59. // // Solidity: function pause() returns() @@ -952,25 +1269,46 @@ func (_TaikoL1Client *TaikoL1ClientTransactorSession) PauseProving(_pause bool) return _TaikoL1Client.Contract.PauseProving(&_TaikoL1Client.TransactOpts, _pause) } -// ProposeBlock is a paid mutator transaction binding the contract method 0xef16e845. +// ProposeBlockV2 is a paid mutator transaction binding the contract method 0x648885fb. +// +// Solidity: function proposeBlockV2(bytes _params, bytes _txList) returns((bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address,uint96,uint64,uint64,uint32,uint32,uint8,(uint8,uint8,uint32,uint64,uint32)) meta_) +func (_TaikoL1Client *TaikoL1ClientTransactor) ProposeBlockV2(opts *bind.TransactOpts, _params []byte, _txList []byte) (*types.Transaction, error) { + return _TaikoL1Client.contract.Transact(opts, "proposeBlockV2", _params, _txList) +} + +// ProposeBlockV2 is a paid mutator transaction binding the contract method 0x648885fb. +// +// Solidity: function proposeBlockV2(bytes _params, bytes _txList) returns((bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address,uint96,uint64,uint64,uint32,uint32,uint8,(uint8,uint8,uint32,uint64,uint32)) meta_) +func (_TaikoL1Client *TaikoL1ClientSession) ProposeBlockV2(_params []byte, _txList []byte) (*types.Transaction, error) { + return _TaikoL1Client.Contract.ProposeBlockV2(&_TaikoL1Client.TransactOpts, _params, _txList) +} + +// ProposeBlockV2 is a paid mutator transaction binding the contract method 0x648885fb. // -// Solidity: function proposeBlock(bytes _params, bytes _txList) payable returns((bytes32,bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address) meta_, (address,uint96,uint64)[] deposits_) -func (_TaikoL1Client *TaikoL1ClientTransactor) ProposeBlock(opts *bind.TransactOpts, _params []byte, _txList []byte) (*types.Transaction, error) { - return _TaikoL1Client.contract.Transact(opts, "proposeBlock", _params, _txList) +// Solidity: function proposeBlockV2(bytes _params, bytes _txList) returns((bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address,uint96,uint64,uint64,uint32,uint32,uint8,(uint8,uint8,uint32,uint64,uint32)) meta_) +func (_TaikoL1Client *TaikoL1ClientTransactorSession) ProposeBlockV2(_params []byte, _txList []byte) (*types.Transaction, error) { + return _TaikoL1Client.Contract.ProposeBlockV2(&_TaikoL1Client.TransactOpts, _params, _txList) } -// ProposeBlock is a paid mutator transaction binding the contract method 0xef16e845. +// ProposeBlocksV2 is a paid mutator transaction binding the contract method 0x0c8f4a10. // -// Solidity: function proposeBlock(bytes _params, bytes _txList) payable returns((bytes32,bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address) meta_, (address,uint96,uint64)[] deposits_) -func (_TaikoL1Client *TaikoL1ClientSession) ProposeBlock(_params []byte, _txList []byte) (*types.Transaction, error) { - return _TaikoL1Client.Contract.ProposeBlock(&_TaikoL1Client.TransactOpts, _params, _txList) +// Solidity: function proposeBlocksV2(bytes[] _paramsArr, bytes[] _txListArr) returns((bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address,uint96,uint64,uint64,uint32,uint32,uint8,(uint8,uint8,uint32,uint64,uint32))[] metaArr_) +func (_TaikoL1Client *TaikoL1ClientTransactor) ProposeBlocksV2(opts *bind.TransactOpts, _paramsArr [][]byte, _txListArr [][]byte) (*types.Transaction, error) { + return _TaikoL1Client.contract.Transact(opts, "proposeBlocksV2", _paramsArr, _txListArr) } -// ProposeBlock is a paid mutator transaction binding the contract method 0xef16e845. +// ProposeBlocksV2 is a paid mutator transaction binding the contract method 0x0c8f4a10. // -// Solidity: function proposeBlock(bytes _params, bytes _txList) payable returns((bytes32,bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address) meta_, (address,uint96,uint64)[] deposits_) -func (_TaikoL1Client *TaikoL1ClientTransactorSession) ProposeBlock(_params []byte, _txList []byte) (*types.Transaction, error) { - return _TaikoL1Client.Contract.ProposeBlock(&_TaikoL1Client.TransactOpts, _params, _txList) +// Solidity: function proposeBlocksV2(bytes[] _paramsArr, bytes[] _txListArr) returns((bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address,uint96,uint64,uint64,uint32,uint32,uint8,(uint8,uint8,uint32,uint64,uint32))[] metaArr_) +func (_TaikoL1Client *TaikoL1ClientSession) ProposeBlocksV2(_paramsArr [][]byte, _txListArr [][]byte) (*types.Transaction, error) { + return _TaikoL1Client.Contract.ProposeBlocksV2(&_TaikoL1Client.TransactOpts, _paramsArr, _txListArr) +} + +// ProposeBlocksV2 is a paid mutator transaction binding the contract method 0x0c8f4a10. +// +// Solidity: function proposeBlocksV2(bytes[] _paramsArr, bytes[] _txListArr) returns((bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address,uint96,uint64,uint64,uint32,uint32,uint8,(uint8,uint8,uint32,uint64,uint32))[] metaArr_) +func (_TaikoL1Client *TaikoL1ClientTransactorSession) ProposeBlocksV2(_paramsArr [][]byte, _txListArr [][]byte) (*types.Transaction, error) { + return _TaikoL1Client.Contract.ProposeBlocksV2(&_TaikoL1Client.TransactOpts, _paramsArr, _txListArr) } // ProveBlock is a paid mutator transaction binding the contract method 0x10d008bd. @@ -994,6 +1332,27 @@ func (_TaikoL1Client *TaikoL1ClientTransactorSession) ProveBlock(_blockId uint64 return _TaikoL1Client.Contract.ProveBlock(&_TaikoL1Client.TransactOpts, _blockId, _input) } +// ProveBlocks is a paid mutator transaction binding the contract method 0x440b6e18. +// +// Solidity: function proveBlocks(uint64[] _blockIds, bytes[] _inputs, bytes _batchProof) returns() +func (_TaikoL1Client *TaikoL1ClientTransactor) ProveBlocks(opts *bind.TransactOpts, _blockIds []uint64, _inputs [][]byte, _batchProof []byte) (*types.Transaction, error) { + return _TaikoL1Client.contract.Transact(opts, "proveBlocks", _blockIds, _inputs, _batchProof) +} + +// ProveBlocks is a paid mutator transaction binding the contract method 0x440b6e18. +// +// Solidity: function proveBlocks(uint64[] _blockIds, bytes[] _inputs, bytes _batchProof) returns() +func (_TaikoL1Client *TaikoL1ClientSession) ProveBlocks(_blockIds []uint64, _inputs [][]byte, _batchProof []byte) (*types.Transaction, error) { + return _TaikoL1Client.Contract.ProveBlocks(&_TaikoL1Client.TransactOpts, _blockIds, _inputs, _batchProof) +} + +// ProveBlocks is a paid mutator transaction binding the contract method 0x440b6e18. +// +// Solidity: function proveBlocks(uint64[] _blockIds, bytes[] _inputs, bytes _batchProof) returns() +func (_TaikoL1Client *TaikoL1ClientTransactorSession) ProveBlocks(_blockIds []uint64, _inputs [][]byte, _batchProof []byte) (*types.Transaction, error) { + return _TaikoL1Client.Contract.ProveBlocks(&_TaikoL1Client.TransactOpts, _blockIds, _inputs, _batchProof) +} + // RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6. // // Solidity: function renounceOwnership() returns() @@ -1015,27 +1374,6 @@ func (_TaikoL1Client *TaikoL1ClientTransactorSession) RenounceOwnership() (*type return _TaikoL1Client.Contract.RenounceOwnership(&_TaikoL1Client.TransactOpts) } -// ResetGenesisHash is a paid mutator transaction binding the contract method 0xb008bedb. -// -// Solidity: function resetGenesisHash(bytes32 _genesisBlockHash) returns() -func (_TaikoL1Client *TaikoL1ClientTransactor) ResetGenesisHash(opts *bind.TransactOpts, _genesisBlockHash [32]byte) (*types.Transaction, error) { - return _TaikoL1Client.contract.Transact(opts, "resetGenesisHash", _genesisBlockHash) -} - -// ResetGenesisHash is a paid mutator transaction binding the contract method 0xb008bedb. -// -// Solidity: function resetGenesisHash(bytes32 _genesisBlockHash) returns() -func (_TaikoL1Client *TaikoL1ClientSession) ResetGenesisHash(_genesisBlockHash [32]byte) (*types.Transaction, error) { - return _TaikoL1Client.Contract.ResetGenesisHash(&_TaikoL1Client.TransactOpts, _genesisBlockHash) -} - -// ResetGenesisHash is a paid mutator transaction binding the contract method 0xb008bedb. -// -// Solidity: function resetGenesisHash(bytes32 _genesisBlockHash) returns() -func (_TaikoL1Client *TaikoL1ClientTransactorSession) ResetGenesisHash(_genesisBlockHash [32]byte) (*types.Transaction, error) { - return _TaikoL1Client.Contract.ResetGenesisHash(&_TaikoL1Client.TransactOpts, _genesisBlockHash) -} - // TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b. // // Solidity: function transferOwnership(address newOwner) returns() @@ -1141,25 +1479,25 @@ func (_TaikoL1Client *TaikoL1ClientTransactorSession) VerifyBlocks(_maxBlocksToV return _TaikoL1Client.Contract.VerifyBlocks(&_TaikoL1Client.TransactOpts, _maxBlocksToVerify) } -// Receive is a paid mutator transaction binding the contract receive function. +// WithdrawBond is a paid mutator transaction binding the contract method 0xc3daab96. // -// Solidity: receive() payable returns() -func (_TaikoL1Client *TaikoL1ClientTransactor) Receive(opts *bind.TransactOpts) (*types.Transaction, error) { - return _TaikoL1Client.contract.RawTransact(opts, nil) // calldata is disallowed for receive function +// Solidity: function withdrawBond(uint256 _amount) returns() +func (_TaikoL1Client *TaikoL1ClientTransactor) WithdrawBond(opts *bind.TransactOpts, _amount *big.Int) (*types.Transaction, error) { + return _TaikoL1Client.contract.Transact(opts, "withdrawBond", _amount) } -// Receive is a paid mutator transaction binding the contract receive function. +// WithdrawBond is a paid mutator transaction binding the contract method 0xc3daab96. // -// Solidity: receive() payable returns() -func (_TaikoL1Client *TaikoL1ClientSession) Receive() (*types.Transaction, error) { - return _TaikoL1Client.Contract.Receive(&_TaikoL1Client.TransactOpts) +// Solidity: function withdrawBond(uint256 _amount) returns() +func (_TaikoL1Client *TaikoL1ClientSession) WithdrawBond(_amount *big.Int) (*types.Transaction, error) { + return _TaikoL1Client.Contract.WithdrawBond(&_TaikoL1Client.TransactOpts, _amount) } -// Receive is a paid mutator transaction binding the contract receive function. +// WithdrawBond is a paid mutator transaction binding the contract method 0xc3daab96. // -// Solidity: receive() payable returns() -func (_TaikoL1Client *TaikoL1ClientTransactorSession) Receive() (*types.Transaction, error) { - return _TaikoL1Client.Contract.Receive(&_TaikoL1Client.TransactOpts) +// Solidity: function withdrawBond(uint256 _amount) returns() +func (_TaikoL1Client *TaikoL1ClientTransactorSession) WithdrawBond(_amount *big.Int) (*types.Transaction, error) { + return _TaikoL1Client.Contract.WithdrawBond(&_TaikoL1Client.TransactOpts, _amount) } // TaikoL1ClientAdminChangedIterator is returned from FilterAdminChanged and is used to iterate over the raw logs and unpacked data for AdminChanged events raised by the TaikoL1Client contract. @@ -1597,9 +1935,9 @@ func (_TaikoL1Client *TaikoL1ClientFilterer) ParseBlockProposed(log types.Log) ( return event, nil } -// TaikoL1ClientBlockProposed0Iterator is returned from FilterBlockProposed0 and is used to iterate over the raw logs and unpacked data for BlockProposed0 events raised by the TaikoL1Client contract. -type TaikoL1ClientBlockProposed0Iterator struct { - Event *TaikoL1ClientBlockProposed0 // Event containing the contract specifics and raw log +// TaikoL1ClientBlockProposedV2Iterator is returned from FilterBlockProposedV2 and is used to iterate over the raw logs and unpacked data for BlockProposedV2 events raised by the TaikoL1Client contract. +type TaikoL1ClientBlockProposedV2Iterator struct { + Event *TaikoL1ClientBlockProposedV2 // 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 @@ -1613,7 +1951,7 @@ type TaikoL1ClientBlockProposed0Iterator struct { // 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 *TaikoL1ClientBlockProposed0Iterator) Next() bool { +func (it *TaikoL1ClientBlockProposedV2Iterator) Next() bool { // If the iterator failed, stop iterating if it.fail != nil { return false @@ -1622,7 +1960,7 @@ func (it *TaikoL1ClientBlockProposed0Iterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(TaikoL1ClientBlockProposed0) + it.Event = new(TaikoL1ClientBlockProposedV2) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -1637,7 +1975,7 @@ func (it *TaikoL1ClientBlockProposed0Iterator) Next() bool { // Iterator still in progress, wait for either a data or an error event select { case log := <-it.logs: - it.Event = new(TaikoL1ClientBlockProposed0) + it.Event = new(TaikoL1ClientBlockProposedV2) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -1653,63 +1991,197 @@ func (it *TaikoL1ClientBlockProposed0Iterator) Next() bool { } // Error returns any retrieval or parsing error occurred during filtering. -func (it *TaikoL1ClientBlockProposed0Iterator) Error() error { +func (it *TaikoL1ClientBlockProposedV2Iterator) Error() error { return it.fail } // Close terminates the iteration process, releasing any pending underlying // resources. -func (it *TaikoL1ClientBlockProposed0Iterator) Close() error { +func (it *TaikoL1ClientBlockProposedV2Iterator) Close() error { it.sub.Unsubscribe() return nil } -// TaikoL1ClientBlockProposed0 represents a BlockProposed0 event raised by the TaikoL1Client contract. -type TaikoL1ClientBlockProposed0 struct { - BlockId *big.Int - AssignedProver common.Address - LivenessBond *big.Int - Meta TaikoDataBlockMetadata - DepositsProcessed []TaikoDataEthDeposit - Raw types.Log // Blockchain specific contextual infos +// TaikoL1ClientBlockProposedV2 represents a BlockProposedV2 event raised by the TaikoL1Client contract. +type TaikoL1ClientBlockProposedV2 struct { + BlockId *big.Int + Meta TaikoDataBlockMetadataV2 + Raw types.Log // Blockchain specific contextual infos } -// FilterBlockProposed0 is a free log retrieval operation binding the contract event 0xcda4e564245eb15494bc6da29f6a42e1941cf57f5314bf35bab8a1fca0a9c60a. +// FilterBlockProposedV2 is a free log retrieval operation binding the contract event 0xefe9c6c0b5cbd9c0eed2d1e9c00cfc1a010d6f1aff50f7facd665a639b622b26. // -// Solidity: event BlockProposed(uint256 indexed blockId, address indexed assignedProver, uint96 livenessBond, (bytes32,bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address) meta, (address,uint96,uint64)[] depositsProcessed) -func (_TaikoL1Client *TaikoL1ClientFilterer) FilterBlockProposed0(opts *bind.FilterOpts, blockId []*big.Int, assignedProver []common.Address) (*TaikoL1ClientBlockProposed0Iterator, error) { +// Solidity: event BlockProposedV2(uint256 indexed blockId, (bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address,uint96,uint64,uint64,uint32,uint32,uint8,(uint8,uint8,uint32,uint64,uint32)) meta) +func (_TaikoL1Client *TaikoL1ClientFilterer) FilterBlockProposedV2(opts *bind.FilterOpts, blockId []*big.Int) (*TaikoL1ClientBlockProposedV2Iterator, error) { var blockIdRule []interface{} for _, blockIdItem := range blockId { blockIdRule = append(blockIdRule, blockIdItem) } - var assignedProverRule []interface{} - for _, assignedProverItem := range assignedProver { - assignedProverRule = append(assignedProverRule, assignedProverItem) + + logs, sub, err := _TaikoL1Client.contract.FilterLogs(opts, "BlockProposedV2", blockIdRule) + if err != nil { + return nil, err + } + return &TaikoL1ClientBlockProposedV2Iterator{contract: _TaikoL1Client.contract, event: "BlockProposedV2", logs: logs, sub: sub}, nil +} + +// WatchBlockProposedV2 is a free log subscription operation binding the contract event 0xefe9c6c0b5cbd9c0eed2d1e9c00cfc1a010d6f1aff50f7facd665a639b622b26. +// +// Solidity: event BlockProposedV2(uint256 indexed blockId, (bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address,uint96,uint64,uint64,uint32,uint32,uint8,(uint8,uint8,uint32,uint64,uint32)) meta) +func (_TaikoL1Client *TaikoL1ClientFilterer) WatchBlockProposedV2(opts *bind.WatchOpts, sink chan<- *TaikoL1ClientBlockProposedV2, blockId []*big.Int) (event.Subscription, error) { + + var blockIdRule []interface{} + for _, blockIdItem := range blockId { + blockIdRule = append(blockIdRule, blockIdItem) } - logs, sub, err := _TaikoL1Client.contract.FilterLogs(opts, "BlockProposed0", blockIdRule, assignedProverRule) + logs, sub, err := _TaikoL1Client.contract.WatchLogs(opts, "BlockProposedV2", blockIdRule) if err != nil { return nil, err } - return &TaikoL1ClientBlockProposed0Iterator{contract: _TaikoL1Client.contract, event: "BlockProposed0", logs: logs, sub: sub}, nil + 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(TaikoL1ClientBlockProposedV2) + if err := _TaikoL1Client.contract.UnpackLog(event, "BlockProposedV2", 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 } -// WatchBlockProposed0 is a free log subscription operation binding the contract event 0xcda4e564245eb15494bc6da29f6a42e1941cf57f5314bf35bab8a1fca0a9c60a. +// ParseBlockProposedV2 is a log parse operation binding the contract event 0xefe9c6c0b5cbd9c0eed2d1e9c00cfc1a010d6f1aff50f7facd665a639b622b26. // -// Solidity: event BlockProposed(uint256 indexed blockId, address indexed assignedProver, uint96 livenessBond, (bytes32,bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address) meta, (address,uint96,uint64)[] depositsProcessed) -func (_TaikoL1Client *TaikoL1ClientFilterer) WatchBlockProposed0(opts *bind.WatchOpts, sink chan<- *TaikoL1ClientBlockProposed0, blockId []*big.Int, assignedProver []common.Address) (event.Subscription, error) { +// Solidity: event BlockProposedV2(uint256 indexed blockId, (bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address,uint96,uint64,uint64,uint32,uint32,uint8,(uint8,uint8,uint32,uint64,uint32)) meta) +func (_TaikoL1Client *TaikoL1ClientFilterer) ParseBlockProposedV2(log types.Log) (*TaikoL1ClientBlockProposedV2, error) { + event := new(TaikoL1ClientBlockProposedV2) + if err := _TaikoL1Client.contract.UnpackLog(event, "BlockProposedV2", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// TaikoL1ClientBlockProposedV20Iterator is returned from FilterBlockProposedV20 and is used to iterate over the raw logs and unpacked data for BlockProposedV20 events raised by the TaikoL1Client contract. +type TaikoL1ClientBlockProposedV20Iterator struct { + Event *TaikoL1ClientBlockProposedV20 // 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 *TaikoL1ClientBlockProposedV20Iterator) 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(TaikoL1ClientBlockProposedV20) + 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(TaikoL1ClientBlockProposedV20) + 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 *TaikoL1ClientBlockProposedV20Iterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *TaikoL1ClientBlockProposedV20Iterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// TaikoL1ClientBlockProposedV20 represents a BlockProposedV20 event raised by the TaikoL1Client contract. +type TaikoL1ClientBlockProposedV20 struct { + BlockId *big.Int + Meta TaikoDataBlockMetadataV2 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterBlockProposedV20 is a free log retrieval operation binding the contract event 0xefe9c6c0b5cbd9c0eed2d1e9c00cfc1a010d6f1aff50f7facd665a639b622b26. +// +// Solidity: event BlockProposedV2(uint256 indexed blockId, (bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address,uint96,uint64,uint64,uint32,uint32,uint8,(uint8,uint8,uint32,uint64,uint32)) meta) +func (_TaikoL1Client *TaikoL1ClientFilterer) FilterBlockProposedV20(opts *bind.FilterOpts, blockId []*big.Int) (*TaikoL1ClientBlockProposedV20Iterator, error) { var blockIdRule []interface{} for _, blockIdItem := range blockId { blockIdRule = append(blockIdRule, blockIdItem) } - var assignedProverRule []interface{} - for _, assignedProverItem := range assignedProver { - assignedProverRule = append(assignedProverRule, assignedProverItem) + + logs, sub, err := _TaikoL1Client.contract.FilterLogs(opts, "BlockProposedV20", blockIdRule) + if err != nil { + return nil, err + } + return &TaikoL1ClientBlockProposedV20Iterator{contract: _TaikoL1Client.contract, event: "BlockProposedV20", logs: logs, sub: sub}, nil +} + +// WatchBlockProposedV20 is a free log subscription operation binding the contract event 0xefe9c6c0b5cbd9c0eed2d1e9c00cfc1a010d6f1aff50f7facd665a639b622b26. +// +// Solidity: event BlockProposedV2(uint256 indexed blockId, (bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address,uint96,uint64,uint64,uint32,uint32,uint8,(uint8,uint8,uint32,uint64,uint32)) meta) +func (_TaikoL1Client *TaikoL1ClientFilterer) WatchBlockProposedV20(opts *bind.WatchOpts, sink chan<- *TaikoL1ClientBlockProposedV20, blockId []*big.Int) (event.Subscription, error) { + + var blockIdRule []interface{} + for _, blockIdItem := range blockId { + blockIdRule = append(blockIdRule, blockIdItem) } - logs, sub, err := _TaikoL1Client.contract.WatchLogs(opts, "BlockProposed0", blockIdRule, assignedProverRule) + logs, sub, err := _TaikoL1Client.contract.WatchLogs(opts, "BlockProposedV20", blockIdRule) if err != nil { return nil, err } @@ -1719,8 +2191,8 @@ func (_TaikoL1Client *TaikoL1ClientFilterer) WatchBlockProposed0(opts *bind.Watc select { case log := <-logs: // New log arrived, parse the event and forward to the user - event := new(TaikoL1ClientBlockProposed0) - if err := _TaikoL1Client.contract.UnpackLog(event, "BlockProposed0", log); err != nil { + event := new(TaikoL1ClientBlockProposedV20) + if err := _TaikoL1Client.contract.UnpackLog(event, "BlockProposedV20", log); err != nil { return err } event.Raw = log @@ -1741,12 +2213,12 @@ func (_TaikoL1Client *TaikoL1ClientFilterer) WatchBlockProposed0(opts *bind.Watc }), nil } -// ParseBlockProposed0 is a log parse operation binding the contract event 0xcda4e564245eb15494bc6da29f6a42e1941cf57f5314bf35bab8a1fca0a9c60a. +// ParseBlockProposedV20 is a log parse operation binding the contract event 0xefe9c6c0b5cbd9c0eed2d1e9c00cfc1a010d6f1aff50f7facd665a639b622b26. // -// Solidity: event BlockProposed(uint256 indexed blockId, address indexed assignedProver, uint96 livenessBond, (bytes32,bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address) meta, (address,uint96,uint64)[] depositsProcessed) -func (_TaikoL1Client *TaikoL1ClientFilterer) ParseBlockProposed0(log types.Log) (*TaikoL1ClientBlockProposed0, error) { - event := new(TaikoL1ClientBlockProposed0) - if err := _TaikoL1Client.contract.UnpackLog(event, "BlockProposed0", log); err != nil { +// Solidity: event BlockProposedV2(uint256 indexed blockId, (bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address,uint96,uint64,uint64,uint32,uint32,uint8,(uint8,uint8,uint32,uint64,uint32)) meta) +func (_TaikoL1Client *TaikoL1ClientFilterer) ParseBlockProposedV20(log types.Log) (*TaikoL1ClientBlockProposedV20, error) { + event := new(TaikoL1ClientBlockProposedV20) + if err := _TaikoL1Client.contract.UnpackLog(event, "BlockProposedV20", log); err != nil { return nil, err } event.Raw = log @@ -1860,12 +2332,1486 @@ func (_TaikoL1Client *TaikoL1ClientFilterer) WatchBlockVerified(opts *bind.Watch for _, blockIdItem := range blockId { blockIdRule = append(blockIdRule, blockIdItem) } - var proverRule []interface{} - for _, proverItem := range prover { - proverRule = append(proverRule, proverItem) - } + var proverRule []interface{} + for _, proverItem := range prover { + proverRule = append(proverRule, proverItem) + } + + logs, sub, err := _TaikoL1Client.contract.WatchLogs(opts, "BlockVerified", blockIdRule, proverRule) + 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(TaikoL1ClientBlockVerified) + if err := _TaikoL1Client.contract.UnpackLog(event, "BlockVerified", 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 +} + +// ParseBlockVerified is a log parse operation binding the contract event 0xdecbd2c61cbda254917d6fd4c980a470701e8f9f1b744f6ad163ca70ca5db289. +// +// Solidity: event BlockVerified(uint256 indexed blockId, address indexed prover, bytes32 blockHash, bytes32 stateRoot, uint16 tier) +func (_TaikoL1Client *TaikoL1ClientFilterer) ParseBlockVerified(log types.Log) (*TaikoL1ClientBlockVerified, error) { + event := new(TaikoL1ClientBlockVerified) + if err := _TaikoL1Client.contract.UnpackLog(event, "BlockVerified", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// TaikoL1ClientBlockVerifiedV2Iterator is returned from FilterBlockVerifiedV2 and is used to iterate over the raw logs and unpacked data for BlockVerifiedV2 events raised by the TaikoL1Client contract. +type TaikoL1ClientBlockVerifiedV2Iterator struct { + Event *TaikoL1ClientBlockVerifiedV2 // 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 *TaikoL1ClientBlockVerifiedV2Iterator) 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(TaikoL1ClientBlockVerifiedV2) + 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(TaikoL1ClientBlockVerifiedV2) + 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 *TaikoL1ClientBlockVerifiedV2Iterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *TaikoL1ClientBlockVerifiedV2Iterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// TaikoL1ClientBlockVerifiedV2 represents a BlockVerifiedV2 event raised by the TaikoL1Client contract. +type TaikoL1ClientBlockVerifiedV2 struct { + BlockId *big.Int + Prover common.Address + BlockHash [32]byte + Tier uint16 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterBlockVerifiedV2 is a free log retrieval operation binding the contract event 0xe5a390d9800811154279af0c1a80d3bdf558ea91f1301e7c6ec3c1ad83e80aef. +// +// Solidity: event BlockVerifiedV2(uint256 indexed blockId, address indexed prover, bytes32 blockHash, uint16 tier) +func (_TaikoL1Client *TaikoL1ClientFilterer) FilterBlockVerifiedV2(opts *bind.FilterOpts, blockId []*big.Int, prover []common.Address) (*TaikoL1ClientBlockVerifiedV2Iterator, error) { + + var blockIdRule []interface{} + for _, blockIdItem := range blockId { + blockIdRule = append(blockIdRule, blockIdItem) + } + var proverRule []interface{} + for _, proverItem := range prover { + proverRule = append(proverRule, proverItem) + } + + logs, sub, err := _TaikoL1Client.contract.FilterLogs(opts, "BlockVerifiedV2", blockIdRule, proverRule) + if err != nil { + return nil, err + } + return &TaikoL1ClientBlockVerifiedV2Iterator{contract: _TaikoL1Client.contract, event: "BlockVerifiedV2", logs: logs, sub: sub}, nil +} + +// WatchBlockVerifiedV2 is a free log subscription operation binding the contract event 0xe5a390d9800811154279af0c1a80d3bdf558ea91f1301e7c6ec3c1ad83e80aef. +// +// Solidity: event BlockVerifiedV2(uint256 indexed blockId, address indexed prover, bytes32 blockHash, uint16 tier) +func (_TaikoL1Client *TaikoL1ClientFilterer) WatchBlockVerifiedV2(opts *bind.WatchOpts, sink chan<- *TaikoL1ClientBlockVerifiedV2, blockId []*big.Int, prover []common.Address) (event.Subscription, error) { + + var blockIdRule []interface{} + for _, blockIdItem := range blockId { + blockIdRule = append(blockIdRule, blockIdItem) + } + var proverRule []interface{} + for _, proverItem := range prover { + proverRule = append(proverRule, proverItem) + } + + logs, sub, err := _TaikoL1Client.contract.WatchLogs(opts, "BlockVerifiedV2", blockIdRule, proverRule) + 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(TaikoL1ClientBlockVerifiedV2) + if err := _TaikoL1Client.contract.UnpackLog(event, "BlockVerifiedV2", 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 +} + +// ParseBlockVerifiedV2 is a log parse operation binding the contract event 0xe5a390d9800811154279af0c1a80d3bdf558ea91f1301e7c6ec3c1ad83e80aef. +// +// Solidity: event BlockVerifiedV2(uint256 indexed blockId, address indexed prover, bytes32 blockHash, uint16 tier) +func (_TaikoL1Client *TaikoL1ClientFilterer) ParseBlockVerifiedV2(log types.Log) (*TaikoL1ClientBlockVerifiedV2, error) { + event := new(TaikoL1ClientBlockVerifiedV2) + if err := _TaikoL1Client.contract.UnpackLog(event, "BlockVerifiedV2", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// TaikoL1ClientBlockVerifiedV20Iterator is returned from FilterBlockVerifiedV20 and is used to iterate over the raw logs and unpacked data for BlockVerifiedV20 events raised by the TaikoL1Client contract. +type TaikoL1ClientBlockVerifiedV20Iterator struct { + Event *TaikoL1ClientBlockVerifiedV20 // 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 *TaikoL1ClientBlockVerifiedV20Iterator) 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(TaikoL1ClientBlockVerifiedV20) + 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(TaikoL1ClientBlockVerifiedV20) + 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 *TaikoL1ClientBlockVerifiedV20Iterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *TaikoL1ClientBlockVerifiedV20Iterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// TaikoL1ClientBlockVerifiedV20 represents a BlockVerifiedV20 event raised by the TaikoL1Client contract. +type TaikoL1ClientBlockVerifiedV20 struct { + BlockId *big.Int + Prover common.Address + BlockHash [32]byte + Tier uint16 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterBlockVerifiedV20 is a free log retrieval operation binding the contract event 0xe5a390d9800811154279af0c1a80d3bdf558ea91f1301e7c6ec3c1ad83e80aef. +// +// Solidity: event BlockVerifiedV2(uint256 indexed blockId, address indexed prover, bytes32 blockHash, uint16 tier) +func (_TaikoL1Client *TaikoL1ClientFilterer) FilterBlockVerifiedV20(opts *bind.FilterOpts, blockId []*big.Int, prover []common.Address) (*TaikoL1ClientBlockVerifiedV20Iterator, error) { + + var blockIdRule []interface{} + for _, blockIdItem := range blockId { + blockIdRule = append(blockIdRule, blockIdItem) + } + var proverRule []interface{} + for _, proverItem := range prover { + proverRule = append(proverRule, proverItem) + } + + logs, sub, err := _TaikoL1Client.contract.FilterLogs(opts, "BlockVerifiedV20", blockIdRule, proverRule) + if err != nil { + return nil, err + } + return &TaikoL1ClientBlockVerifiedV20Iterator{contract: _TaikoL1Client.contract, event: "BlockVerifiedV20", logs: logs, sub: sub}, nil +} + +// WatchBlockVerifiedV20 is a free log subscription operation binding the contract event 0xe5a390d9800811154279af0c1a80d3bdf558ea91f1301e7c6ec3c1ad83e80aef. +// +// Solidity: event BlockVerifiedV2(uint256 indexed blockId, address indexed prover, bytes32 blockHash, uint16 tier) +func (_TaikoL1Client *TaikoL1ClientFilterer) WatchBlockVerifiedV20(opts *bind.WatchOpts, sink chan<- *TaikoL1ClientBlockVerifiedV20, blockId []*big.Int, prover []common.Address) (event.Subscription, error) { + + var blockIdRule []interface{} + for _, blockIdItem := range blockId { + blockIdRule = append(blockIdRule, blockIdItem) + } + var proverRule []interface{} + for _, proverItem := range prover { + proverRule = append(proverRule, proverItem) + } + + logs, sub, err := _TaikoL1Client.contract.WatchLogs(opts, "BlockVerifiedV20", blockIdRule, proverRule) + 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(TaikoL1ClientBlockVerifiedV20) + if err := _TaikoL1Client.contract.UnpackLog(event, "BlockVerifiedV20", 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 +} + +// ParseBlockVerifiedV20 is a log parse operation binding the contract event 0xe5a390d9800811154279af0c1a80d3bdf558ea91f1301e7c6ec3c1ad83e80aef. +// +// Solidity: event BlockVerifiedV2(uint256 indexed blockId, address indexed prover, bytes32 blockHash, uint16 tier) +func (_TaikoL1Client *TaikoL1ClientFilterer) ParseBlockVerifiedV20(log types.Log) (*TaikoL1ClientBlockVerifiedV20, error) { + event := new(TaikoL1ClientBlockVerifiedV20) + if err := _TaikoL1Client.contract.UnpackLog(event, "BlockVerifiedV20", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// TaikoL1ClientBondCreditedIterator is returned from FilterBondCredited and is used to iterate over the raw logs and unpacked data for BondCredited events raised by the TaikoL1Client contract. +type TaikoL1ClientBondCreditedIterator struct { + Event *TaikoL1ClientBondCredited // 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 *TaikoL1ClientBondCreditedIterator) 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(TaikoL1ClientBondCredited) + 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(TaikoL1ClientBondCredited) + 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 *TaikoL1ClientBondCreditedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *TaikoL1ClientBondCreditedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// TaikoL1ClientBondCredited represents a BondCredited event raised by the TaikoL1Client contract. +type TaikoL1ClientBondCredited struct { + User common.Address + BlockId *big.Int + Amount *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterBondCredited is a free log retrieval operation binding the contract event 0x767672484792852973001cc22546fd96c3d7466da3c383e42741793dce5e4169. +// +// Solidity: event BondCredited(address indexed user, uint256 blockId, uint256 amount) +func (_TaikoL1Client *TaikoL1ClientFilterer) FilterBondCredited(opts *bind.FilterOpts, user []common.Address) (*TaikoL1ClientBondCreditedIterator, error) { + + var userRule []interface{} + for _, userItem := range user { + userRule = append(userRule, userItem) + } + + logs, sub, err := _TaikoL1Client.contract.FilterLogs(opts, "BondCredited", userRule) + if err != nil { + return nil, err + } + return &TaikoL1ClientBondCreditedIterator{contract: _TaikoL1Client.contract, event: "BondCredited", logs: logs, sub: sub}, nil +} + +// WatchBondCredited is a free log subscription operation binding the contract event 0x767672484792852973001cc22546fd96c3d7466da3c383e42741793dce5e4169. +// +// Solidity: event BondCredited(address indexed user, uint256 blockId, uint256 amount) +func (_TaikoL1Client *TaikoL1ClientFilterer) WatchBondCredited(opts *bind.WatchOpts, sink chan<- *TaikoL1ClientBondCredited, user []common.Address) (event.Subscription, error) { + + var userRule []interface{} + for _, userItem := range user { + userRule = append(userRule, userItem) + } + + logs, sub, err := _TaikoL1Client.contract.WatchLogs(opts, "BondCredited", userRule) + 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(TaikoL1ClientBondCredited) + if err := _TaikoL1Client.contract.UnpackLog(event, "BondCredited", 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 +} + +// ParseBondCredited is a log parse operation binding the contract event 0x767672484792852973001cc22546fd96c3d7466da3c383e42741793dce5e4169. +// +// Solidity: event BondCredited(address indexed user, uint256 blockId, uint256 amount) +func (_TaikoL1Client *TaikoL1ClientFilterer) ParseBondCredited(log types.Log) (*TaikoL1ClientBondCredited, error) { + event := new(TaikoL1ClientBondCredited) + if err := _TaikoL1Client.contract.UnpackLog(event, "BondCredited", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// TaikoL1ClientBondCredited0Iterator is returned from FilterBondCredited0 and is used to iterate over the raw logs and unpacked data for BondCredited0 events raised by the TaikoL1Client contract. +type TaikoL1ClientBondCredited0Iterator struct { + Event *TaikoL1ClientBondCredited0 // 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 *TaikoL1ClientBondCredited0Iterator) 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(TaikoL1ClientBondCredited0) + 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(TaikoL1ClientBondCredited0) + 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 *TaikoL1ClientBondCredited0Iterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *TaikoL1ClientBondCredited0Iterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// TaikoL1ClientBondCredited0 represents a BondCredited0 event raised by the TaikoL1Client contract. +type TaikoL1ClientBondCredited0 struct { + User common.Address + BlockId *big.Int + Amount *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterBondCredited0 is a free log retrieval operation binding the contract event 0x767672484792852973001cc22546fd96c3d7466da3c383e42741793dce5e4169. +// +// Solidity: event BondCredited(address indexed user, uint256 blockId, uint256 amount) +func (_TaikoL1Client *TaikoL1ClientFilterer) FilterBondCredited0(opts *bind.FilterOpts, user []common.Address) (*TaikoL1ClientBondCredited0Iterator, error) { + + var userRule []interface{} + for _, userItem := range user { + userRule = append(userRule, userItem) + } + + logs, sub, err := _TaikoL1Client.contract.FilterLogs(opts, "BondCredited0", userRule) + if err != nil { + return nil, err + } + return &TaikoL1ClientBondCredited0Iterator{contract: _TaikoL1Client.contract, event: "BondCredited0", logs: logs, sub: sub}, nil +} + +// WatchBondCredited0 is a free log subscription operation binding the contract event 0x767672484792852973001cc22546fd96c3d7466da3c383e42741793dce5e4169. +// +// Solidity: event BondCredited(address indexed user, uint256 blockId, uint256 amount) +func (_TaikoL1Client *TaikoL1ClientFilterer) WatchBondCredited0(opts *bind.WatchOpts, sink chan<- *TaikoL1ClientBondCredited0, user []common.Address) (event.Subscription, error) { + + var userRule []interface{} + for _, userItem := range user { + userRule = append(userRule, userItem) + } + + logs, sub, err := _TaikoL1Client.contract.WatchLogs(opts, "BondCredited0", userRule) + 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(TaikoL1ClientBondCredited0) + if err := _TaikoL1Client.contract.UnpackLog(event, "BondCredited0", 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 +} + +// ParseBondCredited0 is a log parse operation binding the contract event 0x767672484792852973001cc22546fd96c3d7466da3c383e42741793dce5e4169. +// +// Solidity: event BondCredited(address indexed user, uint256 blockId, uint256 amount) +func (_TaikoL1Client *TaikoL1ClientFilterer) ParseBondCredited0(log types.Log) (*TaikoL1ClientBondCredited0, error) { + event := new(TaikoL1ClientBondCredited0) + if err := _TaikoL1Client.contract.UnpackLog(event, "BondCredited0", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// TaikoL1ClientBondDebitedIterator is returned from FilterBondDebited and is used to iterate over the raw logs and unpacked data for BondDebited events raised by the TaikoL1Client contract. +type TaikoL1ClientBondDebitedIterator struct { + Event *TaikoL1ClientBondDebited // 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 *TaikoL1ClientBondDebitedIterator) 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(TaikoL1ClientBondDebited) + 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(TaikoL1ClientBondDebited) + 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 *TaikoL1ClientBondDebitedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *TaikoL1ClientBondDebitedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// TaikoL1ClientBondDebited represents a BondDebited event raised by the TaikoL1Client contract. +type TaikoL1ClientBondDebited struct { + User common.Address + BlockId *big.Int + Amount *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterBondDebited is a free log retrieval operation binding the contract event 0xf4636413c66bd7ef2a1d735c30d22543acb0fba1b0892503bef0734b237c3f37. +// +// Solidity: event BondDebited(address indexed user, uint256 blockId, uint256 amount) +func (_TaikoL1Client *TaikoL1ClientFilterer) FilterBondDebited(opts *bind.FilterOpts, user []common.Address) (*TaikoL1ClientBondDebitedIterator, error) { + + var userRule []interface{} + for _, userItem := range user { + userRule = append(userRule, userItem) + } + + logs, sub, err := _TaikoL1Client.contract.FilterLogs(opts, "BondDebited", userRule) + if err != nil { + return nil, err + } + return &TaikoL1ClientBondDebitedIterator{contract: _TaikoL1Client.contract, event: "BondDebited", logs: logs, sub: sub}, nil +} + +// WatchBondDebited is a free log subscription operation binding the contract event 0xf4636413c66bd7ef2a1d735c30d22543acb0fba1b0892503bef0734b237c3f37. +// +// Solidity: event BondDebited(address indexed user, uint256 blockId, uint256 amount) +func (_TaikoL1Client *TaikoL1ClientFilterer) WatchBondDebited(opts *bind.WatchOpts, sink chan<- *TaikoL1ClientBondDebited, user []common.Address) (event.Subscription, error) { + + var userRule []interface{} + for _, userItem := range user { + userRule = append(userRule, userItem) + } + + logs, sub, err := _TaikoL1Client.contract.WatchLogs(opts, "BondDebited", userRule) + 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(TaikoL1ClientBondDebited) + if err := _TaikoL1Client.contract.UnpackLog(event, "BondDebited", 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 +} + +// ParseBondDebited is a log parse operation binding the contract event 0xf4636413c66bd7ef2a1d735c30d22543acb0fba1b0892503bef0734b237c3f37. +// +// Solidity: event BondDebited(address indexed user, uint256 blockId, uint256 amount) +func (_TaikoL1Client *TaikoL1ClientFilterer) ParseBondDebited(log types.Log) (*TaikoL1ClientBondDebited, error) { + event := new(TaikoL1ClientBondDebited) + if err := _TaikoL1Client.contract.UnpackLog(event, "BondDebited", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// TaikoL1ClientBondDebited0Iterator is returned from FilterBondDebited0 and is used to iterate over the raw logs and unpacked data for BondDebited0 events raised by the TaikoL1Client contract. +type TaikoL1ClientBondDebited0Iterator struct { + Event *TaikoL1ClientBondDebited0 // 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 *TaikoL1ClientBondDebited0Iterator) 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(TaikoL1ClientBondDebited0) + 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(TaikoL1ClientBondDebited0) + 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 *TaikoL1ClientBondDebited0Iterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *TaikoL1ClientBondDebited0Iterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// TaikoL1ClientBondDebited0 represents a BondDebited0 event raised by the TaikoL1Client contract. +type TaikoL1ClientBondDebited0 struct { + User common.Address + BlockId *big.Int + Amount *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterBondDebited0 is a free log retrieval operation binding the contract event 0xf4636413c66bd7ef2a1d735c30d22543acb0fba1b0892503bef0734b237c3f37. +// +// Solidity: event BondDebited(address indexed user, uint256 blockId, uint256 amount) +func (_TaikoL1Client *TaikoL1ClientFilterer) FilterBondDebited0(opts *bind.FilterOpts, user []common.Address) (*TaikoL1ClientBondDebited0Iterator, error) { + + var userRule []interface{} + for _, userItem := range user { + userRule = append(userRule, userItem) + } + + logs, sub, err := _TaikoL1Client.contract.FilterLogs(opts, "BondDebited0", userRule) + if err != nil { + return nil, err + } + return &TaikoL1ClientBondDebited0Iterator{contract: _TaikoL1Client.contract, event: "BondDebited0", logs: logs, sub: sub}, nil +} + +// WatchBondDebited0 is a free log subscription operation binding the contract event 0xf4636413c66bd7ef2a1d735c30d22543acb0fba1b0892503bef0734b237c3f37. +// +// Solidity: event BondDebited(address indexed user, uint256 blockId, uint256 amount) +func (_TaikoL1Client *TaikoL1ClientFilterer) WatchBondDebited0(opts *bind.WatchOpts, sink chan<- *TaikoL1ClientBondDebited0, user []common.Address) (event.Subscription, error) { + + var userRule []interface{} + for _, userItem := range user { + userRule = append(userRule, userItem) + } + + logs, sub, err := _TaikoL1Client.contract.WatchLogs(opts, "BondDebited0", userRule) + 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(TaikoL1ClientBondDebited0) + if err := _TaikoL1Client.contract.UnpackLog(event, "BondDebited0", 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 +} + +// ParseBondDebited0 is a log parse operation binding the contract event 0xf4636413c66bd7ef2a1d735c30d22543acb0fba1b0892503bef0734b237c3f37. +// +// Solidity: event BondDebited(address indexed user, uint256 blockId, uint256 amount) +func (_TaikoL1Client *TaikoL1ClientFilterer) ParseBondDebited0(log types.Log) (*TaikoL1ClientBondDebited0, error) { + event := new(TaikoL1ClientBondDebited0) + if err := _TaikoL1Client.contract.UnpackLog(event, "BondDebited0", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// TaikoL1ClientBondDepositedIterator is returned from FilterBondDeposited and is used to iterate over the raw logs and unpacked data for BondDeposited events raised by the TaikoL1Client contract. +type TaikoL1ClientBondDepositedIterator struct { + Event *TaikoL1ClientBondDeposited // 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 *TaikoL1ClientBondDepositedIterator) 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(TaikoL1ClientBondDeposited) + 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(TaikoL1ClientBondDeposited) + 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 *TaikoL1ClientBondDepositedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *TaikoL1ClientBondDepositedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// TaikoL1ClientBondDeposited represents a BondDeposited event raised by the TaikoL1Client contract. +type TaikoL1ClientBondDeposited struct { + User common.Address + Amount *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterBondDeposited is a free log retrieval operation binding the contract event 0x8ed8c6869618197b68315ade66e75ed3906c97b111fa3ab81e5760046825c7db. +// +// Solidity: event BondDeposited(address indexed user, uint256 amount) +func (_TaikoL1Client *TaikoL1ClientFilterer) FilterBondDeposited(opts *bind.FilterOpts, user []common.Address) (*TaikoL1ClientBondDepositedIterator, error) { + + var userRule []interface{} + for _, userItem := range user { + userRule = append(userRule, userItem) + } + + logs, sub, err := _TaikoL1Client.contract.FilterLogs(opts, "BondDeposited", userRule) + if err != nil { + return nil, err + } + return &TaikoL1ClientBondDepositedIterator{contract: _TaikoL1Client.contract, event: "BondDeposited", logs: logs, sub: sub}, nil +} + +// WatchBondDeposited is a free log subscription operation binding the contract event 0x8ed8c6869618197b68315ade66e75ed3906c97b111fa3ab81e5760046825c7db. +// +// Solidity: event BondDeposited(address indexed user, uint256 amount) +func (_TaikoL1Client *TaikoL1ClientFilterer) WatchBondDeposited(opts *bind.WatchOpts, sink chan<- *TaikoL1ClientBondDeposited, user []common.Address) (event.Subscription, error) { + + var userRule []interface{} + for _, userItem := range user { + userRule = append(userRule, userItem) + } + + logs, sub, err := _TaikoL1Client.contract.WatchLogs(opts, "BondDeposited", userRule) + 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(TaikoL1ClientBondDeposited) + if err := _TaikoL1Client.contract.UnpackLog(event, "BondDeposited", 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 +} + +// ParseBondDeposited is a log parse operation binding the contract event 0x8ed8c6869618197b68315ade66e75ed3906c97b111fa3ab81e5760046825c7db. +// +// Solidity: event BondDeposited(address indexed user, uint256 amount) +func (_TaikoL1Client *TaikoL1ClientFilterer) ParseBondDeposited(log types.Log) (*TaikoL1ClientBondDeposited, error) { + event := new(TaikoL1ClientBondDeposited) + if err := _TaikoL1Client.contract.UnpackLog(event, "BondDeposited", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// TaikoL1ClientBondDeposited0Iterator is returned from FilterBondDeposited0 and is used to iterate over the raw logs and unpacked data for BondDeposited0 events raised by the TaikoL1Client contract. +type TaikoL1ClientBondDeposited0Iterator struct { + Event *TaikoL1ClientBondDeposited0 // 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 *TaikoL1ClientBondDeposited0Iterator) 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(TaikoL1ClientBondDeposited0) + 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(TaikoL1ClientBondDeposited0) + 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 *TaikoL1ClientBondDeposited0Iterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *TaikoL1ClientBondDeposited0Iterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// TaikoL1ClientBondDeposited0 represents a BondDeposited0 event raised by the TaikoL1Client contract. +type TaikoL1ClientBondDeposited0 struct { + User common.Address + Amount *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterBondDeposited0 is a free log retrieval operation binding the contract event 0x8ed8c6869618197b68315ade66e75ed3906c97b111fa3ab81e5760046825c7db. +// +// Solidity: event BondDeposited(address indexed user, uint256 amount) +func (_TaikoL1Client *TaikoL1ClientFilterer) FilterBondDeposited0(opts *bind.FilterOpts, user []common.Address) (*TaikoL1ClientBondDeposited0Iterator, error) { + + var userRule []interface{} + for _, userItem := range user { + userRule = append(userRule, userItem) + } + + logs, sub, err := _TaikoL1Client.contract.FilterLogs(opts, "BondDeposited0", userRule) + if err != nil { + return nil, err + } + return &TaikoL1ClientBondDeposited0Iterator{contract: _TaikoL1Client.contract, event: "BondDeposited0", logs: logs, sub: sub}, nil +} + +// WatchBondDeposited0 is a free log subscription operation binding the contract event 0x8ed8c6869618197b68315ade66e75ed3906c97b111fa3ab81e5760046825c7db. +// +// Solidity: event BondDeposited(address indexed user, uint256 amount) +func (_TaikoL1Client *TaikoL1ClientFilterer) WatchBondDeposited0(opts *bind.WatchOpts, sink chan<- *TaikoL1ClientBondDeposited0, user []common.Address) (event.Subscription, error) { + + var userRule []interface{} + for _, userItem := range user { + userRule = append(userRule, userItem) + } + + logs, sub, err := _TaikoL1Client.contract.WatchLogs(opts, "BondDeposited0", userRule) + 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(TaikoL1ClientBondDeposited0) + if err := _TaikoL1Client.contract.UnpackLog(event, "BondDeposited0", 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 +} + +// ParseBondDeposited0 is a log parse operation binding the contract event 0x8ed8c6869618197b68315ade66e75ed3906c97b111fa3ab81e5760046825c7db. +// +// Solidity: event BondDeposited(address indexed user, uint256 amount) +func (_TaikoL1Client *TaikoL1ClientFilterer) ParseBondDeposited0(log types.Log) (*TaikoL1ClientBondDeposited0, error) { + event := new(TaikoL1ClientBondDeposited0) + if err := _TaikoL1Client.contract.UnpackLog(event, "BondDeposited0", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// TaikoL1ClientBondWithdrawnIterator is returned from FilterBondWithdrawn and is used to iterate over the raw logs and unpacked data for BondWithdrawn events raised by the TaikoL1Client contract. +type TaikoL1ClientBondWithdrawnIterator struct { + Event *TaikoL1ClientBondWithdrawn // 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 *TaikoL1ClientBondWithdrawnIterator) 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(TaikoL1ClientBondWithdrawn) + 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(TaikoL1ClientBondWithdrawn) + 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 *TaikoL1ClientBondWithdrawnIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *TaikoL1ClientBondWithdrawnIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// TaikoL1ClientBondWithdrawn represents a BondWithdrawn event raised by the TaikoL1Client contract. +type TaikoL1ClientBondWithdrawn struct { + User common.Address + Amount *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterBondWithdrawn is a free log retrieval operation binding the contract event 0x0d41118e36df44efb77a471fc49fb9c0be0406d802ef95520e9fbf606e65b455. +// +// Solidity: event BondWithdrawn(address indexed user, uint256 amount) +func (_TaikoL1Client *TaikoL1ClientFilterer) FilterBondWithdrawn(opts *bind.FilterOpts, user []common.Address) (*TaikoL1ClientBondWithdrawnIterator, error) { + + var userRule []interface{} + for _, userItem := range user { + userRule = append(userRule, userItem) + } + + logs, sub, err := _TaikoL1Client.contract.FilterLogs(opts, "BondWithdrawn", userRule) + if err != nil { + return nil, err + } + return &TaikoL1ClientBondWithdrawnIterator{contract: _TaikoL1Client.contract, event: "BondWithdrawn", logs: logs, sub: sub}, nil +} + +// WatchBondWithdrawn is a free log subscription operation binding the contract event 0x0d41118e36df44efb77a471fc49fb9c0be0406d802ef95520e9fbf606e65b455. +// +// Solidity: event BondWithdrawn(address indexed user, uint256 amount) +func (_TaikoL1Client *TaikoL1ClientFilterer) WatchBondWithdrawn(opts *bind.WatchOpts, sink chan<- *TaikoL1ClientBondWithdrawn, user []common.Address) (event.Subscription, error) { + + var userRule []interface{} + for _, userItem := range user { + userRule = append(userRule, userItem) + } + + logs, sub, err := _TaikoL1Client.contract.WatchLogs(opts, "BondWithdrawn", userRule) + 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(TaikoL1ClientBondWithdrawn) + if err := _TaikoL1Client.contract.UnpackLog(event, "BondWithdrawn", 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 +} + +// ParseBondWithdrawn is a log parse operation binding the contract event 0x0d41118e36df44efb77a471fc49fb9c0be0406d802ef95520e9fbf606e65b455. +// +// Solidity: event BondWithdrawn(address indexed user, uint256 amount) +func (_TaikoL1Client *TaikoL1ClientFilterer) ParseBondWithdrawn(log types.Log) (*TaikoL1ClientBondWithdrawn, error) { + event := new(TaikoL1ClientBondWithdrawn) + if err := _TaikoL1Client.contract.UnpackLog(event, "BondWithdrawn", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// TaikoL1ClientCalldataTxListIterator is returned from FilterCalldataTxList and is used to iterate over the raw logs and unpacked data for CalldataTxList events raised by the TaikoL1Client contract. +type TaikoL1ClientCalldataTxListIterator struct { + Event *TaikoL1ClientCalldataTxList // 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 *TaikoL1ClientCalldataTxListIterator) 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(TaikoL1ClientCalldataTxList) + 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(TaikoL1ClientCalldataTxList) + 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 *TaikoL1ClientCalldataTxListIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *TaikoL1ClientCalldataTxListIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// TaikoL1ClientCalldataTxList represents a CalldataTxList event raised by the TaikoL1Client contract. +type TaikoL1ClientCalldataTxList struct { + BlockId *big.Int + TxList []byte + Raw types.Log // Blockchain specific contextual infos +} + +// FilterCalldataTxList is a free log retrieval operation binding the contract event 0xa07bc5e8f00f6065c8727821591c519efd2348e4ff0c26560a85592e85b6f418. +// +// Solidity: event CalldataTxList(uint256 indexed blockId, bytes txList) +func (_TaikoL1Client *TaikoL1ClientFilterer) FilterCalldataTxList(opts *bind.FilterOpts, blockId []*big.Int) (*TaikoL1ClientCalldataTxListIterator, error) { + + var blockIdRule []interface{} + for _, blockIdItem := range blockId { + blockIdRule = append(blockIdRule, blockIdItem) + } + + logs, sub, err := _TaikoL1Client.contract.FilterLogs(opts, "CalldataTxList", blockIdRule) + if err != nil { + return nil, err + } + return &TaikoL1ClientCalldataTxListIterator{contract: _TaikoL1Client.contract, event: "CalldataTxList", logs: logs, sub: sub}, nil +} + +// WatchCalldataTxList is a free log subscription operation binding the contract event 0xa07bc5e8f00f6065c8727821591c519efd2348e4ff0c26560a85592e85b6f418. +// +// Solidity: event CalldataTxList(uint256 indexed blockId, bytes txList) +func (_TaikoL1Client *TaikoL1ClientFilterer) WatchCalldataTxList(opts *bind.WatchOpts, sink chan<- *TaikoL1ClientCalldataTxList, blockId []*big.Int) (event.Subscription, error) { + + var blockIdRule []interface{} + for _, blockIdItem := range blockId { + blockIdRule = append(blockIdRule, blockIdItem) + } - logs, sub, err := _TaikoL1Client.contract.WatchLogs(opts, "BlockVerified", blockIdRule, proverRule) + logs, sub, err := _TaikoL1Client.contract.WatchLogs(opts, "CalldataTxList", blockIdRule) if err != nil { return nil, err } @@ -1875,8 +3821,8 @@ func (_TaikoL1Client *TaikoL1ClientFilterer) WatchBlockVerified(opts *bind.Watch select { case log := <-logs: // New log arrived, parse the event and forward to the user - event := new(TaikoL1ClientBlockVerified) - if err := _TaikoL1Client.contract.UnpackLog(event, "BlockVerified", log); err != nil { + event := new(TaikoL1ClientCalldataTxList) + if err := _TaikoL1Client.contract.UnpackLog(event, "CalldataTxList", log); err != nil { return err } event.Raw = log @@ -1897,21 +3843,21 @@ func (_TaikoL1Client *TaikoL1ClientFilterer) WatchBlockVerified(opts *bind.Watch }), nil } -// ParseBlockVerified is a log parse operation binding the contract event 0xdecbd2c61cbda254917d6fd4c980a470701e8f9f1b744f6ad163ca70ca5db289. +// ParseCalldataTxList is a log parse operation binding the contract event 0xa07bc5e8f00f6065c8727821591c519efd2348e4ff0c26560a85592e85b6f418. // -// Solidity: event BlockVerified(uint256 indexed blockId, address indexed prover, bytes32 blockHash, bytes32 stateRoot, uint16 tier) -func (_TaikoL1Client *TaikoL1ClientFilterer) ParseBlockVerified(log types.Log) (*TaikoL1ClientBlockVerified, error) { - event := new(TaikoL1ClientBlockVerified) - if err := _TaikoL1Client.contract.UnpackLog(event, "BlockVerified", log); err != nil { +// Solidity: event CalldataTxList(uint256 indexed blockId, bytes txList) +func (_TaikoL1Client *TaikoL1ClientFilterer) ParseCalldataTxList(log types.Log) (*TaikoL1ClientCalldataTxList, error) { + event := new(TaikoL1ClientCalldataTxList) + if err := _TaikoL1Client.contract.UnpackLog(event, "CalldataTxList", log); err != nil { return nil, err } event.Raw = log return event, nil } -// TaikoL1ClientBlockVerified0Iterator is returned from FilterBlockVerified0 and is used to iterate over the raw logs and unpacked data for BlockVerified0 events raised by the TaikoL1Client contract. -type TaikoL1ClientBlockVerified0Iterator struct { - Event *TaikoL1ClientBlockVerified0 // Event containing the contract specifics and raw log +// TaikoL1ClientCalldataTxList0Iterator is returned from FilterCalldataTxList0 and is used to iterate over the raw logs and unpacked data for CalldataTxList0 events raised by the TaikoL1Client contract. +type TaikoL1ClientCalldataTxList0Iterator struct { + Event *TaikoL1ClientCalldataTxList0 // 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 @@ -1925,7 +3871,7 @@ type TaikoL1ClientBlockVerified0Iterator struct { // 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 *TaikoL1ClientBlockVerified0Iterator) Next() bool { +func (it *TaikoL1ClientCalldataTxList0Iterator) Next() bool { // If the iterator failed, stop iterating if it.fail != nil { return false @@ -1934,7 +3880,7 @@ func (it *TaikoL1ClientBlockVerified0Iterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(TaikoL1ClientBlockVerified0) + it.Event = new(TaikoL1ClientCalldataTxList0) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -1949,7 +3895,7 @@ func (it *TaikoL1ClientBlockVerified0Iterator) Next() bool { // Iterator still in progress, wait for either a data or an error event select { case log := <-it.logs: - it.Event = new(TaikoL1ClientBlockVerified0) + it.Event = new(TaikoL1ClientCalldataTxList0) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -1965,63 +3911,52 @@ func (it *TaikoL1ClientBlockVerified0Iterator) Next() bool { } // Error returns any retrieval or parsing error occurred during filtering. -func (it *TaikoL1ClientBlockVerified0Iterator) Error() error { +func (it *TaikoL1ClientCalldataTxList0Iterator) Error() error { return it.fail } // Close terminates the iteration process, releasing any pending underlying // resources. -func (it *TaikoL1ClientBlockVerified0Iterator) Close() error { +func (it *TaikoL1ClientCalldataTxList0Iterator) Close() error { it.sub.Unsubscribe() return nil } -// TaikoL1ClientBlockVerified0 represents a BlockVerified0 event raised by the TaikoL1Client contract. -type TaikoL1ClientBlockVerified0 struct { - BlockId *big.Int - Prover common.Address - BlockHash [32]byte - StateRoot [32]byte - Tier uint16 - Raw types.Log // Blockchain specific contextual infos +// TaikoL1ClientCalldataTxList0 represents a CalldataTxList0 event raised by the TaikoL1Client contract. +type TaikoL1ClientCalldataTxList0 struct { + BlockId *big.Int + TxList []byte + Raw types.Log // Blockchain specific contextual infos } -// FilterBlockVerified0 is a free log retrieval operation binding the contract event 0xdecbd2c61cbda254917d6fd4c980a470701e8f9f1b744f6ad163ca70ca5db289. +// FilterCalldataTxList0 is a free log retrieval operation binding the contract event 0xa07bc5e8f00f6065c8727821591c519efd2348e4ff0c26560a85592e85b6f418. // -// Solidity: event BlockVerified(uint256 indexed blockId, address indexed prover, bytes32 blockHash, bytes32 stateRoot, uint16 tier) -func (_TaikoL1Client *TaikoL1ClientFilterer) FilterBlockVerified0(opts *bind.FilterOpts, blockId []*big.Int, prover []common.Address) (*TaikoL1ClientBlockVerified0Iterator, error) { +// Solidity: event CalldataTxList(uint256 indexed blockId, bytes txList) +func (_TaikoL1Client *TaikoL1ClientFilterer) FilterCalldataTxList0(opts *bind.FilterOpts, blockId []*big.Int) (*TaikoL1ClientCalldataTxList0Iterator, error) { var blockIdRule []interface{} for _, blockIdItem := range blockId { blockIdRule = append(blockIdRule, blockIdItem) } - var proverRule []interface{} - for _, proverItem := range prover { - proverRule = append(proverRule, proverItem) - } - logs, sub, err := _TaikoL1Client.contract.FilterLogs(opts, "BlockVerified0", blockIdRule, proverRule) + logs, sub, err := _TaikoL1Client.contract.FilterLogs(opts, "CalldataTxList0", blockIdRule) if err != nil { return nil, err } - return &TaikoL1ClientBlockVerified0Iterator{contract: _TaikoL1Client.contract, event: "BlockVerified0", logs: logs, sub: sub}, nil + return &TaikoL1ClientCalldataTxList0Iterator{contract: _TaikoL1Client.contract, event: "CalldataTxList0", logs: logs, sub: sub}, nil } -// WatchBlockVerified0 is a free log subscription operation binding the contract event 0xdecbd2c61cbda254917d6fd4c980a470701e8f9f1b744f6ad163ca70ca5db289. +// WatchCalldataTxList0 is a free log subscription operation binding the contract event 0xa07bc5e8f00f6065c8727821591c519efd2348e4ff0c26560a85592e85b6f418. // -// Solidity: event BlockVerified(uint256 indexed blockId, address indexed prover, bytes32 blockHash, bytes32 stateRoot, uint16 tier) -func (_TaikoL1Client *TaikoL1ClientFilterer) WatchBlockVerified0(opts *bind.WatchOpts, sink chan<- *TaikoL1ClientBlockVerified0, blockId []*big.Int, prover []common.Address) (event.Subscription, error) { +// Solidity: event CalldataTxList(uint256 indexed blockId, bytes txList) +func (_TaikoL1Client *TaikoL1ClientFilterer) WatchCalldataTxList0(opts *bind.WatchOpts, sink chan<- *TaikoL1ClientCalldataTxList0, blockId []*big.Int) (event.Subscription, error) { var blockIdRule []interface{} for _, blockIdItem := range blockId { blockIdRule = append(blockIdRule, blockIdItem) } - var proverRule []interface{} - for _, proverItem := range prover { - proverRule = append(proverRule, proverItem) - } - logs, sub, err := _TaikoL1Client.contract.WatchLogs(opts, "BlockVerified0", blockIdRule, proverRule) + logs, sub, err := _TaikoL1Client.contract.WatchLogs(opts, "CalldataTxList0", blockIdRule) if err != nil { return nil, err } @@ -2031,8 +3966,8 @@ func (_TaikoL1Client *TaikoL1ClientFilterer) WatchBlockVerified0(opts *bind.Watc select { case log := <-logs: // New log arrived, parse the event and forward to the user - event := new(TaikoL1ClientBlockVerified0) - if err := _TaikoL1Client.contract.UnpackLog(event, "BlockVerified0", log); err != nil { + event := new(TaikoL1ClientCalldataTxList0) + if err := _TaikoL1Client.contract.UnpackLog(event, "CalldataTxList0", log); err != nil { return err } event.Raw = log @@ -2053,12 +3988,12 @@ func (_TaikoL1Client *TaikoL1ClientFilterer) WatchBlockVerified0(opts *bind.Watc }), nil } -// ParseBlockVerified0 is a log parse operation binding the contract event 0xdecbd2c61cbda254917d6fd4c980a470701e8f9f1b744f6ad163ca70ca5db289. +// ParseCalldataTxList0 is a log parse operation binding the contract event 0xa07bc5e8f00f6065c8727821591c519efd2348e4ff0c26560a85592e85b6f418. // -// Solidity: event BlockVerified(uint256 indexed blockId, address indexed prover, bytes32 blockHash, bytes32 stateRoot, uint16 tier) -func (_TaikoL1Client *TaikoL1ClientFilterer) ParseBlockVerified0(log types.Log) (*TaikoL1ClientBlockVerified0, error) { - event := new(TaikoL1ClientBlockVerified0) - if err := _TaikoL1Client.contract.UnpackLog(event, "BlockVerified0", log); err != nil { +// Solidity: event CalldataTxList(uint256 indexed blockId, bytes txList) +func (_TaikoL1Client *TaikoL1ClientFilterer) ParseCalldataTxList0(log types.Log) (*TaikoL1ClientCalldataTxList0, error) { + event := new(TaikoL1ClientCalldataTxList0) + if err := _TaikoL1Client.contract.UnpackLog(event, "CalldataTxList0", log); err != nil { return nil, err } event.Raw = log @@ -2773,140 +4708,6 @@ func (_TaikoL1Client *TaikoL1ClientFilterer) ParseProvingPaused(log types.Log) ( return event, nil } -// TaikoL1ClientProvingPaused0Iterator is returned from FilterProvingPaused0 and is used to iterate over the raw logs and unpacked data for ProvingPaused0 events raised by the TaikoL1Client contract. -type TaikoL1ClientProvingPaused0Iterator struct { - Event *TaikoL1ClientProvingPaused0 // 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 *TaikoL1ClientProvingPaused0Iterator) 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(TaikoL1ClientProvingPaused0) - 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(TaikoL1ClientProvingPaused0) - 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 *TaikoL1ClientProvingPaused0Iterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *TaikoL1ClientProvingPaused0Iterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// TaikoL1ClientProvingPaused0 represents a ProvingPaused0 event raised by the TaikoL1Client contract. -type TaikoL1ClientProvingPaused0 struct { - Paused bool - Raw types.Log // Blockchain specific contextual infos -} - -// FilterProvingPaused0 is a free log retrieval operation binding the contract event 0xed64db85835d07c3c990b8ebdd55e32d64e5ed53143b6ef2179e7bfaf17ddc3b. -// -// Solidity: event ProvingPaused(bool paused) -func (_TaikoL1Client *TaikoL1ClientFilterer) FilterProvingPaused0(opts *bind.FilterOpts) (*TaikoL1ClientProvingPaused0Iterator, error) { - - logs, sub, err := _TaikoL1Client.contract.FilterLogs(opts, "ProvingPaused0") - if err != nil { - return nil, err - } - return &TaikoL1ClientProvingPaused0Iterator{contract: _TaikoL1Client.contract, event: "ProvingPaused0", logs: logs, sub: sub}, nil -} - -// WatchProvingPaused0 is a free log subscription operation binding the contract event 0xed64db85835d07c3c990b8ebdd55e32d64e5ed53143b6ef2179e7bfaf17ddc3b. -// -// Solidity: event ProvingPaused(bool paused) -func (_TaikoL1Client *TaikoL1ClientFilterer) WatchProvingPaused0(opts *bind.WatchOpts, sink chan<- *TaikoL1ClientProvingPaused0) (event.Subscription, error) { - - logs, sub, err := _TaikoL1Client.contract.WatchLogs(opts, "ProvingPaused0") - 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(TaikoL1ClientProvingPaused0) - if err := _TaikoL1Client.contract.UnpackLog(event, "ProvingPaused0", 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 -} - -// ParseProvingPaused0 is a log parse operation binding the contract event 0xed64db85835d07c3c990b8ebdd55e32d64e5ed53143b6ef2179e7bfaf17ddc3b. -// -// Solidity: event ProvingPaused(bool paused) -func (_TaikoL1Client *TaikoL1ClientFilterer) ParseProvingPaused0(log types.Log) (*TaikoL1ClientProvingPaused0, error) { - event := new(TaikoL1ClientProvingPaused0) - if err := _TaikoL1Client.contract.UnpackLog(event, "ProvingPaused0", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - // TaikoL1ClientStateVariablesUpdatedIterator is returned from FilterStateVariablesUpdated and is used to iterate over the raw logs and unpacked data for StateVariablesUpdated events raised by the TaikoL1Client contract. type TaikoL1ClientStateVariablesUpdatedIterator struct { Event *TaikoL1ClientStateVariablesUpdated // Event containing the contract specifics and raw log @@ -2980,9 +4781,9 @@ type TaikoL1ClientStateVariablesUpdated struct { Raw types.Log // Blockchain specific contextual infos } -// FilterStateVariablesUpdated is a free log retrieval operation binding the contract event 0xdf66aee38ea9fe523cfd238705d455a354305a646748dbb931898b51cee4727b. +// FilterStateVariablesUpdated is a free log retrieval operation binding the contract event 0xb4be1a16d35fdd62eeaf9f552e025df3639847ddf2d61f011c72565056785ad2. // -// Solidity: event StateVariablesUpdated((uint64,uint64,bool,uint8,uint16,uint32,uint64) slotB) +// Solidity: event StateVariablesUpdated((uint64,uint64,bool,uint56,uint64) slotB) func (_TaikoL1Client *TaikoL1ClientFilterer) FilterStateVariablesUpdated(opts *bind.FilterOpts) (*TaikoL1ClientStateVariablesUpdatedIterator, error) { logs, sub, err := _TaikoL1Client.contract.FilterLogs(opts, "StateVariablesUpdated") @@ -2992,9 +4793,9 @@ func (_TaikoL1Client *TaikoL1ClientFilterer) FilterStateVariablesUpdated(opts *b return &TaikoL1ClientStateVariablesUpdatedIterator{contract: _TaikoL1Client.contract, event: "StateVariablesUpdated", logs: logs, sub: sub}, nil } -// WatchStateVariablesUpdated is a free log subscription operation binding the contract event 0xdf66aee38ea9fe523cfd238705d455a354305a646748dbb931898b51cee4727b. +// WatchStateVariablesUpdated is a free log subscription operation binding the contract event 0xb4be1a16d35fdd62eeaf9f552e025df3639847ddf2d61f011c72565056785ad2. // -// Solidity: event StateVariablesUpdated((uint64,uint64,bool,uint8,uint16,uint32,uint64) slotB) +// Solidity: event StateVariablesUpdated((uint64,uint64,bool,uint56,uint64) slotB) func (_TaikoL1Client *TaikoL1ClientFilterer) WatchStateVariablesUpdated(opts *bind.WatchOpts, sink chan<- *TaikoL1ClientStateVariablesUpdated) (event.Subscription, error) { logs, sub, err := _TaikoL1Client.contract.WatchLogs(opts, "StateVariablesUpdated") @@ -3029,9 +4830,9 @@ func (_TaikoL1Client *TaikoL1ClientFilterer) WatchStateVariablesUpdated(opts *bi }), nil } -// ParseStateVariablesUpdated is a log parse operation binding the contract event 0xdf66aee38ea9fe523cfd238705d455a354305a646748dbb931898b51cee4727b. +// ParseStateVariablesUpdated is a log parse operation binding the contract event 0xb4be1a16d35fdd62eeaf9f552e025df3639847ddf2d61f011c72565056785ad2. // -// Solidity: event StateVariablesUpdated((uint64,uint64,bool,uint8,uint16,uint32,uint64) slotB) +// Solidity: event StateVariablesUpdated((uint64,uint64,bool,uint56,uint64) slotB) func (_TaikoL1Client *TaikoL1ClientFilterer) ParseStateVariablesUpdated(log types.Log) (*TaikoL1ClientStateVariablesUpdated, error) { event := new(TaikoL1ClientStateVariablesUpdated) if err := _TaikoL1Client.contract.UnpackLog(event, "StateVariablesUpdated", log); err != nil { @@ -3041,140 +4842,6 @@ func (_TaikoL1Client *TaikoL1ClientFilterer) ParseStateVariablesUpdated(log type return event, nil } -// TaikoL1ClientStateVariablesUpdated0Iterator is returned from FilterStateVariablesUpdated0 and is used to iterate over the raw logs and unpacked data for StateVariablesUpdated0 events raised by the TaikoL1Client contract. -type TaikoL1ClientStateVariablesUpdated0Iterator struct { - Event *TaikoL1ClientStateVariablesUpdated0 // 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 *TaikoL1ClientStateVariablesUpdated0Iterator) 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(TaikoL1ClientStateVariablesUpdated0) - 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(TaikoL1ClientStateVariablesUpdated0) - 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 *TaikoL1ClientStateVariablesUpdated0Iterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *TaikoL1ClientStateVariablesUpdated0Iterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// TaikoL1ClientStateVariablesUpdated0 represents a StateVariablesUpdated0 event raised by the TaikoL1Client contract. -type TaikoL1ClientStateVariablesUpdated0 struct { - SlotB TaikoDataSlotB - Raw types.Log // Blockchain specific contextual infos -} - -// FilterStateVariablesUpdated0 is a free log retrieval operation binding the contract event 0xdf66aee38ea9fe523cfd238705d455a354305a646748dbb931898b51cee4727b. -// -// Solidity: event StateVariablesUpdated((uint64,uint64,bool,uint8,uint16,uint32,uint64) slotB) -func (_TaikoL1Client *TaikoL1ClientFilterer) FilterStateVariablesUpdated0(opts *bind.FilterOpts) (*TaikoL1ClientStateVariablesUpdated0Iterator, error) { - - logs, sub, err := _TaikoL1Client.contract.FilterLogs(opts, "StateVariablesUpdated0") - if err != nil { - return nil, err - } - return &TaikoL1ClientStateVariablesUpdated0Iterator{contract: _TaikoL1Client.contract, event: "StateVariablesUpdated0", logs: logs, sub: sub}, nil -} - -// WatchStateVariablesUpdated0 is a free log subscription operation binding the contract event 0xdf66aee38ea9fe523cfd238705d455a354305a646748dbb931898b51cee4727b. -// -// Solidity: event StateVariablesUpdated((uint64,uint64,bool,uint8,uint16,uint32,uint64) slotB) -func (_TaikoL1Client *TaikoL1ClientFilterer) WatchStateVariablesUpdated0(opts *bind.WatchOpts, sink chan<- *TaikoL1ClientStateVariablesUpdated0) (event.Subscription, error) { - - logs, sub, err := _TaikoL1Client.contract.WatchLogs(opts, "StateVariablesUpdated0") - 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(TaikoL1ClientStateVariablesUpdated0) - if err := _TaikoL1Client.contract.UnpackLog(event, "StateVariablesUpdated0", 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 -} - -// ParseStateVariablesUpdated0 is a log parse operation binding the contract event 0xdf66aee38ea9fe523cfd238705d455a354305a646748dbb931898b51cee4727b. -// -// Solidity: event StateVariablesUpdated((uint64,uint64,bool,uint8,uint16,uint32,uint64) slotB) -func (_TaikoL1Client *TaikoL1ClientFilterer) ParseStateVariablesUpdated0(log types.Log) (*TaikoL1ClientStateVariablesUpdated0, error) { - event := new(TaikoL1ClientStateVariablesUpdated0) - if err := _TaikoL1Client.contract.UnpackLog(event, "StateVariablesUpdated0", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - // TaikoL1ClientTransitionContestedIterator is returned from FilterTransitionContested and is used to iterate over the raw logs and unpacked data for TransitionContested events raised by the TaikoL1Client contract. type TaikoL1ClientTransitionContestedIterator struct { Event *TaikoL1ClientTransitionContested // Event containing the contract specifics and raw log @@ -3323,9 +4990,9 @@ func (_TaikoL1Client *TaikoL1ClientFilterer) ParseTransitionContested(log types. return event, nil } -// TaikoL1ClientTransitionContested0Iterator is returned from FilterTransitionContested0 and is used to iterate over the raw logs and unpacked data for TransitionContested0 events raised by the TaikoL1Client contract. -type TaikoL1ClientTransitionContested0Iterator struct { - Event *TaikoL1ClientTransitionContested0 // Event containing the contract specifics and raw log +// TaikoL1ClientTransitionContestedV2Iterator is returned from FilterTransitionContestedV2 and is used to iterate over the raw logs and unpacked data for TransitionContestedV2 events raised by the TaikoL1Client contract. +type TaikoL1ClientTransitionContestedV2Iterator struct { + Event *TaikoL1ClientTransitionContestedV2 // 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 @@ -3339,7 +5006,7 @@ type TaikoL1ClientTransitionContested0Iterator struct { // 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 *TaikoL1ClientTransitionContested0Iterator) Next() bool { +func (it *TaikoL1ClientTransitionContestedV2Iterator) Next() bool { // If the iterator failed, stop iterating if it.fail != nil { return false @@ -3348,7 +5015,7 @@ func (it *TaikoL1ClientTransitionContested0Iterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(TaikoL1ClientTransitionContested0) + it.Event = new(TaikoL1ClientTransitionContestedV2) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -3363,7 +5030,7 @@ func (it *TaikoL1ClientTransitionContested0Iterator) Next() bool { // Iterator still in progress, wait for either a data or an error event select { case log := <-it.logs: - it.Event = new(TaikoL1ClientTransitionContested0) + it.Event = new(TaikoL1ClientTransitionContestedV2) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -3379,55 +5046,56 @@ func (it *TaikoL1ClientTransitionContested0Iterator) Next() bool { } // Error returns any retrieval or parsing error occurred during filtering. -func (it *TaikoL1ClientTransitionContested0Iterator) Error() error { +func (it *TaikoL1ClientTransitionContestedV2Iterator) Error() error { return it.fail } // Close terminates the iteration process, releasing any pending underlying // resources. -func (it *TaikoL1ClientTransitionContested0Iterator) Close() error { +func (it *TaikoL1ClientTransitionContestedV2Iterator) Close() error { it.sub.Unsubscribe() return nil } -// TaikoL1ClientTransitionContested0 represents a TransitionContested0 event raised by the TaikoL1Client contract. -type TaikoL1ClientTransitionContested0 struct { +// TaikoL1ClientTransitionContestedV2 represents a TransitionContestedV2 event raised by the TaikoL1Client contract. +type TaikoL1ClientTransitionContestedV2 struct { BlockId *big.Int Tran TaikoDataTransition Contester common.Address ContestBond *big.Int Tier uint16 + ProposedIn uint64 Raw types.Log // Blockchain specific contextual infos } -// FilterTransitionContested0 is a free log retrieval operation binding the contract event 0xb4c0a86c1ff239277697775b1e91d3375fd3a5ef6b345aa4e2f6001c890558f6. +// FilterTransitionContestedV2 is a free log retrieval operation binding the contract event 0x53b2379d5e9bcacdfe56b4a51c3fd92ebfff4b1e8e8638f7f7e85163260a6f99. // -// Solidity: event TransitionContested(uint256 indexed blockId, (bytes32,bytes32,bytes32,bytes32) tran, address contester, uint96 contestBond, uint16 tier) -func (_TaikoL1Client *TaikoL1ClientFilterer) FilterTransitionContested0(opts *bind.FilterOpts, blockId []*big.Int) (*TaikoL1ClientTransitionContested0Iterator, error) { +// Solidity: event TransitionContestedV2(uint256 indexed blockId, (bytes32,bytes32,bytes32,bytes32) tran, address contester, uint96 contestBond, uint16 tier, uint64 proposedIn) +func (_TaikoL1Client *TaikoL1ClientFilterer) FilterTransitionContestedV2(opts *bind.FilterOpts, blockId []*big.Int) (*TaikoL1ClientTransitionContestedV2Iterator, error) { var blockIdRule []interface{} for _, blockIdItem := range blockId { blockIdRule = append(blockIdRule, blockIdItem) } - logs, sub, err := _TaikoL1Client.contract.FilterLogs(opts, "TransitionContested0", blockIdRule) + logs, sub, err := _TaikoL1Client.contract.FilterLogs(opts, "TransitionContestedV2", blockIdRule) if err != nil { return nil, err } - return &TaikoL1ClientTransitionContested0Iterator{contract: _TaikoL1Client.contract, event: "TransitionContested0", logs: logs, sub: sub}, nil + return &TaikoL1ClientTransitionContestedV2Iterator{contract: _TaikoL1Client.contract, event: "TransitionContestedV2", logs: logs, sub: sub}, nil } -// WatchTransitionContested0 is a free log subscription operation binding the contract event 0xb4c0a86c1ff239277697775b1e91d3375fd3a5ef6b345aa4e2f6001c890558f6. +// WatchTransitionContestedV2 is a free log subscription operation binding the contract event 0x53b2379d5e9bcacdfe56b4a51c3fd92ebfff4b1e8e8638f7f7e85163260a6f99. // -// Solidity: event TransitionContested(uint256 indexed blockId, (bytes32,bytes32,bytes32,bytes32) tran, address contester, uint96 contestBond, uint16 tier) -func (_TaikoL1Client *TaikoL1ClientFilterer) WatchTransitionContested0(opts *bind.WatchOpts, sink chan<- *TaikoL1ClientTransitionContested0, blockId []*big.Int) (event.Subscription, error) { +// Solidity: event TransitionContestedV2(uint256 indexed blockId, (bytes32,bytes32,bytes32,bytes32) tran, address contester, uint96 contestBond, uint16 tier, uint64 proposedIn) +func (_TaikoL1Client *TaikoL1ClientFilterer) WatchTransitionContestedV2(opts *bind.WatchOpts, sink chan<- *TaikoL1ClientTransitionContestedV2, blockId []*big.Int) (event.Subscription, error) { var blockIdRule []interface{} for _, blockIdItem := range blockId { blockIdRule = append(blockIdRule, blockIdItem) } - logs, sub, err := _TaikoL1Client.contract.WatchLogs(opts, "TransitionContested0", blockIdRule) + logs, sub, err := _TaikoL1Client.contract.WatchLogs(opts, "TransitionContestedV2", blockIdRule) if err != nil { return nil, err } @@ -3437,8 +5105,8 @@ func (_TaikoL1Client *TaikoL1ClientFilterer) WatchTransitionContested0(opts *bin select { case log := <-logs: // New log arrived, parse the event and forward to the user - event := new(TaikoL1ClientTransitionContested0) - if err := _TaikoL1Client.contract.UnpackLog(event, "TransitionContested0", log); err != nil { + event := new(TaikoL1ClientTransitionContestedV2) + if err := _TaikoL1Client.contract.UnpackLog(event, "TransitionContestedV2", log); err != nil { return err } event.Raw = log @@ -3459,12 +5127,12 @@ func (_TaikoL1Client *TaikoL1ClientFilterer) WatchTransitionContested0(opts *bin }), nil } -// ParseTransitionContested0 is a log parse operation binding the contract event 0xb4c0a86c1ff239277697775b1e91d3375fd3a5ef6b345aa4e2f6001c890558f6. +// ParseTransitionContestedV2 is a log parse operation binding the contract event 0x53b2379d5e9bcacdfe56b4a51c3fd92ebfff4b1e8e8638f7f7e85163260a6f99. // -// Solidity: event TransitionContested(uint256 indexed blockId, (bytes32,bytes32,bytes32,bytes32) tran, address contester, uint96 contestBond, uint16 tier) -func (_TaikoL1Client *TaikoL1ClientFilterer) ParseTransitionContested0(log types.Log) (*TaikoL1ClientTransitionContested0, error) { - event := new(TaikoL1ClientTransitionContested0) - if err := _TaikoL1Client.contract.UnpackLog(event, "TransitionContested0", log); err != nil { +// Solidity: event TransitionContestedV2(uint256 indexed blockId, (bytes32,bytes32,bytes32,bytes32) tran, address contester, uint96 contestBond, uint16 tier, uint64 proposedIn) +func (_TaikoL1Client *TaikoL1ClientFilterer) ParseTransitionContestedV2(log types.Log) (*TaikoL1ClientTransitionContestedV2, error) { + event := new(TaikoL1ClientTransitionContestedV2) + if err := _TaikoL1Client.contract.UnpackLog(event, "TransitionContestedV2", log); err != nil { return nil, err } event.Raw = log @@ -3619,9 +5287,9 @@ func (_TaikoL1Client *TaikoL1ClientFilterer) ParseTransitionProved(log types.Log return event, nil } -// TaikoL1ClientTransitionProved0Iterator is returned from FilterTransitionProved0 and is used to iterate over the raw logs and unpacked data for TransitionProved0 events raised by the TaikoL1Client contract. -type TaikoL1ClientTransitionProved0Iterator struct { - Event *TaikoL1ClientTransitionProved0 // Event containing the contract specifics and raw log +// TaikoL1ClientTransitionProvedV2Iterator is returned from FilterTransitionProvedV2 and is used to iterate over the raw logs and unpacked data for TransitionProvedV2 events raised by the TaikoL1Client contract. +type TaikoL1ClientTransitionProvedV2Iterator struct { + Event *TaikoL1ClientTransitionProvedV2 // 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 @@ -3635,7 +5303,7 @@ type TaikoL1ClientTransitionProved0Iterator struct { // 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 *TaikoL1ClientTransitionProved0Iterator) Next() bool { +func (it *TaikoL1ClientTransitionProvedV2Iterator) Next() bool { // If the iterator failed, stop iterating if it.fail != nil { return false @@ -3644,7 +5312,7 @@ func (it *TaikoL1ClientTransitionProved0Iterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(TaikoL1ClientTransitionProved0) + it.Event = new(TaikoL1ClientTransitionProvedV2) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -3659,7 +5327,7 @@ func (it *TaikoL1ClientTransitionProved0Iterator) Next() bool { // Iterator still in progress, wait for either a data or an error event select { case log := <-it.logs: - it.Event = new(TaikoL1ClientTransitionProved0) + it.Event = new(TaikoL1ClientTransitionProvedV2) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -3675,55 +5343,56 @@ func (it *TaikoL1ClientTransitionProved0Iterator) Next() bool { } // Error returns any retrieval or parsing error occurred during filtering. -func (it *TaikoL1ClientTransitionProved0Iterator) Error() error { +func (it *TaikoL1ClientTransitionProvedV2Iterator) Error() error { return it.fail } // Close terminates the iteration process, releasing any pending underlying // resources. -func (it *TaikoL1ClientTransitionProved0Iterator) Close() error { +func (it *TaikoL1ClientTransitionProvedV2Iterator) Close() error { it.sub.Unsubscribe() return nil } -// TaikoL1ClientTransitionProved0 represents a TransitionProved0 event raised by the TaikoL1Client contract. -type TaikoL1ClientTransitionProved0 struct { +// TaikoL1ClientTransitionProvedV2 represents a TransitionProvedV2 event raised by the TaikoL1Client contract. +type TaikoL1ClientTransitionProvedV2 struct { BlockId *big.Int Tran TaikoDataTransition Prover common.Address ValidityBond *big.Int Tier uint16 + ProposedIn uint64 Raw types.Log // Blockchain specific contextual infos } -// FilterTransitionProved0 is a free log retrieval operation binding the contract event 0xc195e4be3b936845492b8be4b1cf604db687a4d79ad84d979499c136f8e6701f. +// FilterTransitionProvedV2 is a free log retrieval operation binding the contract event 0x11a9112e5724f21b226e2535a95a264a80c9626ed4c0923faaa9fa6556467488. // -// Solidity: event TransitionProved(uint256 indexed blockId, (bytes32,bytes32,bytes32,bytes32) tran, address prover, uint96 validityBond, uint16 tier) -func (_TaikoL1Client *TaikoL1ClientFilterer) FilterTransitionProved0(opts *bind.FilterOpts, blockId []*big.Int) (*TaikoL1ClientTransitionProved0Iterator, error) { +// Solidity: event TransitionProvedV2(uint256 indexed blockId, (bytes32,bytes32,bytes32,bytes32) tran, address prover, uint96 validityBond, uint16 tier, uint64 proposedIn) +func (_TaikoL1Client *TaikoL1ClientFilterer) FilterTransitionProvedV2(opts *bind.FilterOpts, blockId []*big.Int) (*TaikoL1ClientTransitionProvedV2Iterator, error) { var blockIdRule []interface{} for _, blockIdItem := range blockId { blockIdRule = append(blockIdRule, blockIdItem) } - logs, sub, err := _TaikoL1Client.contract.FilterLogs(opts, "TransitionProved0", blockIdRule) + logs, sub, err := _TaikoL1Client.contract.FilterLogs(opts, "TransitionProvedV2", blockIdRule) if err != nil { return nil, err } - return &TaikoL1ClientTransitionProved0Iterator{contract: _TaikoL1Client.contract, event: "TransitionProved0", logs: logs, sub: sub}, nil + return &TaikoL1ClientTransitionProvedV2Iterator{contract: _TaikoL1Client.contract, event: "TransitionProvedV2", logs: logs, sub: sub}, nil } -// WatchTransitionProved0 is a free log subscription operation binding the contract event 0xc195e4be3b936845492b8be4b1cf604db687a4d79ad84d979499c136f8e6701f. +// WatchTransitionProvedV2 is a free log subscription operation binding the contract event 0x11a9112e5724f21b226e2535a95a264a80c9626ed4c0923faaa9fa6556467488. // -// Solidity: event TransitionProved(uint256 indexed blockId, (bytes32,bytes32,bytes32,bytes32) tran, address prover, uint96 validityBond, uint16 tier) -func (_TaikoL1Client *TaikoL1ClientFilterer) WatchTransitionProved0(opts *bind.WatchOpts, sink chan<- *TaikoL1ClientTransitionProved0, blockId []*big.Int) (event.Subscription, error) { +// Solidity: event TransitionProvedV2(uint256 indexed blockId, (bytes32,bytes32,bytes32,bytes32) tran, address prover, uint96 validityBond, uint16 tier, uint64 proposedIn) +func (_TaikoL1Client *TaikoL1ClientFilterer) WatchTransitionProvedV2(opts *bind.WatchOpts, sink chan<- *TaikoL1ClientTransitionProvedV2, blockId []*big.Int) (event.Subscription, error) { var blockIdRule []interface{} for _, blockIdItem := range blockId { blockIdRule = append(blockIdRule, blockIdItem) } - logs, sub, err := _TaikoL1Client.contract.WatchLogs(opts, "TransitionProved0", blockIdRule) + logs, sub, err := _TaikoL1Client.contract.WatchLogs(opts, "TransitionProvedV2", blockIdRule) if err != nil { return nil, err } @@ -3733,8 +5402,8 @@ func (_TaikoL1Client *TaikoL1ClientFilterer) WatchTransitionProved0(opts *bind.W select { case log := <-logs: // New log arrived, parse the event and forward to the user - event := new(TaikoL1ClientTransitionProved0) - if err := _TaikoL1Client.contract.UnpackLog(event, "TransitionProved0", log); err != nil { + event := new(TaikoL1ClientTransitionProvedV2) + if err := _TaikoL1Client.contract.UnpackLog(event, "TransitionProvedV2", log); err != nil { return err } event.Raw = log @@ -3755,12 +5424,12 @@ func (_TaikoL1Client *TaikoL1ClientFilterer) WatchTransitionProved0(opts *bind.W }), nil } -// ParseTransitionProved0 is a log parse operation binding the contract event 0xc195e4be3b936845492b8be4b1cf604db687a4d79ad84d979499c136f8e6701f. +// ParseTransitionProvedV2 is a log parse operation binding the contract event 0x11a9112e5724f21b226e2535a95a264a80c9626ed4c0923faaa9fa6556467488. // -// Solidity: event TransitionProved(uint256 indexed blockId, (bytes32,bytes32,bytes32,bytes32) tran, address prover, uint96 validityBond, uint16 tier) -func (_TaikoL1Client *TaikoL1ClientFilterer) ParseTransitionProved0(log types.Log) (*TaikoL1ClientTransitionProved0, error) { - event := new(TaikoL1ClientTransitionProved0) - if err := _TaikoL1Client.contract.UnpackLog(event, "TransitionProved0", log); err != nil { +// Solidity: event TransitionProvedV2(uint256 indexed blockId, (bytes32,bytes32,bytes32,bytes32) tran, address prover, uint96 validityBond, uint16 tier, uint64 proposedIn) +func (_TaikoL1Client *TaikoL1ClientFilterer) ParseTransitionProvedV2(log types.Log) (*TaikoL1ClientTransitionProvedV2, error) { + event := new(TaikoL1ClientTransitionProvedV2) + if err := _TaikoL1Client.contract.UnpackLog(event, "TransitionProvedV2", log); err != nil { return nil, err } event.Raw = log diff --git a/packages/taiko-client/bindings/gen_taiko_l2.go b/packages/taiko-client/bindings/gen_taiko_l2.go index 677a2bbe24c..9a40b4c2830 100644 --- a/packages/taiko-client/bindings/gen_taiko_l2.go +++ b/packages/taiko-client/bindings/gen_taiko_l2.go @@ -29,15 +29,9 @@ var ( _ = abi.ConvertType ) -// LibL2ConfigConfig is an auto generated low-level Go binding around an user-defined struct. -type LibL2ConfigConfig struct { - GasTargetPerL1Block uint32 - BasefeeAdjustmentQuotient uint8 -} - // TaikoL2ClientMetaData contains all meta data concerning the TaikoL2Client contract. var TaikoL2ClientMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"function\",\"name\":\"GOLDEN_TOUCH_ADDRESS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addressManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"anchor\",\"inputs\":[{\"name\":\"_l1BlockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_l1StateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_l1BlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_parentGasUsed\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"gasExcess\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getBasefee\",\"inputs\":[{\"name\":\"_l1BlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_parentGasUsed\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"basefee_\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"gasExcess_\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getBlockHash\",\"inputs\":[{\"name\":\"_blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getConfig\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structLibL2Config.Config\",\"components\":[{\"name\":\"gasTargetPerL1Block\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"basefeeAdjustmentQuotient\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"impl\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"inNonReentrant\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"init\",\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_addressManager\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_l1ChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_gasExcess\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"l1ChainId\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"l2Hashes\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"lastSyncedBlock\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"publicInputHash\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"skipFeeCheck\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeTo\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"withdraw\",\"inputs\":[{\"name\":\"_token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_to\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AdminChanged\",\"inputs\":[{\"name\":\"previousAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Anchored\",\"inputs\":[{\"name\":\"parentHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"gasExcess\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconUpgraded\",\"inputs\":[{\"name\":\"beacon\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"EIP1559_INVALID_PARAMS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ETH_TRANSFER_FAILED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FUNC_NOT_IMPLEMENTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L2_BASEFEE_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L2_INVALID_L1_CHAIN_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L2_INVALID_L2_CHAIN_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L2_INVALID_PARAM\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L2_INVALID_SENDER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L2_PUBLIC_INPUT_HASH_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L2_TOO_LATE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"Overflow\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"REENTRANT_CALL\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_INVALID_MANAGER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_UNEXPECTED_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_ZERO_ADDR\",\"inputs\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ZERO_ADDRESS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_VALUE\",\"inputs\":[]}]", + ABI: "[{\"type\":\"function\",\"name\":\"GOLDEN_TOUCH_ADDRESS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addressManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"adjustExcess\",\"inputs\":[{\"name\":\"_currGasExcess\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_currGasTarget\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_newGasTarget\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"newGasExcess_\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"anchor\",\"inputs\":[{\"name\":\"_l1BlockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_l1StateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_l1BlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_parentGasUsed\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"anchorV2\",\"inputs\":[{\"name\":\"_anchorBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_anchorStateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_parentGasUsed\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_baseFeeConfig\",\"type\":\"tuple\",\"internalType\":\"structLibSharedData.BaseFeeConfig\",\"components\":[{\"name\":\"adjustmentQuotient\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"sharingPctg\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"gasIssuancePerSecond\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"minGasExcess\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxGasIssuancePerBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"calculateBaseFee\",\"inputs\":[{\"name\":\"_baseFeeConfig\",\"type\":\"tuple\",\"internalType\":\"structLibSharedData.BaseFeeConfig\",\"components\":[{\"name\":\"adjustmentQuotient\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"sharingPctg\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"gasIssuancePerSecond\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"minGasExcess\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxGasIssuancePerBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"_blocktime\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_parentGasExcess\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_parentGasUsed\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"basefee_\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"parentGasExcess_\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"getBasefee\",\"inputs\":[{\"name\":\"_anchorBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_parentGasUsed\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"basefee_\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"parentGasExcess_\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"getBasefeeV2\",\"inputs\":[{\"name\":\"_parentGasUsed\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_blockTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_baseFeeConfig\",\"type\":\"tuple\",\"internalType\":\"structLibSharedData.BaseFeeConfig\",\"components\":[{\"name\":\"adjustmentQuotient\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"sharingPctg\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"gasIssuancePerSecond\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"minGasExcess\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxGasIssuancePerBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"basefee_\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"newGasTarget_\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"newGasExcess_\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getBlockHash\",\"inputs\":[{\"name\":\"_blockId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"impl\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"inNonReentrant\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"init\",\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_rollupAddressManager\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_l1ChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_initialGasExcess\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"l1ChainId\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"lastSyncedBlock\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ontakeForkHeight\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"parentGasExcess\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"parentGasTarget\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"parentTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"publicInputHash\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"skipFeeCheck\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeTo\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"withdraw\",\"inputs\":[{\"name\":\"_token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_to\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AdminChanged\",\"inputs\":[{\"name\":\"previousAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Anchored\",\"inputs\":[{\"name\":\"parentHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"parentGasExcess\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconUpgraded\",\"inputs\":[{\"name\":\"beacon\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"EIP1559Update\",\"inputs\":[{\"name\":\"oldGasTarget\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"newGasTarget\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"oldGasExcess\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"newGasExcess\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"basefee\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"ETH_TRANSFER_FAILED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FUNC_NOT_IMPLEMENTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L2_BASEFEE_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L2_DEPRECATED_METHOD\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L2_FORK_ERROR\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L2_INVALID_L1_CHAIN_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L2_INVALID_L2_CHAIN_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L2_INVALID_PARAM\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L2_INVALID_SENDER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L2_PUBLIC_INPUT_HASH_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L2_TOO_LATE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"REENTRANT_CALL\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_INVALID_MANAGER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_UNEXPECTED_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_ZERO_ADDR\",\"inputs\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ZERO_ADDRESS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_VALUE\",\"inputs\":[]}]", } // TaikoL2ClientABI is the input ABI used to generate the binding from. @@ -248,12 +242,12 @@ func (_TaikoL2Client *TaikoL2ClientCallerSession) AddressManager() (common.Addre return _TaikoL2Client.Contract.AddressManager(&_TaikoL2Client.CallOpts) } -// GasExcess is a free data retrieval call binding the contract method 0xf535bd56. +// AdjustExcess is a free data retrieval call binding the contract method 0x136dc4a8. // -// Solidity: function gasExcess() view returns(uint64) -func (_TaikoL2Client *TaikoL2ClientCaller) GasExcess(opts *bind.CallOpts) (uint64, error) { +// Solidity: function adjustExcess(uint64 _currGasExcess, uint64 _currGasTarget, uint64 _newGasTarget) pure returns(uint64 newGasExcess_) +func (_TaikoL2Client *TaikoL2ClientCaller) AdjustExcess(opts *bind.CallOpts, _currGasExcess uint64, _currGasTarget uint64, _newGasTarget uint64) (uint64, error) { var out []interface{} - err := _TaikoL2Client.contract.Call(opts, &out, "gasExcess") + err := _TaikoL2Client.contract.Call(opts, &out, "adjustExcess", _currGasExcess, _currGasTarget, _newGasTarget) if err != nil { return *new(uint64), err @@ -265,40 +259,85 @@ func (_TaikoL2Client *TaikoL2ClientCaller) GasExcess(opts *bind.CallOpts) (uint6 } -// GasExcess is a free data retrieval call binding the contract method 0xf535bd56. +// AdjustExcess is a free data retrieval call binding the contract method 0x136dc4a8. +// +// Solidity: function adjustExcess(uint64 _currGasExcess, uint64 _currGasTarget, uint64 _newGasTarget) pure returns(uint64 newGasExcess_) +func (_TaikoL2Client *TaikoL2ClientSession) AdjustExcess(_currGasExcess uint64, _currGasTarget uint64, _newGasTarget uint64) (uint64, error) { + return _TaikoL2Client.Contract.AdjustExcess(&_TaikoL2Client.CallOpts, _currGasExcess, _currGasTarget, _newGasTarget) +} + +// AdjustExcess is a free data retrieval call binding the contract method 0x136dc4a8. +// +// Solidity: function adjustExcess(uint64 _currGasExcess, uint64 _currGasTarget, uint64 _newGasTarget) pure returns(uint64 newGasExcess_) +func (_TaikoL2Client *TaikoL2ClientCallerSession) AdjustExcess(_currGasExcess uint64, _currGasTarget uint64, _newGasTarget uint64) (uint64, error) { + return _TaikoL2Client.Contract.AdjustExcess(&_TaikoL2Client.CallOpts, _currGasExcess, _currGasTarget, _newGasTarget) +} + +// CalculateBaseFee is a free data retrieval call binding the contract method 0xe902461a. +// +// Solidity: function calculateBaseFee((uint8,uint8,uint32,uint64,uint32) _baseFeeConfig, uint64 _blocktime, uint64 _parentGasExcess, uint32 _parentGasUsed) pure returns(uint256 basefee_, uint64 parentGasExcess_) +func (_TaikoL2Client *TaikoL2ClientCaller) CalculateBaseFee(opts *bind.CallOpts, _baseFeeConfig LibSharedDataBaseFeeConfig, _blocktime uint64, _parentGasExcess uint64, _parentGasUsed uint32) (struct { + Basefee *big.Int + ParentGasExcess uint64 +}, error) { + var out []interface{} + err := _TaikoL2Client.contract.Call(opts, &out, "calculateBaseFee", _baseFeeConfig, _blocktime, _parentGasExcess, _parentGasUsed) + + outstruct := new(struct { + Basefee *big.Int + ParentGasExcess uint64 + }) + if err != nil { + return *outstruct, err + } + + outstruct.Basefee = *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + outstruct.ParentGasExcess = *abi.ConvertType(out[1], new(uint64)).(*uint64) + + return *outstruct, err + +} + +// CalculateBaseFee is a free data retrieval call binding the contract method 0xe902461a. // -// Solidity: function gasExcess() view returns(uint64) -func (_TaikoL2Client *TaikoL2ClientSession) GasExcess() (uint64, error) { - return _TaikoL2Client.Contract.GasExcess(&_TaikoL2Client.CallOpts) +// Solidity: function calculateBaseFee((uint8,uint8,uint32,uint64,uint32) _baseFeeConfig, uint64 _blocktime, uint64 _parentGasExcess, uint32 _parentGasUsed) pure returns(uint256 basefee_, uint64 parentGasExcess_) +func (_TaikoL2Client *TaikoL2ClientSession) CalculateBaseFee(_baseFeeConfig LibSharedDataBaseFeeConfig, _blocktime uint64, _parentGasExcess uint64, _parentGasUsed uint32) (struct { + Basefee *big.Int + ParentGasExcess uint64 +}, error) { + return _TaikoL2Client.Contract.CalculateBaseFee(&_TaikoL2Client.CallOpts, _baseFeeConfig, _blocktime, _parentGasExcess, _parentGasUsed) } -// GasExcess is a free data retrieval call binding the contract method 0xf535bd56. +// CalculateBaseFee is a free data retrieval call binding the contract method 0xe902461a. // -// Solidity: function gasExcess() view returns(uint64) -func (_TaikoL2Client *TaikoL2ClientCallerSession) GasExcess() (uint64, error) { - return _TaikoL2Client.Contract.GasExcess(&_TaikoL2Client.CallOpts) +// Solidity: function calculateBaseFee((uint8,uint8,uint32,uint64,uint32) _baseFeeConfig, uint64 _blocktime, uint64 _parentGasExcess, uint32 _parentGasUsed) pure returns(uint256 basefee_, uint64 parentGasExcess_) +func (_TaikoL2Client *TaikoL2ClientCallerSession) CalculateBaseFee(_baseFeeConfig LibSharedDataBaseFeeConfig, _blocktime uint64, _parentGasExcess uint64, _parentGasUsed uint32) (struct { + Basefee *big.Int + ParentGasExcess uint64 +}, error) { + return _TaikoL2Client.Contract.CalculateBaseFee(&_TaikoL2Client.CallOpts, _baseFeeConfig, _blocktime, _parentGasExcess, _parentGasUsed) } // GetBasefee is a free data retrieval call binding the contract method 0xa7e022d1. // -// Solidity: function getBasefee(uint64 _l1BlockId, uint32 _parentGasUsed) view returns(uint256 basefee_, uint64 gasExcess_) -func (_TaikoL2Client *TaikoL2ClientCaller) GetBasefee(opts *bind.CallOpts, _l1BlockId uint64, _parentGasUsed uint32) (struct { - Basefee *big.Int - GasExcess uint64 +// Solidity: function getBasefee(uint64 _anchorBlockId, uint32 _parentGasUsed) pure returns(uint256 basefee_, uint64 parentGasExcess_) +func (_TaikoL2Client *TaikoL2ClientCaller) GetBasefee(opts *bind.CallOpts, _anchorBlockId uint64, _parentGasUsed uint32) (struct { + Basefee *big.Int + ParentGasExcess uint64 }, error) { var out []interface{} - err := _TaikoL2Client.contract.Call(opts, &out, "getBasefee", _l1BlockId, _parentGasUsed) + err := _TaikoL2Client.contract.Call(opts, &out, "getBasefee", _anchorBlockId, _parentGasUsed) outstruct := new(struct { - Basefee *big.Int - GasExcess uint64 + Basefee *big.Int + ParentGasExcess uint64 }) if err != nil { return *outstruct, err } outstruct.Basefee = *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) - outstruct.GasExcess = *abi.ConvertType(out[1], new(uint64)).(*uint64) + outstruct.ParentGasExcess = *abi.ConvertType(out[1], new(uint64)).(*uint64) return *outstruct, err @@ -306,84 +345,103 @@ func (_TaikoL2Client *TaikoL2ClientCaller) GetBasefee(opts *bind.CallOpts, _l1Bl // GetBasefee is a free data retrieval call binding the contract method 0xa7e022d1. // -// Solidity: function getBasefee(uint64 _l1BlockId, uint32 _parentGasUsed) view returns(uint256 basefee_, uint64 gasExcess_) -func (_TaikoL2Client *TaikoL2ClientSession) GetBasefee(_l1BlockId uint64, _parentGasUsed uint32) (struct { - Basefee *big.Int - GasExcess uint64 +// Solidity: function getBasefee(uint64 _anchorBlockId, uint32 _parentGasUsed) pure returns(uint256 basefee_, uint64 parentGasExcess_) +func (_TaikoL2Client *TaikoL2ClientSession) GetBasefee(_anchorBlockId uint64, _parentGasUsed uint32) (struct { + Basefee *big.Int + ParentGasExcess uint64 }, error) { - return _TaikoL2Client.Contract.GetBasefee(&_TaikoL2Client.CallOpts, _l1BlockId, _parentGasUsed) + return _TaikoL2Client.Contract.GetBasefee(&_TaikoL2Client.CallOpts, _anchorBlockId, _parentGasUsed) } // GetBasefee is a free data retrieval call binding the contract method 0xa7e022d1. // -// Solidity: function getBasefee(uint64 _l1BlockId, uint32 _parentGasUsed) view returns(uint256 basefee_, uint64 gasExcess_) -func (_TaikoL2Client *TaikoL2ClientCallerSession) GetBasefee(_l1BlockId uint64, _parentGasUsed uint32) (struct { - Basefee *big.Int - GasExcess uint64 +// Solidity: function getBasefee(uint64 _anchorBlockId, uint32 _parentGasUsed) pure returns(uint256 basefee_, uint64 parentGasExcess_) +func (_TaikoL2Client *TaikoL2ClientCallerSession) GetBasefee(_anchorBlockId uint64, _parentGasUsed uint32) (struct { + Basefee *big.Int + ParentGasExcess uint64 }, error) { - return _TaikoL2Client.Contract.GetBasefee(&_TaikoL2Client.CallOpts, _l1BlockId, _parentGasUsed) + return _TaikoL2Client.Contract.GetBasefee(&_TaikoL2Client.CallOpts, _anchorBlockId, _parentGasUsed) } -// GetBlockHash is a free data retrieval call binding the contract method 0x23ac7136. +// GetBasefeeV2 is a free data retrieval call binding the contract method 0x893f5460. // -// Solidity: function getBlockHash(uint64 _blockId) view returns(bytes32) -func (_TaikoL2Client *TaikoL2ClientCaller) GetBlockHash(opts *bind.CallOpts, _blockId uint64) ([32]byte, error) { +// Solidity: function getBasefeeV2(uint32 _parentGasUsed, uint64 _blockTimestamp, (uint8,uint8,uint32,uint64,uint32) _baseFeeConfig) view returns(uint256 basefee_, uint64 newGasTarget_, uint64 newGasExcess_) +func (_TaikoL2Client *TaikoL2ClientCaller) GetBasefeeV2(opts *bind.CallOpts, _parentGasUsed uint32, _blockTimestamp uint64, _baseFeeConfig LibSharedDataBaseFeeConfig) (struct { + Basefee *big.Int + NewGasTarget uint64 + NewGasExcess uint64 +}, error) { var out []interface{} - err := _TaikoL2Client.contract.Call(opts, &out, "getBlockHash", _blockId) + err := _TaikoL2Client.contract.Call(opts, &out, "getBasefeeV2", _parentGasUsed, _blockTimestamp, _baseFeeConfig) + outstruct := new(struct { + Basefee *big.Int + NewGasTarget uint64 + NewGasExcess uint64 + }) if err != nil { - return *new([32]byte), err + return *outstruct, err } - out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) + outstruct.Basefee = *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + outstruct.NewGasTarget = *abi.ConvertType(out[1], new(uint64)).(*uint64) + outstruct.NewGasExcess = *abi.ConvertType(out[2], new(uint64)).(*uint64) - return out0, err + return *outstruct, err } -// GetBlockHash is a free data retrieval call binding the contract method 0x23ac7136. +// GetBasefeeV2 is a free data retrieval call binding the contract method 0x893f5460. // -// Solidity: function getBlockHash(uint64 _blockId) view returns(bytes32) -func (_TaikoL2Client *TaikoL2ClientSession) GetBlockHash(_blockId uint64) ([32]byte, error) { - return _TaikoL2Client.Contract.GetBlockHash(&_TaikoL2Client.CallOpts, _blockId) +// Solidity: function getBasefeeV2(uint32 _parentGasUsed, uint64 _blockTimestamp, (uint8,uint8,uint32,uint64,uint32) _baseFeeConfig) view returns(uint256 basefee_, uint64 newGasTarget_, uint64 newGasExcess_) +func (_TaikoL2Client *TaikoL2ClientSession) GetBasefeeV2(_parentGasUsed uint32, _blockTimestamp uint64, _baseFeeConfig LibSharedDataBaseFeeConfig) (struct { + Basefee *big.Int + NewGasTarget uint64 + NewGasExcess uint64 +}, error) { + return _TaikoL2Client.Contract.GetBasefeeV2(&_TaikoL2Client.CallOpts, _parentGasUsed, _blockTimestamp, _baseFeeConfig) } -// GetBlockHash is a free data retrieval call binding the contract method 0x23ac7136. +// GetBasefeeV2 is a free data retrieval call binding the contract method 0x893f5460. // -// Solidity: function getBlockHash(uint64 _blockId) view returns(bytes32) -func (_TaikoL2Client *TaikoL2ClientCallerSession) GetBlockHash(_blockId uint64) ([32]byte, error) { - return _TaikoL2Client.Contract.GetBlockHash(&_TaikoL2Client.CallOpts, _blockId) +// Solidity: function getBasefeeV2(uint32 _parentGasUsed, uint64 _blockTimestamp, (uint8,uint8,uint32,uint64,uint32) _baseFeeConfig) view returns(uint256 basefee_, uint64 newGasTarget_, uint64 newGasExcess_) +func (_TaikoL2Client *TaikoL2ClientCallerSession) GetBasefeeV2(_parentGasUsed uint32, _blockTimestamp uint64, _baseFeeConfig LibSharedDataBaseFeeConfig) (struct { + Basefee *big.Int + NewGasTarget uint64 + NewGasExcess uint64 +}, error) { + return _TaikoL2Client.Contract.GetBasefeeV2(&_TaikoL2Client.CallOpts, _parentGasUsed, _blockTimestamp, _baseFeeConfig) } -// GetConfig is a free data retrieval call binding the contract method 0xc3f909d4. +// GetBlockHash is a free data retrieval call binding the contract method 0xee82ac5e. // -// Solidity: function getConfig() view returns((uint32,uint8)) -func (_TaikoL2Client *TaikoL2ClientCaller) GetConfig(opts *bind.CallOpts) (LibL2ConfigConfig, error) { +// Solidity: function getBlockHash(uint256 _blockId) view returns(bytes32) +func (_TaikoL2Client *TaikoL2ClientCaller) GetBlockHash(opts *bind.CallOpts, _blockId *big.Int) ([32]byte, error) { var out []interface{} - err := _TaikoL2Client.contract.Call(opts, &out, "getConfig") + err := _TaikoL2Client.contract.Call(opts, &out, "getBlockHash", _blockId) if err != nil { - return *new(LibL2ConfigConfig), err + return *new([32]byte), err } - out0 := *abi.ConvertType(out[0], new(LibL2ConfigConfig)).(*LibL2ConfigConfig) + out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) return out0, err } -// GetConfig is a free data retrieval call binding the contract method 0xc3f909d4. +// GetBlockHash is a free data retrieval call binding the contract method 0xee82ac5e. // -// Solidity: function getConfig() view returns((uint32,uint8)) -func (_TaikoL2Client *TaikoL2ClientSession) GetConfig() (LibL2ConfigConfig, error) { - return _TaikoL2Client.Contract.GetConfig(&_TaikoL2Client.CallOpts) +// Solidity: function getBlockHash(uint256 _blockId) view returns(bytes32) +func (_TaikoL2Client *TaikoL2ClientSession) GetBlockHash(_blockId *big.Int) ([32]byte, error) { + return _TaikoL2Client.Contract.GetBlockHash(&_TaikoL2Client.CallOpts, _blockId) } -// GetConfig is a free data retrieval call binding the contract method 0xc3f909d4. +// GetBlockHash is a free data retrieval call binding the contract method 0xee82ac5e. // -// Solidity: function getConfig() view returns((uint32,uint8)) -func (_TaikoL2Client *TaikoL2ClientCallerSession) GetConfig() (LibL2ConfigConfig, error) { - return _TaikoL2Client.Contract.GetConfig(&_TaikoL2Client.CallOpts) +// Solidity: function getBlockHash(uint256 _blockId) view returns(bytes32) +func (_TaikoL2Client *TaikoL2ClientCallerSession) GetBlockHash(_blockId *big.Int) ([32]byte, error) { + return _TaikoL2Client.Contract.GetBlockHash(&_TaikoL2Client.CallOpts, _blockId) } // Impl is a free data retrieval call binding the contract method 0x8abf6077. @@ -479,37 +537,6 @@ func (_TaikoL2Client *TaikoL2ClientCallerSession) L1ChainId() (uint64, error) { return _TaikoL2Client.Contract.L1ChainId(&_TaikoL2Client.CallOpts) } -// L2Hashes is a free data retrieval call binding the contract method 0x8551f41e. -// -// Solidity: function l2Hashes(uint256 blockId) view returns(bytes32 blockHash) -func (_TaikoL2Client *TaikoL2ClientCaller) L2Hashes(opts *bind.CallOpts, blockId *big.Int) ([32]byte, error) { - var out []interface{} - err := _TaikoL2Client.contract.Call(opts, &out, "l2Hashes", blockId) - - if err != nil { - return *new([32]byte), err - } - - out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) - - return out0, err - -} - -// L2Hashes is a free data retrieval call binding the contract method 0x8551f41e. -// -// Solidity: function l2Hashes(uint256 blockId) view returns(bytes32 blockHash) -func (_TaikoL2Client *TaikoL2ClientSession) L2Hashes(blockId *big.Int) ([32]byte, error) { - return _TaikoL2Client.Contract.L2Hashes(&_TaikoL2Client.CallOpts, blockId) -} - -// L2Hashes is a free data retrieval call binding the contract method 0x8551f41e. -// -// Solidity: function l2Hashes(uint256 blockId) view returns(bytes32 blockHash) -func (_TaikoL2Client *TaikoL2ClientCallerSession) L2Hashes(blockId *big.Int) ([32]byte, error) { - return _TaikoL2Client.Contract.L2Hashes(&_TaikoL2Client.CallOpts, blockId) -} - // LastSyncedBlock is a free data retrieval call binding the contract method 0x33d5ac9b. // // Solidity: function lastSyncedBlock() view returns(uint64) @@ -572,6 +599,37 @@ func (_TaikoL2Client *TaikoL2ClientCallerSession) LastUnpausedAt() (uint64, erro return _TaikoL2Client.Contract.LastUnpausedAt(&_TaikoL2Client.CallOpts) } +// OntakeForkHeight is a free data retrieval call binding the contract method 0x356aec04. +// +// Solidity: function ontakeForkHeight() pure returns(uint64) +func (_TaikoL2Client *TaikoL2ClientCaller) OntakeForkHeight(opts *bind.CallOpts) (uint64, error) { + var out []interface{} + err := _TaikoL2Client.contract.Call(opts, &out, "ontakeForkHeight") + + if err != nil { + return *new(uint64), err + } + + out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) + + return out0, err + +} + +// OntakeForkHeight is a free data retrieval call binding the contract method 0x356aec04. +// +// Solidity: function ontakeForkHeight() pure returns(uint64) +func (_TaikoL2Client *TaikoL2ClientSession) OntakeForkHeight() (uint64, error) { + return _TaikoL2Client.Contract.OntakeForkHeight(&_TaikoL2Client.CallOpts) +} + +// OntakeForkHeight is a free data retrieval call binding the contract method 0x356aec04. +// +// Solidity: function ontakeForkHeight() pure returns(uint64) +func (_TaikoL2Client *TaikoL2ClientCallerSession) OntakeForkHeight() (uint64, error) { + return _TaikoL2Client.Contract.OntakeForkHeight(&_TaikoL2Client.CallOpts) +} + // Owner is a free data retrieval call binding the contract method 0x8da5cb5b. // // Solidity: function owner() view returns(address) @@ -603,6 +661,99 @@ func (_TaikoL2Client *TaikoL2ClientCallerSession) Owner() (common.Address, error return _TaikoL2Client.Contract.Owner(&_TaikoL2Client.CallOpts) } +// ParentGasExcess is a free data retrieval call binding the contract method 0xb8c7b30c. +// +// Solidity: function parentGasExcess() view returns(uint64) +func (_TaikoL2Client *TaikoL2ClientCaller) ParentGasExcess(opts *bind.CallOpts) (uint64, error) { + var out []interface{} + err := _TaikoL2Client.contract.Call(opts, &out, "parentGasExcess") + + if err != nil { + return *new(uint64), err + } + + out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) + + return out0, err + +} + +// ParentGasExcess is a free data retrieval call binding the contract method 0xb8c7b30c. +// +// Solidity: function parentGasExcess() view returns(uint64) +func (_TaikoL2Client *TaikoL2ClientSession) ParentGasExcess() (uint64, error) { + return _TaikoL2Client.Contract.ParentGasExcess(&_TaikoL2Client.CallOpts) +} + +// ParentGasExcess is a free data retrieval call binding the contract method 0xb8c7b30c. +// +// Solidity: function parentGasExcess() view returns(uint64) +func (_TaikoL2Client *TaikoL2ClientCallerSession) ParentGasExcess() (uint64, error) { + return _TaikoL2Client.Contract.ParentGasExcess(&_TaikoL2Client.CallOpts) +} + +// ParentGasTarget is a free data retrieval call binding the contract method 0xa7137c0f. +// +// Solidity: function parentGasTarget() view returns(uint64) +func (_TaikoL2Client *TaikoL2ClientCaller) ParentGasTarget(opts *bind.CallOpts) (uint64, error) { + var out []interface{} + err := _TaikoL2Client.contract.Call(opts, &out, "parentGasTarget") + + if err != nil { + return *new(uint64), err + } + + out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) + + return out0, err + +} + +// ParentGasTarget is a free data retrieval call binding the contract method 0xa7137c0f. +// +// Solidity: function parentGasTarget() view returns(uint64) +func (_TaikoL2Client *TaikoL2ClientSession) ParentGasTarget() (uint64, error) { + return _TaikoL2Client.Contract.ParentGasTarget(&_TaikoL2Client.CallOpts) +} + +// ParentGasTarget is a free data retrieval call binding the contract method 0xa7137c0f. +// +// Solidity: function parentGasTarget() view returns(uint64) +func (_TaikoL2Client *TaikoL2ClientCallerSession) ParentGasTarget() (uint64, error) { + return _TaikoL2Client.Contract.ParentGasTarget(&_TaikoL2Client.CallOpts) +} + +// ParentTimestamp is a free data retrieval call binding the contract method 0x539b8ade. +// +// Solidity: function parentTimestamp() view returns(uint64) +func (_TaikoL2Client *TaikoL2ClientCaller) ParentTimestamp(opts *bind.CallOpts) (uint64, error) { + var out []interface{} + err := _TaikoL2Client.contract.Call(opts, &out, "parentTimestamp") + + if err != nil { + return *new(uint64), err + } + + out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) + + return out0, err + +} + +// ParentTimestamp is a free data retrieval call binding the contract method 0x539b8ade. +// +// Solidity: function parentTimestamp() view returns(uint64) +func (_TaikoL2Client *TaikoL2ClientSession) ParentTimestamp() (uint64, error) { + return _TaikoL2Client.Contract.ParentTimestamp(&_TaikoL2Client.CallOpts) +} + +// ParentTimestamp is a free data retrieval call binding the contract method 0x539b8ade. +// +// Solidity: function parentTimestamp() view returns(uint64) +func (_TaikoL2Client *TaikoL2ClientCallerSession) ParentTimestamp() (uint64, error) { + return _TaikoL2Client.Contract.ParentTimestamp(&_TaikoL2Client.CallOpts) +} + // Paused is a free data retrieval call binding the contract method 0x5c975abb. // // Solidity: function paused() view returns(bool) @@ -862,25 +1013,46 @@ func (_TaikoL2Client *TaikoL2ClientTransactorSession) Anchor(_l1BlockHash [32]by return _TaikoL2Client.Contract.Anchor(&_TaikoL2Client.TransactOpts, _l1BlockHash, _l1StateRoot, _l1BlockId, _parentGasUsed) } +// AnchorV2 is a paid mutator transaction binding the contract method 0xfd85eb2d. +// +// Solidity: function anchorV2(uint64 _anchorBlockId, bytes32 _anchorStateRoot, uint32 _parentGasUsed, (uint8,uint8,uint32,uint64,uint32) _baseFeeConfig) returns() +func (_TaikoL2Client *TaikoL2ClientTransactor) AnchorV2(opts *bind.TransactOpts, _anchorBlockId uint64, _anchorStateRoot [32]byte, _parentGasUsed uint32, _baseFeeConfig LibSharedDataBaseFeeConfig) (*types.Transaction, error) { + return _TaikoL2Client.contract.Transact(opts, "anchorV2", _anchorBlockId, _anchorStateRoot, _parentGasUsed, _baseFeeConfig) +} + +// AnchorV2 is a paid mutator transaction binding the contract method 0xfd85eb2d. +// +// Solidity: function anchorV2(uint64 _anchorBlockId, bytes32 _anchorStateRoot, uint32 _parentGasUsed, (uint8,uint8,uint32,uint64,uint32) _baseFeeConfig) returns() +func (_TaikoL2Client *TaikoL2ClientSession) AnchorV2(_anchorBlockId uint64, _anchorStateRoot [32]byte, _parentGasUsed uint32, _baseFeeConfig LibSharedDataBaseFeeConfig) (*types.Transaction, error) { + return _TaikoL2Client.Contract.AnchorV2(&_TaikoL2Client.TransactOpts, _anchorBlockId, _anchorStateRoot, _parentGasUsed, _baseFeeConfig) +} + +// AnchorV2 is a paid mutator transaction binding the contract method 0xfd85eb2d. +// +// Solidity: function anchorV2(uint64 _anchorBlockId, bytes32 _anchorStateRoot, uint32 _parentGasUsed, (uint8,uint8,uint32,uint64,uint32) _baseFeeConfig) returns() +func (_TaikoL2Client *TaikoL2ClientTransactorSession) AnchorV2(_anchorBlockId uint64, _anchorStateRoot [32]byte, _parentGasUsed uint32, _baseFeeConfig LibSharedDataBaseFeeConfig) (*types.Transaction, error) { + return _TaikoL2Client.Contract.AnchorV2(&_TaikoL2Client.TransactOpts, _anchorBlockId, _anchorStateRoot, _parentGasUsed, _baseFeeConfig) +} + // Init is a paid mutator transaction binding the contract method 0x5950f9f1. // -// Solidity: function init(address _owner, address _addressManager, uint64 _l1ChainId, uint64 _gasExcess) returns() -func (_TaikoL2Client *TaikoL2ClientTransactor) Init(opts *bind.TransactOpts, _owner common.Address, _addressManager common.Address, _l1ChainId uint64, _gasExcess uint64) (*types.Transaction, error) { - return _TaikoL2Client.contract.Transact(opts, "init", _owner, _addressManager, _l1ChainId, _gasExcess) +// Solidity: function init(address _owner, address _rollupAddressManager, uint64 _l1ChainId, uint64 _initialGasExcess) returns() +func (_TaikoL2Client *TaikoL2ClientTransactor) Init(opts *bind.TransactOpts, _owner common.Address, _rollupAddressManager common.Address, _l1ChainId uint64, _initialGasExcess uint64) (*types.Transaction, error) { + return _TaikoL2Client.contract.Transact(opts, "init", _owner, _rollupAddressManager, _l1ChainId, _initialGasExcess) } // Init is a paid mutator transaction binding the contract method 0x5950f9f1. // -// Solidity: function init(address _owner, address _addressManager, uint64 _l1ChainId, uint64 _gasExcess) returns() -func (_TaikoL2Client *TaikoL2ClientSession) Init(_owner common.Address, _addressManager common.Address, _l1ChainId uint64, _gasExcess uint64) (*types.Transaction, error) { - return _TaikoL2Client.Contract.Init(&_TaikoL2Client.TransactOpts, _owner, _addressManager, _l1ChainId, _gasExcess) +// Solidity: function init(address _owner, address _rollupAddressManager, uint64 _l1ChainId, uint64 _initialGasExcess) returns() +func (_TaikoL2Client *TaikoL2ClientSession) Init(_owner common.Address, _rollupAddressManager common.Address, _l1ChainId uint64, _initialGasExcess uint64) (*types.Transaction, error) { + return _TaikoL2Client.Contract.Init(&_TaikoL2Client.TransactOpts, _owner, _rollupAddressManager, _l1ChainId, _initialGasExcess) } // Init is a paid mutator transaction binding the contract method 0x5950f9f1. // -// Solidity: function init(address _owner, address _addressManager, uint64 _l1ChainId, uint64 _gasExcess) returns() -func (_TaikoL2Client *TaikoL2ClientTransactorSession) Init(_owner common.Address, _addressManager common.Address, _l1ChainId uint64, _gasExcess uint64) (*types.Transaction, error) { - return _TaikoL2Client.Contract.Init(&_TaikoL2Client.TransactOpts, _owner, _addressManager, _l1ChainId, _gasExcess) +// Solidity: function init(address _owner, address _rollupAddressManager, uint64 _l1ChainId, uint64 _initialGasExcess) returns() +func (_TaikoL2Client *TaikoL2ClientTransactorSession) Init(_owner common.Address, _rollupAddressManager common.Address, _l1ChainId uint64, _initialGasExcess uint64) (*types.Transaction, error) { + return _TaikoL2Client.Contract.Init(&_TaikoL2Client.TransactOpts, _owner, _rollupAddressManager, _l1ChainId, _initialGasExcess) } // Pause is a paid mutator transaction binding the contract method 0x8456cb59. @@ -1234,14 +1406,14 @@ func (it *TaikoL2ClientAnchoredIterator) Close() error { // TaikoL2ClientAnchored represents a Anchored event raised by the TaikoL2Client contract. type TaikoL2ClientAnchored struct { - ParentHash [32]byte - GasExcess uint64 - Raw types.Log // Blockchain specific contextual infos + ParentHash [32]byte + ParentGasExcess uint64 + Raw types.Log // Blockchain specific contextual infos } // FilterAnchored is a free log retrieval operation binding the contract event 0x41c3f410f5c8ac36bb46b1dccef0de0f964087c9e688795fa02ecfa2c20b3fe4. // -// Solidity: event Anchored(bytes32 parentHash, uint64 gasExcess) +// Solidity: event Anchored(bytes32 parentHash, uint64 parentGasExcess) func (_TaikoL2Client *TaikoL2ClientFilterer) FilterAnchored(opts *bind.FilterOpts) (*TaikoL2ClientAnchoredIterator, error) { logs, sub, err := _TaikoL2Client.contract.FilterLogs(opts, "Anchored") @@ -1253,7 +1425,7 @@ func (_TaikoL2Client *TaikoL2ClientFilterer) FilterAnchored(opts *bind.FilterOpt // WatchAnchored is a free log subscription operation binding the contract event 0x41c3f410f5c8ac36bb46b1dccef0de0f964087c9e688795fa02ecfa2c20b3fe4. // -// Solidity: event Anchored(bytes32 parentHash, uint64 gasExcess) +// Solidity: event Anchored(bytes32 parentHash, uint64 parentGasExcess) func (_TaikoL2Client *TaikoL2ClientFilterer) WatchAnchored(opts *bind.WatchOpts, sink chan<- *TaikoL2ClientAnchored) (event.Subscription, error) { logs, sub, err := _TaikoL2Client.contract.WatchLogs(opts, "Anchored") @@ -1290,7 +1462,7 @@ func (_TaikoL2Client *TaikoL2ClientFilterer) WatchAnchored(opts *bind.WatchOpts, // ParseAnchored is a log parse operation binding the contract event 0x41c3f410f5c8ac36bb46b1dccef0de0f964087c9e688795fa02ecfa2c20b3fe4. // -// Solidity: event Anchored(bytes32 parentHash, uint64 gasExcess) +// Solidity: event Anchored(bytes32 parentHash, uint64 parentGasExcess) func (_TaikoL2Client *TaikoL2ClientFilterer) ParseAnchored(log types.Log) (*TaikoL2ClientAnchored, error) { event := new(TaikoL2ClientAnchored) if err := _TaikoL2Client.contract.UnpackLog(event, "Anchored", log); err != nil { @@ -1444,6 +1616,144 @@ func (_TaikoL2Client *TaikoL2ClientFilterer) ParseBeaconUpgraded(log types.Log) return event, nil } +// TaikoL2ClientEIP1559UpdateIterator is returned from FilterEIP1559Update and is used to iterate over the raw logs and unpacked data for EIP1559Update events raised by the TaikoL2Client contract. +type TaikoL2ClientEIP1559UpdateIterator struct { + Event *TaikoL2ClientEIP1559Update // 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 *TaikoL2ClientEIP1559UpdateIterator) 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(TaikoL2ClientEIP1559Update) + 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(TaikoL2ClientEIP1559Update) + 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 *TaikoL2ClientEIP1559UpdateIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *TaikoL2ClientEIP1559UpdateIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// TaikoL2ClientEIP1559Update represents a EIP1559Update event raised by the TaikoL2Client contract. +type TaikoL2ClientEIP1559Update struct { + OldGasTarget uint64 + NewGasTarget uint64 + OldGasExcess uint64 + NewGasExcess uint64 + Basefee *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterEIP1559Update is a free log retrieval operation binding the contract event 0x781ae5c2215806150d5c71a4ed5336e5dc3ad32aef04fc0f626a6ee0c2f8d1c8. +// +// Solidity: event EIP1559Update(uint64 oldGasTarget, uint64 newGasTarget, uint64 oldGasExcess, uint64 newGasExcess, uint256 basefee) +func (_TaikoL2Client *TaikoL2ClientFilterer) FilterEIP1559Update(opts *bind.FilterOpts) (*TaikoL2ClientEIP1559UpdateIterator, error) { + + logs, sub, err := _TaikoL2Client.contract.FilterLogs(opts, "EIP1559Update") + if err != nil { + return nil, err + } + return &TaikoL2ClientEIP1559UpdateIterator{contract: _TaikoL2Client.contract, event: "EIP1559Update", logs: logs, sub: sub}, nil +} + +// WatchEIP1559Update is a free log subscription operation binding the contract event 0x781ae5c2215806150d5c71a4ed5336e5dc3ad32aef04fc0f626a6ee0c2f8d1c8. +// +// Solidity: event EIP1559Update(uint64 oldGasTarget, uint64 newGasTarget, uint64 oldGasExcess, uint64 newGasExcess, uint256 basefee) +func (_TaikoL2Client *TaikoL2ClientFilterer) WatchEIP1559Update(opts *bind.WatchOpts, sink chan<- *TaikoL2ClientEIP1559Update) (event.Subscription, error) { + + logs, sub, err := _TaikoL2Client.contract.WatchLogs(opts, "EIP1559Update") + 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(TaikoL2ClientEIP1559Update) + if err := _TaikoL2Client.contract.UnpackLog(event, "EIP1559Update", 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 +} + +// ParseEIP1559Update is a log parse operation binding the contract event 0x781ae5c2215806150d5c71a4ed5336e5dc3ad32aef04fc0f626a6ee0c2f8d1c8. +// +// Solidity: event EIP1559Update(uint64 oldGasTarget, uint64 newGasTarget, uint64 oldGasExcess, uint64 newGasExcess, uint256 basefee) +func (_TaikoL2Client *TaikoL2ClientFilterer) ParseEIP1559Update(log types.Log) (*TaikoL2ClientEIP1559Update, error) { + event := new(TaikoL2ClientEIP1559Update) + if err := _TaikoL2Client.contract.UnpackLog(event, "EIP1559Update", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + // TaikoL2ClientInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the TaikoL2Client contract. type TaikoL2ClientInitializedIterator struct { Event *TaikoL2ClientInitialized // Event containing the contract specifics and raw log diff --git a/packages/taiko-client/bindings/gen_taiko_token.go b/packages/taiko-client/bindings/gen_taiko_token.go index 49f9bc2ae77..8a6387703e3 100644 --- a/packages/taiko-client/bindings/gen_taiko_token.go +++ b/packages/taiko-client/bindings/gen_taiko_token.go @@ -37,7 +37,7 @@ type ERC20VotesUpgradeableCheckpoint struct { // TaikoTokenMetaData contains all meta data concerning the TaikoToken contract. var TaikoTokenMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"function\",\"name\":\"CLOCK_MODE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"DOMAIN_SEPARATOR\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addressManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"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\":\"checkpoints\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"pos\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structERC20VotesUpgradeable.Checkpoint\",\"components\":[{\"name\":\"fromBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"votes\",\"type\":\"uint224\",\"internalType\":\"uint224\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"clock\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint48\",\"internalType\":\"uint48\"}],\"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\":\"delegate\",\"inputs\":[{\"name\":\"delegatee\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegateBySig\",\"inputs\":[{\"name\":\"delegatee\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"expiry\",\"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\":\"delegates\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"eip712Domain\",\"inputs\":[],\"outputs\":[{\"name\":\"fields\",\"type\":\"bytes1\",\"internalType\":\"bytes1\"},{\"name\":\"name\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"version\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"chainId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"verifyingContract\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"extensions\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPastTotalSupply\",\"inputs\":[{\"name\":\"timepoint\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPastVotes\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"timepoint\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getVotes\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"impl\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"inNonReentrant\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"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\":\"init\",\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_recipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"name\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"nonces\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"numCheckpoints\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"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\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"symbol\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"pure\"},{\"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\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeTo\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"event\",\"name\":\"AdminChanged\",\"inputs\":[{\"name\":\"previousAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"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\":\"BeaconUpgraded\",\"inputs\":[{\"name\":\"beacon\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegateChanged\",\"inputs\":[{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"fromDelegate\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"toDelegate\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegateVotesChanged\",\"inputs\":[{\"name\":\"delegate\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"previousBalance\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"newBalance\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"EIP712DomainChanged\",\"inputs\":[],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"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},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"FUNC_NOT_IMPLEMENTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"REENTRANT_CALL\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_INVALID_MANAGER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_UNEXPECTED_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_ZERO_ADDR\",\"inputs\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ZERO_ADDRESS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_VALUE\",\"inputs\":[]}]", + ABI: "[{\"type\":\"function\",\"name\":\"CLOCK_MODE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"DOMAIN_SEPARATOR\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addressManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"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\":\"batchTransfer\",\"inputs\":[{\"name\":\"recipients\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"amounts\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"checkpoints\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"pos\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structERC20VotesUpgradeable.Checkpoint\",\"components\":[{\"name\":\"fromBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"votes\",\"type\":\"uint224\",\"internalType\":\"uint224\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"clock\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint48\",\"internalType\":\"uint48\"}],\"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\":\"delegate\",\"inputs\":[{\"name\":\"delegatee\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegateBySig\",\"inputs\":[{\"name\":\"delegatee\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"expiry\",\"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\":\"delegates\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"eip712Domain\",\"inputs\":[],\"outputs\":[{\"name\":\"fields\",\"type\":\"bytes1\",\"internalType\":\"bytes1\"},{\"name\":\"name\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"version\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"chainId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"verifyingContract\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"extensions\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPastTotalSupply\",\"inputs\":[{\"name\":\"timepoint\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPastVotes\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"timepoint\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getVotes\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"impl\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"inNonReentrant\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"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\":\"init\",\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_recipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"name\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"nonces\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"numCheckpoints\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"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\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"symbol\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"pure\"},{\"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\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeTo\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"event\",\"name\":\"AdminChanged\",\"inputs\":[{\"name\":\"previousAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"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\":\"BeaconUpgraded\",\"inputs\":[{\"name\":\"beacon\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegateChanged\",\"inputs\":[{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"fromDelegate\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"toDelegate\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegateVotesChanged\",\"inputs\":[{\"name\":\"delegate\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"previousBalance\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"newBalance\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"EIP712DomainChanged\",\"inputs\":[],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"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},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"FUNC_NOT_IMPLEMENTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"REENTRANT_CALL\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_INVALID_MANAGER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_UNEXPECTED_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_ZERO_ADDR\",\"inputs\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"TT_INVALID_PARAM\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_ADDRESS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZERO_VALUE\",\"inputs\":[]}]", } // TaikoTokenABI is the input ABI used to generate the binding from. @@ -1104,6 +1104,27 @@ func (_TaikoToken *TaikoTokenTransactorSession) Approve(spender common.Address, return _TaikoToken.Contract.Approve(&_TaikoToken.TransactOpts, spender, amount) } +// BatchTransfer is a paid mutator transaction binding the contract method 0x88d695b2. +// +// Solidity: function batchTransfer(address[] recipients, uint256[] amounts) returns(bool) +func (_TaikoToken *TaikoTokenTransactor) BatchTransfer(opts *bind.TransactOpts, recipients []common.Address, amounts []*big.Int) (*types.Transaction, error) { + return _TaikoToken.contract.Transact(opts, "batchTransfer", recipients, amounts) +} + +// BatchTransfer is a paid mutator transaction binding the contract method 0x88d695b2. +// +// Solidity: function batchTransfer(address[] recipients, uint256[] amounts) returns(bool) +func (_TaikoToken *TaikoTokenSession) BatchTransfer(recipients []common.Address, amounts []*big.Int) (*types.Transaction, error) { + return _TaikoToken.Contract.BatchTransfer(&_TaikoToken.TransactOpts, recipients, amounts) +} + +// BatchTransfer is a paid mutator transaction binding the contract method 0x88d695b2. +// +// Solidity: function batchTransfer(address[] recipients, uint256[] amounts) returns(bool) +func (_TaikoToken *TaikoTokenTransactorSession) BatchTransfer(recipients []common.Address, amounts []*big.Int) (*types.Transaction, error) { + return _TaikoToken.Contract.BatchTransfer(&_TaikoToken.TransactOpts, recipients, amounts) +} + // DecreaseAllowance is a paid mutator transaction binding the contract method 0xa457c2d7. // // Solidity: function decreaseAllowance(address spender, uint256 subtractedValue) returns(bool) diff --git a/packages/taiko-client/bindings/gen_tier_provider.go b/packages/taiko-client/bindings/gen_tier_provider.go index 60f5ef20972..e0449320610 100644 --- a/packages/taiko-client/bindings/gen_tier_provider.go +++ b/packages/taiko-client/bindings/gen_tier_provider.go @@ -41,7 +41,7 @@ type ITierProviderTier struct { // TierProviderMetaData contains all meta data concerning the TierProvider contract. var TierProviderMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"function\",\"name\":\"getMinTier\",\"inputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"getProvider\",\"inputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getTier\",\"inputs\":[{\"name\":\"_tierId\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structITierProvider.Tier\",\"components\":[{\"name\":\"verifierName\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validityBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"contestBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"cooldownWindow\",\"type\":\"uint24\",\"internalType\":\"uint24\"},{\"name\":\"provingWindow\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"maxBlocksToVerifyPerProof\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"getTierIds\",\"inputs\":[],\"outputs\":[{\"name\":\"tiers_\",\"type\":\"uint16[]\",\"internalType\":\"uint16[]\"}],\"stateMutability\":\"pure\"},{\"type\":\"error\",\"name\":\"TIER_NOT_FOUND\",\"inputs\":[]}]", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_daoFallbackProposer\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"BOND_UNIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint96\",\"internalType\":\"uint96\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"DAO_FALLBACK_PROPOSER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMinTier\",\"inputs\":[{\"name\":\"_proposer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_rand\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getProvider\",\"inputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getTier\",\"inputs\":[{\"name\":\"_tierId\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structITierProvider.Tier\",\"components\":[{\"name\":\"verifierName\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validityBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"contestBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"cooldownWindow\",\"type\":\"uint24\",\"internalType\":\"uint24\"},{\"name\":\"provingWindow\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"maxBlocksToVerifyPerProof\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"getTierIds\",\"inputs\":[],\"outputs\":[{\"name\":\"tiers_\",\"type\":\"uint16[]\",\"internalType\":\"uint16[]\"}],\"stateMutability\":\"pure\"},{\"type\":\"error\",\"name\":\"TIER_NOT_FOUND\",\"inputs\":[]}]", } // TierProviderABI is the input ABI used to generate the binding from. @@ -190,12 +190,74 @@ func (_TierProvider *TierProviderTransactorRaw) Transact(opts *bind.TransactOpts return _TierProvider.Contract.contract.Transact(opts, method, params...) } -// GetMinTier is a free data retrieval call binding the contract method 0x59ab4e23. +// BONDUNIT is a free data retrieval call binding the contract method 0x8165fd26. // -// Solidity: function getMinTier(uint256 ) pure returns(uint16) -func (_TierProvider *TierProviderCaller) GetMinTier(opts *bind.CallOpts, arg0 *big.Int) (uint16, error) { +// Solidity: function BOND_UNIT() view returns(uint96) +func (_TierProvider *TierProviderCaller) BONDUNIT(opts *bind.CallOpts) (*big.Int, error) { var out []interface{} - err := _TierProvider.contract.Call(opts, &out, "getMinTier", arg0) + err := _TierProvider.contract.Call(opts, &out, "BOND_UNIT") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// BONDUNIT is a free data retrieval call binding the contract method 0x8165fd26. +// +// Solidity: function BOND_UNIT() view returns(uint96) +func (_TierProvider *TierProviderSession) BONDUNIT() (*big.Int, error) { + return _TierProvider.Contract.BONDUNIT(&_TierProvider.CallOpts) +} + +// BONDUNIT is a free data retrieval call binding the contract method 0x8165fd26. +// +// Solidity: function BOND_UNIT() view returns(uint96) +func (_TierProvider *TierProviderCallerSession) BONDUNIT() (*big.Int, error) { + return _TierProvider.Contract.BONDUNIT(&_TierProvider.CallOpts) +} + +// DAOFALLBACKPROPOSER is a free data retrieval call binding the contract method 0xbf62514d. +// +// Solidity: function DAO_FALLBACK_PROPOSER() view returns(address) +func (_TierProvider *TierProviderCaller) DAOFALLBACKPROPOSER(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _TierProvider.contract.Call(opts, &out, "DAO_FALLBACK_PROPOSER") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// DAOFALLBACKPROPOSER is a free data retrieval call binding the contract method 0xbf62514d. +// +// Solidity: function DAO_FALLBACK_PROPOSER() view returns(address) +func (_TierProvider *TierProviderSession) DAOFALLBACKPROPOSER() (common.Address, error) { + return _TierProvider.Contract.DAOFALLBACKPROPOSER(&_TierProvider.CallOpts) +} + +// DAOFALLBACKPROPOSER is a free data retrieval call binding the contract method 0xbf62514d. +// +// Solidity: function DAO_FALLBACK_PROPOSER() view returns(address) +func (_TierProvider *TierProviderCallerSession) DAOFALLBACKPROPOSER() (common.Address, error) { + return _TierProvider.Contract.DAOFALLBACKPROPOSER(&_TierProvider.CallOpts) +} + +// GetMinTier is a free data retrieval call binding the contract method 0x52c5c56b. +// +// Solidity: function getMinTier(address _proposer, uint256 _rand) view returns(uint16) +func (_TierProvider *TierProviderCaller) GetMinTier(opts *bind.CallOpts, _proposer common.Address, _rand *big.Int) (uint16, error) { + var out []interface{} + err := _TierProvider.contract.Call(opts, &out, "getMinTier", _proposer, _rand) if err != nil { return *new(uint16), err @@ -207,18 +269,18 @@ func (_TierProvider *TierProviderCaller) GetMinTier(opts *bind.CallOpts, arg0 *b } -// GetMinTier is a free data retrieval call binding the contract method 0x59ab4e23. +// GetMinTier is a free data retrieval call binding the contract method 0x52c5c56b. // -// Solidity: function getMinTier(uint256 ) pure returns(uint16) -func (_TierProvider *TierProviderSession) GetMinTier(arg0 *big.Int) (uint16, error) { - return _TierProvider.Contract.GetMinTier(&_TierProvider.CallOpts, arg0) +// Solidity: function getMinTier(address _proposer, uint256 _rand) view returns(uint16) +func (_TierProvider *TierProviderSession) GetMinTier(_proposer common.Address, _rand *big.Int) (uint16, error) { + return _TierProvider.Contract.GetMinTier(&_TierProvider.CallOpts, _proposer, _rand) } -// GetMinTier is a free data retrieval call binding the contract method 0x59ab4e23. +// GetMinTier is a free data retrieval call binding the contract method 0x52c5c56b. // -// Solidity: function getMinTier(uint256 ) pure returns(uint16) -func (_TierProvider *TierProviderCallerSession) GetMinTier(arg0 *big.Int) (uint16, error) { - return _TierProvider.Contract.GetMinTier(&_TierProvider.CallOpts, arg0) +// Solidity: function getMinTier(address _proposer, uint256 _rand) view returns(uint16) +func (_TierProvider *TierProviderCallerSession) GetMinTier(_proposer common.Address, _rand *big.Int) (uint16, error) { + return _TierProvider.Contract.GetMinTier(&_TierProvider.CallOpts, _proposer, _rand) } // GetProvider is a free data retrieval call binding the contract method 0x5c42d079. diff --git a/packages/taiko-client/bindings/metadata/interface.go b/packages/taiko-client/bindings/metadata/interface.go new file mode 100644 index 00000000000..52e9e66b173 --- /dev/null +++ b/packages/taiko-client/bindings/metadata/interface.go @@ -0,0 +1,40 @@ +package metadata + +import ( + "math/big" + + "github.com/ethereum/go-ethereum/common" + + "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings" +) + +// struct BlockM +// TaikoBlockMetaData defines all the metadata of a Taiko block. +type TaikoBlockMetaData interface { + GetAnchorBlockHash() common.Hash + GetDifficulty() common.Hash + GetBlobHash() common.Hash + GetExtraData() []byte + GetCoinbase() common.Address + GetBlockID() *big.Int + GetGasLimit() uint32 + GetTimestamp() uint64 + GetAnchorBlockID() uint64 + GetMinTier() uint16 + GetBlobUsed() bool + GetParentMetaHash() common.Hash + GetProposer() common.Address + GetAssignedProver() common.Address + GetLivenessBond() *big.Int + GetProposedAt() uint64 + GetProposedIn() uint64 + GetBlobTxListOffset() uint32 + GetBlobTxListLength() uint32 + GetBlobIndex() uint8 + GetBaseFeeConfig() *bindings.LibSharedDataBaseFeeConfig + GetRawBlockHeight() *big.Int + GetRawBlockHash() common.Hash + GetTxIndex() uint + GetTxHash() common.Hash + IsOntakeBlock() bool +} diff --git a/packages/taiko-client/bindings/metadata/metadata_legacy.go b/packages/taiko-client/bindings/metadata/metadata_legacy.go new file mode 100644 index 00000000000..10b1b0eef2e --- /dev/null +++ b/packages/taiko-client/bindings/metadata/metadata_legacy.go @@ -0,0 +1,168 @@ +package metadata + +import ( + "math/big" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + + "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings" +) + +// Ensure TaikoDataBlockMetadataLegacy implements TaikoBlockMetaData. +var _ TaikoBlockMetaData = (*TaikoDataBlockMetadataLegacy)(nil) + +// TaikoDataBlockMetadataLegacy is the metadata of a legacy Taiko block. +type TaikoDataBlockMetadataLegacy struct { + bindings.TaikoDataBlockMetadata + types.Log + assignedProver common.Address + livenessBond *big.Int +} + +// NewTaikoDataBlockMetadataLegacy creates a new instance of TaikoDataBlockMetadataLegacy +// from the TaikoL1.BlockProposed event. +func NewTaikoDataBlockMetadataLegacy(e *bindings.TaikoL1ClientBlockProposed) *TaikoDataBlockMetadataLegacy { + return &TaikoDataBlockMetadataLegacy{ + TaikoDataBlockMetadata: e.Meta, + Log: e.Raw, + assignedProver: e.AssignedProver, + livenessBond: e.LivenessBond, + } +} + +// GetAnchorBlockHash returns the anchor block hash. +func (m *TaikoDataBlockMetadataLegacy) GetAnchorBlockHash() common.Hash { + return m.L1Hash +} + +// GetDifficulty returns the difficulty. +func (m *TaikoDataBlockMetadataLegacy) GetDifficulty() common.Hash { + return m.Difficulty +} + +// GetBlobHash returns the blob hash. +func (m *TaikoDataBlockMetadataLegacy) GetBlobHash() common.Hash { + return m.BlobHash +} + +// GetExtraData returns the extra data. +func (m *TaikoDataBlockMetadataLegacy) GetExtraData() []byte { + return m.ExtraData[:] +} + +// GetCoinbase returns the coinbase. +func (m *TaikoDataBlockMetadataLegacy) GetCoinbase() common.Address { + return m.Coinbase +} + +// GetBlockID returns the L2 block ID. +func (m *TaikoDataBlockMetadataLegacy) GetBlockID() *big.Int { + return new(big.Int).SetUint64(m.Id) +} + +// GetGasLimit returns the gas limit. +func (m *TaikoDataBlockMetadataLegacy) GetGasLimit() uint32 { + return m.GasLimit +} + +// GetTimestamp returns the timestamp. +func (m *TaikoDataBlockMetadataLegacy) GetTimestamp() uint64 { + return m.Timestamp +} + +// GetAnchorBlockID returns the L1 block number which should be used in anchor transaction. +func (m *TaikoDataBlockMetadataLegacy) GetAnchorBlockID() uint64 { + return m.L1Height +} + +// GetMinTier returns the minimum tier. +func (m *TaikoDataBlockMetadataLegacy) GetMinTier() uint16 { + return m.MinTier +} + +// GetBlobUsed returns whether the blob is used. +func (m *TaikoDataBlockMetadataLegacy) GetBlobUsed() bool { + return m.BlobUsed +} + +// GetParentMetaHash returns the parent meta hash. +func (m *TaikoDataBlockMetadataLegacy) GetParentMetaHash() common.Hash { + return m.ParentMetaHash +} + +// GetProposer returns the proposer address. +func (m *TaikoDataBlockMetadataLegacy) GetProposer() common.Address { + return m.Sender +} + +// GetAssignedProver returns the assigned prover address, right now +// this address should be equal to the proposer address. +func (m *TaikoDataBlockMetadataLegacy) GetAssignedProver() common.Address { + return m.assignedProver +} + +// GetLivenessBond returns the liveness bond. +func (m *TaikoDataBlockMetadataLegacy) GetLivenessBond() *big.Int { + return m.livenessBond +} + +// GetProposedAt returns the proposedAt timestamp. +func (m *TaikoDataBlockMetadataLegacy) GetProposedAt() uint64 { + return m.Timestamp +} + +// GetProposedIn returns the proposedIn block number. +func (m *TaikoDataBlockMetadataLegacy) GetProposedIn() uint64 { + return m.BlockNumber +} + +// GetBlobTxListOffset returns the blob tx list offset. +func (m *TaikoDataBlockMetadataLegacy) GetBlobTxListOffset() uint32 { + return 0 +} + +// GetBlobTxListLength returns the blob tx list length. +func (m *TaikoDataBlockMetadataLegacy) GetBlobTxListLength() uint32 { + return 0 +} + +// GetBlobIndex returns the blob index. +func (m *TaikoDataBlockMetadataLegacy) GetBlobIndex() uint8 { + return 0 +} + +// GetBaseFeeConfig returns the L2 block basefee configs. +func (m *TaikoDataBlockMetadataLegacy) GetBaseFeeConfig() *bindings.LibSharedDataBaseFeeConfig { + return &bindings.LibSharedDataBaseFeeConfig{} +} + +// GetRawBlockHeight returns the raw L1 block height. +func (m *TaikoDataBlockMetadataLegacy) GetRawBlockHeight() *big.Int { + return new(big.Int).SetUint64(m.BlockNumber) +} + +// GetRawBlockHash returns the raw L1 block hash. +func (m *TaikoDataBlockMetadataLegacy) GetRawBlockHash() common.Hash { + return m.BlockHash +} + +// GetTxIndex returns the transaction index. +func (m *TaikoDataBlockMetadataLegacy) GetTxIndex() uint { + return m.Log.TxIndex +} + +// GetTxHash returns the transaction hash. +func (m *TaikoDataBlockMetadataLegacy) GetTxHash() common.Hash { + return m.Log.TxHash +} + +// IsOntakeBlock returns whether the block is an Ontake block. +func (m *TaikoDataBlockMetadataLegacy) IsOntakeBlock() bool { + return false +} + +// InnerMetadata returns the inner metadata. +func (m *TaikoDataBlockMetadataLegacy) InnerMetadata() *bindings.TaikoDataBlockMetadata { + return &m.TaikoDataBlockMetadata +} diff --git a/packages/taiko-client/bindings/metadata/metadata_ontake.go b/packages/taiko-client/bindings/metadata/metadata_ontake.go new file mode 100644 index 00000000000..5ae06a9e11b --- /dev/null +++ b/packages/taiko-client/bindings/metadata/metadata_ontake.go @@ -0,0 +1,164 @@ +package metadata + +import ( + "math/big" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + + "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings" +) + +// Ensure TaikoDataBlockMetadataOntake implements TaikoBlockMetaData. +var _ TaikoBlockMetaData = (*TaikoDataBlockMetadataOntake)(nil) + +// TaikoDataBlockMetadataOntake is the metadata of an ontake Taiko block. +type TaikoDataBlockMetadataOntake struct { + bindings.TaikoDataBlockMetadataV2 + types.Log +} + +// NewTaikoDataBlockMetadataOntake creates a new instance of TaikoDataBlockMetadataOntake +// from the TaikoL1.BlockProposedV2 event. +func NewTaikoDataBlockMetadataOntake(e *bindings.TaikoL1ClientBlockProposedV2) *TaikoDataBlockMetadataOntake { + return &TaikoDataBlockMetadataOntake{ + TaikoDataBlockMetadataV2: e.Meta, + Log: e.Raw, + } +} + +// GetAnchorBlockHash returns the anchor block hash. +func (m *TaikoDataBlockMetadataOntake) GetAnchorBlockHash() common.Hash { + return m.AnchorBlockHash +} + +// GetDifficulty returns the difficulty. +func (m *TaikoDataBlockMetadataOntake) GetDifficulty() common.Hash { + return m.Difficulty +} + +// GetBlobHash returns the blob hash. +func (m *TaikoDataBlockMetadataOntake) GetBlobHash() common.Hash { + return m.BlobHash +} + +// GetExtraData returns the extra data. +func (m *TaikoDataBlockMetadataOntake) GetExtraData() []byte { + return m.ExtraData[:] +} + +// GetCoinbase returns the coinbase. +func (m *TaikoDataBlockMetadataOntake) GetCoinbase() common.Address { + return m.Coinbase +} + +// GetBlockID returns the L2 block ID. +func (m *TaikoDataBlockMetadataOntake) GetBlockID() *big.Int { + return new(big.Int).SetUint64(m.Id) +} + +// GetGasLimit returns the gas limit. +func (m *TaikoDataBlockMetadataOntake) GetGasLimit() uint32 { + return m.GasLimit +} + +// GetTimestamp returns the timestamp. +func (m *TaikoDataBlockMetadataOntake) GetTimestamp() uint64 { + return m.Timestamp +} + +// GetAnchorBlockID returns the L1 block number which should be used in anchor transaction. +func (m *TaikoDataBlockMetadataOntake) GetAnchorBlockID() uint64 { + return m.AnchorBlockId +} + +// GetMinTier returns the minimum tier. +func (m *TaikoDataBlockMetadataOntake) GetMinTier() uint16 { + return m.MinTier +} + +// GetBlobUsed returns whether the blob is used. +func (m *TaikoDataBlockMetadataOntake) GetBlobUsed() bool { + return m.BlobUsed +} + +// GetParentMetaHash returns the parent meta hash. +func (m *TaikoDataBlockMetadataOntake) GetParentMetaHash() common.Hash { + return m.ParentMetaHash +} + +// GetProposer returns the proposer address. +func (m *TaikoDataBlockMetadataOntake) GetProposer() common.Address { + return m.Proposer +} + +// GetAssignedProver returns the assigned prover address, right now +// this address should be equal to the proposer address. +func (m *TaikoDataBlockMetadataOntake) GetAssignedProver() common.Address { + return m.Proposer +} + +// GetLivenessBond returns the liveness bond. +func (m *TaikoDataBlockMetadataOntake) GetLivenessBond() *big.Int { + return m.LivenessBond +} + +// GetProposedAt returns the proposedAt timestamp. +func (m *TaikoDataBlockMetadataOntake) GetProposedAt() uint64 { + return m.ProposedAt +} + +// GetProposedIn returns the proposedIn block number. +func (m *TaikoDataBlockMetadataOntake) GetProposedIn() uint64 { + return m.ProposedIn +} + +// GetBlobTxListOffset returns the blob tx list offset. +func (m *TaikoDataBlockMetadataOntake) GetBlobTxListOffset() uint32 { + return m.BlobTxListOffset +} + +// GetBlobTxListLength returns the blob tx list length. +func (m *TaikoDataBlockMetadataOntake) GetBlobTxListLength() uint32 { + return m.BlobTxListLength +} + +// GetBlobIndex returns the blob index. +func (m *TaikoDataBlockMetadataOntake) GetBlobIndex() uint8 { + return m.BlobIndex +} + +// GetBaseFeeConfig returns the L2 block basefee configs. +func (m *TaikoDataBlockMetadataOntake) GetBaseFeeConfig() *bindings.LibSharedDataBaseFeeConfig { + return &m.BaseFeeConfig +} + +// GetRawBlockHeight returns the raw L1 block height. +func (m *TaikoDataBlockMetadataOntake) GetRawBlockHeight() *big.Int { + return new(big.Int).SetUint64(m.BlockNumber) +} + +// GetRawBlockHash returns the raw L1 block hash. +func (m *TaikoDataBlockMetadataOntake) GetRawBlockHash() common.Hash { + return m.BlockHash +} + +// GetTxIndex returns the transaction index. +func (m *TaikoDataBlockMetadataOntake) GetTxIndex() uint { + return m.Log.TxIndex +} + +// GetTxHash returns the transaction hash. +func (m *TaikoDataBlockMetadataOntake) GetTxHash() common.Hash { + return m.Log.TxHash +} + +// IsOntakeBlock returns whether the block is an ontake block. +func (m *TaikoDataBlockMetadataOntake) IsOntakeBlock() bool { + return true +} + +// InnerMetadata returns the inner metadata. +func (m *TaikoDataBlockMetadataOntake) InnerMetadata() *bindings.TaikoDataBlockMetadataV2 { + return &m.TaikoDataBlockMetadataV2 +} diff --git a/packages/taiko-client/cmd/flags/common.go b/packages/taiko-client/cmd/flags/common.go index 2c9c6babfa2..834dd8d3d67 100644 --- a/packages/taiko-client/cmd/flags/common.go +++ b/packages/taiko-client/cmd/flags/common.go @@ -5,6 +5,8 @@ import ( "github.com/cenkalti/backoff/v4" "github.com/urfave/cli/v2" + + "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/rpc" ) var ( @@ -26,6 +28,12 @@ var ( Category: commonCategory, EnvVars: []string{"L1_WS"}, } + L1PrivateEndpoint = &cli.StringFlag{ + Name: "l1.private", + Usage: "RPC endpoint of a L1 node with private mempool", + Category: commonCategory, + EnvVars: []string{"L1_PRIVATE"}, + } L2WSEndpoint = &cli.StringFlag{ Name: "l2.ws", Usage: "Websocket RPC endpoint of a L2 taiko-geth execution engine", @@ -33,13 +41,6 @@ var ( Category: commonCategory, EnvVars: []string{"L2_WS"}, } - L1HTTPEndpoint = &cli.StringFlag{ - Name: "l1.http", - Usage: "HTTP RPC endpoint of a L1 ethereum node", - Required: true, - Category: commonCategory, - EnvVars: []string{"L1_HTTP"}, - } L1BeaconEndpoint = &cli.StringFlag{ Name: "l1.beacon", Usage: "HTTP RPC endpoint of a L1 beacon node", @@ -147,11 +148,12 @@ var ( Value: 12 * time.Second, EnvVars: []string{"RPC_TIMEOUT"}, } - AssignmentHookAddress = &cli.StringFlag{ - Name: "assignmentHookAddress", - Usage: "Address of the AssignmentHook contract", + ProverSetAddress = &cli.StringFlag{ + Name: "proverSet", + Usage: "ProverSet contract `address`", + Value: rpc.ZeroAddress.Hex(), Category: commonCategory, - EnvVars: []string{"ASSIGNMENT_HOOK_ADDRESS"}, + EnvVars: []string{"PROVER_SET"}, } ) @@ -162,6 +164,7 @@ var CommonFlags = []cli.Flag{ TaikoL1Address, TaikoL2Address, // Optional + ProverSetAddress, Verbosity, LogJSON, MetricsEnabled, @@ -170,6 +173,7 @@ var CommonFlags = []cli.Flag{ BackOffMaxRetries, BackOffRetryInterval, RPCTimeout, + L1PrivateEndpoint, } // MergeFlags merges the given flag slices. diff --git a/packages/taiko-client/cmd/flags/driver.go b/packages/taiko-client/cmd/flags/driver.go index 3c28dc7571a..48bcf693962 100644 --- a/packages/taiko-client/cmd/flags/driver.go +++ b/packages/taiko-client/cmd/flags/driver.go @@ -30,7 +30,7 @@ var ( Category: driverCategory, EnvVars: []string{"P2P_CHECK_POINT_SYNC_URL"}, } - // syncer specific flag + // Chain syncer specific flag MaxExponent = &cli.Uint64Flag{ Name: "syncer.maxExponent", Usage: "Maximum exponent of retrieving L1 blocks when there is a mismatch between protocol and L2 EE," + @@ -52,6 +52,40 @@ var ( Category: driverCategory, EnvVars: []string{"BLOB_SOCIAL_SCAN_ENDPOINT"}, } + RPCWriteTimeout = &cli.DurationFlag{ + Name: "rpc.writeTimeout", + Usage: "HTTP RPC write timeout", + Category: driverCategory, + Value: 120 * time.Second, + EnvVars: []string{"RPC_WRITE_TIMEOUT"}, + } + // soft block server + SoftBlockServerPort = &cli.Uint64Flag{ + Name: "softBlock.port", + Usage: "HTTP port of the soft block server, 0 means disabled", + Category: driverCategory, + EnvVars: []string{"SOFT_BLOCK_SERVER_PORT"}, + } + SoftBlockServerJWTSecret = &cli.StringFlag{ + Name: "softBlock.jwtSecret", + Usage: "Path to a JWT secret to use for the soft block server", + Category: driverCategory, + EnvVars: []string{"SOFT_BLOCK_SERVER_JWT_SECRET"}, + } + SoftBlockServerCORSOrigins = &cli.StringFlag{ + Name: "softBlock.corsOrigins", + Usage: "CORS Origins settings for the soft block server", + Category: driverCategory, + Value: "*", + EnvVars: []string{"SOFT_BLOCK_SERVER_CORS_ORIGINS"}, + } + SoftBlockServerCheckSig = &cli.BoolFlag{ + Name: "softBlock.signatureCheck", + Usage: "If the soft block server will check the signature of the incoming transactions batches", + Category: driverCategory, + Value: false, + EnvVars: []string{"SOFT_BLOCK_SERVER_SIGNATURE_CHECK"}, + } ) // DriverFlags All driver flags. @@ -66,4 +100,9 @@ var DriverFlags = MergeFlags(CommonFlags, []cli.Flag{ MaxExponent, BlobServerEndpoint, SocialScanEndpoint, + RPCWriteTimeout, + SoftBlockServerPort, + SoftBlockServerJWTSecret, + SoftBlockServerCORSOrigins, + SoftBlockServerCheckSig, }) diff --git a/packages/taiko-client/cmd/flags/proposer.go b/packages/taiko-client/cmd/flags/proposer.go index d47399e6fbc..8d05cc7a0a4 100644 --- a/packages/taiko-client/cmd/flags/proposer.go +++ b/packages/taiko-client/cmd/flags/proposer.go @@ -2,8 +2,6 @@ package flags import ( "github.com/urfave/cli/v2" - - "github.com/taikoxyz/taiko-mono/packages/taiko-client/internal/version" ) // Required flags used by proposer. @@ -15,13 +13,6 @@ var ( Category: proposerCategory, EnvVars: []string{"L1_PROPOSER_PRIV_KEY"}, } - ProverEndpoints = &cli.StringFlag{ - Name: "proverEndpoints", - Usage: "Comma-delineated list of prover endpoints proposer should query when attempting to propose a block", - Required: true, - Category: proposerCategory, - EnvVars: []string{"PROVER_ENDPOINTS"}, - } L2SuggestedFeeRecipient = &cli.StringFlag{ Name: "l2.suggestedFeeRecipient", Usage: "Address of the proposed block's suggested L2 fee recipient", @@ -33,33 +24,6 @@ var ( // Optional flags used by proposer. var ( - // Tier fee related. - OptimisticTierFee = &cli.Float64Flag{ - Name: "tierFee.optimistic", - Usage: "Initial tier fee (in GWei) paid to prover to generate an optimistic proofs", - Category: proposerCategory, - EnvVars: []string{"TIER_FEE_OPTIMISTIC"}, - } - SgxTierFee = &cli.Float64Flag{ - Name: "tierFee.sgx", - Usage: "Initial tier fee (in GWei) paid to prover to generate a SGX proofs", - Category: proposerCategory, - EnvVars: []string{"TIER_FEE_SGX"}, - } - TierFeePriceBump = &cli.Uint64Flag{ - Name: "tierFee.priceBump", - Usage: "Price bump percentage when no prover wants to accept the block at initial fee", - Value: 10, - Category: proposerCategory, - EnvVars: []string{"TIER_FEE_PRICE_BUMP"}, - } - MaxTierFeePriceBumps = &cli.Uint64Flag{ - Name: "tierFee.maxPriceBumps", - Usage: "If nobody accepts block at initial tier fee, how many iterations to increase tier fee before giving up", - Category: proposerCategory, - Value: 3, - EnvVars: []string{"TIER_FEE_MAX_PRICE_BUMPS"}, - } // Proposing epoch related. ProposeInterval = &cli.DurationFlag{ Name: "epoch.interval", @@ -82,6 +46,13 @@ var ( Value: 0, EnvVars: []string{"EPOCH_MIN_TX_LIST_BYTES"}, } + MinTip = &cli.Float64Flag{ + Name: "epoch.minTip", + Usage: "Minimum tip (in GWei) for a transaction to propose", + Category: proposerCategory, + Value: 0, + EnvVars: []string{"EPOCH_MIN_TIP"}, + } MinProposingInternal = &cli.DurationFlag{ Name: "epoch.minProposingInterval", Usage: "Minimum time interval to force proposing a block, even if there are no transaction in mempool", @@ -89,13 +60,12 @@ var ( Value: 0, EnvVars: []string{"EPOCH_MIN_PROPOSING_INTERNAL"}, } - // Proposing metadata related. - ExtraData = &cli.StringFlag{ - Name: "extraData", - Usage: "Block extra data set by the proposer (default = client version)", - Value: version.CommitVersion(), + AllowZeroInterval = &cli.Uint64Flag{ + Name: "epoch.allowZeroInterval", + Usage: "If set, after this many epochs, proposer will allow propose zero tip transactions once", Category: proposerCategory, - EnvVars: []string{"EXTRA_DATA"}, + Value: 0, + EnvVars: []string{"EPOCH_ALLOW_ZERO_INTERVAL"}, } // Transactions pool related. TxPoolLocals = &cli.StringSliceFlag{ @@ -118,13 +88,6 @@ var ( Category: proposerCategory, EnvVars: []string{"TX_POOL_MAX_TX_LISTS_PER_EPOCH"}, } - ProposeBlockIncludeParentMetaHash = &cli.BoolFlag{ - Name: "includeParentMetaHash", - Usage: "Include parent meta hash when proposing block", - Value: false, - Category: proposerCategory, - EnvVars: []string{"INCLUDE_PARENT_META_HASH"}, - } // Transaction related. BlobAllowed = &cli.BoolFlag{ Name: "l1.blobAllowed", @@ -132,12 +95,20 @@ var ( Value: false, EnvVars: []string{"L1_BLOB_ALLOWED"}, } - L1BlockBuilderTip = &cli.Uint64Flag{ - Name: "l1.blockBuilderTip", - Usage: "Amount you wish to tip the L1 block builder", - Value: 0, + FallbackToCalldata = &cli.BoolFlag{ + Name: "l1.fallbackToCalldata", + Usage: "If set to true, proposer will use calldata as DA when blob fee is more expensive than using calldata", + Value: false, + Category: proposerCategory, + EnvVars: []string{"L1_FALLBACK_TO_CALLDATA"}, + } + RevertProtectionEnabled = &cli.BoolFlag{ + Name: "l1.revertProtection", + Usage: "Enable revert protection within your ProverSet contract, " + + "this is effective only if your PBS service supports revert protection", + Value: false, Category: proposerCategory, - EnvVars: []string{"L1_BLOCK_BUILDER_TIP"}, + EnvVars: []string{"L1_REVERT_PROTECTION"}, } ) @@ -152,18 +123,13 @@ var ProposerFlags = MergeFlags(CommonFlags, []cli.Flag{ ProposeInterval, TxPoolLocals, TxPoolLocalsOnly, - ExtraData, MinGasUsed, MinTxListBytes, + MinTip, MinProposingInternal, + AllowZeroInterval, MaxProposedTxListsPerEpoch, - ProverEndpoints, - OptimisticTierFee, - SgxTierFee, - TierFeePriceBump, - MaxTierFeePriceBumps, - ProposeBlockIncludeParentMetaHash, - AssignmentHookAddress, BlobAllowed, - L1BlockBuilderTip, + FallbackToCalldata, + RevertProtectionEnabled, }, TxmgrFlags) diff --git a/packages/taiko-client/cmd/flags/prover.go b/packages/taiko-client/cmd/flags/prover.go index 9ec65dfa1bf..ba24227d482 100644 --- a/packages/taiko-client/cmd/flags/prover.go +++ b/packages/taiko-client/cmd/flags/prover.go @@ -17,36 +17,35 @@ var ( Category: proverCategory, EnvVars: []string{"L1_PROVER_PRIV_KEY"}, } - ProverCapacity = &cli.Uint64Flag{ - Name: "prover.capacity", - Usage: "Capacity of prover", - Required: true, - Category: proverCategory, - EnvVars: []string{"PROVER_CAPACITY"}, - } ) // Optional flags used by prover. var ( - ProverSetAddress = &cli.StringFlag{ - Name: "proverSet", - Usage: "ProverSet contract `address`", - Value: rpc.ZeroAddress.Hex(), - Category: proverCategory, - EnvVars: []string{"PROVER_SET"}, - } RaikoHostEndpoint = &cli.StringFlag{ Name: "raiko.host", Usage: "RPC endpoint of a Raiko host service", Category: proverCategory, EnvVars: []string{"RAIKO_HOST"}, } + RaikoZKVMHostEndpoint = &cli.StringFlag{ + Name: "raiko.host.zkvm", + Usage: "RPC endpoint of a Raiko ZKVM host service", + Category: proverCategory, + EnvVars: []string{"RAIKO_HOST_ZKVM"}, + } RaikoJWTPath = &cli.StringFlag{ Name: "raiko.jwtPath", Usage: "Path to a JWT secret for the Raiko service", Category: proverCategory, EnvVars: []string{"RAIKO_JWT_PATH"}, } + RaikoRequestTimeout = &cli.DurationFlag{ + Name: "raiko.requestTimeout", + Usage: "Timeout in minutes for raiko request", + Category: commonCategory, + Value: 10 * time.Minute, + EnvVars: []string{"RAIKO_REQUEST_TIMEOUT"}, + } StartingBlockID = &cli.Uint64Flag{ Name: "prover.startingBlockID", Usage: "If set, prover will start proving blocks from the block with this ID", @@ -68,39 +67,6 @@ var ( Value: false, EnvVars: []string{"PROVER_PROVE_UNASSIGNED_BLOCKS"}, } - MinEthBalance = &cli.Float64Flag{ - Name: "prover.minEthBalance", - Usage: "Minimum ETH balance (in Ether) a prover wants to keep", - Category: proverCategory, - Value: 0, - EnvVars: []string{"PROVER_MIN_ETH_BALANCE"}, - } - MinTaikoTokenBalance = &cli.Float64Flag{ - Name: "prover.minTaikoTokenBalance", - Usage: "Minimum Taiko token balance without decimal a prover wants to keep", - Category: proverCategory, - Value: 0, - EnvVars: []string{"PROVER_MIN_TAIKO_TOKEN_BALANCE"}, - } - // Tier fee related. - MinOptimisticTierFee = &cli.Uint64Flag{ - Name: "minTierFee.optimistic", - Usage: "Minimum accepted fee for generating an optimistic proof", - Category: proverCategory, - EnvVars: []string{"MIN_TIER_FEE_OPTIMISTIC"}, - } - MinSgxTierFee = &cli.Uint64Flag{ - Name: "minTierFee.sgx", - Usage: "Minimum accepted fee for generating a SGX proof", - Category: proverCategory, - EnvVars: []string{"MIN_TIER_FEE_SGX"}, - } - MinSgxAndZkVMTierFee = &cli.Uint64Flag{ - Name: "minTierFee.sgxAndZkvm", - Usage: "Minimum accepted fee for generating a SGX + zkVM proof", - Category: proverCategory, - EnvVars: []string{"MIN_TIER_FEE_SGX_AND_ZKVM"}, - } // Running mode ContesterMode = &cli.BoolFlag{ Name: "mode.contester", @@ -132,25 +98,10 @@ var ( Category: proverCategory, EnvVars: []string{"PROVER_DUMMY"}, } - // Max slippage allowed - MaxAcceptableBlockSlippage = &cli.Uint64Flag{ - Name: "prover.blockSlippage", - Usage: "Maximum accepted slippage difference for blockID for accepting proving a block", - Value: 1024, - Category: proverCategory, - EnvVars: []string{"PROVER_BLOCK_SLIPPAGE"}, - } // Max amount of L1 blocks that can pass before block is invalid - MaxProposedIn = &cli.Uint64Flag{ - Name: "prover.maxProposedIn", - Usage: "Maximum amount of L1 blocks that can pass before block can not be proposed. 0 means no limit.", - Value: 0, - Category: proverCategory, - EnvVars: []string{"PROVER_MAX_PROPOSED_IN"}, - } Allowance = &cli.Float64Flag{ Name: "prover.allowance", - Usage: "Amount without decimal to approve AssignmentHook contract for TaikoToken usage", + Usage: "Amount without decimal to approve TaikoL1 contract for TaikoToken usage", Category: proverCategory, EnvVars: []string{"PROVER_ALLOWANCE"}, } @@ -208,22 +159,40 @@ var ( Category: proverCategory, EnvVars: []string{"PROVER_BLOCK_CONFIRMATIONS"}, } + // Batch proof related flag + SGXBatchSize = &cli.Uint64Flag{ + Name: "prover.sgx.batchSize", + Usage: "The default size of batch sgx proofs, when it arrives, submit a batch of proof immediately, " + + "this flag only works post Ontake fork", + Value: 1, + Category: proverCategory, + EnvVars: []string{"PROVER_SGX_BATCH_SIZE"}, + } + ZKVMBatchSize = &cli.Uint64Flag{ + Name: "prover.zkvm.batchSize", + Usage: "The size of batch ZKVM proof, when it arrives, submit a batch of proof immediately, " + + "this flag only works post Ontake fork", + Value: 1, + Category: proverCategory, + EnvVars: []string{"PROVER_ZKVM_BATCH_SIZE"}, + } + ForceBatchProvingInterval = &cli.DurationFlag{ + Name: "prover.forceBatchProvingInterval", + Usage: "Time interval to prove blocks even the number of pending proof do not exceed prover.batchSize, " + + "this flag only works post Ontake fork", + Category: proverCategory, + Value: 30 * time.Minute, + EnvVars: []string{"PROVER_FORCE_BATCH_PROVING_INTERVAL"}, + } ) // ProverFlags All prover flags. var ProverFlags = MergeFlags(CommonFlags, []cli.Flag{ - L1HTTPEndpoint, L2WSEndpoint, L2HTTPEndpoint, - ProverSetAddress, RaikoHostEndpoint, RaikoJWTPath, L1ProverPrivKey, - MinOptimisticTierFee, - MinSgxTierFee, - MinSgxAndZkVMTierFee, - MinEthBalance, - MinTaikoTokenBalance, StartingBlockID, Dummy, GuardianProverMinority, @@ -234,14 +203,15 @@ var ProverFlags = MergeFlags(CommonFlags, []cli.Flag{ ProveUnassignedBlocks, ContesterMode, ProverHTTPServerPort, - ProverCapacity, MaxExpiry, - MaxProposedIn, TaikoTokenAddress, - MaxAcceptableBlockSlippage, - AssignmentHookAddress, Allowance, L1NodeVersion, L2NodeVersion, BlockConfirmations, + RaikoRequestTimeout, + RaikoZKVMHostEndpoint, + SGXBatchSize, + ZKVMBatchSize, + ForceBatchProvingInterval, }, TxmgrFlags) diff --git a/packages/taiko-client/cmd/logger/logger.go b/packages/taiko-client/cmd/logger/logger.go index 7c150b81f57..7481c23ad14 100644 --- a/packages/taiko-client/cmd/logger/logger.go +++ b/packages/taiko-client/cmd/logger/logger.go @@ -20,7 +20,7 @@ func InitLogger(c *cli.Context) { glogger.Verbosity(slogVerbosity) log.SetDefault(log.NewLogger(glogger)) } else { - glogger := log.NewGlogHandler(log.NewTerminalHandler(os.Stdout, true)) + glogger := log.NewGlogHandler(log.NewTerminalHandler(os.Stdout, false)) glogger.Verbosity(slogVerbosity) log.SetDefault(log.NewLogger(glogger)) } diff --git a/packages/taiko-client/docs/docs.go b/packages/taiko-client/docs/docs.go index 82a6b6bfdc2..ca9a73974e5 100644 --- a/packages/taiko-client/docs/docs.go +++ b/packages/taiko-client/docs/docs.go @@ -17,30 +17,50 @@ const docTemplate = `{ }, "license": { "name": "MIT", - "url": "https://github.com/taikoxyz/taiko-mono/packages/taiko-client/blob/main/LICENSE.md" + "url": "https://github.com/taikoxyz/taiko-mono/blob/main/LICENSE.md" }, "version": "{{.Version}}" }, "host": "{{.Host}}", "basePath": "{{.BasePath}}", "paths": { - "/assignment": { + "/healthz": { + "get": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "summary": "Get current server health status", + "operationId": "health-check", + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "string" + } + } + } + } + }, + "/softBlocks": { "post": { + "description": "Insert a batch of transactions into a soft block for preconfirmation. If the batch is the\nfirst for a block, a new soft block will be created. Otherwise, the transactions will\nbe appended to the existing soft block. The API will fail if:\n1) the block is not soft\n2) block-level parameters are invalid or do not match the current soft block’s parameters\n3) the batch ID is not exactly 1 greater than the previous one\n4) the last batch of the block indicates no further transactions are allowed", "consumes": [ "application/json" ], "produces": [ "application/json" ], - "summary": "Try to accept a block proof assignment", "parameters": [ { - "description": "assignment request body", + "description": "soft block creation request body", "name": "body", "in": "body", "required": true, "schema": { - "$ref": "#/definitions/server.CreateAssignmentRequestBody" + "$ref": "#/definitions/softblocks.BuildSoftBlockRequestBody" } } ], @@ -48,33 +68,35 @@ const docTemplate = `{ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/server.ProposeBlockResponse" - } - }, - "422": { - "description": "prover does not have capacity", - "schema": { - "type": "string" + "$ref": "#/definitions/softblocks.BuildSoftBlockResponseBody" } } } - } - }, - "/status": { - "get": { + }, + "delete": { + "description": "Remove all soft blocks from the blockchain beyond the specified block height,\nensuring the latest block ID does not exceed the given height. This method will fail if\nthe block with an ID one greater than the specified height is not a soft block. If the\nspecified block height is greater than the latest soft block ID, the method will succeed\nwithout modifying the blockchain.", "consumes": [ "application/json" ], "produces": [ "application/json" ], - "summary": "Get current prover server status", - "operationId": "get-status", + "parameters": [ + { + "description": "soft blocks removing request body", + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/softblocks.RemoveSoftBlocksRequestBody" + } + } + ], "responses": { "200": { "description": "OK", "schema": { - "$ref": "#/definitions/server.Status" + "$ref": "#/definitions/softblocks.RemoveSoftBlocksResponseBody" } } } @@ -82,45 +104,121 @@ const docTemplate = `{ } }, "definitions": { - "server.CreateAssignmentRequestBody": { + "big.Int": { + "type": "object" + }, + "softblocks.BuildSoftBlockRequestBody": { "type": "object", "properties": { - "blobHash": { - "type": "array", - "items": { - "type": "integer" - } + "transactionBatch": { + "description": "@param transactionBatch TransactionBatch Transaction batch to be inserted into the soft block", + "allOf": [ + { + "$ref": "#/definitions/softblocks.TransactionBatch" + } + ] + } + } + }, + "softblocks.BuildSoftBlockResponseBody": { + "type": "object", + "properties": { + "blockHeader": { + "description": "@param blockHeader types.Header of the soft block", + "allOf": [ + { + "$ref": "#/definitions/types.Header" + } + ] + } + } + }, + "softblocks.RemoveSoftBlocksRequestBody": { + "type": "object", + "properties": { + "newLastBlockId": { + "description": "@param newLastBlockID uint64 New last block ID of the blockchain, it should\n@param not smaller than the canonical chain's highest block ID.", + "type": "integer" + } + } + }, + "softblocks.RemoveSoftBlocksResponseBody": { + "type": "object", + "properties": { + "headsRemoved": { + "description": "@param headsRemoved uint64 Number of soft heads removed", + "type": "integer" }, - "expiry": { + "lastBlockId": { + "description": "@param lastBlockID uint64 Current highest block ID of the blockchain (including soft blocks)", "type": "integer" }, - "feeToken": { - "type": "string" + "lastProposedBlockID": { + "description": "@param lastProposedBlockID uint64 Highest block ID of the cnonical chain", + "type": "integer" + } + } + }, + "softblocks.SoftBlockParams": { + "type": "object", + "properties": { + "anchorBlockID": { + "description": "@param anchorBlockID uint64 ` + "`" + `_anchorBlockId` + "`" + ` parameter of the ` + "`" + `anchorV2` + "`" + ` transaction in soft block", + "type": "integer" }, - "proposer": { - "type": "string" + "anchorStateRoot": { + "description": "@param anchorStateRoot string ` + "`" + `_anchorStateRoot` + "`" + ` parameter of the ` + "`" + `anchorV2` + "`" + ` transaction in soft block", + "type": "array", + "items": { + "type": "integer" + } }, - "tierFees": { + "coinbase": { + "description": "@param coinbase string Coinbase of the soft block", "type": "array", "items": { "type": "integer" } + }, + "timestamp": { + "description": "@param timestamp uint64 Timestamp of the soft block", + "type": "integer" } } }, - "server.ProposeBlockResponse": { + "softblocks.TransactionBatch": { "type": "object", "properties": { - "maxBlockID": { + "batchId": { + "description": "@param batchId uint64 ID of this transaction batch", "type": "integer" }, - "maxProposedIn": { + "batchType": { + "description": "@param batchType TransactionBatchMarker Marker of the transaction batch,\n@param either ` + "`" + `end_of_block` + "`" + `, ` + "`" + `end_of_preconf` + "`" + ` or empty", + "allOf": [ + { + "$ref": "#/definitions/softblocks.TransactionBatchMarker" + } + ] + }, + "blockId": { + "description": "@param blockId uint64 Block ID of the soft block", "type": "integer" }, - "prover": { + "blockParams": { + "description": "@param blockParams SoftBlockParams Block parameters of the soft block", + "allOf": [ + { + "$ref": "#/definitions/softblocks.SoftBlockParams" + } + ] + }, + "signature": { + "description": "@param signature string Signature of this transaction batch", "type": "string" }, - "signedPayload": { + "transactions": { + "description": "@param transactions string zlib compressed RLP encoded bytes of a transactions list", "type": "array", "items": { "type": "integer" @@ -128,23 +226,133 @@ const docTemplate = `{ } } }, - "server.Status": { + "softblocks.TransactionBatchMarker": { + "type": "string", + "enum": [ + "", + "endOfBlock", + "endOfPreconf" + ], + "x-enum-varnames": [ + "BatchMarkerEmpty", + "BatchMarkerEOB", + "BatchMarkerEOP" + ] + }, + "types.Header": { "type": "object", "properties": { - "maxExpiry": { + "baseFeePerGas": { + "description": "BaseFee was added by EIP-1559 and is ignored in legacy headers.", + "allOf": [ + { + "$ref": "#/definitions/big.Int" + } + ] + }, + "blobGasUsed": { + "description": "BlobGasUsed was added by EIP-4844 and is ignored in legacy headers.", "type": "integer" }, - "minOptimisticTierFee": { + "difficulty": { + "$ref": "#/definitions/big.Int" + }, + "excessBlobGas": { + "description": "ExcessBlobGas was added by EIP-4844 and is ignored in legacy headers.", "type": "integer" }, - "minSgxAndZkVMTierFee": { + "extraData": { + "type": "array", + "items": { + "type": "integer" + } + }, + "gasLimit": { "type": "integer" }, - "minSgxTierFee": { + "gasUsed": { "type": "integer" }, - "prover": { - "type": "string" + "logsBloom": { + "type": "array", + "items": { + "type": "integer" + } + }, + "miner": { + "type": "array", + "items": { + "type": "integer" + } + }, + "mixHash": { + "type": "array", + "items": { + "type": "integer" + } + }, + "nonce": { + "type": "array", + "items": { + "type": "integer" + } + }, + "number": { + "$ref": "#/definitions/big.Int" + }, + "parentBeaconBlockRoot": { + "description": "ParentBeaconRoot was added by EIP-4788 and is ignored in legacy headers.", + "type": "array", + "items": { + "type": "integer" + } + }, + "parentHash": { + "type": "array", + "items": { + "type": "integer" + } + }, + "receiptsRoot": { + "type": "array", + "items": { + "type": "integer" + } + }, + "requestsRoot": { + "description": "RequestsHash was added by EIP-7685 and is ignored in legacy headers.", + "type": "array", + "items": { + "type": "integer" + } + }, + "sha3Uncles": { + "type": "array", + "items": { + "type": "integer" + } + }, + "stateRoot": { + "type": "array", + "items": { + "type": "integer" + } + }, + "timestamp": { + "type": "integer" + }, + "transactionsRoot": { + "type": "array", + "items": { + "type": "integer" + } + }, + "withdrawalsRoot": { + "description": "WithdrawalsHash was added by EIP-4895 and is ignored in legacy headers.", + "type": "array", + "items": { + "type": "integer" + } } } } @@ -157,7 +365,7 @@ var SwaggerInfo = &swag.Spec{ Host: "", BasePath: "", Schemes: []string{}, - Title: "Taiko Prover Server API", + Title: "Taiko Soft Block Server API", Description: "", InfoInstanceName: "swagger", SwaggerTemplate: docTemplate, diff --git a/packages/taiko-client/docs/index.html b/packages/taiko-client/docs/index.html index f6092ef03c9..fd6da6d8abf 100644 --- a/packages/taiko-client/docs/index.html +++ b/packages/taiko-client/docs/index.html @@ -1,9 +1,9 @@ - - - Prover Server API + + + Taiko Preconfirmation Server API
@@ -11,7 +11,7 @@ window.onload = function () { // Begin Swagger UI call region const ui = SwaggerUIBundle({ - url: "/swagger.json", // Location of Open API spec in the repo + url: "swagger.json", //Location of Open API spec in the repo dom_id: '#swagger-ui', deepLinking: true, presets: [ diff --git a/packages/taiko-client/docs/swagger.json b/packages/taiko-client/docs/swagger.json index 64110df27cc..2e72737ed95 100644 --- a/packages/taiko-client/docs/swagger.json +++ b/packages/taiko-client/docs/swagger.json @@ -1,7 +1,7 @@ { "swagger": "2.0", "info": { - "title": "Taiko Prover Server API", + "title": "Taiko Soft Block Server API", "termsOfService": "http://swagger.io/terms/", "contact": { "name": "API Support", @@ -10,24 +10,40 @@ }, "license": { "name": "MIT", - "url": "https://github.com/taikoxyz/taiko-mono/packages/taiko-client/blob/main/LICENSE.md" + "url": "https://github.com/taikoxyz/taiko-mono/blob/main/LICENSE.md" }, "version": "1.0" }, "paths": { - "/assignment": { + "/healthz": { + "get": { + "consumes": ["application/json"], + "produces": ["application/json"], + "summary": "Get current server health status", + "operationId": "health-check", + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "string" + } + } + } + } + }, + "/softBlocks": { "post": { + "description": "Insert a batch of transactions into a soft block for preconfirmation. If the batch is the\nfirst for a block, a new soft block will be created. Otherwise, the transactions will\nbe appended to the existing soft block. The API will fail if:\n1) the block is not soft\n2) block-level parameters are invalid or do not match the current soft block’s parameters\n3) the batch ID is not exactly 1 greater than the previous one\n4) the last batch of the block indicates no further transactions are allowed", "consumes": ["application/json"], "produces": ["application/json"], - "summary": "Try to accept a block proof assignment", "parameters": [ { - "description": "assignment request body", + "description": "soft block creation request body", "name": "body", "in": "body", "required": true, "schema": { - "$ref": "#/definitions/server.CreateAssignmentRequestBody" + "$ref": "#/definitions/softblocks.BuildSoftBlockRequestBody" } } ], @@ -35,29 +51,31 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/server.ProposeBlockResponse" - } - }, - "422": { - "description": "prover does not have capacity", - "schema": { - "type": "string" + "$ref": "#/definitions/softblocks.BuildSoftBlockResponseBody" } } } - } - }, - "/status": { - "get": { + }, + "delete": { + "description": "Remove all soft blocks from the blockchain beyond the specified block height,\nensuring the latest block ID does not exceed the given height. This method will fail if\nthe block with an ID one greater than the specified height is not a soft block. If the\nspecified block height is greater than the latest soft block ID, the method will succeed\nwithout modifying the blockchain.", "consumes": ["application/json"], "produces": ["application/json"], - "summary": "Get current prover server status", - "operationId": "get-status", + "parameters": [ + { + "description": "soft blocks removing request body", + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/softblocks.RemoveSoftBlocksRequestBody" + } + } + ], "responses": { "200": { "description": "OK", "schema": { - "$ref": "#/definitions/server.Status" + "$ref": "#/definitions/softblocks.RemoveSoftBlocksResponseBody" } } } @@ -65,45 +83,121 @@ } }, "definitions": { - "server.CreateAssignmentRequestBody": { + "big.Int": { + "type": "object" + }, + "softblocks.BuildSoftBlockRequestBody": { "type": "object", "properties": { - "blobHash": { - "type": "array", - "items": { - "type": "integer" - } + "transactionBatch": { + "description": "@param transactionBatch TransactionBatch Transaction batch to be inserted into the soft block", + "allOf": [ + { + "$ref": "#/definitions/softblocks.TransactionBatch" + } + ] + } + } + }, + "softblocks.BuildSoftBlockResponseBody": { + "type": "object", + "properties": { + "blockHeader": { + "description": "@param blockHeader types.Header of the soft block", + "allOf": [ + { + "$ref": "#/definitions/types.Header" + } + ] + } + } + }, + "softblocks.RemoveSoftBlocksRequestBody": { + "type": "object", + "properties": { + "newLastBlockId": { + "description": "@param newLastBlockID uint64 New last block ID of the blockchain, it should\n@param not smaller than the canonical chain's highest block ID.", + "type": "integer" + } + } + }, + "softblocks.RemoveSoftBlocksResponseBody": { + "type": "object", + "properties": { + "headsRemoved": { + "description": "@param headsRemoved uint64 Number of soft heads removed", + "type": "integer" }, - "expiry": { + "lastBlockId": { + "description": "@param lastBlockID uint64 Current highest block ID of the blockchain (including soft blocks)", "type": "integer" }, - "feeToken": { - "type": "string" + "lastProposedBlockID": { + "description": "@param lastProposedBlockID uint64 Highest block ID of the cnonical chain", + "type": "integer" + } + } + }, + "softblocks.SoftBlockParams": { + "type": "object", + "properties": { + "anchorBlockID": { + "description": "@param anchorBlockID uint64 `_anchorBlockId` parameter of the `anchorV2` transaction in soft block", + "type": "integer" }, - "proposer": { - "type": "string" + "anchorStateRoot": { + "description": "@param anchorStateRoot string `_anchorStateRoot` parameter of the `anchorV2` transaction in soft block", + "type": "array", + "items": { + "type": "integer" + } }, - "tierFees": { + "coinbase": { + "description": "@param coinbase string Coinbase of the soft block", "type": "array", "items": { "type": "integer" } + }, + "timestamp": { + "description": "@param timestamp uint64 Timestamp of the soft block", + "type": "integer" } } }, - "server.ProposeBlockResponse": { + "softblocks.TransactionBatch": { "type": "object", "properties": { - "maxBlockID": { + "batchId": { + "description": "@param batchId uint64 ID of this transaction batch", "type": "integer" }, - "maxProposedIn": { + "batchType": { + "description": "@param batchType TransactionBatchMarker Marker of the transaction batch,\n@param either `end_of_block`, `end_of_preconf` or empty", + "allOf": [ + { + "$ref": "#/definitions/softblocks.TransactionBatchMarker" + } + ] + }, + "blockId": { + "description": "@param blockId uint64 Block ID of the soft block", "type": "integer" }, - "prover": { + "blockParams": { + "description": "@param blockParams SoftBlockParams Block parameters of the soft block", + "allOf": [ + { + "$ref": "#/definitions/softblocks.SoftBlockParams" + } + ] + }, + "signature": { + "description": "@param signature string Signature of this transaction batch", "type": "string" }, - "signedPayload": { + "transactions": { + "description": "@param transactions string zlib compressed RLP encoded bytes of a transactions list", "type": "array", "items": { "type": "integer" @@ -111,23 +205,129 @@ } } }, - "server.Status": { + "softblocks.TransactionBatchMarker": { + "type": "string", + "enum": ["", "endOfBlock", "endOfPreconf"], + "x-enum-varnames": [ + "BatchMarkerEmpty", + "BatchMarkerEOB", + "BatchMarkerEOP" + ] + }, + "types.Header": { "type": "object", "properties": { - "maxExpiry": { + "baseFeePerGas": { + "description": "BaseFee was added by EIP-1559 and is ignored in legacy headers.", + "allOf": [ + { + "$ref": "#/definitions/big.Int" + } + ] + }, + "blobGasUsed": { + "description": "BlobGasUsed was added by EIP-4844 and is ignored in legacy headers.", "type": "integer" }, - "minOptimisticTierFee": { + "difficulty": { + "$ref": "#/definitions/big.Int" + }, + "excessBlobGas": { + "description": "ExcessBlobGas was added by EIP-4844 and is ignored in legacy headers.", "type": "integer" }, - "minSgxAndZkVMTierFee": { + "extraData": { + "type": "array", + "items": { + "type": "integer" + } + }, + "gasLimit": { "type": "integer" }, - "minSgxTierFee": { + "gasUsed": { "type": "integer" }, - "prover": { - "type": "string" + "logsBloom": { + "type": "array", + "items": { + "type": "integer" + } + }, + "miner": { + "type": "array", + "items": { + "type": "integer" + } + }, + "mixHash": { + "type": "array", + "items": { + "type": "integer" + } + }, + "nonce": { + "type": "array", + "items": { + "type": "integer" + } + }, + "number": { + "$ref": "#/definitions/big.Int" + }, + "parentBeaconBlockRoot": { + "description": "ParentBeaconRoot was added by EIP-4788 and is ignored in legacy headers.", + "type": "array", + "items": { + "type": "integer" + } + }, + "parentHash": { + "type": "array", + "items": { + "type": "integer" + } + }, + "receiptsRoot": { + "type": "array", + "items": { + "type": "integer" + } + }, + "requestsRoot": { + "description": "RequestsHash was added by EIP-7685 and is ignored in legacy headers.", + "type": "array", + "items": { + "type": "integer" + } + }, + "sha3Uncles": { + "type": "array", + "items": { + "type": "integer" + } + }, + "stateRoot": { + "type": "array", + "items": { + "type": "integer" + } + }, + "timestamp": { + "type": "integer" + }, + "transactionsRoot": { + "type": "array", + "items": { + "type": "integer" + } + }, + "withdrawalsRoot": { + "description": "WithdrawalsHash was added by EIP-4895 and is ignored in legacy headers.", + "type": "array", + "items": { + "type": "integer" + } } } } diff --git a/packages/taiko-client/docs/swagger.yaml b/packages/taiko-client/docs/swagger.yaml index 1c1a1495322..88bafda32e4 100644 --- a/packages/taiko-client/docs/swagger.yaml +++ b/packages/taiko-client/docs/swagger.yaml @@ -1,46 +1,193 @@ definitions: - server.CreateAssignmentRequestBody: + big.Int: + type: object + softblocks.BuildSoftBlockRequestBody: + properties: + transactionBatch: + allOf: + - $ref: "#/definitions/softblocks.TransactionBatch" + description: + "@param transactionBatch TransactionBatch Transaction batch to + be inserted into the soft block" + type: object + softblocks.BuildSoftBlockResponseBody: + properties: + blockHeader: + allOf: + - $ref: "#/definitions/types.Header" + description: "@param blockHeader types.Header of the soft block" + type: object + softblocks.RemoveSoftBlocksRequestBody: + properties: + newLastBlockId: + description: |- + @param newLastBlockID uint64 New last block ID of the blockchain, it should + @param not smaller than the canonical chain's highest block ID. + type: integer + type: object + softblocks.RemoveSoftBlocksResponseBody: + properties: + headsRemoved: + description: "@param headsRemoved uint64 Number of soft heads removed" + type: integer + lastBlockId: + description: + "@param lastBlockID uint64 Current highest block ID of the blockchain + (including soft blocks)" + type: integer + lastProposedBlockID: + description: + "@param lastProposedBlockID uint64 Highest block ID of the cnonical + chain" + type: integer + type: object + softblocks.SoftBlockParams: properties: - blobHash: + anchorBlockID: + description: + "@param anchorBlockID uint64 `_anchorBlockId` parameter of the + `anchorV2` transaction in soft block" + type: integer + anchorStateRoot: + description: + "@param anchorStateRoot string `_anchorStateRoot` parameter of + the `anchorV2` transaction in soft block" items: type: integer type: array - expiry: - type: integer - feeToken: - type: string - proposer: - type: string - tierFees: + coinbase: + description: "@param coinbase string Coinbase of the soft block" items: type: integer type: array + timestamp: + description: "@param timestamp uint64 Timestamp of the soft block" + type: integer type: object - server.ProposeBlockResponse: + softblocks.TransactionBatch: properties: - maxBlockID: + batchId: + description: "@param batchId uint64 ID of this transaction batch" type: integer - maxProposedIn: + batchType: + allOf: + - $ref: "#/definitions/softblocks.TransactionBatchMarker" + description: |- + @param batchType TransactionBatchMarker Marker of the transaction batch, + @param either `end_of_block`, `end_of_preconf` or empty + blockId: + description: "@param blockId uint64 Block ID of the soft block" type: integer - prover: + blockParams: + allOf: + - $ref: "#/definitions/softblocks.SoftBlockParams" + description: + "@param blockParams SoftBlockParams Block parameters of the soft + block" + signature: + description: "@param signature string Signature of this transaction batch" type: string - signedPayload: + transactions: + description: + "@param transactions string zlib compressed RLP encoded bytes + of a transactions list" items: type: integer type: array type: object - server.Status: + softblocks.TransactionBatchMarker: + enum: + - "" + - endOfBlock + - endOfPreconf + type: string + x-enum-varnames: + - BatchMarkerEmpty + - BatchMarkerEOB + - BatchMarkerEOP + types.Header: properties: - maxExpiry: + baseFeePerGas: + allOf: + - $ref: "#/definitions/big.Int" + description: BaseFee was added by EIP-1559 and is ignored in legacy headers. + blobGasUsed: + description: BlobGasUsed was added by EIP-4844 and is ignored in legacy headers. type: integer - minOptimisticTierFee: + difficulty: + $ref: "#/definitions/big.Int" + excessBlobGas: + description: + ExcessBlobGas was added by EIP-4844 and is ignored in legacy + headers. type: integer - minSgxAndZkVMTierFee: + extraData: + items: + type: integer + type: array + gasLimit: type: integer - minSgxTierFee: + gasUsed: type: integer - prover: - type: string + logsBloom: + items: + type: integer + type: array + miner: + items: + type: integer + type: array + mixHash: + items: + type: integer + type: array + nonce: + items: + type: integer + type: array + number: + $ref: "#/definitions/big.Int" + parentBeaconBlockRoot: + description: + ParentBeaconRoot was added by EIP-4788 and is ignored in legacy + headers. + items: + type: integer + type: array + parentHash: + items: + type: integer + type: array + receiptsRoot: + items: + type: integer + type: array + requestsRoot: + description: RequestsHash was added by EIP-7685 and is ignored in legacy headers. + items: + type: integer + type: array + sha3Uncles: + items: + type: integer + type: array + stateRoot: + items: + type: integer + type: array + timestamp: + type: integer + transactionsRoot: + items: + type: integer + type: array + withdrawalsRoot: + description: + WithdrawalsHash was added by EIP-4895 and is ignored in legacy + headers. + items: + type: integer + type: array type: object info: contact: @@ -49,45 +196,71 @@ info: url: https://community.taiko.xyz/ license: name: MIT - url: https://github.com/taikoxyz/taiko-mono/packages/taiko-client/blob/main/LICENSE.md + url: https://github.com/taikoxyz/taiko-mono/blob/main/LICENSE.md termsOfService: http://swagger.io/terms/ - title: Taiko Prover Server API + title: Taiko Soft Block Server API version: "1.0" paths: - /assignment: - post: + /healthz: + get: + consumes: + - application/json + operationId: health-check + produces: + - application/json + responses: + "200": + description: OK + schema: + type: string + summary: Get current server health status + /softBlocks: + delete: consumes: - application/json + description: |- + Remove all soft blocks from the blockchain beyond the specified block height, + ensuring the latest block ID does not exceed the given height. This method will fail if + the block with an ID one greater than the specified height is not a soft block. If the + specified block height is greater than the latest soft block ID, the method will succeed + without modifying the blockchain. parameters: - - description: assignment request body + - description: soft blocks removing request body in: body name: body required: true schema: - $ref: "#/definitions/server.CreateAssignmentRequestBody" + $ref: "#/definitions/softblocks.RemoveSoftBlocksRequestBody" produces: - application/json responses: "200": description: OK schema: - $ref: "#/definitions/server.ProposeBlockResponse" - "422": - description: prover does not have capacity - schema: - type: string - summary: Try to accept a block proof assignment - /status: - get: + $ref: "#/definitions/softblocks.RemoveSoftBlocksResponseBody" + post: consumes: - application/json - operationId: get-status + description: |- + Insert a batch of transactions into a soft block for preconfirmation. If the batch is the + first for a block, a new soft block will be created. Otherwise, the transactions will + be appended to the existing soft block. The API will fail if: + 1) the block is not soft + 2) block-level parameters are invalid or do not match the current soft block’s parameters + 3) the batch ID is not exactly 1 greater than the previous one + 4) the last batch of the block indicates no further transactions are allowed + parameters: + - description: soft block creation request body + in: body + name: body + required: true + schema: + $ref: "#/definitions/softblocks.BuildSoftBlockRequestBody" produces: - application/json responses: "200": description: OK schema: - $ref: "#/definitions/server.Status" - summary: Get current prover server status + $ref: "#/definitions/softblocks.BuildSoftBlockResponseBody" swagger: "2.0" diff --git a/packages/taiko-client/driver/anchor_tx_constructor/anchor_tx_constructor.go b/packages/taiko-client/driver/anchor_tx_constructor/anchor_tx_constructor.go index c17cbc5a0f5..5bc43b1fd6a 100644 --- a/packages/taiko-client/driver/anchor_tx_constructor/anchor_tx_constructor.go +++ b/packages/taiko-client/driver/anchor_tx_constructor/anchor_tx_constructor.go @@ -12,10 +12,11 @@ import ( "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/log" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings" "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/encoding" "github.com/taikoxyz/taiko-mono/packages/taiko-client/driver/signer" - "github.com/taikoxyz/taiko-mono/packages/taiko-client/internal/utils" "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/rpc" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/utils" ) // AnchorTxConstructor is responsible for assembling the anchor transaction (TaikoL2.anchor) in @@ -69,12 +70,17 @@ func (c *AnchorTxConstructor) AssembleAnchorTx( return c.rpc.TaikoL2.Anchor(opts, l1Hash, l1Header.Root, l1Height.Uint64(), uint32(parentGasUsed)) } -func (c *AnchorTxConstructor) AssembleNullAnchorTx( +// AssembleAnchorV2Tx assembles a signed TaikoL2.anchorV2 transaction. +func (c *AnchorTxConstructor) AssembleAnchorV2Tx( ctx context.Context, - // Height of the L2 block which including the TaikoL2.anchor transaction. + // Parameters of the TaikoL2.anchorV2 transaction. + anchorBlockID *big.Int, + anchorStateRoot common.Hash, + parentGasUsed uint64, + baseFeeConfig *bindings.LibSharedDataBaseFeeConfig, + // Height of the L2 block which including the TaikoL2.anchorV2 transaction. l2Height *big.Int, baseFee *big.Int, - gasUsed uint64, ) (*types.Transaction, error) { opts, err := c.transactOpts(ctx, l2Height, baseFee) if err != nil { @@ -82,18 +88,22 @@ func (c *AnchorTxConstructor) AssembleNullAnchorTx( } log.Info( - "Null anchor arguments", + "AnchorV2 arguments", "l2Height", l2Height, + "anchorBlockId", anchorBlockID, + "anchorStateRoot", anchorStateRoot, + "parentGasUsed", parentGasUsed, + "gasIssuancePerSecond", baseFeeConfig.GasIssuancePerSecond, + "basefeeAdjustmentQuotient", baseFeeConfig.AdjustmentQuotient, "baseFee", utils.WeiToGWei(baseFee), - "gasUsed", gasUsed, ) - return c.rpc.TaikoL2.Anchor( + return c.rpc.TaikoL2.AnchorV2( opts, - common.BigToHash(common.Big0), - common.BigToHash(common.Big0), - common.Big0.Uint64(), - uint32(gasUsed), + anchorBlockID.Uint64(), + anchorStateRoot, + uint32(parentGasUsed), + *baseFeeConfig, ) } diff --git a/packages/taiko-client/driver/anchor_tx_constructor/anchor_tx_constructor_test.go b/packages/taiko-client/driver/anchor_tx_constructor/anchor_tx_constructor_test.go index 4b6e2831bdb..e5bb427a639 100644 --- a/packages/taiko-client/driver/anchor_tx_constructor/anchor_tx_constructor_test.go +++ b/packages/taiko-client/driver/anchor_tx_constructor/anchor_tx_constructor_test.go @@ -11,6 +11,7 @@ import ( "github.com/ethereum/go-ethereum/crypto" "github.com/stretchr/testify/suite" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings" "github.com/taikoxyz/taiko-mono/packages/taiko-client/internal/testutils" ) @@ -42,6 +43,20 @@ func (s *AnchorTxConstructorTestSuite) TestAssembleAnchorTx() { s.NotNil(tx) } +func (s *AnchorTxConstructorTestSuite) TestAssembleAnchorV2Tx() { + tx, err := s.c.AssembleAnchorV2Tx( + context.Background(), + s.l1Height, + s.l1Hash, + 1024, + &bindings.LibSharedDataBaseFeeConfig{}, + common.Big1, + common.Big256, + ) + s.Nil(err) + s.NotNil(tx) +} + func (s *AnchorTxConstructorTestSuite) TestNewAnchorTransactor() { goldenTouchAddress, err := s.RPCClient.TaikoL2.GOLDENTOUCHADDRESS(nil) s.Nil(err) diff --git a/packages/taiko-client/driver/chain_syncer/beaconsync/syncer.go b/packages/taiko-client/driver/chain_syncer/beaconsync/syncer.go index 62f49f762a3..0860dc9d46e 100644 --- a/packages/taiko-client/driver/chain_syncer/beaconsync/syncer.go +++ b/packages/taiko-client/driver/chain_syncer/beaconsync/syncer.go @@ -10,6 +10,7 @@ import ( "github.com/ethereum/go-ethereum/eth/downloader" "github.com/ethereum/go-ethereum/log" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings" "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/encoding" "github.com/taikoxyz/taiko-mono/packages/taiko-client/driver/state" "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/rpc" @@ -71,9 +72,7 @@ func (s *Syncer) TriggerBeaconSync(blockID uint64) error { } fcRes, err := s.rpc.L2Engine.ForkchoiceUpdate(s.ctx, &engine.ForkchoiceStateV1{ - HeadBlockHash: headPayload.BlockHash, - SafeBlockHash: headPayload.BlockHash, - FinalizedBlockHash: headPayload.BlockHash, + HeadBlockHash: headPayload.BlockHash, }, nil) if err != nil { return err @@ -104,11 +103,22 @@ func (s *Syncer) getBlockPayload(ctx context.Context, blockID uint64) (*engine.E // If the sync mode is `full`, we need to verify the protocol verified block hash before syncing. if s.syncMode == downloader.FullSync.String() { - blockInfo, err := s.rpc.GetL2BlockInfo(ctx, new(big.Int).SetUint64(blockID)) + blockNum := new(big.Int).SetUint64(blockID) + var blockInfo bindings.TaikoDataBlockV2 + if s.state.IsOnTake(blockNum) { + blockInfo, err = s.rpc.GetL2BlockInfoV2(ctx, blockNum) + } else { + blockInfo, err = s.rpc.GetL2BlockInfo(ctx, blockNum) + } if err != nil { return nil, err } - ts, err := s.rpc.GetTransition(ctx, new(big.Int).SetUint64(blockInfo.BlockId), blockInfo.VerifiedTransitionId) + ts, err := s.rpc.GetTransition( + ctx, + new(big.Int).SetUint64(blockInfo.BlockId), + + uint32(blockInfo.VerifiedTransitionId.Uint64()), + ) if err != nil { return nil, err } diff --git a/packages/taiko-client/driver/chain_syncer/blob/soft_block.go b/packages/taiko-client/driver/chain_syncer/blob/soft_block.go new file mode 100644 index 00000000000..4c4e6e5064a --- /dev/null +++ b/packages/taiko-client/driver/chain_syncer/blob/soft_block.go @@ -0,0 +1,298 @@ +package blob + +import ( + "context" + "errors" + "fmt" + "math/big" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/beacon/engine" + "github.com/ethereum/go-ethereum/common" + consensus "github.com/ethereum/go-ethereum/consensus/taiko" + "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/rlp" + + "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/encoding" + softblocks "github.com/taikoxyz/taiko-mono/packages/taiko-client/driver/soft_blocks" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/rpc" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/utils" +) + +// InsertSoftBlockFromTransactionsBatch inserts a soft block into the L2 execution engine's blockchain +// from the given transactions batch. +func (s *Syncer) InsertSoftBlockFromTransactionsBatch( + ctx context.Context, + blockID uint64, + batchID uint64, + txListBytes []byte, + batchMarker softblocks.TransactionBatchMarker, + blockParams *softblocks.SoftBlockParams, +) (*types.Header, error) { + s.mutex.Lock() + defer s.mutex.Unlock() + + parent, err := s.rpc.L2.HeaderByNumber(ctx, new(big.Int).Sub(new(big.Int).SetUint64(blockID), common.Big1)) + if err != nil { + return nil, err + } + + if parent.Number.Uint64()+1 != blockID { + return nil, fmt.Errorf("parent block number (%d) is not equal to blockID - 1 (%d)", parent.Number.Uint64(), blockID) + } + + // Calculate the other block parameters + difficultyHashPaylaod, err := encoding.EncodeDifficultyCalcutionParams(blockID) + if err != nil { + return nil, fmt.Errorf("failed to encode `block.difficulty` calculation parameters: %w", err) + } + protocolConfigs, err := rpc.GetProtocolConfigs(s.rpc.TaikoL1, &bind.CallOpts{Context: ctx}) + if err != nil { + return nil, fmt.Errorf("failed to fetch protocol configs: %w", err) + } + + var ( + txList []*types.Transaction + fc = &engine.ForkchoiceStateV1{HeadBlockHash: parent.Hash()} + difficulty = crypto.Keccak256Hash(difficultyHashPaylaod) + extraData = encoding.EncodeBaseFeeConfig(&protocolConfigs.BaseFeeConfig) + ) + + if err := rlp.DecodeBytes(txListBytes, &txList); err != nil { + return nil, fmt.Errorf("failed to RLP decode txList bytes: %w", err) + } + + baseFee, err := s.rpc.CalculateBaseFee( + ctx, + parent, + new(big.Int).SetUint64(blockParams.AnchorBlockID), + true, + &protocolConfigs.BaseFeeConfig, + blockParams.Timestamp, + ) + if err != nil { + return nil, fmt.Errorf("failed to calculate base fee: %w", err) + } + + // Insert the anchor transaction at the head of the transactions list. + if batchID == 0 { + // Assemble a TaikoL2.anchorV2 transaction. + anchorTx, err := s.anchorConstructor.AssembleAnchorV2Tx( + ctx, + new(big.Int).SetUint64(blockParams.AnchorBlockID), + blockParams.AnchorStateRoot, + parent.GasUsed, + &protocolConfigs.BaseFeeConfig, + new(big.Int).SetUint64(blockID), + baseFee, + ) + if err != nil { + return nil, fmt.Errorf("failed to create TaikoL2.anchorV2 transaction: %w", err) + } + + txList = append([]*types.Transaction{anchorTx}, txList...) + } else { + prevSoftBlock, err := s.rpc.L2.BlockByNumber(ctx, new(big.Int).SetUint64(blockID)) + if err != nil { + return nil, fmt.Errorf("failed to fetch previous soft block (%d): %w", blockID, err) + } + + // Ensure the previous soft block is the current chain head. + blockNums, err := s.rpc.L2.BlockNumber(ctx) + if err != nil { + return nil, fmt.Errorf("failed to fetch the chain block number: %w", err) + } + + if prevSoftBlock.Number().Uint64() != blockNums { + return nil, fmt.Errorf( + "soft block (%d) to update is not the current chain head (%d)", + prevSoftBlock.Number().Uint64(), + blockNums, + ) + } + + // Check baseFee + if prevSoftBlock.BaseFee().Cmp(baseFee) != 0 { + return nil, fmt.Errorf( + "baseFee is not equal to the latest soft block's, expect: %s, actual: %s", + prevSoftBlock.BaseFee().String(), + baseFee.String(), + ) + } + + // Check the previous soft block status. + l1Origin, err := s.rpc.L2.L1OriginByID(ctx, prevSoftBlock.Number()) + if err != nil { + return nil, fmt.Errorf("failed to fetch L1 origin for block %d: %w", blockID, err) + } + if l1Origin.BatchID == nil { + return nil, fmt.Errorf("batch ID is nil for block %d", blockID) + } + if l1Origin.BatchID.Uint64()+1 != batchID { + return nil, fmt.Errorf("batch ID mismatch: expected %d, got %d", l1Origin.BatchID.Uint64()+1, batchID) + } + if l1Origin.EndOfBlock { + return nil, fmt.Errorf("soft block %d has already been marked as ended", blockID) + } + if l1Origin.EndOfPreconf { + return nil, fmt.Errorf("preconfirmation from %s has already been marked as ended", blockParams.Coinbase) + } + + txList = append(prevSoftBlock.Transactions(), txList...) + } + + if txListBytes, err = rlp.EncodeToBytes(txList); err != nil { + log.Error("Encode txList error", "blockID", blockID, "error", err) + return nil, err + } + + attributes := &engine.PayloadAttributes{ + Timestamp: blockParams.Timestamp, + Random: difficulty, + SuggestedFeeRecipient: blockParams.Coinbase, + Withdrawals: []*types.Withdrawal{}, + BlockMetadata: &engine.BlockMetadata{ + Beneficiary: blockParams.Coinbase, + GasLimit: uint64(protocolConfigs.BlockMaxGasLimit) + consensus.AnchorGasLimit, + Timestamp: blockParams.Timestamp, + TxList: txListBytes, + MixHash: difficulty, + ExtraData: extraData[:], + }, + BaseFeePerGas: baseFee, + L1Origin: &rawdb.L1Origin{ + BlockID: new(big.Int).SetUint64(blockID), + L2BlockHash: common.Hash{}, // Will be set by taiko-geth. + L1BlockHeight: nil, // No L1 block height for soft blocks. + L1BlockHash: common.Hash{}, // No L1 block hash for soft blocks. + BatchID: new(big.Int).SetUint64(batchID), + EndOfBlock: batchMarker == softblocks.BatchMarkerEOB, + EndOfPreconf: batchMarker == softblocks.BatchMarkerEOP, + Preconfer: blockParams.Coinbase, + }, + } + + log.Info( + "Soft block payloadAttributes", + "blockID", blockID, + "batchID", batchID, + "timestamp", attributes.Timestamp, + "random", attributes.Random, + "suggestedFeeRecipient", attributes.SuggestedFeeRecipient, + "withdrawals", len(attributes.Withdrawals), + "gasLimit", attributes.BlockMetadata.GasLimit, + "timestamp", attributes.BlockMetadata.Timestamp, + "mixHash", attributes.BlockMetadata.MixHash, + "baseFee", utils.WeiToGWei(attributes.BaseFeePerGas), + "extraData", common.Bytes2Hex(attributes.BlockMetadata.ExtraData), + "transactions", len(txList), + ) + + // Step 1, prepare a payload + fcRes, err := s.rpc.L2Engine.ForkchoiceUpdate(ctx, fc, attributes) + if err != nil { + return nil, fmt.Errorf("failed to update fork choice: %w", err) + } + if fcRes.PayloadStatus.Status != engine.VALID { + return nil, fmt.Errorf("unexpected ForkchoiceUpdate response status: %s", fcRes.PayloadStatus.Status) + } + if fcRes.PayloadID == nil { + return nil, errors.New("empty payload ID") + } + + // Step 2, get the payload + payload, err := s.rpc.L2Engine.GetPayload(ctx, fcRes.PayloadID) + if err != nil { + return nil, fmt.Errorf("failed to get payload: %w", err) + } + + log.Info( + "Soft block payload", + "blockID", blockID, + "batchID", batchID, + "baseFee", utils.WeiToGWei(payload.BaseFeePerGas), + "number", payload.Number, + "hash", payload.BlockHash, + "gasLimit", payload.GasLimit, + "gasUsed", payload.GasUsed, + "timestamp", payload.Timestamp, + "withdrawalsHash", payload.WithdrawalsHash, + ) + + // Step 3, execute the payload + execStatus, err := s.rpc.L2Engine.NewPayload(ctx, payload) + if err != nil { + return nil, fmt.Errorf("failed to create a new payload: %w", err) + } + if execStatus.Status != engine.VALID { + return nil, fmt.Errorf("unexpected NewPayload response status: %s", execStatus.Status) + } + + lastVerifiedBlockInfo, err := s.rpc.GetLastVerifiedBlock(ctx) + if err != nil { + return nil, fmt.Errorf("failed to fetch last verified block hash: %w", err) + } + + canonicalHead, err := s.rpc.L2.HeadL1Origin(ctx) + if err != nil { + return nil, fmt.Errorf("failed to fetch canonical head: %w", err) + } + + // Step 4, update the fork choice + fc = &engine.ForkchoiceStateV1{ + HeadBlockHash: payload.BlockHash, + SafeBlockHash: canonicalHead.L2BlockHash, + FinalizedBlockHash: lastVerifiedBlockInfo.BlockHash, + } + fcRes, err = s.rpc.L2Engine.ForkchoiceUpdate(ctx, fc, nil) + if err != nil { + return nil, err + } + if fcRes.PayloadStatus.Status != engine.VALID { + return nil, fmt.Errorf("unexpected ForkchoiceUpdate response status: %s", fcRes.PayloadStatus.Status) + } + + header, err := s.rpc.L2.HeaderByHash(ctx, payload.BlockHash) + if err != nil { + return nil, err + } + + log.Info( + "⏰ New soft L2 block inserted", + "blockID", blockID, + "batchID", batchID, + "hash", header.Hash(), + "transactions", len(payload.Transactions), + "baseFee", utils.WeiToGWei(header.BaseFee), + "withdrawals", len(payload.Withdrawals), + "endOfBlock", attributes.L1Origin.EndOfBlock, + "endOfPreconf", attributes.L1Origin.EndOfPreconf, + ) + + return header, nil +} + +// RemoveSoftBlocks removes soft blocks from the L2 execution engine's blockchain. +func (s *Syncer) RemoveSoftBlocks(ctx context.Context, newLastBlockID uint64) error { + s.mutex.Lock() + defer s.mutex.Unlock() + + newHead, err := s.rpc.L2.HeaderByNumber(ctx, new(big.Int).SetUint64(newLastBlockID)) + if err != nil { + return err + } + + fc := &engine.ForkchoiceStateV1{HeadBlockHash: newHead.Hash()} + fcRes, err := s.rpc.L2Engine.ForkchoiceUpdate(ctx, fc, nil) + if err != nil { + return err + } + if fcRes.PayloadStatus.Status != engine.VALID { + return fmt.Errorf("unexpected ForkchoiceUpdate response status: %s", fcRes.PayloadStatus.Status) + } + + return nil +} diff --git a/packages/taiko-client/driver/chain_syncer/blob/syncer.go b/packages/taiko-client/driver/chain_syncer/blob/syncer.go index e5765cb82a0..0182d98855e 100644 --- a/packages/taiko-client/driver/chain_syncer/blob/syncer.go +++ b/packages/taiko-client/driver/chain_syncer/blob/syncer.go @@ -6,6 +6,7 @@ import ( "fmt" "math/big" "net/url" + "sync" "time" "golang.org/x/exp/slog" @@ -21,12 +22,12 @@ import ( "github.com/ethereum/go-ethereum/rlp" "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings" - "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/encoding" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/metadata" "github.com/taikoxyz/taiko-mono/packages/taiko-client/driver/chain_syncer/beaconsync" "github.com/taikoxyz/taiko-mono/packages/taiko-client/driver/state" "github.com/taikoxyz/taiko-mono/packages/taiko-client/internal/metrics" - "github.com/taikoxyz/taiko-mono/packages/taiko-client/internal/utils" "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/rpc" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/utils" anchorTxConstructor "github.com/taikoxyz/taiko-mono/packages/taiko-client/driver/anchor_tx_constructor" txListDecompressor "github.com/taikoxyz/taiko-mono/packages/taiko-client/driver/txlist_decompressor" @@ -48,6 +49,7 @@ type Syncer struct { reorgDetectedFlag bool maxRetrieveExponent uint64 blobDatasource *rpc.BlobDataSource + mutex sync.Mutex } // NewSyncer creates a new syncer instance. @@ -60,14 +62,14 @@ func NewSyncer( blobServerEndpoint *url.URL, socialScanEndpoint *url.URL, ) (*Syncer, error) { - configs, err := client.TaikoL1.GetConfig(&bind.CallOpts{Context: ctx}) + constructor, err := anchorTxConstructor.New(client) if err != nil { - return nil, fmt.Errorf("failed to get protocol configs: %w", err) + return nil, fmt.Errorf("failed to initialize anchor constructor: %w", err) } - constructor, err := anchorTxConstructor.New(client) + protocolConfigs, err := rpc.GetProtocolConfigs(client.TaikoL1, &bind.CallOpts{Context: ctx}) if err != nil { - return nil, fmt.Errorf("failed to initialize anchor constructor: %w", err) + return nil, err } return &Syncer{ @@ -77,7 +79,7 @@ func NewSyncer( progressTracker: progressTracker, anchorConstructor: constructor, txListDecompressor: txListDecompressor.NewTxListDecompressor( - uint64(configs.BlockMaxGasLimit), + uint64(protocolConfigs.BlockMaxGasLimit), rpc.BlockMaxTxListBytes, client.L2.ChainID, ), @@ -94,6 +96,8 @@ func NewSyncer( // ProcessL1Blocks fetches all `TaikoL1.BlockProposed` events between given // L1 block heights, and then tries inserting them into L2 execution engine's blockchain. func (s *Syncer) ProcessL1Blocks(ctx context.Context) error { + s.mutex.Lock() + defer s.mutex.Unlock() for { if err := s.processL1Blocks(ctx); err != nil { return err @@ -135,6 +139,7 @@ func (s *Syncer) processL1Blocks(ctx context.Context) error { s.lastInsertedBlockID = nil } + log.Info("iterating", "start", s.state.GetL1Current().Number.String(), "end", l1End.Number.String()) iter, err := eventIterator.NewBlockProposedIterator(ctx, &eventIterator.BlockProposedIteratorConfig{ Client: s.rpc.L1, TaikoL1: s.rpc.TaikoL1, @@ -164,18 +169,20 @@ func (s *Syncer) processL1Blocks(ctx context.Context) error { // inserting the proposed block one by one to the L2 execution engine. func (s *Syncer) onBlockProposed( ctx context.Context, - event *bindings.TaikoL1ClientBlockProposed, + meta metadata.TaikoBlockMetaData, endIter eventIterator.EndBlockProposedEventIterFunc, ) error { + log.Info("onBlockProposed", "blockID", meta.GetBlockID()) + // We simply ignore the genesis block's `BlockProposed` event. - if event.BlockId.Cmp(common.Big0) == 0 { + if meta.GetBlockID().Cmp(common.Big0) == 0 { return nil } // If we are not inserting a block whose parent block is the latest verified block in protocol, // and the node hasn't just finished the P2P sync, we check if the L1 chain has been reorged. if !s.progressTracker.Triggered() { - reorgCheckResult, err := s.checkReorg(ctx, event) + reorgCheckResult, err := s.checkReorg(ctx, meta.GetBlockID()) if err != nil { return err } @@ -199,23 +206,22 @@ func (s *Syncer) onBlockProposed( } } // Ignore those already inserted blocks. - if s.lastInsertedBlockID != nil && event.BlockId.Cmp(s.lastInsertedBlockID) <= 0 { + if s.lastInsertedBlockID != nil && meta.GetBlockID().Cmp(s.lastInsertedBlockID) <= 0 { return nil } log.Info( "New BlockProposed event", - "l1Height", event.Raw.BlockNumber, - "l1Hash", event.Raw.BlockHash, - "blockID", event.BlockId, - "removed", event.Raw.Removed, + "l1Height", meta.GetRawBlockHeight(), + "l1Hash", meta.GetRawBlockHash(), + "blockID", meta.GetBlockID(), ) // If the event's timestamp is in the future, we wait until the timestamp is reached, should // only happen when testing. - if event.Meta.Timestamp > uint64(time.Now().Unix()) { - log.Warn("Future L2 block, waiting", "L2BlockTimestamp", event.Meta.Timestamp, "now", time.Now().Unix()) - time.Sleep(time.Until(time.Unix(int64(event.Meta.Timestamp), 0))) + if meta.GetTimestamp() > uint64(time.Now().Unix()) { + log.Warn("Future L2 block, waiting", "L2BlockTimestamp", meta.GetTimestamp(), "now", time.Now().Unix()) + time.Sleep(time.Until(time.Unix(int64(meta.GetTimestamp()), 0))) } // Fetch the L2 parent block, if the node is just finished a P2P sync, we simply use the tracker's @@ -226,13 +232,13 @@ func (s *Syncer) onBlockProposed( ) if s.progressTracker.Triggered() { // Already synced through beacon sync, just skip this event. - if event.BlockId.Cmp(s.progressTracker.LastSyncedBlockID()) <= 0 { + if meta.GetBlockID().Cmp(s.progressTracker.LastSyncedBlockID()) <= 0 { return nil } parent, err = s.rpc.L2.HeaderByHash(ctx, s.progressTracker.LastSyncedBlockHash()) } else { - parent, err = s.rpc.L2ParentByBlockID(ctx, event.BlockId) + parent, err = s.rpc.L2ParentByBlockID(ctx, meta.GetBlockID()) } if err != nil { return fmt.Errorf("failed to fetch L2 parent block: %w", err) @@ -240,40 +246,44 @@ func (s *Syncer) onBlockProposed( log.Debug( "Parent block", - "height", parent.Number, + "blockID", parent.Number, "hash", parent.Hash(), "beaconSyncTriggered", s.progressTracker.Triggered(), ) - tx, err := s.rpc.L1.TransactionInBlock(ctx, event.Raw.BlockHash, event.Raw.TxIndex) + tx, err := s.rpc.L1.TransactionInBlock(ctx, meta.GetRawBlockHash(), meta.GetTxIndex()) if err != nil { return fmt.Errorf("failed to fetch original TaikoL1.proposeBlock transaction: %w", err) } // Decode transactions list. var txListFetcher txlistFetcher.TxListFetcher - if event.Meta.BlobUsed { + if meta.GetBlobUsed() { txListFetcher = txlistFetcher.NewBlobTxListFetcher(s.rpc.L1Beacon, s.blobDatasource) } else { - txListFetcher = new(txlistFetcher.CalldataFetcher) + txListFetcher = txlistFetcher.NewCalldataFetch(s.rpc) } - txListBytes, err := txListFetcher.Fetch(ctx, tx, &event.Meta) + txListBytes, err := txListFetcher.Fetch(ctx, tx, meta) if err != nil { - return fmt.Errorf("failed to fetch tx list: %w", err) + return fmt.Errorf("failed to get transaction receipt: %w", err) } // Decompress the transactions list and try to insert a new head block to L2 EE. payloadData, err := s.insertNewHead( ctx, - event, + meta, parent, - s.state.GetHeadBlockID(), - s.txListDecompressor.TryDecompress(event.BlockId, txListBytes, event.Meta.BlobUsed), + s.txListDecompressor.TryDecompress( + s.rpc.L2.ChainID, + meta.GetBlockID(), + txListBytes, + meta.GetBlobUsed(), + ), &rawdb.L1Origin{ - BlockID: event.BlockId, + BlockID: meta.GetBlockID(), L2BlockHash: common.Hash{}, // Will be set by taiko-geth. - L1BlockHeight: new(big.Int).SetUint64(event.Raw.BlockNumber), - L1BlockHash: event.Raw.BlockHash, + L1BlockHeight: meta.GetRawBlockHeight(), + L1BlockHash: meta.GetRawBlockHash(), }, ) if err != nil { @@ -284,16 +294,15 @@ func (s *Syncer) onBlockProposed( log.Info( "🔗 New L2 block inserted", - "blockID", event.BlockId, - "height", payloadData.Number, + "blockID", meta.GetBlockID(), "hash", payloadData.BlockHash, "transactions", len(payloadData.Transactions), "baseFee", utils.WeiToGWei(payloadData.BaseFeePerGas), "withdrawals", len(payloadData.Withdrawals), ) - metrics.DriverL1CurrentHeightGauge.Set(float64(event.Raw.BlockNumber)) - s.lastInsertedBlockID = event.BlockId + metrics.DriverL1CurrentHeightGauge.Set(float64(meta.GetRawBlockHeight().Uint64())) + s.lastInsertedBlockID = meta.GetBlockID() if s.progressTracker.Triggered() { s.progressTracker.ClearMeta() @@ -306,9 +315,8 @@ func (s *Syncer) onBlockProposed( // block chain through Engine APIs. func (s *Syncer) insertNewHead( ctx context.Context, - event *bindings.TaikoL1ClientBlockProposed, + meta metadata.TaikoBlockMetaData, parent *types.Header, - headBlockID *big.Int, txListBytes []byte, l1Origin *rawdb.L1Origin, ) (*engine.ExecutableData, error) { @@ -316,81 +324,108 @@ func (s *Syncer) insertNewHead( "Try to insert a new L2 head block", "parentNumber", parent.Number, "parentHash", parent.Hash(), - "headBlockID", headBlockID, "l1Origin", l1Origin, ) - // Insert a TaikoL2.anchor transaction at transactions list head - var txList []*types.Transaction + // Insert a TaikoL2.anchor / TaikoL2.anchorV2 transaction at transactions list head + var ( + txList []*types.Transaction + anchorTx *types.Transaction + baseFee *big.Int + err error + ) if len(txListBytes) != 0 { if err := rlp.DecodeBytes(txListBytes, &txList); err != nil { - log.Error("Invalid txList bytes", "blockID", event.BlockId) + log.Error("Invalid txList bytes", "blockID", meta.GetBlockID()) return nil, err } } - // Get L2 baseFee - baseFeeInfo, err := s.rpc.TaikoL2.GetBasefee( - &bind.CallOpts{BlockNumber: parent.Number, Context: ctx}, - event.Meta.L1Height, - uint32(parent.GasUsed), - ) - if err != nil { - return nil, fmt.Errorf("failed to get L2 baseFee: %w", encoding.TryParsingCustomError(err)) + if baseFee, err = s.rpc.CalculateBaseFee( + ctx, + parent, + new(big.Int).SetUint64(meta.GetAnchorBlockID()), + meta.IsOntakeBlock(), + meta.GetBaseFeeConfig(), + meta.GetTimestamp(), + ); err != nil { + return nil, err + } + + if !meta.IsOntakeBlock() { + // Assemble a TaikoL2.anchor transaction + anchorTx, err = s.anchorConstructor.AssembleAnchorTx( + ctx, + new(big.Int).SetUint64(meta.GetAnchorBlockID()), + meta.GetAnchorBlockHash(), + new(big.Int).Add(parent.Number, common.Big1), + baseFee, + parent.GasUsed, + ) + if err != nil { + return nil, fmt.Errorf("failed to create TaikoL2.anchor transaction: %w", err) + } + } else { + // Assemble a TaikoL2.anchorV2 transaction + anchorBlockHeader, err := s.rpc.L1.HeaderByHash(ctx, meta.GetAnchorBlockHash()) + if err != nil { + return nil, fmt.Errorf("failed to fetch anchor block: %w", err) + } + anchorTx, err = s.anchorConstructor.AssembleAnchorV2Tx( + ctx, + new(big.Int).SetUint64(meta.GetAnchorBlockID()), + anchorBlockHeader.Root, + parent.GasUsed, + meta.GetBaseFeeConfig(), + new(big.Int).Add(parent.Number, common.Big1), + baseFee, + ) + if err != nil { + return nil, fmt.Errorf("failed to create TaikoL2.anchorV2 transaction: %w", err) + } } log.Info( "L2 baseFee", - "blockID", event.BlockId, - "baseFee", utils.WeiToGWei(baseFeeInfo.Basefee), - "syncedL1Height", event.Meta.L1Height, + "blockID", meta.GetBlockID(), + "baseFee", utils.WeiToGWei(baseFee), + "syncedL1Height", meta.GetRawBlockHeight(), "parentGasUsed", parent.GasUsed, ) - // Get withdrawals - withdrawals := make(types.Withdrawals, len(event.DepositsProcessed)) - for i, d := range event.DepositsProcessed { - withdrawals[i] = &types.Withdrawal{Address: d.Recipient, Amount: d.Amount.Uint64(), Index: d.Id} - } - - // Assemble a TaikoL2.anchor transaction - anchorTx, err := s.anchorConstructor.AssembleAnchorTx( - ctx, - new(big.Int).SetUint64(event.Meta.L1Height), - event.Meta.L1Hash, - new(big.Int).Add(parent.Number, common.Big1), - baseFeeInfo.Basefee, - parent.GasUsed, - ) - if err != nil { - return nil, fmt.Errorf("failed to create TaikoL2.anchor transaction: %w", err) - } - // Insert the anchor transaction at the head of the transactions list txList = append([]*types.Transaction{anchorTx}, txList...) if txListBytes, err = rlp.EncodeToBytes(txList); err != nil { - log.Error("Encode txList error", "blockID", event.BlockId, "error", err) + log.Error("Encode txList error", "blockID", meta.GetBlockID(), "error", err) return nil, err } payload, err := s.createExecutionPayloads( ctx, - event, + meta, parent.Hash(), l1Origin, - headBlockID, txListBytes, - baseFeeInfo.Basefee, - withdrawals, + baseFee, + make(types.Withdrawals, 0), ) if err != nil { return nil, fmt.Errorf("failed to create execution payloads: %w", err) } + var lastVerifiedBlockHash common.Hash + lastVerifiedBlockInfo, err := s.rpc.GetLastVerifiedBlock(ctx) + if err != nil { + return nil, fmt.Errorf("failed to fetch last verified block: %w", err) + } + if payload.Number > lastVerifiedBlockInfo.BlockId { + lastVerifiedBlockHash = lastVerifiedBlockInfo.BlockHash + } + fc := &engine.ForkchoiceStateV1{ HeadBlockHash: payload.BlockHash, SafeBlockHash: payload.BlockHash, - FinalizedBlockHash: payload.BlockHash, + FinalizedBlockHash: lastVerifiedBlockHash, } // Update the fork choice @@ -408,35 +443,21 @@ func (s *Syncer) insertNewHead( func (s *Syncer) MoveTheHead( ctx context.Context, txList []*types.Transaction, - gasUsed uint64, ) error { - lastInsertedBlockHeader, err := s.rpc.L1.HeaderByNumber(ctx, nil) + lastInsertedL1BlockHeader, err := s.rpc.L1.HeaderByNumber(ctx, nil) if err != nil { return fmt.Errorf("failed to get latest block ID from L1: %w", err) } - // Ignore those already inserted blocks. - // if s.lastInsertedBlockID != nil && event.BlockId.Cmp(s.lastInsertedBlockID) <= 0 { - if s.lastInsertedBlockID != nil && lastInsertedBlockHeader.Number.Cmp(s.lastInsertedBlockID) <= 0 { - return nil - } - - // Fetch the L2 parent block, if the node is just finished a P2P sync, we simply use the tracker's - // last synced verified block as the parent, otherwise, we fetch the parent block from L2 EE. - var ( - parent *types.Header - ) - if s.progressTracker.Triggered() { - parent, err = s.rpc.L2.HeaderByHash(ctx, s.progressTracker.LastSyncedBlockHash()) - } else { - // taking last block from L2 instead of parent based on L1 block id - // parent, err = s.rpc.L2ParentByBlockID(ctx, event.BlockId) - parent, err = s.rpc.L2.HeaderByNumber(ctx, nil) - } + // taking last block from L2 instead of parent based on L1 block id + parent, err := s.rpc.L2.HeaderByNumber(ctx, nil) if err != nil { return fmt.Errorf("failed to fetch L2 parent block: %w", err) } + //TODO: verify if this is correct (no other blocks will come in between) + newL2BlockID := new(big.Int).Add(parent.Number, common.Big1) + log.Debug( "Parent block", "height", parent.Number, @@ -451,21 +472,20 @@ func (s *Syncer) MoveTheHead( s.state.GetHeadBlockID(), txList, &rawdb.L1Origin{ - BlockID: lastInsertedBlockHeader.Number, // event.BlockId - L2BlockHash: common.Hash{}, // Will be set by taiko-geth. - L1BlockHeight: lastInsertedBlockHeader.Number, // new(big.Int).SetUint64(event.Raw.BlockNumber), - L1BlockHash: lastInsertedBlockHeader.Hash(), // event.Raw.BlockHash, + BlockID: newL2BlockID, // event.BlockId + L2BlockHash: common.Hash{}, // Will be set by taiko-geth. + L1BlockHeight: lastInsertedL1BlockHeader.Number, // new(big.Int).SetUint64(event.Raw.BlockNumber), + L1BlockHash: lastInsertedL1BlockHeader.Hash(), // event.Raw.BlockHash, }, - gasUsed, ) if err != nil { return fmt.Errorf("failed to insert new head to L2 execution engine: %w", err) } //(float64(event.Raw.BlockNumber)) - metrics.DriverL1CurrentHeightGauge.Set(float64(lastInsertedBlockHeader.Number.Uint64())) + metrics.DriverL1CurrentHeightGauge.Set(float64(lastInsertedL1BlockHeader.Number.Uint64())) //event.BlockId - s.lastInsertedBlockID = lastInsertedBlockHeader.Number + s.lastInsertedBlockID = newL2BlockID if s.progressTracker.Triggered() { s.progressTracker.ClearMeta() @@ -482,7 +502,6 @@ func (s *Syncer) insertNewHeadUsingDecodedTxList( headBlockID *big.Int, txList []*types.Transaction, l1Origin *rawdb.L1Origin, - gasUsed uint64, ) error { log.Debug( "Try to insert a new L2 head block", @@ -492,42 +511,50 @@ func (s *Syncer) insertNewHeadUsingDecodedTxList( "l1Origin", l1Origin, ) - l1Height, err := s.rpc.L1.BlockNumber(ctx) - if err != nil { - return fmt.Errorf("failed to get L1 height: %w", err) - } + // l1Height, err := s.rpc.L1.BlockNumber(ctx) + // if err != nil { + // return fmt.Errorf("failed to get L1 height: %w", err) + // } // Get L2 baseFee - baseFeeInfo, err := s.rpc.TaikoL2.GetBasefee( - &bind.CallOpts{BlockNumber: parent.Number, Context: ctx}, - l1Height, // event.Meta.L1Height, - uint32(parent.GasUsed), + var ( + baseFee *big.Int + err error ) - if err != nil { - return fmt.Errorf("failed to get L2 baseFee: %w", encoding.TryParsingCustomError(err)) + if baseFee, err = s.rpc.CalculateBaseFee( + ctx, + parent, + nil, + true, + // TODO: get from config? + &bindings.LibSharedDataBaseFeeConfig{ + GasIssuancePerSecond: uint32(1000000000), + AdjustmentQuotient: uint8(200), + MinGasExcess: uint64(1000000000), + MaxGasIssuancePerBlock: uint32(1000000000), + }, + uint64(time.Now().Unix()), + ); err != nil { + return err } log.Info( "L2 baseFee", "blockID", l1Origin.BlockID, // event.BlockId, - "baseFee", utils.WeiToGWei(baseFeeInfo.Basefee), + "baseFee", utils.WeiToGWei(baseFee), "syncedL1Height", l1Origin.BlockID, // event.Meta.L1Height, "parentGasUsed", parent.GasUsed, ) - // Get withdrawals - withdrawals := types.Withdrawals{} - // withdrawals := make(types.Withdrawals, len(l1Origin.DepositsProcessed)) - // for i, d := range l1Origin.DepositsProcessed { - // withdrawals[i] = &types.Withdrawal{Address: d.Recipient, Amount: d.Amount.Uint64(), Index: d.Id} - // } - // Assemble a TaikoL2.anchor transaction - anchorTx, err := s.anchorConstructor.AssembleNullAnchorTx( + l1CurrentBlock := s.state.GetL1Current() + anchorTx, err := s.anchorConstructor.AssembleAnchorTx( ctx, + new(big.Int).SetUint64(l1CurrentBlock.Number.Uint64()), + l1CurrentBlock.Hash(), new(big.Int).Add(parent.Number, common.Big1), - baseFeeInfo.Basefee, - gasUsed, + baseFee, + parent.GasUsed, ) if err != nil { return fmt.Errorf("failed to create TaikoL2.anchor transaction: %w", err) @@ -551,19 +578,18 @@ func (s *Syncer) insertNewHeadUsingDecodedTxList( nil, parent.Hash(), l1Origin, - headBlockID, txListBytes, - baseFeeInfo.Basefee, - withdrawals, + baseFee, + make(types.Withdrawals, 0), ) if err != nil { return fmt.Errorf("failed to create execution payloads: %w", err) } - + finalized := s.state.GetL2Head().Hash() fc := &engine.ForkchoiceStateV1{ HeadBlockHash: payload.BlockHash, - SafeBlockHash: payload.BlockHash, - FinalizedBlockHash: payload.BlockHash, + SafeBlockHash: finalized, + FinalizedBlockHash: finalized, } // Update the fork choice @@ -584,10 +610,9 @@ func (s *Syncer) insertNewHeadUsingDecodedTxList( // Engine APIs. func (s *Syncer) createExecutionPayloads( ctx context.Context, - event *bindings.TaikoL1ClientBlockProposed, + meta metadata.TaikoBlockMetaData, parentHash common.Hash, l1Origin *rawdb.L1Origin, - headBlockID *big.Int, txListBytes []byte, baseFee *big.Int, withdrawals types.Withdrawals, @@ -595,7 +620,7 @@ func (s *Syncer) createExecutionPayloads( fc := &engine.ForkchoiceStateV1{HeadBlockHash: parentHash} var attributes *engine.PayloadAttributes - if event == nil { + if meta == nil { currentTimestamp := uint64(time.Now().Unix()) attributes = &engine.PayloadAttributes{ Timestamp: currentTimestamp, @@ -603,44 +628,42 @@ func (s *Syncer) createExecutionPayloads( SuggestedFeeRecipient: common.Address{}, Withdrawals: withdrawals, BlockMetadata: &engine.BlockMetadata{ - HighestBlockID: headBlockID, - Beneficiary: common.Address{}, - GasLimit: 240000000 + consensus.AnchorGasLimit, //TODO: replace constant with value from config - Timestamp: currentTimestamp, - TxList: txListBytes, - MixHash: common.Hash{}, - ExtraData: []byte{}, + Beneficiary: common.Address{}, + GasLimit: 240000000 + consensus.AnchorGasLimit, //TODO: replace constant with value from config + Timestamp: currentTimestamp, + TxList: txListBytes, + MixHash: common.Hash{}, + ExtraData: []byte{}, }, BaseFeePerGas: baseFee, L1Origin: l1Origin, } } else { attributes = &engine.PayloadAttributes{ - Timestamp: event.Meta.Timestamp, - Random: event.Meta.Difficulty, - SuggestedFeeRecipient: event.Meta.Coinbase, + Timestamp: meta.GetTimestamp(), + Random: meta.GetDifficulty(), + SuggestedFeeRecipient: meta.GetCoinbase(), Withdrawals: withdrawals, BlockMetadata: &engine.BlockMetadata{ - HighestBlockID: headBlockID, - Beneficiary: event.Meta.Coinbase, - GasLimit: uint64(event.Meta.GasLimit) + consensus.AnchorGasLimit, - Timestamp: event.Meta.Timestamp, - TxList: txListBytes, - MixHash: event.Meta.Difficulty, - ExtraData: event.Meta.ExtraData[:], + Beneficiary: meta.GetCoinbase(), + GasLimit: uint64(meta.GetGasLimit()) + consensus.AnchorGasLimit, + Timestamp: meta.GetTimestamp(), + TxList: txListBytes, + MixHash: meta.GetDifficulty(), + ExtraData: meta.GetExtraData(), }, BaseFeePerGas: baseFee, L1Origin: l1Origin, } log.Debug( - "Event GasLimit and Consensus AnchorGasLimit", - "eventGasLimit", event.Meta.GasLimit, + "Meta GasLimit and Consensus AnchorGasLimit", + "metaGasLimit", meta.GetGasLimit(), "consensusAnchorGasLimit", consensus.AnchorGasLimit, ) log.Debug( - "blockID", event.BlockId, + "blockID", meta.GetBlockID(), ) } log.Debug( @@ -649,12 +672,11 @@ func (s *Syncer) createExecutionPayloads( "random", attributes.Random, "suggestedFeeRecipient", attributes.SuggestedFeeRecipient, "withdrawals", len(attributes.Withdrawals), - "highestBlockID", attributes.BlockMetadata.HighestBlockID, "gasLimit", attributes.BlockMetadata.GasLimit, "timestamp", attributes.BlockMetadata.Timestamp, "mixHash", attributes.BlockMetadata.MixHash, "baseFee", utils.WeiToGWei(attributes.BaseFeePerGas), - "extraData", string(attributes.BlockMetadata.ExtraData), + "extraData", common.Bytes2Hex(attributes.BlockMetadata.ExtraData), "l1OriginHeight", attributes.L1Origin.L1BlockHeight, "l1OriginHash", attributes.L1Origin.L1BlockHash, ) @@ -677,8 +699,8 @@ func (s *Syncer) createExecutionPayloads( return nil, fmt.Errorf("failed to get payload: %w", err) } - if event != nil { - log.Debug("Event BlockId", "blockID", event.BlockId) + if meta != nil { + log.Debug("Meta BlockId", "blockID", meta.GetBlockID()) } log.Debug( "Payload", @@ -766,11 +788,22 @@ func (s *Syncer) retrievePastBlock( currentBlockID = 0 } - blockInfo, err := s.rpc.GetL2BlockInfo(ctx, new(big.Int).SetUint64(currentBlockID)) + blockNum := new(big.Int).SetUint64(currentBlockID) + var blockInfo bindings.TaikoDataBlockV2 + if s.state.IsOnTake(blockNum) { + blockInfo, err = s.rpc.GetL2BlockInfoV2(ctx, blockNum) + } else { + blockInfo, err = s.rpc.GetL2BlockInfo(ctx, blockNum) + } + if err != nil { return nil, err } - ts, err := s.rpc.GetTransition(ctx, new(big.Int).SetUint64(blockInfo.BlockId), blockInfo.VerifiedTransitionId) + ts, err := s.rpc.GetTransition( + ctx, + new(big.Int).SetUint64(blockInfo.BlockId), + uint32(blockInfo.VerifiedTransitionId.Uint64()), + ) if err != nil { return nil, err } @@ -827,7 +860,7 @@ func (s *Syncer) retrievePastBlock( // checkReorg checks whether the L1 chain has been reorged, and resets the L1Current cursor if necessary. func (s *Syncer) checkReorg( ctx context.Context, - event *bindings.TaikoL1ClientBlockProposed, + blockID *big.Int, ) (*rpc.ReorgCheckResult, error) { // If the L2 chain is at genesis, we don't need to check L1 reorg. if s.state.GetL1Current().Number == s.state.GenesisL1Height { @@ -844,7 +877,7 @@ func (s *Syncer) checkReorg( // 2. Parent block reorgCheckResult, err = s.rpc.CheckL1Reorg( ctx, - new(big.Int).Sub(event.BlockId, common.Big1), + new(big.Int).Sub(blockID, common.Big1), ) if err != nil { return nil, fmt.Errorf("failed to check whether L1 chain has been reorged: %w", err) diff --git a/packages/taiko-client/driver/chain_syncer/blob/syncer_test.go b/packages/taiko-client/driver/chain_syncer/blob/syncer_test.go index cfca064d497..062247a61ef 100644 --- a/packages/taiko-client/driver/chain_syncer/blob/syncer_test.go +++ b/packages/taiko-client/driver/chain_syncer/blob/syncer_test.go @@ -18,19 +18,22 @@ import ( "github.com/stretchr/testify/suite" "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/metadata" "github.com/taikoxyz/taiko-mono/packages/taiko-client/driver/chain_syncer/beaconsync" "github.com/taikoxyz/taiko-mono/packages/taiko-client/driver/state" "github.com/taikoxyz/taiko-mono/packages/taiko-client/internal/testutils" - "github.com/taikoxyz/taiko-mono/packages/taiko-client/internal/utils" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/config" "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/jwt" "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/rpc" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/utils" "github.com/taikoxyz/taiko-mono/packages/taiko-client/proposer" ) type BlobSyncerTestSuite struct { testutils.ClientTestSuite - s *Syncer - p testutils.Proposer + s *Syncer + p testutils.Proposer + eventChan chan *bindings.TaikoL1ClientBlockProposed } func (s *BlobSyncerTestSuite) SetupTest() { @@ -39,6 +42,8 @@ func (s *BlobSyncerTestSuite) SetupTest() { state2, err := state.New(context.Background(), s.RPCClient) s.Nil(err) + s.eventChan = make(chan *bindings.TaikoL1ClientBlockProposed, 200) + syncer, err := NewSyncer( context.Background(), s.RPCClient, @@ -53,28 +58,12 @@ func (s *BlobSyncerTestSuite) SetupTest() { s.initProposer() } -func (s *BlobSyncerTestSuite) TestCancelNewSyncer() { - ctx, cancel := context.WithCancel(context.Background()) - cancel() - syncer, err := NewSyncer( - ctx, - s.RPCClient, - s.s.state, - s.s.progressTracker, - 0, - nil, - nil, - ) - s.Nil(syncer) - s.NotNil(err) -} func (s *BlobSyncerTestSuite) TestProcessL1Blocks() { s.Nil(s.s.ProcessL1Blocks(context.Background())) } func (s *BlobSyncerTestSuite) TestProcessL1BlocksReorg() { - s.T().Skip("Skipping, preconfer changes") s.ProposeAndInsertEmptyBlocks(s.p, s.s) s.Nil(s.s.ProcessL1Blocks(context.Background())) } @@ -82,12 +71,12 @@ func (s *BlobSyncerTestSuite) TestProcessL1BlocksReorg() { func (s *BlobSyncerTestSuite) TestOnBlockProposed() { s.Nil(s.s.onBlockProposed( context.Background(), - &bindings.TaikoL1ClientBlockProposed{BlockId: common.Big0}, + &metadata.TaikoDataBlockMetadataOntake{TaikoDataBlockMetadataV2: bindings.TaikoDataBlockMetadataV2{Id: 0}}, func() {}, )) s.NotNil(s.s.onBlockProposed( context.Background(), - &bindings.TaikoL1ClientBlockProposed{BlockId: common.Big1}, + &metadata.TaikoDataBlockMetadataOntake{TaikoDataBlockMetadataV2: bindings.TaikoDataBlockMetadataV2{Id: 1}}, func() {}, )) } @@ -97,23 +86,28 @@ func (s *BlobSyncerTestSuite) TestInsertNewHead() { s.Nil(err) l1Head, err := s.s.rpc.L1.BlockByNumber(context.Background(), nil) s.Nil(err) + protocolConfigs, err := s.s.rpc.TaikoL1.GetConfig(nil) + s.Nil(err) _, err = s.s.insertNewHead( context.Background(), - &bindings.TaikoL1ClientBlockProposed{ - BlockId: common.Big1, - Meta: bindings.TaikoDataBlockMetadata{ - Id: 1, - L1Height: l1Head.NumberU64(), - L1Hash: l1Head.Hash(), - Coinbase: common.BytesToAddress(testutils.RandomBytes(1024)), - BlobHash: testutils.RandomHash(), - Difficulty: testutils.RandomHash(), - GasLimit: utils.RandUint32(nil), - Timestamp: uint64(time.Now().Unix()), + &metadata.TaikoDataBlockMetadataOntake{ + TaikoDataBlockMetadataV2: bindings.TaikoDataBlockMetadataV2{ + Id: 1, + AnchorBlockId: l1Head.NumberU64(), + AnchorBlockHash: l1Head.Hash(), + Coinbase: common.BytesToAddress(testutils.RandomBytes(1024)), + BlobHash: testutils.RandomHash(), + Difficulty: testutils.RandomHash(), + GasLimit: utils.RandUint32(nil), + Timestamp: uint64(time.Now().Unix()), + BaseFeeConfig: protocolConfigs.BaseFeeConfig, + }, + Log: types.Log{ + BlockNumber: l1Head.Number().Uint64(), + BlockHash: l1Head.Hash(), }, }, parent, - common.Big2, []byte{}, &rawdb.L1Origin{ BlockID: common.Big1, @@ -142,7 +136,6 @@ func (s *BlobSyncerTestSuite) TestInsertNewHeadUsingDecodedTxList() { L1BlockHeight: common.Big1, L1BlockHash: l1Head.Hash(), }, - 100000000, ) s.Nil(err) } @@ -172,7 +165,6 @@ func (s *BlobSyncerTestSuite) TestMoveTheHead() { err = s.s.MoveTheHead( context.Background(), txList, - 100000000, ) s.Nil(err) @@ -228,7 +220,10 @@ func (s *BlobSyncerTestSuite) FetchChainID() (*big.Int, error) { } func (s *BlobSyncerTestSuite) TestTreasuryIncomeAllAnchors() { - s.T().Skip("Skipping, preconfer changes") + // TODO: Temporarily skip this test case when using l2_reth node. + if os.Getenv("L2_NODE") == "l2_reth" { + s.T().Skip() + } treasury := common.HexToAddress(os.Getenv("TREASURY")) s.NotZero(treasury.Big().Uint64()) @@ -247,11 +242,14 @@ func (s *BlobSyncerTestSuite) TestTreasuryIncomeAllAnchors() { s.Nil(err) s.Greater(headAfter, headBefore) - s.Zero(balanceAfter.Cmp(balance)) + s.Equal(1, balanceAfter.Cmp(balance)) } func (s *BlobSyncerTestSuite) TestTreasuryIncome() { - s.T().Skip("Skipping, preconfer changes") + // TODO: Temporarily skip this test case when using l2_reth node. + if os.Getenv("L2_NODE") == "l2_reth" { + s.T().Skip() + } treasury := common.HexToAddress(os.Getenv("TREASURY")) s.NotZero(treasury.Big().Uint64()) @@ -273,7 +271,11 @@ func (s *BlobSyncerTestSuite) TestTreasuryIncome() { s.Greater(headAfter, headBefore) s.True(balanceAfter.Cmp(balance) > 0) + protocolConfigs, err := rpc.GetProtocolConfigs(s.RPCClient.TaikoL1, nil) + s.Nil(err) + var hasNoneAnchorTxs bool + chainConfig := config.NewChainConfig(&protocolConfigs) for i := headBefore + 1; i <= headAfter; i++ { block, err := s.RPCClient.L2.BlockByNumber(context.Background(), new(big.Int).SetUint64(i)) s.Nil(err) @@ -290,8 +292,16 @@ func (s *BlobSyncerTestSuite) TestTreasuryIncome() { s.Nil(err) fee := new(big.Int).Mul(block.BaseFee(), new(big.Int).SetUint64(receipt.GasUsed)) - - balance = new(big.Int).Add(balance, fee) + if chainConfig.IsOntake(block.Number()) { + feeCoinbase := new(big.Int).Div( + new(big.Int).Mul(fee, new(big.Int).SetUint64(uint64(chainConfig.ProtocolConfigs.BaseFeeConfig.SharingPctg))), + new(big.Int).SetUint64(100), + ) + feeTreasury := new(big.Int).Sub(fee, feeCoinbase) + balance = new(big.Int).Add(balance, feeTreasury) + } else { + balance = new(big.Int).Add(balance, fee) + } } } @@ -310,27 +320,35 @@ func (s *BlobSyncerTestSuite) initProposer() { s.Nil(prop.InitFromConfig(context.Background(), &proposer.Config{ ClientConfig: &rpc.ClientConfig{ - L1Endpoint: os.Getenv("L1_NODE_WS_ENDPOINT"), - L2Endpoint: os.Getenv("L2_EXECUTION_ENGINE_WS_ENDPOINT"), - L2EngineEndpoint: os.Getenv("L2_EXECUTION_ENGINE_AUTH_ENDPOINT"), + L1Endpoint: os.Getenv("L1_WS"), + L2Endpoint: os.Getenv("L2_WS"), + L2EngineEndpoint: os.Getenv("L2_AUTH"), JwtSecret: string(jwtSecret), - TaikoL1Address: common.HexToAddress(os.Getenv("TAIKO_L1_ADDRESS")), - TaikoL2Address: common.HexToAddress(os.Getenv("TAIKO_L2_ADDRESS")), - TaikoTokenAddress: common.HexToAddress(os.Getenv("TAIKO_TOKEN_ADDRESS")), + TaikoL1Address: common.HexToAddress(os.Getenv("TAIKO_L1")), + TaikoL2Address: common.HexToAddress(os.Getenv("TAIKO_L2")), + TaikoTokenAddress: common.HexToAddress(os.Getenv("TAIKO_TOKEN")), }, - AssignmentHookAddress: common.HexToAddress(os.Getenv("ASSIGNMENT_HOOK_ADDRESS")), L1ProposerPrivKey: l1ProposerPrivKey, L2SuggestedFeeRecipient: common.HexToAddress(os.Getenv("L2_SUGGESTED_FEE_RECIPIENT")), ProposeInterval: 1024 * time.Hour, MaxProposedTxListsPerEpoch: 1, - ProverEndpoints: s.ProverEndpoints, - OptimisticTierFee: common.Big256, - SgxTierFee: common.Big256, - MaxTierFeePriceBumps: 3, - TierFeePriceBump: common.Big2, - L1BlockBuilderTip: common.Big0, TxmgrConfigs: &txmgr.CLIConfig{ - L1RPCURL: os.Getenv("L1_NODE_WS_ENDPOINT"), + L1RPCURL: os.Getenv("L1_WS"), + NumConfirmations: 0, + SafeAbortNonceTooLowCount: txmgr.DefaultBatcherFlagValues.SafeAbortNonceTooLowCount, + PrivateKey: common.Bytes2Hex(crypto.FromECDSA(l1ProposerPrivKey)), + FeeLimitMultiplier: txmgr.DefaultBatcherFlagValues.FeeLimitMultiplier, + FeeLimitThresholdGwei: txmgr.DefaultBatcherFlagValues.FeeLimitThresholdGwei, + MinBaseFeeGwei: txmgr.DefaultBatcherFlagValues.MinBaseFeeGwei, + MinTipCapGwei: txmgr.DefaultBatcherFlagValues.MinTipCapGwei, + ResubmissionTimeout: txmgr.DefaultBatcherFlagValues.ResubmissionTimeout, + ReceiptQueryInterval: 1 * time.Second, + NetworkTimeout: txmgr.DefaultBatcherFlagValues.NetworkTimeout, + TxSendTimeout: txmgr.DefaultBatcherFlagValues.TxSendTimeout, + TxNotInMempoolTimeout: txmgr.DefaultBatcherFlagValues.TxNotInMempoolTimeout, + }, + PrivateTxmgrConfigs: &txmgr.CLIConfig{ + L1RPCURL: os.Getenv("L1_WS"), NumConfirmations: 0, SafeAbortNonceTooLowCount: txmgr.DefaultBatcherFlagValues.SafeAbortNonceTooLowCount, PrivateKey: common.Bytes2Hex(crypto.FromECDSA(l1ProposerPrivKey)), @@ -344,7 +362,7 @@ func (s *BlobSyncerTestSuite) initProposer() { TxSendTimeout: txmgr.DefaultBatcherFlagValues.TxSendTimeout, TxNotInMempoolTimeout: txmgr.DefaultBatcherFlagValues.TxNotInMempoolTimeout, }, - })) + }, nil, nil)) s.p = prop } diff --git a/packages/taiko-client/driver/chain_syncer/chain_syncer.go b/packages/taiko-client/driver/chain_syncer/chain_syncer.go index 6e17215d73d..5402b5766f6 100644 --- a/packages/taiko-client/driver/chain_syncer/chain_syncer.go +++ b/packages/taiko-client/driver/chain_syncer/chain_syncer.go @@ -182,15 +182,14 @@ func (s *L2ChainSyncer) needNewBeaconSyncTriggered() (uint64, bool, error) { // For full sync mode, we will use the verified block head, // and for snap sync mode, we will use the latest block head. - var ( - blockID uint64 - err error - ) + var blockID uint64 switch s.syncMode { case downloader.SnapSync.String(): - if blockID, err = s.rpc.L2CheckPoint.BlockNumber(s.ctx); err != nil { + headL1Origin, err := s.rpc.L2CheckPoint.HeadL1Origin(s.ctx) + if err != nil { return 0, false, err } + blockID = headL1Origin.BlockID.Uint64() case downloader.FullSync.String(): stateVars, err := s.rpc.GetProtocolStateVariables(&bind.CallOpts{Context: s.ctx}) if err != nil { diff --git a/packages/taiko-client/driver/chain_syncer/chain_syncer_test.go b/packages/taiko-client/driver/chain_syncer/chain_syncer_test.go index 9360e02cc27..71a40d9729f 100644 --- a/packages/taiko-client/driver/chain_syncer/chain_syncer_test.go +++ b/packages/taiko-client/driver/chain_syncer/chain_syncer_test.go @@ -17,6 +17,7 @@ import ( "github.com/taikoxyz/taiko-mono/packages/taiko-client/driver/state" "github.com/taikoxyz/taiko-mono/packages/taiko-client/internal/testutils" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/jwt" "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/rpc" "github.com/taikoxyz/taiko-mono/packages/taiko-client/proposer" ) @@ -50,30 +51,40 @@ func (s *ChainSyncerTestSuite) SetupTest() { prop := new(proposer.Proposer) l1ProposerPrivKey, err := crypto.ToECDSA(common.FromHex(os.Getenv("L1_PROPOSER_PRIVATE_KEY"))) s.Nil(err) + jwtSecret, err := jwt.ParseSecretFromFile(os.Getenv("JWT_SECRET")) + s.Nil(err) s.Nil(prop.InitFromConfig(context.Background(), &proposer.Config{ ClientConfig: &rpc.ClientConfig{ - L1Endpoint: os.Getenv("L1_NODE_WS_ENDPOINT"), - L2Endpoint: os.Getenv("L2_EXECUTION_ENGINE_WS_ENDPOINT"), - TaikoL1Address: common.HexToAddress(os.Getenv("TAIKO_L1_ADDRESS")), - TaikoL2Address: common.HexToAddress(os.Getenv("TAIKO_L2_ADDRESS")), - TaikoTokenAddress: common.HexToAddress(os.Getenv("TAIKO_TOKEN_ADDRESS")), - ProverSetAddress: common.HexToAddress(os.Getenv("PROVER_SET_ADDRESS")), + L1Endpoint: os.Getenv("L1_WS"), + L2Endpoint: os.Getenv("L2_WS"), + L2EngineEndpoint: os.Getenv("L2_AUTH"), + JwtSecret: string(jwtSecret), + TaikoL1Address: common.HexToAddress(os.Getenv("TAIKO_L1")), + TaikoL2Address: common.HexToAddress(os.Getenv("TAIKO_L2")), + TaikoTokenAddress: common.HexToAddress(os.Getenv("TAIKO_TOKEN")), }, - AssignmentHookAddress: common.HexToAddress(os.Getenv("ASSIGNMENT_HOOK_ADDRESS")), L1ProposerPrivKey: l1ProposerPrivKey, L2SuggestedFeeRecipient: common.HexToAddress(os.Getenv("L2_SUGGESTED_FEE_RECIPIENT")), ProposeInterval: 1024 * time.Hour, MaxProposedTxListsPerEpoch: 1, - ProverEndpoints: s.ProverEndpoints, - OptimisticTierFee: common.Big256, - SgxTierFee: common.Big256, - MaxTierFeePriceBumps: 3, - TierFeePriceBump: common.Big2, - ExtraData: "test", - L1BlockBuilderTip: common.Big0, TxmgrConfigs: &txmgr.CLIConfig{ - L1RPCURL: os.Getenv("L1_NODE_WS_ENDPOINT"), + L1RPCURL: os.Getenv("L1_WS"), + NumConfirmations: 0, + SafeAbortNonceTooLowCount: txmgr.DefaultBatcherFlagValues.SafeAbortNonceTooLowCount, + PrivateKey: common.Bytes2Hex(crypto.FromECDSA(l1ProposerPrivKey)), + FeeLimitMultiplier: txmgr.DefaultBatcherFlagValues.FeeLimitMultiplier, + FeeLimitThresholdGwei: txmgr.DefaultBatcherFlagValues.FeeLimitThresholdGwei, + MinBaseFeeGwei: txmgr.DefaultBatcherFlagValues.MinBaseFeeGwei, + MinTipCapGwei: txmgr.DefaultBatcherFlagValues.MinTipCapGwei, + ResubmissionTimeout: txmgr.DefaultBatcherFlagValues.ResubmissionTimeout, + ReceiptQueryInterval: 1 * time.Second, + NetworkTimeout: txmgr.DefaultBatcherFlagValues.NetworkTimeout, + TxSendTimeout: txmgr.DefaultBatcherFlagValues.TxSendTimeout, + TxNotInMempoolTimeout: txmgr.DefaultBatcherFlagValues.TxNotInMempoolTimeout, + }, + PrivateTxmgrConfigs: &txmgr.CLIConfig{ + L1RPCURL: os.Getenv("L1_WS"), NumConfirmations: 0, SafeAbortNonceTooLowCount: txmgr.DefaultBatcherFlagValues.SafeAbortNonceTooLowCount, PrivateKey: common.Bytes2Hex(crypto.FromECDSA(l1ProposerPrivKey)), @@ -87,7 +98,7 @@ func (s *ChainSyncerTestSuite) SetupTest() { TxSendTimeout: txmgr.DefaultBatcherFlagValues.TxSendTimeout, TxNotInMempoolTimeout: txmgr.DefaultBatcherFlagValues.TxNotInMempoolTimeout, }, - })) + }, nil, nil)) s.p = prop } @@ -105,7 +116,7 @@ func (s *ChainSyncerTestSuite) TestAheadOfProtocolVerifiedHead2() { s.T().Skip("Skipping, preconfer changes") s.TakeSnapshot() // propose a couple blocks - s.ProposeAndInsertEmptyBlocks(s.p, s.s.blobSyncer) + blockMeta := s.ProposeAndInsertEmptyBlocks(s.p, s.s.blobSyncer) // NOTE: need to prove the proposed blocks to be verified, writing helper function // generate transactopts to interact with TaikoL1 contract with. @@ -119,7 +130,9 @@ func (s *ChainSyncerTestSuite) TestAheadOfProtocolVerifiedHead2() { l2Head, err := s.RPCClient.L2.HeaderByNumber(context.Background(), nil) s.Nil(err) - s.Equal("test", string(bytes.TrimRight(l2Head.Extra, "\x00"))) + if !blockMeta[len(blockMeta)-1].IsOntakeBlock() { + s.Equal("test", string(bytes.TrimRight(l2Head.Extra, "\x00"))) + } log.Info("L1HeaderByNumber head", "number", head.Number) // (equiv to s.state.GetL2Head().Number) log.Info("L2HeaderByNumber head", "number", l2Head.Number) diff --git a/packages/taiko-client/driver/config.go b/packages/taiko-client/driver/config.go index ebe792c7b47..ea8019f044f 100644 --- a/packages/taiko-client/driver/config.go +++ b/packages/taiko-client/driver/config.go @@ -17,12 +17,17 @@ import ( // Config contains the configurations to initialize a Taiko driver. type Config struct { *rpc.ClientConfig - P2PSync bool - P2PSyncTimeout time.Duration - RetryInterval time.Duration - MaxExponent uint64 - BlobServerEndpoint *url.URL - SocialScanEndpoint *url.URL + P2PSync bool + P2PSyncTimeout time.Duration + RetryInterval time.Duration + MaxExponent uint64 + BlobServerEndpoint *url.URL + SocialScanEndpoint *url.URL + RPCWriteTimeout time.Duration + SoftBlockServerPort uint64 + SoftBlockServerJWTSecret []byte + SoftBlockServerCORSOrigins string + SoftBlockServerCheckSig bool } // NewConfigFromCliContext creates a new config instance from @@ -42,8 +47,9 @@ func NewConfigFromCliContext(c *cli.Context) (*Config, error) { return nil, errors.New("empty L2 check point URL") } - if !c.IsSet(flags.L1BeaconEndpoint.Name) { - return nil, errors.New("empty L1 beacon endpoint") + var beaconEndpoint string + if c.IsSet(flags.L1BeaconEndpoint.Name) { + beaconEndpoint = c.String(flags.L1BeaconEndpoint.Name) } var blobServerEndpoint *url.URL @@ -64,11 +70,25 @@ func NewConfigFromCliContext(c *cli.Context) (*Config, error) { } } + if beaconEndpoint == "" && blobServerEndpoint == nil && socialScanEndpoint == nil { + return nil, errors.New("empty L1 beacon endpoint, blob server and Social Scan endpoint") + } + + var softBlockServerJWTSecret []byte + if c.String(flags.SoftBlockServerJWTSecret.Name) != "" { + if softBlockServerJWTSecret, err = jwt.ParseSecretFromFile( + c.String(flags.SoftBlockServerJWTSecret.Name), + ); err != nil { + return nil, fmt.Errorf("invalid JWT secret file: %w", err) + } + } + var timeout = c.Duration(flags.RPCTimeout.Name) + var rpcWriteTimeout = c.Duration(flags.RPCWriteTimeout.Name) return &Config{ ClientConfig: &rpc.ClientConfig{ L1Endpoint: c.String(flags.L1WSEndpoint.Name), - L1BeaconEndpoint: c.String(flags.L1BeaconEndpoint.Name), + L1BeaconEndpoint: beaconEndpoint, L2Endpoint: c.String(flags.L2WSEndpoint.Name), L2CheckPoint: l2CheckPoint, TaikoL1Address: common.HexToAddress(c.String(flags.TaikoL1Address.Name)), @@ -77,11 +97,16 @@ func NewConfigFromCliContext(c *cli.Context) (*Config, error) { JwtSecret: string(jwtSecret), Timeout: timeout, }, - RetryInterval: c.Duration(flags.BackOffRetryInterval.Name), - P2PSync: p2pSync, - P2PSyncTimeout: c.Duration(flags.P2PSyncTimeout.Name), - MaxExponent: c.Uint64(flags.MaxExponent.Name), - BlobServerEndpoint: blobServerEndpoint, - SocialScanEndpoint: socialScanEndpoint, + RetryInterval: c.Duration(flags.BackOffRetryInterval.Name), + P2PSync: p2pSync, + P2PSyncTimeout: c.Duration(flags.P2PSyncTimeout.Name), + MaxExponent: c.Uint64(flags.MaxExponent.Name), + BlobServerEndpoint: blobServerEndpoint, + SocialScanEndpoint: socialScanEndpoint, + RPCWriteTimeout: rpcWriteTimeout, + SoftBlockServerPort: c.Uint64(flags.SoftBlockServerPort.Name), + SoftBlockServerJWTSecret: softBlockServerJWTSecret, + SoftBlockServerCORSOrigins: c.String(flags.SoftBlockServerCORSOrigins.Name), + SoftBlockServerCheckSig: c.Bool(flags.SoftBlockServerCheckSig.Name), }, nil } diff --git a/packages/taiko-client/driver/config_test.go b/packages/taiko-client/driver/config_test.go index d6a94b0a0ee..f65359467dd 100644 --- a/packages/taiko-client/driver/config_test.go +++ b/packages/taiko-client/driver/config_test.go @@ -11,13 +11,13 @@ import ( ) var ( - l1Endpoint = os.Getenv("L1_NODE_WS_ENDPOINT") - l1BeaconEndpoint = os.Getenv("L1_NODE_HTTP_ENDPOINT") - l2Endpoint = os.Getenv("L2_EXECUTION_ENGINE_WS_ENDPOINT") - l2CheckPoint = os.Getenv("L2_EXECUTION_ENGINE_HTTP_ENDPOINT") - l2EngineEndpoint = os.Getenv("L2_EXECUTION_ENGINE_AUTH_ENDPOINT") - taikoL1 = os.Getenv("TAIKO_L1_ADDRESS") - taikoL2 = os.Getenv("TAIKO_L2_ADDRESS") + l1Endpoint = os.Getenv("L1_WS") + l1BeaconEndpoint = os.Getenv("L1_HTTP") + l2Endpoint = os.Getenv("L2_WS") + l2CheckPoint = os.Getenv("L2_HTTP") + l2EngineEndpoint = os.Getenv("L2_AUTH") + taikoL1 = os.Getenv("TAIKO_L1") + taikoL2 = os.Getenv("TAIKO_L2") ) func (s *DriverTestSuite) TestNewConfigFromCliContext() { diff --git a/packages/taiko-client/driver/driver.go b/packages/taiko-client/driver/driver.go index 77acfe1fd06..33f142bb9fc 100644 --- a/packages/taiko-client/driver/driver.go +++ b/packages/taiko-client/driver/driver.go @@ -22,6 +22,7 @@ import ( "github.com/urfave/cli/v2" chainSyncer "github.com/taikoxyz/taiko-mono/packages/taiko-client/driver/chain_syncer" + softblocks "github.com/taikoxyz/taiko-mono/packages/taiko-client/driver/soft_blocks" "github.com/taikoxyz/taiko-mono/packages/taiko-client/driver/state" "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/rpc" ) @@ -35,9 +36,10 @@ const ( // contract. type Driver struct { *Config - rpc *rpc.Client - l2ChainSyncer *chainSyncer.L2ChainSyncer - state *state.State + rpc *rpc.Client + l2ChainSyncer *chainSyncer.L2ChainSyncer + softblockServer *softblocks.SoftBlockAPIServer + state *state.State l1HeadCh chan *types.Header l1HeadSub event.Subscription @@ -63,10 +65,12 @@ func (d *Driver) InitFromConfig(ctx context.Context, cfg *Config) (err error) { d.Config = cfg if d.rpc, err = rpc.NewClient(d.ctx, cfg.ClientConfig); err != nil { + log.Error("error initializing rpc.NewClient", "error", err) return err } if d.state, err = state.New(d.ctx, d.rpc); err != nil { + log.Error("error initializing state.New", "error", err) return err } @@ -94,6 +98,18 @@ func (d *Driver) InitFromConfig(ctx context.Context, cfg *Config) (err error) { d.l1HeadSub = d.state.SubL1HeadsFeed(d.l1HeadCh) + if d.SoftBlockServerPort > 0 { + if d.softblockServer, err = softblocks.New( + d.SoftBlockServerCORSOrigins, + d.SoftBlockServerJWTSecret, + d.l2ChainSyncer.BlobSyncer(), + d.rpc, + d.Config.SoftBlockServerCheckSig, + ); err != nil { + return err + } + } + return nil } @@ -104,6 +120,16 @@ func (d *Driver) Start() error { go d.reportProtocolStatus() go d.exchangeTransitionConfigLoop() + // Start the soft block server if it is enabled. + if d.softblockServer != nil { + log.Info("Starting soft block server", "port", d.SoftBlockServerPort) + go func() { + if err := d.softblockServer.Start(d.SoftBlockServerPort); err != nil { + log.Crit("Failed to start soft block server", "error", err) + } + }() + } + return nil } @@ -111,6 +137,12 @@ func (d *Driver) Start() error { func (d *Driver) Close(_ context.Context) { d.l1HeadSub.Unsubscribe() d.state.Close() + // Close the soft block server if it is enabled. + if d.softblockServer != nil { + if err := d.softblockServer.Shutdown(d.ctx); err != nil { + log.Error("Failed to shutdown soft block server", "error", err) + } + } d.wg.Wait() } @@ -180,9 +212,15 @@ func (d *Driver) ChainSyncer() *chainSyncer.L2ChainSyncer { // reportProtocolStatus reports some protocol status intervally. func (d *Driver) reportProtocolStatus() { + protocolConfigs, err := rpc.GetProtocolConfigs(d.rpc.TaikoL1, &bind.CallOpts{Context: d.ctx}) + if err != nil { + log.Error("Failed to get protocol configs", "error", err) + return + } + var ( ticker = time.NewTicker(protocolStatusReportInterval) - maxNumBlocks uint64 + maxNumBlocks = protocolConfigs.BlockMaxProposals ) d.wg.Add(1) @@ -191,25 +229,6 @@ func (d *Driver) reportProtocolStatus() { d.wg.Done() }() - if err := backoff.Retry( - func() error { - if d.ctx.Err() != nil { - return nil - } - configs, err := d.rpc.TaikoL1.GetConfig(&bind.CallOpts{Context: d.ctx}) - if err != nil { - return err - } - - maxNumBlocks = configs.BlockMaxProposals - return nil - }, - backoff.WithContext(backoff.NewConstantBackOff(d.RetryInterval), d.ctx), - ); err != nil { - log.Error("Failed to get protocol state variables", "error", err) - return - } - for { select { case <-d.ctx.Done(): @@ -282,7 +301,7 @@ func (p *RPC) AdvanceL2ChainHeadWithNewBlocks(_ *http.Request, args *Args, reply syncer := p.driver.l2ChainSyncer.BlobSyncer() for _, txList := range args.TxLists { - err := syncer.MoveTheHead(p.driver.ctx, txList, args.GasUsed) + err := syncer.MoveTheHead(p.driver.ctx, txList) if err != nil { log.Error("Failed to move the head with new block", "error", err) return err @@ -304,13 +323,13 @@ func (d *Driver) startRPCServer() { } http.Handle("/rpc", s) - log.Info("Starting JSON-RPC server", "port", rpcPort) + log.Info("Starting JSON-RPC server", "port", rpcPort, "writeTimeout", d.RPCWriteTimeout) // Create a custom HTTP server with timeouts server := &http.Server{ Addr: fmt.Sprintf(":%d", rpcPort), Handler: s, ReadTimeout: 10 * time.Second, - WriteTimeout: 10 * time.Second, + WriteTimeout: d.RPCWriteTimeout, IdleTimeout: 15 * time.Second, } diff --git a/packages/taiko-client/driver/driver_test.go b/packages/taiko-client/driver/driver_test.go index 82f00fd9048..cbcac077581 100644 --- a/packages/taiko-client/driver/driver_test.go +++ b/packages/taiko-client/driver/driver_test.go @@ -1,18 +1,28 @@ package driver import ( + "bytes" + "compress/zlib" "context" + "fmt" "math/big" + "net/url" "os" "testing" "time" "github.com/ethereum-optimism/optimism/op-service/txmgr" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/params" + "github.com/ethereum/go-ethereum/rlp" + "github.com/go-resty/resty/v2" "github.com/stretchr/testify/suite" "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/encoding" + softblocks "github.com/taikoxyz/taiko-mono/packages/taiko-client/driver/soft_blocks" "github.com/taikoxyz/taiko-mono/packages/taiko-client/internal/testutils" "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/jwt" "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/rpc" @@ -38,11 +48,11 @@ func (s *DriverTestSuite) SetupTest() { ctx, cancel := context.WithCancel(context.Background()) s.Nil(d.InitFromConfig(ctx, &Config{ ClientConfig: &rpc.ClientConfig{ - L1Endpoint: os.Getenv("L1_NODE_WS_ENDPOINT"), - L2Endpoint: os.Getenv("L2_EXECUTION_ENGINE_WS_ENDPOINT"), - L2EngineEndpoint: os.Getenv("L2_EXECUTION_ENGINE_AUTH_ENDPOINT"), - TaikoL1Address: common.HexToAddress(os.Getenv("TAIKO_L1_ADDRESS")), - TaikoL2Address: common.HexToAddress(os.Getenv("TAIKO_L2_ADDRESS")), + L1Endpoint: os.Getenv("L1_WS"), + L2Endpoint: os.Getenv("L2_WS"), + L2EngineEndpoint: os.Getenv("L2_AUTH"), + TaikoL1Address: common.HexToAddress(os.Getenv("TAIKO_L1")), + TaikoL2Address: common.HexToAddress(os.Getenv("TAIKO_L2")), JwtSecret: string(jwtSecret), }, })) @@ -58,7 +68,6 @@ func (s *DriverTestSuite) TestName() { } func (s *DriverTestSuite) TestProcessL1Blocks() { - s.T().Skip("Skipping, preconfer changes") l2Head1, err := s.d.rpc.L2.HeaderByNumber(context.Background(), nil) s.Nil(err) @@ -87,20 +96,22 @@ func (s *DriverTestSuite) TestProcessL1Blocks() { txCount, err := s.d.rpc.L2.TransactionCount(context.Background(), header.Hash()) s.Nil(err) - s.Equal(uint(1), txCount) + s.GreaterOrEqual(txCount, uint(1)) anchorTx, err := s.d.rpc.L2.TransactionInBlock(context.Background(), header.Hash(), 0) s.Nil(err) method, err := encoding.TaikoL2ABI.MethodById(anchorTx.Data()) s.Nil(err) - s.Equal("anchor", method.Name) + s.Contains(method.Name, "anchor") } } func (s *DriverTestSuite) TestCheckL1ReorgToHigherFork() { - s.T().Skip("Skipping preconfer changes") - + // TODO: Temporarily skip this test case when use l2_reth node. + if os.Getenv("L2_NODE") == "l2_reth" { + s.T().Skip() + } var ( testnetL1SnapshotID = s.SetL1Snapshot() ) @@ -135,7 +146,7 @@ func (s *DriverTestSuite) TestCheckL1ReorgToHigherFork() { // Because of evm_revert operation, the nonce of the proposer need to be adjusted. // Propose ten blocks on another fork for i := 0; i < 10; i++ { - s.ProposeInvalidTxListBytes(s.p) + s.ProposeAndInsertValidBlock(s.p, s.d.ChainSyncer().BlobSyncer()) } l1Head4, err := s.d.rpc.L1.HeaderByNumber(context.Background(), nil) @@ -143,8 +154,6 @@ func (s *DriverTestSuite) TestCheckL1ReorgToHigherFork() { s.Greater(l1Head4.Number.Uint64(), l1Head2.Number.Uint64()) - s.Nil(s.d.ChainSyncer().BlobSyncer().ProcessL1Blocks(context.Background())) - l2Head3, err := s.d.rpc.L2.HeaderByNumber(context.Background(), nil) s.Nil(err) @@ -157,7 +166,6 @@ func (s *DriverTestSuite) TestCheckL1ReorgToHigherFork() { } func (s *DriverTestSuite) TestCheckL1ReorgToLowerFork() { - s.T().Skip("Skipping, preconfer changes") var ( testnetL1SnapshotID = s.SetL1Snapshot() ) @@ -194,7 +202,7 @@ func (s *DriverTestSuite) TestCheckL1ReorgToLowerFork() { s.GreaterOrEqual(l1Head3.Number.Uint64(), l1Head1.Number.Uint64()) // Propose one blocks on another fork - s.ProposeInvalidTxListBytes(s.p) + s.ProposeValidBlock(s.p) l1Head4, err := s.d.rpc.L1.HeaderByNumber(context.Background(), nil) s.Nil(err) @@ -214,7 +222,7 @@ func (s *DriverTestSuite) TestCheckL1ReorgToLowerFork() { } func (s *DriverTestSuite) TestCheckL1ReorgToSameHeightFork() { - s.T().Skip("Skipping, preconfer changes") + s.T().Skip("Skip this test case because of the anvil timestamp issue after rollback.") var ( testnetL1SnapshotID = s.SetL1Snapshot() ) @@ -251,9 +259,9 @@ func (s *DriverTestSuite) TestCheckL1ReorgToSameHeightFork() { s.GreaterOrEqual(l1Head3.Number.Uint64(), l1Head1.Number.Uint64()) // Propose two blocks on another fork - s.ProposeInvalidTxListBytes(s.p) + s.ProposeValidBlock(s.p) time.Sleep(3 * time.Second) - s.ProposeInvalidTxListBytes(s.p) + s.ProposeValidBlock(s.p) l1Head4, err := s.d.rpc.L1.HeaderByNumber(context.Background(), nil) s.Nil(err) @@ -283,7 +291,6 @@ func (s *DriverTestSuite) TestStartClose() { } func (s *DriverTestSuite) TestL1Current() { - s.T().Skip("Skipping, preconfer changes") // propose and insert a block s.ProposeAndInsertEmptyBlocks(s.p, s.d.ChainSyncer().BlobSyncer()) // reset L1 current with increased height @@ -302,27 +309,20 @@ func (s *DriverTestSuite) InitProposer() { s.Nil(p.InitFromConfig(context.Background(), &proposer.Config{ ClientConfig: &rpc.ClientConfig{ - L1Endpoint: os.Getenv("L1_NODE_WS_ENDPOINT"), - L2Endpoint: os.Getenv("L2_EXECUTION_ENGINE_WS_ENDPOINT"), - L2EngineEndpoint: os.Getenv("L2_EXECUTION_ENGINE_AUTH_ENDPOINT"), + L1Endpoint: os.Getenv("L1_WS"), + L2Endpoint: os.Getenv("L2_WS"), + L2EngineEndpoint: os.Getenv("L2_AUTH"), JwtSecret: string(jwtSecret), - TaikoL1Address: common.HexToAddress(os.Getenv("TAIKO_L1_ADDRESS")), - TaikoL2Address: common.HexToAddress(os.Getenv("TAIKO_L2_ADDRESS")), - TaikoTokenAddress: common.HexToAddress(os.Getenv("TAIKO_TOKEN_ADDRESS")), + TaikoL1Address: common.HexToAddress(os.Getenv("TAIKO_L1")), + TaikoL2Address: common.HexToAddress(os.Getenv("TAIKO_L2")), + TaikoTokenAddress: common.HexToAddress(os.Getenv("TAIKO_TOKEN")), }, - AssignmentHookAddress: common.HexToAddress(os.Getenv("ASSIGNMENT_HOOK_ADDRESS")), L1ProposerPrivKey: l1ProposerPrivKey, L2SuggestedFeeRecipient: common.HexToAddress(os.Getenv("L2_SUGGESTED_FEE_RECIPIENT")), ProposeInterval: 1024 * time.Hour, MaxProposedTxListsPerEpoch: 1, - ProverEndpoints: s.ProverEndpoints, - OptimisticTierFee: common.Big256, - SgxTierFee: common.Big256, - MaxTierFeePriceBumps: 3, - TierFeePriceBump: common.Big2, - L1BlockBuilderTip: common.Big0, TxmgrConfigs: &txmgr.CLIConfig{ - L1RPCURL: os.Getenv("L1_NODE_WS_ENDPOINT"), + L1RPCURL: os.Getenv("L1_WS"), NumConfirmations: 0, SafeAbortNonceTooLowCount: txmgr.DefaultBatcherFlagValues.SafeAbortNonceTooLowCount, PrivateKey: common.Bytes2Hex(crypto.FromECDSA(l1ProposerPrivKey)), @@ -336,10 +336,369 @@ func (s *DriverTestSuite) InitProposer() { TxSendTimeout: txmgr.DefaultBatcherFlagValues.TxSendTimeout, TxNotInMempoolTimeout: txmgr.DefaultBatcherFlagValues.TxNotInMempoolTimeout, }, - })) + PrivateTxmgrConfigs: &txmgr.CLIConfig{ + L1RPCURL: os.Getenv("L1_WS"), + NumConfirmations: 0, + SafeAbortNonceTooLowCount: txmgr.DefaultBatcherFlagValues.SafeAbortNonceTooLowCount, + PrivateKey: common.Bytes2Hex(crypto.FromECDSA(l1ProposerPrivKey)), + FeeLimitMultiplier: txmgr.DefaultBatcherFlagValues.FeeLimitMultiplier, + FeeLimitThresholdGwei: txmgr.DefaultBatcherFlagValues.FeeLimitThresholdGwei, + MinBaseFeeGwei: txmgr.DefaultBatcherFlagValues.MinBaseFeeGwei, + MinTipCapGwei: txmgr.DefaultBatcherFlagValues.MinTipCapGwei, + ResubmissionTimeout: txmgr.DefaultBatcherFlagValues.ResubmissionTimeout, + ReceiptQueryInterval: 1 * time.Second, + NetworkTimeout: txmgr.DefaultBatcherFlagValues.NetworkTimeout, + TxSendTimeout: txmgr.DefaultBatcherFlagValues.TxSendTimeout, + TxNotInMempoolTimeout: txmgr.DefaultBatcherFlagValues.TxNotInMempoolTimeout, + }, + }, nil, nil)) s.p = p } +func (s *DriverTestSuite) TestInsertSoftBlocks() { + var ( + port = uint64(testutils.RandomPort()) + err error + ) + s.d.softblockServer, err = softblocks.New("*", nil, s.d.ChainSyncer().BlobSyncer(), s.RPCClient, true) + s.Nil(err) + go func() { s.NotNil(s.d.softblockServer.Start(port)) }() + defer func() { s.Nil(s.d.softblockServer.Shutdown(s.d.ctx)) }() + + url, err := url.Parse(fmt.Sprintf("http://localhost:%v", port)) + s.Nil(err) + + l2Head1, err := s.d.rpc.L2.HeaderByNumber(context.Background(), nil) + s.Nil(err) + + s.Nil(s.d.ChainSyncer().BlobSyncer().ProcessL1Blocks(context.Background())) + + // Propose a valid L2 block + s.ProposeAndInsertValidBlock(s.p, s.d.ChainSyncer().BlobSyncer()) + + l2Head2, err := s.d.rpc.L2.HeaderByNumber(context.Background(), nil) + s.Nil(err) + + l1Head1, err := s.d.rpc.L1.HeaderByNumber(context.Background(), nil) + s.Nil(err) + + s.Greater(l2Head2.Number.Uint64(), l2Head1.Number.Uint64()) + + res, err := resty.New().R().Get(url.String() + "/healthz") + s.Nil(err) + s.True(res.IsSuccess()) + + // Try to insert a soft block with batch ID 0 + s.True(s.insertSoftBlock(url, l1Head1, l2Head2.Number.Uint64()+1, 0, false, false).IsSuccess()) + l2Head3, err := s.d.rpc.L2.BlockByNumber(context.Background(), nil) + s.Nil(err) + + s.Equal(2, len(l2Head3.Transactions())) + + l1Origin, err := s.RPCClient.L2.L1OriginByID(context.Background(), new(big.Int).Add(l2Head2.Number, common.Big1)) + s.Nil(err) + s.Equal(l2Head3.Number().Uint64(), l1Origin.BlockID.Uint64()) + s.Equal(l2Head3.Hash(), l1Origin.L2BlockHash) + s.Equal(uint64(0), l1Origin.L1BlockHeight.Uint64()) + s.Equal(common.Hash{}, l1Origin.L1BlockHash) + s.Equal(false, l1Origin.EndOfBlock) + s.Equal(false, l1Origin.EndOfPreconf) + s.Equal(uint64(0), l1Origin.BatchID.Uint64()) + s.True(l1Origin.IsSoftBlock()) + + // Try to patch a soft block with batch ID 1 + s.True(s.insertSoftBlock(url, l1Head1, l2Head2.Number.Uint64()+1, 1, true, false).IsSuccess()) + l2Head4, err := s.d.rpc.L2.BlockByNumber(context.Background(), nil) + s.Nil(err) + s.Equal(3, len(l2Head4.Transactions())) + s.Equal(l2Head3.Number().Uint64(), l2Head4.Number().Uint64()) + s.NotEqual(l2Head3.Hash(), l2Head4.Hash()) + + l1Origin2, err := s.RPCClient.L2.L1OriginByID(context.Background(), new(big.Int).Add(l2Head2.Number, common.Big1)) + s.Nil(err) + s.Equal(l2Head4.Number().Uint64(), l1Origin2.BlockID.Uint64()) + s.Equal(l2Head4.Hash(), l1Origin2.L2BlockHash) + s.Equal(uint64(0), l1Origin2.L1BlockHeight.Uint64()) + s.Equal(common.Hash{}, l1Origin2.L1BlockHash) + s.Equal(true, l1Origin2.EndOfBlock) + s.Equal(false, l1Origin2.EndOfPreconf) + s.Equal(uint64(1), l1Origin2.BatchID.Uint64()) + s.True(l1Origin2.IsSoftBlock()) + + canonicalL1Origin, err := s.RPCClient.L2.HeadL1Origin(context.Background()) + s.Nil(err) + s.Equal(l2Head2.Number.Uint64(), canonicalL1Origin.BlockID.Uint64()) + + // Try to patch an ended soft block + s.False(s.insertSoftBlock(url, l1Head1, l2Head2.Number.Uint64()+1, 1, true, false).IsSuccess()) + + // Try to insert a new soft block with batch ID 0 + s.True(s.insertSoftBlock(url, l1Head1, l2Head2.Number.Uint64()+2, 0, false, false).IsSuccess()) + l2Head5, err := s.d.rpc.L2.BlockByNumber(context.Background(), nil) + s.Nil(err) + s.Equal(2, len(l2Head5.Transactions())) + + // Propose 3 valid L2 blocks + s.ProposeAndInsertEmptyBlocks(s.p, s.d.ChainSyncer().BlobSyncer()) + + l2Head6, err := s.d.rpc.L2.BlockByNumber(context.Background(), l2Head3.Number()) + s.Nil(err) + s.Equal(l2Head3.Number().Uint64(), l2Head6.Number().Uint64()) + s.Equal(1, len(l2Head6.Transactions())) + + l1Origin3, err := s.RPCClient.L2.L1OriginByID(context.Background(), l2Head6.Number()) + s.Nil(err) + s.Equal(l2Head3.Number().Uint64(), l1Origin3.BlockID.Uint64()) + s.Equal(l2Head6.Hash(), l1Origin3.L2BlockHash) + s.NotZero(l1Origin3.L1BlockHeight.Uint64()) + s.NotEmpty(l1Origin3.L1BlockHash) + s.Equal(false, l1Origin3.EndOfBlock) + s.Equal(false, l1Origin3.EndOfPreconf) + s.Nil(l1Origin3.BatchID) + s.False(l1Origin3.IsSoftBlock()) +} + +func (s *DriverTestSuite) TestInsertSoftBlocksAfterEOB() { + var ( + port = uint64(testutils.RandomPort()) + epochs = testutils.RandomHash().Big().Uint64()%10 + 5 + err error + ) + s.d.softblockServer, err = softblocks.New("*", nil, s.d.ChainSyncer().BlobSyncer(), s.RPCClient, true) + s.Nil(err) + go func() { s.NotNil(s.d.softblockServer.Start(port)) }() + defer func() { s.Nil(s.d.softblockServer.Shutdown(s.d.ctx)) }() + + url, err := url.Parse(fmt.Sprintf("http://localhost:%v", port)) + s.Nil(err) + + headL1Origin, err := s.RPCClient.L2.HeadL1Origin(context.Background()) + s.Nil(err) + + for range headL1Origin.BlockID.Uint64() + epochs + 1 { + s.ProposeAndInsertEmptyBlocks(s.p, s.d.ChainSyncer().BlobSyncer()) + } + + l1Head, err := s.d.rpc.L1.HeaderByNumber(context.Background(), nil) + s.Nil(err) + + l2Head, err := s.d.rpc.L2.HeaderByNumber(context.Background(), nil) + s.Nil(err) + + for i := range epochs { + s.True(s.insertSoftBlock(url, l1Head, l2Head.Number.Uint64()+1+i, 0, false, false).IsSuccess()) + s.True(s.insertSoftBlock(url, l1Head, l2Head.Number.Uint64()+1+i, 1, true, false).IsSuccess()) + s.False(s.insertSoftBlock(url, l1Head, l2Head.Number.Uint64()+1+i, 0, true, false).IsSuccess()) + } + s.True(s.insertSoftBlock(url, l1Head, l2Head.Number.Uint64()+1+epochs, 0, true, false).IsSuccess()) + s.False(s.insertSoftBlock(url, l1Head, l2Head.Number.Uint64()+1+epochs, 1, false, false).IsSuccess()) + s.True(s.insertSoftBlock(url, l1Head, l2Head.Number.Uint64()+2+epochs, 0, false, true).IsSuccess()) + s.False(s.insertSoftBlock(url, l1Head, l2Head.Number.Uint64()+2+epochs, 1, true, false).IsSuccess()) + + l2Head2, err := s.d.rpc.L2.HeaderByNumber(context.Background(), nil) + s.Nil(err) + + s.Equal(l2Head.Number.Uint64()+2+epochs, l2Head2.Number.Uint64()) + + l1Origin, err := s.RPCClient.L2.L1OriginByID(context.Background(), l2Head2.Number) + s.Nil(err) + + s.Equal(l2Head2.Number.Uint64(), l1Origin.BlockID.Uint64()) + s.Equal(false, l1Origin.EndOfBlock) + s.Equal(true, l1Origin.EndOfPreconf) + s.True(l1Origin.IsSoftBlock()) + + headL1Origin, err = s.RPCClient.L2.HeadL1Origin(context.Background()) + s.Nil(err) + s.Equal(l2Head.Number.Uint64(), headL1Origin.BlockID.Uint64()) + s.False(headL1Origin.IsSoftBlock()) + + s.ProposeAndInsertEmptyBlocks(s.p, s.d.ChainSyncer().BlobSyncer()) + + l2Head3, err := s.d.rpc.L2.HeaderByNumber(context.Background(), nil) + s.Nil(err) + + s.Less(l2Head3.Number.Uint64(), l2Head2.Number.Uint64()) + headL1Origin, err = s.RPCClient.L2.HeadL1Origin(context.Background()) + s.Nil(err) + s.Equal(l2Head3.Number.Uint64(), headL1Origin.BlockID.Uint64()) + s.False(headL1Origin.IsSoftBlock()) +} + +func (s *DriverTestSuite) TestInsertSoftBlocksAfterEOP() { + var ( + port = uint64(testutils.RandomPort()) + epochs = testutils.RandomHash().Big().Uint64() % 5 + err error + ) + s.d.softblockServer, err = softblocks.New("*", nil, s.d.ChainSyncer().BlobSyncer(), s.RPCClient, true) + s.Nil(err) + go func() { s.NotNil(s.d.softblockServer.Start(port)) }() + defer func() { s.Nil(s.d.softblockServer.Shutdown(s.d.ctx)) }() + + url, err := url.Parse(fmt.Sprintf("http://localhost:%v", port)) + s.Nil(err) + + headL1Origin, err := s.RPCClient.L2.HeadL1Origin(context.Background()) + s.Nil(err) + + for range headL1Origin.BlockID.Uint64() + epochs + 1 { + s.ProposeAndInsertEmptyBlocks(s.p, s.d.ChainSyncer().BlobSyncer()) + } + + l1Head, err := s.d.rpc.L1.HeaderByNumber(context.Background(), nil) + s.Nil(err) + + l2Head, err := s.d.rpc.L2.HeaderByNumber(context.Background(), nil) + s.Nil(err) + + for i := range epochs { + s.True(s.insertSoftBlock(url, l1Head, l2Head.Number.Uint64()+1, i, false, false).IsSuccess()) + + latestSafeBlock, err := s.RPCClient.L2.HeaderByNumber(context.Background(), big.NewInt(-4)) + s.Nil(err) + s.Equal(l2Head.Number.Uint64(), latestSafeBlock.Number.Uint64()) + + latestFinalizedBlock, err := s.RPCClient.L2.HeaderByNumber(context.Background(), big.NewInt(-3)) + s.Nil(err) + s.Equal(uint64(0), latestFinalizedBlock.Number.Uint64()) + } + s.True(s.insertSoftBlock(url, l1Head, l2Head.Number.Uint64()+1, epochs, false, true).IsSuccess()) + s.False(s.insertSoftBlock(url, l1Head, l2Head.Number.Uint64()+1, epochs+1, false, false).IsSuccess()) + + latestSafeBlock, err := s.RPCClient.L2.HeaderByNumber(context.Background(), big.NewInt(-4)) + s.Nil(err) + s.Equal(l2Head.Number.Uint64(), latestSafeBlock.Number.Uint64()) + + l2Head2, err := s.d.rpc.L2.HeaderByNumber(context.Background(), nil) + s.Nil(err) + + // Remove soft blocks + res, err := resty.New(). + R(). + SetBody(&softblocks.RemoveSoftBlocksRequestBody{ + NewLastBlockID: l2Head2.Number.Uint64() - 1, + }). + Delete(url.String() + "/softBlocks") + s.Nil(err) + s.True(res.IsSuccess()) + + l2Head3, err := s.d.rpc.L2.HeaderByNumber(context.Background(), nil) + s.Nil(err) + s.Equal(l2Head2.Number.Uint64()-1, l2Head3.Number.Uint64()) + + latestFinalizedBlock, err := s.RPCClient.L2.HeaderByNumber(context.Background(), big.NewInt(-3)) + s.Nil(err) + s.Equal(uint64(0), latestFinalizedBlock.Number.Uint64()) +} + func TestDriverTestSuite(t *testing.T) { suite.Run(t, new(DriverTestSuite)) } + +// insertSoftBlock inserts a soft block with the given parameters. +func (s *DriverTestSuite) insertSoftBlock( + url *url.URL, + anchoredL1Block *types.Header, + l2BlockID uint64, + batchID uint64, + endOfBlock bool, + endOfPreconf bool, +) *resty.Response { + preconferPrivKey, err := crypto.ToECDSA(common.FromHex(os.Getenv("L1_PROPOSER_PRIVATE_KEY"))) + s.Nil(err) + + preconferAddress := crypto.PubkeyToAddress(preconferPrivKey.PublicKey) + + nonce, err := s.RPCClient.L2.NonceAt(context.Background(), s.TestAddr, nil) + s.Nil(err) + + tx := types.NewTransaction( + nonce, + common.BytesToAddress(testutils.RandomBytes(32)), + common.Big0, + 100_000, + new(big.Int).SetUint64(uint64(10*params.GWei)), + []byte{}, + ) + signedTx, err := types.SignTx(tx, types.LatestSignerForChainID(s.RPCClient.L2.ChainID), s.TestAddrPrivKey) + s.Nil(err) + + // If the transaction is underpriced, we just ingore it. + err = s.RPCClient.L2.SendTransaction(context.Background(), signedTx) + if err != nil { + s.Equal("replacement transaction underpriced", err.Error()) + } + + b, err := encodeAndCompressTxList([]*types.Transaction{signedTx}) + s.Nil(err) + + var marker softblocks.TransactionBatchMarker + if endOfBlock { + marker = softblocks.BatchMarkerEOB + } else if endOfPreconf { + marker = softblocks.BatchMarkerEOP + } else { + marker = softblocks.BatchMarkerEmpty + } + + txBatch := &softblocks.TransactionBatch{ + BlockID: l2BlockID, + ID: batchID, + TransactionsList: b, + BatchMarker: marker, + Signature: "", + BlockParams: &softblocks.SoftBlockParams{ + AnchorBlockID: anchoredL1Block.Number.Uint64(), + AnchorStateRoot: anchoredL1Block.Root, + Timestamp: anchoredL1Block.Time + 12, + Coinbase: preconferAddress, + }, + } + + payload, err := rlp.EncodeToBytes(txBatch) + s.Nil(err) + s.NotEmpty(payload) + + sig, err := crypto.Sign(crypto.Keccak256(payload), preconferPrivKey) + s.Nil(err) + txBatch.Signature = common.Bytes2Hex(sig) + + // Try to propose a soft block with batch ID 0 + res, err := resty.New(). + R(). + SetBody(&softblocks.BuildSoftBlockRequestBody{ + TransactionBatch: txBatch, + }). + Post(url.String() + "/softBlocks") + s.Nil(err) + log.Info("Soft block response", "body", res.String()) + return res +} + +// compress compresses the given txList bytes using zlib. +func compress(txListBytes []byte) ([]byte, error) { + var b bytes.Buffer + w := zlib.NewWriter(&b) + defer w.Close() + + if _, err := w.Write(txListBytes); err != nil { + return nil, err + } + + if err := w.Flush(); err != nil { + return nil, err + } + + return b.Bytes(), nil +} + +// encodeAndCompressTxList encodes and compresses the given transactions list. +func encodeAndCompressTxList(txs types.Transactions) ([]byte, error) { + b, err := rlp.EncodeToBytes(txs) + if err != nil { + return nil, err + } + + return compress(b) +} diff --git a/packages/taiko-client/driver/signer/fixed_k_signer.go b/packages/taiko-client/driver/signer/fixed_k_signer.go index de50decaf46..119c37ff3ec 100644 --- a/packages/taiko-client/driver/signer/fixed_k_signer.go +++ b/packages/taiko-client/driver/signer/fixed_k_signer.go @@ -13,7 +13,7 @@ var ( zero32 [32]byte ) -// FixedKSigner is a ethereum ECDSA signer who always sign payload with the given K value. +// FixedKSigner is an ethereum ECDSA signer who always sign payload with the given K value. // In theory K value is randomly selected in ECDSA algorithm's step 3: // https://en.wikipedia.org/wiki/Elliptic_Curve_Digital_Signature_Algorithm, // but here we use a fixed K value instead. diff --git a/packages/taiko-client/driver/soft_blocks/api.go b/packages/taiko-client/driver/soft_blocks/api.go new file mode 100644 index 00000000000..a51bcd7b0bc --- /dev/null +++ b/packages/taiko-client/driver/soft_blocks/api.go @@ -0,0 +1,306 @@ +package softblocks + +import ( + "errors" + "math/big" + "net/http" + + "github.com/ethereum/go-ethereum" + "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/go-ethereum/rlp" + "github.com/labstack/echo/v4" +) + +// TransactionBatchMarker represents the status of a soft block transactions group. +type TransactionBatchMarker string + +// BatchMarker valid values. +const ( + BatchMarkerEmpty TransactionBatchMarker = "" + BatchMarkerEOB TransactionBatchMarker = "endOfBlock" + BatchMarkerEOP TransactionBatchMarker = "endOfPreconf" +) + +// SoftBlockParams represents the parameters for building a soft block. +type SoftBlockParams struct { + // @param timestamp uint64 Timestamp of the soft block + Timestamp uint64 `json:"timestamp"` + // @param coinbase string Coinbase of the soft block + Coinbase common.Address `json:"coinbase"` + + // @param anchorBlockID uint64 `_anchorBlockId` parameter of the `anchorV2` transaction in soft block + AnchorBlockID uint64 `json:"anchorBlockID"` + // @param anchorStateRoot string `_anchorStateRoot` parameter of the `anchorV2` transaction in soft block + AnchorStateRoot common.Hash `json:"anchorStateRoot"` +} + +// TransactionBatch represents a soft block group. +type TransactionBatch struct { + // @param blockId uint64 Block ID of the soft block + BlockID uint64 `json:"blockId"` + // @param batchId uint64 ID of this transaction batch + ID uint64 `json:"batchId"` + // @param transactions string zlib compressed RLP encoded bytes of a transactions list + TransactionsList []byte `json:"transactions"` + // @param batchType TransactionBatchMarker Marker of the transaction batch, + // @param either `end_of_block`, `end_of_preconf` or empty + BatchMarker TransactionBatchMarker `json:"batchType"` + // @param signature string Signature of this transaction batch + Signature string `json:"signature" rlp:"-"` + // @param blockParams SoftBlockParams Block parameters of the soft block + BlockParams *SoftBlockParams `json:"blockParams"` +} + +// ValidateSignature validates the signature of the transaction batch. +func (b *TransactionBatch) ValidateSignature() (bool, error) { + payload, err := rlp.EncodeToBytes(b) + if err != nil { + return false, err + } + + pubKey, err := crypto.SigToPub(crypto.Keccak256(payload), common.FromHex(b.Signature)) + if err != nil { + return false, err + } + + return crypto.PubkeyToAddress(*pubKey).Hex() == b.BlockParams.Coinbase.Hex(), nil +} + +// BuildSoftBlockRequestBody represents a request body when handling +// soft blocks creation requests. +type BuildSoftBlockRequestBody struct { + // @param transactionBatch TransactionBatch Transaction batch to be inserted into the soft block + TransactionBatch *TransactionBatch `json:"transactionBatch"` +} + +// CreateOrUpdateBlocksFromBatchResponseBody represents a response body when handling soft +// blocks creation requests. +type BuildSoftBlockResponseBody struct { + // @param blockHeader types.Header of the soft block + BlockHeader *types.Header `json:"blockHeader"` +} + +// BuildSoftBlock handles a soft block creation request, +// if the soft block transactions batch in request are valid, it will insert or reorg the correspoinding the soft +// block to the backend L2 execution engine and return a success response. +// +// @Summary Insert a soft block with a batch of given transactions for preconfirmation. +// @Description Insert a batch of transactions into a soft block for preconfirmation. If the batch is the +// @Description first for a block, a new soft block will be created. Otherwise, the transactions will +// @Description be appended to the existing soft block. The API will fail if: +// @Description 1) the block is not soft +// @Description 2) block-level parameters are invalid or do not match the current soft block’s parameters +// @Description 3) the batch ID is not exactly 1 greater than the previous one +// @Description 4) the last batch of the block indicates no further transactions are allowed +// @Param body body BuildSoftBlockRequestBody true "soft block creation request body" +// @Accept json +// @Produce json +// @Success 200 {object} BuildSoftBlockResponseBody +// @Router /softBlocks [post] +func (s *SoftBlockAPIServer) BuildSoftBlock(c echo.Context) error { + // Parse the request body. + reqBody := new(BuildSoftBlockRequestBody) + if err := c.Bind(reqBody); err != nil { + return s.returnError(c, http.StatusUnprocessableEntity, err) + } + if reqBody.TransactionBatch == nil { + return s.returnError(c, http.StatusBadRequest, errors.New("transactionBatch is required")) + } + + log.Info( + "New soft block building request", + "blockID", reqBody.TransactionBatch.BlockID, + "batchID", reqBody.TransactionBatch.ID, + "batchMarker", reqBody.TransactionBatch.BatchMarker, + "transactionsListBytes", len(reqBody.TransactionBatch.TransactionsList), + "signature", reqBody.TransactionBatch.Signature, + "timestamp", reqBody.TransactionBatch.BlockParams.Timestamp, + "coinbase", reqBody.TransactionBatch.BlockParams.Coinbase, + "anchorBlockID", reqBody.TransactionBatch.BlockParams.AnchorBlockID, + "anchorStateRoot", reqBody.TransactionBatch.BlockParams.AnchorStateRoot, + ) + + // Request body validation. + if reqBody.TransactionBatch.BlockParams == nil { + return s.returnError(c, http.StatusBadRequest, errors.New("blockParams is required")) + } + if reqBody.TransactionBatch.BlockParams.AnchorBlockID == 0 { + return s.returnError(c, http.StatusBadRequest, errors.New("non-zero anchorBlockID is required")) + } + if reqBody.TransactionBatch.BlockParams.AnchorStateRoot == (common.Hash{}) { + return s.returnError(c, http.StatusBadRequest, errors.New("empty anchorStateRoot")) + } + if reqBody.TransactionBatch.BlockParams.Timestamp == 0 { + return s.returnError(c, http.StatusBadRequest, errors.New("non-zero timestamp is required")) + } + if reqBody.TransactionBatch.BlockParams.Coinbase == (common.Address{}) { + return s.returnError(c, http.StatusBadRequest, errors.New("empty coinbase")) + } + + // If the `--softBlock.signatureCheck` flag is enabled, validate the signature. + if s.checkSig { + ok, err := reqBody.TransactionBatch.ValidateSignature() + if err != nil { + return c.JSON(http.StatusInternalServerError, map[string]string{"error": err.Error()}) + } + if !ok { + log.Warn( + "Invalid signature", + "signature", reqBody.TransactionBatch.Signature, + "coinbase", reqBody.TransactionBatch.BlockParams.Coinbase.Hex(), + ) + return s.returnError(c, http.StatusBadRequest, errors.New("invalid signature")) + } + } + + // Check if the L2 execution engine is syncing from L1. + progress, err := s.rpc.L2ExecutionEngineSyncProgress(c.Request().Context()) + if err != nil { + return c.JSON(http.StatusInternalServerError, map[string]string{"error": err.Error()}) + } + if progress.IsSyncing() { + return s.returnError(c, http.StatusBadRequest, errors.New("L2 execution engine is syncing")) + } + + // Check if the softblock batch or the current preconf process is ended. + l1Origin, err := s.rpc.L2.L1OriginByID( + c.Request().Context(), + new(big.Int).SetUint64(reqBody.TransactionBatch.BlockID), + ) + if err != nil && err.Error() != ethereum.NotFound.Error() { + return s.returnError(c, http.StatusInternalServerError, err) + } + if l1Origin != nil { + if l1Origin.EndOfBlock { + return s.returnError(c, http.StatusBadRequest, errors.New("soft block has already been marked as ended")) + } + if l1Origin.EndOfPreconf { + return s.returnError( + c, + http.StatusBadRequest, + errors.New("preconfirmation has already been marked as ended"), + ) + } + } + + // Insert the soft block. + header, err := s.chainSyncer.InsertSoftBlockFromTransactionsBatch( + c.Request().Context(), + reqBody.TransactionBatch.BlockID, + reqBody.TransactionBatch.ID, + s.txListDecompressor.TryDecompress( + s.rpc.L2.ChainID, + new(big.Int).SetUint64(reqBody.TransactionBatch.BlockID), + reqBody.TransactionBatch.TransactionsList, + true, + ), + reqBody.TransactionBatch.BatchMarker, + reqBody.TransactionBatch.BlockParams, + ) + if err != nil { + return s.returnError(c, http.StatusInternalServerError, err) + } + + return c.JSON(http.StatusOK, BuildSoftBlockResponseBody{BlockHeader: header}) +} + +// RemoveSoftBlocksRequestBody represents a request body when resetting the backend +// L2 execution engine soft head. +type RemoveSoftBlocksRequestBody struct { + // @param newLastBlockID uint64 New last block ID of the blockchain, it should + // @param not smaller than the canonical chain's highest block ID. + NewLastBlockID uint64 `json:"newLastBlockId"` +} + +// RemoveSoftBlocksResponseBody represents a response body when resetting the backend +// L2 execution engine soft head. +type RemoveSoftBlocksResponseBody struct { + // @param lastBlockID uint64 Current highest block ID of the blockchain (including soft blocks) + LastBlockID uint64 `json:"lastBlockId"` + // @param lastProposedBlockID uint64 Highest block ID of the cnonical chain + LastProposedBlockID uint64 `json:"lastProposedBlockID"` + // @param headsRemoved uint64 Number of soft heads removed + HeadsRemoved uint64 `json:"headsRemoved"` +} + +// RemoveSoftBlocks removes the backend L2 execution engine soft head. +// +// @Summary Remove the soft blocks beyond the specified block height. +// @Description Remove all soft blocks from the blockchain beyond the specified block height, +// @Description ensuring the latest block ID does not exceed the given height. This method will fail if +// @Description the block with an ID one greater than the specified height is not a soft block. If the +// @Description specified block height is greater than the latest soft block ID, the method will succeed +// @Description without modifying the blockchain. +// @Param body body RemoveSoftBlocksRequestBody true "soft blocks removing request body" +// @Accept json +// @Produce json +// @Success 200 {object} RemoveSoftBlocksResponseBody +// @Router /softBlocks [delete] +func (s *SoftBlockAPIServer) RemoveSoftBlocks(c echo.Context) error { + // Parse the request body. + reqBody := new(RemoveSoftBlocksRequestBody) + if err := c.Bind(reqBody); err != nil { + return s.returnError(c, http.StatusUnprocessableEntity, err) + } + + // Request body validation. + canonicalHeadL1Origin, err := s.rpc.L2.HeadL1Origin(c.Request().Context()) + if err != nil { + return s.returnError(c, http.StatusInternalServerError, err) + } + + currentHead, err := s.rpc.L2.HeaderByNumber(c.Request().Context(), nil) + if err != nil { + return s.returnError(c, http.StatusInternalServerError, err) + } + + log.Info( + "New soft block removing request", + "newLastBlockId", reqBody.NewLastBlockID, + "canonicalHead", canonicalHeadL1Origin.BlockID.Uint64(), + "currentHead", currentHead.Number.Uint64(), + ) + + if reqBody.NewLastBlockID < canonicalHeadL1Origin.BlockID.Uint64() { + return s.returnError( + c, + http.StatusBadRequest, + errors.New("newLastBlockId must not be smaller than the canonical chain's highest block ID"), + ) + } + + if err := s.chainSyncer.RemoveSoftBlocks(c.Request().Context(), reqBody.NewLastBlockID); err != nil { + return s.returnError(c, http.StatusBadRequest, err) + } + + newHead, err := s.rpc.L2.HeaderByNumber(c.Request().Context(), nil) + if err != nil { + return s.returnError(c, http.StatusInternalServerError, err) + } + + return c.JSON(http.StatusOK, RemoveSoftBlocksResponseBody{ + LastBlockID: newHead.Number.Uint64(), + LastProposedBlockID: canonicalHeadL1Origin.BlockID.Uint64(), + HeadsRemoved: currentHead.Number.Uint64() - newHead.Number.Uint64(), + }) +} + +// HealthCheck is the endpoints for probes. +// +// @Summary Get current server health status +// @ID health-check +// @Accept json +// @Produce json +// @Success 200 {object} string +// @Router /healthz [get] +func (s *SoftBlockAPIServer) HealthCheck(c echo.Context) error { + return c.NoContent(http.StatusOK) +} + +// returnError is a helper function to return an error response. +func (s *SoftBlockAPIServer) returnError(c echo.Context, statusCode int, err error) error { + return c.JSON(statusCode, map[string]string{"error": err.Error()}) +} diff --git a/packages/taiko-client/driver/soft_blocks/server.go b/packages/taiko-client/driver/soft_blocks/server.go new file mode 100644 index 00000000000..e27cac912fd --- /dev/null +++ b/packages/taiko-client/driver/soft_blocks/server.go @@ -0,0 +1,130 @@ +package softblocks + +import ( + "context" + "fmt" + "os" + + "github.com/ethereum/go-ethereum/core/types" + echojwt "github.com/labstack/echo-jwt/v4" + "github.com/labstack/echo/v4" + "github.com/labstack/echo/v4/middleware" + + txListDecompressor "github.com/taikoxyz/taiko-mono/packages/taiko-client/driver/txlist_decompressor" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/rpc" +) + +// softBlockChainSyncer is an interface for soft block chain syncer. +type softBlockChainSyncer interface { + InsertSoftBlockFromTransactionsBatch( + ctx context.Context, + blockID uint64, + batchID uint64, + txListBytes []byte, + batchMarker TransactionBatchMarker, + softBlockParams *SoftBlockParams, + ) (*types.Header, error) + RemoveSoftBlocks(ctx context.Context, newLastBlockID uint64) error +} + +// @title Taiko Soft Block Server API +// @version 1.0 +// @termsOfService http://swagger.io/terms/ + +// @contact.name API Support +// @contact.url https://community.taiko.xyz/ +// @contact.email info@taiko.xyz + +// @license.name MIT +// @license.url https://github.com/taikoxyz/taiko-mono/blob/main/LICENSE.md +// SoftBlockAPIServer represents a soft blcok server instance. +type SoftBlockAPIServer struct { + echo *echo.Echo + chainSyncer softBlockChainSyncer + rpc *rpc.Client + txListDecompressor *txListDecompressor.TxListDecompressor + checkSig bool +} + +// New creates a new soft blcok server instance, and starts the server. +func New( + cors string, + jwtSecret []byte, + chainSyncer softBlockChainSyncer, + cli *rpc.Client, + checkSig bool, +) (*SoftBlockAPIServer, error) { + protocolConfigs, err := rpc.GetProtocolConfigs(cli.TaikoL1, nil) + if err != nil { + return nil, fmt.Errorf("failed to fetch protocol configs: %w", err) + } + + server := &SoftBlockAPIServer{ + echo: echo.New(), + chainSyncer: chainSyncer, + txListDecompressor: txListDecompressor.NewTxListDecompressor( + uint64(protocolConfigs.BlockMaxGasLimit), + rpc.BlockMaxTxListBytes, + cli.L2.ChainID, + ), + rpc: cli, + checkSig: checkSig, + } + + server.echo.HideBanner = true + server.configureMiddleware([]string{cors}) + server.configureRoutes() + if jwtSecret != nil { + server.echo.Use(echojwt.JWT(jwtSecret)) + } + + return server, nil +} + +// LogSkipper implements the `middleware.Skipper` interface. +func LogSkipper(c echo.Context) bool { + switch c.Request().URL.Path { + case "/healthz": + return true + default: + return true + } +} + +// configureMiddleware configures the server middlewares. +func (s *SoftBlockAPIServer) configureMiddleware(corsOrigins []string) { + s.echo.Use(middleware.RequestID()) + + s.echo.Use(middleware.LoggerWithConfig(middleware.LoggerConfig{ + Skipper: LogSkipper, + Format: `{"time":"${time_rfc3339_nano}","level":"INFO","message":{"id":"${id}","remote_ip":"${remote_ip}",` + + `"host":"${host}","method":"${method}","uri":"${uri}","user_agent":"${user_agent}",` + + `"response_status":${status},"error":"${error}","latency":${latency},"latency_human":"${latency_human}",` + + `"bytes_in":${bytes_in},"bytes_out":${bytes_out}}}` + "\n", + Output: os.Stdout, + })) + + // Add CORS middleware + s.echo.Use(middleware.CORSWithConfig(middleware.CORSConfig{ + AllowOrigins: corsOrigins, + AllowCredentials: true, + })) +} + +// Start starts the HTTP server. +func (s *SoftBlockAPIServer) Start(port uint64) error { + return s.echo.Start(fmt.Sprintf(":%v", port)) +} + +// Shutdown shuts down the HTTP server. +func (s *SoftBlockAPIServer) Shutdown(ctx context.Context) error { + return s.echo.Shutdown(ctx) +} + +// configureRoutes contains all routes which will be used by prover server. +func (s *SoftBlockAPIServer) configureRoutes() { + s.echo.GET("/", s.HealthCheck) + s.echo.GET("/healthz", s.HealthCheck) + s.echo.POST("/softBlocks", s.BuildSoftBlock) + s.echo.DELETE("/softBlocks", s.RemoveSoftBlocks) +} diff --git a/packages/taiko-client/driver/soft_blocks/server_test.go b/packages/taiko-client/driver/soft_blocks/server_test.go new file mode 100644 index 00000000000..c1aa66d1777 --- /dev/null +++ b/packages/taiko-client/driver/soft_blocks/server_test.go @@ -0,0 +1,36 @@ +package softblocks + +import ( + "context" + "testing" + + "github.com/ethereum/go-ethereum/log" + "github.com/stretchr/testify/suite" + + "github.com/taikoxyz/taiko-mono/packages/taiko-client/internal/testutils" +) + +type SoftBlockAPIServerTestSuite struct { + testutils.ClientTestSuite + s *SoftBlockAPIServer +} + +func (s *SoftBlockAPIServerTestSuite) SetupTest() { + s.ClientTestSuite.SetupTest() + server, err := New("*", nil, nil, s.RPCClient, true) + s.Nil(err) + s.s = server + go func() { + s.NotPanics(func() { + log.Error("Start test soft block server", "error", s.s.Start(uint64(testutils.RandomPort()))) + }) + }() +} + +func (s *SoftBlockAPIServerTestSuite) TestShutdown() { + s.Nil(s.s.Shutdown(context.Background())) +} + +func TestSoftBlockAPIServerTestSuite(t *testing.T) { + suite.Run(t, new(SoftBlockAPIServerTestSuite)) +} diff --git a/packages/taiko-client/driver/state/l1_current.go b/packages/taiko-client/driver/state/l1_current.go index 425ec1556d1..01f038387d4 100644 --- a/packages/taiko-client/driver/state/l1_current.go +++ b/packages/taiko-client/driver/state/l1_current.go @@ -5,6 +5,8 @@ import ( "errors" "math/big" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings" + "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/log" @@ -45,7 +47,15 @@ func (s *State) ResetL1Current(ctx context.Context, blockID *big.Int) error { } // Fetch the block info from TaikoL1 contract, and set the L1 height. - blockInfo, err := s.rpc.GetL2BlockInfo(ctx, blockID) + var ( + blockInfo bindings.TaikoDataBlockV2 + err error + ) + if s.IsOnTake(blockID) { + blockInfo, err = s.rpc.GetL2BlockInfoV2(ctx, blockID) + } else { + blockInfo, err = s.rpc.GetL2BlockInfo(ctx, blockID) + } if err != nil { return err } diff --git a/packages/taiko-client/driver/state/state.go b/packages/taiko-client/driver/state/state.go index 52b818d6029..bae8c311cf7 100644 --- a/packages/taiko-client/driver/state/state.go +++ b/packages/taiko-client/driver/state/state.go @@ -28,7 +28,8 @@ type State struct { l1Current atomic.Value // Current L1 block sync cursor // Constants - GenesisL1Height *big.Int + GenesisL1Height *big.Int + OnTakeForkHeight *big.Int // RPC clients rpc *rpc.Client @@ -61,8 +62,16 @@ func (s *State) init(ctx context.Context) error { return err } - log.Info("Genesis L1 height", "height", stateVars.A.GenesisHeight) + protocolConfigs, err := rpc.GetProtocolConfigs(s.rpc.TaikoL1, &bind.CallOpts{Context: ctx}) + if err != nil { + return err + } + s.GenesisL1Height = new(big.Int).SetUint64(stateVars.A.GenesisHeight) + s.OnTakeForkHeight = new(big.Int).SetUint64(protocolConfigs.OntakeForkHeight) + + log.Info("Genesis L1 height", "height", stateVars.A.GenesisHeight) + log.Info("OnTake fork height", "blockID", s.OnTakeForkHeight) // Set the L2 head's latest known L1 origin as current L1 sync cursor. latestL2KnownL1Header, err := s.rpc.LatestL2KnownL1Header(ctx) @@ -84,7 +93,7 @@ func (s *State) init(ctx context.Context) error { return err } - log.Info("L2 execution engine head", "height", l2Head.Number, "hash", l2Head.Hash()) + log.Info("L2 execution engine head", "blockID", l2Head.Number, "hash", l2Head.Hash()) s.setL2Head(l2Head) s.setHeadBlockID(new(big.Int).SetUint64(stateVars.B.NumBlocks - 1)) @@ -99,18 +108,24 @@ func (s *State) eventLoop(ctx context.Context) { var ( // Channels for subscriptions. - l1HeadCh = make(chan *types.Header, 10) - l2HeadCh = make(chan *types.Header, 10) - blockProposedCh = make(chan *bindings.TaikoL1ClientBlockProposed, 10) - transitionProvedCh = make(chan *bindings.TaikoL1ClientTransitionProved, 10) - blockVerifiedCh = make(chan *bindings.TaikoL1ClientBlockVerified, 10) + l1HeadCh = make(chan *types.Header, 10) + l2HeadCh = make(chan *types.Header, 10) + blockProposedCh = make(chan *bindings.TaikoL1ClientBlockProposed, 10) + transitionProvedCh = make(chan *bindings.TaikoL1ClientTransitionProved, 10) + blockVerifiedCh = make(chan *bindings.TaikoL1ClientBlockVerified, 10) + blockProposedV2Ch = make(chan *bindings.TaikoL1ClientBlockProposedV2, 10) + transitionProvedV2Ch = make(chan *bindings.TaikoL1ClientTransitionProvedV2, 10) + blockVerifiedV2Ch = make(chan *bindings.TaikoL1ClientBlockVerifiedV2, 10) // Subscriptions. - l1HeadSub = rpc.SubscribeChainHead(s.rpc.L1, l1HeadCh) - l2HeadSub = rpc.SubscribeChainHead(s.rpc.L2, l2HeadCh) - l2BlockVerifiedSub = rpc.SubscribeBlockVerified(s.rpc.TaikoL1, blockVerifiedCh) - l2BlockProposedSub = rpc.SubscribeBlockProposed(s.rpc.TaikoL1, blockProposedCh) - l2TransitionProvedSub = rpc.SubscribeTransitionProved(s.rpc.TaikoL1, transitionProvedCh) + l1HeadSub = rpc.SubscribeChainHead(s.rpc.L1, l1HeadCh) + l2HeadSub = rpc.SubscribeChainHead(s.rpc.L2, l2HeadCh) + l2BlockVerifiedSub = rpc.SubscribeBlockVerified(s.rpc.TaikoL1, blockVerifiedCh) + l2BlockProposedSub = rpc.SubscribeBlockProposed(s.rpc.TaikoL1, blockProposedCh) + l2TransitionProvedSub = rpc.SubscribeTransitionProved(s.rpc.TaikoL1, transitionProvedCh) + l2BlockVerifiedV2Sub = rpc.SubscribeBlockVerifiedV2(s.rpc.TaikoL1, blockVerifiedV2Ch) + l2BlockProposedV2Sub = rpc.SubscribeBlockProposedV2(s.rpc.TaikoL1, blockProposedV2Ch) + l2TransitionProvedV2Sub = rpc.SubscribeTransitionProvedV2(s.rpc.TaikoL1, transitionProvedV2Ch) ) defer func() { @@ -119,6 +134,9 @@ func (s *State) eventLoop(ctx context.Context) { l2BlockVerifiedSub.Unsubscribe() l2BlockProposedSub.Unsubscribe() l2TransitionProvedSub.Unsubscribe() + l2BlockVerifiedV2Sub.Unsubscribe() + l2BlockProposedV2Sub.Unsubscribe() + l2TransitionProvedV2Sub.Unsubscribe() }() for { @@ -127,6 +145,8 @@ func (s *State) eventLoop(ctx context.Context) { return case e := <-blockProposedCh: s.setHeadBlockID(e.BlockId) + case e := <-blockProposedV2Ch: + s.setHeadBlockID(e.BlockId) case e := <-transitionProvedCh: log.Info( "✅ Transition proven", @@ -136,6 +156,15 @@ func (s *State) eventLoop(ctx context.Context) { "stateRoot", common.Hash(e.Tran.StateRoot), "prover", e.Prover, ) + case e := <-transitionProvedV2Ch: + log.Info( + "✅ Transition proven", + "blockID", e.BlockId, + "parentHash", common.Hash(e.Tran.ParentHash), + "hash", common.Hash(e.Tran.BlockHash), + "stateRoot", common.Hash(e.Tran.StateRoot), + "prover", e.Prover, + ) case e := <-blockVerifiedCh: log.Info( "📈 Block verified", @@ -144,6 +173,13 @@ func (s *State) eventLoop(ctx context.Context) { "stateRoot", common.Hash(e.StateRoot), "prover", e.Prover, ) + case e := <-blockVerifiedV2Ch: + log.Info( + "📈 Block verified", + "blockID", e.BlockId, + "hash", common.Hash(e.BlockHash), + "prover", e.Prover, + ) case newHead := <-l1HeadCh: s.setL1Head(newHead) s.l1HeadsFeed.Send(newHead) @@ -178,7 +214,7 @@ func (s *State) setL2Head(l2Head *types.Header) { return } - log.Trace("New L2 head", "height", l2Head.Number, "hash", l2Head.Hash(), "timestamp", l2Head.Time) + log.Trace("New L2 head", "blockID", l2Head.Number, "hash", l2Head.Hash(), "timestamp", l2Head.Time) metrics.DriverL2HeadHeightGauge.Set(float64(l2Head.Number.Uint64())) s.l2Head.Store(l2Head) @@ -205,3 +241,11 @@ func (s *State) GetHeadBlockID() *big.Int { func (s *State) SubL1HeadsFeed(ch chan *types.Header) event.Subscription { return s.l1HeadsFeed.Subscribe(ch) } + +// IsOnTake returns whether num is either equal to the ontake block or greater. +func (s *State) IsOnTake(num *big.Int) bool { + if s.OnTakeForkHeight == nil || num == nil { + return false + } + return s.OnTakeForkHeight.Cmp(num) <= 0 +} diff --git a/packages/taiko-client/driver/state/state_test.go b/packages/taiko-client/driver/state/state_test.go index f7ac90f2243..a54a726ab39 100644 --- a/packages/taiko-client/driver/state/state_test.go +++ b/packages/taiko-client/driver/state/state_test.go @@ -9,7 +9,7 @@ import ( "github.com/stretchr/testify/suite" "github.com/taikoxyz/taiko-mono/packages/taiko-client/internal/testutils" - "github.com/taikoxyz/taiko-mono/packages/taiko-client/internal/utils" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/utils" ) type DriverStateTestSuite struct { diff --git a/packages/taiko-client/driver/txlist_decompressor/txlist_decompressor.go b/packages/taiko-client/driver/txlist_decompressor/txlist_decompressor.go index 80f6e553b2d..cbb6f795ec3 100644 --- a/packages/taiko-client/driver/txlist_decompressor/txlist_decompressor.go +++ b/packages/taiko-client/driver/txlist_decompressor/txlist_decompressor.go @@ -5,9 +5,10 @@ import ( "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/params" "github.com/ethereum/go-ethereum/rlp" - "github.com/taikoxyz/taiko-mono/packages/taiko-client/internal/utils" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/utils" ) // TxListDecompressor is responsible for validating and decompressing @@ -39,6 +40,20 @@ func NewTxListDecompressor( // less than or equal to maxBytesPerTxList. // 2. The transaction list bytes must be able to be RLP decoded into a list of transactions. func (v *TxListDecompressor) TryDecompress( + chainID *big.Int, + blockID *big.Int, + txListBytes []byte, + blobUsed bool, +) []byte { + if chainID.Cmp(params.HeklaNetworkID) == 0 { + return v.tryDecompressHekla(blockID, txListBytes, blobUsed) + } + + return v.tryDecompress(blockID, txListBytes, blobUsed) +} + +// tryDecompress is the inner implementation of TryDecompress. +func (v *TxListDecompressor) tryDecompress( blockID *big.Int, txListBytes []byte, blobUsed bool, @@ -72,6 +87,47 @@ func (v *TxListDecompressor) TryDecompress( return []byte{} } + log.Info("Transaction list is valid", "blockID", blockID, "txs", len(txs)) + return txListBytes +} + +// TryDecompressHekla is the same as tryDecompress, but it's used for Hekla network with +// an incorrect legacy bytes size check. +// ref: https://github.com/taikoxyz/taiko-client/pull/783 +func (v *TxListDecompressor) tryDecompressHekla( + blockID *big.Int, + txListBytes []byte, + blobUsed bool, +) []byte { + // If the transaction list is empty, it's valid. + if len(txListBytes) == 0 { + return []byte{} + } + + var ( + txs types.Transactions + err error + ) + + // Decompress the transaction list bytes. + if txListBytes, err = utils.Decompress(txListBytes); err != nil { + log.Info("Failed to decompress tx list bytes", "blockID", blockID, "error", err) + return []byte{} + } + + // If calldata is used, the compressed bytes of the transaction list must be + // less than or equal to maxBytesPerTxList. + if !blobUsed && (len(txListBytes) > int(v.maxBytesPerTxList)) { + log.Info("Compressed transactions list binary too large", "length", len(txListBytes), "blockID", blockID) + return []byte{} + } + + // Try to RLP decode the transaction list bytes. + if err = rlp.DecodeBytes(txListBytes, &txs); err != nil { + log.Info("Failed to decode transactions list bytes", "blockID", blockID, "error", err) + return []byte{} + } + log.Info("Transaction list is valid", "blockID", blockID) return txListBytes } diff --git a/packages/taiko-client/driver/txlist_decompressor/txlist_decompressor_test.go b/packages/taiko-client/driver/txlist_decompressor/txlist_decompressor_test.go index 980e866bb24..4888dd48bce 100644 --- a/packages/taiko-client/driver/txlist_decompressor/txlist_decompressor_test.go +++ b/packages/taiko-client/driver/txlist_decompressor/txlist_decompressor_test.go @@ -14,8 +14,8 @@ import ( "github.com/stretchr/testify/suite" "github.com/taikoxyz/taiko-mono/packages/taiko-client/internal/testutils" - "github.com/taikoxyz/taiko-mono/packages/taiko-client/internal/utils" "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/rpc" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/utils" ) var ( @@ -39,12 +39,12 @@ func (s *TxListDecompressorTestSuite) SetupTest() { } func (s *TxListDecompressorTestSuite) TestZeroBytes() { - s.Empty(s.d.TryDecompress(chainID, []byte{}, false)) + s.Empty(s.d.TryDecompress(chainID, common.Big1, []byte{}, false)) } func (s *TxListDecompressorTestSuite) TestCalldataSize() { - s.Empty(s.d.TryDecompress(chainID, randBytes(rpc.BlockMaxTxListBytes+1), false)) - s.Empty(s.d.TryDecompress(chainID, randBytes(rpc.BlockMaxTxListBytes-1), false)) + s.Empty(s.d.TryDecompress(chainID, common.Big1, randBytes(rpc.BlockMaxTxListBytes+1), false)) + s.Empty(s.d.TryDecompress(chainID, common.Big1, randBytes(rpc.BlockMaxTxListBytes-1), false)) } func (s *TxListDecompressorTestSuite) TestValidTxList() { @@ -53,21 +53,21 @@ func (s *TxListDecompressorTestSuite) TestValidTxList() { decompressed, err := utils.Decompress(compressed) s.Nil(err) - s.Equal(s.d.TryDecompress(chainID, compressed, true), decompressed) - s.Equal(s.d.TryDecompress(chainID, compressed, false), decompressed) + s.Equal(s.d.TryDecompress(chainID, common.Big1, compressed, true), decompressed) + s.Equal(s.d.TryDecompress(chainID, common.Big1, compressed, false), decompressed) } func (s *TxListDecompressorTestSuite) TestInvalidTxList() { compressed, err := utils.Compress(randBytes(1024)) s.Nil(err) - s.Zero(len(s.d.TryDecompress(chainID, compressed, true))) - s.Zero(len(s.d.TryDecompress(chainID, compressed, false))) + s.Zero(len(s.d.TryDecompress(chainID, common.Big1, compressed, true))) + s.Zero(len(s.d.TryDecompress(chainID, common.Big1, compressed, false))) } func (s *TxListDecompressorTestSuite) TestInvalidZlibBytes() { - s.Zero(len(s.d.TryDecompress(chainID, randBytes(1024), true))) - s.Zero(len(s.d.TryDecompress(chainID, randBytes(1024), false))) + s.Zero(len(s.d.TryDecompress(chainID, common.Big1, randBytes(1024), true))) + s.Zero(len(s.d.TryDecompress(chainID, common.Big1, randBytes(1024), false))) } func TestDriverTestSuite(t *testing.T) { @@ -80,7 +80,6 @@ func rlpEncodedTransactionBytes(l int, signed bool) []byte { var tx *types.Transaction if signed { txData := &types.LegacyTx{Nonce: 1, To: &testAddr, GasPrice: common.Big256, Value: common.Big1, Gas: 10} - tx = types.MustSignNewTx(testKey, types.LatestSigner(¶ms.ChainConfig{ChainID: chainID}), txData) } else { tx = types.NewTransaction(1, testAddr, common.Big1, 10, new(big.Int).SetUint64(10*params.GWei), nil) diff --git a/packages/taiko-client/driver/txlist_fetcher/blob.go b/packages/taiko-client/driver/txlist_fetcher/blob.go index ecabd59b6ca..922e1975b86 100644 --- a/packages/taiko-client/driver/txlist_fetcher/blob.go +++ b/packages/taiko-client/driver/txlist_fetcher/blob.go @@ -10,15 +10,15 @@ import ( "github.com/ethereum/go-ethereum/crypto/kzg4844" "github.com/ethereum/go-ethereum/log" - "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/metadata" "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg" "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/rpc" ) // BlobFetcher is responsible for fetching the txList blob from the L1 block sidecar. type BlobFetcher struct { - l1Beacon *rpc.BeaconClient - ds *rpc.BlobDataSource + l1Beacon *rpc.BeaconClient + dataSource *rpc.BlobDataSource } // NewBlobTxListFetcher creates a new BlobFetcher instance based on the given rpc client. @@ -30,19 +30,19 @@ func NewBlobTxListFetcher(l1Beacon *rpc.BeaconClient, ds *rpc.BlobDataSource) *B func (d *BlobFetcher) Fetch( ctx context.Context, _ *types.Transaction, - meta *bindings.TaikoDataBlockMetadata, + meta metadata.TaikoBlockMetaData, ) ([]byte, error) { - if !meta.BlobUsed { + if !meta.GetBlobUsed() { return nil, pkg.ErrBlobUsed } // Fetch the L1 block sidecars. - sidecars, err := d.ds.GetBlobs(ctx, meta) + sidecars, err := d.dataSource.GetBlobs(ctx, meta.GetProposedAt(), meta.GetBlobHash()) if err != nil { return nil, err } - log.Info("Fetch sidecars", "blockNumber", meta.L1Height+1, "sidecars", len(sidecars)) + log.Info("Fetch sidecars", "blockNumber", meta.GetRawBlockHeight(), "sidecars", len(sidecars)) // Compare the blob hash with the sidecar's kzg commitment. for i, sidecar := range sidecars { @@ -50,16 +50,21 @@ func (d *BlobFetcher) Fetch( "Block sidecar", "index", i, "KzgCommitment", sidecar.KzgCommitment, - "blobHash", common.Bytes2Hex(meta.BlobHash[:]), + "blobHash", meta.GetBlobHash(), ) commitment := kzg4844.Commitment(common.FromHex(sidecar.KzgCommitment)) - if kzg4844.CalcBlobHashV1( - sha256.New(), - &commitment, - ) == common.BytesToHash(meta.BlobHash[:]) { + if kzg4844.CalcBlobHashV1(sha256.New(), &commitment) == meta.GetBlobHash() { blob := eth.Blob(common.FromHex(sidecar.Blob)) - return blob.ToData() + bytes, err := blob.ToData() + if err != nil { + return nil, err + } + + if meta.GetBlobTxListLength() == 0 { + return bytes[meta.GetBlobTxListOffset():], nil + } + return bytes[meta.GetBlobTxListOffset() : meta.GetBlobTxListOffset()+meta.GetBlobTxListLength()], nil } } diff --git a/packages/taiko-client/driver/txlist_fetcher/calldata.go b/packages/taiko-client/driver/txlist_fetcher/calldata.go index 4cd7f4c6619..7beee95e99b 100644 --- a/packages/taiko-client/driver/txlist_fetcher/calldata.go +++ b/packages/taiko-client/driver/txlist_fetcher/calldata.go @@ -2,26 +2,55 @@ package txlistdecoder import ( "context" + "fmt" + "math/big" + "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/core/types" - "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings" "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/encoding" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/metadata" "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/rpc" ) // CalldataFetcher is responsible for fetching the txList bytes from the transaction's calldata. -type CalldataFetcher struct{} +type CalldataFetcher struct { + rpc *rpc.Client +} + +// NewCalldataFetch creates a new CalldataFetcher instance based on the given rpc client. +func NewCalldataFetch(rpc *rpc.Client) *CalldataFetcher { + return &CalldataFetcher{rpc: rpc} +} -// NewCalldataTxListFetcher creates a new CalldataFetcher instance. +// Fetch fetches the txList bytes from the transaction's calldata. func (d *CalldataFetcher) Fetch( - _ context.Context, + ctx context.Context, tx *types.Transaction, - meta *bindings.TaikoDataBlockMetadata, + meta metadata.TaikoBlockMetaData, ) ([]byte, error) { - if meta.BlobUsed { + if meta.GetBlobUsed() { return nil, pkg.ErrBlobUsed } - return encoding.UnpackTxListBytes(tx.Data()) + // If the given L2 block is not an ontake block, decode the txlist from calldata directly. + if !meta.IsOntakeBlock() { + return encoding.UnpackTxListBytes(tx.Data()) + } + + // Otherwise, fetch the txlist data from the `CalldataTxList` event. + end := meta.GetRawBlockHeight().Uint64() + iter, err := d.rpc.TaikoL1.FilterCalldataTxList( + &bind.FilterOpts{Context: ctx, Start: meta.GetRawBlockHeight().Uint64(), End: &end}, + []*big.Int{meta.GetBlockID()}, + ) + if err != nil { + return nil, err + } + for iter.Next() { + return iter.Event.TxList, nil + } + + return nil, fmt.Errorf("calldata for block %d not found", meta.GetBlockID()) } diff --git a/packages/taiko-client/driver/txlist_fetcher/interface.go b/packages/taiko-client/driver/txlist_fetcher/interface.go index 7d412ec8806..7a6250b2f89 100644 --- a/packages/taiko-client/driver/txlist_fetcher/interface.go +++ b/packages/taiko-client/driver/txlist_fetcher/interface.go @@ -5,10 +5,10 @@ import ( "github.com/ethereum/go-ethereum/core/types" - "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/metadata" ) // TxListFetcher is responsible for fetching the L2 txList bytes from L1 type TxListFetcher interface { - Fetch(ctx context.Context, tx *types.Transaction, meta *bindings.TaikoDataBlockMetadata) ([]byte, error) + Fetch(ctx context.Context, tx *types.Transaction, meta metadata.TaikoBlockMetaData) ([]byte, error) } diff --git a/packages/taiko-client/integration_test/README.md b/packages/taiko-client/integration_test/README.md index 056dbacf88d..2e3d99cb137 100644 --- a/packages/taiko-client/integration_test/README.md +++ b/packages/taiko-client/integration_test/README.md @@ -1,4 +1,8 @@ # How to debug test cases? +- set up config +``` +export L2_NODE=l2_geth +``` - start docker compose diff --git a/packages/taiko-client/integration_test/deploy_l1_contract.sh b/packages/taiko-client/integration_test/deploy_l1_contract.sh index 71e635df468..f900d106b1c 100755 --- a/packages/taiko-client/integration_test/deploy_l1_contract.sh +++ b/packages/taiko-client/integration_test/deploy_l1_contract.sh @@ -6,12 +6,12 @@ source scripts/common.sh source integration_test/l1_env.sh cd ../protocol && - forge script script/DeployOnL1.s.sol:DeployOnL1 \ - --fork-url "$L1_NODE_HTTP_ENDPOINT" \ + forge script script/layer1/DeployProtocolOnL1.s.sol:DeployProtocolOnL1 \ + --fork-url "$L1_HTTP" \ --broadcast \ --ffi \ -vvvvv \ --evm-version cancun \ --private-key "$PRIVATE_KEY" \ - --block-gas-limit 100000000 \ + --block-gas-limit 200000000 \ --legacy diff --git a/packages/taiko-client/integration_test/entrypoint.sh b/packages/taiko-client/integration_test/entrypoint.sh index 01789d508ef..e782405e73a 100755 --- a/packages/taiko-client/integration_test/entrypoint.sh +++ b/packages/taiko-client/integration_test/entrypoint.sh @@ -21,19 +21,17 @@ integration_test/deploy_l1_contract.sh source integration_test/test_env.sh # make sure environment variables are set -check_env "L1_NODE_HTTP_ENDPOINT" -check_env "L1_NODE_WS_ENDPOINT" -check_env "L2_EXECUTION_ENGINE_HTTP_ENDPOINT" -check_env "L2_EXECUTION_ENGINE_WS_ENDPOINT" -check_env "L2_EXECUTION_ENGINE_AUTH_ENDPOINT" -check_env "TAIKO_L1_ADDRESS" -check_env "TAIKO_L2_ADDRESS" -check_env "TAIKO_TOKEN_ADDRESS" -check_env "ASSIGNMENT_HOOK_ADDRESS" +check_env "L1_HTTP" +check_env "L1_WS" +check_env "L2_HTTP" +check_env "L2_WS" +check_env "L2_AUTH" +check_env "TAIKO_L1" +check_env "TAIKO_L2" +check_env "TAIKO_TOKEN" check_env "TIMELOCK_CONTROLLER" -check_env "ROLLUP_ADDRESS_MANAGER_CONTRACT_ADDRESS" -check_env "GUARDIAN_PROVER_CONTRACT_ADDRESS" -check_env "GUARDIAN_PROVER_MINORITY_ADDRESS" +check_env "GUARDIAN_PROVER_CONTRACT" +check_env "GUARDIAN_PROVER_MINORITY" check_env "L1_CONTRACT_OWNER_PRIVATE_KEY" check_env "L1_SECURITY_COUNCIL_PRIVATE_KEY" check_env "L1_PROPOSER_PRIVATE_KEY" @@ -48,6 +46,7 @@ PACKAGE=${PACKAGE:-...} # limiting tests to blob syncer for now if [ "$RUN_TESTS" == "true" ]; then go test -v -p=1 ./driver/chain_syncer/blob -run '^TestBlobSyncerTestSuite$' + go test -v -p=1 ./driver -run '^TestDriverTestSuite$' # ./"$PACKAGE" -coverprofile=coverage.out -covermode=atomic -timeout=700s else echo "💻 Local dev net started" diff --git a/packages/taiko-client/integration_test/hive_test.go b/packages/taiko-client/integration_test/hive_test.go new file mode 100644 index 00000000000..8e6a3a07cc0 --- /dev/null +++ b/packages/taiko-client/integration_test/hive_test.go @@ -0,0 +1,127 @@ +package integration_test + +import ( + "context" + "fmt" + "os" + "testing" + + "github.com/ethereum/hive/hivesim" + "github.com/stretchr/testify/assert" +) + +func TestHiveHandler(t *testing.T) { + baseDir := os.Getenv("HIVE_DIR") + if baseDir == "" { + t.SkipNow() + } + + clientGroups := [][]string{ + { + "anvil", + "taiko/taiko-geth", + "taiko/driver", + "taiko/proposer", + "taiko/prover", + }, + { + "taiko/taiko-geth", + "taiko/driver", + }, + { + "taiko/taiko-geth", + "taiko/driver", + }, + } + + // Multi clusters full sync and snap sync tests. + t.Run(fmt.Sprintf("taiko-genesis/l2-snap-sync/clusters(%d)", len(clientGroups)), func(t *testing.T) { + testDenebGenesis(t, "taiko-genesis/l2-snap-sync", clientGroups) + }) + t.Run(fmt.Sprintf("taiko-genesis/l2-full-sync/clusters(%d)", len(clientGroups)), func(t *testing.T) { + testDenebGenesis(t, "taiko-genesis/l2-full-sync", clientGroups) + }) + + // Multi clusters reorg test. + t.Run("taiko-reorg/taiko-reorg", func(t *testing.T) { + testDenebReorg(t, "taiko-reorg/taiko-reorg", [][]string{clientGroups[0]}) + }) + + t.Run("taiko-blob/blob-server", func(t *testing.T) { + testBlobAPI(t, "taiko-blob/blob-server", []string{ + "geth", + "prysm/prysm-bn", + "prysm/prysm-vc", + "taiko/taiko-geth", + "taiko/driver", + "taiko/proposer", + "taiko/prover", + "storage/redis", + "storage/postgres", + "blobscan/blobscan-api", + "blobscan/blobscan-indexer", + }) + }) + + t.Run("taiko-blob/blob-l1-beacon", func(t *testing.T) { + testBlobAPI(t, "taiko-blob/blob-l1-beacon", []string{ + "geth", + "prysm/prysm-bn", + "prysm/prysm-vc", + "taiko/taiko-geth", + "taiko/driver", + "taiko/proposer", + "taiko/prover", + }) + }) +} + +func testBlobAPI(t *testing.T, pattern string, clients []string) { + handler, err := hivesim.NewHiveFramework(&hivesim.HiveConfig{ + BuildOutput: false, + ContainerOutput: true, + DockerPull: false, + BaseDir: os.Getenv("HIVE_DIR"), + SimPattern: "taiko", + SimTestPattern: pattern, + ClientGroups: [][]string{clients}, + }) + assert.NoError(t, err) + + failedCount, err := handler.Run(context.Background()) + assert.NoError(t, err) + assert.Equal(t, 0, failedCount) +} + +func testDenebGenesis(t *testing.T, simPattern string, clientGroups [][]string) { + handler, err := hivesim.NewHiveFramework(&hivesim.HiveConfig{ + BuildOutput: false, + ContainerOutput: true, + DockerPull: true, + BaseDir: os.Getenv("HIVE_DIR"), + SimPattern: "taiko", + SimTestPattern: simPattern, + ClientGroups: clientGroups, + }) + assert.NoError(t, err) + + failedCount, err := handler.Run(context.Background()) + assert.NoError(t, err) + assert.Equal(t, 0, failedCount) +} + +func testDenebReorg(t *testing.T, simPattern string, clientGroups [][]string) { + handler, err := hivesim.NewHiveFramework(&hivesim.HiveConfig{ + BuildOutput: false, + ContainerOutput: true, + BaseDir: os.Getenv("HIVE_DIR"), + SimPattern: "taiko", + SimTestPattern: simPattern, + ClientGroups: clientGroups, + }) + assert.NoError(t, err) + + failedCount, err := handler.Run(context.Background()) + assert.NoError(t, err) + assert.Equal(t, 0, failedCount) +} diff --git a/packages/taiko-client/integration_test/l1_env.sh b/packages/taiko-client/integration_test/l1_env.sh index 6fefaef7d11..7bde57f70aa 100755 --- a/packages/taiko-client/integration_test/l1_env.sh +++ b/packages/taiko-client/integration_test/l1_env.sh @@ -10,15 +10,15 @@ export PROVER_SET_ADMIN=0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266 export TAIKO_TOKEN_PREMINT_RECIPIENT=0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266 export TAIKO_TOKEN_NAME="Taiko Token Test" export TAIKO_TOKEN_SYMBOL="TTKOt" -export TIER_PROVIDER="devnet" +export TIER_ROUTER="devnet" export PAUSE_TAIKO_L1="false" export PAUSE_BRIDGE="false" export TAIKO_TOKEN=0x0000000000000000000000000000000000000000 export SHARED_ADDRESS_MANAGER=0x0000000000000000000000000000000000000000 export PROPOSER=0x0000000000000000000000000000000000000000 export PROPOSER_ONE=0x0000000000000000000000000000000000000000 -export NUM_MIN_MAJORITY_GUARDIANS=7 -export NUM_MIN_MINORITY_GUARDIANS=2 +export NUM_MIN_MAJORITY_GUARDIANS=6 +export NUM_MIN_MINORITY_GUARDIANS=1 GUARDIAN_PROVERS_ADDRESSES_LIST=( "0x70997970C51812dc3A010C7d01b50e0d17dc79C8" @@ -40,6 +40,6 @@ export L2_GENESIS_HASH=$( -X POST \ -H "Content-Type: application/json" \ -d '{"jsonrpc":"2.0","id":0,"method":"eth_getBlockByNumber","params":["0x0", false]}' \ - $L2_EXECUTION_ENGINE_HTTP_ENDPOINT | jq .result.hash | sed 's/\"//g' + $L2_HTTP | jq .result.hash | sed 's/\"//g' ) echo "L2_GENESIS_HASH: $L2_GENESIS_HASH" diff --git a/packages/taiko-client/integration_test/test_env.sh b/packages/taiko-client/integration_test/test_env.sh index 0ce1b01f547..8976d49b8cb 100755 --- a/packages/taiko-client/integration_test/test_env.sh +++ b/packages/taiko-client/integration_test/test_env.sh @@ -5,41 +5,35 @@ source scripts/common.sh # get deployed contract address. DEPLOYMENT_JSON=$(cat ../protocol/deployments/deploy_l1.json) -export TAIKO_L1_ADDRESS=$(echo "$DEPLOYMENT_JSON" | jq '.taiko' | sed 's/\"//g') -export TAIKO_L2_ADDRESS=0x1670010000000000000000000000000000010001 -export TAIKO_TOKEN_ADDRESS=$(echo "$DEPLOYMENT_JSON" | jq '.taiko_token' | sed 's/\"//g') -export ASSIGNMENT_HOOK_ADDRESS=$(echo "$DEPLOYMENT_JSON" | jq '.assignment_hook' | sed 's/\"//g') +export TAIKO_L1=$(echo "$DEPLOYMENT_JSON" | jq '.taiko' | sed 's/\"//g') +export TAIKO_L2=0x1670010000000000000000000000000000010001 +export TAIKO_TOKEN=$(echo "$DEPLOYMENT_JSON" | jq '.taiko_token' | sed 's/\"//g') export TIMELOCK_CONTROLLER=$(echo "$DEPLOYMENT_JSON" | jq '.timelock_controller' | sed 's/\"//g') -export ROLLUP_ADDRESS_MANAGER_CONTRACT_ADDRESS=$(echo "$DEPLOYMENT_JSON" | jq '.rollup_address_manager' | sed 's/\"//g') -export GUARDIAN_PROVER_CONTRACT_ADDRESS=$(echo "$DEPLOYMENT_JSON" | jq '.guardian_prover' | sed 's/\"//g') -export GUARDIAN_PROVER_MINORITY_ADDRESS=$(echo "$DEPLOYMENT_JSON" | jq '.guardian_prover_minority' | sed 's/\"//g') -export PROVER_SET_ADDRESS=$(echo "$DEPLOYMENT_JSON" | jq '.prover_set' | sed 's/\"//g') +export GUARDIAN_PROVER_CONTRACT=$(echo "$DEPLOYMENT_JSON" | jq '.guardian_prover' | sed 's/\"//g') +export GUARDIAN_PROVER_MINORITY=$(echo "$DEPLOYMENT_JSON" | jq '.guardian_prover_minority' | sed 's/\"//g') export L1_CONTRACT_OWNER_PRIVATE_KEY=0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 export L1_SECURITY_COUNCIL_PRIVATE_KEY=0xdbda1821b80551c9d65939329250298aa3472ba22feea921c0cf5d620ea67b97 export L1_PROPOSER_PRIVATE_KEY=0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 export L2_SUGGESTED_FEE_RECIPIENT=0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266 -export L1_PROVER_PRIVATE_KEY=0x59c6995e998f97a5a0044966f0945389dc9e86dae88c7a8412f4603b6b78690d +export L1_PROVER_PRIVATE_KEY=0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 export TREASURY=0x1670010000000000000000000000000000010001 export VERBOSITY=3 # show the integration test environment variables. -# L1_BEACON_HTTP_ENDPOINT=$L1_BEACON_HTTP_ENDPOINT +# L1_BEACON=$L1_BEACON echo "RUN_TESTS=true -L1_NODE_HTTP_ENDPOINT=$L1_NODE_HTTP_ENDPOINT -L1_NODE_WS_ENDPOINT=$L1_NODE_WS_ENDPOINT +L1_HTTP=$L1_HTTP +L1_WS=$L1_WS L2_SUGGESTED_FEE_RECIPIENT=$L2_SUGGESTED_FEE_RECIPIENT -L2_EXECUTION_ENGINE_HTTP_ENDPOINT=$L2_EXECUTION_ENGINE_HTTP_ENDPOINT -L2_EXECUTION_ENGINE_WS_ENDPOINT=$L2_EXECUTION_ENGINE_WS_ENDPOINT -L2_EXECUTION_ENGINE_AUTH_ENDPOINT=$L2_EXECUTION_ENGINE_AUTH_ENDPOINT -TAIKO_L1_ADDRESS=$TAIKO_L1_ADDRESS -TAIKO_L2_ADDRESS=$TAIKO_L2_ADDRESS -TAIKO_TOKEN_ADDRESS=$TAIKO_TOKEN_ADDRESS -PROVER_SET_ADDRESS=$PROVER_SET_ADDRESS -ASSIGNMENT_HOOK_ADDRESS=$ASSIGNMENT_HOOK_ADDRESS +L2_HTTP=$L2_HTTP +L2_WS=$L2_WS +L2_AUTH=$L2_AUTH +TAIKO_L1=$TAIKO_L1 +TAIKO_L2=$TAIKO_L2 +TAIKO_TOKEN=$TAIKO_TOKEN TIMELOCK_CONTROLLER=$TIMELOCK_CONTROLLER -ROLLUP_ADDRESS_MANAGER_CONTRACT_ADDRESS=$ROLLUP_ADDRESS_MANAGER_CONTRACT_ADDRESS -GUARDIAN_PROVER_CONTRACT_ADDRESS=$GUARDIAN_PROVER_CONTRACT_ADDRESS -GUARDIAN_PROVER_MINORITY_ADDRESS=$GUARDIAN_PROVER_MINORITY_ADDRESS +GUARDIAN_PROVER_CONTRACT=$GUARDIAN_PROVER_CONTRACT +GUARDIAN_PROVER_MINORITY=$GUARDIAN_PROVER_MINORITY L1_CONTRACT_OWNER_PRIVATE_KEY=$L1_CONTRACT_OWNER_PRIVATE_KEY L1_SECURITY_COUNCIL_PRIVATE_KEY=$L1_SECURITY_COUNCIL_PRIVATE_KEY L1_PROPOSER_PRIVATE_KEY=$L1_PROPOSER_PRIVATE_KEY diff --git a/packages/taiko-client/internal/docker/docker_env.sh b/packages/taiko-client/internal/docker/docker_env.sh index ccaab9a033c..b5ae4ffdd4c 100755 --- a/packages/taiko-client/internal/docker/docker_env.sh +++ b/packages/taiko-client/internal/docker/docker_env.sh @@ -9,25 +9,25 @@ until cast chain-id --rpc-url "$L1_PROBE_URL" 2> /dev/null; do done # check until L2 chain is ready -L2_PROBE_URL=ws://localhost:$(docker port l2_node | grep "0.0.0.0" | awk -F ':' 'NR==2 {print $2}') +L2_PROBE_URL=ws://localhost:$(docker port $L2_NODE | grep "0.0.0.0" | awk -F ':' 'NR==2 {print $2}') until cast chain-id --rpc-url "$L2_PROBE_URL" 2> /dev/null; do sleep 1 done L1_NODE_PORT=$(docker port l1_node | grep '0.0.0.0' | awk -F ':' '{print $2}') -export L1_NODE_HTTP_ENDPOINT=http://localhost:$L1_NODE_PORT -export L1_NODE_WS_ENDPOINT=ws://localhost:$L1_NODE_PORT +export L1_HTTP=http://localhost:$L1_NODE_PORT +export L1_WS=ws://localhost:$L1_NODE_PORT -export L2_EXECUTION_ENGINE_HTTP_ENDPOINT=http://localhost:$(docker port l2_node | grep "0.0.0.0" | awk -F ':' 'NR==1 {print $2}') -export L2_EXECUTION_ENGINE_WS_ENDPOINT=ws://localhost:$(docker port l2_node | grep "0.0.0.0" | awk -F ':' 'NR==2 {print $2}') -export L2_EXECUTION_ENGINE_AUTH_ENDPOINT=http://localhost:$(docker port l2_node | grep "0.0.0.0" | awk -F ':' 'NR==3 {print $2}') +export L2_HTTP=http://localhost:$(docker port $L2_NODE | grep "0.0.0.0" | awk -F ':' 'NR==1 {print $2}') +export L2_WS=ws://localhost:$(docker port $L2_NODE | grep "0.0.0.0" | awk -F ':' 'NR==2 {print $2}') +export L2_AUTH=http://localhost:$(docker port $L2_NODE | grep "0.0.0.0" | awk -F ':' 'NR==3 {print $2}') export JWT_SECRET=$DIR/nodes/jwt.hex -echo -e "L1_NODE PORTS: \n$(docker port l1_node)" -echo -e "L2_NODE PORTS: \n$(docker port l2_node)" +echo -e "L1_NODE PORTS: \n\t$(docker port l1_node)" +echo -e "L2_NODE PORTS: \n\t$(docker port $L2_NODE)" -echo "L1_NODE_HTTP_ENDPOINT: $L1_NODE_HTTP_ENDPOINT" -echo "L1_NODE_WS_ENDPOINT: $L1_NODE_WS_ENDPOINT" -echo "L2_EXECUTION_ENGINE_HTTP_ENDPOINT: $L2_EXECUTION_ENGINE_HTTP_ENDPOINT" -echo "L2_EXECUTION_ENGINE_WS_ENDPOINT: $L2_EXECUTION_ENGINE_WS_ENDPOINT" -echo "L2_EXECUTION_ENGINE_AUTH_ENDPOINT: $L2_EXECUTION_ENGINE_AUTH_ENDPOINT" +echo "L1_HTTP: $L1_HTTP" +echo "L1_WS: $L1_WS" +echo "L2_HTTP: $L2_HTTP" +echo "L2_WS: $L2_WS" +echo "L2_AUTH: $L2_AUTH" diff --git a/packages/taiko-client/internal/docker/nodes/docker-compose.yml b/packages/taiko-client/internal/docker/nodes/docker-compose.yml index 4880101823c..3da01faf1c4 100644 --- a/packages/taiko-client/internal/docker/nodes/docker-compose.yml +++ b/packages/taiko-client/internal/docker/nodes/docker-compose.yml @@ -13,12 +13,10 @@ services: - "32301" - --host - "0.0.0.0" - - --hardfork - - cancun - l2_execution_engine: - container_name: l2_node - image: us-docker.pkg.dev/evmchain/images/taiko-geth:taiko + l2_geth: + container_name: l2_geth + image: us-docker.pkg.dev/evmchain/images/taiko-geth:softblock restart: unless-stopped pull_policy: always volumes: @@ -67,3 +65,41 @@ services: - --ws.api - admin,debug,eth,net,web3,txpool,miner,taiko - --taiko + + l2_reth: + container_name: l2_reth + image: us-docker.pkg.dev/evmchain/images/taiko-reth:v1.0.0 + restart: unless-stopped + pull_policy: always + volumes: + - .:/host + ports: + - "8545" + - "8546" + - "8551" + command: + - node + - --datadir + - /data/taiko-geth + - --chain + - "167001" + - --http + - --http.addr + - "0.0.0.0" + - --http.corsdomain + - "*" + - --ws + - --ws.addr + - "0.0.0.0" + - --ws.origins + - "*" + - --authrpc.addr + - "0.0.0.0" + - --authrpc.port + - "8551" + - --authrpc.jwtsecret + - /host/jwt.hex + - --http.api + - admin,debug,eth,net,web3,txpool,taiko + - --ws.api + - admin,debug,eth,net,web3,txpool,taiko diff --git a/packages/taiko-client/internal/docker/start.sh b/packages/taiko-client/internal/docker/start.sh index cde4a56a28c..b5839a0e2ed 100755 --- a/packages/taiko-client/internal/docker/start.sh +++ b/packages/taiko-client/internal/docker/start.sh @@ -2,10 +2,17 @@ source scripts/common.sh -DOCKER_SERVICE_LIST=("l1_node" "l2_execution_engine") +if [ "$L2_NODE" == "l2_reth" ];then + DOCKER_SERVICE_LIST=("l1_node" "l2_reth") + elif [ "$L2_NODE" == "l2_geth" ];then + DOCKER_SERVICE_LIST=("l1_node" "l2_geth") + else + echo "unsupported L2_NODE: $L2_NODE" + exit 1 +fi -# start docker compose service list -echo "start docker compose service: ${DOCKER_SERVICE_LIST[*]}" +# start docker compose services +echo "starting docker compose service: ${DOCKER_SERVICE_LIST[*]}" compose_up "${DOCKER_SERVICE_LIST[@]}" diff --git a/packages/taiko-client/internal/docker/stop.sh b/packages/taiko-client/internal/docker/stop.sh index 0a69ade3282..38e36534a96 100755 --- a/packages/taiko-client/internal/docker/stop.sh +++ b/packages/taiko-client/internal/docker/stop.sh @@ -2,7 +2,14 @@ source scripts/common.sh -DOCKER_SERVICE_LIST=("l1_node" "l2_execution_engine") +if [ "$L2_NODE" == "l2_reth" ];then + DOCKER_SERVICE_LIST=("l1_node" "l2_reth") + elif [ "$L2_NODE" == "l2_geth" ];then + DOCKER_SERVICE_LIST=("l1_node" "l2_geth") + else + echo "unsupported L2_NODE: $L2_NODE" + exit 1 +fi echo "stop docker compose service: ${DOCKER_SERVICE_LIST[*]}" diff --git a/packages/taiko-client/internal/metrics/metrics.go b/packages/taiko-client/internal/metrics/metrics.go index a95ee32ebf3..cc220eee635 100644 --- a/packages/taiko-client/internal/metrics/metrics.go +++ b/packages/taiko-client/internal/metrics/metrics.go @@ -4,13 +4,13 @@ import ( "context" opMetrics "github.com/ethereum-optimism/optimism/op-service/metrics" - "github.com/ethereum-optimism/optimism/op-service/opio" txmgrMetrics "github.com/ethereum-optimism/optimism/op-service/txmgr/metrics" "github.com/ethereum/go-ethereum/log" "github.com/prometheus/client_golang/prometheus" "github.com/urfave/cli/v2" "github.com/taikoxyz/taiko-mono/packages/taiko-client/cmd/flags" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/rpc" ) // Metrics @@ -29,6 +29,12 @@ var ( ProposerProposeEpochCounter = factory.NewCounter(prometheus.CounterOpts{Name: "proposer_epoch"}) ProposerProposedTxListsCounter = factory.NewCounter(prometheus.CounterOpts{Name: "proposer_proposed_txLists"}) ProposerProposedTxsCounter = factory.NewCounter(prometheus.CounterOpts{Name: "proposer_proposed_txs"}) + ProposerPoolContentFetchTime = factory.NewGauge(prometheus.GaugeOpts{Name: "proposer_pool_content_fetch_time"}) + ProposerEstimatedCostCalldata = factory.NewGauge(prometheus.GaugeOpts{Name: "proposer_estimated_cost_calldata"}) + ProposerEstimatedCostBlob = factory.NewGauge(prometheus.GaugeOpts{Name: "proposer_estimated_cost_blob"}) + ProposerProposeByCalldata = factory.NewCounter(prometheus.CounterOpts{Name: "proposer_propose_by_calldata"}) + ProposerProposeByBlob = factory.NewCounter(prometheus.CounterOpts{Name: "proposer_propose_by_blob"}) + ProposerCostEstimationError = factory.NewGauge(prometheus.GaugeOpts{Name: "proposer_cost_estimation_error"}) // Prover ProverLatestVerifiedIDGauge = factory.NewGauge(prometheus.GaugeOpts{Name: "prover_latestVerified_id"}) @@ -46,9 +52,45 @@ var ( ProverSubmissionErrorCounter = factory.NewCounter(prometheus.CounterOpts{ Name: "prover_proof_submission_error", }) + ProverAggregationSubmissionErrorCounter = factory.NewCounter(prometheus.CounterOpts{ + Name: "prover_proof_aggregation_submission_error", + }) + ProverSGXAggregationGenerationTime = factory.NewGauge(prometheus.GaugeOpts{ + Name: "prover_proof_sgx_aggregation_generation_time", + }) ProverSgxProofGeneratedCounter = factory.NewCounter(prometheus.CounterOpts{ Name: "prover_proof_sgx_generated", }) + ProverSgxProofGenerationTime = factory.NewGauge(prometheus.GaugeOpts{ + Name: "prover_proof_sgx_generation_time", + }) + ProverSgxProofAggregationGeneratedCounter = factory.NewCounter(prometheus.CounterOpts{ + Name: "prover_proof_sgx_aggregation_generated", + }) + ProverR0AggregationGenerationTime = factory.NewGauge(prometheus.GaugeOpts{ + Name: "prover_proof_r0_aggregation_generation_time", + }) + ProverR0ProofGeneratedCounter = factory.NewCounter(prometheus.CounterOpts{ + Name: "prover_proof_r0_generated", + }) + ProverR0ProofGenerationTime = factory.NewGauge(prometheus.GaugeOpts{ + Name: "prover_proof_r0_generation_time", + }) + ProverR0ProofAggregationGeneratedCounter = factory.NewCounter(prometheus.CounterOpts{ + Name: "prover_proof_r0_aggregation_generated", + }) + ProverSP1AggregationGenerationTime = factory.NewGauge(prometheus.GaugeOpts{ + Name: "prover_proof_sp1_aggregation_generation_time", + }) + ProverSp1ProofGeneratedCounter = factory.NewCounter(prometheus.CounterOpts{ + Name: "prover_proof_sp1_generated", + }) + ProverSP1ProofGenerationTime = factory.NewGauge(prometheus.GaugeOpts{ + Name: "prover_proof_sp1_generation_time", + }) + ProverSp1ProofAggregationGeneratedCounter = factory.NewCounter(prometheus.CounterOpts{ + Name: "prover_proof_sp1_aggregation_generated", + }) ProverSubmissionRevertedCounter = factory.NewCounter(prometheus.CounterOpts{ Name: "prover_proof_submission_reverted", }) @@ -85,7 +127,7 @@ func Serve(ctx context.Context, c *cli.Context) error { } }() - opio.BlockOnInterruptsContext(ctx) + rpc.BlockOnInterruptsContext(ctx) return nil } diff --git a/packages/taiko-client/internal/testutils/helper.go b/packages/taiko-client/internal/testutils/helper.go index a1f3cc05356..169fd5866dd 100644 --- a/packages/taiko-client/internal/testutils/helper.go +++ b/packages/taiko-client/internal/testutils/helper.go @@ -4,12 +4,7 @@ import ( "context" "crypto/ecdsa" "crypto/rand" - "errors" - "fmt" "math/big" - "net/http" - "net/url" - "os" "time" "github.com/cenkalti/backoff/v4" @@ -19,39 +14,28 @@ import ( "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/params" - "github.com/ethereum/go-ethereum/rlp" - "github.com/go-resty/resty/v2" "github.com/phayes/freeport" "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/metadata" "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/rpc" - "github.com/taikoxyz/taiko-mono/packages/taiko-client/prover/server" ) -func (s *ClientTestSuite) ProposeInvalidTxListBytes(proposer Proposer) { - invalidTxListBytes := RandomBytes(256) - - s.Nil(proposer.ProposeTxList(context.Background(), invalidTxListBytes, 1)) -} - func (s *ClientTestSuite) proposeEmptyBlockOp(ctx context.Context, proposer Proposer) { - emptyTxListBytes, err := rlp.EncodeToBytes(types.Transactions{}) - s.Nil(err) - s.Nil(proposer.ProposeTxList(ctx, emptyTxListBytes, 0)) + s.Nil(proposer.ProposeTxLists(ctx, []types.Transactions{{}})) } func (s *ClientTestSuite) ProposeAndInsertEmptyBlocks( proposer Proposer, blobSyncer BlobSyncer, -) []*bindings.TaikoL1ClientBlockProposed { - var events []*bindings.TaikoL1ClientBlockProposed +) []metadata.TaikoBlockMetaData { + var metadataList []metadata.TaikoBlockMetaData l1Head, err := s.RPCClient.L1.HeaderByNumber(context.Background(), nil) s.Nil(err) - sink := make(chan *bindings.TaikoL1ClientBlockProposed) - - sub, err := s.RPCClient.TaikoL1.WatchBlockProposed(nil, sink, nil, nil) + sink := make(chan *bindings.TaikoL1ClientBlockProposedV2) + sub, err := s.RPCClient.TaikoL1.WatchBlockProposedV2(nil, sink, nil) s.Nil(err) defer func() { sub.Unsubscribe() @@ -59,20 +43,25 @@ func (s *ClientTestSuite) ProposeAndInsertEmptyBlocks( }() // RLP encoded empty list - var emptyTxs []types.Transaction - encoded, err := rlp.EncodeToBytes(emptyTxs) - s.Nil(err) - - s.Nil(proposer.ProposeTxList(context.Background(), encoded, 0)) + s.Nil(proposer.ProposeTxLists(context.Background(), []types.Transactions{{}})) + s.Nil(blobSyncer.ProcessL1Blocks(context.Background())) - s.ProposeInvalidTxListBytes(proposer) + // Valid transactions lists. + s.ProposeValidBlock(proposer) + s.Nil(blobSyncer.ProcessL1Blocks(context.Background())) // Random bytes txList s.proposeEmptyBlockOp(context.Background(), proposer) + s.Nil(blobSyncer.ProcessL1Blocks(context.Background())) - events = append(events, []*bindings.TaikoL1ClientBlockProposed{<-sink, <-sink, <-sink}...) + var txHash common.Hash + for i := 0; i < 3; i++ { + event := <-sink + metadataList = append(metadataList, metadata.NewTaikoDataBlockMetadataOntake(event)) + txHash = event.Raw.TxHash + } - _, isPending, err := s.RPCClient.L1.TransactionByHash(context.Background(), events[len(events)-1].Raw.TxHash) + _, isPending, err := s.RPCClient.L1.TransactionByHash(context.Background(), txHash) s.Nil(err) s.False(isPending) @@ -80,52 +69,39 @@ func (s *ClientTestSuite) ProposeAndInsertEmptyBlocks( s.Nil(err) s.Greater(newL1Head.Number.Uint64(), l1Head.Number.Uint64()) - ctx, cancel := context.WithTimeout(context.Background(), time.Minute) - defer cancel() - - s.Nil(backoff.Retry(func() error { - return blobSyncer.ProcessL1Blocks(ctx) - }, backoff.NewExponentialBackOff())) - s.Nil(s.RPCClient.WaitTillL2ExecutionEngineSynced(context.Background())) - return events + return metadataList } -// ProposeAndInsertValidBlock proposes an valid tx list and then insert it +// ProposeAndInsertValidBlock proposes a valid tx list and then insert it // into L2 execution engine's local chain. func (s *ClientTestSuite) ProposeAndInsertValidBlock( proposer Proposer, blobSyncer BlobSyncer, -) *bindings.TaikoL1ClientBlockProposed { +) metadata.TaikoBlockMetaData { l1Head, err := s.RPCClient.L1.HeaderByNumber(context.Background(), nil) s.Nil(err) - l2Head, err := s.RPCClient.L2.HeaderByNumber(context.Background(), nil) - s.Nil(err) - // Propose txs in L2 execution engine's mempool - sink := make(chan *bindings.TaikoL1ClientBlockProposed) - - sub, err := s.RPCClient.TaikoL1.WatchBlockProposed(nil, sink, nil, nil) + sink := make(chan *bindings.TaikoL1ClientBlockProposedV2) + sub, err := s.RPCClient.TaikoL1.WatchBlockProposedV2(nil, sink, nil) s.Nil(err) + defer func() { sub.Unsubscribe() close(sink) }() - baseFeeInfo, err := s.RPCClient.TaikoL2.GetBasefee(nil, l1Head.Number.Uint64()+1, uint32(l2Head.GasUsed)) - s.Nil(err) - nonce, err := s.RPCClient.L2.PendingNonceAt(context.Background(), s.TestAddr) s.Nil(err) tx := types.NewTransaction( nonce, common.BytesToAddress(RandomBytes(32)), - common.Big1, - 100000, - new(big.Int).SetUint64(uint64(10*params.GWei)+baseFeeInfo.Basefee.Uint64()), + common.Big0, + 100_000, + new(big.Int).SetUint64(uint64(10*params.GWei)), []byte{}, ) signedTx, err := types.SignTx(tx, types.LatestSignerForChainID(s.RPCClient.L2.ChainID), s.TestAddrPrivKey) @@ -134,13 +110,16 @@ func (s *ClientTestSuite) ProposeAndInsertValidBlock( s.Nil(proposer.ProposeOp(context.Background())) - event := <-sink - - _, isPending, err := s.RPCClient.L1.TransactionByHash(context.Background(), event.Raw.TxHash) + var ( + event = <-sink + txHash = event.Raw.TxHash + meta = metadata.NewTaikoDataBlockMetadataOntake(event) + ) + _, isPending, err := s.RPCClient.L1.TransactionByHash(context.Background(), txHash) s.Nil(err) s.False(isPending) - receipt, err := s.RPCClient.L1.TransactionReceipt(context.Background(), event.Raw.TxHash) + receipt, err := s.RPCClient.L1.TransactionReceipt(context.Background(), txHash) s.Nil(err) s.Equal(types.ReceiptStatusSuccessful, receipt.Status) @@ -151,38 +130,51 @@ func (s *ClientTestSuite) ProposeAndInsertValidBlock( ctx, cancel := context.WithTimeout(context.Background(), time.Minute) defer cancel() - s.Nil(backoff.Retry(func() error { - return blobSyncer.ProcessL1Blocks(ctx) - }, backoff.NewExponentialBackOff())) + s.Nil(backoff.Retry(func() error { return blobSyncer.ProcessL1Blocks(ctx) }, backoff.NewExponentialBackOff())) s.Nil(s.RPCClient.WaitTillL2ExecutionEngineSynced(context.Background())) _, err = s.RPCClient.L2.HeaderByNumber(context.Background(), nil) s.Nil(err) - return event + return meta } func (s *ClientTestSuite) ProposeValidBlock( proposer Proposer, -) *bindings.TaikoL1ClientBlockProposed { +) { l1Head, err := s.RPCClient.L1.HeaderByNumber(context.Background(), nil) s.Nil(err) - l2Head, err := s.RPCClient.L2.HeaderByNumber(context.Background(), nil) + state, err := s.RPCClient.GetProtocolStateVariables(nil) s.Nil(err) - // Propose txs in L2 execution engine's mempool - sink := make(chan *bindings.TaikoL1ClientBlockProposed) + l2Head, err := s.RPCClient.L2.HeaderByNumber(context.Background(), new(big.Int).SetUint64(state.B.NumBlocks-1)) + s.Nil(err) - sub, err := s.RPCClient.TaikoL1.WatchBlockProposed(nil, sink, nil, nil) + // Propose txs in L2 execution engine's mempool + sink := make(chan *bindings.TaikoL1ClientBlockProposedV2) + sub, err := s.RPCClient.TaikoL1.WatchBlockProposedV2(nil, sink, nil) s.Nil(err) defer func() { sub.Unsubscribe() close(sink) }() - baseFeeInfo, err := s.RPCClient.TaikoL2.GetBasefee(nil, l1Head.Number.Uint64()+1, uint32(l2Head.GasUsed)) + ontakeForkHeight, err := s.RPCClient.TaikoL2.OntakeForkHeight(nil) + s.Nil(err) + + protocolConfigs, err := rpc.GetProtocolConfigs(s.RPCClient.TaikoL1, nil) + s.Nil(err) + + baseFee, err := s.RPCClient.CalculateBaseFee( + context.Background(), + l2Head, + l1Head.Number, + l2Head.Number.Uint64()+1 >= ontakeForkHeight, + &protocolConfigs.BaseFeeConfig, + l1Head.Time, + ) s.Nil(err) nonce, err := s.RPCClient.L2.PendingNonceAt(context.Background(), s.TestAddr) @@ -191,9 +183,9 @@ func (s *ClientTestSuite) ProposeValidBlock( tx := types.NewTransaction( nonce, common.BytesToAddress(RandomBytes(32)), - common.Big1, - 100000, - new(big.Int).SetUint64(uint64(10*params.GWei)+baseFeeInfo.Basefee.Uint64()), + common.Big0, + 100_000, + new(big.Int).SetUint64(uint64(10*params.GWei)+baseFee.Uint64()), []byte{}, ) signedTx, err := types.SignTx(tx, types.LatestSignerForChainID(s.RPCClient.L2.ChainID), s.TestAddrPrivKey) @@ -202,69 +194,21 @@ func (s *ClientTestSuite) ProposeValidBlock( s.Nil(proposer.ProposeOp(context.Background())) - event := <-sink - - _, isPending, err := s.RPCClient.L1.TransactionByHash(context.Background(), event.Raw.TxHash) + var ( + event = <-sink + txHash = event.Raw.TxHash + ) + _, isPending, err := s.RPCClient.L1.TransactionByHash(context.Background(), txHash) s.Nil(err) s.False(isPending) - receipt, err := s.RPCClient.L1.TransactionReceipt(context.Background(), event.Raw.TxHash) + receipt, err := s.RPCClient.L1.TransactionReceipt(context.Background(), txHash) s.Nil(err) s.Equal(types.ReceiptStatusSuccessful, receipt.Status) newL1Head, err := s.RPCClient.L1.HeaderByNumber(context.Background(), nil) s.Nil(err) s.Greater(newL1Head.Number.Uint64(), l1Head.Number.Uint64()) - - return event -} - -// NewTestProverServer starts a new prover server that has channel listeners to respond and react -// to requests for capacity, which provers can call. -func (s *ClientTestSuite) NewTestProverServer( - proverPrivKey *ecdsa.PrivateKey, - url *url.URL, -) *server.ProverServer { - protocolConfig, err := s.RPCClient.TaikoL1.GetConfig(nil) - s.Nil(err) - - srv, err := server.New(&server.NewProverServerOpts{ - ProverPrivateKey: proverPrivKey, - MinOptimisticTierFee: common.Big1, - MinSgxTierFee: common.Big1, - MinSgxAndZkVMTierFee: common.Big1, - MinEthBalance: common.Big1, - MinTaikoTokenBalance: common.Big1, - MaxExpiry: 24 * time.Hour, - TaikoL1Address: common.HexToAddress(os.Getenv("TAIKO_L1_ADDRESS")), - ProverSetAddress: common.HexToAddress(os.Getenv("PROVER_SET_ADDRESS")), - AssignmentHookAddress: common.HexToAddress(os.Getenv("ASSIGNMENT_HOOK_ADDRESS")), - RPC: s.RPCClient, - ProtocolConfigs: &protocolConfig, - LivenessBond: protocolConfig.LivenessBond, - }) - s.Nil(err) - - go func() { - if err := srv.Start(fmt.Sprintf(":%v", url.Port())); !errors.Is(err, http.ErrServerClosed) { - log.Error("Failed to start prover server", "error", err) - } - }() - - // Wait till the server fully started. - s.Nil(backoff.Retry(func() error { - res, err := resty.New().R().Get(url.String() + "/healthz") - if err != nil { - return err - } - if !res.IsSuccess() { - return fmt.Errorf("invalid response status code: %d", res.StatusCode()) - } - - return nil - }, backoff.NewExponentialBackOff())) - - return srv } // RandomHash generates a random blob of data and returns it as a hash. @@ -294,21 +238,38 @@ func RandomPort() int { return port } -// LocalRandomProverEndpoint returns a local free random prover endpoint. -func LocalRandomProverEndpoint() *url.URL { - port := RandomPort() +// SignatureFromRSV creates the signature bytes from r,s,v. +func SignatureFromRSV(r, s string, v byte) []byte { + return append(append(hexutil.MustDecode(r), hexutil.MustDecode(s)...), v) +} - proverEndpoint, err := url.Parse(fmt.Sprintf("http://localhost:%v", port)) +func AssembleTestTx( + client *rpc.EthClient, + priv *ecdsa.PrivateKey, + nonce uint64, + to *common.Address, + value *big.Int, + data []byte, +) (*types.Transaction, error) { + auth, err := bind.NewKeyedTransactorWithChainID(priv, client.ChainID) if err != nil { - log.Crit("Failed to parse local prover endpoint", "error", err) + return nil, err } - return proverEndpoint -} + tx, err := auth.Signer(auth.From, types.NewTx(&types.DynamicFeeTx{ + To: to, + Nonce: nonce, + Value: value, + GasTipCap: new(big.Int).SetUint64(10 * params.GWei), + GasFeeCap: new(big.Int).SetUint64(20 * params.GWei), + Gas: 2_100_000, + Data: data, + })) + if err != nil { + return nil, err + } -// SignatureFromRSV creates the signature bytes from r,s,v. -func SignatureFromRSV(r, s string, v byte) []byte { - return append(append(hexutil.MustDecode(r), hexutil.MustDecode(s)...), v) + return tx, client.SendTransaction(context.Background(), tx) } // SendDynamicFeeTx sends a dynamic transaction, used for tests. diff --git a/packages/taiko-client/internal/testutils/interfaces.go b/packages/taiko-client/internal/testutils/interfaces.go index d8d1a401899..d35f125ade5 100644 --- a/packages/taiko-client/internal/testutils/interfaces.go +++ b/packages/taiko-client/internal/testutils/interfaces.go @@ -3,6 +3,8 @@ package testutils import ( "context" + "github.com/ethereum/go-ethereum/core/types" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/cmd/utils" ) @@ -13,9 +15,5 @@ type BlobSyncer interface { type Proposer interface { utils.SubcommandApplication ProposeOp(ctx context.Context) error - ProposeTxList( - ctx context.Context, - txListBytes []byte, - txNum uint, - ) error + ProposeTxLists(ctx context.Context, txLists []types.Transactions) error } diff --git a/packages/taiko-client/internal/testutils/suite.go b/packages/taiko-client/internal/testutils/suite.go index 053b9711951..b510be4f2f4 100644 --- a/packages/taiko-client/internal/testutils/suite.go +++ b/packages/taiko-client/internal/testutils/suite.go @@ -4,7 +4,6 @@ import ( "context" "crypto/ecdsa" "math/big" - "net/url" "os" "strconv" "time" @@ -19,10 +18,9 @@ import ( "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings" "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/encoding" - "github.com/taikoxyz/taiko-mono/packages/taiko-client/internal/utils" "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/jwt" "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/rpc" - "github.com/taikoxyz/taiko-mono/packages/taiko-client/prover/server" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/utils" ) type ClientTestSuite struct { @@ -31,9 +29,7 @@ type ClientTestSuite struct { RPCClient *rpc.Client TestAddrPrivKey *ecdsa.PrivateKey TestAddr common.Address - ProverEndpoints []*url.URL AddressManager *bindings.AddressManager - proverServer *server.ProverServer } func (s *ClientTestSuite) SetupTest() { @@ -56,15 +52,14 @@ func (s *ClientTestSuite) SetupTest() { s.NotEmpty(jwtSecret) rpcCli, err := rpc.NewClient(context.Background(), &rpc.ClientConfig{ - L1Endpoint: os.Getenv("L1_NODE_WS_ENDPOINT"), - L2Endpoint: os.Getenv("L2_EXECUTION_ENGINE_WS_ENDPOINT"), - TaikoL1Address: common.HexToAddress(os.Getenv("TAIKO_L1_ADDRESS")), - TaikoL2Address: common.HexToAddress(os.Getenv("TAIKO_L2_ADDRESS")), - ProverSetAddress: common.HexToAddress(os.Getenv("PROVER_SET_ADDRESS")), - TaikoTokenAddress: common.HexToAddress(os.Getenv("TAIKO_TOKEN_ADDRESS")), - GuardianProverMajorityAddress: common.HexToAddress(os.Getenv("GUARDIAN_PROVER_CONTRACT_ADDRESS")), - GuardianProverMinorityAddress: common.HexToAddress(os.Getenv("GUARDIAN_PROVER_MINORITY_ADDRESS")), - L2EngineEndpoint: os.Getenv("L2_EXECUTION_ENGINE_AUTH_ENDPOINT"), + L1Endpoint: os.Getenv("L1_WS"), + L2Endpoint: os.Getenv("L2_WS"), + TaikoL1Address: common.HexToAddress(os.Getenv("TAIKO_L1")), + TaikoL2Address: common.HexToAddress(os.Getenv("TAIKO_L2")), + TaikoTokenAddress: common.HexToAddress(os.Getenv("TAIKO_TOKEN")), + GuardianProverMajorityAddress: common.HexToAddress(os.Getenv("GUARDIAN_PROVER_CONTRACT")), + GuardianProverMinorityAddress: common.HexToAddress(os.Getenv("GUARDIAN_PROVER_MINORITY")), + L2EngineEndpoint: os.Getenv("L2_AUTH"), JwtSecret: string(jwtSecret), }) s.Nil(err) @@ -75,13 +70,14 @@ func (s *ClientTestSuite) SetupTest() { l1ProverPrivKey, err := crypto.ToECDSA(common.FromHex(os.Getenv("L1_PROVER_PRIVATE_KEY"))) s.Nil(err) - s.ProverEndpoints = []*url.URL{LocalRandomProverEndpoint()} - s.proverServer = s.NewTestProverServer(l1ProverPrivKey, s.ProverEndpoints[0]) - - balance, err := rpcCli.TaikoToken.BalanceOf(nil, crypto.PubkeyToAddress(l1ProverPrivKey.PublicKey)) + allowance, err := rpcCli.TaikoToken.Allowance( + nil, + crypto.PubkeyToAddress(l1ProverPrivKey.PublicKey), + common.HexToAddress(os.Getenv("TAIKO_L1")), + ) s.Nil(err) - if balance.Cmp(common.Big0) == 0 { + if allowance.Cmp(common.Big0) == 0 { ownerPrivKey, err := crypto.ToECDSA(common.FromHex(os.Getenv("L1_CONTRACT_OWNER_PRIVATE_KEY"))) s.Nil(err) @@ -98,46 +94,23 @@ func (s *ClientTestSuite) SetupTest() { _, err = rpcCli.TaikoToken.Transfer(opts, crypto.PubkeyToAddress(l1ProverPrivKey.PublicKey), proverBalance) s.Nil(err) - opts, err = bind.NewKeyedTransactorWithChainID(ownerPrivKey, rpcCli.L1.ChainID) - s.Nil(err) - _, err = rpcCli.TaikoToken.Transfer(opts, common.HexToAddress(os.Getenv("PROVER_SET_ADDRESS")), proverBalance) - s.Nil(err) - - // Increase allowance for AssignmentHook and TaikoL1 - s.setAllowance(l1ProverPrivKey) - s.setAllowance(ownerPrivKey) - - t, err := txmgr.NewSimpleTxManager( - "enableProver", - log.Root(), - new(metrics.NoopTxMetrics), - txmgr.CLIConfig{ - L1RPCURL: os.Getenv("L1_NODE_WS_ENDPOINT"), - NumConfirmations: 0, - SafeAbortNonceTooLowCount: txmgr.DefaultBatcherFlagValues.SafeAbortNonceTooLowCount, - PrivateKey: common.Bytes2Hex(crypto.FromECDSA(ownerPrivKey)), - FeeLimitMultiplier: txmgr.DefaultBatcherFlagValues.FeeLimitMultiplier, - FeeLimitThresholdGwei: txmgr.DefaultBatcherFlagValues.FeeLimitThresholdGwei, - MinBaseFeeGwei: txmgr.DefaultBatcherFlagValues.MinBaseFeeGwei, - MinTipCapGwei: txmgr.DefaultBatcherFlagValues.MinTipCapGwei, - ResubmissionTimeout: txmgr.DefaultBatcherFlagValues.ResubmissionTimeout, - ReceiptQueryInterval: 1 * time.Second, - NetworkTimeout: txmgr.DefaultBatcherFlagValues.NetworkTimeout, - TxSendTimeout: txmgr.DefaultBatcherFlagValues.TxSendTimeout, - TxNotInMempoolTimeout: txmgr.DefaultBatcherFlagValues.TxNotInMempoolTimeout, - }, + _, err = rpcCli.TaikoToken.Transfer( + opts, + common.HexToAddress(os.Getenv("GUARDIAN_PROVER_MINORITY")), + new(big.Int).Div(proverBalance, common.Big2), ) s.Nil(err) - data, err := encoding.ProverSetABI.Pack("enableProver", crypto.PubkeyToAddress(l1ProverPrivKey.PublicKey), true) + _, err = rpcCli.TaikoToken.Transfer( + opts, + common.HexToAddress(os.Getenv("GUARDIAN_PROVER_CONTRACT")), + new(big.Int).Div(proverBalance, common.Big2), + ) s.Nil(err) - proverSetAddress := common.HexToAddress(os.Getenv("PROVER_SET_ADDRESS")) - _, err = t.Send(context.Background(), txmgr.TxCandidate{ - TxData: data, - To: &proverSetAddress, - }) - s.Nil(err) + // Increase allowance for TaikoL1 + s.setAllowance(l1ProverPrivKey) + s.setAllowance(ownerPrivKey) } s.testnetL1SnapshotID = s.SetL1Snapshot() @@ -149,7 +122,7 @@ func (s *ClientTestSuite) setAllowance(key *ecdsa.PrivateKey) { log.Root(), new(metrics.NoopTxMetrics), txmgr.CLIConfig{ - L1RPCURL: os.Getenv("L1_NODE_WS_ENDPOINT"), + L1RPCURL: os.Getenv("L1_WS"), NumConfirmations: 0, SafeAbortNonceTooLowCount: txmgr.DefaultBatcherFlagValues.SafeAbortNonceTooLowCount, PrivateKey: common.Bytes2Hex(crypto.FromECDSA(key)), @@ -171,24 +144,12 @@ func (s *ClientTestSuite) setAllowance(key *ecdsa.PrivateKey) { var ( bigInt = new(big.Int).Exp(big.NewInt(1_000_000_000), new(big.Int).SetUint64(uint64(decimal)), nil) - taikoTokenAddress = common.HexToAddress(os.Getenv("TAIKO_TOKEN_ADDRESS")) + taikoTokenAddress = common.HexToAddress(os.Getenv("TAIKO_TOKEN")) ) data, err := encoding.TaikoTokenABI.Pack( "approve", - common.HexToAddress(os.Getenv("ASSIGNMENT_HOOK_ADDRESS")), - bigInt, - ) - s.Nil(err) - _, err = t.Send(context.Background(), txmgr.TxCandidate{ - TxData: data, - To: &taikoTokenAddress, - }) - s.Nil(err) - - data, err = encoding.TaikoTokenABI.Pack( - "approve", - common.HexToAddress(os.Getenv("TAIKO_L1_ADDRESS")), + common.HexToAddress(os.Getenv("TAIKO_L1")), bigInt, ) s.Nil(err) @@ -203,7 +164,6 @@ func (s *ClientTestSuite) TearDownTest() { s.RevertL1Snapshot(s.testnetL1SnapshotID) s.Nil(rpc.SetHead(context.Background(), s.RPCClient.L2, common.Big0)) - s.Nil(s.proverServer.Shutdown(context.Background())) } func (s *ClientTestSuite) SetL1Automine(automine bool) { diff --git a/packages/taiko-client/internal/utils/test_utils.go b/packages/taiko-client/internal/utils/test_utils.go deleted file mode 100644 index a1ca5db35fe..00000000000 --- a/packages/taiko-client/internal/utils/test_utils.go +++ /dev/null @@ -1,16 +0,0 @@ -package utils - -import ( - "context" - "testing" - - "github.com/ethereum/go-ethereum/rpc" - "github.com/stretchr/testify/assert" -) - -// MineL1Block mines a block on the L1 chain. -func MineL1Block(t *testing.T, l1Client *rpc.Client) { - var blockID string - assert.Nil(t, l1Client.CallContext(context.Background(), &blockID, "evm_mine")) - assert.NotEmpty(t, blockID) -} diff --git a/packages/taiko-client/internal/version/version.go b/packages/taiko-client/internal/version/version.go index cc0463bea5e..d3fffe26dd0 100644 --- a/packages/taiko-client/internal/version/version.go +++ b/packages/taiko-client/internal/version/version.go @@ -1,7 +1,7 @@ package version // Version info. -const Version = "0.18.0" // x-release-please-version +const Version = "0.42.1" // x-release-please-version var meta = "dev" diff --git a/packages/taiko-client/package.json b/packages/taiko-client/package.json index 302adf42692..6d992d5a88d 100644 --- a/packages/taiko-client/package.json +++ b/packages/taiko-client/package.json @@ -1,5 +1,5 @@ { "name": "taiko-client", - "version": "0.25.0", + "version": "0.42.1", "private": true } diff --git a/packages/taiko-client/pkg/chain_iterator/block_batch_iterator.go b/packages/taiko-client/pkg/chain_iterator/block_batch_iterator.go index 20ee9136672..56242c39d2b 100644 --- a/packages/taiko-client/pkg/chain_iterator/block_batch_iterator.go +++ b/packages/taiko-client/pkg/chain_iterator/block_batch_iterator.go @@ -273,6 +273,15 @@ func (i *BlockBatchIterator) rewindOnReorgDetected() error { newCurrentHeight = i.current.Number.Uint64() - i.reorgRewindDepth } + head, err := i.client.BlockNumber(i.ctx) + if err != nil { + return err + } + + if newCurrentHeight > head { + newCurrentHeight = head + } + current, err := i.client.HeaderByNumber(i.ctx, new(big.Int).SetUint64(newCurrentHeight)) if err != nil { return err diff --git a/packages/taiko-client/pkg/chain_iterator/event_iterator/block_proposed_iterator.go b/packages/taiko-client/pkg/chain_iterator/event_iterator/block_proposed_iterator.go index 23b2cf73b9c..67fc0fea23d 100644 --- a/packages/taiko-client/pkg/chain_iterator/event_iterator/block_proposed_iterator.go +++ b/packages/taiko-client/pkg/chain_iterator/event_iterator/block_proposed_iterator.go @@ -9,6 +9,7 @@ import ( "github.com/ethereum/go-ethereum/core/types" "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/metadata" chainIterator "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/chain_iterator" "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/rpc" ) @@ -20,7 +21,7 @@ type EndBlockProposedEventIterFunc func() // iterated. type OnBlockProposedEvent func( context.Context, - *bindings.TaikoL1ClientBlockProposed, + metadata.TaikoBlockMetaData, EndBlockProposedEventIterFunc, ) error @@ -97,7 +98,7 @@ func (i *BlockProposedIterator) end() { // by a event iterator's inner block iterator. func assembleBlockProposedIteratorCallback( client *rpc.EthClient, - taikoL1Client *bindings.TaikoL1Client, + taikoL1 *bindings.TaikoL1Client, filterQuery []*big.Int, callback OnBlockProposedEvent, eventIter *BlockProposedIterator, @@ -109,7 +110,8 @@ func assembleBlockProposedIteratorCallback( endFunc chainIterator.EndIterFunc, ) error { endHeight := end.Number.Uint64() - iter, err := taikoL1Client.FilterBlockProposed( + + iter, err := taikoL1.FilterBlockProposed( &bind.FilterOpts{Start: start.Number.Uint64(), End: &endHeight, Context: ctx}, filterQuery, nil, @@ -119,10 +121,39 @@ func assembleBlockProposedIteratorCallback( } defer iter.Close() + iterOntake, err := taikoL1.FilterBlockProposedV2( + &bind.FilterOpts{Start: start.Number.Uint64(), End: &endHeight, Context: ctx}, + filterQuery, + ) + if err != nil { + return err + } + defer iterOntake.Close() + for iter.Next() { event := iter.Event - if err := callback(ctx, event, eventIter.end); err != nil { + if err := callback(ctx, metadata.NewTaikoDataBlockMetadataLegacy(event), eventIter.end); err != nil { + return err + } + + if eventIter.isEnd { + endFunc() + return nil + } + + current, err := client.HeaderByHash(ctx, event.Raw.BlockHash) + if err != nil { + return err + } + + updateCurrentFunc(current) + } + + for iterOntake.Next() { + event := iterOntake.Event + + if err := callback(ctx, metadata.NewTaikoDataBlockMetadataOntake(event), eventIter.end); err != nil { return err } diff --git a/packages/taiko-client/pkg/config/chain_config.go b/packages/taiko-client/pkg/config/chain_config.go new file mode 100644 index 00000000000..c0a05974b2d --- /dev/null +++ b/packages/taiko-client/pkg/config/chain_config.go @@ -0,0 +1,73 @@ +package config + +import ( + "fmt" + "math/big" + "strings" + + "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings" + + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/params" +) + +// ChainConfig is the core config which determines the blockchain settings. +type ChainConfig struct { + // Ontake switch block (nil = no fork, 0 = already on ontake) + ProtocolConfigs *bindings.TaikoDataConfig `json:"protocolConfigs"` +} + +// NewChainConfig creates a new ChainConfig instance. +func NewChainConfig(protocolConfigs *bindings.TaikoDataConfig) *ChainConfig { + cfg := &ChainConfig{protocolConfigs} + + log.Info("") + log.Info(strings.Repeat("-", 153)) + for _, line := range strings.Split(cfg.Description(), "\n") { + log.Info(line) + } + log.Info(strings.Repeat("-", 153)) + log.Info("") + + return cfg +} + +// NetworkNames are user friendly names to use in the chain spec banner. +var NetworkNames = map[uint64]string{ + params.TaikoMainnetNetworkID.Uint64(): "Taiko Mainnet", + params.HeklaNetworkID.Uint64(): "Taiko Hekla Testnet", + params.TaikoInternalL2ANetworkID.Uint64(): "Taiko Internal Devnet", +} + +// Description returns a human-readable description of ChainConfig. +func (c *ChainConfig) Description() string { + var banner string + + // Create some basic network config output + network := NetworkNames[c.ProtocolConfigs.ChainId] + if network == "" { + network = "unknown" + } + banner += fmt.Sprintf("Chain ID: %v (%s)\n", c.ProtocolConfigs.ChainId, network) + + // Create a list of forks with a short description of them. + banner += "Hard forks (block based):\n" + banner += fmt.Sprintf(" - Ontake: #%-8v\n", c.ProtocolConfigs.OntakeForkHeight) + banner += "\n" + + return banner +} + +// IsOntake returns whether num is either equal to the ontake block or greater. +func (c *ChainConfig) IsOntake(num *big.Int) bool { + return isBlockForked(new(big.Int).SetUint64(c.ProtocolConfigs.OntakeForkHeight), num) +} + +// isBlockForked returns whether a fork scheduled at block s is active at the +// given head block. +func isBlockForked(s, head *big.Int) bool { + if s == nil || head == nil { + return false + } + return s.Cmp(head) <= 0 +} diff --git a/packages/taiko-client/pkg/jwt/jwt.go b/packages/taiko-client/pkg/jwt/jwt.go index 33ba0dacc66..0b0c9521dc0 100644 --- a/packages/taiko-client/pkg/jwt/jwt.go +++ b/packages/taiko-client/pkg/jwt/jwt.go @@ -6,7 +6,7 @@ import ( "fmt" "strings" - "github.com/prysmaticlabs/prysm/v4/io/file" + "github.com/prysmaticlabs/prysm/v5/io/file" ) // Taken from: https://github.com/prysmaticlabs/prysm/blob/v2.1.4/cmd/beacon-chain/execution/options.go#L43 diff --git a/packages/taiko-client/pkg/rpc/beaconclient.go b/packages/taiko-client/pkg/rpc/beaconclient.go index 100bc61ad8e..acf70c86b79 100644 --- a/packages/taiko-client/pkg/rpc/beaconclient.go +++ b/packages/taiko-client/pkg/rpc/beaconclient.go @@ -10,10 +10,9 @@ import ( "github.com/ethereum/go-ethereum/log" "github.com/pkg/errors" - "github.com/prysmaticlabs/prysm/v4/api/client" - "github.com/prysmaticlabs/prysm/v4/api/client/beacon" - "github.com/prysmaticlabs/prysm/v4/beacon-chain/rpc/eth/blob" - "github.com/prysmaticlabs/prysm/v4/beacon-chain/rpc/eth/config" + "github.com/prysmaticlabs/prysm/v5/api/client" + "github.com/prysmaticlabs/prysm/v5/api/client/beacon" + "github.com/prysmaticlabs/prysm/v5/api/server/structs" ) var ( @@ -86,21 +85,20 @@ func NewBeaconClient(endpoint string, timeout time.Duration) (*BeaconClient, err } // GetBlobs returns the sidecars for a given slot. -func (c *BeaconClient) GetBlobs(ctx context.Context, time uint64) ([]*blob.Sidecar, error) { - ctxWithTimeout, cancel := ctxWithTimeoutOrDefault(ctx, c.timeout) +func (c *BeaconClient) GetBlobs(ctx context.Context, time uint64) ([]*structs.Sidecar, error) { + ctxWithTimeout, cancel := CtxWithTimeoutOrDefault(ctx, c.timeout) defer cancel() slot, err := c.timeToSlot(time) if err != nil { return nil, err } - resBytes, err := c.Get(ctxWithTimeout, c.BaseURL().Path+fmt.Sprintf(sidecarsRequestURL, slot)) if err != nil { return nil, err } - var sidecars *blob.SidecarsResponse + var sidecars *structs.SidecarsResponse if err = json.Unmarshal(resBytes, &sidecars); err != nil { return nil, err } @@ -117,12 +115,12 @@ func (c *BeaconClient) timeToSlot(timestamp uint64) (uint64, error) { } // getConfigSpec retrieve the current configs of the network used by the beacon node. -func getConfigSpec(ctx context.Context, c *beacon.Client) (*config.GetSpecResponse, error) { +func getConfigSpec(ctx context.Context, c *beacon.Client) (*structs.GetSpecResponse, error) { body, err := c.Get(ctx, c.BaseURL().Path+getConfigSpecPath) if err != nil { return nil, errors.Wrap(err, "error requesting configSpecPath") } - fsr := &config.GetSpecResponse{} + fsr := &structs.GetSpecResponse{} err = json.Unmarshal(body, fsr) if err != nil { return nil, err diff --git a/packages/taiko-client/pkg/rpc/blob_datasource.go b/packages/taiko-client/pkg/rpc/blob_datasource.go index ed6e98bedb6..37904158540 100644 --- a/packages/taiko-client/pkg/rpc/blob_datasource.go +++ b/packages/taiko-client/pkg/rpc/blob_datasource.go @@ -3,15 +3,15 @@ package rpc import ( "context" "encoding/json" + "errors" "fmt" "net/url" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/log" "github.com/go-resty/resty/v2" - "github.com/prysmaticlabs/prysm/v4/beacon-chain/rpc/eth/blob" + "github.com/prysmaticlabs/prysm/v5/api/server/structs" - "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings" "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg" ) @@ -75,34 +75,33 @@ func (p *BlobServerResponse) UnmarshalJSON(data []byte) error { // GetBlobs get blob sidecar by meta func (ds *BlobDataSource) GetBlobs( ctx context.Context, - meta *bindings.TaikoDataBlockMetadata, -) ([]*blob.Sidecar, error) { - if !meta.BlobUsed { - return nil, pkg.ErrBlobUnused - } - + timestamp uint64, + blobHash common.Hash, +) ([]*structs.Sidecar, error) { var ( - sidecars []*blob.Sidecar + sidecars []*structs.Sidecar err error ) if ds.client.L1Beacon == nil { sidecars, err = nil, pkg.ErrBeaconNotFound } else { - sidecars, err = ds.client.L1Beacon.GetBlobs(ctx, meta.Timestamp) + sidecars, err = ds.client.L1Beacon.GetBlobs(ctx, timestamp) } if err != nil { - log.Info("Failed to get blobs from beacon, try to use blob server.", "error", err.Error()) + if !errors.Is(err, pkg.ErrBeaconNotFound) { + log.Info("Failed to get blobs from beacon, try to use blob server.", "error", err.Error()) + } if ds.blobServerEndpoint == nil && ds.socialScanEndpoint == nil { log.Info("No blob server endpoint set") return nil, err } - blobs, err := ds.getBlobFromServer(ctx, meta.BlobHash) + blobs, err := ds.getBlobFromServer(ctx, blobHash) if err != nil { return nil, err } - sidecars = make([]*blob.Sidecar, len(blobs.Data)) + sidecars = make([]*structs.Sidecar, len(blobs.Data)) for index, value := range blobs.Data { - sidecars[index] = &blob.Sidecar{ + sidecars[index] = &structs.Sidecar{ KzgCommitment: value.KzgCommitment, Blob: value.Blob, } @@ -135,7 +134,7 @@ func (ds *BlobDataSource) getBlobFromServer(ctx context.Context, blobHash common SetHeader("Accept", "application/json"). Get(requestURL) if err != nil { - return nil, err + return nil, fmt.Errorf("failed to get blob from server, request_url: %s, err: %w", requestURL, err) } if !resp.IsSuccess() { return nil, fmt.Errorf( diff --git a/packages/taiko-client/pkg/rpc/blob_datasource_test.go b/packages/taiko-client/pkg/rpc/blob_datasource_test.go deleted file mode 100644 index 3f2f78873d3..00000000000 --- a/packages/taiko-client/pkg/rpc/blob_datasource_test.go +++ /dev/null @@ -1,34 +0,0 @@ -package rpc - -import ( - "context" - "net/url" - "testing" - - "github.com/ethereum/go-ethereum/common" - "github.com/stretchr/testify/require" - - "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings" -) - -func TestGetBlobsFromBlobScan(t *testing.T) { - blobScanEndpoint, err := url.Parse("https://api.holesky.blobscan.com") - require.Nil(t, err) - require.NotNil(t, blobScanEndpoint) - ds := NewBlobDataSource( - context.Background(), - &Client{}, - blobScanEndpoint, - nil, - ) - sidecars, err := ds.GetBlobs( - context.Background(), - &bindings.TaikoDataBlockMetadata{ - BlobHash: common.HexToHash("0x0145185449c57dee4e6c921b702e5d572fbeb026f96c220a6a17b79d157d921b"), - BlobUsed: true, - }, - ) - require.Nil(t, err) - require.NotNil(t, sidecars) - require.NotNil(t, sidecars[0].Blob) -} diff --git a/packages/taiko-client/pkg/rpc/client.go b/packages/taiko-client/pkg/rpc/client.go index f9be27f341a..461a77c599e 100644 --- a/packages/taiko-client/pkg/rpc/client.go +++ b/packages/taiko-client/pkg/rpc/client.go @@ -2,6 +2,7 @@ package rpc import ( "context" + "fmt" "os" "time" @@ -28,6 +29,7 @@ type Client struct { L1Beacon *BeaconClient // Protocol contracts clients TaikoL1 *bindings.TaikoL1Client + LibProposing *bindings.LibProposing TaikoL2 *bindings.TaikoL2Client TaikoToken *bindings.TaikoToken GuardianProverMajority *bindings.GuardianProver @@ -56,6 +58,7 @@ type ClientConfig struct { // NewClient initializes all RPC clients used by Taiko client software. func NewClient(ctx context.Context, cfg *ClientConfig) (*Client, error) { + log.Debug("Initializing new RPC client") var ( l1Client *EthClient l2Client *EthClient @@ -66,18 +69,21 @@ func NewClient(ctx context.Context, cfg *ClientConfig) (*Client, error) { // Keep retrying to connect to the RPC endpoints until success or context is cancelled. if err := backoff.Retry(func() error { - ctxWithTimeout, cancel := ctxWithTimeoutOrDefault(ctx, defaultTimeout) + log.Debug("Attempting to connect to RPC endpoints") + ctxWithTimeout, cancel := CtxWithTimeoutOrDefault(ctx, defaultTimeout) defer cancel() if l1Client, err = NewEthClient(ctxWithTimeout, cfg.L1Endpoint, cfg.Timeout); err != nil { log.Error("Failed to connect to L1 endpoint, retrying", "endpoint", cfg.L1Endpoint, "err", err) return err } + log.Debug("Successfully connected to L1 endpoint", "endpoint", cfg.L1Endpoint) if l2Client, err = NewEthClient(ctxWithTimeout, cfg.L2Endpoint, cfg.Timeout); err != nil { log.Error("Failed to connect to L2 endpoint, retrying", "endpoint", cfg.L2Endpoint, "err", err) return err } + log.Debug("Successfully connected to L2 endpoint", "endpoint", cfg.L2Endpoint) // NOTE: when running tests, we do not have a L1 beacon endpoint. if cfg.L1BeaconEndpoint != "" && os.Getenv("RUN_TESTS") == "" { @@ -85,6 +91,7 @@ func NewClient(ctx context.Context, cfg *ClientConfig) (*Client, error) { log.Error("Failed to connect to L1 beacon endpoint, retrying", "endpoint", cfg.L1BeaconEndpoint, "err", err) return err } + log.Debug("Successfully connected to L1 beacon endpoint", "endpoint", cfg.L1BeaconEndpoint) } if cfg.L2CheckPoint != "" { @@ -93,6 +100,7 @@ func NewClient(ctx context.Context, cfg *ClientConfig) (*Client, error) { log.Error("Failed to connect to L2 checkpoint endpoint, retrying", "endpoint", cfg.L2CheckPoint, "err", err) return err } + log.Debug("Successfully connected to L2 checkpoint endpoint", "endpoint", cfg.L2CheckPoint) } return nil @@ -100,18 +108,26 @@ func NewClient(ctx context.Context, cfg *ClientConfig) (*Client, error) { return nil, err } - ctxWithTimeout, cancel := ctxWithTimeoutOrDefault(ctx, defaultTimeout) + log.Debug("Initializing contract clients") + ctxWithTimeout, cancel := CtxWithTimeoutOrDefault(ctx, defaultTimeout) defer cancel() taikoL1, err := bindings.NewTaikoL1Client(cfg.TaikoL1Address, l1Client) if err != nil { - return nil, err + return nil, fmt.Errorf("failed to initialize TaikoL1 client: %w", err) + } + log.Debug("TaikoL1 client initialized", "address", cfg.TaikoL1Address) + + libProposing, err := bindings.NewLibProposing(cfg.TaikoL1Address, l1Client) + if err != nil { + return nil, fmt.Errorf("failed to initialize LibProposing: %w", err) } taikoL2, err := bindings.NewTaikoL2Client(cfg.TaikoL2Address, l2Client) if err != nil { - return nil, err + return nil, fmt.Errorf("failed to initialize TaikoL2 client: %w", err) } + log.Debug("TaikoL2 client initialized", "address", cfg.TaikoL2Address) var ( taikoToken *bindings.TaikoToken @@ -121,22 +137,23 @@ func NewClient(ctx context.Context, cfg *ClientConfig) (*Client, error) { ) if cfg.TaikoTokenAddress.Hex() != ZeroAddress.Hex() { if taikoToken, err = bindings.NewTaikoToken(cfg.TaikoTokenAddress, l1Client); err != nil { - return nil, err + return nil, fmt.Errorf("failed to initialize TaikoToken: %w", err) } + log.Debug("TaikoToken initialized", "address", cfg.TaikoTokenAddress) } if cfg.GuardianProverMinorityAddress.Hex() != ZeroAddress.Hex() { if guardianProverMinority, err = bindings.NewGuardianProver(cfg.GuardianProverMinorityAddress, l1Client); err != nil { - return nil, err + return nil, fmt.Errorf("failed to initialize GuardianProverMinority: %w", err) } } if cfg.GuardianProverMajorityAddress.Hex() != ZeroAddress.Hex() { if guardianProverMajority, err = bindings.NewGuardianProver(cfg.GuardianProverMajorityAddress, l1Client); err != nil { - return nil, err + return nil, fmt.Errorf("failed to initialize GuardianProverMajority: %w", err) } } if cfg.ProverSetAddress.Hex() != ZeroAddress.Hex() { if proverSet, err = bindings.NewProverSet(cfg.ProverSetAddress, l1Client); err != nil { - return nil, err + return nil, fmt.Errorf("failed to initialize ProverSet: %w", err) } } @@ -144,9 +161,10 @@ func NewClient(ctx context.Context, cfg *ClientConfig) (*Client, error) { // won't be initialized. var l2AuthClient *EngineClient if len(cfg.L2EngineEndpoint) != 0 && len(cfg.JwtSecret) != 0 { + log.Debug("Initializing L2 Engine client", "endpoint", cfg.L2EngineEndpoint) l2AuthClient, err = NewJWTEngineClient(cfg.L2EngineEndpoint, cfg.JwtSecret) if err != nil { - return nil, err + return nil, fmt.Errorf("failed to initialize L2 Engine client: %w", err) } } @@ -157,6 +175,7 @@ func NewClient(ctx context.Context, cfg *ClientConfig) (*Client, error) { L2CheckPoint: l2CheckPoint, L2Engine: l2AuthClient, TaikoL1: taikoL1, + LibProposing: libProposing, TaikoL2: taikoL2, TaikoToken: taikoToken, GuardianProverMajority: guardianProverMajority, @@ -165,8 +184,9 @@ func NewClient(ctx context.Context, cfg *ClientConfig) (*Client, error) { } if err := client.ensureGenesisMatched(ctxWithTimeout); err != nil { - return nil, err + return nil, fmt.Errorf("genesis mismatch detected: %w", err) } + log.Debug("RPC client initialization completed successfully") return client, nil } diff --git a/packages/taiko-client/pkg/rpc/client_test.go b/packages/taiko-client/pkg/rpc/client_test.go index 7bdfc414d0e..b6ca88c9a45 100644 --- a/packages/taiko-client/pkg/rpc/client_test.go +++ b/packages/taiko-client/pkg/rpc/client_test.go @@ -12,13 +12,12 @@ import ( func newTestClient(t *testing.T) *Client { client, err := NewClient(context.Background(), &ClientConfig{ - L1Endpoint: os.Getenv("L1_NODE_WS_ENDPOINT"), - L2Endpoint: os.Getenv("L2_EXECUTION_ENGINE_WS_ENDPOINT"), - TaikoL1Address: common.HexToAddress(os.Getenv("TAIKO_L1_ADDRESS")), - TaikoL2Address: common.HexToAddress(os.Getenv("TAIKO_L2_ADDRESS")), - TaikoTokenAddress: common.HexToAddress(os.Getenv("TAIKO_TOKEN_ADDRESS")), - ProverSetAddress: common.HexToAddress(os.Getenv("PROVER_SET_ADDRESS")), - L2EngineEndpoint: os.Getenv("L2_EXECUTION_ENGINE_AUTH_ENDPOINT"), + L1Endpoint: os.Getenv("L1_WS"), + L2Endpoint: os.Getenv("L2_WS"), + TaikoL1Address: common.HexToAddress(os.Getenv("TAIKO_L1")), + TaikoL2Address: common.HexToAddress(os.Getenv("TAIKO_L2")), + TaikoTokenAddress: common.HexToAddress(os.Getenv("TAIKO_TOKEN")), + L2EngineEndpoint: os.Getenv("L2_AUTH"), JwtSecret: os.Getenv("JWT_SECRET"), }) @@ -30,13 +29,12 @@ func newTestClient(t *testing.T) *Client { func newTestClientWithTimeout(t *testing.T) *Client { client, err := NewClient(context.Background(), &ClientConfig{ - L1Endpoint: os.Getenv("L1_NODE_WS_ENDPOINT"), - L2Endpoint: os.Getenv("L2_EXECUTION_ENGINE_WS_ENDPOINT"), - TaikoL1Address: common.HexToAddress(os.Getenv("TAIKO_L1_ADDRESS")), - TaikoL2Address: common.HexToAddress(os.Getenv("TAIKO_L2_ADDRESS")), - TaikoTokenAddress: common.HexToAddress(os.Getenv("TAIKO_TOKEN_ADDRESS")), - ProverSetAddress: common.HexToAddress(os.Getenv("PROVER_SET_ADDRESS")), - L2EngineEndpoint: os.Getenv("L2_EXECUTION_ENGINE_AUTH_ENDPOINT"), + L1Endpoint: os.Getenv("L1_WS"), + L2Endpoint: os.Getenv("L2_WS"), + TaikoL1Address: common.HexToAddress(os.Getenv("TAIKO_L1")), + TaikoL2Address: common.HexToAddress(os.Getenv("TAIKO_L2")), + TaikoTokenAddress: common.HexToAddress(os.Getenv("TAIKO_TOKEN")), + L2EngineEndpoint: os.Getenv("L2_AUTH"), JwtSecret: os.Getenv("JWT_SECRET"), Timeout: 5 * time.Second, }) diff --git a/packages/taiko-client/pkg/rpc/dial.go b/packages/taiko-client/pkg/rpc/dial.go index 985ec0db5fb..e9649686525 100644 --- a/packages/taiko-client/pkg/rpc/dial.go +++ b/packages/taiko-client/pkg/rpc/dial.go @@ -11,7 +11,7 @@ import ( "github.com/ethereum/go-ethereum/rpc" ) -// DialClientWithBackoff connects a ethereum RPC client at the given URL with +// DialClientWithBackoff connects an ethereum RPC client at the given URL with // a backoff strategy. Added a retry limit so it doesn't retry endlessly func DialClientWithBackoff( ctx context.Context, @@ -21,7 +21,7 @@ func DialClientWithBackoff( var client *ethclient.Client if err := backoff.Retry( func() (err error) { - ctxWithTimeout, cancel := ctxWithTimeoutOrDefault(ctx, defaultTimeout) + ctxWithTimeout, cancel := CtxWithTimeoutOrDefault(ctx, defaultTimeout) defer cancel() client, err = ethclient.DialContext(ctxWithTimeout, url) @@ -52,7 +52,7 @@ func DialEngineClientWithBackoff( var engineClient *EngineClient if err := backoff.Retry( func() (err error) { - ctxWithTimeout, cancel := ctxWithTimeoutOrDefault(ctx, defaultTimeout) + ctxWithTimeout, cancel := CtxWithTimeoutOrDefault(ctx, defaultTimeout) defer cancel() jwtAuth := node.NewJWTAuth(StringToBytes32(jwtSecret)) diff --git a/packages/taiko-client/pkg/rpc/dial_test.go b/packages/taiko-client/pkg/rpc/dial_test.go index c07cfae08bb..f488d781230 100644 --- a/packages/taiko-client/pkg/rpc/dial_test.go +++ b/packages/taiko-client/pkg/rpc/dial_test.go @@ -15,13 +15,12 @@ import ( func TestDialEngineClientWithBackoff(t *testing.T) { jwtSecret, err := jwt.ParseSecretFromFile(os.Getenv("JWT_SECRET")) - require.Nil(t, err) require.NotEmpty(t, jwtSecret) client, err := DialEngineClientWithBackoff( context.Background(), - os.Getenv("L2_EXECUTION_ENGINE_AUTH_ENDPOINT"), + os.Getenv("L2_AUTH"), string(jwtSecret), 12*time.Second, 10, @@ -38,7 +37,7 @@ func TestDialEngineClientWithBackoff(t *testing.T) { func TestDialClientWithBackoff(t *testing.T) { client, err := DialClientWithBackoff( context.Background(), - os.Getenv("L2_EXECUTION_ENGINE_WS_ENDPOINT"), + os.Getenv("L2_WS"), 12*time.Second, 10, ) diff --git a/packages/taiko-client/pkg/rpc/engine.go b/packages/taiko-client/pkg/rpc/engine.go index e1ec3a5c841..24012f88175 100644 --- a/packages/taiko-client/pkg/rpc/engine.go +++ b/packages/taiko-client/pkg/rpc/engine.go @@ -19,6 +19,7 @@ type EngineClient struct { *rpc.Client } +// NewJWTEngineClient creates a new EngineClient with JWT authentication. func NewJWTEngineClient(url, jwtSecret string) (*EngineClient, error) { var jwt = StringToBytes32(jwtSecret) if jwt == (common.Hash{}) || url == "" { @@ -99,8 +100,8 @@ func (c *EngineClient) ExchangeTransitionConfiguration( return result, nil } -// TxPoolContent fetches the transaction pool content from the L2 execution engine. -func (c *EngineClient) TxPoolContent( +// TxPoolContentWithMinTip fetches the transaction pool content from the L2 execution engine. +func (c *EngineClient) TxPoolContentWithMinTip( ctx context.Context, beneficiary common.Address, baseFee *big.Int, @@ -108,21 +109,23 @@ func (c *EngineClient) TxPoolContent( maxBytesPerTxList uint64, locals []string, maxTransactionsLists uint64, + minTip uint64, ) ([]*miner.PreBuiltTxList, error) { timeoutCtx, cancel := context.WithTimeout(ctx, defaultTimeout) defer cancel() - var result []*miner.PreBuiltTxList + if err := c.CallContext( timeoutCtx, &result, - "taikoAuth_txPoolContent", + "taikoAuth_txPoolContentWithMinTip", beneficiary, baseFee, blockMaxGasLimit, maxBytesPerTxList, locals, maxTransactionsLists, + minTip, ); err != nil { return nil, err } diff --git a/packages/taiko-client/pkg/rpc/ethclient.go b/packages/taiko-client/pkg/rpc/ethclient.go index 4b6c7b7e39e..6b5e0312f3d 100644 --- a/packages/taiko-client/pkg/rpc/ethclient.go +++ b/packages/taiko-client/pkg/rpc/ethclient.go @@ -2,6 +2,8 @@ package rpc import ( "context" + "errors" + "fmt" "math/big" "time" @@ -14,10 +16,16 @@ import ( "github.com/ethereum/go-ethereum/rpc" ) +var ( + ErrInvalidLenOfParams = errors.New("invalid length of parameters") +) + +// gethClient is a wrapper for go-ethereum geth client. type gethClient struct { *gethclient.Client } +// ethClient is a wrapper for go-ethereum eth client. type ethClient struct { *ethclient.Client } @@ -33,6 +41,7 @@ type EthClient struct { timeout time.Duration } +// NewEthClient creates a new EthClient instance. func NewEthClient(ctx context.Context, url string, timeout time.Duration) (*EthClient, error) { var timeoutVal = defaultTimeout if timeout != 0 { @@ -65,19 +74,47 @@ func NewEthClient(ctx context.Context, url string, timeout time.Duration) (*EthC // Note that loading full blocks requires two requests. Use HeaderByHash // if you don't need all transactions or uncle headers. func (c *EthClient) BlockByHash(ctx context.Context, hash common.Hash) (*types.Block, error) { - ctxWithTimeout, cancel := ctxWithTimeoutOrDefault(ctx, c.timeout) + ctxWithTimeout, cancel := CtxWithTimeoutOrDefault(ctx, c.timeout) defer cancel() return c.ethClient.BlockByHash(ctxWithTimeout, hash) } +func (c *EthClient) BatchBlocksByHashes(ctx context.Context, hashes []common.Hash) ([]*types.Block, error) { + if len(hashes) < 1 { + return nil, ErrInvalidLenOfParams + } + ctxWithTimeout, cancel := CtxWithTimeoutOrDefault(ctx, c.timeout) + defer cancel() + + reqs := make([]rpc.BatchElem, len(hashes)) + results := make([]*types.Block, len(hashes)) + for i, hash := range hashes { + reqs[i] = rpc.BatchElem{ + Method: "eth_getBlockByHash", + Args: []interface{}{hash, true}, + Result: &results[i], + } + } + if err := c.BatchCallContext(ctxWithTimeout, reqs); err != nil { + return nil, err + } + for i := range reqs { + if reqs[i].Error != nil { + return nil, reqs[i].Error + } + } + + return results, nil +} + // BlockByNumber returns a block from the current canonical chain. If number is nil, the // latest known block is returned. // // Note that loading full blocks requires two requests. Use HeaderByNumber // if you don't need all transactions or uncle headers. func (c *EthClient) BlockByNumber(ctx context.Context, number *big.Int) (*types.Block, error) { - ctxWithTimeout, cancel := ctxWithTimeoutOrDefault(ctx, c.timeout) + ctxWithTimeout, cancel := CtxWithTimeoutOrDefault(ctx, c.timeout) defer cancel() return c.ethClient.BlockByNumber(ctxWithTimeout, number) @@ -85,7 +122,7 @@ func (c *EthClient) BlockByNumber(ctx context.Context, number *big.Int) (*types. // BlockNumber returns the most recent block number func (c *EthClient) BlockNumber(ctx context.Context) (uint64, error) { - ctxWithTimeout, cancel := ctxWithTimeoutOrDefault(ctx, c.timeout) + ctxWithTimeout, cancel := CtxWithTimeoutOrDefault(ctx, c.timeout) defer cancel() return c.ethClient.BlockNumber(ctxWithTimeout) @@ -93,7 +130,7 @@ func (c *EthClient) BlockNumber(ctx context.Context) (uint64, error) { // PeerCount returns the number of p2p peers as reported by the net_peerCount method. func (c *EthClient) PeerCount(ctx context.Context) (uint64, error) { - ctxWithTimeout, cancel := ctxWithTimeoutOrDefault(ctx, c.timeout) + ctxWithTimeout, cancel := CtxWithTimeoutOrDefault(ctx, c.timeout) defer cancel() return c.ethClient.PeerCount(ctxWithTimeout) @@ -101,7 +138,7 @@ func (c *EthClient) PeerCount(ctx context.Context) (uint64, error) { // HeaderByHash returns the block header with the given hash. func (c *EthClient) HeaderByHash(ctx context.Context, hash common.Hash) (*types.Header, error) { - ctxWithTimeout, cancel := ctxWithTimeoutOrDefault(ctx, c.timeout) + ctxWithTimeout, cancel := CtxWithTimeoutOrDefault(ctx, c.timeout) defer cancel() return c.ethClient.HeaderByHash(ctxWithTimeout, hash) @@ -110,18 +147,61 @@ func (c *EthClient) HeaderByHash(ctx context.Context, hash common.Hash) (*types. // HeaderByNumber returns a block header from the current canonical chain. If number is // nil, the latest known header is returned. func (c *EthClient) HeaderByNumber(ctx context.Context, number *big.Int) (*types.Header, error) { - ctxWithTimeout, cancel := ctxWithTimeoutOrDefault(ctx, c.timeout) + ctxWithTimeout, cancel := CtxWithTimeoutOrDefault(ctx, c.timeout) defer cancel() return c.ethClient.HeaderByNumber(ctxWithTimeout, number) } +func (c *EthClient) BatchHeadersByNumbers(ctx context.Context, numbers []*big.Int) ([]*types.Header, error) { + if len(numbers) < 1 { + return nil, ErrInvalidLenOfParams + } + ctxWithTimeout, cancel := CtxWithTimeoutOrDefault(ctx, c.timeout) + defer cancel() + + reqs := make([]rpc.BatchElem, len(numbers)) + results := make([]*types.Header, len(numbers)) + for i, blockNum := range numbers { + reqs[i] = rpc.BatchElem{ + Method: "eth_getBlockByNumber", + Args: []interface{}{toBlockNumArg(blockNum), false}, + Result: &results[i], + } + } + if err := c.BatchCallContext(ctxWithTimeout, reqs); err != nil { + return nil, err + } + for i := range reqs { + if reqs[i].Error != nil { + return nil, reqs[i].Error + } + } + + return results, nil +} + +func toBlockNumArg(number *big.Int) string { + if number == nil { + return "latest" + } + if number.Sign() >= 0 { + return hexutil.EncodeBig(number) + } + // It's negative. + if number.IsInt64() { + return rpc.BlockNumber(number.Int64()).String() + } + // It's negative and large, which is invalid. + return fmt.Sprintf("", number) +} + // TransactionByHash returns the transaction with the given hash. func (c *EthClient) TransactionByHash( ctx context.Context, hash common.Hash, ) (tx *types.Transaction, isPending bool, err error) { - ctxWithTimeout, cancel := ctxWithTimeoutOrDefault(ctx, c.timeout) + ctxWithTimeout, cancel := CtxWithTimeoutOrDefault(ctx, c.timeout) defer cancel() return c.ethClient.TransactionByHash(ctxWithTimeout, hash) @@ -139,7 +219,7 @@ func (c *EthClient) TransactionSender( block common.Hash, index uint, ) (common.Address, error) { - ctxWithTimeout, cancel := ctxWithTimeoutOrDefault(ctx, c.timeout) + ctxWithTimeout, cancel := CtxWithTimeoutOrDefault(ctx, c.timeout) defer cancel() return c.ethClient.TransactionSender(ctxWithTimeout, tx, block, index) @@ -147,7 +227,7 @@ func (c *EthClient) TransactionSender( // TransactionCount returns the total number of transactions in the given block. func (c *EthClient) TransactionCount(ctx context.Context, blockHash common.Hash) (uint, error) { - ctxWithTimeout, cancel := ctxWithTimeoutOrDefault(ctx, c.timeout) + ctxWithTimeout, cancel := CtxWithTimeoutOrDefault(ctx, c.timeout) defer cancel() return c.ethClient.TransactionCount(ctxWithTimeout, blockHash) @@ -159,7 +239,7 @@ func (c *EthClient) TransactionInBlock( blockHash common.Hash, index uint, ) (*types.Transaction, error) { - ctxWithTimeout, cancel := ctxWithTimeoutOrDefault(ctx, c.timeout) + ctxWithTimeout, cancel := CtxWithTimeoutOrDefault(ctx, c.timeout) defer cancel() return c.ethClient.TransactionInBlock(ctxWithTimeout, blockHash, index) @@ -168,7 +248,7 @@ func (c *EthClient) TransactionInBlock( // SyncProgress retrieves the current progress of the sync algorithm. If there's // no sync currently running, it returns nil. func (c *EthClient) SyncProgress(ctx context.Context) (*ethereum.SyncProgress, error) { - ctxWithTimeout, cancel := ctxWithTimeoutOrDefault(ctx, c.timeout) + ctxWithTimeout, cancel := CtxWithTimeoutOrDefault(ctx, c.timeout) defer cancel() return c.ethClient.SyncProgress(ctxWithTimeout) @@ -176,7 +256,7 @@ func (c *EthClient) SyncProgress(ctx context.Context) (*ethereum.SyncProgress, e // NetworkID returns the network ID for this client. func (c *EthClient) NetworkID(ctx context.Context) (*big.Int, error) { - ctxWithTimeout, cancel := ctxWithTimeoutOrDefault(ctx, c.timeout) + ctxWithTimeout, cancel := CtxWithTimeoutOrDefault(ctx, c.timeout) defer cancel() return c.ethClient.NetworkID(ctxWithTimeout) @@ -189,7 +269,7 @@ func (c *EthClient) BalanceAt( account common.Address, blockNumber *big.Int, ) (*big.Int, error) { - ctxWithTimeout, cancel := ctxWithTimeoutOrDefault(ctx, c.timeout) + ctxWithTimeout, cancel := CtxWithTimeoutOrDefault(ctx, c.timeout) defer cancel() return c.ethClient.BalanceAt(ctxWithTimeout, account, blockNumber) @@ -203,7 +283,7 @@ func (c *EthClient) StorageAt( key common.Hash, blockNumber *big.Int, ) ([]byte, error) { - ctxWithTimeout, cancel := ctxWithTimeoutOrDefault(ctx, c.timeout) + ctxWithTimeout, cancel := CtxWithTimeoutOrDefault(ctx, c.timeout) defer cancel() return c.ethClient.StorageAt(ctxWithTimeout, account, key, blockNumber) @@ -216,7 +296,7 @@ func (c *EthClient) CodeAt( account common.Address, blockNumber *big.Int, ) ([]byte, error) { - ctxWithTimeout, cancel := ctxWithTimeoutOrDefault(ctx, c.timeout) + ctxWithTimeout, cancel := CtxWithTimeoutOrDefault(ctx, c.timeout) defer cancel() return c.ethClient.CodeAt(ctxWithTimeout, account, blockNumber) @@ -229,7 +309,7 @@ func (c *EthClient) NonceAt( account common.Address, blockNumber *big.Int, ) (uint64, error) { - ctxWithTimeout, cancel := ctxWithTimeoutOrDefault(ctx, c.timeout) + ctxWithTimeout, cancel := CtxWithTimeoutOrDefault(ctx, c.timeout) defer cancel() return c.ethClient.NonceAt(ctxWithTimeout, account, blockNumber) @@ -237,7 +317,7 @@ func (c *EthClient) NonceAt( // PendingBalanceAt returns the wei balance of the given account in the pending state. func (c *EthClient) PendingBalanceAt(ctx context.Context, account common.Address) (*big.Int, error) { - ctxWithTimeout, cancel := ctxWithTimeoutOrDefault(ctx, c.timeout) + ctxWithTimeout, cancel := CtxWithTimeoutOrDefault(ctx, c.timeout) defer cancel() return c.ethClient.PendingBalanceAt(ctxWithTimeout, account) @@ -249,7 +329,7 @@ func (c *EthClient) PendingStorageAt( account common.Address, key common.Hash, ) ([]byte, error) { - ctxWithTimeout, cancel := ctxWithTimeoutOrDefault(ctx, c.timeout) + ctxWithTimeout, cancel := CtxWithTimeoutOrDefault(ctx, c.timeout) defer cancel() return c.ethClient.PendingStorageAt(ctxWithTimeout, account, key) @@ -257,7 +337,7 @@ func (c *EthClient) PendingStorageAt( // PendingCodeAt returns the contract code of the given account in the pending state. func (c *EthClient) PendingCodeAt(ctx context.Context, account common.Address) ([]byte, error) { - ctxWithTimeout, cancel := ctxWithTimeoutOrDefault(ctx, c.timeout) + ctxWithTimeout, cancel := CtxWithTimeoutOrDefault(ctx, c.timeout) defer cancel() return c.ethClient.PendingCodeAt(ctxWithTimeout, account) @@ -266,7 +346,7 @@ func (c *EthClient) PendingCodeAt(ctx context.Context, account common.Address) ( // PendingNonceAt returns the account nonce of the given account in the pending state. // This is the nonce that should be used for the next transaction. func (c *EthClient) PendingNonceAt(ctx context.Context, account common.Address) (uint64, error) { - ctxWithTimeout, cancel := ctxWithTimeoutOrDefault(ctx, c.timeout) + ctxWithTimeout, cancel := CtxWithTimeoutOrDefault(ctx, c.timeout) defer cancel() return c.ethClient.PendingNonceAt(ctxWithTimeout, account) @@ -274,7 +354,7 @@ func (c *EthClient) PendingNonceAt(ctx context.Context, account common.Address) // PendingTransactionCount returns the total number of transactions in the pending state. func (c *EthClient) PendingTransactionCount(ctx context.Context) (uint, error) { - ctxWithTimeout, cancel := ctxWithTimeoutOrDefault(ctx, c.timeout) + ctxWithTimeout, cancel := CtxWithTimeoutOrDefault(ctx, c.timeout) defer cancel() return c.ethClient.PendingTransactionCount(ctxWithTimeout) @@ -291,7 +371,7 @@ func (c *EthClient) CallContract( msg ethereum.CallMsg, blockNumber *big.Int, ) ([]byte, error) { - ctxWithTimeout, cancel := ctxWithTimeoutOrDefault(ctx, c.timeout) + ctxWithTimeout, cancel := CtxWithTimeoutOrDefault(ctx, c.timeout) defer cancel() return c.ethClient.CallContract(ctxWithTimeout, msg, blockNumber) @@ -304,7 +384,7 @@ func (c *EthClient) CallContractAtHash( msg ethereum.CallMsg, blockHash common.Hash, ) ([]byte, error) { - ctxWithTimeout, cancel := ctxWithTimeoutOrDefault(ctx, c.timeout) + ctxWithTimeout, cancel := CtxWithTimeoutOrDefault(ctx, c.timeout) defer cancel() return c.ethClient.CallContractAtHash(ctxWithTimeout, msg, blockHash) @@ -313,7 +393,7 @@ func (c *EthClient) CallContractAtHash( // PendingCallContract executes a message call transaction using the EVM. // The state seen by the contract call is the pending state. func (c *EthClient) PendingCallContract(ctx context.Context, msg ethereum.CallMsg) ([]byte, error) { - ctxWithTimeout, cancel := ctxWithTimeoutOrDefault(ctx, c.timeout) + ctxWithTimeout, cancel := CtxWithTimeoutOrDefault(ctx, c.timeout) defer cancel() return c.ethClient.PendingCallContract(ctxWithTimeout, msg) @@ -322,7 +402,7 @@ func (c *EthClient) PendingCallContract(ctx context.Context, msg ethereum.CallMs // SuggestGasPrice retrieves the currently suggested gas price to allow a timely // execution of a transaction. func (c *EthClient) SuggestGasPrice(ctx context.Context) (*big.Int, error) { - ctxWithTimeout, cancel := ctxWithTimeoutOrDefault(ctx, c.timeout) + ctxWithTimeout, cancel := CtxWithTimeoutOrDefault(ctx, c.timeout) defer cancel() return c.ethClient.SuggestGasPrice(ctxWithTimeout) @@ -331,7 +411,7 @@ func (c *EthClient) SuggestGasPrice(ctx context.Context) (*big.Int, error) { // SuggestGasTipCap retrieves the currently suggested gas tip cap after 1559 to // allow a timely execution of a transaction. func (c *EthClient) SuggestGasTipCap(ctx context.Context) (*big.Int, error) { - ctxWithTimeout, cancel := ctxWithTimeoutOrDefault(ctx, c.timeout) + ctxWithTimeout, cancel := CtxWithTimeoutOrDefault(ctx, c.timeout) defer cancel() return c.ethClient.SuggestGasTipCap(ctxWithTimeout) @@ -344,7 +424,7 @@ func (c *EthClient) FeeHistory( lastBlock *big.Int, rewardPercentiles []float64, ) (*ethereum.FeeHistory, error) { - ctxWithTimeout, cancel := ctxWithTimeoutOrDefault(ctx, c.timeout) + ctxWithTimeout, cancel := CtxWithTimeoutOrDefault(ctx, c.timeout) defer cancel() return c.ethClient.FeeHistory(ctxWithTimeout, blockCount, lastBlock, rewardPercentiles) @@ -355,7 +435,7 @@ func (c *EthClient) FeeHistory( // the true gas limit requirement as other transactions may be added or removed by miners, // but it should provide a basis for setting a reasonable default. func (c *EthClient) EstimateGas(ctx context.Context, msg ethereum.CallMsg) (uint64, error) { - ctxWithTimeout, cancel := ctxWithTimeoutOrDefault(ctx, c.timeout) + ctxWithTimeout, cancel := CtxWithTimeoutOrDefault(ctx, c.timeout) defer cancel() return c.ethClient.EstimateGas(ctxWithTimeout, msg) @@ -366,7 +446,7 @@ func (c *EthClient) EstimateGas(ctx context.Context, msg ethereum.CallMsg) (uint // If the transaction was a contract creation use the TransactionReceipt method to get the // contract address after the transaction has been mined. func (c *EthClient) SendTransaction(ctx context.Context, tx *types.Transaction) error { - ctxWithTimeout, cancel := ctxWithTimeoutOrDefault(ctx, c.timeout) + ctxWithTimeout, cancel := CtxWithTimeoutOrDefault(ctx, c.timeout) defer cancel() return c.ethClient.SendTransaction(ctxWithTimeout, tx) @@ -405,9 +485,9 @@ type SignTransactionResult struct { Tx *types.Transaction `json:"tx"` } -// FillTransaction fill transaction. +// FillTransaction fills in the missing fields of a transaction and signs it. func (c *EthClient) FillTransaction(ctx context.Context, args *TransactionArgs) (*types.Transaction, error) { - ctxWithTimeout, cancel := ctxWithTimeoutOrDefault(ctx, c.timeout) + ctxWithTimeout, cancel := CtxWithTimeoutOrDefault(ctx, c.timeout) defer cancel() var result SignTransactionResult diff --git a/packages/taiko-client/pkg/rpc/ethclient_test.go b/packages/taiko-client/pkg/rpc/ethclient_test.go index 3739482b63d..608b2e9773a 100644 --- a/packages/taiko-client/pkg/rpc/ethclient_test.go +++ b/packages/taiko-client/pkg/rpc/ethclient_test.go @@ -2,6 +2,7 @@ package rpc import ( "context" + "math/big" "testing" "github.com/ethereum/go-ethereum" @@ -168,3 +169,28 @@ func TestEstimateGas(t *testing.T) { _, err := client.L1.EstimateGas(context.Background(), ethereum.CallMsg{}) require.Nil(t, err) } + +func TestBatchBlocksByNumbers(t *testing.T) { + client := newTestClientWithTimeout(t) + + headers, err := client.L1.BatchHeadersByNumbers(context.Background(), []*big.Int{big.NewInt(0), big.NewInt(1)}) + require.Nil(t, err) + require.Len(t, headers, 2) +} + +func TestBatchBlocksByHashes(t *testing.T) { + client := newTestClientWithTimeout(t) + + headers, err := client.L1.BatchHeadersByNumbers(context.Background(), []*big.Int{big.NewInt(0), big.NewInt(1)}) + require.Nil(t, err) + require.Len(t, headers, 2) + + hashes := make([]common.Hash, len(headers)) + for i, header := range headers { + hashes[i] = header.Hash() + } + + blocks, err := client.L1.BatchBlocksByHashes(context.Background(), hashes) + require.Nil(t, err) + require.Len(t, blocks, 2) +} diff --git a/packages/taiko-client/pkg/rpc/fallback.go b/packages/taiko-client/pkg/rpc/fallback.go deleted file mode 100644 index 6237f2105a0..00000000000 --- a/packages/taiko-client/pkg/rpc/fallback.go +++ /dev/null @@ -1,29 +0,0 @@ -package rpc - -import ( - "errors" - "math/big" - "strings" -) - -// Taken from: -// https://github.com/ethereum-optimism/optimism-legacy/blob/develop/bss-core/drivers/max_priority_fee_fallback.go -var ( - //lint:ignore ST1005 allow `errMaxPriorityFeePerGasNotFound` to be capitalized. - errMaxPriorityFeePerGasNotFound = errors.New( - "method eth_maxPriorityFeePerGas not found", - ) - - // FallbackGasTipCap is the default fallback gasTipCap used when we are - // unable to query an L1 backend for a suggested gasTipCap. - FallbackGasTipCap = big.NewInt(1500000000) -) - -// IsMaxPriorityFeePerGasNotFoundError returns true if the provided error -// signals that the backend does not support the eth_maxPriorityFeePerGas -// method. In this case, the caller should fallback to using the constant above. -func IsMaxPriorityFeePerGasNotFoundError(err error) bool { - return strings.Contains( - err.Error(), errMaxPriorityFeePerGasNotFound.Error(), - ) -} diff --git a/packages/taiko-client/pkg/rpc/fallback_test.go b/packages/taiko-client/pkg/rpc/fallback_test.go deleted file mode 100644 index a7d05649dc7..00000000000 --- a/packages/taiko-client/pkg/rpc/fallback_test.go +++ /dev/null @@ -1,13 +0,0 @@ -package rpc - -import ( - "errors" - "testing" - - "github.com/stretchr/testify/require" -) - -func TestIsMaxPriorityFeePerGasNotFoundError(t *testing.T) { - require.False(t, IsMaxPriorityFeePerGasNotFoundError(errors.New("test"))) - require.True(t, IsMaxPriorityFeePerGasNotFoundError(errMaxPriorityFeePerGasNotFound)) -} diff --git a/packages/taiko-client/pkg/rpc/methods.go b/packages/taiko-client/pkg/rpc/methods.go index c15a59ba4ea..93e04c70bf4 100644 --- a/packages/taiko-client/pkg/rpc/methods.go +++ b/packages/taiko-client/pkg/rpc/methods.go @@ -5,6 +5,7 @@ import ( "errors" "fmt" "math/big" + "strings" "time" "github.com/cenkalti/backoff/v4" @@ -19,7 +20,8 @@ import ( "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings" "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/encoding" - "github.com/taikoxyz/taiko-mono/packages/taiko-client/internal/utils" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/config" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/utils" ) var ( @@ -33,48 +35,74 @@ var ( // ensureGenesisMatched fetches the L2 genesis block from TaikoL1 contract, // and checks whether the fetched genesis is same to the node local genesis. func (c *Client) ensureGenesisMatched(ctx context.Context) error { - ctxWithTimeout, cancel := ctxWithTimeoutOrDefault(ctx, defaultTimeout) + ctxWithTimeout, cancel := CtxWithTimeoutOrDefault(ctx, defaultTimeout) defer cancel() stateVars, err := c.GetProtocolStateVariables(&bind.CallOpts{Context: ctxWithTimeout}) if err != nil { + log.Error("error getting protocol state variables", "error", err) return err } - // Fetch the genesis `BlockVerified` event. - iter, err := c.TaikoL1.FilterBlockVerified( - &bind.FilterOpts{Start: stateVars.A.GenesisHeight, End: &stateVars.A.GenesisHeight, Context: ctxWithTimeout}, - []*big.Int{common.Big0}, - nil, - ) + // Fetch the node's genesis block. + nodeGenesis, err := c.L2.HeaderByNumber(ctxWithTimeout, common.Big0) if err != nil { + log.Error("error getting node genesis block", "error", err) return err } - // Fetch the node's genesis block. - nodeGenesis, err := c.L2.HeaderByNumber(ctxWithTimeout, common.Big0) + var ( + l2GenesisHash common.Hash + filterOpts = &bind.FilterOpts{ + Start: stateVars.A.GenesisHeight, + End: &stateVars.A.GenesisHeight, + Context: ctxWithTimeout, + } + ) + + protocolConfigs, err := GetProtocolConfigs(c.TaikoL1, &bind.CallOpts{Context: ctxWithTimeout}) if err != nil { - return err + return fmt.Errorf("error getting protocol configs: %w", err) } - if iter.Next() { - l2GenesisHash := iter.Event.BlockHash + // If chain actives ontake fork from genesis, we need to fetch the genesis block hash from `BlockVerifiedV2` event. + if protocolConfigs.OntakeForkHeight == 0 { + // Fetch the genesis `BlockVerified2` event. + iter, err := c.TaikoL1.FilterBlockVerifiedV2(filterOpts, []*big.Int{common.Big0}, nil) + if err != nil { + return fmt.Errorf("error filtering BlockVerifiedV2 event: %w", err) + } - log.Debug("Genesis hash", "node", nodeGenesis.Hash(), "TaikoL1", common.BytesToHash(l2GenesisHash[:])) + if iter.Next() { + l2GenesisHash = iter.Event.BlockHash + } + } else { + // Fetch the genesis `BlockVerified` event. + iter, err := c.TaikoL1.FilterBlockVerified(filterOpts, []*big.Int{common.Big0}, nil) + if err != nil { + return fmt.Errorf("error filtering BlockVerified event: %w", err) + } - // Node's genesis header and TaikoL1 contract's genesis header must match. - if common.BytesToHash(l2GenesisHash[:]) != nodeGenesis.Hash() { - return fmt.Errorf( - "genesis header hash mismatch, node: %s, TaikoL1 contract: %s", - nodeGenesis.Hash(), - common.BytesToHash(l2GenesisHash[:]), - ) + if iter.Next() { + l2GenesisHash = iter.Event.BlockHash } + } + log.Debug("Genesis hash", "node", nodeGenesis.Hash(), "TaikoL1", common.BytesToHash(l2GenesisHash[:])) + + if l2GenesisHash == (common.Hash{}) { + log.Warn("Genesis block not found in TaikoL1") return nil } - log.Warn("Genesis block not found in TaikoL1") + // Node's genesis header and TaikoL1 contract's genesis header must match. + if common.BytesToHash(l2GenesisHash[:]) != nodeGenesis.Hash() { + return fmt.Errorf( + "genesis header hash mismatch, node: %s, TaikoL1 contract: %s", + nodeGenesis.Hash(), + common.BytesToHash(l2GenesisHash[:]), + ) + } return nil } @@ -93,7 +121,7 @@ func (c *Client) WaitTillL2ExecutionEngineSynced(ctx context.Context) error { return err } - if progress.isSyncing() { + if progress.IsSyncing() { log.Info( "L2 execution engine is syncing", "currentBlockID", progress.CurrentBlockID, @@ -113,7 +141,7 @@ func (c *Client) WaitTillL2ExecutionEngineSynced(ctx context.Context) error { // LatestL2KnownL1Header fetches the L2 execution engine's latest known L1 header, // if we can't find the L1Origin data, we will use the L1 genesis header instead. func (c *Client) LatestL2KnownL1Header(ctx context.Context) (*types.Header, error) { - ctxWithTimeout, cancel := ctxWithTimeoutOrDefault(ctx, defaultTimeout) + ctxWithTimeout, cancel := CtxWithTimeoutOrDefault(ctx, defaultTimeout) defer cancel() // Try to fetch the latest known L1 header from the L2 execution engine. @@ -150,7 +178,7 @@ func (c *Client) LatestL2KnownL1Header(ctx context.Context) (*types.Header, erro // GetGenesisL1Header fetches the L1 header that including L2 genesis block. func (c *Client) GetGenesisL1Header(ctx context.Context) (*types.Header, error) { - ctxWithTimeout, cancel := ctxWithTimeoutOrDefault(ctx, defaultTimeout) + ctxWithTimeout, cancel := CtxWithTimeoutOrDefault(ctx, defaultTimeout) defer cancel() stateVars, err := c.GetProtocolStateVariables(&bind.CallOpts{Context: ctxWithTimeout}) @@ -164,7 +192,7 @@ func (c *Client) GetGenesisL1Header(ctx context.Context) (*types.Header, error) // L2ParentByBlockID fetches the block header from L2 execution engine with the largest block id that // smaller than the given `blockId`. func (c *Client) L2ParentByBlockID(ctx context.Context, blockID *big.Int) (*types.Header, error) { - ctxWithTimeout, cancel := ctxWithTimeoutOrDefault(ctx, defaultTimeout) + ctxWithTimeout, cancel := CtxWithTimeoutOrDefault(ctx, defaultTimeout) defer cancel() var ( @@ -246,6 +274,51 @@ func (c *Client) WaitL2Header(ctx context.Context, blockID *big.Int) (*types.Hea return nil, fmt.Errorf("failed to fetch block header from L2 execution engine, blockID: %d", blockID) } +// CalculateBaseFee calculates the base fee from the L2 protocol. +func (c *Client) CalculateBaseFee( + ctx context.Context, + l2Head *types.Header, + anchorBlockID *big.Int, + isOntake bool, + baseFeeConfig *bindings.LibSharedDataBaseFeeConfig, + currentTimestamp uint64, +) (*big.Int, error) { + var ( + baseFee *big.Int + err error + ) + + if isOntake { + if baseFee, err = c.calculateBaseFeeOntake(ctx, l2Head, currentTimestamp, baseFeeConfig); err != nil { + return nil, err + } + } else { + baseFeeInfo, err := c.TaikoL2.GetBasefee( + &bind.CallOpts{BlockNumber: l2Head.Number, Context: ctx}, + anchorBlockID.Uint64(), + uint32(l2Head.GasUsed), + ) + if err != nil { + return nil, err + } + baseFee = baseFeeInfo.Basefee + } + + if err != nil { + return nil, err + } + + log.Info( + "Base fee information", + "fee", utils.WeiToGWei(baseFee), + "l2Head", l2Head.Number, + "anchorBlockID", anchorBlockID, + "isOntake", isOntake, + ) + + return baseFee, nil +} + // GetPoolContent fetches the transactions list from L2 execution engine's transactions pool with given // upper limit. func (c *Client) GetPoolContent( @@ -255,44 +328,75 @@ func (c *Client) GetPoolContent( maxBytesPerTxList uint64, locals []common.Address, maxTransactionsLists uint64, + minTip uint64, + chainConfig *config.ChainConfig, ) ([]*miner.PreBuiltTxList, error) { - ctxWithTimeout, cancel := ctxWithTimeoutOrDefault(ctx, defaultTimeout) + ctxWithTimeout, cancel := CtxWithTimeoutOrDefault(ctx, defaultTimeout) defer cancel() - l1Head, err := c.L1.HeaderByNumber(ctx, nil) + // Get the latest L2 block header at first. + l2Head, err := c.L2.HeaderByNumber(ctx, nil) if err != nil { return nil, err } - l2Head, err := c.L2.HeaderByNumber(ctx, nil) - if err != nil { + l1Origin, err := c.L2.L1OriginByID(ctx, l2Head.Number) + if err != nil && err.Error() != ethereum.NotFound.Error() { return nil, err } - baseFeeInfo, err := c.TaikoL2.GetBasefee( - &bind.CallOpts{Context: ctx}, - l1Head.Number.Uint64(), - uint32(l2Head.GasUsed), + var ( + L1HeadNum *big.Int + L2HeadNum *big.Int + timestamp = uint64(time.Now().Unix()) ) + + if l1Origin != nil && l1Origin.IsSoftBlock() && !l1Origin.EndOfPreconf && !l1Origin.EndOfBlock { + // Check if this is an unfinished soft block, if not, we will use the latest L1 / L2 block number from the L1Origin. + // Otherwise, we will use the L1 / L2 block number in L1Origin. + L1HeadNum = l1Origin.L1BlockHeight + L2HeadNum = new(big.Int).Sub(l1Origin.BlockID, common.Big1) + } + + l1Head, err := c.L1.HeaderByNumber(ctx, L1HeadNum) if err != nil { return nil, err } - log.Info("Current base fee", "fee", utils.WeiToGWei(baseFeeInfo.Basefee)) + if L2HeadNum != nil { + timestamp = l2Head.Time + l2Head, err = c.L2.HeaderByNumber(ctx, L2HeadNum) + if err != nil { + return nil, err + } + } + + baseFee, err := c.CalculateBaseFee( + ctx, + l2Head, + l1Head.Number, + true, + &chainConfig.ProtocolConfigs.BaseFeeConfig, + timestamp, + ) + if err != nil { + return nil, err + } var localsArg []string for _, local := range locals { localsArg = append(localsArg, local.Hex()) } - return c.L2Engine.TxPoolContent( + return c.L2Engine.TxPoolContentWithMinTip( ctxWithTimeout, beneficiary, - baseFeeInfo.Basefee, + baseFee, uint64(blockMaxGasLimit), maxBytesPerTxList, localsArg, maxTransactionsLists, + minTip, ) } @@ -302,7 +406,7 @@ func (c *Client) L2AccountNonce( account common.Address, height *big.Int, ) (uint64, error) { - ctxWithTimeout, cancel := ctxWithTimeoutOrDefault(ctx, defaultTimeout) + ctxWithTimeout, cancel := CtxWithTimeoutOrDefault(ctx, defaultTimeout) defer cancel() var result hexutil.Uint64 @@ -318,8 +422,8 @@ type L2SyncProgress struct { HighestBlockID *big.Int } -// isSyncing returns true if the L2 execution engine is syncing with L1. -func (p *L2SyncProgress) isSyncing() bool { +// IsSyncing returns true if the L2 execution engine is syncing with L1. +func (p *L2SyncProgress) IsSyncing() bool { if p.SyncProgress == nil { return false } @@ -333,7 +437,7 @@ func (p *L2SyncProgress) isSyncing() bool { // L2ExecutionEngineSyncProgress fetches the sync progress of the given L2 execution engine. func (c *Client) L2ExecutionEngineSyncProgress(ctx context.Context) (*L2SyncProgress, error) { - ctxWithTimeout, cancel := ctxWithTimeoutOrDefault(ctx, defaultTimeout) + ctxWithTimeout, cancel := CtxWithTimeoutOrDefault(ctx, defaultTimeout) defer cancel() var ( @@ -398,12 +502,37 @@ func (c *Client) GetProtocolStateVariables(opts *bind.CallOpts) (*struct { return GetProtocolStateVariables(c.TaikoL1, opts) } +// GetLastVerifiedBlock gets the last verified block from TaikoL1 contract. +func (c *Client) GetLastVerifiedBlock(ctx context.Context) (struct { + BlockId uint64 //nolint:stylecheck + BlockHash [32]byte + StateRoot [32]byte + VerifiedAt uint64 +}, error) { + ctxWithTimeout, cancel := context.WithTimeout(ctx, defaultTimeout) + defer cancel() + + return c.TaikoL1.GetLastVerifiedBlock(&bind.CallOpts{Context: ctxWithTimeout}) +} + // GetL2BlockInfo fetches the L2 block information from the protocol. -func (c *Client) GetL2BlockInfo(ctx context.Context, blockID *big.Int) (bindings.TaikoDataBlock, error) { - ctxWithTimeout, cancel := ctxWithTimeoutOrDefault(ctx, defaultTimeout) +func (c *Client) GetL2BlockInfo(ctx context.Context, blockID *big.Int) (bindings.TaikoDataBlockV2, error) { + ctxWithTimeout, cancel := CtxWithTimeoutOrDefault(ctx, defaultTimeout) + defer cancel() + + blockInfo, err := c.TaikoL1.GetBlock(&bind.CallOpts{Context: ctxWithTimeout}, blockID.Uint64()) + if err != nil { + return bindings.TaikoDataBlockV2{}, err + } + return *encoding.TaikoDataBlockToV2(&blockInfo), nil +} + +// GetL2BlockInfoV2 fetches the V2 L2 block information from the protocol. +func (c *Client) GetL2BlockInfoV2(ctx context.Context, blockID *big.Int) (bindings.TaikoDataBlockV2, error) { + ctxWithTimeout, cancel := CtxWithTimeoutOrDefault(ctx, defaultTimeout) defer cancel() - return c.TaikoL1.GetBlock(&bind.CallOpts{Context: ctxWithTimeout}, blockID.Uint64()) + return c.TaikoL1.GetBlockV2(&bind.CallOpts{Context: ctxWithTimeout}, blockID.Uint64()) } // GetTransition fetches the L2 block's corresponding transition state from the protocol. @@ -412,7 +541,7 @@ func (c *Client) GetTransition( blockID *big.Int, transactionID uint32, ) (bindings.TaikoDataTransitionState, error) { - ctxWithTimeout, cancel := ctxWithTimeoutOrDefault(ctx, defaultTimeout) + ctxWithTimeout, cancel := CtxWithTimeoutOrDefault(ctx, defaultTimeout) defer cancel() return c.TaikoL1.GetTransition( @@ -444,7 +573,7 @@ type ReorgCheckResult struct { func (c *Client) CheckL1Reorg(ctx context.Context, blockID *big.Int) (*ReorgCheckResult, error) { var ( result = new(ReorgCheckResult) - ctxWithTimeout, cancel = ctxWithTimeoutOrDefault(ctx, defaultTimeout) + ctxWithTimeout, cancel = CtxWithTimeoutOrDefault(ctx, defaultTimeout) ) defer cancel() @@ -452,14 +581,14 @@ func (c *Client) CheckL1Reorg(ctx context.Context, blockID *big.Int) (*ReorgChec // If we rollback to the genesis block, then there is no L1Origin information recorded in the L2 execution // engine for that block, so we will query the protocol to use `GenesisHeight` value to reset the L1 cursor. if blockID.Cmp(common.Big0) == 0 { - slotA, _, err := c.TaikoL1.GetStateVariables(&bind.CallOpts{Context: ctxWithTimeout}) + state, err := GetProtocolStateVariables(c.TaikoL1, &bind.CallOpts{Context: ctxWithTimeout}) if err != nil { return result, err } if result.L1CurrentToReset, err = c.L1.HeaderByNumber( ctxWithTimeout, - new(big.Int).SetUint64(slotA.GenesisHeight), + new(big.Int).SetUint64(state.A.GenesisHeight), ); err != nil { return nil, err } @@ -542,7 +671,7 @@ func (c *Client) checkSyncedL1SnippetFromAnchor( blockID *big.Int, l1Height uint64, ) (bool, error) { - log.Info("Check synced L1 snippet from anchor", "blockID", blockID, "l1Height", l1Height) + log.Debug("Check synced L1 snippet from anchor", "blockID", blockID, "l1Height", l1Height) block, err := c.L2.BlockByNumber(ctx, blockID) if err != nil { return false, err @@ -552,23 +681,13 @@ func (c *Client) checkSyncedL1SnippetFromAnchor( return false, err } - l1BlockHash, l1StateRoot, l1HeightInAnchor, parentGasUsed, err := c.getSyncedL1SnippetFromAnchor( + l1StateRoot, l1HeightInAnchor, parentGasUsed, err := c.getSyncedL1SnippetFromAnchor( block.Transactions()[0], ) if err != nil { return false, err } - if l1HeightInAnchor+1 != l1Height { - log.Info( - "Reorg detected due to L1 height mismatch", - "blockID", blockID, - "l1HeightInAnchor", l1HeightInAnchor, - "l1Height", l1Height, - ) - return true, nil - } - if parentGasUsed != uint32(parent.GasUsed()) { log.Info( "Reorg detected due to parent gas used mismatch", @@ -584,16 +703,6 @@ func (c *Client) checkSyncedL1SnippetFromAnchor( return false, err } - if l1Header.Hash() != l1BlockHash { - log.Info( - "Reorg detected due to L1 block hash mismatch", - "blockID", blockID, - "l1BlockHashInAnchor", l1BlockHash, - "l1BlockHash", l1Header.Hash(), - ) - return true, nil - } - if l1Header.Root != l1StateRoot { log.Info( "Reorg detected due to L1 state root mismatch", @@ -611,7 +720,6 @@ func (c *Client) checkSyncedL1SnippetFromAnchor( func (c *Client) getSyncedL1SnippetFromAnchor( tx *types.Transaction, ) ( - l1BlockHash common.Hash, l1StateRoot common.Hash, l1Height uint64, parentGasUsed uint32, @@ -619,53 +727,75 @@ func (c *Client) getSyncedL1SnippetFromAnchor( ) { method, err := encoding.TaikoL2ABI.MethodById(tx.Data()) if err != nil { - return common.Hash{}, common.Hash{}, 0, 0, err + return common.Hash{}, 0, 0, err } - if method.Name != "anchor" { - return common.Hash{}, common.Hash{}, 0, 0, fmt.Errorf("invalid method name for anchor transaction: %s", method.Name) - } + var ok bool + switch method.Name { + case "anchor": + args := map[string]interface{}{} - args := map[string]interface{}{} + if err := method.Inputs.UnpackIntoMap(args, tx.Data()[4:]); err != nil { + return common.Hash{}, 0, 0, err + } - if err := method.Inputs.UnpackIntoMap(args, tx.Data()[4:]); err != nil { - return common.Hash{}, common.Hash{}, 0, 0, err - } + l1StateRoot, ok = args["_l1StateRoot"].([32]byte) + if !ok { + return common.Hash{}, + 0, + 0, + errors.New("failed to parse l1StateRoot from anchor transaction calldata") + } + l1Height, ok = args["_l1BlockId"].(uint64) + if !ok { + return common.Hash{}, + 0, + 0, + errors.New("failed to parse l1Height from anchor transaction calldata") + } + parentGasUsed, ok = args["_parentGasUsed"].(uint32) + if !ok { + return common.Hash{}, + 0, + 0, + errors.New("failed to parse parentGasUsed from anchor transaction calldata") + } + case "anchorV2": + args := map[string]interface{}{} - l1BlockHash, ok := args["_l1BlockHash"].([32]byte) - if !ok { - return common.Hash{}, - common.Hash{}, - 0, - 0, - errors.New("failed to parse l1BlockHash from anchor transaction calldata") - } - l1StateRoot, ok = args["_l1StateRoot"].([32]byte) - if !ok { - return common.Hash{}, - common.Hash{}, - 0, - 0, - errors.New("failed to parse l1StateRoot from anchor transaction calldata") - } - l1Height, ok = args["_l1BlockId"].(uint64) - if !ok { - return common.Hash{}, - common.Hash{}, - 0, - 0, - errors.New("failed to parse l1Height from anchor transaction calldata") - } - parentGasUsed, ok = args["_parentGasUsed"].(uint32) - if !ok { - return common.Hash{}, - common.Hash{}, - 0, - 0, - errors.New("failed to parse parentGasUsed from anchor transaction calldata") + if err := method.Inputs.UnpackIntoMap(args, tx.Data()[4:]); err != nil { + return common.Hash{}, 0, 0, err + } + + l1Height, ok = args["_anchorBlockId"].(uint64) + if !ok { + return common.Hash{}, + 0, + 0, + errors.New("failed to parse anchorBlockId from anchorV2 transaction calldata") + } + l1StateRoot, ok = args["_anchorStateRoot"].([32]byte) + if !ok { + return common.Hash{}, + 0, + 0, + errors.New("failed to parse anchorStateRoot from anchorV2 transaction calldata") + } + parentGasUsed, ok = args["_parentGasUsed"].(uint32) + if !ok { + return common.Hash{}, + 0, + 0, + errors.New("failed to parse parentGasUsed from anchorV2 transaction calldata") + } + default: + return common.Hash{}, 0, 0, fmt.Errorf( + "invalid method name for anchor / anchorV2 transaction: %s", + method.Name, + ) } - return l1BlockHash, l1StateRoot, l1Height, parentGasUsed, nil + return l1StateRoot, l1Height, parentGasUsed, nil } // TierProviderTierWithID wraps protocol ITierProviderTier struct with an ID. @@ -676,7 +806,7 @@ type TierProviderTierWithID struct { // GetTiers fetches all protocol supported tiers. func (c *Client) GetTiers(ctx context.Context) ([]*TierProviderTierWithID, error) { - ctxWithTimeout, cancel := ctxWithTimeoutOrDefault(ctx, defaultTimeout) + ctxWithTimeout, cancel := CtxWithTimeoutOrDefault(ctx, defaultTimeout) defer cancel() tierRouterAddress, err := c.TaikoL1.Resolve0(&bind.CallOpts{Context: ctx}, StringToBytes32("tier_router"), false) @@ -737,7 +867,7 @@ func (c *Client) GetTaikoDataSlotBByNumber(ctx context.Context, number uint64) ( // GetGuardianProverAddress fetches the guardian prover address from the protocol. func (c *Client) GetGuardianProverAddress(ctx context.Context) (common.Address, error) { - ctxWithTimeout, cancel := ctxWithTimeoutOrDefault(ctx, defaultTimeout) + ctxWithTimeout, cancel := CtxWithTimeoutOrDefault(ctx, defaultTimeout) defer cancel() return c.TaikoL1.Resolve0(&bind.CallOpts{Context: ctxWithTimeout}, StringToBytes32("tier_guardian"), false) @@ -749,7 +879,7 @@ func (c *Client) WaitL1NewPendingTransaction( address common.Address, oldPendingNonce uint64, ) error { - ctxWithTimeout, cancel := ctxWithTimeoutOrDefault(ctx, defaultTimeout) + ctxWithTimeout, cancel := CtxWithTimeoutOrDefault(ctx, defaultTimeout) defer cancel() ticker := time.NewTicker(rpcPollingInterval) @@ -772,3 +902,83 @@ func (c *Client) WaitL1NewPendingTransaction( return nil } + +// CalculateBaseFeeOnTake calculates the base fee after ontake fork from the L2 protocol. +func (c *Client) calculateBaseFeeOntake( + ctx context.Context, + l2Head *types.Header, + currentTimestamp uint64, + baseFeeConfig *bindings.LibSharedDataBaseFeeConfig, +) (*big.Int, error) { + var ( + newGasTarget = uint64(baseFeeConfig.GasIssuancePerSecond) * uint64(baseFeeConfig.AdjustmentQuotient) + parentGasExcess uint64 + ) + parentGasTarget, err := c.TaikoL2.ParentGasTarget(&bind.CallOpts{BlockNumber: l2Head.Number, Context: ctx}) + if err != nil { + return nil, fmt.Errorf("failed to fetch parent gas target: %w", err) + } + + if newGasTarget != parentGasTarget && parentGasTarget != 0 { + oldParentGasExcess, err := c.TaikoL2.ParentGasExcess(&bind.CallOpts{BlockNumber: l2Head.Number, Context: ctx}) + if err != nil { + return nil, fmt.Errorf("failed to fetch old parent gas excess: %w", err) + } + if parentGasExcess, err = c.TaikoL2.AdjustExcess( + &bind.CallOpts{BlockNumber: l2Head.Number, Context: ctx}, + oldParentGasExcess, + parentGasTarget, + newGasTarget, + ); err != nil { + // If the `calculateBaseFee()` method is deprecated, we will use the new method `getBasefeeV2()` + // to calculate the base fee. + if strings.Contains(encoding.TryParsingCustomError(err).Error(), "L2_DEPRECATED_METHOD") { + baseFeeInfo, err := c.TaikoL2.GetBasefeeV2( + &bind.CallOpts{BlockNumber: l2Head.Number, Context: ctx}, + uint32(l2Head.GasUsed), + currentTimestamp, + *baseFeeConfig, + ) + if err != nil { + return nil, fmt.Errorf("failed to calculate base fee by GetBasefeeV2: %w", err) + } + return baseFeeInfo.Basefee, nil + } + + return nil, fmt.Errorf("failed to adjust parent gas excess: %w", err) + } + } else { + if parentGasExcess, err = c.TaikoL2.ParentGasExcess(&bind.CallOpts{ + BlockNumber: l2Head.Number, Context: ctx, + }); err != nil { + return nil, fmt.Errorf("failed to fetch parent gas excess: %w", err) + } + } + + baseFeeInfo, err := c.TaikoL2.CalculateBaseFee( + &bind.CallOpts{BlockNumber: l2Head.Number, Context: ctx}, + *baseFeeConfig, + currentTimestamp-l2Head.Time, + parentGasExcess, + uint32(l2Head.GasUsed), + ) + if err != nil { + // If the `calculateBaseFee()` method is deprecated, we will use the new method `getBasefeeV2()` + // to calculate the base fee. + if strings.Contains(encoding.TryParsingCustomError(err).Error(), "L2_DEPRECATED_METHOD") { + baseFeeInfo, err := c.TaikoL2.GetBasefeeV2( + &bind.CallOpts{BlockNumber: l2Head.Number, Context: ctx}, + uint32(l2Head.GasUsed), + currentTimestamp, + *baseFeeConfig, + ) + if err != nil { + return nil, fmt.Errorf("failed to calculate base fee by GetBasefeeV2: %w", err) + } + return baseFeeInfo.Basefee, nil + } + return nil, err + } + + return baseFeeInfo.Basefee, nil +} diff --git a/packages/taiko-client/pkg/rpc/methods_test.go b/packages/taiko-client/pkg/rpc/methods_test.go index f501294b5ca..0aa743b994b 100644 --- a/packages/taiko-client/pkg/rpc/methods_test.go +++ b/packages/taiko-client/pkg/rpc/methods_test.go @@ -95,13 +95,11 @@ func TestGetSyncedL1SnippetFromAnchor(t *testing.T) { tx, err := client.TaikoL2.Anchor(opts, l1BlockHash, l1StateRoot, l1Height, parentGasUsed) require.Nil(t, err) - syncedL1BlockHash, - syncedL1StateRoot, + syncedL1StateRoot, syncedL1Height, syncedParentGasUsed, err := client.getSyncedL1SnippetFromAnchor(tx) require.Nil(t, err) - require.Equal(t, l1BlockHash, syncedL1BlockHash) require.Equal(t, l1StateRoot, syncedL1StateRoot) require.Equal(t, l1Height, syncedL1Height) require.Equal(t, parentGasUsed, syncedParentGasUsed) diff --git a/packages/taiko-client/pkg/rpc/subscription.go b/packages/taiko-client/pkg/rpc/subscription.go index 7d74c9035ad..b1e14b958d3 100644 --- a/packages/taiko-client/pkg/rpc/subscription.go +++ b/packages/taiko-client/pkg/rpc/subscription.go @@ -46,6 +46,24 @@ func SubscribeBlockVerified( }) } +// SubscribeBlockVerifiedV2 subscribes the protocol's BlockVerifiedV2 events. +func SubscribeBlockVerifiedV2( + taikoL1 *bindings.TaikoL1Client, + ch chan *bindings.TaikoL1ClientBlockVerifiedV2, +) event.Subscription { + return SubscribeEvent("BlockVerifiedV2", func(ctx context.Context) (event.Subscription, error) { + sub, err := taikoL1.WatchBlockVerifiedV2(nil, ch, nil, nil) + if err != nil { + log.Error("Create TaikoL1.BlockVerifiedV2 subscription error", "error", err) + return nil, err + } + + defer sub.Unsubscribe() + + return waitSubErr(ctx, sub) + }) +} + // SubscribeBlockProposed subscribes the protocol's BlockProposed events. func SubscribeBlockProposed( taikoL1 *bindings.TaikoL1Client, @@ -64,6 +82,24 @@ func SubscribeBlockProposed( }) } +// SubscribeBlockProposedV2 subscribes the protocol's BlockProposedV2 events. +func SubscribeBlockProposedV2( + taikoL1 *bindings.TaikoL1Client, + ch chan *bindings.TaikoL1ClientBlockProposedV2, +) event.Subscription { + return SubscribeEvent("BlockProposedV2", func(ctx context.Context) (event.Subscription, error) { + sub, err := taikoL1.WatchBlockProposedV2(nil, ch, nil) + if err != nil { + log.Error("Create TaikoL1.BlockProposedV2 subscription error", "error", err) + return nil, err + } + + defer sub.Unsubscribe() + + return waitSubErr(ctx, sub) + }) +} + // SubscribeTransitionProved subscribes the protocol's TransitionProved events. func SubscribeTransitionProved( taikoL1 *bindings.TaikoL1Client, @@ -82,6 +118,24 @@ func SubscribeTransitionProved( }) } +// SubscribeTransitionProvedV2 subscribes the protocol's TransitionProvedV2 events. +func SubscribeTransitionProvedV2( + taikoL1 *bindings.TaikoL1Client, + ch chan *bindings.TaikoL1ClientTransitionProvedV2, +) event.Subscription { + return SubscribeEvent("TransitionProvedV2", func(ctx context.Context) (event.Subscription, error) { + sub, err := taikoL1.WatchTransitionProvedV2(nil, ch, nil) + if err != nil { + log.Error("Create TaikoL1.TransitionProvedV2 subscription error", "error", err) + return nil, err + } + + defer sub.Unsubscribe() + + return waitSubErr(ctx, sub) + }) +} + // SubscribeTransitionContested subscribes the protocol's TransitionContested events. func SubscribeTransitionContested( taikoL1 *bindings.TaikoL1Client, @@ -100,6 +154,24 @@ func SubscribeTransitionContested( }) } +// SubscribeTransitionContestedV2 subscribes the protocol's TransitionContestedV2 events. +func SubscribeTransitionContestedV2( + taikoL1 *bindings.TaikoL1Client, + ch chan *bindings.TaikoL1ClientTransitionContestedV2, +) event.Subscription { + return SubscribeEvent("TransitionContestedV2", func(ctx context.Context) (event.Subscription, error) { + sub, err := taikoL1.WatchTransitionContestedV2(nil, ch, nil) + if err != nil { + log.Error("Create TaikoL1.TransitionContestedV2 subscription error", "error", err) + return nil, err + } + + defer sub.Unsubscribe() + + return waitSubErr(ctx, sub) + }) +} + // SubscribeChainHead subscribes the new chain heads. func SubscribeChainHead( client *EthClient, diff --git a/packages/taiko-client/pkg/rpc/utils.go b/packages/taiko-client/pkg/rpc/utils.go index 044b6bafe6a..c08b7f136eb 100644 --- a/packages/taiko-client/pkg/rpc/utils.go +++ b/packages/taiko-client/pkg/rpc/utils.go @@ -2,8 +2,12 @@ package rpc import ( "context" + "errors" "math/big" + "os" + "os/signal" "strings" + "syscall" "time" "github.com/ethereum/go-ethereum/accounts/abi/bind" @@ -11,18 +15,43 @@ import ( "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/params" + "golang.org/x/sync/errgroup" "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings" "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/encoding" - "github.com/taikoxyz/taiko-mono/packages/taiko-client/internal/utils" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/utils" ) var ( ZeroAddress common.Address BlobBytes = params.BlobTxBytesPerFieldElement * params.BlobTxFieldElementsPerBlob BlockMaxTxListBytes uint64 = (params.BlobTxBytesPerFieldElement - 1) * params.BlobTxFieldElementsPerBlob + // DefaultInterruptSignals is a set of default interrupt signals. + DefaultInterruptSignals = []os.Signal{ + os.Interrupt, + os.Kill, + syscall.SIGTERM, + syscall.SIGQUIT, + } + ErrInvalidLength = errors.New("invalid length") + ErrSlotBMarshal = errors.New("abi: cannot marshal in to go type: length insufficient 160 require 192") ) +// GetProtocolConfigs gets the protocol configs from TaikoL1 contract. +func GetProtocolConfigs( + taikoL1Client *bindings.TaikoL1Client, + opts *bind.CallOpts, +) (bindings.TaikoDataConfig, error) { + var cancel context.CancelFunc + if opts == nil { + opts = &bind.CallOpts{Context: context.Background()} + } + opts.Context, cancel = CtxWithTimeoutOrDefault(opts.Context, defaultTimeout) + defer cancel() + + return taikoL1Client.GetConfig(opts) +} + // GetProtocolStateVariables gets the protocol states from TaikoL1 contract. func GetProtocolStateVariables( taikoL1Client *bindings.TaikoL1Client, @@ -31,9 +60,33 @@ func GetProtocolStateVariables( A bindings.TaikoDataSlotA B bindings.TaikoDataSlotB }, error) { + var cancel context.CancelFunc + if opts == nil { + opts = &bind.CallOpts{Context: context.Background()} + } + opts.Context, cancel = CtxWithTimeoutOrDefault(opts.Context, defaultTimeout) + defer cancel() + // Notice: sloB.LastProposedIn and slotB.LastUnpausedAt are always 0 + // before upgrading contract, but we can ignore it since we won't use it. + + var slotBV1 bindings.TaikoDataSlotBV1 slotA, slotB, err := taikoL1Client.GetStateVariables(opts) if err != nil { - return nil, err + if errors.Is(err, ErrSlotBMarshal) { + slotA, slotBV1, err = taikoL1Client.GetStateVariablesV1(opts) + if err != nil { + return nil, err + } + slotB = bindings.TaikoDataSlotB{ + NumBlocks: slotBV1.NumBlocks, + LastVerifiedBlockId: slotBV1.LastVerifiedBlockId, + ProvingPaused: slotBV1.ProvingPaused, + LastProposedIn: nil, + LastUnpausedAt: slotBV1.LastUnpausedAt, + } + } else { + return nil, err + } } return &struct { A bindings.TaikoDataSlotA @@ -50,7 +103,7 @@ func CheckProverBalance( address common.Address, bond *big.Int, ) (bool, error) { - ctxWithTimeout, cancel := ctxWithTimeoutOrDefault(ctx, defaultTimeout) + ctxWithTimeout, cancel := CtxWithTimeoutOrDefault(ctx, defaultTimeout) defer cancel() // Check allowance on taiko token contract @@ -60,31 +113,47 @@ func CheckProverBalance( } log.Info( - "Prover allowance for TaikoL1 contract", + "Prover allowance for the contract", "allowance", utils.WeiToEther(allowance), "address", prover.Hex(), "bond", utils.WeiToEther(bond), ) - // Check prover's taiko token balance - balance, err := rpc.TaikoToken.BalanceOf(&bind.CallOpts{Context: ctxWithTimeout}, prover) + // Check prover's taiko token bondBalance + bondBalance, err := rpc.TaikoL1.BondBalanceOf(&bind.CallOpts{Context: ctxWithTimeout}, prover) + if err != nil { + return false, err + } + + // Check prover's taiko token tokenBalance + tokenBalance, err := rpc.TaikoToken.BalanceOf(&bind.CallOpts{Context: ctxWithTimeout}, prover) if err != nil { return false, err } log.Info( "Prover's wallet taiko token balance", - "balance", utils.WeiToEther(balance), + "bondBalance", utils.WeiToEther(bondBalance), + "tokenBalance", utils.WeiToEther(tokenBalance), "address", prover.Hex(), "bond", utils.WeiToEther(bond), ) - if bond.Cmp(allowance) > 0 || bond.Cmp(balance) > 0 { + if bond.Cmp(allowance) > 0 && bond.Cmp(bondBalance) > 0 { log.Info( - "Assigned prover does not have required on-chain token balance or allowance", - "providedProver", prover.Hex(), - "taikoTokenBalance", utils.WeiToEther(balance), + "Assigned prover does not have required on-chain token allowance", "allowance", utils.WeiToEther(allowance), + "bondBalance", utils.WeiToEther(bondBalance), + "bond", utils.WeiToEther(bond), + ) + return false, nil + } + + if bond.Cmp(bondBalance) > 0 && bond.Cmp(tokenBalance) > 0 { + log.Info( + "Assigned prover does not have required on-chain token balance", + "bondBalance", utils.WeiToEther(bondBalance), + "tokenBalance", utils.WeiToEther(tokenBalance), "bond", utils.WeiToEther(bond), ) return false, nil @@ -114,7 +183,7 @@ func GetBlockProofStatus( proverAddress common.Address, proverSetAddress common.Address, ) (*BlockProofStatus, error) { - ctxWithTimeout, cancel := ctxWithTimeoutOrDefault(ctx, defaultTimeout) + ctxWithTimeout, cancel := CtxWithTimeoutOrDefault(ctx, defaultTimeout) defer cancel() // Get the local L2 parent header. @@ -143,7 +212,8 @@ func GetBlockProofStatus( return nil, err } - if header.Hash() != transition.BlockHash || transition.StateRoot != header.Root { + if header.Hash() != transition.BlockHash || + (transition.StateRoot != (common.Hash{}) && transition.StateRoot != header.Root) { log.Info( "Different block hash or state root detected, try submitting a contest", "localBlockHash", header.Hash(), @@ -197,10 +267,140 @@ func GetBlockProofStatus( }, nil } +// BatchGetBlocksProofStatus checks whether the batch of L2 blocks still need new proofs or new contests. +// Here are the possible status: +// 1. No proof on chain at all. +// 2. A valid proof has been submitted. +// 3. An invalid proof has been submitted, and there is no valid contest. +// 4. An invalid proof has been submitted, and there is a valid contest. +func BatchGetBlocksProofStatus( + ctx context.Context, + cli *Client, + ids []*big.Int, + proverAddress common.Address, + proverSetAddress common.Address, +) ([]*BlockProofStatus, error) { + ctxWithTimeout, cancel := CtxWithTimeoutOrDefault(ctx, defaultTimeout) + defer cancel() + var ( + parentHashes = make([][32]byte, len(ids)) + parentIDs = make([]*big.Int, len(ids)) + blockIDs = make([]*big.Int, len(ids)) + uint64BlockIDs = make([]uint64, len(ids)) + result = make([]*BlockProofStatus, len(ids)) + highestBlockID = big.NewInt(0) + ) + for i, id := range ids { + parentIDs[i] = new(big.Int).Sub(id, common.Big1) + blockIDs[i] = id + uint64BlockIDs[i] = id.Uint64() + if id.Cmp(highestBlockID) > 0 { + highestBlockID = id + } + } + // Get the local L2 parent headers. + parents, err := cli.L2.BatchHeadersByNumbers(ctxWithTimeout, parentIDs) + if err != nil { + return nil, err + } + if len(parents) != len(ids) { + return nil, ErrInvalidLength + } + for i := range ids { + parentHashes[i] = parents[i].Hash() + } + // Get the transition state from TaikoL1 contract. + transitions, err := cli.TaikoL1.GetTransitions( + &bind.CallOpts{Context: ctxWithTimeout}, + uint64BlockIDs, + parentHashes, + ) + if err != nil { + return nil, err + } + _, err = cli.WaitL2Header(ctxWithTimeout, highestBlockID) + if err != nil { + return nil, err + } + blockHeaders, err := cli.L2.BatchHeadersByNumbers(ctxWithTimeout, blockIDs) + if err != nil { + return nil, err + } + if len(transitions) != len(ids) || len(blockHeaders) != len(ids) { + return nil, ErrInvalidLength + } + g, _ := errgroup.WithContext(ctxWithTimeout) + for i, transition := range transitions { + // No proof on chain + if transition.BlockHash == (common.Hash{}) { + result[i] = &BlockProofStatus{IsSubmitted: false, ParentHeader: parents[i]} + continue + } + g.Go(func() error { + if blockHeaders[i].Hash() != transition.BlockHash || + (transition.StateRoot != (common.Hash{}) && transition.StateRoot != blockHeaders[i].Root) { + log.Info( + "Different block hash or state root detected, try submitting a contest", + "localBlockHash", blockHeaders[i].Hash(), + "protocolTransitionBlockHash", common.BytesToHash(transition.BlockHash[:]), + "localStateRoot", blockHeaders[i].Root, + "protocolTransitionStateRoot", common.BytesToHash(transition.StateRoot[:]), + ) + result[i] = &BlockProofStatus{ + IsSubmitted: true, + Invalid: true, + CurrentTransitionState: &transitions[i], + ParentHeader: parents[i], + } + return nil + } + + if proverAddress == transition.Prover || + (proverSetAddress != ZeroAddress && transition.Prover == proverSetAddress) { + log.Info( + "📬 Block's proof has already been submitted by current prover", + "blockID", ids[i], + "parent", parents[i].Hash().Hex(), + "hash", common.Bytes2Hex(transition.BlockHash[:]), + "stateRoot", common.Bytes2Hex(transition.StateRoot[:]), + "timestamp", transition.Timestamp, + "contester", transition.Contester, + ) + result[i] = &BlockProofStatus{ + IsSubmitted: true, + Invalid: transition.Contester != ZeroAddress, + ParentHeader: parents[i], + CurrentTransitionState: &transitions[i], + } + return nil + } + log.Info( + "📬 Block's proof has already been submitted by another prover", + "blockID", ids[i], + "prover", transition.Prover, + "parent", parents[i].Hash().Hex(), + "hash", common.Bytes2Hex(transition.BlockHash[:]), + "stateRoot", common.Bytes2Hex(transition.StateRoot[:]), + "timestamp", transition.Timestamp, + "contester", transition.Contester, + ) + + result[i] = &BlockProofStatus{ + IsSubmitted: true, + Invalid: transition.Contester != ZeroAddress, + ParentHeader: parents[i], + CurrentTransitionState: &transitions[i], + } + return nil + }) + } + return result, g.Wait() +} + // SetHead makes a `debug_setHead` RPC call to set the chain's head, should only be used // for testing purpose. func SetHead(ctx context.Context, client *EthClient, headNum *big.Int) error { - ctxWithTimeout, cancel := ctxWithTimeoutOrDefault(ctx, defaultTimeout) + ctxWithTimeout, cancel := CtxWithTimeoutOrDefault(ctx, defaultTimeout) defer cancel() return client.SetHead(ctxWithTimeout, headNum) @@ -214,10 +414,10 @@ func StringToBytes32(str string) [32]byte { return b } -// ctxWithTimeoutOrDefault sets a context timeout if the deadline has not passed or is not set, +// CtxWithTimeoutOrDefault sets a context timeout if the deadline has not passed or is not set, // and otherwise returns the context as passed in. cancel func is always set to an empty function // so is safe to defer the cancel. -func ctxWithTimeoutOrDefault(ctx context.Context, defaultTimeout time.Duration) (context.Context, context.CancelFunc) { +func CtxWithTimeoutOrDefault(ctx context.Context, defaultTimeout time.Duration) (context.Context, context.CancelFunc) { if utils.IsNil(ctx) { return context.WithTimeout(context.Background(), defaultTimeout) } @@ -227,3 +427,19 @@ func ctxWithTimeoutOrDefault(ctx context.Context, defaultTimeout time.Duration) return ctx, func() {} } + +// 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) + } +} diff --git a/packages/taiko-client/pkg/utils/txmgr_selector.go b/packages/taiko-client/pkg/utils/txmgr_selector.go new file mode 100644 index 00000000000..1224bff4588 --- /dev/null +++ b/packages/taiko-client/pkg/utils/txmgr_selector.go @@ -0,0 +1,62 @@ +package utils + +import ( + "time" + + "github.com/ethereum-optimism/optimism/op-service/txmgr" +) + +var ( + defaultPrivateTxMgrRetryInterval = 5 * time.Minute +) + +// TxMgrSelector is responsible for selecting the correct transaction manager, +// it will choose the transaction manager for a private mempool if it is available and works well, +// otherwise it will choose the normal transaction manager. +type TxMgrSelector struct { + txMgr *txmgr.SimpleTxManager + privateTxMgr *txmgr.SimpleTxManager + privateTxMgrFailedAt *time.Time + privateTxMgrRetryInterval time.Duration +} + +// NewTxMgrSelector creates a new TxMgrSelector instance. +func NewTxMgrSelector( + txMgr *txmgr.SimpleTxManager, + privateTxMgr *txmgr.SimpleTxManager, + privateTxMgrRetryInterval *time.Duration, +) *TxMgrSelector { + retryInterval := defaultPrivateTxMgrRetryInterval + if privateTxMgrRetryInterval != nil { + retryInterval = *privateTxMgrRetryInterval + } + + return &TxMgrSelector{ + txMgr: txMgr, + privateTxMgr: privateTxMgr, + privateTxMgrFailedAt: nil, + privateTxMgrRetryInterval: retryInterval, + } +} + +// Select selects a transaction manager based on the current state. +func (s *TxMgrSelector) Select() (*txmgr.SimpleTxManager, bool) { + // If there is no private transaction manager, return the normal transaction manager. + if s.privateTxMgr == nil { + return s.txMgr, false + } + + // If the private transaction manager has failed, check if it is time to retry. + if s.privateTxMgrFailedAt == nil || time.Now().After(s.privateTxMgrFailedAt.Add(s.privateTxMgrRetryInterval)) { + return s.privateTxMgr, true + } + + // Otherwise, return the normal transaction manager. + return s.txMgr, false +} + +// RecordPrivateTxMgrFailed records the time when the private transaction manager has failed. +func (s *TxMgrSelector) RecordPrivateTxMgrFailed() { + now := time.Now() + s.privateTxMgrFailedAt = &now +} diff --git a/packages/taiko-client/pkg/utils/txmgr_selector_test.go b/packages/taiko-client/pkg/utils/txmgr_selector_test.go new file mode 100644 index 00000000000..92ff69d1d07 --- /dev/null +++ b/packages/taiko-client/pkg/utils/txmgr_selector_test.go @@ -0,0 +1,29 @@ +package utils + +import ( + "testing" + + "github.com/ethereum-optimism/optimism/op-service/txmgr" + "github.com/stretchr/testify/require" +) + +var ( + testTxMgr = &txmgr.SimpleTxManager{} + testSelector = NewTxMgrSelector(testTxMgr, nil, nil) +) + +func TestNewTxMgrSelector(t *testing.T) { + require.Equal(t, defaultPrivateTxMgrRetryInterval, testSelector.privateTxMgrRetryInterval) +} + +func TestSelect(t *testing.T) { + txMgr, isPrivate := testSelector.Select() + require.NotNil(t, txMgr) + require.False(t, isPrivate) +} + +func TestRecordPrivateTxMgrFailed(t *testing.T) { + require.Nil(t, testSelector.privateTxMgrFailedAt) + testSelector.RecordPrivateTxMgrFailed() + require.NotNil(t, testSelector.privateTxMgrFailedAt) +} diff --git a/packages/taiko-client/internal/utils/util_test.go b/packages/taiko-client/pkg/utils/util_test.go similarity index 93% rename from packages/taiko-client/internal/utils/util_test.go rename to packages/taiko-client/pkg/utils/util_test.go index 8ccafffc8fa..6c3da5f33de 100644 --- a/packages/taiko-client/internal/utils/util_test.go +++ b/packages/taiko-client/pkg/utils/util_test.go @@ -8,7 +8,7 @@ import ( "github.com/stretchr/testify/require" "github.com/taikoxyz/taiko-mono/packages/taiko-client/internal/testutils" - "github.com/taikoxyz/taiko-mono/packages/taiko-client/internal/utils" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/utils" ) func TestEncodeDecodeBytes(t *testing.T) { diff --git a/packages/taiko-client/internal/utils/utils.go b/packages/taiko-client/pkg/utils/utils.go similarity index 96% rename from packages/taiko-client/internal/utils/utils.go rename to packages/taiko-client/pkg/utils/utils.go index 1eaea75dd87..7c7ca2845aa 100644 --- a/packages/taiko-client/internal/utils/utils.go +++ b/packages/taiko-client/pkg/utils/utils.go @@ -6,9 +6,8 @@ import ( "crypto/rand" "errors" "fmt" - "math" - "io" + "math" "math/big" "os" "strings" @@ -70,14 +69,6 @@ func Min[T constraints.Integer](a, b T) T { return b } -// Max return the maximum value of two integers. -func Max[T constraints.Integer](a, b T) T { - if a > b { - return a - } - return b -} - // Compress compresses the given txList bytes using zlib. func Compress(txList []byte) ([]byte, error) { var b bytes.Buffer diff --git a/packages/taiko-client/proposer/config.go b/packages/taiko-client/proposer/config.go index 499aa0be7c6..2dcdec36d39 100644 --- a/packages/taiko-client/proposer/config.go +++ b/packages/taiko-client/proposer/config.go @@ -3,8 +3,6 @@ package proposer import ( "crypto/ecdsa" "fmt" - "math/big" - "net/url" "strings" "time" @@ -14,37 +12,32 @@ import ( "github.com/urfave/cli/v2" "github.com/taikoxyz/taiko-mono/packages/taiko-client/cmd/flags" - "github.com/taikoxyz/taiko-mono/packages/taiko-client/internal/utils" + pkgFlags "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/flags" "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/jwt" "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/rpc" - - pkgFlags "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/flags" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/utils" ) // Config contains all configurations to initialize a Taiko proposer. type Config struct { *rpc.ClientConfig - AssignmentHookAddress common.Address L1ProposerPrivKey *ecdsa.PrivateKey L2SuggestedFeeRecipient common.Address - ExtraData string ProposeInterval time.Duration LocalAddresses []common.Address LocalAddressesOnly bool MinGasUsed uint64 MinTxListBytes uint64 + MinTip uint64 MinProposingInternal time.Duration + AllowZeroInterval uint64 MaxProposedTxListsPerEpoch uint64 ProposeBlockTxGasLimit uint64 - ProverEndpoints []*url.URL - OptimisticTierFee *big.Int - SgxTierFee *big.Int - TierFeePriceBump *big.Int - MaxTierFeePriceBumps uint64 - IncludeParentMetaHash bool BlobAllowed bool + FallbackToCalldata bool + RevertProtectionEnabled bool TxmgrConfigs *txmgr.CLIConfig - L1BlockBuilderTip *big.Int + PrivateTxmgrConfigs *txmgr.CLIConfig } // NewConfigFromCliContext initializes a Config instance from @@ -75,23 +68,14 @@ func NewConfigFromCliContext(c *cli.Context) (*Config, error) { } } - var proverEndpoints []*url.URL - for _, e := range strings.Split(c.String(flags.ProverEndpoints.Name), ",") { - endpoint, err := url.Parse(e) - if err != nil { - return nil, err - } - proverEndpoints = append(proverEndpoints, endpoint) - } - - optimisticTierFee, err := utils.GWeiToWei(c.Float64(flags.OptimisticTierFee.Name)) + minTip, err := utils.GWeiToWei(c.Float64(flags.MinTip.Name)) if err != nil { return nil, err } - sgxTierFee, err := utils.GWeiToWei(c.Float64(flags.SgxTierFee.Name)) - if err != nil { - return nil, err + maxProposedTxListsPerEpoch := c.Uint64(flags.MaxProposedTxListsPerEpoch.Name) + if maxProposedTxListsPerEpoch > 2 { + return nil, fmt.Errorf("max proposed tx lists per epoch should not exceed 2, got: %d", maxProposedTxListsPerEpoch) } return &Config{ @@ -104,31 +88,32 @@ func NewConfigFromCliContext(c *cli.Context) (*Config, error) { JwtSecret: string(jwtSecret), TaikoTokenAddress: common.HexToAddress(c.String(flags.TaikoTokenAddress.Name)), Timeout: c.Duration(flags.RPCTimeout.Name), + ProverSetAddress: common.HexToAddress(c.String(flags.ProverSetAddress.Name)), }, - AssignmentHookAddress: common.HexToAddress(c.String(flags.AssignmentHookAddress.Name)), L1ProposerPrivKey: l1ProposerPrivKey, L2SuggestedFeeRecipient: common.HexToAddress(l2SuggestedFeeRecipient), - ExtraData: c.String(flags.ExtraData.Name), ProposeInterval: c.Duration(flags.ProposeInterval.Name), LocalAddresses: localAddresses, LocalAddressesOnly: c.Bool(flags.TxPoolLocalsOnly.Name), MinGasUsed: c.Uint64(flags.MinGasUsed.Name), MinTxListBytes: c.Uint64(flags.MinTxListBytes.Name), + MinTip: minTip.Uint64(), MinProposingInternal: c.Duration(flags.MinProposingInternal.Name), - MaxProposedTxListsPerEpoch: c.Uint64(flags.MaxProposedTxListsPerEpoch.Name), + MaxProposedTxListsPerEpoch: maxProposedTxListsPerEpoch, + AllowZeroInterval: c.Uint64(flags.AllowZeroInterval.Name), ProposeBlockTxGasLimit: c.Uint64(flags.TxGasLimit.Name), - ProverEndpoints: proverEndpoints, - OptimisticTierFee: optimisticTierFee, - SgxTierFee: sgxTierFee, - TierFeePriceBump: new(big.Int).SetUint64(c.Uint64(flags.TierFeePriceBump.Name)), - MaxTierFeePriceBumps: c.Uint64(flags.MaxTierFeePriceBumps.Name), - IncludeParentMetaHash: c.Bool(flags.ProposeBlockIncludeParentMetaHash.Name), BlobAllowed: c.Bool(flags.BlobAllowed.Name), - L1BlockBuilderTip: new(big.Int).SetUint64(c.Uint64(flags.L1BlockBuilderTip.Name)), + FallbackToCalldata: c.Bool(flags.FallbackToCalldata.Name), + RevertProtectionEnabled: c.Bool(flags.RevertProtectionEnabled.Name), TxmgrConfigs: pkgFlags.InitTxmgrConfigsFromCli( c.String(flags.L1WSEndpoint.Name), l1ProposerPrivKey, c, ), + PrivateTxmgrConfigs: pkgFlags.InitTxmgrConfigsFromCli( + c.String(flags.L1PrivateEndpoint.Name), + l1ProposerPrivKey, + c, + ), }, nil } diff --git a/packages/taiko-client/proposer/config_test.go b/packages/taiko-client/proposer/config_test.go index 47707e55d56..e1af554fed3 100644 --- a/packages/taiko-client/proposer/config_test.go +++ b/packages/taiko-client/proposer/config_test.go @@ -2,9 +2,7 @@ package proposer import ( "context" - "fmt" "os" - "strings" "time" "github.com/ethereum/go-ethereum/common" @@ -13,17 +11,14 @@ import ( "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/encoding" "github.com/taikoxyz/taiko-mono/packages/taiko-client/cmd/flags" - "github.com/taikoxyz/taiko-mono/packages/taiko-client/internal/utils" ) var ( - l1Endpoint = os.Getenv("L1_NODE_WS_ENDPOINT") - l2Endpoint = os.Getenv("L2_EXECUTION_ENGINE_HTTP_ENDPOINT") - taikoL1 = os.Getenv("TAIKO_L1_ADDRESS") - taikoL2 = os.Getenv("TAIKO_L2_ADDRESS") - taikoToken = os.Getenv("TAIKO_TOKEN_ADDRESS") - proverEndpoints = "http://localhost:9876,http://localhost:1234" - tierFee = 100.0 + l1Endpoint = os.Getenv("L1_WS") + l2Endpoint = os.Getenv("L2_HTTP") + taikoL1 = os.Getenv("TAIKO_L1") + taikoL2 = os.Getenv("TAIKO_L2") + taikoToken = os.Getenv("TAIKO_TOKEN") proposeInterval = "10s" rpcTimeout = "5s" ) @@ -48,17 +43,6 @@ func (s *ProposerTestSuite) TestNewConfigFromCliContext() { s.Equal(1, len(c.LocalAddresses)) s.Equal(goldenTouchAddress, c.LocalAddresses[0]) s.Equal(5*time.Second, c.Timeout) - tierFeeGWei, err := utils.GWeiToWei(tierFee) - s.Nil(err) - s.Equal(tierFeeGWei.Uint64(), c.OptimisticTierFee.Uint64()) - s.Equal(tierFeeGWei.Uint64(), c.SgxTierFee.Uint64()) - s.Equal(uint64(15), c.TierFeePriceBump.Uint64()) - s.Equal(uint64(5), c.MaxTierFeePriceBumps) - s.Equal(true, c.IncludeParentMetaHash) - - for i, e := range strings.Split(proverEndpoints, ",") { - s.Equal(c.ProverEndpoints[i].String(), e) - } s.Nil(new(Proposer).InitFromCli(context.Background(), cliCtx)) return nil @@ -77,12 +61,6 @@ func (s *ProposerTestSuite) TestNewConfigFromCliContext() { "--" + flags.TxPoolLocals.Name, goldenTouchAddress.Hex(), "--" + flags.RPCTimeout.Name, rpcTimeout, "--" + flags.TxGasLimit.Name, "100000", - "--" + flags.ProverEndpoints.Name, proverEndpoints, - "--" + flags.OptimisticTierFee.Name, fmt.Sprint(tierFee), - "--" + flags.SgxTierFee.Name, fmt.Sprint(tierFee), - "--" + flags.TierFeePriceBump.Name, "15", - "--" + flags.MaxTierFeePriceBumps.Name, "5", - "--" + flags.ProposeBlockIncludeParentMetaHash.Name, "true", })) } @@ -136,14 +114,7 @@ func (s *ProposerTestSuite) SetupApp() *cli.App { &cli.DurationFlag{Name: flags.MinProposingInternal.Name}, &cli.DurationFlag{Name: flags.ProposeInterval.Name}, &cli.StringFlag{Name: flags.TxPoolLocals.Name}, - &cli.StringFlag{Name: flags.ProverEndpoints.Name}, - &cli.Uint64Flag{Name: flags.OptimisticTierFee.Name}, - &cli.Uint64Flag{Name: flags.SgxTierFee.Name}, &cli.DurationFlag{Name: flags.RPCTimeout.Name}, - &cli.Uint64Flag{Name: flags.TierFeePriceBump.Name}, - &cli.Uint64Flag{Name: flags.MaxTierFeePriceBumps.Name}, - &cli.BoolFlag{Name: flags.ProposeBlockIncludeParentMetaHash.Name}, - &cli.StringFlag{Name: flags.AssignmentHookAddress.Name}, } app.Flags = append(app.Flags, flags.TxmgrFlags...) app.Action = func(ctx *cli.Context) error { diff --git a/packages/taiko-client/proposer/proposer.go b/packages/taiko-client/proposer/proposer.go index cc045c1b46b..7c147e52250 100644 --- a/packages/taiko-client/proposer/proposer.go +++ b/packages/taiko-client/proposer/proposer.go @@ -1,10 +1,11 @@ package proposer import ( - "bytes" "context" "encoding/json" + "errors" "fmt" + "math/big" "net/http" "sync" "time" @@ -20,22 +21,16 @@ import ( "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/rlp" "github.com/urfave/cli/v2" - "golang.org/x/sync/errgroup" "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings" "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/encoding" "github.com/taikoxyz/taiko-mono/packages/taiko-client/internal/metrics" - "github.com/taikoxyz/taiko-mono/packages/taiko-client/internal/utils" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/config" "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/rpc" - selector "github.com/taikoxyz/taiko-mono/packages/taiko-client/proposer/prover_selector" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/utils" builder "github.com/taikoxyz/taiko-mono/packages/taiko-client/proposer/transaction_builder" ) -var ( - proverAssignmentTimeout = 30 * time.Minute - requestProverServerTimeout = 12 * time.Second -) - // Proposer keep proposing new transactions from L2 execution engine's tx pool at a fixed interval. type Proposer struct { // configurations @@ -49,38 +44,39 @@ type Proposer struct { // proposingTimer *time.Timer - tiers []*rpc.TierProviderTierWithID - tierFees []encoding.TierFee - - // Prover selector - proverSelector selector.ProverSelector - // Transaction builder txBuilder builder.ProposeBlockTransactionBuilder // Protocol configurations protocolConfigs *bindings.TaikoDataConfig + chainConfig *config.ChainConfig + lastProposedAt time.Time + totalEpochs uint64 - txmgr *txmgr.SimpleTxManager + txmgrSelector *utils.TxMgrSelector ctx context.Context wg sync.WaitGroup } -// InitFromCli New initializes the given proposer instance based on the command line flags. +// InitFromCli initializes the given proposer instance based on the command line flags. func (p *Proposer) InitFromCli(ctx context.Context, c *cli.Context) error { cfg, err := NewConfigFromCliContext(c) if err != nil { return err } - return p.InitFromConfig(ctx, cfg) + return p.InitFromConfig(ctx, cfg, nil, nil) } // InitFromConfig initializes the proposer instance based on the given configurations. -func (p *Proposer) InitFromConfig(ctx context.Context, cfg *Config) (err error) { +func (p *Proposer) InitFromConfig( + ctx context.Context, cfg *Config, + txMgr *txmgr.SimpleTxManager, + privateTxMgr *txmgr.SimpleTxManager, +) (err error) { p.proposerAddress = crypto.PubkeyToAddress(cfg.L1ProposerPrivKey.PublicKey) p.ctx = ctx p.Config = cfg @@ -92,71 +88,50 @@ func (p *Proposer) InitFromConfig(ctx context.Context, cfg *Config) (err error) } // Protocol configs - protocolConfigs, err := p.rpc.TaikoL1.GetConfig(&bind.CallOpts{Context: ctx}) + protocolConfigs, err := rpc.GetProtocolConfigs(p.rpc.TaikoL1, &bind.CallOpts{Context: p.ctx}) if err != nil { return fmt.Errorf("failed to get protocol configs: %w", err) } p.protocolConfigs = &protocolConfigs - log.Info("Protocol configs", "configs", p.protocolConfigs) - if p.tiers, err = p.rpc.GetTiers(ctx); err != nil { - return err - } - if err := p.initTierFees(); err != nil { - return err + if txMgr == nil { + if txMgr, err = txmgr.NewSimpleTxManager( + "proposer", + log.Root(), + &metrics.TxMgrMetrics, + *cfg.TxmgrConfigs, + ); err != nil { + return err + } } - if p.txmgr, err = txmgr.NewSimpleTxManager( - "proposer", - log.Root(), - &metrics.TxMgrMetrics, - *cfg.TxmgrConfigs, - ); err != nil { - return err + if privateTxMgr == nil && cfg.PrivateTxmgrConfigs != nil && len(cfg.PrivateTxmgrConfigs.L1RPCURL) > 0 { + if privateTxMgr, err = txmgr.NewSimpleTxManager( + "privateMempoolProposer", + log.Root(), + &metrics.TxMgrMetrics, + *cfg.PrivateTxmgrConfigs, + ); err != nil { + return err + } } - if p.proverSelector, err = selector.NewETHFeeEOASelector( - &protocolConfigs, + p.txmgrSelector = utils.NewTxMgrSelector(txMgr, privateTxMgr, nil) + p.chainConfig = config.NewChainConfig(p.protocolConfigs) + p.txBuilder = builder.NewBuilderWithFallback( p.rpc, - p.proposerAddress, + p.L1ProposerPrivKey, + cfg.L2SuggestedFeeRecipient, cfg.TaikoL1Address, - cfg.AssignmentHookAddress, - p.tierFees, - cfg.TierFeePriceBump, - cfg.ProverEndpoints, - cfg.MaxTierFeePriceBumps, - proverAssignmentTimeout, - requestProverServerTimeout, - ); err != nil { - return err - } - - if cfg.BlobAllowed { - p.txBuilder = builder.NewBlobTransactionBuilder( - p.rpc, - p.L1ProposerPrivKey, - p.proverSelector, - p.Config.L1BlockBuilderTip, - cfg.TaikoL1Address, - cfg.L2SuggestedFeeRecipient, - cfg.AssignmentHookAddress, - cfg.ProposeBlockTxGasLimit, - cfg.ExtraData, - ) - } else { - p.txBuilder = builder.NewCalldataTransactionBuilder( - p.rpc, - p.L1ProposerPrivKey, - p.proverSelector, - p.Config.L1BlockBuilderTip, - cfg.L2SuggestedFeeRecipient, - cfg.TaikoL1Address, - cfg.AssignmentHookAddress, - cfg.ProposeBlockTxGasLimit, - cfg.ExtraData, - ) - } + cfg.ProverSetAddress, + cfg.ProposeBlockTxGasLimit, + p.chainConfig, + p.txmgrSelector, + cfg.RevertProtectionEnabled, + cfg.BlobAllowed, + cfg.FallbackToCalldata, + ) return nil } @@ -178,6 +153,7 @@ type RPCReplyL2TxLists struct { TxLists []types.Transactions TxListBytes [][]byte ParentMetaHash common.Hash + ParentBlockID uint64 } type CustomResponse struct { @@ -193,6 +169,7 @@ type RPC struct { func (p *RPC) GetL2TxLists(_ *http.Request, _ *Args, reply *RPCReplyL2TxLists) error { txLists, compressedTxLists, err := p.proposer.ProposeOpForTakingL2Blocks(context.Background()) if err != nil { + log.Error("Failed taking L2 blocks", "error", err) return err } log.Info("Received L2 txLists ", "txListsLength", len(txLists)) @@ -200,12 +177,18 @@ func (p *RPC) GetL2TxLists(_ *http.Request, _ *Args, reply *RPCReplyL2TxLists) e log.Info("Single L2 txList", "txList", txLists[0]) } - parentMetaHash, err := builder.GetParentMetaHash(p.proposer.ctx, p.proposer.rpc) + parent, err := p.proposer.getParentOfLatestProposedBlock(p.proposer.ctx, p.proposer.rpc) if err != nil { + log.Error("Failed fetching parent of latest proposed block", "error", err) return err } - *reply = RPCReplyL2TxLists{TxLists: txLists, TxListBytes: compressedTxLists, ParentMetaHash: parentMetaHash} + *reply = RPCReplyL2TxLists{ + TxLists: txLists, + TxListBytes: compressedTxLists, + ParentMetaHash: parent.MetaHash, + ParentBlockID: parent.BlockId, + } return nil } @@ -277,6 +260,7 @@ func (c *CustomCodec) WriteResponse(w http.ResponseWriter, reply interface{}, me // // proposing interval timer has been reached // case <-p.proposingTimer.C: // metrics.ProposerProposeEpochCounter.Add(1) +// p.totalEpochs++ // // Attempt a proposing operation // if err := p.ProposeOp(p.ctx); err != nil { @@ -294,6 +278,16 @@ func (p *Proposer) Close(_ context.Context) { // fetchPoolContent fetches the transaction pool content from L2 execution engine. func (p *Proposer) fetchPoolContent(filterPoolContent bool) ([]types.Transactions, error) { + var ( + minTip = p.MinTip + startAt = time.Now() + ) + // If `--epoch.allowZeroInterval` flag is set, allow proposing zero tip transactions once when + // the total epochs number is divisible by the flag value. + if p.AllowZeroInterval > 0 && p.totalEpochs%p.AllowZeroInterval == 0 { + minTip = 0 + } + // Fetch the pool content. preBuiltTxList, err := p.rpc.GetPoolContent( p.ctx, @@ -302,11 +296,15 @@ func (p *Proposer) fetchPoolContent(filterPoolContent bool) ([]types.Transaction rpc.BlockMaxTxListBytes, p.LocalAddresses, p.MaxProposedTxListsPerEpoch, + minTip, + p.chainConfig, ) if err != nil { return nil, fmt.Errorf("failed to fetch transaction pool content: %w", err) } + metrics.ProposerPoolContentFetchTime.Set(time.Since(startAt).Seconds()) + txLists := []types.Transactions{} for i, txs := range preBuiltTxList { // Filter the pool content if the filterPoolContent flag is set. @@ -384,6 +382,7 @@ func (p *Proposer) ProposeOp(ctx context.Context) error { "lastProposedAt", p.lastProposedAt, ) + // Fetch pending L2 transactions from mempool. txLists, err := p.fetchPoolContent(filterPoolContent) if err != nil { return err @@ -394,37 +393,17 @@ func (p *Proposer) ProposeOp(ctx context.Context) error { return nil } - g, gCtx := errgroup.WithContext(ctx) - // Propose all L2 transactions lists. - for _, txs := range txLists[:utils.Min(p.MaxProposedTxListsPerEpoch, uint64(len(txLists)))] { - nonce, err := p.rpc.L1.PendingNonceAt(ctx, p.proposerAddress) - if err != nil { - log.Error("Failed to get proposer nonce", "error", err) - break - } - - log.Info("Proposer current pending nonce", "nonce", nonce) - - g.Go(func() error { - txListBytes, err := rlp.EncodeToBytes(txs) - if err != nil { - return fmt.Errorf("failed to encode transactions: %w", err) - } - if err := p.ProposeTxList(gCtx, txListBytes, uint(txs.Len())); err != nil { - return err - } - p.lastProposedAt = time.Now() - return nil - }) + // Propose the transactions lists. + return p.ProposeTxLists(ctx, txLists) +} - if err := p.rpc.WaitL1NewPendingTransaction(ctx, p.proposerAddress, nonce); err != nil { - log.Error("Failed to wait for new pending transaction", "error", err) - } - } - if err := g.Wait(); err != nil { +// ProposeTxList proposes the given transactions lists to TaikoL1 smart contract. +func (p *Proposer) ProposeTxLists(ctx context.Context, txLists []types.Transactions) error { + // If the current L2 chain is after ontake fork, batch propose all L2 transactions lists. + if err := p.ProposeTxListOntake(ctx, txLists); err != nil { return err } - + p.lastProposedAt = time.Now() return nil } @@ -446,7 +425,7 @@ func (p *Proposer) ProposeOpForTakingL2Blocks(ctx context.Context) ([]types.Tran txLists, err := p.fetchPoolContent(filterPoolContent) if err != nil { - return nil, nil, err + return nil, nil, fmt.Errorf("failed to fetch pool content: %w", err) } // If the pool content is empty, return. @@ -471,7 +450,7 @@ func (p *Proposer) ProposeOpForTakingL2Blocks(ctx context.Context) ([]types.Tran } compressedTxListBytes, err := utils.Compress(txListBytes) if err != nil { - return nil, nil, err + return nil, nil, fmt.Errorf("failed to compress tx list: %w", err) } compressedTxLists = append(compressedTxLists, compressedTxListBytes) p.lastProposedAt = time.Now() //TODO check if it's correct @@ -480,42 +459,68 @@ func (p *Proposer) ProposeOpForTakingL2Blocks(ctx context.Context) ([]types.Tran return txLists, compressedTxLists, nil } -// ProposeTxList proposes the given transactions list to TaikoL1 smart contract. -func (p *Proposer) ProposeTxList( +// ProposeTxListOntake proposes the given transactions lists to TaikoL1 smart contract. +func (p *Proposer) ProposeTxListOntake( ctx context.Context, - txListBytes []byte, - txNum uint, + txLists []types.Transactions, ) error { - compressedTxListBytes, err := utils.Compress(txListBytes) - if err != nil { - return err + var ( + proverAddress = p.proposerAddress + txListsBytesArray [][]byte + txNums []int + totalTxs int + ) + for _, txs := range txLists { + txListBytes, err := rlp.EncodeToBytes(txs) + if err != nil { + return fmt.Errorf("failed to encode transactions: %w", err) + } + + compressedTxListBytes, err := utils.Compress(txListBytes) + if err != nil { + return err + } + + txListsBytesArray = append(txListsBytesArray, compressedTxListBytes) + txNums = append(txNums, len(txs)) + totalTxs += len(txs) } - txCandidate, err := p.txBuilder.Build( + if p.Config.ClientConfig.ProverSetAddress != rpc.ZeroAddress { + proverAddress = p.Config.ClientConfig.ProverSetAddress + } + + ok, err := rpc.CheckProverBalance( ctx, - p.tierFees, - p.IncludeParentMetaHash, - compressedTxListBytes, + p.rpc, + proverAddress, + p.TaikoL1Address, + new(big.Int).Mul(p.protocolConfigs.LivenessBond, new(big.Int).SetUint64(uint64(len(txLists)))), ) + if err != nil { - log.Warn("Failed to build TaikoL1.proposeBlock transaction", "error", encoding.TryParsingCustomError(err)) + log.Warn("Failed to check prover balance", "error", err) return err } - receipt, err := p.txmgr.Send(ctx, *txCandidate) + if !ok { + return errors.New("insufficient prover balance") + } + + txCandidate, err := p.txBuilder.BuildOntake(ctx, txListsBytesArray) if err != nil { - log.Warn("Failed to send TaikoL1.proposeBlock transaction", "error", encoding.TryParsingCustomError(err)) + log.Warn("Failed to build TaikoL1.proposeBlocksV2 transaction", "error", encoding.TryParsingCustomError(err)) return err } - if receipt.Status != types.ReceiptStatusSuccessful { - return fmt.Errorf("failed to propose block: %s", receipt.TxHash.Hex()) + if err := p.sendTx(ctx, txCandidate); err != nil { + return err } - log.Info("📝 Propose transactions succeeded", "txs", txNum) + log.Info("📝 Batch propose transactions succeeded", "txs", txNums) - metrics.ProposerProposedTxListsCounter.Add(1) - metrics.ProposerProposedTxsCounter.Add(float64(txNum)) + metrics.ProposerProposedTxListsCounter.Add(float64(len(txLists))) + metrics.ProposerProposedTxsCounter.Add(float64(totalTxs)) return nil } @@ -538,38 +543,48 @@ func (p *Proposer) ProposeTxList( // p.proposingTimer = time.NewTimer(duration) // } +// sendTx is the internal function to send a transaction with a selected tx manager. +func (p *Proposer) sendTx(ctx context.Context, txCandidate *txmgr.TxCandidate) error { + txMgr, isPrivate := p.txmgrSelector.Select() + receipt, err := txMgr.Send(ctx, *txCandidate) + if err != nil { + log.Warn( + "Failed to send TaikoL1.proposeBlock / TaikoL1.proposeBlocksV2 transaction by tx manager", + "isPrivateMempool", isPrivate, + "error", encoding.TryParsingCustomError(err), + ) + if isPrivate { + p.txmgrSelector.RecordPrivateTxMgrFailed() + } + return err + } + + if receipt.Status != types.ReceiptStatusSuccessful { + return fmt.Errorf("failed to propose block: %s", receipt.TxHash.Hex()) + } + return nil +} + // Name returns the application name. func (p *Proposer) Name() string { return "proposer" } -// initTierFees initializes the proving fees for every proof tier configured in the protocol for the proposer. -func (p *Proposer) initTierFees() error { - for _, tier := range p.tiers { - log.Info( - "Protocol tier", - "id", tier.ID, - "name", string(bytes.TrimRight(tier.VerifierName[:], "\x00")), - "validityBond", utils.WeiToEther(tier.ValidityBond), - "contestBond", utils.WeiToEther(tier.ContestBond), - "provingWindow", tier.ProvingWindow, - "cooldownWindow", tier.CooldownWindow, - ) +// TODO: check if this is needed +// getParentOfLatestProposedBlock returns the parent block of the latest proposed block in protocol +func (p *Proposer) getParentOfLatestProposedBlock( + ctx context.Context, + rpc *rpc.Client, +) (*bindings.TaikoDataBlockV2, error) { + state, err := rpc.TaikoL1.State(&bind.CallOpts{Context: ctx}) + if err != nil { + return nil, err + } - switch tier.ID { - case encoding.TierOptimisticID: - p.tierFees = append(p.tierFees, encoding.TierFee{Tier: tier.ID, Fee: p.OptimisticTierFee}) - case encoding.TierSgxID: - p.tierFees = append(p.tierFees, encoding.TierFee{Tier: tier.ID, Fee: p.SgxTierFee}) - case encoding.TierGuardianMinorityID: - p.tierFees = append(p.tierFees, encoding.TierFee{Tier: tier.ID, Fee: common.Big0}) - case encoding.TierGuardianMajorityID: - // Guardian prover should not charge any fee. - p.tierFees = append(p.tierFees, encoding.TierFee{Tier: tier.ID, Fee: common.Big0}) - default: - return fmt.Errorf("unknown tier: %d", tier.ID) - } + parent, err := rpc.GetL2BlockInfoV2(ctx, new(big.Int).SetUint64(state.SlotB.NumBlocks-1)) + if err != nil { + return nil, err } - return nil + return &parent, nil } diff --git a/packages/taiko-client/proposer/proposer_test.go b/packages/taiko-client/proposer/proposer_test.go index 23849d33cb7..f4dcc358f2f 100644 --- a/packages/taiko-client/proposer/proposer_test.go +++ b/packages/taiko-client/proposer/proposer_test.go @@ -2,30 +2,31 @@ package proposer import ( "context" + "crypto/ecdsa" + "fmt" + "maps" + "math/big" "os" "testing" "time" "github.com/ethereum-optimism/optimism/op-service/txmgr" + "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/crypto" - "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/miner" - "github.com/ethereum/go-ethereum/rlp" "github.com/stretchr/testify/suite" "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings" - "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/encoding" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/metadata" "github.com/taikoxyz/taiko-mono/packages/taiko-client/driver/chain_syncer/beaconsync" "github.com/taikoxyz/taiko-mono/packages/taiko-client/driver/chain_syncer/blob" "github.com/taikoxyz/taiko-mono/packages/taiko-client/driver/state" "github.com/taikoxyz/taiko-mono/packages/taiko-client/internal/testutils" - "github.com/taikoxyz/taiko-mono/packages/taiko-client/internal/utils" "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/jwt" "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/rpc" - builder "github.com/taikoxyz/taiko-mono/packages/taiko-client/proposer/transaction_builder" ) type ProposerTestSuite struct { @@ -65,32 +66,23 @@ func (s *ProposerTestSuite) SetupTest() { s.Nil(p.InitFromConfig(ctx, &Config{ ClientConfig: &rpc.ClientConfig{ - L1Endpoint: os.Getenv("L1_NODE_WS_ENDPOINT"), - L2Endpoint: os.Getenv("L2_EXECUTION_ENGINE_HTTP_ENDPOINT"), - L2EngineEndpoint: os.Getenv("L2_EXECUTION_ENGINE_AUTH_ENDPOINT"), + L1Endpoint: os.Getenv("L1_WS"), + L2Endpoint: os.Getenv("L2_HTTP"), + L2EngineEndpoint: os.Getenv("L2_AUTH"), JwtSecret: string(jwtSecret), - TaikoL1Address: common.HexToAddress(os.Getenv("TAIKO_L1_ADDRESS")), - TaikoL2Address: common.HexToAddress(os.Getenv("TAIKO_L2_ADDRESS")), - TaikoTokenAddress: common.HexToAddress(os.Getenv("TAIKO_TOKEN_ADDRESS")), - ProverSetAddress: common.HexToAddress(os.Getenv("PROVER_SET_ADDRESS")), + TaikoL1Address: common.HexToAddress(os.Getenv("TAIKO_L1")), + TaikoL2Address: common.HexToAddress(os.Getenv("TAIKO_L2")), + TaikoTokenAddress: common.HexToAddress(os.Getenv("TAIKO_TOKEN")), }, - AssignmentHookAddress: common.HexToAddress(os.Getenv("ASSIGNMENT_HOOK_ADDRESS")), L1ProposerPrivKey: l1ProposerPrivKey, L2SuggestedFeeRecipient: common.HexToAddress(os.Getenv("L2_SUGGESTED_FEE_RECIPIENT")), MinProposingInternal: 0, ProposeInterval: 1024 * time.Hour, MaxProposedTxListsPerEpoch: 1, - ProverEndpoints: s.ProverEndpoints, - OptimisticTierFee: common.Big256, - SgxTierFee: common.Big256, - TierFeePriceBump: common.Big2, - MaxTierFeePriceBumps: 3, - ExtraData: "test", - L1BlockBuilderTip: common.Big0, - BlobAllowed: true, ProposeBlockTxGasLimit: 10_000_000, + FallbackToCalldata: true, TxmgrConfigs: &txmgr.CLIConfig{ - L1RPCURL: os.Getenv("L1_NODE_WS_ENDPOINT"), + L1RPCURL: os.Getenv("L1_WS"), NumConfirmations: 0, SafeAbortNonceTooLowCount: txmgr.DefaultBatcherFlagValues.SafeAbortNonceTooLowCount, PrivateKey: common.Bytes2Hex(crypto.FromECDSA(l1ProposerPrivKey)), @@ -104,67 +96,153 @@ func (s *ProposerTestSuite) SetupTest() { TxSendTimeout: txmgr.DefaultBatcherFlagValues.TxSendTimeout, TxNotInMempoolTimeout: txmgr.DefaultBatcherFlagValues.TxNotInMempoolTimeout, }, - })) + PrivateTxmgrConfigs: &txmgr.CLIConfig{ + L1RPCURL: os.Getenv("L1_WS"), + NumConfirmations: 0, + SafeAbortNonceTooLowCount: txmgr.DefaultBatcherFlagValues.SafeAbortNonceTooLowCount, + PrivateKey: common.Bytes2Hex(crypto.FromECDSA(l1ProposerPrivKey)), + FeeLimitMultiplier: txmgr.DefaultBatcherFlagValues.FeeLimitMultiplier, + FeeLimitThresholdGwei: txmgr.DefaultBatcherFlagValues.FeeLimitThresholdGwei, + MinBaseFeeGwei: txmgr.DefaultBatcherFlagValues.MinBaseFeeGwei, + MinTipCapGwei: txmgr.DefaultBatcherFlagValues.MinTipCapGwei, + ResubmissionTimeout: txmgr.DefaultBatcherFlagValues.ResubmissionTimeout, + ReceiptQueryInterval: 1 * time.Second, + NetworkTimeout: txmgr.DefaultBatcherFlagValues.NetworkTimeout, + TxSendTimeout: txmgr.DefaultBatcherFlagValues.TxSendTimeout, + TxNotInMempoolTimeout: txmgr.DefaultBatcherFlagValues.TxNotInMempoolTimeout, + }, + }, nil, nil)) s.p = p s.cancel = cancel } -func (s *ProposerTestSuite) TestProposeTxLists() { - s.T().Skip("Skipping, preconfer changes") - p := s.p - ctx := p.ctx - cfg := s.p.Config - - txBuilder := builder.NewBlobTransactionBuilder( - p.rpc, - p.L1ProposerPrivKey, - p.proverSelector, - p.Config.L1BlockBuilderTip, - cfg.TaikoL1Address, - cfg.L2SuggestedFeeRecipient, - cfg.AssignmentHookAddress, - cfg.ProposeBlockTxGasLimit, - cfg.ExtraData, - ) - - emptyTxListBytes, err := rlp.EncodeToBytes(types.Transactions{}) - s.Nil(err) - txListsBytes := [][]byte{emptyTxListBytes} - txCandidates := make([]txmgr.TxCandidate, len(txListsBytes)) - for i, txListBytes := range txListsBytes { - compressedTxListBytes, err := utils.Compress(txListBytes) - if err != nil { - log.Warn("Failed to compress transactions list", "index", i, "error", err) - break - } +func (s *ProposerTestSuite) TestTxPoolContentWithMinTip() { + if os.Getenv("L2_NODE") == "l2_reth" { + s.T().Skip() + } - candidate, err := txBuilder.Build( - p.ctx, - p.tierFees, - p.IncludeParentMetaHash, - compressedTxListBytes, + // Empty mempool at first. + for { + poolContent, err := s.RPCClient.GetPoolContent( + context.Background(), + s.p.proposerAddress, + s.p.protocolConfigs.BlockMaxGasLimit, + rpc.BlockMaxTxListBytes, + s.p.LocalAddresses, + 10, + 0, + s.p.chainConfig, ) - if err != nil { - log.Warn("Failed to build TaikoL1.proposeBlock transaction", "error", err) - break + s.Nil(err) + + if len(poolContent) > 0 { + s.Nil(s.p.ProposeOp(context.Background())) + s.Nil(s.s.ProcessL1Blocks(context.Background())) + continue } + break + } - // trigger the error - candidate.GasLimit = 10_000_000 + privetKeyHexList := []string{ + "0x59c6995e998f97a5a0044966f0945389dc9e86dae88c7a8412f4603b6b78690d", // 0x70997970C51812dc3A010C7d01b50e0d17dc79C8 + "0x5de4111afa1a4b94908f83103eb1f1706367c2e68ca870fc3fb9a804cdab365a", // 0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC + "0x7c852118294e51e653712a81e05800f419141751be58f605c371e15141b007a6", // 0x90F79bf6EB2c4f870365E785982E1f101E93b906 + "0x47e179ec197488593b187f80a00eb0da91f1b9d0b13f8733639f19c30a34926a", // 0x15d34AAf54267DB7D7c367839AAf71A00a2C6A65 + "0x8b3a350cf5c34c9194ca85829a2df0ec3153be0318b5e2d3348e872092edffba", // 0x9965507D1a55bcC2695C58ba16FB37d819B0A4dc + } - txCandidates[i] = *candidate + var privateKeys []*ecdsa.PrivateKey + for _, privateKeyHex := range privetKeyHexList { + priv, err := crypto.ToECDSA(common.FromHex(privateKeyHex)) + s.Nil(err) + privateKeys = append(privateKeys, priv) } - for _, txCandidate := range txCandidates { - receipt, err := p.txmgr.Send(ctx, txCandidate) + originalNonceMap := make(map[common.Address]uint64) + for _, priv := range privateKeys { + transactOpts, err := bind.NewKeyedTransactorWithChainID(priv, s.RPCClient.L2.ChainID) s.Nil(err) - s.Nil(encoding.TryParsingCustomErrorFromReceipt(ctx, p.rpc.L1, p.proposerAddress, receipt)) + nonce, err := s.RPCClient.L2.PendingNonceAt(context.Background(), transactOpts.From) + s.Nil(err) + originalNonceMap[transactOpts.From] = nonce + // Send 1500 transactions to mempool + for i := 0; i < 300; i++ { + _, err = testutils.AssembleTestTx(s.RPCClient.L2, priv, nonce+uint64(i), &transactOpts.From, common.Big1, nil) + s.Nil(err) + } } + + for _, testCase := range []struct { + blockMaxGasLimit uint32 + blockMaxTxListBytes uint64 + maxTransactionsLists uint64 + txLengthList []int + }{ + { + s.p.protocolConfigs.BlockMaxGasLimit, + rpc.BlockMaxTxListBytes, + s.p.MaxProposedTxListsPerEpoch, + []int{1500}, + }, + { + s.p.protocolConfigs.BlockMaxGasLimit, + rpc.BlockMaxTxListBytes, + s.p.MaxProposedTxListsPerEpoch * 5, + []int{1500}, + }, + { + s.p.protocolConfigs.BlockMaxGasLimit / 50, + rpc.BlockMaxTxListBytes, + 200, + []int{129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 81}, + }, + } { + poolContent, err := s.RPCClient.GetPoolContent( + context.Background(), + s.p.proposerAddress, + testCase.blockMaxGasLimit, + testCase.blockMaxTxListBytes, + s.p.LocalAddresses, + testCase.maxTransactionsLists, + 0, + s.p.chainConfig, + ) + s.Nil(err) + + nonceMap := maps.Clone(originalNonceMap) + // Check the order of nonce. + for _, txList := range poolContent { + for _, tx := range txList.TxList { + sender, err := types.Sender(types.LatestSignerForChainID(s.RPCClient.L2.ChainID), tx) + s.Nil(err) + s.Equalf(nonceMap[sender], tx.Nonce(), + fmt.Sprintf("incorrect nonce of %s, expect: %d, actual: %d", + sender.String(), + nonceMap[sender], + tx.Nonce(), + )) + nonceMap[sender]++ + } + } + + s.GreaterOrEqual(int(testCase.maxTransactionsLists), len(poolContent)) + for i, txsLen := range testCase.txLengthList { + s.Equal(txsLen, poolContent[i].TxList.Len()) + s.GreaterOrEqual(uint64(testCase.blockMaxGasLimit), poolContent[i].EstimatedGasUsed) + s.GreaterOrEqual(testCase.blockMaxTxListBytes, poolContent[i].BytesLength) + } + } + + s.Nil(s.p.ProposeOp(context.Background())) + s.Nil(s.s.ProcessL1Blocks(context.Background())) } func (s *ProposerTestSuite) TestProposeOpNoEmptyBlock() { - s.T().Skip("Skipping, preconfer changes") + // TODO: Temporarily skip this test case when using l2_reth node. + if os.Getenv("L2_NODE") == "l2_reth" { + s.T().Skip() + } defer s.Nil(s.s.ProcessL1Blocks(context.Background())) p := s.p @@ -187,6 +265,8 @@ func (s *ProposerTestSuite) TestProposeOpNoEmptyBlock() { rpc.BlockMaxTxListBytes, p.LocalAddresses, p.MaxProposedTxListsPerEpoch, + 0, + p.chainConfig, ) time.Sleep(time.Second) } @@ -220,16 +300,13 @@ func (s *ProposerTestSuite) TestProposeOpNoEmptyBlock() { } func (s *ProposerTestSuite) TestName() { - s.T().Skip("Skipping, preconfer changes") s.Equal("proposer", s.p.Name()) } func (s *ProposerTestSuite) TestProposeOp() { - s.T().Skip("Skipping, preconfer changes") // Propose txs in L2 execution engine's mempool - sink := make(chan *bindings.TaikoL1ClientBlockProposed) - - sub, err := s.p.rpc.TaikoL1.WatchBlockProposed(nil, sink, nil, nil) + sink := make(chan *bindings.TaikoL1ClientBlockProposedV2) + sub, err := s.p.rpc.TaikoL1.WatchBlockProposedV2(nil, sink, nil) s.Nil(err) defer func() { sub.Unsubscribe() @@ -242,35 +319,60 @@ func (s *ProposerTestSuite) TestProposeOp() { s.Nil(s.p.ProposeOp(context.Background())) - event := <-sink - - s.Equal(event.Meta.Coinbase, s.p.L2SuggestedFeeRecipient) + var ( + event = <-sink + meta = metadata.NewTaikoDataBlockMetadataOntake(event) + ) + s.Equal(meta.GetCoinbase(), s.p.L2SuggestedFeeRecipient) - _, isPending, err := s.p.rpc.L1.TransactionByHash(context.Background(), event.Raw.TxHash) + _, isPending, err := s.p.rpc.L1.TransactionByHash(context.Background(), meta.GetTxHash()) s.Nil(err) s.False(isPending) - receipt, err := s.p.rpc.L1.TransactionReceipt(context.Background(), event.Raw.TxHash) + receipt, err := s.p.rpc.L1.TransactionReceipt(context.Background(), meta.GetTxHash()) s.Nil(err) s.Equal(types.ReceiptStatusSuccessful, receipt.Status) } func (s *ProposerTestSuite) TestProposeEmptyBlockOp() { - s.T().Skip("Skipping, preconfer changes") s.p.MinProposingInternal = 1 * time.Second s.p.lastProposedAt = time.Now().Add(-10 * time.Second) s.Nil(s.p.ProposeOp(context.Background())) } -func (s *ProposerTestSuite) TestAssignProverSuccessFirstRound() { - s.T().Skip("Skipping, preconfer changes") - s.SetL1Automine(false) - defer s.SetL1Automine(true) +func (s *ProposerTestSuite) TestProposeTxListOntake() { + for i := 0; i < int(s.p.protocolConfigs.OntakeForkHeight); i++ { + s.ProposeAndInsertValidBlock(s.p, s.s) + } - _, _, fee, err := s.p.proverSelector.AssignProver(context.Background(), s.p.tierFees, testutils.RandomHash()) + l2Head, err := s.p.rpc.L2.HeaderByNumber(context.Background(), nil) + s.Nil(err) + s.GreaterOrEqual(l2Head.Number.Uint64(), s.p.protocolConfigs.OntakeForkHeight) + sink := make(chan *bindings.TaikoL1ClientBlockProposedV2) + sub, err := s.p.rpc.TaikoL1.WatchBlockProposedV2(nil, sink, nil) s.Nil(err) - s.Equal(fee.Uint64(), s.p.OptimisticTierFee.Uint64()) + defer func() { + sub.Unsubscribe() + close(sink) + }() + s.Nil(s.p.ProposeTxListOntake(context.Background(), []types.Transactions{{}, {}})) + s.Nil(s.s.ProcessL1Blocks(context.Background())) + + var l1Height *big.Int + for i := 0; i < 2; i++ { + event := <-sink + if l1Height == nil { + l1Height = new(big.Int).SetUint64(event.Raw.BlockNumber) + continue + } + s.Equal(l1Height.Uint64(), event.Raw.BlockNumber) + } + + newL2head, err := s.p.rpc.L2.HeaderByNumber(context.Background(), nil) + s.Nil(err) + + s.Equal(l2Head.Number.Uint64()+2, newL2head.Number.Uint64()) } func (s *ProposerTestSuite) TestUpdateProposingTicker() { diff --git a/packages/taiko-client/proposer/prover_selector/eth_fee_eoa_selector.go b/packages/taiko-client/proposer/prover_selector/eth_fee_eoa_selector.go deleted file mode 100644 index 64791202645..00000000000 --- a/packages/taiko-client/proposer/prover_selector/eth_fee_eoa_selector.go +++ /dev/null @@ -1,269 +0,0 @@ -package selector - -import ( - "context" - "errors" - "fmt" - "math/big" - "math/rand" - "net/url" - "time" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/log" - "github.com/go-resty/resty/v2" - - "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings" - "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/encoding" - "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/rpc" - "github.com/taikoxyz/taiko-mono/packages/taiko-client/prover/server" -) - -var ( - httpScheme = "http" - httpsScheme = "https" - errEmptyProverEndpoints = errors.New("empty prover endpoints") - errUnableToFindProver = errors.New("unable to find prover") -) - -// ETHFeeEOASelector is a prover selector implementation which use ETHs as prover fee and -// all provers selected must be EOA accounts. -type ETHFeeEOASelector struct { - protocolConfigs *bindings.TaikoDataConfig - rpc *rpc.Client - proposerAddress common.Address - taikoL1Address common.Address - assignmentHookAddress common.Address - tiersFee []encoding.TierFee - tierFeePriceBump *big.Int - proverEndpoints []*url.URL - maxTierFeePriceBumpIterations uint64 - proposalExpiry time.Duration - requestTimeout time.Duration -} - -// NewETHFeeEOASelector creates a new ETHFeeEOASelector instance. -func NewETHFeeEOASelector( - protocolConfigs *bindings.TaikoDataConfig, - rpc *rpc.Client, - proposerAddress common.Address, - taikoL1Address common.Address, - assignmentHookAddress common.Address, - tiersFee []encoding.TierFee, - tierFeePriceBump *big.Int, - proverEndpoints []*url.URL, - maxTierFeePriceBumpIterations uint64, - proposalExpiry time.Duration, - requestTimeout time.Duration, -) (*ETHFeeEOASelector, error) { - if len(proverEndpoints) == 0 { - return nil, errEmptyProverEndpoints - } - - for _, endpoint := range proverEndpoints { - if endpoint.Scheme != httpScheme && endpoint.Scheme != httpsScheme { - return nil, fmt.Errorf("invalid prover endpoint %s", endpoint) - } - } - - return ÐFeeEOASelector{ - protocolConfigs, - rpc, - proposerAddress, - taikoL1Address, - assignmentHookAddress, - tiersFee, - tierFeePriceBump, - proverEndpoints, - maxTierFeePriceBumpIterations, - proposalExpiry, - requestTimeout, - }, nil -} - -// ProverEndpoints returns all registered prover endpoints. -func (s *ETHFeeEOASelector) ProverEndpoints() []*url.URL { return s.proverEndpoints } - -// AssignProver tries to pick a prover through the registered prover endpoints. -func (s *ETHFeeEOASelector) AssignProver( - ctx context.Context, - tierFees []encoding.TierFee, - txListHash common.Hash, -) (*encoding.ProverAssignment, common.Address, *big.Int, error) { - var ( - expiry = uint64(time.Now().Add(s.proposalExpiry).Unix()) - fees = make([]encoding.TierFee, len(tierFees)) - big100 = new(big.Int).SetUint64(uint64(100)) - maxProverFee = common.Big0 - ) - - // Deep copy the tierFees slice. - for i, fee := range tierFees { - fees[i] = encoding.TierFee{Tier: fee.Tier, Fee: new(big.Int).Set(fee.Fee)} - } - - // Iterate over each configured endpoint, and see if someone wants to accept this block. - // If it is denied, we continue on to the next endpoint. - // If we do not find a prover, we can increase the fee up to a point, or give up. - for i := 0; i < int(s.maxTierFeePriceBumpIterations); i++ { - // Bump tier fee on each failed loop. - cumulativeBumpPercent := new(big.Int).Mul(s.tierFeePriceBump, new(big.Int).SetUint64(uint64(i))) - for idx := range fees { - if i > 0 { - fee := new(big.Int).Mul(fees[idx].Fee, cumulativeBumpPercent) - fees[idx].Fee = fees[idx].Fee.Add(fees[idx].Fee, fee.Div(fee, big100)) - } - if fees[idx].Fee.Cmp(maxProverFee) > 0 { - maxProverFee = fees[idx].Fee - } - } - - // Try to assign a prover from all given endpoints. - for _, endpoint := range s.shuffleProverEndpoints() { - encodedAssignment, proverAddress, err := assignProver( - ctx, - s.protocolConfigs.ChainId, - endpoint, - expiry, - s.proposerAddress, - fees, - s.taikoL1Address, - s.assignmentHookAddress, - txListHash, - s.requestTimeout, - ) - if err != nil { - log.Warn("Failed to assign prover", "endpoint", endpoint, "error", err) - continue - } - - ok, err := rpc.CheckProverBalance( - ctx, - s.rpc, - proverAddress, - s.assignmentHookAddress, - s.protocolConfigs.LivenessBond, - ) - if err != nil { - log.Warn("Failed to check prover balance", "endpoint", endpoint, "error", err) - continue - } - if !ok { - continue - } - - return encodedAssignment, proverAddress, maxProverFee, nil - } - } - - return nil, common.Address{}, nil, errUnableToFindProver -} - -// shuffleProverEndpoints shuffles the current selector's prover endpoints. -func (s *ETHFeeEOASelector) shuffleProverEndpoints() []*url.URL { - // Clone the slice to avoid modifying the original proverEndpoints - shuffledEndpoints := make([]*url.URL, len(s.proverEndpoints)) - copy(shuffledEndpoints, s.proverEndpoints) - - rand.Shuffle(len(shuffledEndpoints), func(i, j int) { - shuffledEndpoints[i], shuffledEndpoints[j] = shuffledEndpoints[j], shuffledEndpoints[i] - }) - return shuffledEndpoints -} - -// assignProver tries to assign a proof generation task to the given prover by HTTP API. -func assignProver( - ctx context.Context, - chainID uint64, - endpoint *url.URL, - expiry uint64, - proposerAddress common.Address, - tierFees []encoding.TierFee, - taikoL1Address common.Address, - assignmentHookAddress common.Address, - txListHash common.Hash, - timeout time.Duration, -) (*encoding.ProverAssignment, common.Address, error) { - log.Info( - "Attempting to assign prover", - "endpoint", endpoint, - "expiry", expiry, - "txListHash", txListHash, - "tierFees", tierFees, - ) - - // Send the HTTP request - var ( - client = resty.New() - reqBody = &server.CreateAssignmentRequestBody{ - Proposer: proposerAddress, - FeeToken: rpc.ZeroAddress, - TierFees: tierFees, - Expiry: expiry, - BlobHash: txListHash, - } - result = server.ProposeBlockResponse{} - ) - requestURL, err := url.JoinPath(endpoint.String(), "/assignment") - if err != nil { - return nil, common.Address{}, err - } - - ctxTimeout, cancel := context.WithTimeout(ctx, timeout) - defer cancel() - - resp, err := client.R(). - SetContext(ctxTimeout). - SetHeader("Content-Type", "application/json"). - SetHeader("Accept", "application/json"). - SetBody(reqBody). - SetResult(&result). - Post(requestURL) - if err != nil { - return nil, common.Address{}, err - } - if !resp.IsSuccess() { - return nil, common.Address{}, fmt.Errorf("unsuccessful response %d", resp.StatusCode()) - } - - // Ensure prover in response is the same as the one recovered - // from the signature - _, err = encoding.EncodeProverAssignmentPayload( - chainID, - taikoL1Address, - assignmentHookAddress, - proposerAddress, - result.Prover, - txListHash, - common.Address{}, - expiry, - result.MaxBlockID, - result.MaxProposedIn, - tierFees, - ) - if err != nil { - return nil, common.Address{}, err - } - - log.Info( - "Prover assigned", - "address", result.Prover, - "endpoint", endpoint, - "tierFees", tierFees, - "maxBlockID", result.MaxBlockID, - "expiry", expiry, - ) - - // Convert signature to one solidity can recover by adding 27 to 65th byte - result.SignedPayload[64] = uint8(uint(result.SignedPayload[64])) + 27 - - return &encoding.ProverAssignment{ - FeeToken: common.Address{}, - TierFees: tierFees, - Expiry: reqBody.Expiry, - MaxBlockId: result.MaxBlockID, - MaxProposedIn: result.MaxProposedIn, - MetaHash: [32]byte{}, - Signature: result.SignedPayload, - }, result.Prover, nil -} diff --git a/packages/taiko-client/proposer/prover_selector/eth_fee_eoa_selector_test.go b/packages/taiko-client/proposer/prover_selector/eth_fee_eoa_selector_test.go deleted file mode 100644 index c8a776a2275..00000000000 --- a/packages/taiko-client/proposer/prover_selector/eth_fee_eoa_selector_test.go +++ /dev/null @@ -1,71 +0,0 @@ -package selector - -import ( - "context" - "net/url" - "os" - "testing" - "time" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/crypto" - "github.com/stretchr/testify/suite" - - "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/encoding" - "github.com/taikoxyz/taiko-mono/packages/taiko-client/internal/testutils" -) - -type ProverSelectorTestSuite struct { - testutils.ClientTestSuite - s *ETHFeeEOASelector - proverAddress common.Address -} - -func (s *ProverSelectorTestSuite) SetupTest() { - s.ClientTestSuite.SetupTest() - - l1ProverPrivKey, err := crypto.ToECDSA(common.FromHex(os.Getenv("L1_PROVER_PRIVATE_KEY"))) - s.Nil(err) - s.proverAddress = crypto.PubkeyToAddress(l1ProverPrivKey.PublicKey) - - l1ProposerPrivKey, err := crypto.ToECDSA(common.FromHex(os.Getenv("L1_PROPOSER_PRIVATE_KEY"))) - s.Nil(err) - - protocolConfigs, err := s.RPCClient.TaikoL1.GetConfig(nil) - s.Nil(err) - - s.s, err = NewETHFeeEOASelector( - &protocolConfigs, - s.RPCClient, - crypto.PubkeyToAddress(l1ProposerPrivKey.PublicKey), - common.HexToAddress(os.Getenv("TAIKO_L1_ADDRESS")), - common.HexToAddress(os.Getenv("ASSIGNMENT_HOOK_ADDRESS")), - []encoding.TierFee{}, - common.Big2, - []*url.URL{s.ProverEndpoints[0]}, - 32, - 1*time.Minute, - 1*time.Minute, - ) - s.Nil(err) -} - -func (s *ProverSelectorTestSuite) TestProverEndpoints() { - s.T().Skip("Skipping, preconfer changes") - s.Equal(1, len(s.s.ProverEndpoints())) -} - -func (s *ProverSelectorTestSuite) TestProverAssignProver() { - s.T().Skip("Skipping, preconfer changes") - sig, _, fee, err := s.s.AssignProver(context.Background(), []encoding.TierFee{ - {Tier: encoding.TierOptimisticID, Fee: common.Big256}, - {Tier: encoding.TierSgxID, Fee: common.Big256}, - }, testutils.RandomHash()) - s.NotEmpty(sig) - s.Equal(fee.Cmp(common.Big32), 1) - s.Nil(err) -} - -func TestProverSelectorTestSuite(t *testing.T) { - suite.Run(t, new(ProverSelectorTestSuite)) -} diff --git a/packages/taiko-client/proposer/prover_selector/interface.go b/packages/taiko-client/proposer/prover_selector/interface.go deleted file mode 100644 index a0b55801fa7..00000000000 --- a/packages/taiko-client/proposer/prover_selector/interface.go +++ /dev/null @@ -1,20 +0,0 @@ -package selector - -import ( - "context" - "math/big" - "net/url" - - "github.com/ethereum/go-ethereum/common" - - "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/encoding" -) - -type ProverSelector interface { - AssignProver( - ctx context.Context, - tierFees []encoding.TierFee, - txListHash common.Hash, - ) (assignment *encoding.ProverAssignment, assignedProver common.Address, fee *big.Int, err error) - ProverEndpoints() []*url.URL -} diff --git a/packages/taiko-client/proposer/transaction_builder/blob.go b/packages/taiko-client/proposer/transaction_builder/blob.go index 18fa977d362..ba40b1285fc 100644 --- a/packages/taiko-client/proposer/transaction_builder/blob.go +++ b/packages/taiko-client/proposer/transaction_builder/blob.go @@ -3,18 +3,17 @@ package builder import ( "context" "crypto/ecdsa" - "crypto/sha256" + "fmt" "math/big" "github.com/ethereum-optimism/optimism/op-service/eth" "github.com/ethereum-optimism/optimism/op-service/txmgr" + "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/crypto/kzg4844" "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/encoding" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/config" "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/rpc" - selector "github.com/taikoxyz/taiko-mono/packages/taiko-client/proposer/prover_selector" ) // BlobTransactionBuilder is responsible for building a TaikoL1.proposeBlock transaction with txList @@ -22,121 +21,107 @@ import ( type BlobTransactionBuilder struct { rpc *rpc.Client proposerPrivateKey *ecdsa.PrivateKey - proverSelector selector.ProverSelector - l1BlockBuilderTip *big.Int taikoL1Address common.Address + proverSetAddress common.Address l2SuggestedFeeRecipient common.Address - assignmentHookAddress common.Address gasLimit uint64 - extraData string + chainConfig *config.ChainConfig + revertProtectionEnabled bool } // NewBlobTransactionBuilder creates a new BlobTransactionBuilder instance based on giving configurations. func NewBlobTransactionBuilder( rpc *rpc.Client, proposerPrivateKey *ecdsa.PrivateKey, - proverSelector selector.ProverSelector, - l1BlockBuilderTip *big.Int, taikoL1Address common.Address, + proverSetAddress common.Address, l2SuggestedFeeRecipient common.Address, - assignmentHookAddress common.Address, gasLimit uint64, - extraData string, + chainConfig *config.ChainConfig, + revertProtectionEnabled bool, ) *BlobTransactionBuilder { return &BlobTransactionBuilder{ rpc, proposerPrivateKey, - proverSelector, - l1BlockBuilderTip, taikoL1Address, + proverSetAddress, l2SuggestedFeeRecipient, - assignmentHookAddress, gasLimit, - extraData, + chainConfig, + revertProtectionEnabled, } } -// Build implements the ProposeBlockTransactionBuilder interface. -func (b *BlobTransactionBuilder) Build( +// BuildOntake implements the ProposeBlockTransactionBuilder interface. +func (b *BlobTransactionBuilder) BuildOntake( ctx context.Context, - tierFees []encoding.TierFee, - includeParentMetaHash bool, - txListBytes []byte, + txListBytesArray [][]byte, ) (*txmgr.TxCandidate, error) { - var blob = ð.Blob{} - if err := blob.FromData(txListBytes); err != nil { + // Check if the current L2 chain is after ontake fork. + state, err := rpc.GetProtocolStateVariables(b.rpc.TaikoL1, &bind.CallOpts{Context: ctx}) + if err != nil { return nil, err } - // Make a sidecar then calculate the blob hash. - sideCar, _, err := txmgr.MakeSidecar([]*eth.Blob{blob}) - if err != nil { - return nil, err + if !b.chainConfig.IsOntake(new(big.Int).SetUint64(state.B.NumBlocks)) { + return nil, fmt.Errorf("ontake transaction builder is not supported before ontake fork") } - // Try to assign a prover. - assignment, assignedProver, maxFee, err := b.proverSelector.AssignProver( - ctx, - tierFees, - sideCar.BlobHashes()[0], + // ABI encode the TaikoL1.proposeBlocksV2 / ProverSet.proposeBlocksV2 parameters. + var ( + to = &b.taikoL1Address + data []byte + blobs []*eth.Blob + encodedParamsArray [][]byte ) - if err != nil { - return nil, err + if b.proverSetAddress != rpc.ZeroAddress { + to = &b.proverSetAddress } - // If the current proposer wants to include the parent meta hash, then fetch it from the protocol. - var parentMetaHash = [32]byte{} - if includeParentMetaHash { - if parentMetaHash, err = GetParentMetaHash(ctx, b.rpc); err != nil { + for i := range txListBytesArray { + var blob = ð.Blob{} + if err := blob.FromData(txListBytesArray[i]); err != nil { return nil, err } - } - - // Initially just use the AssignmentHook default. - hookInputData, err := encoding.EncodeAssignmentHookInput(&encoding.AssignmentHookInput{ - Assignment: assignment, - Tip: b.l1BlockBuilderTip, - }) - if err != nil { - return nil, err - } - commitment, err := blob.ComputeKZGCommitment() - if err != nil { - return nil, err - } - blobHash := kzg4844.CalcBlobHashV1(sha256.New(), &commitment) + blobs = append(blobs, blob) - signature, err := crypto.Sign(blobHash[:], b.proposerPrivateKey) - if err != nil { - return nil, err - } - signature[64] = uint8(uint(signature[64])) + 27 + encodedParams, err := encoding.EncodeBlockParamsOntake(&encoding.BlockParamsV2{ + Coinbase: b.l2SuggestedFeeRecipient, + ParentMetaHash: [32]byte{}, + AnchorBlockId: 0, + Timestamp: 0, + BlobTxListOffset: 0, + BlobTxListLength: uint32(len(txListBytesArray[i])), + BlobIndex: uint8(i), + }) + if err != nil { + return nil, err + } - // ABI encode the TaikoL1.proposeBlock parameters. - encodedParams, err := encoding.EncodeBlockParams(&encoding.BlockParams{ - AssignedProver: assignedProver, - ExtraData: rpc.StringToBytes32(b.extraData), - Coinbase: b.l2SuggestedFeeRecipient, - ParentMetaHash: parentMetaHash, - HookCalls: []encoding.HookCall{{Hook: b.assignmentHookAddress, Data: hookInputData}}, - Signature: signature, - }) - if err != nil { - return nil, err + encodedParamsArray = append(encodedParamsArray, encodedParams) } - - // Send the transaction to the L1 node. - data, err := encoding.TaikoL1ABI.Pack("proposeBlock", encodedParams, []byte{}) - if err != nil { - return nil, err + txListArray := make([][]byte, len(encodedParamsArray)) + if b.proverSetAddress != rpc.ZeroAddress { + if b.revertProtectionEnabled { + data, err = encoding.ProverSetABI.Pack("proposeBlocksV2Conditionally", encodedParamsArray, txListArray) + } else { + data, err = encoding.ProverSetABI.Pack("proposeBlocksV2", encodedParamsArray, txListArray) + } + if err != nil { + return nil, err + } + } else { + data, err = encoding.TaikoL1ABI.Pack("proposeBlocksV2", encodedParamsArray, txListArray) + if err != nil { + return nil, err + } } return &txmgr.TxCandidate{ TxData: data, - Blobs: []*eth.Blob{blob}, - To: &b.taikoL1Address, + Blobs: blobs, + To: to, GasLimit: b.gasLimit, - Value: maxFee, }, nil } diff --git a/packages/taiko-client/proposer/transaction_builder/calldata.go b/packages/taiko-client/proposer/transaction_builder/calldata.go index 120d227e101..e7355eeca6b 100644 --- a/packages/taiko-client/proposer/transaction_builder/calldata.go +++ b/packages/taiko-client/proposer/transaction_builder/calldata.go @@ -3,15 +3,16 @@ package builder import ( "context" "crypto/ecdsa" + "fmt" "math/big" "github.com/ethereum-optimism/optimism/op-service/txmgr" + "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/crypto" "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/encoding" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/config" "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/rpc" - selector "github.com/taikoxyz/taiko-mono/packages/taiko-client/proposer/prover_selector" ) // CalldataTransactionBuilder is responsible for building a TaikoL1.proposeBlock transaction with txList @@ -19,104 +20,93 @@ import ( type CalldataTransactionBuilder struct { rpc *rpc.Client proposerPrivateKey *ecdsa.PrivateKey - proverSelector selector.ProverSelector - l1BlockBuilderTip *big.Int l2SuggestedFeeRecipient common.Address taikoL1Address common.Address - assignmentHookAddress common.Address + proverSetAddress common.Address gasLimit uint64 - extraData string + chainConfig *config.ChainConfig + revertProtectionEnabled bool } // NewCalldataTransactionBuilder creates a new CalldataTransactionBuilder instance based on giving configurations. func NewCalldataTransactionBuilder( rpc *rpc.Client, proposerPrivateKey *ecdsa.PrivateKey, - proverSelector selector.ProverSelector, - l1BlockBuilderTip *big.Int, l2SuggestedFeeRecipient common.Address, taikoL1Address common.Address, - assignmentHookAddress common.Address, + proverSetAddress common.Address, gasLimit uint64, - extraData string, + chainConfig *config.ChainConfig, + revertProtectionEnabled bool, ) *CalldataTransactionBuilder { return &CalldataTransactionBuilder{ rpc, proposerPrivateKey, - proverSelector, - l1BlockBuilderTip, l2SuggestedFeeRecipient, taikoL1Address, - assignmentHookAddress, + proverSetAddress, gasLimit, - extraData, + chainConfig, + revertProtectionEnabled, } } -// Build implements the ProposeBlockTransactionBuilder interface. -func (b *CalldataTransactionBuilder) Build( +// BuildOntake implements the ProposeBlockTransactionBuilder interface. +func (b *CalldataTransactionBuilder) BuildOntake( ctx context.Context, - tierFees []encoding.TierFee, - includeParentMetaHash bool, - txListBytes []byte, + txListBytesArray [][]byte, ) (*txmgr.TxCandidate, error) { - // Try to assign a prover. - assignment, assignedProver, maxFee, err := b.proverSelector.AssignProver( - ctx, - tierFees, - crypto.Keccak256Hash(txListBytes), - ) + // Check if the current L2 chain is after ontake fork. + state, err := rpc.GetProtocolStateVariables(b.rpc.TaikoL1, &bind.CallOpts{Context: ctx}) if err != nil { return nil, err } - // If the current proposer wants to include the parent meta hash, then fetch it from the protocol. - var parentMetaHash = [32]byte{} - if includeParentMetaHash { - if parentMetaHash, err = GetParentMetaHash(ctx, b.rpc); err != nil { - return nil, err - } + if !b.chainConfig.IsOntake(new(big.Int).SetUint64(state.B.NumBlocks)) { + return nil, fmt.Errorf("ontake transaction builder is not supported before ontake fork") } - // Initially just use the AssignmentHook default. - hookInputData, err := encoding.EncodeAssignmentHookInput(&encoding.AssignmentHookInput{ - Assignment: assignment, - Tip: b.l1BlockBuilderTip, - }) - if err != nil { - return nil, err - } - - signature, err := crypto.Sign(crypto.Keccak256(txListBytes), b.proposerPrivateKey) - if err != nil { - return nil, err - } - signature[64] = uint8(uint(signature[64])) + 27 + // ABI encode the TaikoL1.proposeBlocksV2 / ProverSet.proposeBlocksV2 parameters. + var ( + to = &b.taikoL1Address + data []byte + encodedParamsArray [][]byte + ) - // ABI encode the TaikoL1.proposeBlock parameters. - encodedParams, err := encoding.EncodeBlockParams(&encoding.BlockParams{ - AssignedProver: assignedProver, - Coinbase: b.l2SuggestedFeeRecipient, - ExtraData: rpc.StringToBytes32(b.extraData), - ParentMetaHash: parentMetaHash, - HookCalls: []encoding.HookCall{{Hook: b.assignmentHookAddress, Data: hookInputData}}, - Signature: signature, - }) - if err != nil { - return nil, err + for range txListBytesArray { + encodedParams, err := encoding.EncodeBlockParamsOntake(&encoding.BlockParamsV2{ + Coinbase: b.l2SuggestedFeeRecipient, + ParentMetaHash: [32]byte{}, + AnchorBlockId: 0, + Timestamp: 0, + }) + if err != nil { + return nil, err + } + encodedParamsArray = append(encodedParamsArray, encodedParams) } - // Send the transaction to the L1 node. - data, err := encoding.TaikoL1ABI.Pack("proposeBlock", encodedParams, txListBytes) - if err != nil { - return nil, err + if b.proverSetAddress != rpc.ZeroAddress { + to = &b.proverSetAddress + if b.revertProtectionEnabled { + data, err = encoding.ProverSetABI.Pack("proposeBlocksV2Conditionally", encodedParamsArray, txListBytesArray) + } else { + data, err = encoding.ProverSetABI.Pack("proposeBlocksV2", encodedParamsArray, txListBytesArray) + } + if err != nil { + return nil, err + } + } else { + data, err = encoding.TaikoL1ABI.Pack("proposeBlocksV2", encodedParamsArray, txListBytesArray) + if err != nil { + return nil, err + } } return &txmgr.TxCandidate{ TxData: data, Blobs: nil, - To: &b.taikoL1Address, + To: to, GasLimit: b.gasLimit, - Value: maxFee, }, nil } diff --git a/packages/taiko-client/proposer/transaction_builder/calldata_test.go b/packages/taiko-client/proposer/transaction_builder/calldata_test.go index f5f4a27a161..a768b7be558 100644 --- a/packages/taiko-client/proposer/transaction_builder/calldata_test.go +++ b/packages/taiko-client/proposer/transaction_builder/calldata_test.go @@ -2,19 +2,62 @@ package builder import ( "context" + "os" + "testing" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" + "github.com/stretchr/testify/suite" - "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/encoding" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/internal/testutils" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/config" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/rpc" ) +type TransactionBuilderTestSuite struct { + testutils.ClientTestSuite + calldataTxBuilder *CalldataTransactionBuilder + blobTxBuiler *BlobTransactionBuilder +} + +func (s *TransactionBuilderTestSuite) SetupTest() { + s.ClientTestSuite.SetupTest() + + l1ProposerPrivKey, err := crypto.ToECDSA(common.FromHex(os.Getenv("L1_PROPOSER_PRIVATE_KEY"))) + s.Nil(err) + + protocolConfigs, err := rpc.GetProtocolConfigs(s.RPCClient.TaikoL1, nil) + s.Nil(err) + + chainConfig := config.NewChainConfig(&protocolConfigs) + + s.calldataTxBuilder = NewCalldataTransactionBuilder( + s.RPCClient, + l1ProposerPrivKey, + common.HexToAddress(os.Getenv("TAIKO_L2")), + common.HexToAddress(os.Getenv("TAIKO_L1")), + common.Address{}, + 0, + chainConfig, + false, + ) + s.blobTxBuiler = NewBlobTransactionBuilder( + s.RPCClient, + l1ProposerPrivKey, + common.HexToAddress(os.Getenv("TAIKO_L1")), + common.Address{}, + common.HexToAddress(os.Getenv("TAIKO_L2")), + 10_000_000, + chainConfig, + false, + ) +} + func (s *TransactionBuilderTestSuite) TestBuildCalldata() { - s.T().Skip("Skipping, preconfer changes") - tx, err := s.calldataTxBuilder.Build(context.Background(), []encoding.TierFee{ - {Tier: encoding.TierOptimisticID, Fee: common.Big256}, - {Tier: encoding.TierSgxID, Fee: common.Big256}, - {Tier: encoding.TierSgxAndZkVMID, Fee: common.Big257}, - }, false, []byte{1}) + _, err := s.calldataTxBuilder.BuildOntake(context.Background(), [][]byte{{1}, {2}}) s.Nil(err) - s.Nil(tx.Blobs) +} + +func TestTransactionBuilderTestSuite(t *testing.T) { + suite.Run(t, new(TransactionBuilderTestSuite)) } diff --git a/packages/taiko-client/proposer/transaction_builder/common.go b/packages/taiko-client/proposer/transaction_builder/common.go deleted file mode 100644 index f3e198bd58c..00000000000 --- a/packages/taiko-client/proposer/transaction_builder/common.go +++ /dev/null @@ -1,26 +0,0 @@ -package builder - -import ( - "context" - "math/big" - - "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/common" - - "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/rpc" -) - -// GetParentMetaHash returns the meta hash of the parent block of the latest proposed block in protocol. -func GetParentMetaHash(ctx context.Context, rpc *rpc.Client) (common.Hash, error) { - state, err := rpc.TaikoL1.State(&bind.CallOpts{Context: ctx}) - if err != nil { - return common.Hash{}, err - } - - parent, err := rpc.GetL2BlockInfo(ctx, new(big.Int).SetUint64(state.SlotB.NumBlocks-1)) - if err != nil { - return common.Hash{}, err - } - - return parent.MetaHash, nil -} diff --git a/packages/taiko-client/proposer/transaction_builder/common_test.go b/packages/taiko-client/proposer/transaction_builder/common_test.go deleted file mode 100644 index 7155bd3ef8c..00000000000 --- a/packages/taiko-client/proposer/transaction_builder/common_test.go +++ /dev/null @@ -1,80 +0,0 @@ -package builder - -import ( - "context" - "net/url" - "os" - "testing" - "time" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/crypto" - "github.com/stretchr/testify/suite" - - "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/encoding" - "github.com/taikoxyz/taiko-mono/packages/taiko-client/internal/testutils" - selector "github.com/taikoxyz/taiko-mono/packages/taiko-client/proposer/prover_selector" -) - -type TransactionBuilderTestSuite struct { - testutils.ClientTestSuite - calldataTxBuilder *CalldataTransactionBuilder - blobTxBuiler *BlobTransactionBuilder -} - -func (s *TransactionBuilderTestSuite) SetupTest() { - s.ClientTestSuite.SetupTest() - - protocolConfigs, err := s.RPCClient.TaikoL1.GetConfig(nil) - s.Nil(err) - - l1ProposerPrivKey, err := crypto.ToECDSA(common.FromHex(os.Getenv("L1_PROPOSER_PRIVATE_KEY"))) - s.Nil(err) - - proverSelector, err := selector.NewETHFeeEOASelector( - &protocolConfigs, - s.RPCClient, - crypto.PubkeyToAddress(l1ProposerPrivKey.PublicKey), - common.HexToAddress(os.Getenv("TAIKO_L1_ADDRESS")), - common.HexToAddress(os.Getenv("ASSIGNMENT_HOOK_ADDRESS")), - []encoding.TierFee{}, - common.Big2, - []*url.URL{s.ProverEndpoints[0]}, - 32, - 1*time.Minute, - 1*time.Minute, - ) - s.Nil(err) - s.calldataTxBuilder = NewCalldataTransactionBuilder( - s.RPCClient, - l1ProposerPrivKey, - proverSelector, - common.Big0, - common.HexToAddress(os.Getenv("TAIKO_L2_ADDRESS")), - common.HexToAddress(os.Getenv("TAIKO_L1_ADDRESS")), - common.HexToAddress(os.Getenv("ASSIGNMENT_HOOK_ADDRESS")), - 0, - "test", - ) - s.blobTxBuiler = NewBlobTransactionBuilder( - s.RPCClient, - l1ProposerPrivKey, - proverSelector, - common.Big0, - common.HexToAddress(os.Getenv("TAIKO_L1_ADDRESS")), - common.HexToAddress(os.Getenv("TAIKO_L2_ADDRESS")), - common.HexToAddress(os.Getenv("ASSIGNMENT_HOOK_ADDRESS")), - 10_000_000, - "test", - ) -} - -func (s *TransactionBuilderTestSuite) TestGetParentMetaHash() { - metahash, err := GetParentMetaHash(context.Background(), s.RPCClient) - s.Nil(err) - s.NotEmpty(metahash) -} - -func TestTransactionBuilderTestSuite(t *testing.T) { - suite.Run(t, new(TransactionBuilderTestSuite)) -} diff --git a/packages/taiko-client/proposer/transaction_builder/fallback.go b/packages/taiko-client/proposer/transaction_builder/fallback.go new file mode 100644 index 00000000000..07842401733 --- /dev/null +++ b/packages/taiko-client/proposer/transaction_builder/fallback.go @@ -0,0 +1,206 @@ +package builder + +import ( + "context" + "crypto/ecdsa" + "fmt" + "math/big" + + "github.com/ethereum-optimism/optimism/op-service/txmgr" + "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/params" + "golang.org/x/sync/errgroup" + + "github.com/taikoxyz/taiko-mono/packages/taiko-client/internal/metrics" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/config" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/rpc" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/utils" +) + +// TxBuilderWithFallback builds type-2 or type-3 transactions based on the +// the realtime onchain cost, if the fallback feature is enabled. +type TxBuilderWithFallback struct { + rpc *rpc.Client + blobTransactionBuilder *BlobTransactionBuilder + calldataTransactionBuilder *CalldataTransactionBuilder + txmgrSelector *utils.TxMgrSelector + fallback bool +} + +// NewBuilderWithFallback creates a new TxBuilderWithFallback instance. +func NewBuilderWithFallback( + rpc *rpc.Client, + proposerPrivateKey *ecdsa.PrivateKey, + l2SuggestedFeeRecipient common.Address, + taikoL1Address common.Address, + proverSetAddress common.Address, + gasLimit uint64, + chainConfig *config.ChainConfig, + txmgrSelector *utils.TxMgrSelector, + revertProtectionEnabled bool, + blobAllowed bool, + fallback bool, +) *TxBuilderWithFallback { + builder := &TxBuilderWithFallback{ + rpc: rpc, + fallback: fallback, + txmgrSelector: txmgrSelector, + } + + if blobAllowed { + builder.blobTransactionBuilder = NewBlobTransactionBuilder( + rpc, + proposerPrivateKey, + taikoL1Address, + proverSetAddress, + l2SuggestedFeeRecipient, + gasLimit, + chainConfig, + revertProtectionEnabled, + ) + } + + builder.calldataTransactionBuilder = NewCalldataTransactionBuilder( + rpc, + proposerPrivateKey, + l2SuggestedFeeRecipient, + taikoL1Address, + proverSetAddress, + gasLimit, + chainConfig, + revertProtectionEnabled, + ) + + return builder +} + +// BuildOntake builds a type-2 or type-3 transaction based on the +// the realtime onchain cost, if the fallback feature is enabled. +func (b *TxBuilderWithFallback) BuildOntake( + ctx context.Context, + txListBytesArray [][]byte, +) (*txmgr.TxCandidate, error) { + // If calldata is the only option, just use it. + if b.blobTransactionBuilder == nil { + return b.calldataTransactionBuilder.BuildOntake(ctx, txListBytesArray) + } + // If blob is enabled, and fallback is not enabled, just build a blob transaction. + if !b.fallback || len(txListBytesArray) > 1 { + return b.blobTransactionBuilder.BuildOntake(ctx, txListBytesArray) + } + + // Otherwise, compare the cost, and choose the cheaper option. + var ( + g = new(errgroup.Group) + txWithCalldata *txmgr.TxCandidate + txWithBlob *txmgr.TxCandidate + costCalldata *big.Int + costBlob *big.Int + err error + ) + + g.Go(func() error { + if txWithCalldata, err = b.calldataTransactionBuilder.BuildOntake(ctx, txListBytesArray); err != nil { + return fmt.Errorf("failed to build type-2 transaction: %w", err) + } + if costCalldata, err = b.estimateCandidateCost(ctx, txWithCalldata); err != nil { + return fmt.Errorf("failed to estimate type-2 transaction cost: %w", err) + } + return nil + }) + g.Go(func() error { + if txWithBlob, err = b.blobTransactionBuilder.BuildOntake(ctx, txListBytesArray); err != nil { + return fmt.Errorf("failed to build type-3 transaction: %w", err) + } + if costBlob, err = b.estimateCandidateCost(ctx, txWithBlob); err != nil { + return fmt.Errorf("failed to estimate type-3 transaction cost: %w", err) + } + return nil + }) + + if err = g.Wait(); err != nil { + log.Error("Failed to estimate transactions cost, will build a type-3 transaction", "error", err) + metrics.ProposerCostEstimationError.Inc() + // If there is an error, just build a blob transaction. + return b.blobTransactionBuilder.BuildOntake(ctx, txListBytesArray) + } + + var ( + costCalldataFloat64 float64 + costBlobFloat64 float64 + ) + costCalldataFloat64, _ = utils.WeiToEther(costCalldata).Float64() + costBlobFloat64, _ = utils.WeiToEther(costBlob).Float64() + + metrics.ProposerEstimatedCostCalldata.Set(costCalldataFloat64) + metrics.ProposerEstimatedCostBlob.Set(costBlobFloat64) + + if costCalldata.Cmp(costBlob) < 0 { + log.Info("Building a type-2 transaction", "costCalldata", costCalldataFloat64, "costBlob", costBlobFloat64) + metrics.ProposerProposeByCalldata.Inc() + return txWithCalldata, nil + } + + log.Info("Building a type-3 transaction", "costCalldata", costCalldataFloat64, "costBlob", costBlobFloat64) + metrics.ProposerProposeByBlob.Inc() + return txWithBlob, nil +} + +// estimateCandidateCost estimates the realtime onchain cost of the given transaction. +func (b *TxBuilderWithFallback) estimateCandidateCost( + ctx context.Context, + candidate *txmgr.TxCandidate, +) (*big.Int, error) { + txMgr, _ := b.txmgrSelector.Select() + gasTipCap, baseFee, blobBaseFee, err := txMgr.SuggestGasPriceCaps(ctx) + if err != nil { + return nil, err + } + log.Debug("Suggested gas price", "gasTipCap", gasTipCap, "baseFee", baseFee, "blobBaseFee", blobBaseFee) + + gasFeeCap := new(big.Int).Add(baseFee, gasTipCap) + msg := ethereum.CallMsg{ + From: txMgr.From(), + To: candidate.To, + Gas: candidate.GasLimit, + Value: candidate.Value, + Data: candidate.TxData, + } + if len(candidate.Blobs) != 0 { + var blobHashes []common.Hash + if _, blobHashes, err = txmgr.MakeSidecar(candidate.Blobs); err != nil { + return nil, fmt.Errorf("failed to make sidecar: %w", err) + } + msg.BlobHashes = blobHashes + } + + gasUsed, err := b.rpc.L1.EstimateGas(ctx, msg) + if err != nil { + return nil, fmt.Errorf("failed to estimate gas used: %w", err) + } + + feeWithoutBlob := new(big.Int).Mul(gasFeeCap, new(big.Int).SetUint64(gasUsed)) + + // If its a type-2 transaction, we won't calculate blob fee. + if len(candidate.Blobs) == 0 { + return feeWithoutBlob, nil + } + + // Otherwise, we add blob fee to the cost. + return new(big.Int).Add( + feeWithoutBlob, + new(big.Int).Mul( + new(big.Int).SetUint64( + uint64(len(candidate.Blobs)*params.BlobTxBlobGasPerBlob), + ), + blobBaseFee, + ), + ), nil +} + +// TxBuilderWithFallback returns whether the blob transactions is enabled. +func (b *TxBuilderWithFallback) BlobAllow() bool { + return b.blobTransactionBuilder != nil +} diff --git a/packages/taiko-client/proposer/transaction_builder/fallback_test.go b/packages/taiko-client/proposer/transaction_builder/fallback_test.go new file mode 100644 index 00000000000..f45bc715527 --- /dev/null +++ b/packages/taiko-client/proposer/transaction_builder/fallback_test.go @@ -0,0 +1,139 @@ +package builder + +import ( + "bytes" + "context" + "math/big" + "os" + "time" + + "github.com/ethereum-optimism/optimism/op-service/txmgr" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/params" + + "github.com/taikoxyz/taiko-mono/packages/taiko-client/internal/metrics" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/config" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/rpc" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/utils" +) + +func (s *TransactionBuilderTestSuite) TestBuildCalldataOnly() { + builder := s.newTestBuilderWithFallback(false, false, nil) + candidate, err := builder.BuildOntake(context.Background(), [][]byte{{1}, {2}}) + s.Nil(err) + s.Zero(len(candidate.Blobs)) +} + +func (s *TransactionBuilderTestSuite) TestBuildCalldataWithBlobAllowed() { + builder := s.newTestBuilderWithFallback(true, false, nil) + candidate, err := builder.BuildOntake(context.Background(), [][]byte{{1}, {2}}) + s.Nil(err) + s.NotZero(len(candidate.Blobs)) +} + +func (s *TransactionBuilderTestSuite) TestBlobAllowed() { + builder := s.newTestBuilderWithFallback(false, false, nil) + s.False(builder.BlobAllow()) + builder = s.newTestBuilderWithFallback(true, false, nil) + s.True(builder.BlobAllow()) +} + +func (s *TransactionBuilderTestSuite) TestFallback() { + // By default, blob fee should be cheaper. + builder := s.newTestBuilderWithFallback(true, true, nil) + candidate, err := builder.BuildOntake(context.Background(), [][]byte{ + bytes.Repeat([]byte{1}, int(rpc.BlockMaxTxListBytes)), + }) + s.Nil(err) + s.NotZero(len(candidate.Blobs)) + + // Make blob base fee 1024 Gwei + builder = s.newTestBuilderWithFallback(true, true, func( + ctx context.Context, + backend txmgr.ETHBackend, + ) (*big.Int, *big.Int, *big.Int, error) { + return common.Big1, + common.Big1, + new(big.Int).SetUint64(1024 * params.GWei), + nil + }) + + candidate, err = builder.BuildOntake(context.Background(), [][]byte{ + bytes.Repeat([]byte{1}, int(rpc.BlockMaxTxListBytes)), + }) + s.Nil(err) + s.Zero(len(candidate.Blobs)) + + // Make block base fee 1024 Gwei too + builder = s.newTestBuilderWithFallback(true, true, func( + ctx context.Context, + backend txmgr.ETHBackend, + ) (*big.Int, *big.Int, *big.Int, error) { + return new(big.Int).SetUint64(1024 * params.GWei), + new(big.Int).SetUint64(1024 * params.GWei), + new(big.Int).SetUint64(1024 * params.GWei), + nil + }) + + candidate, err = builder.BuildOntake(context.Background(), [][]byte{ + bytes.Repeat([]byte{1}, int(rpc.BlockMaxTxListBytes)), + }) + s.Nil(err) + s.NotZero(len(candidate.Blobs)) +} + +func (s *TransactionBuilderTestSuite) newTestBuilderWithFallback( + blobAllowed, + fallback bool, + gasPriceEstimatorFn txmgr.GasPriceEstimatorFn, +) *TxBuilderWithFallback { + l1ProposerPrivKey, err := crypto.ToECDSA(common.FromHex(os.Getenv("L1_PROPOSER_PRIVATE_KEY"))) + s.Nil(err) + + protocolConfigs, err := rpc.GetProtocolConfigs(s.RPCClient.TaikoL1, nil) + s.Nil(err) + + chainConfig := config.NewChainConfig(&protocolConfigs) + + cfg, err := txmgr.NewConfig(txmgr.CLIConfig{ + L1RPCURL: os.Getenv("L1_WS"), + NumConfirmations: 0, + SafeAbortNonceTooLowCount: txmgr.DefaultBatcherFlagValues.SafeAbortNonceTooLowCount, + PrivateKey: common.Bytes2Hex(crypto.FromECDSA(l1ProposerPrivKey)), + FeeLimitMultiplier: txmgr.DefaultBatcherFlagValues.FeeLimitMultiplier, + FeeLimitThresholdGwei: txmgr.DefaultBatcherFlagValues.FeeLimitThresholdGwei, + MinBaseFeeGwei: txmgr.DefaultBatcherFlagValues.MinBaseFeeGwei, + MinTipCapGwei: txmgr.DefaultBatcherFlagValues.MinTipCapGwei, + ResubmissionTimeout: txmgr.DefaultBatcherFlagValues.ResubmissionTimeout, + ReceiptQueryInterval: 1 * time.Second, + NetworkTimeout: txmgr.DefaultBatcherFlagValues.NetworkTimeout, + TxSendTimeout: txmgr.DefaultBatcherFlagValues.TxSendTimeout, + TxNotInMempoolTimeout: txmgr.DefaultBatcherFlagValues.TxNotInMempoolTimeout, + }, log.Root()) + s.Nil(err) + + if gasPriceEstimatorFn != nil { + cfg.GasPriceEstimatorFn = gasPriceEstimatorFn + } + + txMgr, err := txmgr.NewSimpleTxManagerFromConfig("tx_builder_test", log.Root(), &metrics.TxMgrMetrics, cfg) + s.Nil(err) + + txmgrSelector := utils.NewTxMgrSelector(txMgr, nil, nil) + + return NewBuilderWithFallback( + s.RPCClient, + l1ProposerPrivKey, + common.HexToAddress(os.Getenv("TAIKO_L2")), + common.HexToAddress(os.Getenv("TAIKO_L1")), + common.Address{}, + 10_000_000, + chainConfig, + txmgrSelector, + true, + blobAllowed, + fallback, + ) +} diff --git a/packages/taiko-client/proposer/transaction_builder/interface.go b/packages/taiko-client/proposer/transaction_builder/interface.go index c1cac45aa6f..8a103b05343 100644 --- a/packages/taiko-client/proposer/transaction_builder/interface.go +++ b/packages/taiko-client/proposer/transaction_builder/interface.go @@ -4,16 +4,9 @@ import ( "context" "github.com/ethereum-optimism/optimism/op-service/txmgr" - - "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/encoding" ) // ProposeBlockTransactionBuilder is an interface for building a TaikoL1.proposeBlock transaction. type ProposeBlockTransactionBuilder interface { - Build( - ctx context.Context, - tierFees []encoding.TierFee, - includeParentMetaHash bool, - txListBytes []byte, - ) (*txmgr.TxCandidate, error) + BuildOntake(ctx context.Context, txListBytesArray [][]byte) (*txmgr.TxCandidate, error) } diff --git a/packages/taiko-client/prover/anchor_tx_validator/anchor_tx_validator.go b/packages/taiko-client/prover/anchor_tx_validator/anchor_tx_validator.go index d30ee294464..3d657a5665f 100644 --- a/packages/taiko-client/prover/anchor_tx_validator/anchor_tx_validator.go +++ b/packages/taiko-client/prover/anchor_tx_validator/anchor_tx_validator.go @@ -49,10 +49,10 @@ func (v *AnchorTxValidator) ValidateAnchorTx(tx *types.Transaction) error { if err != nil { return fmt.Errorf("failed to get TaikoL2.anchor transaction method: %w", err) } - if method.Name != "anchor" { + if method.Name != "anchor" && method.Name != "anchorV2" { return fmt.Errorf( "invalid TaikoL2.anchor transaction selector, expect: %s, actual: %s", - "anchor", + "anchor / anchorV2", method.Name, ) } diff --git a/packages/taiko-client/prover/anchor_tx_validator/anchor_tx_validator_test.go b/packages/taiko-client/prover/anchor_tx_validator/anchor_tx_validator_test.go index a98224ade1c..6154697ef0a 100644 --- a/packages/taiko-client/prover/anchor_tx_validator/anchor_tx_validator_test.go +++ b/packages/taiko-client/prover/anchor_tx_validator/anchor_tx_validator_test.go @@ -21,7 +21,7 @@ type AnchorTxValidatorTestSuite struct { func (s *AnchorTxValidatorTestSuite) SetupTest() { s.ClientTestSuite.SetupTest() - validator, err := New(common.HexToAddress(os.Getenv("TAIKO_L2_ADDRESS")), s.RPCClient.L2.ChainID, s.RPCClient) + validator, err := New(common.HexToAddress(os.Getenv("TAIKO_L2")), s.RPCClient.L2.ChainID, s.RPCClient) s.Nil(err) s.v = validator } diff --git a/packages/taiko-client/prover/config.go b/packages/taiko-client/prover/config.go index 3e8a4662fd0..0a63ea6e7e2 100644 --- a/packages/taiko-client/prover/config.go +++ b/packages/taiko-client/prover/config.go @@ -14,21 +14,19 @@ import ( "github.com/urfave/cli/v2" "github.com/taikoxyz/taiko-mono/packages/taiko-client/cmd/flags" - "github.com/taikoxyz/taiko-mono/packages/taiko-client/internal/utils" pkgFlags "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/flags" "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/jwt" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/utils" ) // Config contains the configurations to initialize a Taiko prover. type Config struct { L1WsEndpoint string - L1HttpEndpoint string L2WsEndpoint string L2HttpEndpoint string TaikoL1Address common.Address TaikoL2Address common.Address TaikoTokenAddress common.Address - AssignmentHookAddress common.Address ProverSetAddress common.Address L1ProverPrivKey *ecdsa.PrivateKey StartingBlockID *big.Int @@ -45,23 +43,22 @@ type Config struct { RPCTimeout time.Duration ProveBlockGasLimit uint64 HTTPServerPort uint64 - Capacity uint64 - MinOptimisticTierFee *big.Int - MinSgxTierFee *big.Int - MinSgxAndZkVMTierFee *big.Int MinEthBalance *big.Int - MinTaikoTokenBalance *big.Int MaxExpiry time.Duration - MaxProposedIn uint64 - MaxBlockSlippage uint64 Allowance *big.Int GuardianProverHealthCheckServerEndpoint *url.URL RaikoHostEndpoint string + RaikoZKVMHostEndpoint string RaikoJWT string + RaikoRequestTimeout time.Duration L1NodeVersion string L2NodeVersion string BlockConfirmations uint64 TxmgrConfigs *txmgr.CLIConfig + PrivateTxmgrConfigs *txmgr.CLIConfig + SGXProofBufferSize uint64 + ZKVMProofBufferSize uint64 + ForceBatchProvingInterval time.Duration } // NewConfigFromCliContext creates a new config instance from command line flags. @@ -116,31 +113,6 @@ func NewConfigFromCliContext(c *cli.Context) (*Config, error) { } } - minOptimisticTierFee, err := utils.GWeiToWei(c.Float64(flags.MinOptimisticTierFee.Name)) - if err != nil { - return nil, err - } - - minSgxTierFee, err := utils.GWeiToWei(c.Float64(flags.MinSgxTierFee.Name)) - if err != nil { - return nil, err - } - - minSgxAndZkVMTierFee, err := utils.GWeiToWei(c.Float64(flags.MinSgxAndZkVMTierFee.Name)) - if err != nil { - return nil, err - } - - minEthBalance, err := utils.EtherToWei(c.Float64(flags.MinEthBalance.Name)) - if err != nil { - return nil, err - } - - minTaikoTokenBalance, err := utils.EtherToWei(c.Float64(flags.MinTaikoTokenBalance.Name)) - if err != nil { - return nil, err - } - if !c.IsSet(flags.GuardianProverMajority.Name) && !c.IsSet(flags.RaikoHostEndpoint.Name) { return nil, errors.New("empty raiko host endpoint") } @@ -154,17 +126,17 @@ func NewConfigFromCliContext(c *cli.Context) (*Config, error) { return &Config{ L1WsEndpoint: c.String(flags.L1WSEndpoint.Name), - L1HttpEndpoint: c.String(flags.L1HTTPEndpoint.Name), L2WsEndpoint: c.String(flags.L2WSEndpoint.Name), L2HttpEndpoint: c.String(flags.L2HTTPEndpoint.Name), TaikoL1Address: common.HexToAddress(c.String(flags.TaikoL1Address.Name)), TaikoL2Address: common.HexToAddress(c.String(flags.TaikoL2Address.Name)), TaikoTokenAddress: common.HexToAddress(c.String(flags.TaikoTokenAddress.Name)), - AssignmentHookAddress: common.HexToAddress(c.String(flags.AssignmentHookAddress.Name)), ProverSetAddress: common.HexToAddress(c.String(flags.ProverSetAddress.Name)), L1ProverPrivKey: l1ProverPrivKey, RaikoHostEndpoint: c.String(flags.RaikoHostEndpoint.Name), + RaikoZKVMHostEndpoint: c.String(flags.RaikoZKVMHostEndpoint.Name), RaikoJWT: common.Bytes2Hex(jwtSecret), + RaikoRequestTimeout: c.Duration(flags.RaikoRequestTimeout.Name), StartingBlockID: startingBlockID, Dummy: c.Bool(flags.Dummy.Name), GuardianProverMinorityAddress: common.HexToAddress(c.String(flags.GuardianProverMinority.Name)), @@ -179,24 +151,24 @@ func NewConfigFromCliContext(c *cli.Context) (*Config, error) { EnableLivenessBondProof: c.Bool(flags.EnableLivenessBondProof.Name), RPCTimeout: c.Duration(flags.RPCTimeout.Name), ProveBlockGasLimit: c.Uint64(flags.TxGasLimit.Name), - Capacity: c.Uint64(flags.ProverCapacity.Name), HTTPServerPort: c.Uint64(flags.ProverHTTPServerPort.Name), - MinOptimisticTierFee: minOptimisticTierFee, - MinSgxTierFee: minSgxTierFee, - MinSgxAndZkVMTierFee: minSgxAndZkVMTierFee, - MinEthBalance: minEthBalance, - MinTaikoTokenBalance: minTaikoTokenBalance, MaxExpiry: c.Duration(flags.MaxExpiry.Name), - MaxBlockSlippage: c.Uint64(flags.MaxAcceptableBlockSlippage.Name), - MaxProposedIn: c.Uint64(flags.MaxProposedIn.Name), Allowance: allowance, L1NodeVersion: c.String(flags.L1NodeVersion.Name), L2NodeVersion: c.String(flags.L2NodeVersion.Name), BlockConfirmations: c.Uint64(flags.BlockConfirmations.Name), TxmgrConfigs: pkgFlags.InitTxmgrConfigsFromCli( - c.String(flags.L1HTTPEndpoint.Name), + c.String(flags.L1WSEndpoint.Name), + l1ProverPrivKey, + c, + ), + PrivateTxmgrConfigs: pkgFlags.InitTxmgrConfigsFromCli( + c.String(flags.L1PrivateEndpoint.Name), l1ProverPrivKey, c, ), + SGXProofBufferSize: c.Uint64(flags.SGXBatchSize.Name), + ZKVMProofBufferSize: c.Uint64(flags.ZKVMBatchSize.Name), + ForceBatchProvingInterval: c.Duration(flags.ForceBatchProvingInterval.Name), }, nil } diff --git a/packages/taiko-client/prover/config_test.go b/packages/taiko-client/prover/config_test.go index fb3ae6c5e15..ee1e87e649f 100644 --- a/packages/taiko-client/prover/config_test.go +++ b/packages/taiko-client/prover/config_test.go @@ -10,21 +10,19 @@ import ( "github.com/urfave/cli/v2" "github.com/taikoxyz/taiko-mono/packages/taiko-client/cmd/flags" - "github.com/taikoxyz/taiko-mono/packages/taiko-client/internal/utils" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/utils" ) var ( - l1WsEndpoint = os.Getenv("L1_NODE_WS_ENDPOINT") - l1HttpEndpoint = os.Getenv("L1_NODE_HTTP_ENDPOINT") - l2WsEndpoint = os.Getenv("L2_EXECUTION_ENGINE_WS_ENDPOINT") - l2HttpEndpoint = os.Getenv("L2_EXECUTION_ENGINE_HTTP_ENDPOINT") + l1WsEndpoint = os.Getenv("L1_WS") + l2WsEndpoint = os.Getenv("L2_WS") + l2HttpEndpoint = os.Getenv("L2_HTTP") l1NodeVersion = "1.0.0" l2NodeVersion = "0.1.0" - taikoL1 = os.Getenv("TAIKO_L1_ADDRESS") - taikoL2 = os.Getenv("TAIKO_L2_ADDRESS") + taikoL1 = os.Getenv("TAIKO_L1") + taikoL2 = os.Getenv("TAIKO_L2") allowance = 10.0 rpcTimeout = 5 * time.Second - minTierFee = 1024.0 ) func (s *ProverTestSuite) TestNewConfigFromCliContextGuardianProver() { @@ -33,7 +31,6 @@ func (s *ProverTestSuite) TestNewConfigFromCliContextGuardianProver() { c, err := NewConfigFromCliContext(ctx) s.Nil(err) s.Equal(l1WsEndpoint, c.L1WsEndpoint) - s.Equal(l1HttpEndpoint, c.L1HttpEndpoint) s.Equal(l2WsEndpoint, c.L2WsEndpoint) s.Equal(l2HttpEndpoint, c.L2HttpEndpoint) s.Equal(taikoL1, c.TaikoL1Address.String()) @@ -47,17 +44,10 @@ func (s *ProverTestSuite) TestNewConfigFromCliContextGuardianProver() { s.True(c.ProveUnassignedBlocks) s.True(c.ContesterMode) s.Equal(rpcTimeout, c.RPCTimeout) - s.Equal(uint64(8), c.Capacity) - tierFeeGWei, err := utils.GWeiToWei(minTierFee) - s.Nil(err) - s.Equal(tierFeeGWei.Uint64(), c.MinOptimisticTierFee.Uint64()) - s.Equal(tierFeeGWei.Uint64(), c.MinSgxTierFee.Uint64()) s.Equal(c.L1NodeVersion, l1NodeVersion) s.Equal(c.L2NodeVersion, l2NodeVersion) s.Nil(new(Prover).InitFromCli(context.Background(), ctx)) s.True(c.ProveUnassignedBlocks) - s.Equal(uint64(100), c.MaxProposedIn) - s.Equal(os.Getenv("ASSIGNMENT_HOOK_ADDRESS"), c.AssignmentHookAddress.String()) allowanceWithDecimal, err := utils.EtherToWei(allowance) s.Nil(err) s.Equal(allowanceWithDecimal.Uint64(), c.Allowance.Uint64()) @@ -68,7 +58,6 @@ func (s *ProverTestSuite) TestNewConfigFromCliContextGuardianProver() { s.Nil(app.Run([]string{ "TestNewConfigFromCliContextGuardianProver", "--" + flags.L1WSEndpoint.Name, l1WsEndpoint, - "--" + flags.L1HTTPEndpoint.Name, l1HttpEndpoint, "--" + flags.L2WSEndpoint.Name, l2WsEndpoint, "--" + flags.L2HTTPEndpoint.Name, l2HttpEndpoint, "--" + flags.TaikoL1Address.Name, taikoL1, @@ -78,15 +67,10 @@ func (s *ProverTestSuite) TestNewConfigFromCliContextGuardianProver() { "--" + flags.RPCTimeout.Name, "5s", "--" + flags.TxGasLimit.Name, "100000", "--" + flags.Dummy.Name, - "--" + flags.MinOptimisticTierFee.Name, fmt.Sprint(minTierFee), - "--" + flags.MinSgxTierFee.Name, fmt.Sprint(minTierFee), - "--" + flags.ProverCapacity.Name, "8", - "--" + flags.GuardianProverMajority.Name, os.Getenv("GUARDIAN_PROVER_CONTRACT_ADDRESS"), - "--" + flags.GuardianProverMinority.Name, os.Getenv("GUARDIAN_PROVER_MINORITY_ADDRESS"), - "--" + flags.AssignmentHookAddress.Name, os.Getenv("ASSIGNMENT_HOOK_ADDRESS"), + "--" + flags.GuardianProverMajority.Name, os.Getenv("GUARDIAN_PROVER_CONTRACT"), + "--" + flags.GuardianProverMinority.Name, os.Getenv("GUARDIAN_PROVER_MINORITY"), "--" + flags.Graffiti.Name, "", "--" + flags.ProveUnassignedBlocks.Name, - "--" + flags.MaxProposedIn.Name, "100", "--" + flags.Allowance.Name, fmt.Sprint(allowance), "--" + flags.L1NodeVersion.Name, l1NodeVersion, "--" + flags.L2NodeVersion.Name, l2NodeVersion, @@ -108,7 +92,6 @@ func (s *ProverTestSuite) SetupApp() *cli.App { app := cli.NewApp() app.Flags = []cli.Flag{ &cli.StringFlag{Name: flags.L1WSEndpoint.Name}, - &cli.StringFlag{Name: flags.L1HTTPEndpoint.Name}, &cli.StringFlag{Name: flags.L2WSEndpoint.Name}, &cli.StringFlag{Name: flags.L2HTTPEndpoint.Name}, &cli.StringFlag{Name: flags.TaikoL1Address.Name}, @@ -121,11 +104,6 @@ func (s *ProverTestSuite) SetupApp() *cli.App { &cli.StringFlag{Name: flags.Graffiti.Name}, &cli.BoolFlag{Name: flags.ProveUnassignedBlocks.Name}, &cli.DurationFlag{Name: flags.RPCTimeout.Name}, - &cli.Uint64Flag{Name: flags.ProverCapacity.Name}, - &cli.Uint64Flag{Name: flags.MinOptimisticTierFee.Name}, - &cli.Uint64Flag{Name: flags.MinSgxTierFee.Name}, - &cli.Uint64Flag{Name: flags.MaxProposedIn.Name}, - &cli.StringFlag{Name: flags.AssignmentHookAddress.Name}, &cli.StringFlag{Name: flags.Allowance.Name}, &cli.StringFlag{Name: flags.ContesterMode.Name}, &cli.StringFlag{Name: flags.L1NodeVersion.Name}, diff --git a/packages/taiko-client/prover/event_handler/assignment_expired.go b/packages/taiko-client/prover/event_handler/assignment_expired.go index 1c41615a617..495dea3092c 100644 --- a/packages/taiko-client/prover/event_handler/assignment_expired.go +++ b/packages/taiko-client/prover/event_handler/assignment_expired.go @@ -2,12 +2,11 @@ package handler import ( "context" - "math/big" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/log" - "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/metadata" "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/rpc" proofProducer "github.com/taikoxyz/taiko-mono/packages/taiko-client/prover/proof_producer" ) @@ -48,23 +47,23 @@ func NewAssignmentExpiredEventHandler( // Handle implements the AssignmentExpiredHandler interface. func (h *AssignmentExpiredEventHandler) Handle( ctx context.Context, - e *bindings.TaikoL1ClientBlockProposed, + meta metadata.TaikoBlockMetaData, ) error { log.Info( "Proof assignment window is expired", - "blockID", e.BlockId, - "assignedProver", e.AssignedProver, - "minTier", e.Meta.MinTier, + "blockID", meta.GetBlockID(), + "assignedProver", meta.GetAssignedProver(), + "minTier", meta.GetMinTier(), ) // Check if we still need to generate a new proof for that block. - proofStatus, err := rpc.GetBlockProofStatus(ctx, h.rpc, e.BlockId, h.proverAddress, h.proverSetAddress) + proofStatus, err := rpc.GetBlockProofStatus(ctx, h.rpc, meta.GetBlockID(), h.proverAddress, h.proverSetAddress) if err != nil { return err } if !proofStatus.IsSubmitted { go func() { - h.proofSubmissionCh <- &proofProducer.ProofRequestBody{Tier: e.Meta.MinTier, Event: e} + h.proofSubmissionCh <- &proofProducer.ProofRequestBody{Tier: meta.GetMinTier(), Meta: meta} }() return nil } @@ -78,16 +77,16 @@ func (h *AssignmentExpiredEventHandler) Handle( go func() { if proofStatus.CurrentTransitionState.Contester == rpc.ZeroAddress && !h.isGuardian { h.proofContestCh <- &proofProducer.ContestRequestBody{ - BlockID: e.BlockId, - ProposedIn: new(big.Int).SetUint64(e.Raw.BlockNumber), + BlockID: meta.GetBlockID(), + ProposedIn: meta.GetRawBlockHeight(), ParentHash: proofStatus.ParentHeader.Hash(), - Meta: &e.Meta, + Meta: meta, Tier: proofStatus.CurrentTransitionState.Tier, } } else { h.proofSubmissionCh <- &proofProducer.ProofRequestBody{ - Tier: proofStatus.CurrentTransitionState.Tier + 1, - Event: e, + Tier: proofStatus.CurrentTransitionState.Tier + 1, + Meta: meta, } } }() diff --git a/packages/taiko-client/prover/event_handler/block_proposed.go b/packages/taiko-client/prover/event_handler/block_proposed.go index 8c3e8ac3cc7..f5c04d4a83a 100644 --- a/packages/taiko-client/prover/event_handler/block_proposed.go +++ b/packages/taiko-client/prover/event_handler/block_proposed.go @@ -11,12 +11,12 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/log" - "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings" "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/encoding" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/metadata" "github.com/taikoxyz/taiko-mono/packages/taiko-client/internal/metrics" - "github.com/taikoxyz/taiko-mono/packages/taiko-client/internal/utils" eventIterator "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/chain_iterator/event_iterator" "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/rpc" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/utils" guardianProverHeartbeater "github.com/taikoxyz/taiko-mono/packages/taiko-client/prover/guardian_prover_heartbeater" proofProducer "github.com/taikoxyz/taiko-mono/packages/taiko-client/prover/proof_producer" state "github.com/taikoxyz/taiko-mono/packages/taiko-client/prover/shared_state" @@ -32,10 +32,9 @@ type BlockProposedEventHandler struct { sharedState *state.SharedState proverAddress common.Address proverSetAddress common.Address - genesisHeightL1 uint64 rpc *rpc.Client proofGenerationCh chan<- *proofProducer.ProofWithHeader - assignmentExpiredCh chan<- *bindings.TaikoL1ClientBlockProposed + assignmentExpiredCh chan<- metadata.TaikoBlockMetaData proofSubmissionCh chan<- *proofProducer.ProofRequestBody proofContestCh chan<- *proofProducer.ContestRequestBody backOffRetryInterval time.Duration @@ -51,10 +50,9 @@ type NewBlockProposedEventHandlerOps struct { SharedState *state.SharedState ProverAddress common.Address ProverSetAddress common.Address - GenesisHeightL1 uint64 RPC *rpc.Client ProofGenerationCh chan *proofProducer.ProofWithHeader - AssignmentExpiredCh chan *bindings.TaikoL1ClientBlockProposed + AssignmentExpiredCh chan metadata.TaikoBlockMetaData ProofSubmissionCh chan *proofProducer.ProofRequestBody ProofContestCh chan *proofProducer.ContestRequestBody BackOffRetryInterval time.Duration @@ -69,7 +67,6 @@ func NewBlockProposedEventHandler(opts *NewBlockProposedEventHandlerOps) *BlockP opts.SharedState, opts.ProverAddress, opts.ProverSetAddress, - opts.GenesisHeightL1, opts.RPC, opts.ProofGenerationCh, opts.AssignmentExpiredCh, @@ -86,9 +83,10 @@ func NewBlockProposedEventHandler(opts *NewBlockProposedEventHandlerOps) *BlockP // Handle implements the BlockProposedHandler interface. func (h *BlockProposedEventHandler) Handle( ctx context.Context, - e *bindings.TaikoL1ClientBlockProposed, + meta metadata.TaikoBlockMetaData, end eventIterator.EndBlockProposedEventIterFunc, ) error { + log.Info("Handle for BlockProposedEventHandler") // If there are newly generated proofs, we need to submit them as soon as possible, // to avoid proof submission timeout. if len(h.proofGenerationCh) > 0 { @@ -98,12 +96,12 @@ func (h *BlockProposedEventHandler) Handle( } // Wait for the corresponding L2 block being mined in node. - if _, err := h.rpc.WaitL2Header(ctx, e.BlockId); err != nil { - return fmt.Errorf("failed to wait L2 header (eventID %d): %w", e.BlockId, err) + if _, err := h.rpc.WaitL2Header(ctx, meta.GetBlockID()); err != nil { + return fmt.Errorf("failed to wait L2 header (eventID %d): %w", meta.GetBlockID(), err) } // Check if the L1 chain has reorged at first. - if err := h.checkL1Reorg(ctx, e); err != nil { + if err := h.checkL1Reorg(ctx, meta); err != nil { if err.Error() == errL1Reorged.Error() { end() return nil @@ -113,42 +111,41 @@ func (h *BlockProposedEventHandler) Handle( } // If the current block is handled, just skip it. - if e.BlockId.Uint64() <= h.sharedState.GetLastHandledBlockID() { + if meta.GetBlockID().Uint64() <= h.sharedState.GetLastHandledBlockID() { return nil } log.Info( "New BlockProposed event", - "l1Height", e.Raw.BlockNumber, - "l1Hash", e.Raw.BlockHash, - "blockID", e.BlockId, - "removed", e.Raw.Removed, - "assignedProver", e.AssignedProver, - "blobHash", common.Bytes2Hex(e.Meta.BlobHash[:]), - "livenessBond", utils.WeiToEther(e.LivenessBond), - "minTier", e.Meta.MinTier, - "blobUsed", e.Meta.BlobUsed, + "l1Height", meta.GetRawBlockHeight(), + "l1Hash", meta.GetRawBlockHash(), + "blockID", meta.GetBlockID(), + "assignedProver", meta.GetAssignedProver(), + "blobHash", meta.GetBlobHash(), + "livenessBond", utils.WeiToEther(meta.GetLivenessBond()), + "minTier", meta.GetMinTier(), + "blobUsed", meta.GetBlobUsed(), ) - metrics.ProverReceivedProposedBlockGauge.Set(float64(e.BlockId.Uint64())) + metrics.ProverReceivedProposedBlockGauge.Set(float64(meta.GetBlockID().Uint64())) // Move l1Current cursor. - newL1Current, err := h.rpc.L1.HeaderByHash(ctx, e.Raw.BlockHash) + newL1Current, err := h.rpc.L1.HeaderByHash(ctx, meta.GetRawBlockHash()) if err != nil { return err } h.sharedState.SetL1Current(newL1Current) - h.sharedState.SetLastHandledBlockID(e.BlockId.Uint64()) + h.sharedState.SetLastHandledBlockID(meta.GetBlockID().Uint64()) // Try generating a proof for the proposed block with the given backoff policy. go func() { if err := backoff.Retry( func() error { - if err := h.checkExpirationAndSubmitProof(ctx, e); err != nil { + if err := h.checkExpirationAndSubmitProof(ctx, meta); err != nil { log.Error( "Failed to check proof status and submit proof", "error", err, - "blockID", e.BlockId, - "minTier", e.Meta.MinTier, + "blockID", meta.GetBlockID(), + "minTier", meta.GetMinTier(), "maxRetrys", h.backOffMaxRetrys, ) return err @@ -170,15 +167,15 @@ func (h *BlockProposedEventHandler) Handle( // checkL1Reorg checks whether the L1 chain has been reorged. func (h *BlockProposedEventHandler) checkL1Reorg( ctx context.Context, - e *bindings.TaikoL1ClientBlockProposed, + meta metadata.TaikoBlockMetaData, ) error { // Check whether the L2 EE's anchored L1 info, to see if the L1 chain has been reorged. reorgCheckResult, err := h.rpc.CheckL1Reorg( ctx, - new(big.Int).Sub(e.BlockId, common.Big1), + new(big.Int).Sub(meta.GetBlockID(), common.Big1), ) if err != nil { - return fmt.Errorf("failed to check whether L1 chain was reorged from L2EE (eventID %d): %w", e.BlockId, err) + return fmt.Errorf("failed to check whether L1 chain was reorged from L2EE (eventID %d): %w", meta.GetBlockID(), err) } if reorgCheckResult.IsReorged { @@ -198,23 +195,23 @@ func (h *BlockProposedEventHandler) checkL1Reorg( return errL1Reorged } - lastL1OriginHeader, err := h.rpc.L1.HeaderByNumber(ctx, new(big.Int).SetUint64(e.Meta.L1Height)) + lastL1OriginHeader, err := h.rpc.L1.HeaderByNumber(ctx, meta.GetRawBlockHeight()) if err != nil { - return fmt.Errorf("failed to get L1 header, height %d: %w", e.Meta.L1Height, err) + return fmt.Errorf("failed to get L1 header, height %d: %w", meta.GetRawBlockHeight(), err) } - if lastL1OriginHeader.Hash() != e.Meta.L1Hash { + if lastL1OriginHeader.Hash() != meta.GetRawBlockHash() { log.Warn( "L1 block hash mismatch due to L1 reorg", - "height", e.Meta.L1Height, + "height", meta.GetRawBlockHeight(), "lastL1OriginHeader", lastL1OriginHeader.Hash(), - "l1HashInEvent", e.Meta.L1Hash, + "l1HashInEvent", meta.GetRawBlockHash(), ) return fmt.Errorf( "L1 block hash mismatch due to L1 reorg: %s != %s", lastL1OriginHeader.Hash(), - e.Meta.L1Hash, + meta.GetRawBlockHash(), ) } @@ -225,15 +222,15 @@ func (h *BlockProposedEventHandler) checkL1Reorg( // and submits a new proof if necessary. func (h *BlockProposedEventHandler) checkExpirationAndSubmitProof( ctx context.Context, - e *bindings.TaikoL1ClientBlockProposed, + meta metadata.TaikoBlockMetaData, ) error { // Check whether the block has been verified. - isVerified, err := isBlockVerified(ctx, h.rpc, e.BlockId) + isVerified, err := isBlockVerified(ctx, h.rpc, meta.GetBlockID()) if err != nil { return fmt.Errorf("failed to check if the current L2 block is verified: %w", err) } if isVerified { - log.Info("📋 Block has been verified", "blockID", e.BlockId) + log.Info("📋 Block has been verified", "blockID", meta.GetBlockID()) return nil } @@ -241,7 +238,7 @@ func (h *BlockProposedEventHandler) checkExpirationAndSubmitProof( proofStatus, err := rpc.GetBlockProofStatus( ctx, h.rpc, - e.BlockId, + meta.GetBlockID(), h.proverAddress, h.proverSetAddress, ) @@ -255,7 +252,7 @@ func (h *BlockProposedEventHandler) checkExpirationAndSubmitProof( if !proofStatus.Invalid { log.Info( "A valid proof has been submitted, skip proving", - "blockID", e.BlockId, + "blockID", meta.GetBlockID(), "parent", proofStatus.ParentHeader.Hash(), ) return nil @@ -265,7 +262,7 @@ func (h *BlockProposedEventHandler) checkExpirationAndSubmitProof( if !h.contesterMode { log.Info( "An invalid proof has been submitted, but current prover is not in contest mode, skip proving", - "blockID", e.BlockId, + "blockID", meta.GetBlockID(), "parent", proofStatus.ParentHeader.Hash(), ) return nil @@ -273,23 +270,23 @@ func (h *BlockProposedEventHandler) checkExpirationAndSubmitProof( if h.isGuardian { // In guardian prover, we submit a proof directly. - h.proofSubmissionCh <- &proofProducer.ProofRequestBody{Tier: encoding.TierGuardianMinorityID, Event: e} + h.proofSubmissionCh <- &proofProducer.ProofRequestBody{Tier: encoding.TierGuardianMinorityID, Meta: meta} } else { // If the current proof has not been contested, we should contest it at first. if proofStatus.CurrentTransitionState.Contester == rpc.ZeroAddress { h.proofContestCh <- &proofProducer.ContestRequestBody{ - BlockID: e.BlockId, - ProposedIn: new(big.Int).SetUint64(e.Raw.BlockNumber), + BlockID: meta.GetBlockID(), + ProposedIn: meta.GetRawBlockHeight(), ParentHash: proofStatus.ParentHeader.Hash(), - Meta: &e.Meta, - Tier: e.Meta.MinTier, + Meta: meta, + Tier: meta.GetMinTier(), } } else { // The invalid proof submitted to protocol is contested by another prover, // we need to submit a proof with a higher tier. h.proofSubmissionCh <- &proofProducer.ProofRequestBody{ - Tier: proofStatus.CurrentTransitionState.Tier + 1, - Event: e, + Tier: proofStatus.CurrentTransitionState.Tier + 1, + Meta: meta, } } } @@ -297,32 +294,32 @@ func (h *BlockProposedEventHandler) checkExpirationAndSubmitProof( return nil } - windowExpired, _, timeToExpire, err := IsProvingWindowExpired(&e.Meta, h.sharedState.GetTiers()) + windowExpired, _, timeToExpire, err := IsProvingWindowExpired(meta, h.sharedState.GetTiers()) if err != nil { return fmt.Errorf("failed to check if the proving window is expired: %w", err) } // If the proving window is not expired, we need to check if the current prover is the assigned prover, // if no and the current prover wants to prove unassigned blocks, then we should wait for its expiration. - if !windowExpired && e.AssignedProver != h.proverAddress && e.AssignedProver != h.proverSetAddress { + if !windowExpired && meta.GetAssignedProver() != h.proverAddress && meta.GetAssignedProver() != h.proverSetAddress { log.Info( "Proposed block is not provable by current prover at the moment", - "blockID", e.BlockId, - "prover", e.AssignedProver, + "blockID", meta.GetBlockID(), + "prover", meta.GetAssignedProver(), "timeToExpire", timeToExpire, ) if h.proveUnassignedBlocks { log.Info( "Add proposed block to wait for proof window expiration", - "blockID", e.BlockId, - "assignProver", e.AssignedProver, + "blockID", meta.GetBlockID(), + "assignProver", meta.GetAssignedProver(), "timeToExpire", timeToExpire, ) time.AfterFunc( // Add another 72 seconds, to ensure one more L1 block will be mined before the proof submission timeToExpire+proofExpirationDelay, - func() { h.assignmentExpiredCh <- e }, + func() { h.assignmentExpiredCh <- meta }, ) } @@ -331,7 +328,7 @@ func (h *BlockProposedEventHandler) checkExpirationAndSubmitProof( // The current prover is the assigned prover, or the proving window is expired, // try to submit a proof for this proposed block. - tier := e.Meta.MinTier + tier := meta.GetMinTier() if h.isGuardian { tier = encoding.TierGuardianMinorityID @@ -339,15 +336,15 @@ func (h *BlockProposedEventHandler) checkExpirationAndSubmitProof( log.Info( "Proposed block is provable", - "blockID", e.BlockId, - "assignProver", e.AssignedProver, - "minTier", e.Meta.MinTier, + "blockID", meta.GetBlockID(), + "assignProver", meta.GetAssignedProver(), + "minTier", meta.GetMinTier(), "tier", tier, ) metrics.ProverProofsAssigned.Add(1) - h.proofSubmissionCh <- &proofProducer.ProofRequestBody{Tier: tier, Event: e} + h.proofSubmissionCh <- &proofProducer.ProofRequestBody{Tier: tier, Meta: meta} return nil } @@ -382,16 +379,19 @@ func NewBlockProposedEventGuardianHandler( // Handle implements the BlockProposedHandler interface. func (h *BlockProposedGuaridanEventHandler) Handle( ctx context.Context, - event *bindings.TaikoL1ClientBlockProposed, + meta metadata.TaikoBlockMetaData, end eventIterator.EndBlockProposedEventIterFunc, ) error { // If we are operating as a guardian prover, // we should sign all seen proposed blocks as soon as possible. go func() { - if err := h.GuardianProverHeartbeater.SignAndSendBlock(ctx, event.BlockId); err != nil { - log.Error("Guardian prover unable to sign block", "blockID", event.BlockId, "error", err) + if h.GuardianProverHeartbeater == nil { + return + } + if err := h.GuardianProverHeartbeater.SignAndSendBlock(ctx, meta.GetBlockID()); err != nil { + log.Error("Guardian prover unable to sign block", "blockID", meta.GetBlockID(), "error", err) } }() - return h.BlockProposedEventHandler.Handle(ctx, event, end) + return h.BlockProposedEventHandler.Handle(ctx, meta, end) } diff --git a/packages/taiko-client/prover/event_handler/block_proposed_test.go b/packages/taiko-client/prover/event_handler/block_proposed_test.go index e3a0563d270..352b9daf458 100644 --- a/packages/taiko-client/prover/event_handler/block_proposed_test.go +++ b/packages/taiko-client/prover/event_handler/block_proposed_test.go @@ -6,7 +6,7 @@ import ( "github.com/ethereum/go-ethereum/common" - "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/metadata" proofProducer "github.com/taikoxyz/taiko-mono/packages/taiko-client/prover/proof_producer" state "github.com/taikoxyz/taiko-mono/packages/taiko-client/prover/shared_state" ) @@ -16,10 +16,9 @@ func (s *EventHandlerTestSuite) TestBlockProposedHandle() { opts := &NewBlockProposedEventHandlerOps{ SharedState: &state.SharedState{}, ProverAddress: common.Address{}, - GenesisHeightL1: 0, RPC: s.RPCClient, ProofGenerationCh: make(chan *proofProducer.ProofWithHeader), - AssignmentExpiredCh: make(chan *bindings.TaikoL1ClientBlockProposed), + AssignmentExpiredCh: make(chan metadata.TaikoBlockMetaData), ProofSubmissionCh: make(chan *proofProducer.ProofRequestBody), ProofContestCh: make(chan *proofProducer.ContestRequestBody), BackOffRetryInterval: 1 * time.Minute, @@ -28,7 +27,5 @@ func (s *EventHandlerTestSuite) TestBlockProposedHandle() { ProveUnassignedBlocks: true, } handler := NewBlockProposedEventHandler(opts) - e := s.ProposeAndInsertValidBlock(s.proposer, s.blobSyncer) - err := handler.Handle(context.Background(), e, func() {}) - s.Nil(err) + s.Nil(handler.Handle(context.Background(), s.ProposeAndInsertValidBlock(s.proposer, s.blobSyncer), func() {})) } diff --git a/packages/taiko-client/prover/event_handler/block_verified.go b/packages/taiko-client/prover/event_handler/block_verified.go index 41be0253928..cb72d4dda60 100644 --- a/packages/taiko-client/prover/event_handler/block_verified.go +++ b/packages/taiko-client/prover/event_handler/block_verified.go @@ -19,18 +19,13 @@ func NewBlockVerifiedEventHandler(guardianProverAddress common.Address) *BlockVe } // Handle handles the BlockVerified event. -func (h *BlockVerifiedEventHandler) Handle(e *bindings.TaikoL1ClientBlockVerified) { +func (h *BlockVerifiedEventHandler) Handle(e *bindings.TaikoL1ClientBlockVerifiedV2) { metrics.ProverLatestVerifiedIDGauge.Set(float64(e.BlockId.Uint64())) - if e.Prover == h.guardianProverAddress { - metrics.ProverProvenByGuardianGauge.Set(1) - } - log.Info( "New verified block", "blockID", e.BlockId, "hash", common.BytesToHash(e.BlockHash[:]), - "stateRoot", common.BytesToHash(e.StateRoot[:]), "prover", e.Prover, ) } diff --git a/packages/taiko-client/prover/event_handler/block_verified_test.go b/packages/taiko-client/prover/event_handler/block_verified_test.go index 90e9831d530..ebe226c0429 100644 --- a/packages/taiko-client/prover/event_handler/block_verified_test.go +++ b/packages/taiko-client/prover/event_handler/block_verified_test.go @@ -11,7 +11,7 @@ func (s *EventHandlerTestSuite) TestBlockVerifiedHandle() { handler := &BlockVerifiedEventHandler{} id := testutils.RandomHash().Big().Uint64() s.NotPanics(func() { - handler.Handle(&bindings.TaikoL1ClientBlockVerified{ + handler.Handle(&bindings.TaikoL1ClientBlockVerifiedV2{ BlockId: testutils.RandomHash().Big(), Raw: types.Log{ BlockHash: testutils.RandomHash(), diff --git a/packages/taiko-client/prover/event_handler/interface.go b/packages/taiko-client/prover/event_handler/interface.go index 6181859a18d..290c4c2f9f6 100644 --- a/packages/taiko-client/prover/event_handler/interface.go +++ b/packages/taiko-client/prover/event_handler/interface.go @@ -4,33 +4,34 @@ import ( "context" "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/metadata" eventIterator "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/chain_iterator/event_iterator" ) // BlockProposedHandler is the interface for handling `TaikoL1.BlockProposed` events. type BlockProposedHandler interface { Handle(ctx context.Context, - event *bindings.TaikoL1ClientBlockProposed, + meta metadata.TaikoBlockMetaData, end eventIterator.EndBlockProposedEventIterFunc, ) error } -// TransitionContestedHandler is the interface for handling `TaikoL1.TransitionContested` events. +// TransitionContestedHandler is the interface for handling `TaikoL1.TransitionContestedV2` events. type TransitionContestedHandler interface { - Handle(ctx context.Context, event *bindings.TaikoL1ClientTransitionContested) error + Handle(ctx context.Context, event *bindings.TaikoL1ClientTransitionContestedV2) error } -// TransitionProvedHandler is the interface for handling `TaikoL1.TransitionProved` events. +// TransitionProvedHandler is the interface for handling `TaikoL1.TransitionProvedV2` events. type TransitionProvedHandler interface { - Handle(ctx context.Context, event *bindings.TaikoL1ClientTransitionProved) error + Handle(ctx context.Context, event *bindings.TaikoL1ClientTransitionProvedV2) error } -// BlockVerifiedHandler is the interface for handling `TaikoL1.BlockVerified` events. +// BlockVerifiedHandler is the interface for handling `TaikoL1.BlockVerifiedV2` events. type BlockVerifiedHandler interface { - Handle(e *bindings.TaikoL1ClientBlockVerified) + Handle(e *bindings.TaikoL1ClientBlockVerifiedV2) } // AssignmentExpiredHandler is the interface for handling the proof assignment expiration. type AssignmentExpiredHandler interface { - Handle(ctx context.Context, event *bindings.TaikoL1ClientBlockProposed) error + Handle(ctx context.Context, meta metadata.TaikoBlockMetaData) error } diff --git a/packages/taiko-client/prover/event_handler/transition_contested.go b/packages/taiko-client/prover/event_handler/transition_contested.go index a34d3506932..a3da2639bba 100644 --- a/packages/taiko-client/prover/event_handler/transition_contested.go +++ b/packages/taiko-client/prover/event_handler/transition_contested.go @@ -9,8 +9,8 @@ import ( "github.com/ethereum/go-ethereum/log" "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings" - "github.com/taikoxyz/taiko-mono/packages/taiko-client/internal/utils" "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/rpc" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/utils" proofProducer "github.com/taikoxyz/taiko-mono/packages/taiko-client/prover/proof_producer" ) @@ -33,7 +33,7 @@ func NewTransitionContestedEventHandler( // Handle implements the TransitionContestedHandler interface. func (h *TransitionContestedEventHandler) Handle( ctx context.Context, - e *bindings.TaikoL1ClientTransitionContested, + e *bindings.TaikoL1ClientTransitionContestedV2, ) error { log.Info( "🗡 Transition contested", @@ -85,16 +85,11 @@ func (h *TransitionContestedEventHandler) Handle( } // If the proof is invalid, we contest it. - blockInfo, err := h.rpc.GetL2BlockInfo(ctx, e.BlockId) - if err != nil { - return err - } - - blockProposedEvent, err := GetBlockProposedEventFromBlockID( + meta, err := getMetadataFromBlockID( ctx, h.rpc, e.BlockId, - new(big.Int).SetUint64(blockInfo.ProposedIn), + new(big.Int).SetUint64(e.ProposedIn), ) if err != nil { return err @@ -102,8 +97,8 @@ func (h *TransitionContestedEventHandler) Handle( go func() { h.proofSubmissionCh <- &proofProducer.ProofRequestBody{ - Tier: e.Tier + 1, // We need to send a higher tier proof to resolve the current contest. - Event: blockProposedEvent, + Tier: e.Tier + 1, // We need to send a higher tier proof to resolve the current contest. + Meta: meta, } }() diff --git a/packages/taiko-client/prover/event_handler/transition_proved.go b/packages/taiko-client/prover/event_handler/transition_proved.go index 21416b5c513..b1896f15be9 100644 --- a/packages/taiko-client/prover/event_handler/transition_proved.go +++ b/packages/taiko-client/prover/event_handler/transition_proved.go @@ -44,10 +44,14 @@ func NewTransitionProvedEventHandler( // Handle implements the TransitionProvedHandler interface. func (h *TransitionProvedEventHandler) Handle( ctx context.Context, - e *bindings.TaikoL1ClientTransitionProved, + e *bindings.TaikoL1ClientTransitionProvedV2, ) error { metrics.ProverReceivedProvenBlockGauge.Set(float64(e.BlockId.Uint64())) + if e.Tier >= encoding.TierGuardianMinorityID { + metrics.ProverProvenByGuardianGauge.Add(1) + } + // If this prover is in contest mode, we check the validity of this proof and if it's invalid, // contest it with a higher tier proof. if !h.contesterMode { @@ -69,14 +73,8 @@ func (h *TransitionProvedEventHandler) Handle( if isValid { return nil } - // If the proof is invalid, we contest it. - blockInfo, err := h.rpc.GetL2BlockInfo(ctx, e.BlockId) - if err != nil { - return err - } - - meta, err := getMetadataFromBlockID(ctx, h.rpc, e.BlockId, new(big.Int).SetUint64(blockInfo.ProposedIn)) + meta, err := getMetadataFromBlockID(ctx, h.rpc, e.BlockId, new(big.Int).SetUint64(e.ProposedIn)) if err != nil { return err } @@ -84,33 +82,33 @@ func (h *TransitionProvedEventHandler) Handle( log.Info( "Attempting to contest a proven transition", "blockID", e.BlockId, - "l1Height", blockInfo.ProposedIn, + "l1Height", e.ProposedIn, "tier", e.Tier, "parentHash", common.Bytes2Hex(e.Tran.ParentHash[:]), "blockHash", common.Bytes2Hex(e.Tran.BlockHash[:]), "stateRoot", common.Bytes2Hex(e.Tran.StateRoot[:]), ) if h.isGuardian { - blockProposedEvent, err := GetBlockProposedEventFromBlockID( + meta, err := getMetadataFromBlockID( ctx, h.rpc, e.BlockId, - new(big.Int).SetUint64(blockInfo.ProposedIn), + new(big.Int).SetUint64(e.ProposedIn), ) if err != nil { return err } go func() { h.proofSubmissionCh <- &proofProducer.ProofRequestBody{ - Tier: encoding.TierGuardianMinorityID, - Event: blockProposedEvent, + Tier: encoding.TierGuardianMinorityID, + Meta: meta, } }() } else { go func() { h.proofContestCh <- &proofProducer.ContestRequestBody{ BlockID: e.BlockId, - ProposedIn: new(big.Int).SetUint64(blockInfo.ProposedIn), + ProposedIn: new(big.Int).SetUint64(e.ProposedIn), ParentHash: e.Tran.ParentHash, Meta: meta, Tier: e.Tier, diff --git a/packages/taiko-client/prover/event_handler/transition_proved_test.go b/packages/taiko-client/prover/event_handler/transition_proved_test.go index 61b287a5d43..fa721f90c46 100644 --- a/packages/taiko-client/prover/event_handler/transition_proved_test.go +++ b/packages/taiko-client/prover/event_handler/transition_proved_test.go @@ -41,12 +41,11 @@ func (s *EventHandlerTestSuite) SetupTest() { d := new(driver.Driver) s.Nil(d.InitFromConfig(context.Background(), &driver.Config{ ClientConfig: &rpc.ClientConfig{ - L1Endpoint: os.Getenv("L1_NODE_WS_ENDPOINT"), - L2Endpoint: os.Getenv("L2_EXECUTION_ENGINE_WS_ENDPOINT"), - L2EngineEndpoint: os.Getenv("L2_EXECUTION_ENGINE_AUTH_ENDPOINT"), - TaikoL1Address: common.HexToAddress(os.Getenv("TAIKO_L1_ADDRESS")), - TaikoL2Address: common.HexToAddress(os.Getenv("TAIKO_L2_ADDRESS")), - ProverSetAddress: common.HexToAddress(os.Getenv("PROVER_SET_ADDRESS")), + L1Endpoint: os.Getenv("L1_WS"), + L2Endpoint: os.Getenv("L2_WS"), + L2EngineEndpoint: os.Getenv("L2_AUTH"), + TaikoL1Address: common.HexToAddress(os.Getenv("TAIKO_L1")), + TaikoL2Address: common.HexToAddress(os.Getenv("TAIKO_L2")), JwtSecret: string(jwtSecret), }, })) @@ -77,28 +76,20 @@ func (s *EventHandlerTestSuite) SetupTest() { s.Nil(prop.InitFromConfig(context.Background(), &proposer.Config{ ClientConfig: &rpc.ClientConfig{ - L1Endpoint: os.Getenv("L1_NODE_WS_ENDPOINT"), - L2Endpoint: os.Getenv("L2_EXECUTION_ENGINE_WS_ENDPOINT"), - L2EngineEndpoint: os.Getenv("L2_EXECUTION_ENGINE_AUTH_ENDPOINT"), + L1Endpoint: os.Getenv("L1_WS"), + L2Endpoint: os.Getenv("L2_WS"), + L2EngineEndpoint: os.Getenv("L2_AUTH"), JwtSecret: string(jwtSecret), - TaikoL1Address: common.HexToAddress(os.Getenv("TAIKO_L1_ADDRESS")), - TaikoL2Address: common.HexToAddress(os.Getenv("TAIKO_L2_ADDRESS")), - TaikoTokenAddress: common.HexToAddress(os.Getenv("TAIKO_TOKEN_ADDRESS")), - ProverSetAddress: common.HexToAddress(os.Getenv("PROVER_SET_ADDRESS")), + TaikoL1Address: common.HexToAddress(os.Getenv("TAIKO_L1")), + TaikoL2Address: common.HexToAddress(os.Getenv("TAIKO_L2")), + TaikoTokenAddress: common.HexToAddress(os.Getenv("TAIKO_TOKEN")), }, - AssignmentHookAddress: common.HexToAddress(os.Getenv("ASSIGNMENT_HOOK_ADDRESS")), L1ProposerPrivKey: l1ProposerPrivKey, L2SuggestedFeeRecipient: common.HexToAddress(os.Getenv("L2_SUGGESTED_FEE_RECIPIENT")), ProposeInterval: 1024 * time.Hour, MaxProposedTxListsPerEpoch: 1, - ProverEndpoints: s.ProverEndpoints, - OptimisticTierFee: common.Big256, - SgxTierFee: common.Big256, - MaxTierFeePriceBumps: 3, - TierFeePriceBump: common.Big2, - L1BlockBuilderTip: common.Big0, TxmgrConfigs: &txmgr.CLIConfig{ - L1RPCURL: os.Getenv("L1_NODE_WS_ENDPOINT"), + L1RPCURL: os.Getenv("L1_WS"), NumConfirmations: 1, SafeAbortNonceTooLowCount: txmgr.DefaultBatcherFlagValues.SafeAbortNonceTooLowCount, PrivateKey: common.Bytes2Hex(crypto.FromECDSA(l1ProposerPrivKey)), @@ -112,7 +103,22 @@ func (s *EventHandlerTestSuite) SetupTest() { TxSendTimeout: txmgr.DefaultBatcherFlagValues.TxSendTimeout, TxNotInMempoolTimeout: txmgr.DefaultBatcherFlagValues.TxNotInMempoolTimeout, }, - })) + PrivateTxmgrConfigs: &txmgr.CLIConfig{ + L1RPCURL: os.Getenv("L1_WS"), + NumConfirmations: 1, + SafeAbortNonceTooLowCount: txmgr.DefaultBatcherFlagValues.SafeAbortNonceTooLowCount, + PrivateKey: common.Bytes2Hex(crypto.FromECDSA(l1ProposerPrivKey)), + FeeLimitMultiplier: txmgr.DefaultBatcherFlagValues.FeeLimitMultiplier, + FeeLimitThresholdGwei: txmgr.DefaultBatcherFlagValues.FeeLimitThresholdGwei, + MinBaseFeeGwei: txmgr.DefaultBatcherFlagValues.MinBaseFeeGwei, + MinTipCapGwei: txmgr.DefaultBatcherFlagValues.MinTipCapGwei, + ResubmissionTimeout: txmgr.DefaultBatcherFlagValues.ResubmissionTimeout, + ReceiptQueryInterval: 1 * time.Second, + NetworkTimeout: txmgr.DefaultBatcherFlagValues.NetworkTimeout, + TxSendTimeout: txmgr.DefaultBatcherFlagValues.TxSendTimeout, + TxNotInMempoolTimeout: txmgr.DefaultBatcherFlagValues.TxNotInMempoolTimeout, + }, + }, nil, nil)) s.proposer = prop } @@ -126,10 +132,11 @@ func (s *EventHandlerTestSuite) TestTransitionProvedHandle() { true, false, ) - e := s.ProposeAndInsertValidBlock(s.proposer, s.blobSyncer) - err := handler.Handle(context.Background(), &bindings.TaikoL1ClientTransitionProved{ - BlockId: e.BlockId, - Tier: e.Meta.MinTier, + m := s.ProposeAndInsertValidBlock(s.proposer, s.blobSyncer) + err := handler.Handle(context.Background(), &bindings.TaikoL1ClientTransitionProvedV2{ + BlockId: m.GetBlockID(), + Tier: m.GetMinTier(), + ProposedIn: m.GetRawBlockHeight().Uint64(), }) s.Nil(err) } diff --git a/packages/taiko-client/prover/event_handler/util.go b/packages/taiko-client/prover/event_handler/util.go index 0a350d577af..92539d7e1c1 100644 --- a/packages/taiko-client/prover/event_handler/util.go +++ b/packages/taiko-client/prover/event_handler/util.go @@ -11,7 +11,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/log" - "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/metadata" eventIterator "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/chain_iterator/event_iterator" "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/rpc" ) @@ -68,24 +68,24 @@ func getProvingWindow( return 0, errTierNotFound } -// GetBlockProposedEventFromBlockID fetches the BlockProposed event by the given block id. -func GetBlockProposedEventFromBlockID( +// getMetadataFromBlockID fetches the block meta from the onchain event by the given block id. +func getMetadataFromBlockID( ctx context.Context, rpc *rpc.Client, id *big.Int, proposedIn *big.Int, -) (e *bindings.TaikoL1ClientBlockProposed, err error) { +) (m metadata.TaikoBlockMetaData, err error) { callback := func( _ context.Context, - event *bindings.TaikoL1ClientBlockProposed, + meta metadata.TaikoBlockMetaData, _ eventIterator.EndBlockProposedEventIterFunc, ) error { // Only filter for exact blockID we want. - if event.BlockId.Cmp(id) != 0 { + if meta.GetBlockID().Cmp(id) != 0 { return nil } - e = event + m = meta return nil } @@ -106,43 +106,28 @@ func GetBlockProposedEventFromBlockID( return nil, err } - if e == nil { + if m == nil { return nil, fmt.Errorf("failed to find BlockProposed event for block %d", id) } - return e, nil -} - -// getMetadataFromBlockID fetches the block meta from the onchain event by the given block id. -func getMetadataFromBlockID( - ctx context.Context, - rpc *rpc.Client, - id *big.Int, - proposedIn *big.Int, -) (*bindings.TaikoDataBlockMetadata, error) { - e, err := GetBlockProposedEventFromBlockID(ctx, rpc, id, proposedIn) - if err != nil { - return nil, err - } - return &e.Meta, nil + return m, nil } // IsProvingWindowExpired returns true as the first return parameter if the assigned prover // proving window of the given proposed block is expired, and the second return parameter is the time // remaining til proving window is expired. func IsProvingWindowExpired( - metadata *bindings.TaikoDataBlockMetadata, + metadata metadata.TaikoBlockMetaData, tiers []*rpc.TierProviderTierWithID, ) (bool, time.Time, time.Duration, error) { - provingWindow, err := getProvingWindow(metadata.MinTier, tiers) + provingWindow, err := getProvingWindow(metadata.GetMinTier(), tiers) if err != nil { return false, time.Time{}, 0, fmt.Errorf("failed to get proving window: %w", err) } var ( now = uint64(time.Now().Unix()) - expiredAt = metadata.Timestamp + uint64(provingWindow.Seconds()) + expiredAt = metadata.GetTimestamp() + uint64(provingWindow.Seconds()) ) - return now > expiredAt, time.Unix(int64(expiredAt), 0), time.Duration(expiredAt-now) * time.Second, nil } diff --git a/packages/taiko-client/prover/init.go b/packages/taiko-client/prover/init.go index 2e5fdb80647..61faf0f66fc 100644 --- a/packages/taiko-client/prover/init.go +++ b/packages/taiko-client/prover/init.go @@ -13,8 +13,8 @@ import ( "github.com/ethereum/go-ethereum/log" "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/encoding" - "github.com/taikoxyz/taiko-mono/packages/taiko-client/internal/utils" "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/rpc" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/utils" handler "github.com/taikoxyz/taiko-mono/packages/taiko-client/prover/event_handler" proofProducer "github.com/taikoxyz/taiko-mono/packages/taiko-client/prover/proof_producer" proofSubmitter "github.com/taikoxyz/taiko-mono/packages/taiko-client/prover/proof_submitter" @@ -93,30 +93,51 @@ func (p *Prover) setApprovalAmount(ctx context.Context, contract common.Address) // initProofSubmitters initializes the proof submitters from the given tiers in protocol. func (p *Prover) initProofSubmitters( - txmgr *txmgr.SimpleTxManager, txBuilder *transaction.ProveBlockTxBuilder, tiers []*rpc.TierProviderTierWithID, ) error { for _, tier := range p.sharedState.GetTiers() { var ( - producer proofProducer.ProofProducer - submitter proofSubmitter.Submitter - err error + bufferSize = p.cfg.SGXProofBufferSize + producer proofProducer.ProofProducer + submitter proofSubmitter.Submitter + err error ) switch tier.ID { case encoding.TierOptimisticID: producer = &proofProducer.OptimisticProofProducer{} case encoding.TierSgxID: producer = &proofProducer.SGXProofProducer{ - RaikoHostEndpoint: p.cfg.RaikoHostEndpoint, - JWT: p.cfg.RaikoJWT, - ProofType: proofProducer.ProofTypeSgx, - Dummy: p.cfg.Dummy, + RaikoHostEndpoint: p.cfg.RaikoHostEndpoint, + JWT: p.cfg.RaikoJWT, + ProofType: proofProducer.ProofTypeSgx, + Dummy: p.cfg.Dummy, + RaikoRequestTimeout: p.cfg.RaikoRequestTimeout, } + case encoding.TierZkVMRisc0ID: + producer = &proofProducer.ZKvmProofProducer{ + ZKProofType: proofProducer.ZKProofTypeR0, + RaikoHostEndpoint: p.cfg.RaikoZKVMHostEndpoint, + JWT: p.cfg.RaikoJWT, + Dummy: p.cfg.Dummy, + RaikoRequestTimeout: p.cfg.RaikoRequestTimeout, + } + bufferSize = p.cfg.ZKVMProofBufferSize + case encoding.TierZkVMSp1ID: + producer = &proofProducer.ZKvmProofProducer{ + ZKProofType: proofProducer.ZKProofTypeSP1, + RaikoHostEndpoint: p.cfg.RaikoZKVMHostEndpoint, + JWT: p.cfg.RaikoJWT, + Dummy: p.cfg.Dummy, + RaikoRequestTimeout: p.cfg.RaikoRequestTimeout, + } + bufferSize = p.cfg.ZKVMProofBufferSize case encoding.TierGuardianMinorityID: producer = proofProducer.NewGuardianProofProducer(encoding.TierGuardianMinorityID, p.cfg.EnableLivenessBondProof) + bufferSize = 0 case encoding.TierGuardianMajorityID: producer = proofProducer.NewGuardianProofProducer(encoding.TierGuardianMajorityID, p.cfg.EnableLivenessBondProof) + bufferSize = 0 default: return fmt.Errorf("unsupported tier: %d", tier.ID) } @@ -125,15 +146,20 @@ func (p *Prover) initProofSubmitters( p.rpc, producer, p.proofGenerationCh, + p.batchProofGenerationCh, + p.aggregationNotify, p.cfg.ProverSetAddress, p.cfg.TaikoL2Address, p.cfg.Graffiti, p.cfg.ProveBlockGasLimit, - txmgr, + p.txmgr, + p.privateTxmgr, txBuilder, tiers, p.IsGuardianProver(), p.cfg.GuardianProofSubmissionDelay, + bufferSize, + p.cfg.ForceBatchProvingInterval, ); err != nil { return err } @@ -154,7 +180,6 @@ func (p *Prover) initL1Current(startingBlockID *big.Int) error { if err != nil { return err } - p.genesisHeightL1 = stateVars.A.GenesisHeight if startingBlockID == nil { if stateVars.B.LastVerifiedBlockId == 0 { @@ -206,7 +231,6 @@ func (p *Prover) initEventHandlers() error { SharedState: p.sharedState, ProverAddress: p.ProverAddress(), ProverSetAddress: p.cfg.ProverSetAddress, - GenesisHeightL1: p.genesisHeightL1, RPC: p.rpc, ProofGenerationCh: p.proofGenerationCh, AssignmentExpiredCh: p.assignmentExpiredCh, diff --git a/packages/taiko-client/prover/init_test.go b/packages/taiko-client/prover/init_test.go index 25c4e320b3f..17a1557baac 100644 --- a/packages/taiko-client/prover/init_test.go +++ b/packages/taiko-client/prover/init_test.go @@ -13,7 +13,7 @@ import ( func (s *ProverTestSuite) TestSetApprovalAmount() { data, err := encoding.TaikoTokenABI.Pack( "approve", - s.p.cfg.AssignmentHookAddress, + s.p.cfg.TaikoL1Address, common.Big0, ) s.Nil(err) @@ -24,7 +24,7 @@ func (s *ProverTestSuite) TestSetApprovalAmount() { }) s.Nil(err) - allowance, err := s.p.rpc.TaikoToken.Allowance(nil, s.p.ProverAddress(), s.p.cfg.AssignmentHookAddress) + allowance, err := s.p.rpc.TaikoToken.Allowance(nil, s.p.ProverAddress(), s.p.cfg.TaikoL1Address) s.Nil(err) s.Equal(0, allowance.Cmp(common.Big0)) @@ -35,9 +35,9 @@ func (s *ProverTestSuite) TestSetApprovalAmount() { s.p.cfg.Allowance = amt - s.Nil(s.p.setApprovalAmount(context.Background(), s.p.cfg.AssignmentHookAddress)) + s.Nil(s.p.setApprovalAmount(context.Background(), s.p.cfg.TaikoL1Address)) - allowance, err = s.p.rpc.TaikoToken.Allowance(nil, s.p.ProverAddress(), s.p.cfg.AssignmentHookAddress) + allowance, err = s.p.rpc.TaikoToken.Allowance(nil, s.p.ProverAddress(), s.p.cfg.TaikoL1Address) s.Nil(err) s.Equal(0, amt.Cmp(allowance)) diff --git a/packages/taiko-client/prover/proof_producer/dummy_producer.go b/packages/taiko-client/prover/proof_producer/dummy_producer.go index 0481aa47e5b..5828979b52e 100644 --- a/packages/taiko-client/prover/proof_producer/dummy_producer.go +++ b/packages/taiko-client/prover/proof_producer/dummy_producer.go @@ -3,10 +3,11 @@ package producer import ( "bytes" "math/big" + "time" "github.com/ethereum/go-ethereum/core/types" - "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/metadata" ) // DummyProofProducer always returns a dummy proof. @@ -16,9 +17,10 @@ type DummyProofProducer struct{} func (o *DummyProofProducer) RequestProof( opts *ProofRequestOptions, blockID *big.Int, - meta *bindings.TaikoDataBlockMetadata, + meta metadata.TaikoBlockMetaData, header *types.Header, tier uint16, + _ time.Time, ) (*ProofWithHeader, error) { return &ProofWithHeader{ BlockID: blockID, @@ -29,3 +31,15 @@ func (o *DummyProofProducer) RequestProof( Tier: tier, }, nil } + +// RequestBatchProofs returns a dummy proof aggregation to the result channel. +func (o *DummyProofProducer) RequestBatchProofs( + proofs []*ProofWithHeader, + tier uint16, +) (*BatchProofs, error) { + return &BatchProofs{ + Proofs: proofs, + BatchProof: bytes.Repeat([]byte{0xbb}, 100), + Tier: tier, + }, nil +} diff --git a/packages/taiko-client/prover/proof_producer/dummy_producer_test.go b/packages/taiko-client/prover/proof_producer/dummy_producer_test.go index 2b270071acf..4977e2c6c75 100644 --- a/packages/taiko-client/prover/proof_producer/dummy_producer_test.go +++ b/packages/taiko-client/prover/proof_producer/dummy_producer_test.go @@ -8,7 +8,7 @@ import ( "github.com/ethereum/go-ethereum/core/types" "github.com/stretchr/testify/require" - "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/metadata" ) func TestDummyProducerRequestProof(t *testing.T) { @@ -37,9 +37,10 @@ func TestDummyProducerRequestProof(t *testing.T) { res, err := producer.RequestProof( &ProofRequestOptions{}, blockID, - &bindings.TaikoDataBlockMetadata{}, + &metadata.TaikoDataBlockMetadataOntake{}, header, tier, + time.Now(), ) require.Nil(t, err) diff --git a/packages/taiko-client/prover/proof_producer/guardian_producer.go b/packages/taiko-client/prover/proof_producer/guardian_producer.go index ea4dd8fa733..a459eb12f28 100644 --- a/packages/taiko-client/prover/proof_producer/guardian_producer.go +++ b/packages/taiko-client/prover/proof_producer/guardian_producer.go @@ -3,12 +3,13 @@ package producer import ( "context" "math/big" + "time" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/log" - "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/metadata" ) // GuardianProofProducer always returns an optimistic (dummy) proof. @@ -34,14 +35,14 @@ func (g *GuardianProofProducer) RequestProof( _ context.Context, opts *ProofRequestOptions, blockID *big.Int, - meta *bindings.TaikoDataBlockMetadata, + meta metadata.TaikoBlockMetaData, header *types.Header, + requestAt time.Time, ) (*ProofWithHeader, error) { log.Info( "Request guardian proof", "blockID", blockID, - "coinbase", meta.Coinbase, - "height", header.Number, + "coinbase", meta.GetCoinbase(), "hash", header.Hash(), ) @@ -56,7 +57,24 @@ func (g *GuardianProofProducer) RequestProof( }, nil } - return g.DummyProofProducer.RequestProof(opts, blockID, meta, header, g.Tier()) + return g.DummyProofProducer.RequestProof(opts, blockID, meta, header, g.Tier(), requestAt) +} + +// RequestCancel implements the ProofProducer interface to cancel the proof generating progress. +func (g *GuardianProofProducer) RequestCancel( + _ context.Context, + _ *ProofRequestOptions, +) error { + return nil +} + +// Aggregate implements the ProofProducer interface to aggregate a batch of proofs. +func (g *GuardianProofProducer) Aggregate( + _ context.Context, + _ []*ProofWithHeader, + _ time.Time, +) (*BatchProofs, error) { + return nil, nil } // Tier implements the ProofProducer interface. diff --git a/packages/taiko-client/prover/proof_producer/guardian_producer_test.go b/packages/taiko-client/prover/proof_producer/guardian_producer_test.go index ce5b6819b48..1697e763ad7 100644 --- a/packages/taiko-client/prover/proof_producer/guardian_producer_test.go +++ b/packages/taiko-client/prover/proof_producer/guardian_producer_test.go @@ -10,8 +10,8 @@ import ( "github.com/ethereum/go-ethereum/crypto" "github.com/stretchr/testify/require" - "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings" "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/encoding" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/metadata" ) func TestGuardianProducerRequestProof(t *testing.T) { @@ -40,8 +40,9 @@ func TestGuardianProducerRequestProof(t *testing.T) { context.Background(), &ProofRequestOptions{}, blockID, - &bindings.TaikoDataBlockMetadata{}, + &metadata.TaikoDataBlockMetadataOntake{}, header, + time.Now(), ) require.Nil(t, err) @@ -63,10 +64,11 @@ func TestGuardianProducerRequestProofReturnLivenessBond(t *testing.T) { Number: common.Big256, GasLimit: 1024, GasUsed: 1024, - Time: uint64(time.Now().Unix()), - Extra: randHash().Bytes(), - MixDigest: randHash(), - Nonce: types.BlockNonce{}, + + Time: uint64(time.Now().Unix()), + Extra: randHash().Bytes(), + MixDigest: randHash(), + Nonce: types.BlockNonce{}, } var ( @@ -77,8 +79,9 @@ func TestGuardianProducerRequestProofReturnLivenessBond(t *testing.T) { context.Background(), &ProofRequestOptions{}, blockID, - &bindings.TaikoDataBlockMetadata{}, + &metadata.TaikoDataBlockMetadataOntake{}, header, + time.Now(), ) require.Nil(t, err) @@ -115,8 +118,9 @@ func TestMinorityRequestProof(t *testing.T) { context.Background(), &ProofRequestOptions{}, blockID, - &bindings.TaikoDataBlockMetadata{}, + &metadata.TaikoDataBlockMetadataOntake{}, header, + time.Now(), ) require.Nil(t, err) @@ -152,8 +156,9 @@ func TestRequestMinorityProofReturnLivenessBond(t *testing.T) { context.Background(), &ProofRequestOptions{}, blockID, - &bindings.TaikoDataBlockMetadata{}, + &metadata.TaikoDataBlockMetadataOntake{}, header, + time.Now(), ) require.Nil(t, err) diff --git a/packages/taiko-client/prover/proof_producer/optimistic_producer.go b/packages/taiko-client/prover/proof_producer/optimistic_producer.go index f9c5971419c..10d0eb2f2da 100644 --- a/packages/taiko-client/prover/proof_producer/optimistic_producer.go +++ b/packages/taiko-client/prover/proof_producer/optimistic_producer.go @@ -3,12 +3,13 @@ package producer import ( "context" "math/big" + "time" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/log" - "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings" "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/encoding" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/metadata" ) // OptimisticProofProducer always returns an optimistic (dummy) proof. @@ -19,18 +20,50 @@ func (o *OptimisticProofProducer) RequestProof( _ context.Context, opts *ProofRequestOptions, blockID *big.Int, - meta *bindings.TaikoDataBlockMetadata, + meta metadata.TaikoBlockMetaData, header *types.Header, + requestAt time.Time, ) (*ProofWithHeader, error) { log.Info( "Request optimistic proof", "blockID", blockID, - "coinbase", meta.Coinbase, - "height", header.Number, + "coinbase", meta.GetCoinbase(), "hash", header.Hash(), ) - return o.DummyProofProducer.RequestProof(opts, blockID, meta, header, o.Tier()) + return o.DummyProofProducer.RequestProof(opts, blockID, meta, header, o.Tier(), requestAt) +} + +// Aggregate implements the ProofProducer interface to aggregate a batch of proofs. +func (o *OptimisticProofProducer) Aggregate( + _ context.Context, + items []*ProofWithHeader, + _ time.Time, +) (*BatchProofs, error) { + log.Info( + "Aggregate batch optimistic proof", + ) + if len(items) == 0 { + return nil, ErrInvalidLength + } + blockIDs := make([]*big.Int, len(items)) + for i, item := range items { + blockIDs[i] = item.Meta.GetBlockID() + } + batchProof, err := o.DummyProofProducer.RequestBatchProofs(items, o.Tier()) + if err != nil { + return nil, err + } + batchProof.BlockIDs = blockIDs + return batchProof, nil +} + +// RequestCancel implements the ProofProducer interface to cancel the proof generating progress. +func (o *OptimisticProofProducer) RequestCancel( + _ context.Context, + _ *ProofRequestOptions, +) error { + return nil } // Tier implements the ProofProducer interface. diff --git a/packages/taiko-client/prover/proof_producer/optimistic_producer_test.go b/packages/taiko-client/prover/proof_producer/optimistic_producer_test.go index 416dac4e46d..372de77a2b4 100644 --- a/packages/taiko-client/prover/proof_producer/optimistic_producer_test.go +++ b/packages/taiko-client/prover/proof_producer/optimistic_producer_test.go @@ -11,8 +11,8 @@ import ( "github.com/ethereum/go-ethereum/log" "github.com/stretchr/testify/require" - "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings" "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/encoding" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/metadata" ) func TestOptimisticRequestProof(t *testing.T) { @@ -41,8 +41,9 @@ func TestOptimisticRequestProof(t *testing.T) { context.Background(), &ProofRequestOptions{}, blockID, - &bindings.TaikoDataBlockMetadata{}, + &metadata.TaikoDataBlockMetadataOntake{}, header, + time.Now(), ) require.Nil(t, err) @@ -78,8 +79,9 @@ func TestProofCancel(t *testing.T) { context.Background(), &ProofRequestOptions{}, blockID, - &bindings.TaikoDataBlockMetadata{}, + &metadata.TaikoDataBlockMetadataOntake{}, header, + time.Now(), ) require.Nil(t, err) } diff --git a/packages/taiko-client/prover/proof_producer/proof_producer.go b/packages/taiko-client/prover/proof_producer/proof_producer.go index 0f1462e9cb0..292a90d2d60 100644 --- a/packages/taiko-client/prover/proof_producer/proof_producer.go +++ b/packages/taiko-client/prover/proof_producer/proof_producer.go @@ -9,18 +9,19 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" - "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/metadata" ) var ( - proofPollingInterval = 10 * time.Second - errProofGenerating = errors.New("proof is generating") + errProofGenerating = errors.New("proof is generating") + errEmptyProof = errors.New("proof is empty") + ErrInvalidLength = errors.New("invalid items length") ) // ProofRequestBody represents a request body to generate a proof. type ProofRequestBody struct { - Tier uint16 - Event *bindings.TaikoL1ClientBlockProposed + Tier uint16 + Meta metadata.TaikoBlockMetaData } // ContestRequestBody represents a request body to generate a proof for contesting. @@ -28,7 +29,7 @@ type ContestRequestBody struct { BlockID *big.Int ProposedIn *big.Int ParentHash common.Hash - Meta *bindings.TaikoDataBlockMetadata + Meta metadata.TaikoBlockMetaData Tier uint16 } @@ -46,24 +47,42 @@ type ProofRequestOptions struct { Graffiti string GasUsed uint64 ParentGasUsed uint64 + Compressed bool } type ProofWithHeader struct { BlockID *big.Int - Meta *bindings.TaikoDataBlockMetadata + Meta metadata.TaikoBlockMetaData Header *types.Header Proof []byte Opts *ProofRequestOptions Tier uint16 } +type BatchProofs struct { + Proofs []*ProofWithHeader + BatchProof []byte + Tier uint16 + BlockIDs []*big.Int +} + type ProofProducer interface { RequestProof( ctx context.Context, opts *ProofRequestOptions, blockID *big.Int, - meta *bindings.TaikoDataBlockMetadata, + meta metadata.TaikoBlockMetaData, header *types.Header, + requestAt time.Time, ) (*ProofWithHeader, error) + Aggregate( + ctx context.Context, + items []*ProofWithHeader, + requestAt time.Time, + ) (*BatchProofs, error) + RequestCancel( + ctx context.Context, + opts *ProofRequestOptions, + ) error Tier() uint16 } diff --git a/packages/taiko-client/prover/proof_producer/sgx_producer.go b/packages/taiko-client/prover/proof_producer/sgx_producer.go index 96cf6572d7d..10d58cfb1c8 100644 --- a/packages/taiko-client/prover/proof_producer/sgx_producer.go +++ b/packages/taiko-client/prover/proof_producer/sgx_producer.go @@ -11,14 +11,14 @@ import ( "net/http" "time" - "github.com/cenkalti/backoff/v4" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/log" - "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings" "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/encoding" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/metadata" "github.com/taikoxyz/taiko-mono/packages/taiko-client/internal/metrics" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/rpc" ) const ( @@ -28,21 +28,34 @@ const ( // SGXProofProducer generates a SGX proof for the given block. type SGXProofProducer struct { - RaikoHostEndpoint string // a proverd RPC endpoint - ProofType string // Proof type - JWT string // JWT provided by Raiko - Dummy bool + RaikoHostEndpoint string // a proverd RPC endpoint + ProofType string // Proof type + JWT string // JWT provided by Raiko + Dummy bool + RaikoRequestTimeout time.Duration DummyProofProducer } // RaikoRequestProofBody represents the JSON body for requesting the proof. type RaikoRequestProofBody struct { - Block *big.Int `json:"block_number"` - Prover string `json:"prover"` - Graffiti string `json:"graffiti"` - Type string `json:"proof_type"` - SGX *SGXRequestProofBodyParam `json:"sgx"` - RISC0 RISC0RequestProofBodyParam `json:"risc0"` + Block *big.Int `json:"block_number"` + Prover string `json:"prover"` + Graffiti string `json:"graffiti"` + Type string `json:"proof_type"` + SGX *SGXRequestProofBodyParam `json:"sgx"` + RISC0 *RISC0RequestProofBodyParam `json:"risc0"` + SP1 *SP1RequestProofBodyParam `json:"sp1"` +} + +// RaikoRequestProofBodyV3 represents the JSON body for requesting the proof. +type RaikoRequestProofBodyV3 struct { + Blocks [][2]*big.Int `json:"block_numbers"` + Prover string `json:"prover"` + Graffiti string `json:"graffiti"` + Type string `json:"proof_type"` + SGX *SGXRequestProofBodyParam `json:"sgx"` + RISC0 *RISC0RequestProofBodyParam `json:"risc0"` + SP1 *SP1RequestProofBodyParam `json:"sp1"` } // SGXRequestProofBodyParam represents the JSON body of RaikoRequestProofBody's `sgx` field. @@ -60,6 +73,13 @@ type RISC0RequestProofBodyParam struct { ExecutionPo2 *big.Int `json:"execution_po2"` } +// SP1RequestProofBodyParam represents the JSON body of RaikoRequestProofBody's `sp1` field. +type SP1RequestProofBodyParam struct { + Recursion string `json:"recursion"` + Prover string `json:"prover"` + Verify bool `json:"verify"` +} + // RaikoRequestProofBodyResponse represents the JSON body of the response of the proof requests. type RaikoRequestProofBodyResponse struct { Data *RaikoProofData `json:"data"` @@ -67,7 +87,8 @@ type RaikoRequestProofBodyResponse struct { } type RaikoProofData struct { - Proof string `json:"proof"` //nolint:revive,stylecheck + Proof string `json:"proof"` //nolint:revive,stylecheck + Status string `json:"status"` } // RequestProof implements the ProofProducer interface. @@ -75,22 +96,23 @@ func (s *SGXProofProducer) RequestProof( ctx context.Context, opts *ProofRequestOptions, blockID *big.Int, - meta *bindings.TaikoDataBlockMetadata, + meta metadata.TaikoBlockMetaData, header *types.Header, + requestAt time.Time, ) (*ProofWithHeader, error) { log.Info( - "Request proof from raiko-host service", + "Request sgx proof from raiko-host service", "blockID", blockID, - "coinbase", meta.Coinbase, - "height", header.Number, + "coinbase", meta.GetCoinbase(), "hash", header.Hash(), + "time", time.Since(requestAt), ) if s.Dummy { - return s.DummyProofProducer.RequestProof(opts, blockID, meta, header, s.Tier()) + return s.DummyProofProducer.RequestProof(opts, blockID, meta, header, s.Tier(), requestAt) } - proof, err := s.callProverDaemon(ctx, opts) + proof, err := s.callProverDaemon(ctx, opts, requestAt) if err != nil { return nil, err } @@ -107,58 +129,282 @@ func (s *SGXProofProducer) RequestProof( }, nil } -// callProverDaemon keeps polling the proverd service to get the requested proof. -func (s *SGXProofProducer) callProverDaemon(ctx context.Context, opts *ProofRequestOptions) ([]byte, error) { +// Aggregate implements the ProofProducer interface to aggregate a batch of proofs. +func (s *SGXProofProducer) Aggregate( + ctx context.Context, + items []*ProofWithHeader, + requestAt time.Time, +) (*BatchProofs, error) { + log.Info( + "Aggregate sgx batch proofs from raiko-host service", + "batchSize", len(items), + "firstID", items[0].BlockID, + "lastID", items[len(items)-1].BlockID, + "time", time.Since(requestAt), + ) + if len(items) == 0 { + return nil, ErrInvalidLength + } + + blockIDs := make([]*big.Int, len(items)) + for i, item := range items { + blockIDs[i] = item.Meta.GetBlockID() + } + batchProof, err := s.requestBatchProof( + ctx, + blockIDs, + items[0].Opts.ProverAddress, + items[0].Opts.Graffiti, + requestAt, + ) + if err != nil { + return nil, err + } + + metrics.ProverSgxProofAggregationGeneratedCounter.Add(1) + + return &BatchProofs{ + Proofs: items, + BatchProof: batchProof, + Tier: s.Tier(), + BlockIDs: blockIDs, + }, nil +} + +// RequestCancel implements the ProofProducer interface to cancel the proof generating progress. +func (s *SGXProofProducer) RequestCancel( + ctx context.Context, + opts *ProofRequestOptions, +) error { + reqBody := RaikoRequestProofBody{ + Type: s.ProofType, + Block: opts.BlockID, + Prover: opts.ProverAddress.Hex()[2:], + Graffiti: opts.Graffiti, + SGX: &SGXRequestProofBodyParam{ + Setup: false, + Bootstrap: false, + Prove: true, + }, + } + + client := &http.Client{} + + jsonValue, err := json.Marshal(reqBody) + if err != nil { + return err + } + + req, err := http.NewRequestWithContext( + ctx, + "POST", + s.RaikoHostEndpoint+"/v2/proof/cancel", + bytes.NewBuffer(jsonValue), + ) + if err != nil { + return err + } + req.Header.Set("Content-Type", "application/json") + if len(s.JWT) > 0 { + req.Header.Set("Authorization", "Bearer "+base64.StdEncoding.EncodeToString([]byte(s.JWT))) + } + + res, err := client.Do(req) + if err != nil { + return err + } + + defer res.Body.Close() + if res.StatusCode != http.StatusOK { + return fmt.Errorf("failed to cancel requesting proof, statusCode: %d", res.StatusCode) + } + + return nil +} + +// requestBatchProof poll the proof aggregation service to get the aggregated proof. +func (s *SGXProofProducer) requestBatchProof( + ctx context.Context, + blockIDs []*big.Int, + proverAddress common.Address, + graffiti string, + requestAt time.Time, +) ([]byte, error) { var ( proof []byte - start = time.Now() ) - if err := backoff.Retry(func() error { - if ctx.Err() != nil { - return nil - } - output, err := s.requestProof(opts) - if err != nil { - log.Error("Failed to request proof", "height", opts.BlockID, "error", err, "endpoint", s.RaikoHostEndpoint) - return err - } - if output == nil { - log.Info( - "Proof generating", - "height", opts.BlockID, - "time", time.Since(start), - "producer", "SGXProofProducer", - ) - return errProofGenerating - } + ctx, cancel := rpc.CtxWithTimeoutOrDefault(ctx, s.RaikoRequestTimeout) + defer cancel() - log.Debug("Proof generation output", "output", output) + blocks := make([][2]*big.Int, len(blockIDs)) + for i := range blockIDs { + blocks[i][0] = blockIDs[i] + } + reqBody := RaikoRequestProofBodyV3{ + Type: s.ProofType, + Blocks: blocks, + Prover: proverAddress.Hex()[2:], + Graffiti: graffiti, + SGX: &SGXRequestProofBodyParam{ + Setup: false, + Bootstrap: false, + Prove: true, + }, + } - // Raiko returns "" as proof when proof type is native, - // so we just convert "" to bytes - if s.ProofType == ProofTypeCPU { - proof = common.Hex2Bytes(output.Data.Proof) - } else { - proof = common.Hex2Bytes(output.Data.Proof[2:]) - } + client := &http.Client{} + jsonValue, err := json.Marshal(reqBody) + if err != nil { + return nil, err + } + + log.Debug( + "Send batch proof generation request", + "blockIDs", blockIDs, + "proofType", "sgx", + "input", string(jsonValue), + ) + + req, err := http.NewRequestWithContext( + ctx, + "POST", + s.RaikoHostEndpoint+"/v3/proof", + bytes.NewBuffer(jsonValue), + ) + if err != nil { + return nil, err + } + req.Header.Set("Content-Type", "application/json") + if len(s.JWT) > 0 { + req.Header.Set("Authorization", "Bearer "+base64.StdEncoding.EncodeToString([]byte(s.JWT))) + } + + res, err := client.Do(req) + if err != nil { + return nil, err + } + + defer res.Body.Close() + if res.StatusCode != http.StatusOK { + return nil, fmt.Errorf("failed to request batch proof, ids: %v, statusCode: %d", blockIDs, res.StatusCode) + } + + resBytes, err := io.ReadAll(res.Body) + if err != nil { + return nil, err + } + + log.Debug( + "Batch proof generation output", + "blockIDs", blockIDs, + "proofType", "sgx", + "output", string(resBytes), + ) + + var output RaikoRequestProofBodyResponseV2 + if err := json.Unmarshal(resBytes, &output); err != nil { + return nil, err + } + + if len(output.ErrorMessage) > 0 || len(output.Error) > 0 { + return nil, fmt.Errorf("failed to get sgx batch proof, err: %s, msg: %s", + output.Error, + output.ErrorMessage, + ) + } + + if output.Data == nil { + return nil, fmt.Errorf("unexpected structure error, response: %s", string(resBytes)) + } + if output.Data.Status == ErrProofInProgress.Error() { + return nil, ErrProofInProgress + } + if output.Data.Status == StatusRegistered { + return nil, ErrRetry + } + + if output.Data.Proof == nil || + len(output.Data.Proof.Proof) == 0 { + return nil, errEmptyProof + } + proof = common.Hex2Bytes(output.Data.Proof.Proof[2:]) + + log.Info( + "Batch proof generated", + "blockIDs", blockIDs, + "time", time.Since(requestAt), + "producer", "SGXProofProducer", + ) + metrics.ProverSGXAggregationGenerationTime.Set(float64(time.Since(requestAt).Seconds())) + + return proof, nil +} + +// callProverDaemon keeps polling the proverd service to get the requested proof. +func (s *SGXProofProducer) callProverDaemon( + ctx context.Context, + opts *ProofRequestOptions, + requestAt time.Time, +) ([]byte, error) { + var ( + proof []byte + ) + + ctx, cancel := rpc.CtxWithTimeoutOrDefault(ctx, s.RaikoRequestTimeout) + defer cancel() + + output, err := s.requestProof(ctx, opts) + if err != nil { + log.Error("Failed to request proof", "blockID", opts.BlockID, "error", err, "endpoint", s.RaikoHostEndpoint) + return nil, err + } + + if output == nil { log.Info( - "Proof generated", - "height", opts.BlockID, - "time", time.Since(start), + "Proof generating", + "blockID", opts.BlockID, + "time", time.Since(requestAt), "producer", "SGXProofProducer", ) - return nil - }, backoff.WithContext(backoff.NewConstantBackOff(proofPollingInterval), ctx)); err != nil { - return nil, err + return nil, errProofGenerating + } + + if output.Data.Status == ErrProofInProgress.Error() { + return nil, ErrProofInProgress + } + if output.Data.Status == StatusRegistered { + return nil, ErrRetry + } + + // Raiko returns "" as proof when proof type is native, + // so we just convert "" to bytes + if s.ProofType == ProofTypeCPU { + proof = common.Hex2Bytes(output.Data.Proof.Proof) + } else { + if len(output.Data.Proof.Proof) == 0 { + return nil, errEmptyProof + } + proof = common.Hex2Bytes(output.Data.Proof.Proof[2:]) } + log.Info( + "Proof generated", + "blockID", opts.BlockID, + "time", time.Since(requestAt), + "producer", "SGXProofProducer", + ) + metrics.ProverSgxProofGenerationTime.Set(float64(time.Since(requestAt).Seconds())) + return proof, nil } // requestProof sends a RPC request to proverd to try to get the requested proof. -func (s *SGXProofProducer) requestProof(opts *ProofRequestOptions) (*RaikoRequestProofBodyResponse, error) { +func (s *SGXProofProducer) requestProof( + ctx context.Context, + opts *ProofRequestOptions, +) (*RaikoRequestProofBodyResponseV2, error) { reqBody := RaikoRequestProofBody{ Type: s.ProofType, Block: opts.BlockID, @@ -178,7 +424,7 @@ func (s *SGXProofProducer) requestProof(opts *ProofRequestOptions) (*RaikoReques return nil, err } - req, err := http.NewRequest("POST", s.RaikoHostEndpoint+"/v1/proof", bytes.NewBuffer(jsonValue)) + req, err := http.NewRequestWithContext(ctx, "POST", s.RaikoHostEndpoint+"/v2/proof", bytes.NewBuffer(jsonValue)) if err != nil { return nil, err } @@ -202,13 +448,20 @@ func (s *SGXProofProducer) requestProof(opts *ProofRequestOptions) (*RaikoReques return nil, err } - var output RaikoRequestProofBodyResponse + log.Debug( + "Proof generation output", + "blockID", opts.BlockID, + "proofType", "sgx", + "output", string(resBytes), + ) + + var output RaikoRequestProofBodyResponseV2 if err := json.Unmarshal(resBytes, &output); err != nil { return nil, err } - if len(output.ErrorMessage) > 0 { - return nil, fmt.Errorf("failed to get proof, msg: %s", output.ErrorMessage) + if len(output.ErrorMessage) > 0 || len(output.Error) > 0 { + return nil, fmt.Errorf("failed to get sgx proof,err: %s, msg: %s", output.Error, output.ErrorMessage) } return &output, nil diff --git a/packages/taiko-client/prover/proof_producer/sgx_producer_test.go b/packages/taiko-client/prover/proof_producer/sgx_producer_test.go index de2f743c03e..19114cb4eec 100644 --- a/packages/taiko-client/prover/proof_producer/sgx_producer_test.go +++ b/packages/taiko-client/prover/proof_producer/sgx_producer_test.go @@ -9,8 +9,8 @@ import ( "github.com/ethereum/go-ethereum/core/types" "github.com/stretchr/testify/require" - "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings" "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/encoding" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/metadata" ) func TestSGXProducerRequestProof(t *testing.T) { @@ -39,8 +39,9 @@ func TestSGXProducerRequestProof(t *testing.T) { context.Background(), &ProofRequestOptions{}, blockID, - &bindings.TaikoDataBlockMetadata{}, + &metadata.TaikoDataBlockMetadataOntake{}, header, + time.Now(), ) require.Nil(t, err) diff --git a/packages/taiko-client/prover/proof_producer/zkvm_producer.go b/packages/taiko-client/prover/proof_producer/zkvm_producer.go new file mode 100644 index 00000000000..76f06d8e2d7 --- /dev/null +++ b/packages/taiko-client/prover/proof_producer/zkvm_producer.go @@ -0,0 +1,539 @@ +package producer + +import ( + "bytes" + "context" + "encoding/base64" + "encoding/json" + "errors" + "fmt" + "io" + "math/big" + "net/http" + "time" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/log" + + "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/encoding" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/metadata" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/internal/metrics" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/rpc" +) + +const ( + ZKProofTypeR0 = "risc0" + ZKProofTypeSP1 = "sp1" + RecursionPlonk = "plonk" + RecursionCompressed = "compressed" +) + +var ( + ErrProofInProgress = errors.New("work_in_progress") + ErrRetry = errors.New("retry") + StatusRegistered = "registered" +) + +// RaikoRequestProofBodyResponseV2 represents the JSON body of the response of the proof requests. +type RaikoRequestProofBodyResponseV2 struct { + Data *RaikoProofDataV2 `json:"data"` + ErrorMessage string `json:"message"` + Error string `json:"error"` +} + +type RaikoProofDataV2 struct { + Proof *ProofDataV2 `json:"proof"` //nolint:revive,stylecheck + Status string `json:"status"` +} + +type ProofDataV2 struct { + KzgProof string `json:"kzg_proof"` + Proof string `json:"proof"` + Quote string `json:"quote"` +} + +// ZKvmProofProducer generates a ZK proof for the given block. +type ZKvmProofProducer struct { + ZKProofType string // ZK Proof type + RaikoHostEndpoint string + RaikoRequestTimeout time.Duration + JWT string // JWT provided by Raiko + Dummy bool + DummyProofProducer +} + +// RequestProof implements the ProofProducer interface. +func (s *ZKvmProofProducer) RequestProof( + ctx context.Context, + opts *ProofRequestOptions, + blockID *big.Int, + meta metadata.TaikoBlockMetaData, + header *types.Header, + requestAt time.Time, +) (*ProofWithHeader, error) { + log.Info( + "Request zk proof from raiko-host service", + "blockID", blockID, + "coinbase", meta.GetCoinbase(), + "hash", header.Hash(), + "zkType", s.ZKProofType, + "time", time.Since(requestAt), + ) + + if s.Dummy { + return s.DummyProofProducer.RequestProof(opts, blockID, meta, header, s.Tier(), requestAt) + } + + proof, err := s.callProverDaemon(ctx, opts, requestAt) + if err != nil { + return nil, err + } + + if s.ZKProofType == ZKProofTypeR0 { + metrics.ProverR0ProofGeneratedCounter.Add(1) + } else if s.ZKProofType == ZKProofTypeSP1 { + metrics.ProverSp1ProofGeneratedCounter.Add(1) + } + + return &ProofWithHeader{ + BlockID: blockID, + Header: header, + Meta: meta, + Proof: proof, + Opts: opts, + Tier: s.Tier(), + }, nil +} + +// RequestCancel implements the ProofProducer interface to cancel the proof generating progress. +func (s *ZKvmProofProducer) RequestCancel( + ctx context.Context, + opts *ProofRequestOptions, +) error { + return s.requestCancel(ctx, opts) +} + +// Aggregate implements the ProofProducer interface to aggregate a batch of proofs. +func (s *ZKvmProofProducer) Aggregate( + ctx context.Context, + items []*ProofWithHeader, + requestAt time.Time, +) (*BatchProofs, error) { + log.Info( + "Aggregate zkvm batch proofs from raiko-host service", + "zkType", s.ZKProofType, + "batchSize", len(items), + "firstID", items[0].BlockID, + "lastID", items[len(items)-1].BlockID, + "time", time.Since(requestAt), + ) + if len(items) == 0 { + return nil, ErrInvalidLength + } + + blockIDs := make([]*big.Int, len(items)) + for i, item := range items { + blockIDs[i] = item.Meta.GetBlockID() + } + batchProof, err := s.requestBatchProof( + ctx, + blockIDs, + items[0].Opts.ProverAddress, + items[0].Opts.Graffiti, + requestAt, + ) + if err != nil { + return nil, err + } + + switch s.ZKProofType { + case ZKProofTypeSP1: + metrics.ProverSp1ProofAggregationGeneratedCounter.Add(1) + default: + metrics.ProverR0ProofAggregationGeneratedCounter.Add(1) + } + + return &BatchProofs{ + Proofs: items, + BatchProof: batchProof, + Tier: s.Tier(), + BlockIDs: blockIDs, + }, nil +} + +// callProverDaemon keeps polling the proverd service to get the requested proof. +func (s *ZKvmProofProducer) callProverDaemon( + ctx context.Context, + opts *ProofRequestOptions, + requestAt time.Time, +) ([]byte, error) { + var ( + proof []byte + ) + + zkCtx, zkCancel := rpc.CtxWithTimeoutOrDefault(ctx, s.RaikoRequestTimeout) + defer zkCancel() + + output, err := s.requestProof(zkCtx, opts) + if err != nil { + log.Error("Failed to request proof", "blockID", opts.BlockID, "error", err, "endpoint", s.RaikoHostEndpoint) + return nil, err + } + + if output.Data.Status == ErrProofInProgress.Error() { + return nil, ErrProofInProgress + } + if output.Data.Status == StatusRegistered { + return nil, ErrRetry + } + + if !opts.Compressed { + if len(output.Data.Proof.Proof) == 0 { + return nil, errEmptyProof + } + proof = common.Hex2Bytes(output.Data.Proof.Proof[2:]) + } + log.Info( + "Proof generated", + "blockID", opts.BlockID, + "time", time.Since(requestAt), + "producer", "ZKvmProofProducer", + ) + if s.ZKProofType == ZKProofTypeR0 { + metrics.ProverR0ProofGenerationTime.Set(float64(time.Since(requestAt).Seconds())) + } else if s.ZKProofType == ZKProofTypeSP1 { + metrics.ProverSP1ProofGenerationTime.Set(float64(time.Since(requestAt).Seconds())) + } + + return proof, nil +} + +// requestProof sends a RPC request to proverd to try to get the requested proof. +func (s *ZKvmProofProducer) requestProof( + ctx context.Context, + opts *ProofRequestOptions, +) (*RaikoRequestProofBodyResponseV2, error) { + var ( + reqBody RaikoRequestProofBody + recursion string + ) + if opts.Compressed { + recursion = RecursionCompressed + } else { + recursion = RecursionPlonk + } + switch s.ZKProofType { + case ZKProofTypeSP1: + reqBody = RaikoRequestProofBody{ + Type: s.ZKProofType, + Block: opts.BlockID, + Prover: opts.ProverAddress.Hex()[2:], + Graffiti: opts.Graffiti, + SP1: &SP1RequestProofBodyParam{ + Recursion: recursion, + Prover: "network", + Verify: true, + }, + } + default: + reqBody = RaikoRequestProofBody{ + Type: s.ZKProofType, + Block: opts.BlockID, + Prover: opts.ProverAddress.Hex()[2:], + Graffiti: opts.Graffiti, + RISC0: &RISC0RequestProofBodyParam{ + Bonsai: true, + Snark: true, + Profile: false, + ExecutionPo2: big.NewInt(20), + }, + } + } + + client := &http.Client{} + + jsonValue, err := json.Marshal(reqBody) + if err != nil { + return nil, err + } + + req, err := http.NewRequestWithContext(ctx, "POST", s.RaikoHostEndpoint+"/v2/proof", bytes.NewBuffer(jsonValue)) + if err != nil { + return nil, err + } + req.Header.Set("Content-Type", "application/json") + if len(s.JWT) > 0 { + req.Header.Set("Authorization", "Bearer "+base64.StdEncoding.EncodeToString([]byte(s.JWT))) + } + + log.Debug( + "Send proof generation request", + "blockID", opts.BlockID, + "zkProofType", s.ZKProofType, + "input", string(jsonValue), + ) + + res, err := client.Do(req) + if err != nil { + return nil, err + } + + defer res.Body.Close() + if res.StatusCode != http.StatusOK { + return nil, fmt.Errorf("failed to request proof, id: %d, statusCode: %d", opts.BlockID, res.StatusCode) + } + + resBytes, err := io.ReadAll(res.Body) + if err != nil { + return nil, err + } + + log.Debug( + "Proof generation output", + "blockID", opts.BlockID, + "zkType", s.ZKProofType, + "output", string(resBytes), + ) + var output RaikoRequestProofBodyResponseV2 + if err := json.Unmarshal(resBytes, &output); err != nil { + return nil, err + } + + if len(output.ErrorMessage) > 0 || len(output.Error) > 0 { + return nil, fmt.Errorf("failed to get zk proof, err: %s, msg: %s, zkType: %s", + output.Error, + output.ErrorMessage, + s.ZKProofType, + ) + } + + return &output, nil +} + +func (s *ZKvmProofProducer) requestCancel( + ctx context.Context, + opts *ProofRequestOptions, +) error { + var ( + reqBody RaikoRequestProofBody + recursion string + ) + if opts.Compressed { + recursion = RecursionCompressed + } else { + recursion = RecursionPlonk + } + switch s.ZKProofType { + case ZKProofTypeSP1: + reqBody = RaikoRequestProofBody{ + Type: s.ZKProofType, + Block: opts.BlockID, + Prover: opts.ProverAddress.Hex()[2:], + Graffiti: opts.Graffiti, + SP1: &SP1RequestProofBodyParam{ + Recursion: recursion, + Prover: "network", + Verify: true, + }, + } + default: + reqBody = RaikoRequestProofBody{ + Type: s.ZKProofType, + Block: opts.BlockID, + Prover: opts.ProverAddress.Hex()[2:], + Graffiti: opts.Graffiti, + RISC0: &RISC0RequestProofBodyParam{ + Bonsai: true, + Snark: true, + Profile: false, + ExecutionPo2: big.NewInt(20), + }, + } + } + + client := &http.Client{} + + jsonValue, err := json.Marshal(reqBody) + if err != nil { + return err + } + + req, err := http.NewRequestWithContext( + ctx, + "POST", + s.RaikoHostEndpoint+"/v2/proof/cancel", + bytes.NewBuffer(jsonValue), + ) + if err != nil { + return err + } + req.Header.Set("Content-Type", "application/json") + if len(s.JWT) > 0 { + req.Header.Set("Authorization", "Bearer "+base64.StdEncoding.EncodeToString([]byte(s.JWT))) + } + + res, err := client.Do(req) + if err != nil { + return err + } + + defer res.Body.Close() + if res.StatusCode != http.StatusOK { + return fmt.Errorf("failed to cancel requesting proof, statusCode: %d", res.StatusCode) + } + + return nil +} + +// requestBatchProof poll the proof aggregation service to get the aggregated proof. +func (s *ZKvmProofProducer) requestBatchProof( + ctx context.Context, + blockIDs []*big.Int, + proverAddress common.Address, + graffiti string, + requestAt time.Time, +) ([]byte, error) { + var ( + proof []byte + ) + + ctx, cancel := rpc.CtxWithTimeoutOrDefault(ctx, s.RaikoRequestTimeout) + defer cancel() + + blocks := make([][2]*big.Int, len(blockIDs)) + for i := range blockIDs { + blocks[i][0] = blockIDs[i] + } + var reqBody RaikoRequestProofBodyV3 + switch s.ZKProofType { + case ZKProofTypeSP1: + reqBody = RaikoRequestProofBodyV3{ + Type: s.ZKProofType, + Blocks: blocks, + Prover: proverAddress.Hex()[2:], + Graffiti: graffiti, + SP1: &SP1RequestProofBodyParam{ + Recursion: RecursionCompressed, + Prover: "network", + Verify: true, + }, + } + default: + reqBody = RaikoRequestProofBodyV3{ + Type: s.ZKProofType, + Blocks: blocks, + Prover: proverAddress.Hex()[2:], + Graffiti: graffiti, + RISC0: &RISC0RequestProofBodyParam{ + Bonsai: true, + Snark: true, + Profile: false, + ExecutionPo2: big.NewInt(20), + }, + } + } + + client := &http.Client{} + + jsonValue, err := json.Marshal(reqBody) + if err != nil { + return nil, err + } + + log.Debug( + "Send batch proof generation request", + "blockIDs", blockIDs, + "zkProofType", s.ZKProofType, + "input", string(jsonValue), + ) + + req, err := http.NewRequestWithContext( + ctx, + "POST", + s.RaikoHostEndpoint+"/v3/proof", + bytes.NewBuffer(jsonValue), + ) + if err != nil { + return nil, err + } + req.Header.Set("Content-Type", "application/json") + if len(s.JWT) > 0 { + req.Header.Set("Authorization", "Bearer "+base64.StdEncoding.EncodeToString([]byte(s.JWT))) + } + + res, err := client.Do(req) + if err != nil { + return nil, err + } + + defer res.Body.Close() + if res.StatusCode != http.StatusOK { + return nil, fmt.Errorf("failed to request batch proof, ids: %v, statusCode: %d", blockIDs, res.StatusCode) + } + + resBytes, err := io.ReadAll(res.Body) + if err != nil { + return nil, err + } + + log.Debug( + "Batch proof generation output", + "blockIDs", blockIDs, + "zkProofType", s.ZKProofType, + "output", string(resBytes), + ) + + var output RaikoRequestProofBodyResponseV2 + if err := json.Unmarshal(resBytes, &output); err != nil { + return nil, err + } + + if len(output.ErrorMessage) > 0 || len(output.Error) > 0 { + return nil, fmt.Errorf("failed to get zk batch proof, err: %s, msg: %s, zkType: %s", + output.Error, + output.ErrorMessage, + s.ZKProofType, + ) + } + if output.Data == nil { + return nil, fmt.Errorf("unexpected structure error, response: %s", string(resBytes)) + } + + if output.Data.Status == ErrProofInProgress.Error() { + return nil, ErrProofInProgress + } + if output.Data.Status == StatusRegistered { + return nil, ErrRetry + } + + if output.Data.Proof == nil || len(output.Data.Proof.Proof) == 0 { + return nil, errEmptyProof + } + proof = common.Hex2Bytes(output.Data.Proof.Proof[2:]) + + log.Info( + "Batch proof generated", + "blockIDs", blockIDs, + "time", time.Since(requestAt), + "producer", "ZKvmProofProducer", + ) + + if s.ZKProofType == ZKProofTypeR0 { + metrics.ProverR0AggregationGenerationTime.Set(float64(time.Since(requestAt).Seconds())) + } else if s.ZKProofType == ZKProofTypeSP1 { + metrics.ProverSP1AggregationGenerationTime.Set(float64(time.Since(requestAt).Seconds())) + } + + return proof, nil +} + +// Tier implements the ProofProducer interface. +func (s *ZKvmProofProducer) Tier() uint16 { + switch s.ZKProofType { + case ZKProofTypeSP1: + return encoding.TierZkVMSp1ID + default: + return encoding.TierZkVMRisc0ID + } +} diff --git a/packages/taiko-client/prover/proof_submitter/interface.go b/packages/taiko-client/prover/proof_submitter/interface.go index 439c23be698..b60ec9c3919 100644 --- a/packages/taiko-client/prover/proof_submitter/interface.go +++ b/packages/taiko-client/prover/proof_submitter/interface.go @@ -6,16 +6,20 @@ import ( "github.com/ethereum/go-ethereum/common" - "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/metadata" proofProducer "github.com/taikoxyz/taiko-mono/packages/taiko-client/prover/proof_producer" ) // Submitter is the interface for submitting proofs of the L2 blocks. type Submitter interface { - RequestProof(ctx context.Context, event *bindings.TaikoL1ClientBlockProposed) error + RequestProof(ctx context.Context, meta metadata.TaikoBlockMetaData) error SubmitProof(ctx context.Context, proofWithHeader *proofProducer.ProofWithHeader) error + BatchSubmitProofs(ctx context.Context, proofsWithHeaders *proofProducer.BatchProofs) error + AggregateProofs(ctx context.Context) error Producer() proofProducer.ProofProducer Tier() uint16 + BufferSize() uint64 + AggregationEnabled() bool } // Contester is the interface for contesting proofs of the L2 blocks. @@ -25,7 +29,7 @@ type Contester interface { blockID *big.Int, proposedIn *big.Int, parentHash common.Hash, - meta *bindings.TaikoDataBlockMetadata, + meta metadata.TaikoBlockMetaData, tier uint16, ) error } diff --git a/packages/taiko-client/prover/proof_submitter/proof_buffer.go b/packages/taiko-client/prover/proof_submitter/proof_buffer.go new file mode 100644 index 00000000000..8f2d6d0cb72 --- /dev/null +++ b/packages/taiko-client/prover/proof_submitter/proof_buffer.go @@ -0,0 +1,122 @@ +package submitter + +import ( + "errors" + "sync" + "time" + + producer "github.com/taikoxyz/taiko-mono/packages/taiko-client/prover/proof_producer" +) + +var ( + errBufferOverflow = errors.New("proof buffer overflow") + errNotEnoughProof = errors.New("not enough proof") +) + +// ProofBuffer caches all single proof with a fixed size. +type ProofBuffer struct { + MaxLength uint64 + buffer []*producer.ProofWithHeader + lastUpdatedAt time.Time + isAggregating bool + mutex sync.RWMutex +} + +// NewProofBuffer creates a new ProofBuffer instance. +func NewProofBuffer(maxLength uint64) *ProofBuffer { + return &ProofBuffer{ + buffer: make([]*producer.ProofWithHeader, 0, maxLength), + lastUpdatedAt: time.Now(), + MaxLength: maxLength, + } +} + +// Write adds new item to the buffer. +func (pb *ProofBuffer) Write(item *producer.ProofWithHeader) (int, error) { + pb.mutex.Lock() + defer pb.mutex.Unlock() + + if len(pb.buffer)+1 > int(pb.MaxLength) { + return len(pb.buffer), errBufferOverflow + } + + pb.buffer = append(pb.buffer, item) + pb.lastUpdatedAt = time.Now() + return len(pb.buffer), nil +} + +// Read returns the content with given length in the buffer. +func (pb *ProofBuffer) Read(length int) ([]*producer.ProofWithHeader, error) { + pb.mutex.RLock() + defer pb.mutex.RUnlock() + if length > len(pb.buffer) { + return nil, errNotEnoughProof + } + + data := make([]*producer.ProofWithHeader, length) + copy(data, pb.buffer[:length]) + return data, nil +} + +// ReadAll returns all the content in the buffer. +func (pb *ProofBuffer) ReadAll() ([]*producer.ProofWithHeader, error) { + return pb.Read(pb.Len()) +} + +// Len returns current length of the buffer. +func (pb *ProofBuffer) Len() int { + pb.mutex.RLock() + defer pb.mutex.RUnlock() + return len(pb.buffer) +} + +// LastUpdatedAt returns the last updated time of the buffer. +func (pb *ProofBuffer) LastUpdatedAt() time.Time { + return pb.lastUpdatedAt +} + +// LastUpdatedAt returns the last updated time of the buffer. +func (pb *ProofBuffer) UpdateLastUpdatedAt() { + pb.lastUpdatedAt = time.Now() +} + +// ClearItems clears items that has given block ids in the buffer. +func (pb *ProofBuffer) ClearItems(blockIDs ...uint64) int { + pb.mutex.Lock() + defer pb.mutex.Unlock() + + clearMap := make(map[uint64]bool) + for _, blockID := range blockIDs { + clearMap[blockID] = true + } + + newBuffer := make([]*producer.ProofWithHeader, 0, len(pb.buffer)) + clearedCount := 0 + + for _, b := range pb.buffer { + if !clearMap[b.Meta.GetBlockID().Uint64()] { + newBuffer = append(newBuffer, b) + } else { + clearedCount++ + } + } + + pb.buffer = newBuffer + pb.isAggregating = false + return clearedCount +} + +// MarkAggregating marks the proofs in this buffer are aggregating. +func (pb *ProofBuffer) MarkAggregating() { + pb.isAggregating = true +} + +// IsAggregating returns if the proofs in this buffer are aggregating. +func (pb *ProofBuffer) IsAggregating() bool { + return pb.isAggregating +} + +// Enabled returns if the buffer is enabled. +func (pb *ProofBuffer) Enabled() bool { + return pb.MaxLength > 1 +} diff --git a/packages/taiko-client/prover/proof_submitter/proof_contester.go b/packages/taiko-client/prover/proof_submitter/proof_contester.go index d9357b8b118..a68b57b1056 100644 --- a/packages/taiko-client/prover/proof_submitter/proof_contester.go +++ b/packages/taiko-client/prover/proof_submitter/proof_contester.go @@ -12,6 +12,7 @@ import ( "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings" "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/encoding" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/metadata" "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/rpc" proofProducer "github.com/taikoxyz/taiko-mono/packages/taiko-client/prover/proof_producer" "github.com/taikoxyz/taiko-mono/packages/taiko-client/prover/proof_submitter/transaction" @@ -32,6 +33,7 @@ func NewProofContester( rpcClient *rpc.Client, gasLimit uint64, txmgr *txmgr.SimpleTxManager, + privateTxmgr *txmgr.SimpleTxManager, proverSetAddress common.Address, graffiti string, builder *transaction.ProveBlockTxBuilder, @@ -39,7 +41,7 @@ func NewProofContester( return &ProofContester{ rpc: rpcClient, txBuilder: builder, - sender: transaction.NewSender(rpcClient, txmgr, proverSetAddress, gasLimit), + sender: transaction.NewSender(rpcClient, txmgr, privateTxmgr, proverSetAddress, gasLimit), graffiti: rpc.StringToBytes32(graffiti), } } @@ -50,7 +52,7 @@ func (c *ProofContester) SubmitContest( blockID *big.Int, proposedIn *big.Int, parentHash common.Hash, - meta *bindings.TaikoDataBlockMetadata, + meta metadata.TaikoBlockMetaData, tier uint16, ) error { // Ensure the transition has not been contested yet. @@ -92,7 +94,6 @@ func (c *ProofContester) SubmitContest( if err != nil { return err } - return c.sender.Send( ctx, &proofProducer.ProofWithHeader{ diff --git a/packages/taiko-client/prover/proof_submitter/proof_contester_test.go b/packages/taiko-client/prover/proof_submitter/proof_contester_test.go index 79ba21f3f6c..6c836a2b5f3 100644 --- a/packages/taiko-client/prover/proof_submitter/proof_contester_test.go +++ b/packages/taiko-client/prover/proof_submitter/proof_contester_test.go @@ -5,8 +5,8 @@ import ( "github.com/ethereum/go-ethereum/common" - "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings" "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/encoding" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/metadata" "github.com/taikoxyz/taiko-mono/packages/taiko-client/internal/testutils" ) @@ -17,7 +17,7 @@ func (s *ProofSubmitterTestSuite) TestSubmitContestNoTransition() { common.Big256, common.Big1, testutils.RandomHash(), - &bindings.TaikoDataBlockMetadata{}, + &metadata.TaikoDataBlockMetadataOntake{}, encoding.TierOptimisticID, ), ) diff --git a/packages/taiko-client/prover/proof_submitter/proof_submitter.go b/packages/taiko-client/prover/proof_submitter/proof_submitter.go index 25dd644ab41..698d1d7b026 100644 --- a/packages/taiko-client/prover/proof_submitter/proof_submitter.go +++ b/packages/taiko-client/prover/proof_submitter/proof_submitter.go @@ -8,12 +8,15 @@ import ( "math/big" "time" + "github.com/cenkalti/backoff/v4" "github.com/ethereum-optimism/optimism/op-service/txmgr" + "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/taikoxyz/taiko-mono/packages/taiko-client/bindings" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/metadata" "github.com/taikoxyz/taiko-mono/packages/taiko-client/internal/metrics" "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/rpc" validator "github.com/taikoxyz/taiko-mono/packages/taiko-client/prover/anchor_tx_validator" @@ -25,25 +28,33 @@ import ( var ( _ Submitter = (*ProofSubmitter)(nil) submissionDelayRandomBumpRange float64 = 20 + proofPollingInterval = 10 * time.Second + ProofTimeout = 3 * time.Hour + ErrInvalidProof = errors.New("invalid proof found") ) // ProofSubmitter is responsible requesting proofs for the given L2 // blocks, and submitting the generated proofs to the TaikoL1 smart contract. type ProofSubmitter struct { - rpc *rpc.Client - proofProducer proofProducer.ProofProducer - resultCh chan *proofProducer.ProofWithHeader - anchorValidator *validator.AnchorTxValidator - txBuilder *transaction.ProveBlockTxBuilder - sender *transaction.Sender - proverAddress common.Address - proverSetAddress common.Address - taikoL2Address common.Address - graffiti [32]byte - tiers []*rpc.TierProviderTierWithID + rpc *rpc.Client + proofProducer proofProducer.ProofProducer + resultCh chan *proofProducer.ProofWithHeader + batchResultCh chan *proofProducer.BatchProofs + aggregationNotify chan uint16 + anchorValidator *validator.AnchorTxValidator + txBuilder *transaction.ProveBlockTxBuilder + sender *transaction.Sender + proverAddress common.Address + proverSetAddress common.Address + taikoL2Address common.Address + graffiti [32]byte + tiers []*rpc.TierProviderTierWithID // Guardian prover related. isGuardian bool submissionDelay time.Duration + // Batch proof related + proofBuffer *ProofBuffer + forceBatchProvingInterval time.Duration } // NewProofSubmitter creates a new ProofSubmitter instance. @@ -51,15 +62,20 @@ func NewProofSubmitter( rpcClient *rpc.Client, proofProducer proofProducer.ProofProducer, resultCh chan *proofProducer.ProofWithHeader, + batchResultCh chan *proofProducer.BatchProofs, + aggregationNotify chan uint16, proverSetAddress common.Address, taikoL2Address common.Address, graffiti string, gasLimit uint64, txmgr *txmgr.SimpleTxManager, + privateTxmgr *txmgr.SimpleTxManager, builder *transaction.ProveBlockTxBuilder, tiers []*rpc.TierProviderTierWithID, isGuardian bool, submissionDelay time.Duration, + proofBufferSize uint64, + forceBatchProvingInterval time.Duration, ) (*ProofSubmitter, error) { anchorValidator, err := validator.New(taikoL2Address, rpcClient.L2.ChainID, rpcClient) if err != nil { @@ -67,27 +83,35 @@ func NewProofSubmitter( } return &ProofSubmitter{ - rpc: rpcClient, - proofProducer: proofProducer, - resultCh: resultCh, - anchorValidator: anchorValidator, - txBuilder: builder, - sender: transaction.NewSender(rpcClient, txmgr, proverSetAddress, gasLimit), - proverAddress: txmgr.From(), - proverSetAddress: proverSetAddress, - taikoL2Address: taikoL2Address, - graffiti: rpc.StringToBytes32(graffiti), - tiers: tiers, - isGuardian: isGuardian, - submissionDelay: submissionDelay, + rpc: rpcClient, + proofProducer: proofProducer, + resultCh: resultCh, + batchResultCh: batchResultCh, + aggregationNotify: aggregationNotify, + anchorValidator: anchorValidator, + txBuilder: builder, + sender: transaction.NewSender(rpcClient, txmgr, privateTxmgr, proverSetAddress, gasLimit), + proverAddress: txmgr.From(), + proverSetAddress: proverSetAddress, + taikoL2Address: taikoL2Address, + graffiti: rpc.StringToBytes32(graffiti), + tiers: tiers, + isGuardian: isGuardian, + submissionDelay: submissionDelay, + proofBuffer: NewProofBuffer(proofBufferSize), + forceBatchProvingInterval: forceBatchProvingInterval, }, nil } // RequestProof implements the Submitter interface. -func (s *ProofSubmitter) RequestProof(ctx context.Context, event *bindings.TaikoL1ClientBlockProposed) error { - header, err := s.rpc.WaitL2Header(ctx, event.BlockId) +func (s *ProofSubmitter) RequestProof(ctx context.Context, meta metadata.TaikoBlockMetaData) error { + var ( + blockInfo bindings.TaikoDataBlockV2 + ) + + header, err := s.rpc.WaitL2Header(ctx, meta.GetBlockID()) if err != nil { - return fmt.Errorf("failed to fetch l2 Header, blockID: %d, error: %w", event.BlockId, err) + return fmt.Errorf("failed to fetch l2 Header, blockID: %d, error: %w", meta.GetBlockID(), err) } if header.TxHash == types.EmptyTxsHash { @@ -99,8 +123,7 @@ func (s *ProofSubmitter) RequestProof(ctx context.Context, event *bindings.Taiko return fmt.Errorf("failed to get the L2 parent block by hash (%s): %w", header.ParentHash, err) } - blockInfo, err := s.rpc.GetL2BlockInfo(ctx, event.BlockId) - if err != nil { + if blockInfo, err = s.rpc.GetL2BlockInfoV2(ctx, meta.GetBlockID()); err != nil { return err } @@ -108,37 +131,112 @@ func (s *ProofSubmitter) RequestProof(ctx context.Context, event *bindings.Taiko opts := &proofProducer.ProofRequestOptions{ BlockID: header.Number, ProverAddress: s.proverAddress, - ProposeBlockTxHash: event.Raw.TxHash, + ProposeBlockTxHash: meta.GetTxHash(), TaikoL2: s.taikoL2Address, MetaHash: blockInfo.MetaHash, BlockHash: header.Hash(), ParentHash: header.ParentHash, StateRoot: header.Root, - EventL1Hash: event.Raw.BlockHash, + EventL1Hash: meta.GetRawBlockHash(), Graffiti: common.Bytes2Hex(s.graffiti[:]), GasUsed: header.GasUsed, ParentGasUsed: parent.GasUsed(), + Compressed: s.proofBuffer.Enabled(), } // If the prover set address is provided, we use that address as the prover on chain. if s.proverSetAddress != rpc.ZeroAddress { opts.ProverAddress = s.proverSetAddress } + startTime := time.Now() // Send the generated proof. - result, err := s.proofProducer.RequestProof( - ctx, - opts, - event.BlockId, - &event.Meta, - header, - ) - if err != nil { - return fmt.Errorf("failed to request proof (id: %d): %w", event.BlockId, err) + if err := backoff.Retry( + func() error { + if ctx.Err() != nil { + log.Error("Failed to request proof, context is canceled", "blockID", opts.BlockID, "error", ctx.Err()) + return nil + } + // Check if the proof buffer is full. + if s.proofBuffer.Enabled() && uint64(s.proofBuffer.Len()) >= s.proofBuffer.MaxLength { + log.Warn( + "Proof buffer is full now", + "blockID", meta.GetBlockID(), + "tier", meta.GetMinTier(), + "size", s.proofBuffer.Len(), + ) + return errBufferOverflow + } + // Check if there is a need to generate proof + proofStatus, err := rpc.GetBlockProofStatus( + ctx, + s.rpc, + opts.BlockID, + opts.ProverAddress, + s.proverSetAddress, + ) + if err != nil { + return err + } + if proofStatus.IsSubmitted && !proofStatus.Invalid { + return nil + } + + result, err := s.proofProducer.RequestProof( + ctx, + opts, + meta.GetBlockID(), + meta, + header, + startTime, + ) + if err != nil { + // If request proof has timed out in retry, let's cancel the proof generating and skip + if errors.Is(err, proofProducer.ErrProofInProgress) && time.Since(startTime) >= ProofTimeout { + log.Error("Request proof has timed out, start to cancel", "blockID", opts.BlockID) + if cancelErr := s.proofProducer.RequestCancel(ctx, opts); cancelErr != nil { + log.Error("Failed to request cancellation of proof", "err", cancelErr) + } + return nil + } + return fmt.Errorf("failed to request proof (id: %d): %w", meta.GetBlockID(), err) + } + if s.proofBuffer.Enabled() { + bufferSize, err := s.proofBuffer.Write(result) + if err != nil { + return fmt.Errorf( + "failed to add proof into buffer (id: %d) (current buffer size: %d): %w", + meta.GetBlockID(), + bufferSize, + err, + ) + } + log.Info( + "Proof generated", + "blockID", meta.GetBlockID(), + "bufferSize", bufferSize, + "maxBufferSize", s.proofBuffer.MaxLength, + "bufferIsAggregating", s.proofBuffer.IsAggregating(), + "bufferLastUpdatedAt", s.proofBuffer.lastUpdatedAt, + ) + // Check if we need to aggregate proofs. + if !s.proofBuffer.IsAggregating() && + (uint64(bufferSize) >= s.proofBuffer.MaxLength || + time.Since(s.proofBuffer.lastUpdatedAt) > s.forceBatchProvingInterval) { + s.aggregationNotify <- s.Tier() + s.proofBuffer.MarkAggregating() + } + } else { + s.resultCh <- result + } + metrics.ProverQueuedProofCounter.Add(1) + return nil + }, + backoff.WithContext(backoff.NewConstantBackOff(proofPollingInterval), ctx), + ); err != nil { + log.Error("Request proof error", "error", err) + return err } - s.resultCh <- result - - metrics.ProverQueuedProofCounter.Add(1) return nil } @@ -151,7 +249,7 @@ func (s *ProofSubmitter) SubmitProof( log.Info( "Submit block proof", "blockID", proofWithHeader.BlockID, - "coinbase", proofWithHeader.Meta.Coinbase, + "coinbase", proofWithHeader.Meta.GetCoinbase(), "parentHash", proofWithHeader.Header.ParentHash, "hash", proofWithHeader.Opts.BlockHash, "stateRoot", proofWithHeader.Opts.StateRoot, @@ -178,9 +276,10 @@ func (s *ProofSubmitter) SubmitProof( if err != nil { return err } - delayTimer := time.After(submissionDelay) - <-delayTimer - // Check again. + // Wait for the submission delay. + <-time.After(submissionDelay) + + // Check the proof submission status again. proofStatus, err := rpc.GetBlockProofStatus( ctx, s.rpc, @@ -247,6 +346,165 @@ func (s *ProofSubmitter) SubmitProof( return nil } +// BatchSubmitProofs implements the Submitter interface to submit proof aggregation. +func (s *ProofSubmitter) BatchSubmitProofs(ctx context.Context, batchProof *proofProducer.BatchProofs) error { + log.Info( + "Batch submit block proofs", + "proof", common.Bytes2Hex(batchProof.BatchProof), + "size", len(batchProof.Proofs), + "firstID", batchProof.BlockIDs[0], + "lastID", batchProof.BlockIDs[len(batchProof.BlockIDs)-1], + "tier", batchProof.Tier, + ) + var ( + invalidBlockIDs []uint64 + latestProvenBlockID = common.Big0 + uint64BlockIDs []uint64 + ) + if len(batchProof.Proofs) == 0 { + return proofProducer.ErrInvalidLength + } + // Check if the proof has already been submitted. + proofStatus, err := rpc.BatchGetBlocksProofStatus( + ctx, + s.rpc, + batchProof.BlockIDs, + batchProof.Proofs[0].Opts.ProverAddress, + s.proverSetAddress, + ) + if err != nil { + return err + } + stateVars, err := s.rpc.GetProtocolStateVariables(&bind.CallOpts{Context: ctx}) + if err != nil { + log.Warn( + "Failed to fetch state variables", + "error", err, + ) + return err + } + for i, proof := range batchProof.Proofs { + uint64BlockIDs = append(uint64BlockIDs, proof.BlockID.Uint64()) + // Check if this proof is still needed to be submitted. + ok, err := s.sender.ValidateProof(ctx, proof, new(big.Int).SetUint64(stateVars.B.LastVerifiedBlockId)) + if err != nil { + return err + } + if !ok { + log.Error("A valid proof for block is already submitted", "blockId", proof.BlockID) + invalidBlockIDs = append(invalidBlockIDs, proof.BlockID.Uint64()) + continue + } + + if proofStatus[i].IsSubmitted && !proofStatus[i].Invalid { + log.Error("A valid proof for block is already submitted", "blockId", proof.BlockID) + invalidBlockIDs = append(invalidBlockIDs, proof.BlockID.Uint64()) + continue + } + + // Get the corresponding L2 block. + block, err := s.rpc.L2.BlockByHash(ctx, proof.Header.Hash()) + if err != nil { + log.Error( + "Failed to get L2 block with given hash", + "hash", proof.Header.Hash(), + "error", err, + ) + invalidBlockIDs = append(invalidBlockIDs, proof.BlockID.Uint64()) + continue + } + + if block.Transactions().Len() == 0 { + log.Error("Invalid block without anchor transaction, blockID", "blockId", proof.BlockID) + invalidBlockIDs = append(invalidBlockIDs, proof.BlockID.Uint64()) + continue + } + + // Validate TaikoL2.anchor transaction inside the L2 block. + anchorTx := block.Transactions()[0] + if err = s.anchorValidator.ValidateAnchorTx(anchorTx); err != nil { + log.Error("Invalid anchor transaction", "error", err) + invalidBlockIDs = append(invalidBlockIDs, proof.BlockID.Uint64()) + } + if proof.BlockID.Cmp(latestProvenBlockID) > 0 { + latestProvenBlockID = proof.BlockID + } + } + + if len(invalidBlockIDs) > 0 { + log.Warn("Invalid proofs in batch", "blockIds", invalidBlockIDs) + s.proofBuffer.ClearItems(invalidBlockIDs...) + return ErrInvalidProof + } + + // Build the TaikoL1.proveBlocks transaction and send it to the L1 node. + if err := s.sender.SendBatchProof( + ctx, + s.txBuilder.BuildProveBlocks(batchProof, s.graffiti), + batchProof, + ); err != nil { + if err.Error() == transaction.ErrUnretryableSubmission.Error() { + return nil + } + metrics.ProverAggregationSubmissionErrorCounter.Add(1) + return err + } + + metrics.ProverSentProofCounter.Add(float64(len(batchProof.BlockIDs))) + metrics.ProverLatestProvenBlockIDGauge.Set(float64(latestProvenBlockID.Uint64())) + s.proofBuffer.ClearItems(uint64BlockIDs...) + // Each time we submit a batch proof, we should update the LastUpdatedAt() of the buffer. + s.proofBuffer.UpdateLastUpdatedAt() + + return nil +} + +// AggregateProofs read all data from buffer and aggregate them. +func (s *ProofSubmitter) AggregateProofs(ctx context.Context) error { + startTime := time.Now() + if err := backoff.Retry( + func() error { + buffer, err := s.proofBuffer.ReadAll() + if err != nil { + return fmt.Errorf("failed to read proof from buffer: %w", err) + } + if len(buffer) == 0 { + log.Debug("Buffer is empty now, skip aggregating") + return nil + } + + result, err := s.proofProducer.Aggregate( + ctx, + buffer, + startTime, + ) + if err != nil { + if errors.Is(err, proofProducer.ErrProofInProgress) || + errors.Is(err, proofProducer.ErrRetry) { + log.Info( + "Aggregating proofs", + "status", err, + "batchSize", len(buffer), + "firstID", buffer[0].BlockID, + "lastID", buffer[len(buffer)-1].BlockID, + "tier", s.Tier(), + ) + } else { + log.Error("Failed to request proof aggregation", "err", err) + } + return err + } + s.batchResultCh <- result + return nil + }, + backoff.WithContext(backoff.NewConstantBackOff(proofPollingInterval), ctx), + ); err != nil { + log.Error("Aggregate proof error", "error", err) + return err + } + return nil +} + // getRandomBumpedSubmissionDelay returns a random bumped submission delay. func (s *ProofSubmitter) getRandomBumpedSubmissionDelay(expiredAt time.Time) (time.Duration, error) { if s.submissionDelay == 0 { @@ -279,3 +537,13 @@ func (s *ProofSubmitter) Producer() proofProducer.ProofProducer { func (s *ProofSubmitter) Tier() uint16 { return s.proofProducer.Tier() } + +// BufferSize returns the size of the proof buffer. +func (s *ProofSubmitter) BufferSize() uint64 { + return s.proofBuffer.MaxLength +} + +// AggregationEnabled returns whether the proof submitter's aggregation feature is enabled. +func (s *ProofSubmitter) AggregationEnabled() bool { + return s.proofBuffer.Enabled() +} diff --git a/packages/taiko-client/prover/proof_submitter/proof_submitter_test.go b/packages/taiko-client/prover/proof_submitter/proof_submitter_test.go index c101e0fe5b2..bbf390dc088 100644 --- a/packages/taiko-client/prover/proof_submitter/proof_submitter_test.go +++ b/packages/taiko-client/prover/proof_submitter/proof_submitter_test.go @@ -17,10 +17,12 @@ import ( "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings" "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/encoding" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/metadata" "github.com/taikoxyz/taiko-mono/packages/taiko-client/driver/chain_syncer/beaconsync" "github.com/taikoxyz/taiko-mono/packages/taiko-client/driver/chain_syncer/blob" "github.com/taikoxyz/taiko-mono/packages/taiko-client/driver/state" "github.com/taikoxyz/taiko-mono/packages/taiko-client/internal/testutils" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/jwt" "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/rpc" "github.com/taikoxyz/taiko-mono/packages/taiko-client/proposer" producer "github.com/taikoxyz/taiko-mono/packages/taiko-client/prover/proof_producer" @@ -29,24 +31,28 @@ import ( type ProofSubmitterTestSuite struct { testutils.ClientTestSuite - submitter *ProofSubmitter - contester *ProofContester - blobSyncer *blob.Syncer - proposer *proposer.Proposer - proofCh chan *producer.ProofWithHeader + submitter *ProofSubmitter + contester *ProofContester + blobSyncer *blob.Syncer + proposer *proposer.Proposer + proofCh chan *producer.ProofWithHeader + batchProofGenerationCh chan *producer.BatchProofs + aggregationNotify chan uint16 } func (s *ProofSubmitterTestSuite) SetupTest() { s.ClientTestSuite.SetupTest() s.proofCh = make(chan *producer.ProofWithHeader, 1024) + s.batchProofGenerationCh = make(chan *producer.BatchProofs, 1024) + s.aggregationNotify = make(chan uint16, 1) builder := transaction.NewProveBlockTxBuilder( s.RPCClient, - common.HexToAddress(os.Getenv("TAIKO_L1_ADDRESS")), - common.HexToAddress(os.Getenv("PROVER_SET_ADDRESS")), - common.HexToAddress(os.Getenv("GUARDIAN_PROVER_CONTRACT_ADDRESS")), - common.HexToAddress(os.Getenv("GUARDIAN_PROVER_MINORITY_ADDRESS")), + common.HexToAddress(os.Getenv("TAIKO_L1")), + common.Address{}, + common.HexToAddress(os.Getenv("GUARDIAN_PROVER_CONTRACT")), + common.HexToAddress(os.Getenv("GUARDIAN_PROVER_MINORITY")), ) l1ProverPrivKey, err := crypto.ToECDSA(common.FromHex(os.Getenv("L1_PROVER_PRIVATE_KEY"))) @@ -57,7 +63,7 @@ func (s *ProofSubmitterTestSuite) SetupTest() { log.Root(), new(metrics.NoopTxMetrics), txmgr.CLIConfig{ - L1RPCURL: os.Getenv("L1_NODE_WS_ENDPOINT"), + L1RPCURL: os.Getenv("L1_WS"), NumConfirmations: 0, SafeAbortNonceTooLowCount: txmgr.DefaultBatcherFlagValues.SafeAbortNonceTooLowCount, PrivateKey: common.Bytes2Hex(crypto.FromECDSA(l1ProverPrivKey)), @@ -81,21 +87,27 @@ func (s *ProofSubmitterTestSuite) SetupTest() { s.RPCClient, &producer.OptimisticProofProducer{}, s.proofCh, + s.batchProofGenerationCh, + s.aggregationNotify, rpc.ZeroAddress, - common.HexToAddress(os.Getenv("TAIKO_L2_ADDRESS")), + common.HexToAddress(os.Getenv("TAIKO_L2")), "test", 0, txMgr, + nil, builder, tiers, false, 0*time.Second, + 0, + 30*time.Minute, ) s.Nil(err) s.contester = NewProofContester( s.RPCClient, 0, txMgr, + nil, rpc.ZeroAddress, "test", builder, @@ -123,43 +135,25 @@ func (s *ProofSubmitterTestSuite) SetupTest() { prop := new(proposer.Proposer) l1ProposerPrivKey, err := crypto.ToECDSA(common.FromHex(os.Getenv("L1_PROPOSER_PRIVATE_KEY"))) s.Nil(err) + jwtSecret, err := jwt.ParseSecretFromFile(os.Getenv("JWT_SECRET")) + s.Nil(err) + s.NotEmpty(jwtSecret) s.Nil(prop.InitFromConfig(context.Background(), &proposer.Config{ ClientConfig: &rpc.ClientConfig{ - L1Endpoint: os.Getenv("L1_NODE_WS_ENDPOINT"), - L2Endpoint: os.Getenv("L2_EXECUTION_ENGINE_WS_ENDPOINT"), - TaikoL1Address: common.HexToAddress(os.Getenv("TAIKO_L1_ADDRESS")), - TaikoL2Address: common.HexToAddress(os.Getenv("TAIKO_L2_ADDRESS")), - TaikoTokenAddress: common.HexToAddress(os.Getenv("TAIKO_TOKEN_ADDRESS")), - ProverSetAddress: common.HexToAddress(os.Getenv("PROVER_SET_ADDRESS")), + L1Endpoint: os.Getenv("L1_WS"), + L2Endpoint: os.Getenv("L2_WS"), + L2EngineEndpoint: os.Getenv("L2_AUTH"), + JwtSecret: string(jwtSecret), + TaikoL1Address: common.HexToAddress(os.Getenv("TAIKO_L1")), + TaikoL2Address: common.HexToAddress(os.Getenv("TAIKO_L2")), + TaikoTokenAddress: common.HexToAddress(os.Getenv("TAIKO_TOKEN")), }, - AssignmentHookAddress: common.HexToAddress(os.Getenv("ASSIGNMENT_HOOK_ADDRESS")), L1ProposerPrivKey: l1ProposerPrivKey, L2SuggestedFeeRecipient: common.HexToAddress(os.Getenv("L2_SUGGESTED_FEE_RECIPIENT")), ProposeInterval: 1024 * time.Hour, MaxProposedTxListsPerEpoch: 1, - ProverEndpoints: s.ProverEndpoints, - OptimisticTierFee: common.Big256, - SgxTierFee: common.Big256, - MaxTierFeePriceBumps: 3, - TierFeePriceBump: common.Big2, - L1BlockBuilderTip: common.Big0, - TxmgrConfigs: &txmgr.CLIConfig{ - L1RPCURL: os.Getenv("L1_NODE_WS_ENDPOINT"), - NumConfirmations: 0, - SafeAbortNonceTooLowCount: txmgr.DefaultBatcherFlagValues.SafeAbortNonceTooLowCount, - PrivateKey: common.Bytes2Hex(crypto.FromECDSA(l1ProposerPrivKey)), - FeeLimitMultiplier: txmgr.DefaultBatcherFlagValues.FeeLimitMultiplier, - FeeLimitThresholdGwei: txmgr.DefaultBatcherFlagValues.FeeLimitThresholdGwei, - MinBaseFeeGwei: txmgr.DefaultBatcherFlagValues.MinBaseFeeGwei, - MinTipCapGwei: txmgr.DefaultBatcherFlagValues.MinTipCapGwei, - ResubmissionTimeout: txmgr.DefaultBatcherFlagValues.ResubmissionTimeout, - ReceiptQueryInterval: 1 * time.Second, - NetworkTimeout: txmgr.DefaultBatcherFlagValues.NetworkTimeout, - TxSendTimeout: txmgr.DefaultBatcherFlagValues.TxSendTimeout, - TxNotInMempoolTimeout: txmgr.DefaultBatcherFlagValues.TxNotInMempoolTimeout, - }, - })) + }, txMgr, txMgr)) s.proposer = prop } @@ -172,7 +166,7 @@ func (s *ProofSubmitterTestSuite) TestGetRandomBumpedSubmissionDelay() { log.Root(), new(metrics.NoopTxMetrics), txmgr.CLIConfig{ - L1RPCURL: os.Getenv("L1_NODE_WS_ENDPOINT"), + L1RPCURL: os.Getenv("L1_WS"), NumConfirmations: 0, SafeAbortNonceTooLowCount: txmgr.DefaultBatcherFlagValues.SafeAbortNonceTooLowCount, PrivateKey: common.Bytes2Hex(crypto.FromECDSA(l1ProverPrivKey)), @@ -193,15 +187,20 @@ func (s *ProofSubmitterTestSuite) TestGetRandomBumpedSubmissionDelay() { s.RPCClient, &producer.OptimisticProofProducer{}, s.proofCh, - common.HexToAddress(os.Getenv("PROVER_SET_ADDRESS")), - common.HexToAddress(os.Getenv("TAIKO_L2_ADDRESS")), + s.batchProofGenerationCh, + s.aggregationNotify, + common.Address{}, + common.HexToAddress(os.Getenv("TAIKO_L2")), "test", 0, txMgr, + nil, s.submitter.txBuilder, s.submitter.tiers, false, time.Duration(0), + 0, + 30*time.Minute, ) s.Nil(err) @@ -213,15 +212,20 @@ func (s *ProofSubmitterTestSuite) TestGetRandomBumpedSubmissionDelay() { s.RPCClient, &producer.OptimisticProofProducer{}, s.proofCh, - common.HexToAddress(os.Getenv("PROVER_SET_ADDRESS")), - common.HexToAddress(os.Getenv("TAIKO_L2_ADDRESS")), + s.batchProofGenerationCh, + s.aggregationNotify, + common.Address{}, + common.HexToAddress(os.Getenv("TAIKO_L2")), "test", 0, txMgr, + nil, s.submitter.txBuilder, s.submitter.tiers, false, 1*time.Hour, + 0, + 30*time.Minute, ) s.Nil(err) delay, err = submitter2.getRandomBumpedSubmissionDelay(time.Now()) @@ -240,7 +244,10 @@ func (s *ProofSubmitterTestSuite) TestProofSubmitterRequestProofDeadlineExceeded s.ErrorContains( s.submitter.RequestProof( - ctx, &bindings.TaikoL1ClientBlockProposed{BlockId: common.Big256}), "context deadline exceeded", + ctx, + &metadata.TaikoDataBlockMetadataOntake{TaikoDataBlockMetadataV2: bindings.TaikoDataBlockMetadataV2{Id: 256}}, + ), + "context deadline exceeded", ) } @@ -249,7 +256,7 @@ func (s *ProofSubmitterTestSuite) TestProofSubmitterSubmitProofMetadataNotFound( s.submitter.SubmitProof( context.Background(), &producer.ProofWithHeader{ BlockID: common.Big256, - Meta: &bindings.TaikoDataBlockMetadata{}, + Meta: &metadata.TaikoDataBlockMetadataOntake{}, Header: &types.Header{}, Opts: &producer.ProofRequestOptions{}, Proof: bytes.Repeat([]byte{0xff}, 100), @@ -259,22 +266,16 @@ func (s *ProofSubmitterTestSuite) TestProofSubmitterSubmitProofMetadataNotFound( } func (s *ProofSubmitterTestSuite) TestSubmitProofs() { - s.T().Skip("Skipping, preconfer changes") - events := s.ProposeAndInsertEmptyBlocks(s.proposer, s.blobSyncer) - - for _, e := range events { - s.Nil(s.submitter.RequestProof(context.Background(), e)) + for _, m := range s.ProposeAndInsertEmptyBlocks(s.proposer, s.blobSyncer) { + s.Nil(s.submitter.RequestProof(context.Background(), m)) proofWithHeader := <-s.proofCh s.Nil(s.submitter.SubmitProof(context.Background(), proofWithHeader)) } } func (s *ProofSubmitterTestSuite) TestGuardianSubmitProofs() { - s.T().Skip("Skipping, preconfer changes") - events := s.ProposeAndInsertEmptyBlocks(s.proposer, s.blobSyncer) - - for _, e := range events { - s.Nil(s.submitter.RequestProof(context.Background(), e)) + for _, m := range s.ProposeAndInsertEmptyBlocks(s.proposer, s.blobSyncer) { + s.Nil(s.submitter.RequestProof(context.Background(), m)) proofWithHeader := <-s.proofCh proofWithHeader.Tier = encoding.TierGuardianMajorityID s.Nil(s.submitter.SubmitProof(context.Background(), proofWithHeader)) @@ -287,7 +288,10 @@ func (s *ProofSubmitterTestSuite) TestProofSubmitterRequestProofCancelled() { s.ErrorContains( s.submitter.RequestProof( - ctx, &bindings.TaikoL1ClientBlockProposed{BlockId: common.Big256}), "context canceled", + ctx, + &metadata.TaikoDataBlockMetadataOntake{TaikoDataBlockMetadataV2: bindings.TaikoDataBlockMetadataV2{Id: 256}}, + ), + "context canceled", ) } diff --git a/packages/taiko-client/prover/proof_submitter/transaction/builder.go b/packages/taiko-client/prover/proof_submitter/transaction/builder.go index 86b2104e90c..795edd55588 100644 --- a/packages/taiko-client/prover/proof_submitter/transaction/builder.go +++ b/packages/taiko-client/prover/proof_submitter/transaction/builder.go @@ -12,7 +12,9 @@ import ( "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings" "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/encoding" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/metadata" "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/rpc" + proofProducer "github.com/taikoxyz/taiko-mono/packages/taiko-client/prover/proof_producer" ) var ( @@ -52,7 +54,7 @@ func NewProveBlockTxBuilder( // Build creates a new TaikoL1.ProveBlock transaction with the given nonce. func (a *ProveBlockTxBuilder) Build( blockID *big.Int, - meta *bindings.TaikoDataBlockMetadata, + meta metadata.TaikoBlockMetaData, transition *bindings.TaikoDataTransition, tierProof *bindings.TaikoDataTierProof, tier uint16, @@ -79,12 +81,22 @@ func (a *ProveBlockTxBuilder) Build( } if a.proverSetAddress != ZeroAddress { - if data, err = encoding.ProverSetABI.Pack("proveBlock", blockID.Uint64(), input); err != nil { + if data, err = encoding.ProverSetABI.Pack( + "proveBlocks", + []uint64{blockID.Uint64()}, + [][]byte{input}, + []byte{}, + ); err != nil { return nil, err } to = a.proverSetAddress } else { - if data, err = encoding.TaikoL1ABI.Pack("proveBlock", blockID.Uint64(), input); err != nil { + if data, err = encoding.TaikoL1ABI.Pack( + "proveBlocks", + []uint64{blockID.Uint64()}, + [][]byte{input}, + []byte{}, + ); err != nil { return nil, err } to = a.taikoL1Address @@ -97,9 +109,88 @@ func (a *ProveBlockTxBuilder) Build( } else { return nil, fmt.Errorf("tier %d need set guardianProverMinorityAddress", tier) } - if data, err = encoding.GuardianProverABI.Pack("approve", *meta, *transition, *tierProof); err != nil { + + if data, err = encoding.GuardianProverABI.Pack( + "approveV2", + meta.(*metadata.TaikoDataBlockMetadataOntake).InnerMetadata(), + *transition, + *tierProof, + ); err != nil { + return nil, err + } + } + + return &txmgr.TxCandidate{ + TxData: data, + To: &to, + Blobs: nil, + GasLimit: txOpts.GasLimit, + Value: txOpts.Value, + }, nil + } +} + +// BuildProveBlocks creates a new TaikoL1.ProveBlocks transaction. +func (a *ProveBlockTxBuilder) BuildProveBlocks( + batchProof *proofProducer.BatchProofs, + graffiti [32]byte, +) TxBuilder { + return func(txOpts *bind.TransactOpts) (*txmgr.TxCandidate, error) { + var ( + data []byte + to common.Address + err error + metas = make([]metadata.TaikoBlockMetaData, len(batchProof.Proofs)) + transitions = make([]bindings.TaikoDataTransition, len(batchProof.Proofs)) + blockIDs = make([]uint64, len(batchProof.Proofs)) + ) + for i, proof := range batchProof.Proofs { + metas[i] = proof.Meta + transitions[i] = bindings.TaikoDataTransition{ + ParentHash: proof.Header.ParentHash, + BlockHash: proof.Opts.BlockHash, + StateRoot: proof.Opts.StateRoot, + Graffiti: graffiti, + } + blockIDs[i] = proof.BlockID.Uint64() + } + log.Info( + "Build batch proof submission transaction", + "blockIDs", blockIDs, + "gasLimit", txOpts.GasLimit, + ) + input, err := encoding.EncodeProveBlocksInput(metas, transitions) + if err != nil { + return nil, err + } + tierProof, err := encoding.EncodeProveBlocksBatchProof(&bindings.TaikoDataTierProof{ + Tier: batchProof.Tier, + Data: batchProof.BatchProof, + }) + if err != nil { + return nil, err + } + + if a.proverSetAddress != ZeroAddress { + if data, err = encoding.ProverSetABI.Pack( + "proveBlocks", + blockIDs, + input, + tierProof, + ); err != nil { + return nil, err + } + to = a.proverSetAddress + } else { + if data, err = encoding.TaikoL1ABI.Pack( + "proveBlocks", + blockIDs, + input, + tierProof, + ); err != nil { return nil, err } + to = a.taikoL1Address } return &txmgr.TxCandidate{ diff --git a/packages/taiko-client/prover/proof_submitter/transaction/builder_test.go b/packages/taiko-client/prover/proof_submitter/transaction/builder_test.go index 221a05caee8..bc508cde5eb 100644 --- a/packages/taiko-client/prover/proof_submitter/transaction/builder_test.go +++ b/packages/taiko-client/prover/proof_submitter/transaction/builder_test.go @@ -5,12 +5,20 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/metadata" ) func (s *TransactionTestSuite) TestBuildTxs() { _, err := s.builder.Build( common.Big256, - &bindings.TaikoDataBlockMetadata{}, + &metadata.TaikoDataBlockMetadataOntake{TaikoDataBlockMetadataV2: bindings.TaikoDataBlockMetadataV2{ + AnchorBlockHash: [32]byte{}, + Difficulty: [32]byte{}, + BlobHash: [32]byte{}, + ExtraData: [32]byte{}, + ParentMetaHash: [32]byte{}, + LivenessBond: common.Big0, + }}, &bindings.TaikoDataTransition{}, &bindings.TaikoDataTierProof{}, 1, diff --git a/packages/taiko-client/prover/proof_submitter/transaction/sender.go b/packages/taiko-client/prover/proof_submitter/transaction/sender.go index bede6772297..3363390e181 100644 --- a/packages/taiko-client/prover/proof_submitter/transaction/sender.go +++ b/packages/taiko-client/prover/proof_submitter/transaction/sender.go @@ -15,13 +15,14 @@ import ( "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/encoding" "github.com/taikoxyz/taiko-mono/packages/taiko-client/internal/metrics" "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/rpc" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/utils" producer "github.com/taikoxyz/taiko-mono/packages/taiko-client/prover/proof_producer" ) // Sender is responsible for sending proof submission transactions with a backoff policy. type Sender struct { rpc *rpc.Client - txmgr *txmgr.SimpleTxManager + txmgrSelector *utils.TxMgrSelector proverSetAddress common.Address gasLimit uint64 } @@ -30,12 +31,13 @@ type Sender struct { func NewSender( cli *rpc.Client, txmgr *txmgr.SimpleTxManager, + privateTxmgr *txmgr.SimpleTxManager, proverSetAddress common.Address, gasLimit uint64, ) *Sender { return &Sender{ rpc: cli, - txmgr: txmgr, + txmgrSelector: utils.NewTxMgrSelector(txmgr, privateTxmgr, nil), proverSetAddress: proverSetAddress, gasLimit: gasLimit, } @@ -63,7 +65,7 @@ func (s *Sender) Send( } // Check if this proof is still needed to be submitted. - ok, err := s.validateProof(ctx, proofWithHeader) + ok, err := s.ValidateProof(ctx, proofWithHeader, nil) if err != nil || !ok { return err } @@ -75,8 +77,12 @@ func (s *Sender) Send( } // Send the transaction. - receipt, err := s.txmgr.Send(ctx, *txCandidate) + txMgr, isPrivate := s.txmgrSelector.Select() + receipt, err := txMgr.Send(ctx, *txCandidate) if err != nil { + if isPrivate { + s.txmgrSelector.RecordPrivateTxMgrFailed() + } return encoding.TryParsingCustomError(err) } @@ -86,7 +92,8 @@ func (s *Sender) Send( "blockID", proofWithHeader.BlockID, "tier", proofWithHeader.Tier, "txHash", receipt.TxHash, - "error", encoding.TryParsingCustomErrorFromReceipt(ctx, s.rpc.L1, s.txmgr.From(), receipt), + "isPrivateMempool", isPrivate, + "error", encoding.TryParsingCustomErrorFromReceipt(ctx, s.rpc.L1, txMgr.From(), receipt), ) metrics.ProverSubmissionRevertedCounter.Add(1) return ErrUnretryableSubmission @@ -108,16 +115,63 @@ func (s *Sender) Send( return nil } -// validateProof checks if the proof's corresponding L1 block is still in the canonical chain and if the +func (s *Sender) SendBatchProof( + ctx context.Context, + buildTx TxBuilder, + batchProof *producer.BatchProofs, +) error { + // Assemble the TaikoL1.proveBlocks transaction. + txCandidate, err := buildTx(&bind.TransactOpts{GasLimit: s.gasLimit}) + if err != nil { + return err + } + // Send the transaction. + txMgr, isPrivate := s.txmgrSelector.Select() + receipt, err := txMgr.Send(ctx, *txCandidate) + if err != nil { + if isPrivate { + s.txmgrSelector.RecordPrivateTxMgrFailed() + } + return encoding.TryParsingCustomError(err) + } + + if receipt.Status != types.ReceiptStatusSuccessful { + log.Error( + "Failed to submit batch proofs", + "txHash", receipt.TxHash, + "isPrivateMempool", isPrivate, + "error", encoding.TryParsingCustomErrorFromReceipt(ctx, s.rpc.L1, txMgr.From(), receipt), + ) + metrics.ProverSubmissionRevertedCounter.Add(1) + return ErrUnretryableSubmission + } + + log.Info( + "🚚 Your batch proofs were accepted", + "txHash", receipt.TxHash, + "tier", batchProof.Tier, + "blockIDs", batchProof.BlockIDs, + ) + + metrics.ProverSubmissionAcceptedCounter.Add(float64(len(batchProof.BlockIDs))) + + return nil +} + +// ValidateProof checks if the proof's corresponding L1 block is still in the canonical chain and if the // latest verified head is not ahead of this block proof. -func (s *Sender) validateProof(ctx context.Context, proofWithHeader *producer.ProofWithHeader) (bool, error) { +func (s *Sender) ValidateProof( + ctx context.Context, + proofWithHeader *producer.ProofWithHeader, + latestVerifiedID *big.Int, +) (bool, error) { // 1. Check if the corresponding L1 block is still in the canonical chain. - l1Header, err := s.rpc.L1.HeaderByNumber(ctx, new(big.Int).SetUint64(proofWithHeader.Meta.L1Height+1)) + l1Header, err := s.rpc.L1.HeaderByNumber(ctx, proofWithHeader.Meta.GetRawBlockHeight()) if err != nil { log.Warn( "Failed to fetch L1 block", "blockID", proofWithHeader.BlockID, - "l1Height", proofWithHeader.Meta.L1Height+1, + "l1Height", proofWithHeader.Meta.GetRawBlockHeight(), "error", err, ) return false, err @@ -126,25 +180,29 @@ func (s *Sender) validateProof(ctx context.Context, proofWithHeader *producer.Pr log.Warn( "Reorg detected, skip the current proof submission", "blockID", proofWithHeader.BlockID, - "l1Height", proofWithHeader.Meta.L1Height+1, + "l1Height", proofWithHeader.Meta.GetRawBlockHeight(), "l1HashOld", proofWithHeader.Opts.EventL1Hash, "l1HashNew", l1Header.Hash(), ) return false, nil } + var verifiedID = latestVerifiedID // 2. Check if latest verified head is ahead of this block proof. - stateVars, err := s.rpc.GetProtocolStateVariables(&bind.CallOpts{Context: ctx}) - if err != nil { - log.Warn( - "Failed to fetch state variables", - "blockID", proofWithHeader.BlockID, - "error", err, - ) - return false, err + if verifiedID == nil { + stateVars, err := s.rpc.GetProtocolStateVariables(&bind.CallOpts{Context: ctx}) + if err != nil { + log.Warn( + "Failed to fetch state variables", + "blockID", proofWithHeader.BlockID, + "error", err, + ) + return false, err + } + verifiedID = new(big.Int).SetUint64(stateVars.B.LastVerifiedBlockId) } - latestVerifiedID := stateVars.B.LastVerifiedBlockId - if new(big.Int).SetUint64(latestVerifiedID).Cmp(proofWithHeader.BlockID) >= 0 { + + if verifiedID.Cmp(proofWithHeader.BlockID) >= 0 { log.Info( "Block is already verified, skip current proof submission", "blockID", proofWithHeader.BlockID.Uint64(), diff --git a/packages/taiko-client/prover/proof_submitter/transaction/sender_test.go b/packages/taiko-client/prover/proof_submitter/transaction/sender_test.go index 6e42dba6827..35471a6e347 100644 --- a/packages/taiko-client/prover/proof_submitter/transaction/sender_test.go +++ b/packages/taiko-client/prover/proof_submitter/transaction/sender_test.go @@ -1,25 +1,19 @@ package transaction import ( - "context" "errors" - "math/big" "os" "testing" "time" "github.com/ethereum-optimism/optimism/op-service/txmgr" "github.com/ethereum-optimism/optimism/op-service/txmgr/metrics" - "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/log" "github.com/stretchr/testify/suite" - "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings" "github.com/taikoxyz/taiko-mono/packages/taiko-client/internal/testutils" - producer "github.com/taikoxyz/taiko-mono/packages/taiko-client/prover/proof_producer" ) var ( @@ -38,10 +32,10 @@ func (s *TransactionTestSuite) SetupTest() { s.builder = NewProveBlockTxBuilder( s.RPCClient, - common.HexToAddress(os.Getenv("TAIKO_L1_ADDRESS")), + common.HexToAddress(os.Getenv("TAIKO_L1")), ZeroAddress, - common.HexToAddress(os.Getenv("GUARDIAN_PROVER_CONTRACT_ADDRESS")), - common.HexToAddress(os.Getenv("GUARDIAN_PROVER_MINORITY_ADDRESS")), + common.HexToAddress(os.Getenv("GUARDIAN_PROVER_CONTRACT")), + common.HexToAddress(os.Getenv("GUARDIAN_PROVER_MINORITY")), ) l1ProverPrivKey, err := crypto.ToECDSA(common.FromHex(os.Getenv("L1_PROVER_PRIVATE_KEY"))) @@ -52,7 +46,7 @@ func (s *TransactionTestSuite) SetupTest() { log.Root(), new(metrics.NoopTxMetrics), txmgr.CLIConfig{ - L1RPCURL: os.Getenv("L1_NODE_WS_ENDPOINT"), + L1RPCURL: os.Getenv("L1_WS"), NumConfirmations: 0, SafeAbortNonceTooLowCount: txmgr.DefaultBatcherFlagValues.SafeAbortNonceTooLowCount, PrivateKey: common.Bytes2Hex(crypto.FromECDSA(l1ProverPrivKey)), @@ -69,7 +63,7 @@ func (s *TransactionTestSuite) SetupTest() { ) s.Nil(err) - s.sender = NewSender(s.RPCClient, txmgr, ZeroAddress, 0) + s.sender = NewSender(s.RPCClient, txmgr, txmgr, ZeroAddress, 0) } func (s *TransactionTestSuite) TestIsSubmitProofTxErrorRetryable() { @@ -79,24 +73,6 @@ func (s *TransactionTestSuite) TestIsSubmitProofTxErrorRetryable() { s.False(isSubmitProofTxErrorRetryable(errors.New("L1_"+testAddr.String()), common.Big0)) } -func (s *TransactionTestSuite) TestSendTxWithBackoff() { - l1Head, err := s.RPCClient.L1.HeaderByNumber(context.Background(), nil) - s.Nil(err) - l1HeadChild, err := s.RPCClient.L1.HeaderByNumber(context.Background(), new(big.Int).Sub(l1Head.Number, common.Big1)) - s.Nil(err) - meta := &bindings.TaikoDataBlockMetadata{L1Height: l1HeadChild.Number.Uint64(), L1Hash: l1HeadChild.Hash()} - s.NotNil(s.sender.Send( - context.Background(), - &producer.ProofWithHeader{ - Meta: meta, - BlockID: common.Big1, - Header: &types.Header{}, - Opts: &producer.ProofRequestOptions{EventL1Hash: l1Head.Hash()}, - }, - func(*bind.TransactOpts) (*txmgr.TxCandidate, error) { return nil, errors.New("L1_TEST") }, - )) -} - func TestTxSenderTestSuite(t *testing.T) { suite.Run(t, new(TransactionTestSuite)) } diff --git a/packages/taiko-client/prover/prover.go b/packages/taiko-client/prover/prover.go index e69f28271fc..541373a3d81 100644 --- a/packages/taiko-client/prover/prover.go +++ b/packages/taiko-client/prover/prover.go @@ -2,10 +2,8 @@ package prover import ( "context" - "errors" "fmt" "math/big" - "net/http" "strings" "sync" "time" @@ -17,9 +15,11 @@ import ( "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/log" "github.com/urfave/cli/v2" + "golang.org/x/sync/errgroup" "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings" "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/encoding" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/metadata" "github.com/taikoxyz/taiko-mono/packages/taiko-client/internal/metrics" "github.com/taikoxyz/taiko-mono/packages/taiko-client/internal/version" eventIterator "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/chain_iterator/event_iterator" @@ -29,7 +29,6 @@ import ( proofProducer "github.com/taikoxyz/taiko-mono/packages/taiko-client/prover/proof_producer" proofSubmitter "github.com/taikoxyz/taiko-mono/packages/taiko-client/prover/proof_submitter" "github.com/taikoxyz/taiko-mono/packages/taiko-client/prover/proof_submitter/transaction" - "github.com/taikoxyz/taiko-mono/packages/taiko-client/prover/server" state "github.com/taikoxyz/taiko-mono/packages/taiko-client/prover/shared_state" ) @@ -43,15 +42,13 @@ type Prover struct { rpc *rpc.Client // Guardian prover related - server *server.ProverServer guardianProverHeartbeater guardianProverHeartbeater.BlockSenderHeartbeater // Contract configurations - protocolConfig *bindings.TaikoDataConfig + protocolConfigs *bindings.TaikoDataConfig // States - sharedState *state.SharedState - genesisHeightL1 uint64 + sharedState *state.SharedState // Event handlers blockProposedHandler handler.BlockProposedHandler @@ -64,16 +61,19 @@ type Prover struct { proofSubmitters []proofSubmitter.Submitter proofContester proofSubmitter.Contester - assignmentExpiredCh chan *bindings.TaikoL1ClientBlockProposed + assignmentExpiredCh chan metadata.TaikoBlockMetaData proveNotify chan struct{} + aggregationNotify chan uint16 // Proof related channels - proofSubmissionCh chan *proofProducer.ProofRequestBody - proofContestCh chan *proofProducer.ContestRequestBody - proofGenerationCh chan *proofProducer.ProofWithHeader + proofSubmissionCh chan *proofProducer.ProofRequestBody + proofContestCh chan *proofProducer.ContestRequestBody + proofGenerationCh chan *proofProducer.ProofWithHeader + batchProofGenerationCh chan *proofProducer.BatchProofs // Transactions manager - txmgr *txmgr.SimpleTxManager + txmgr *txmgr.SimpleTxManager + privateTxmgr *txmgr.SimpleTxManager ctx context.Context wg sync.WaitGroup @@ -86,11 +86,16 @@ func (p *Prover) InitFromCli(ctx context.Context, c *cli.Context) error { return err } - return InitFromConfig(ctx, p, cfg) + return InitFromConfig(ctx, p, cfg, nil, nil) } // InitFromConfig initializes the prover instance based on the given configurations. -func InitFromConfig(ctx context.Context, p *Prover, cfg *Config) (err error) { +func InitFromConfig( + ctx context.Context, + p *Prover, cfg *Config, + txMgr *txmgr.SimpleTxManager, + privateTxMgr *txmgr.SimpleTxManager, +) (err error) { p.cfg = cfg p.ctx = ctx // Initialize state which will be shared by event handlers. @@ -119,20 +124,21 @@ func InitFromConfig(ctx context.Context, p *Prover, cfg *Config) (err error) { } // Configs - protocolConfigs, err := p.rpc.TaikoL1.GetConfig(&bind.CallOpts{Context: ctx}) + protocolConfigs, err := rpc.GetProtocolConfigs(p.rpc.TaikoL1, &bind.CallOpts{Context: p.ctx}) if err != nil { return fmt.Errorf("failed to get protocol configs: %w", err) } - p.protocolConfig = &protocolConfigs + p.protocolConfigs = &protocolConfigs + log.Info("Protocol configs", "configs", p.protocolConfigs) - log.Info("Protocol configs", "configs", p.protocolConfig) - - chBufferSize := p.protocolConfig.BlockMaxProposals + chBufferSize := p.protocolConfigs.BlockMaxProposals p.proofGenerationCh = make(chan *proofProducer.ProofWithHeader, chBufferSize) - p.assignmentExpiredCh = make(chan *bindings.TaikoL1ClientBlockProposed, chBufferSize) - p.proofSubmissionCh = make(chan *proofProducer.ProofRequestBody, p.cfg.Capacity) - p.proofContestCh = make(chan *proofProducer.ContestRequestBody, p.cfg.Capacity) + p.batchProofGenerationCh = make(chan *proofProducer.BatchProofs, chBufferSize) + p.assignmentExpiredCh = make(chan metadata.TaikoBlockMetaData, chBufferSize) + p.proofSubmissionCh = make(chan *proofProducer.ProofRequestBody, chBufferSize) + p.proofContestCh = make(chan *proofProducer.ContestRequestBody, chBufferSize) p.proveNotify = make(chan struct{}, 1) + p.aggregationNotify = make(chan uint16, 1) if err := p.initL1Current(cfg.StartingBlockID); err != nil { return fmt.Errorf("initialize L1 current cursor error: %w", err) @@ -153,17 +159,38 @@ func InitFromConfig(ctx context.Context, p *Prover, cfg *Config) (err error) { p.cfg.GuardianProverMinorityAddress, ) - if p.txmgr, err = txmgr.NewSimpleTxManager( - "prover", - log.Root(), - &metrics.TxMgrMetrics, - *cfg.TxmgrConfigs, - ); err != nil { - return err + if txMgr != nil { + p.txmgr = txMgr + } else { + if p.txmgr, err = txmgr.NewSimpleTxManager( + "prover", + log.Root(), + &metrics.TxMgrMetrics, + *cfg.TxmgrConfigs, + ); err != nil { + return err + } + } + + if privateTxMgr != nil { + p.privateTxmgr = privateTxMgr + } else { + if cfg.PrivateTxmgrConfigs != nil && len(cfg.PrivateTxmgrConfigs.L1RPCURL) > 0 { + if p.privateTxmgr, err = txmgr.NewSimpleTxManager( + "privateMempoolProver", + log.Root(), + &metrics.TxMgrMetrics, + *cfg.PrivateTxmgrConfigs, + ); err != nil { + return err + } + } else { + p.privateTxmgr = nil + } } // Proof submitters - if err := p.initProofSubmitters(p.txmgr, txBuilder, tiers); err != nil { + if err := p.initProofSubmitters(txBuilder, tiers); err != nil { return err } @@ -172,31 +199,12 @@ func InitFromConfig(ctx context.Context, p *Prover, cfg *Config) (err error) { p.rpc, p.cfg.ProveBlockGasLimit, p.txmgr, + p.privateTxmgr, p.cfg.ProverSetAddress, p.cfg.Graffiti, txBuilder, ) - // Prover server - if p.server, err = server.New(&server.NewProverServerOpts{ - ProverPrivateKey: p.cfg.L1ProverPrivKey, - ProverSetAddress: p.cfg.ProverSetAddress, - MinOptimisticTierFee: p.cfg.MinOptimisticTierFee, - MinSgxTierFee: p.cfg.MinSgxTierFee, - MinSgxAndZkVMTierFee: p.cfg.MinSgxAndZkVMTierFee, - MinEthBalance: p.cfg.MinEthBalance, - MinTaikoTokenBalance: p.cfg.MinTaikoTokenBalance, - MaxExpiry: p.cfg.MaxExpiry, - MaxBlockSlippage: p.cfg.MaxBlockSlippage, - TaikoL1Address: p.cfg.TaikoL1Address, - AssignmentHookAddress: p.cfg.AssignmentHookAddress, - RPC: p.rpc, - ProtocolConfigs: &protocolConfigs, - LivenessBond: protocolConfigs.LivenessBond, - }); err != nil { - return err - } - // Guardian prover heartbeat sender if p.IsGuardianProver() && p.cfg.GuardianProverHealthCheckServerEndpoint != nil { // Check guardian prover contract address is correct. @@ -229,19 +237,12 @@ func InitFromConfig(ctx context.Context, p *Prover, cfg *Config) (err error) { // Start starts the main loop of the L2 block prover. func (p *Prover) Start() error { // 1. Set approval amount for the contracts. - for _, contract := range []common.Address{p.cfg.TaikoL1Address, p.cfg.AssignmentHookAddress} { + for _, contract := range []common.Address{p.cfg.TaikoL1Address} { if err := p.setApprovalAmount(p.ctx, contract); err != nil { log.Crit("Failed to set approval amount", "contract", contract, "error", err) } } - // 2. Start the prover server. - go func() { - if err := p.server.Start(fmt.Sprintf(":%v", p.cfg.HTTPServerPort)); !errors.Is(err, http.ErrServerClosed) { - log.Crit("Failed to start http server", "error", err) - } - }() - // 3. Start the guardian prover heartbeat sender if the current prover is a guardian prover. if p.IsGuardianProver() && p.cfg.GuardianProverHealthCheckServerEndpoint != nil { // Send the startup message to the guardian prover health check server. @@ -278,6 +279,7 @@ func (p *Prover) eventLoop() { default: } } + // Call reqProving() right away to catch up with the latest state. reqProving() @@ -288,21 +290,21 @@ func (p *Prover) eventLoop() { defer forceProvingTicker.Stop() // Channels - chBufferSize := p.protocolConfig.BlockMaxProposals - blockProposedCh := make(chan *bindings.TaikoL1ClientBlockProposed, chBufferSize) - blockVerifiedCh := make(chan *bindings.TaikoL1ClientBlockVerified, chBufferSize) - transitionProvedCh := make(chan *bindings.TaikoL1ClientTransitionProved, chBufferSize) - transitionContestedCh := make(chan *bindings.TaikoL1ClientTransitionContested, chBufferSize) + chBufferSize := p.protocolConfigs.BlockMaxProposals + blockProposedV2Ch := make(chan *bindings.TaikoL1ClientBlockProposedV2, chBufferSize) + blockVerifiedV2Ch := make(chan *bindings.TaikoL1ClientBlockVerifiedV2, chBufferSize) + transitionProvedV2Ch := make(chan *bindings.TaikoL1ClientTransitionProvedV2, chBufferSize) + transitionContestedV2Ch := make(chan *bindings.TaikoL1ClientTransitionContestedV2, chBufferSize) // Subscriptions - blockProposedSub := rpc.SubscribeBlockProposed(p.rpc.TaikoL1, blockProposedCh) - blockVerifiedSub := rpc.SubscribeBlockVerified(p.rpc.TaikoL1, blockVerifiedCh) - transitionProvedSub := rpc.SubscribeTransitionProved(p.rpc.TaikoL1, transitionProvedCh) - transitionContestedSub := rpc.SubscribeTransitionContested(p.rpc.TaikoL1, transitionContestedCh) + blockProposedV2Sub := rpc.SubscribeBlockProposedV2(p.rpc.TaikoL1, blockProposedV2Ch) + blockVerifiedV2Sub := rpc.SubscribeBlockVerifiedV2(p.rpc.TaikoL1, blockVerifiedV2Ch) + transitionProvedV2Sub := rpc.SubscribeTransitionProvedV2(p.rpc.TaikoL1, transitionProvedV2Ch) + transitionContestedV2Sub := rpc.SubscribeTransitionContestedV2(p.rpc.TaikoL1, transitionContestedV2Ch) defer func() { - blockProposedSub.Unsubscribe() - blockVerifiedSub.Unsubscribe() - transitionProvedSub.Unsubscribe() - transitionContestedSub.Unsubscribe() + blockProposedV2Sub.Unsubscribe() + blockVerifiedV2Sub.Unsubscribe() + transitionProvedV2Sub.Unsubscribe() + transitionContestedV2Sub.Unsubscribe() }() for { @@ -313,21 +315,29 @@ func (p *Prover) eventLoop() { p.withRetry(func() error { return p.contestProofOp(req) }) case proofWithHeader := <-p.proofGenerationCh: p.withRetry(func() error { return p.submitProofOp(proofWithHeader) }) + case batchProof := <-p.batchProofGenerationCh: + p.withRetry(func() error { return p.submitProofAggregationOp(batchProof) }) case req := <-p.proofSubmissionCh: - p.withRetry(func() error { return p.requestProofOp(req.Event, req.Tier) }) + p.withRetry(func() error { return p.requestProofOp(req.Meta, req.Tier) }) case <-p.proveNotify: if err := p.proveOp(); err != nil { log.Error("Prove new blocks error", "error", err) } - case e := <-blockVerifiedCh: + case tier := <-p.aggregationNotify: + p.withRetry(func() error { return p.aggregateOp(tier) }) + case e := <-blockVerifiedV2Ch: p.blockVerifiedHandler.Handle(e) - case e := <-transitionProvedCh: - p.withRetry(func() error { return p.transitionProvedHandler.Handle(p.ctx, e) }) - case e := <-transitionContestedCh: - p.withRetry(func() error { return p.transitionContestedHandler.Handle(p.ctx, e) }) - case e := <-p.assignmentExpiredCh: - p.withRetry(func() error { return p.assignmentExpiredHandler.Handle(p.ctx, e) }) - case <-blockProposedCh: + case e := <-transitionProvedV2Ch: + p.withRetry(func() error { + return p.transitionProvedHandler.Handle(p.ctx, e) + }) + case e := <-transitionContestedV2Ch: + p.withRetry(func() error { + return p.transitionContestedHandler.Handle(p.ctx, e) + }) + case m := <-p.assignmentExpiredCh: + p.withRetry(func() error { return p.assignmentExpiredHandler.Handle(p.ctx, m) }) + case <-blockProposedV2Ch: reqProving() case <-forceProvingTicker.C: reqProving() @@ -336,10 +346,7 @@ func (p *Prover) eventLoop() { } // Close closes the prover instance. -func (p *Prover) Close(ctx context.Context) { - if err := p.server.Shutdown(ctx); err != nil { - log.Error("Failed to shut down prover server", "error", err) - } +func (p *Prover) Close(_ context.Context) { p.wg.Wait() } @@ -360,6 +367,35 @@ func (p *Prover) proveOp() error { return iter.Iter() } +// aggregateOp aggregates all proofs in buffer. +func (p *Prover) aggregateOp(tier uint16) error { + g, gCtx := errgroup.WithContext(p.ctx) + for _, submitter := range p.proofSubmitters { + g.Go(func() error { + if submitter.AggregationEnabled() && submitter.Tier() == tier { + if err := submitter.AggregateProofs(gCtx); err != nil { + log.Error( + "Failed to aggregate proofs", + "error", err, + "tier", submitter.Tier(), + ) + return err + } + } else { + log.Debug( + "Skip the current aggregation operation", + "requestTier", tier, + "submitterTier", submitter.Tier(), + "bufferSize", submitter.BufferSize(), + ) + } + return nil + }) + } + + return g.Wait() +} + // contestProofOp performs a proof contest operation. func (p *Prover) contestProofOp(req *proofProducer.ContestRequestBody) error { if err := p.proofContester.SubmitContest( @@ -374,7 +410,7 @@ func (p *Prover) contestProofOp(req *proofProducer.ContestRequestBody) error { log.Error( "Proof contest submission reverted", "blockID", req.BlockID, - "minTier", req.Meta.MinTier, + "minTier", req.Meta.GetMinTier(), "error", err, ) return nil @@ -382,7 +418,7 @@ func (p *Prover) contestProofOp(req *proofProducer.ContestRequestBody) error { log.Error( "Request new proof contest error", "blockID", req.BlockID, - "minTier", req.Meta.MinTier, + "minTier", req.Meta.GetMinTier(), "error", err, ) return err @@ -392,7 +428,7 @@ func (p *Prover) contestProofOp(req *proofProducer.ContestRequestBody) error { } // requestProofOp requests a new proof generation operation. -func (p *Prover) requestProofOp(e *bindings.TaikoL1ClientBlockProposed, minTier uint16) error { +func (p *Prover) requestProofOp(meta metadata.TaikoBlockMetaData, minTier uint16) error { if p.IsGuardianProver() { if minTier > encoding.TierGuardianMinorityID { minTier = encoding.TierGuardianMajorityID @@ -401,15 +437,15 @@ func (p *Prover) requestProofOp(e *bindings.TaikoL1ClientBlockProposed, minTier } } if submitter := p.selectSubmitter(minTier); submitter != nil { - if err := submitter.RequestProof(p.ctx, e); err != nil { - log.Error("Request new proof error", "blockID", e.BlockId, "minTier", e.Meta.MinTier, "error", err) + if err := submitter.RequestProof(p.ctx, meta); err != nil { + log.Error("Request new proof error", "blockID", meta.GetBlockID(), "minTier", meta.GetMinTier(), "error", err) return err } return nil } - log.Error("Failed to find proof submitter", "blockID", e.BlockId, "minTier", minTier) + log.Error("Failed to find proof submitter", "blockID", meta.GetBlockID(), "minTier", minTier) return nil } @@ -425,7 +461,7 @@ func (p *Prover) submitProofOp(proofWithHeader *proofProducer.ProofWithHeader) e log.Error( "Proof submission reverted", "blockID", proofWithHeader.BlockID, - "minTier", proofWithHeader.Meta.MinTier, + "minTier", proofWithHeader.Meta.GetMinTier(), "error", err, ) return nil @@ -433,7 +469,37 @@ func (p *Prover) submitProofOp(proofWithHeader *proofProducer.ProofWithHeader) e log.Error( "Submit proof error", "blockID", proofWithHeader.BlockID, - "minTier", proofWithHeader.Meta.MinTier, + "minTier", proofWithHeader.Meta.GetMinTier(), + "error", err, + ) + return err + } + + return nil +} + +// submitProofsOp performs a batch proof submission operation. +func (p *Prover) submitProofAggregationOp(batchProof *proofProducer.BatchProofs) error { + submitter := p.getSubmitterByTier(batchProof.Tier) + if submitter == nil { + return nil + } + + if err := submitter.BatchSubmitProofs(p.ctx, batchProof); err != nil { + if strings.Contains(err.Error(), vm.ErrExecutionReverted.Error()) || + strings.Contains(err.Error(), proofSubmitter.ErrInvalidProof.Error()) { + log.Error( + "Proof submission reverted", + "blockIDs", batchProof.BlockIDs, + "tier", batchProof.Tier, + "error", err, + ) + return nil + } + log.Error( + "Submit proof error", + "blockIDs", batchProof.BlockIDs, + "tier", batchProof.Tier, "error", err, ) return err @@ -454,7 +520,6 @@ func (p *Prover) selectSubmitter(minTier uint16) proofSubmitter.Submitter { if !p.IsGuardianProver() && s.Tier() >= encoding.TierGuardianMinorityID { continue } - log.Debug("Proof submitter selected", "tier", s.Tier(), "minTier", minTier) return s } diff --git a/packages/taiko-client/prover/prover_test.go b/packages/taiko-client/prover/prover_test.go index 1d77f8bb0c8..821a62c6313 100644 --- a/packages/taiko-client/prover/prover_test.go +++ b/packages/taiko-client/prover/prover_test.go @@ -4,9 +4,7 @@ import ( "context" "crypto/ecdsa" "math/big" - "net/url" "os" - "strconv" "testing" "time" @@ -15,17 +13,21 @@ import ( "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/stretchr/testify/suite" "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings" "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/encoding" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/metadata" "github.com/taikoxyz/taiko-mono/packages/taiko-client/driver" + "github.com/taikoxyz/taiko-mono/packages/taiko-client/internal/metrics" "github.com/taikoxyz/taiko-mono/packages/taiko-client/internal/testutils" "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/jwt" "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/rpc" "github.com/taikoxyz/taiko-mono/packages/taiko-client/proposer" guardianProverHeartbeater "github.com/taikoxyz/taiko-mono/packages/taiko-client/prover/guardian_prover_heartbeater" producer "github.com/taikoxyz/taiko-mono/packages/taiko-client/prover/proof_producer" + proofSubmitter "github.com/taikoxyz/taiko-mono/packages/taiko-client/prover/proof_submitter" "github.com/taikoxyz/taiko-mono/packages/taiko-client/prover/proof_submitter/transaction" ) @@ -35,6 +37,7 @@ type ProverTestSuite struct { cancel context.CancelFunc d *driver.Driver proposer *proposer.Proposer + txmgr *txmgr.SimpleTxManager } func (s *ProverTestSuite) SetupTest() { @@ -44,8 +47,30 @@ func (s *ProverTestSuite) SetupTest() { l1ProverPrivKey, err := crypto.ToECDSA(common.FromHex(os.Getenv("L1_PROVER_PRIVATE_KEY"))) s.Nil(err) + s.txmgr, err = txmgr.NewSimpleTxManager( + "prover_test", + log.Root(), + &metrics.TxMgrMetrics, + txmgr.CLIConfig{ + L1RPCURL: os.Getenv("L1_WS"), + NumConfirmations: 0, + SafeAbortNonceTooLowCount: txmgr.DefaultBatcherFlagValues.SafeAbortNonceTooLowCount, + PrivateKey: common.Bytes2Hex(crypto.FromECDSA(l1ProverPrivKey)), + FeeLimitMultiplier: txmgr.DefaultBatcherFlagValues.FeeLimitMultiplier, + FeeLimitThresholdGwei: txmgr.DefaultBatcherFlagValues.FeeLimitThresholdGwei, + MinBaseFeeGwei: txmgr.DefaultBatcherFlagValues.MinBaseFeeGwei, + MinTipCapGwei: txmgr.DefaultBatcherFlagValues.MinTipCapGwei, + ResubmissionTimeout: txmgr.DefaultBatcherFlagValues.ResubmissionTimeout, + ReceiptQueryInterval: 1 * time.Second, + NetworkTimeout: txmgr.DefaultBatcherFlagValues.NetworkTimeout, + TxSendTimeout: txmgr.DefaultBatcherFlagValues.TxSendTimeout, + TxNotInMempoolTimeout: txmgr.DefaultBatcherFlagValues.TxNotInMempoolTimeout, + }, + ) + s.Nil(err) + ctx, cancel := context.WithCancel(context.Background()) - proverServerURL := s.initProver(ctx, l1ProverPrivKey) + s.initProver(ctx, l1ProverPrivKey) s.cancel = cancel // Init driver @@ -56,12 +81,11 @@ func (s *ProverTestSuite) SetupTest() { d := new(driver.Driver) s.Nil(d.InitFromConfig(context.Background(), &driver.Config{ ClientConfig: &rpc.ClientConfig{ - L1Endpoint: os.Getenv("L1_NODE_WS_ENDPOINT"), - L2Endpoint: os.Getenv("L2_EXECUTION_ENGINE_WS_ENDPOINT"), - L2EngineEndpoint: os.Getenv("L2_EXECUTION_ENGINE_AUTH_ENDPOINT"), - TaikoL1Address: common.HexToAddress(os.Getenv("TAIKO_L1_ADDRESS")), - TaikoL2Address: common.HexToAddress(os.Getenv("TAIKO_L2_ADDRESS")), - ProverSetAddress: common.HexToAddress(os.Getenv("PROVER_SET_ADDRESS")), + L1Endpoint: os.Getenv("L1_WS"), + L2Endpoint: os.Getenv("L2_WS"), + L2EngineEndpoint: os.Getenv("L2_AUTH"), + TaikoL1Address: common.HexToAddress(os.Getenv("TAIKO_L1")), + TaikoL2Address: common.HexToAddress(os.Getenv("TAIKO_L2")), JwtSecret: string(jwtSecret), }, })) @@ -75,42 +99,19 @@ func (s *ProverTestSuite) SetupTest() { s.Nil(prop.InitFromConfig(context.Background(), &proposer.Config{ ClientConfig: &rpc.ClientConfig{ - L1Endpoint: os.Getenv("L1_NODE_WS_ENDPOINT"), - L2Endpoint: os.Getenv("L2_EXECUTION_ENGINE_WS_ENDPOINT"), - L2EngineEndpoint: os.Getenv("L2_EXECUTION_ENGINE_AUTH_ENDPOINT"), + L1Endpoint: os.Getenv("L1_WS"), + L2Endpoint: os.Getenv("L2_WS"), + L2EngineEndpoint: os.Getenv("L2_AUTH"), JwtSecret: string(jwtSecret), - TaikoL1Address: common.HexToAddress(os.Getenv("TAIKO_L1_ADDRESS")), - TaikoL2Address: common.HexToAddress(os.Getenv("TAIKO_L2_ADDRESS")), - TaikoTokenAddress: common.HexToAddress(os.Getenv("TAIKO_TOKEN_ADDRESS")), - ProverSetAddress: common.HexToAddress(os.Getenv("PROVER_SET_ADDRESS")), + TaikoL1Address: common.HexToAddress(os.Getenv("TAIKO_L1")), + TaikoL2Address: common.HexToAddress(os.Getenv("TAIKO_L2")), + TaikoTokenAddress: common.HexToAddress(os.Getenv("TAIKO_TOKEN")), }, - AssignmentHookAddress: common.HexToAddress(os.Getenv("ASSIGNMENT_HOOK_ADDRESS")), L1ProposerPrivKey: l1ProposerPrivKey, L2SuggestedFeeRecipient: common.HexToAddress(os.Getenv("L2_SUGGESTED_FEE_RECIPIENT")), ProposeInterval: 1024 * time.Hour, MaxProposedTxListsPerEpoch: 1, - ProverEndpoints: []*url.URL{proverServerURL}, - OptimisticTierFee: common.Big256, - SgxTierFee: common.Big256, - MaxTierFeePriceBumps: 3, - TierFeePriceBump: common.Big2, - L1BlockBuilderTip: common.Big0, - TxmgrConfigs: &txmgr.CLIConfig{ - L1RPCURL: os.Getenv("L1_NODE_WS_ENDPOINT"), - NumConfirmations: 0, - SafeAbortNonceTooLowCount: txmgr.DefaultBatcherFlagValues.SafeAbortNonceTooLowCount, - PrivateKey: common.Bytes2Hex(crypto.FromECDSA(l1ProposerPrivKey)), - FeeLimitMultiplier: txmgr.DefaultBatcherFlagValues.FeeLimitMultiplier, - FeeLimitThresholdGwei: txmgr.DefaultBatcherFlagValues.FeeLimitThresholdGwei, - MinBaseFeeGwei: txmgr.DefaultBatcherFlagValues.MinBaseFeeGwei, - MinTipCapGwei: txmgr.DefaultBatcherFlagValues.MinTipCapGwei, - ResubmissionTimeout: txmgr.DefaultBatcherFlagValues.ResubmissionTimeout, - ReceiptQueryInterval: 1 * time.Second, - NetworkTimeout: txmgr.DefaultBatcherFlagValues.NetworkTimeout, - TxSendTimeout: txmgr.DefaultBatcherFlagValues.TxSendTimeout, - TxNotInMempoolTimeout: txmgr.DefaultBatcherFlagValues.TxNotInMempoolTimeout, - }, - })) + }, s.txmgr, s.txmgr)) s.proposer = prop } @@ -128,36 +129,19 @@ func (s *ProverTestSuite) TestInitError() { p := new(Prover) s.NotNil(InitFromConfig(ctx, p, &Config{ - L1WsEndpoint: os.Getenv("L1_NODE_WS_ENDPOINT"), - L1HttpEndpoint: os.Getenv("L1_NODE_HTTP_ENDPOINT"), - L2WsEndpoint: os.Getenv("L2_EXECUTION_ENGINE_WS_ENDPOINT"), - L2HttpEndpoint: os.Getenv("L2_EXECUTION_ENGINE_HTTP_ENDPOINT"), - TaikoL1Address: common.HexToAddress(os.Getenv("TAIKO_L1_ADDRESS")), - TaikoL2Address: common.HexToAddress(os.Getenv("TAIKO_L2_ADDRESS")), - TaikoTokenAddress: common.HexToAddress(os.Getenv("TAIKO_TOKEN_ADDRESS")), - AssignmentHookAddress: common.HexToAddress(os.Getenv("ASSIGNMENT_HOOK_CONTRACT_ADDRESS")), + L1WsEndpoint: os.Getenv("L1_WS"), + L2WsEndpoint: os.Getenv("L2_WS"), + L2HttpEndpoint: os.Getenv("L2_HTTP"), + TaikoL1Address: common.HexToAddress(os.Getenv("TAIKO_L1")), + TaikoL2Address: common.HexToAddress(os.Getenv("TAIKO_L2")), + TaikoTokenAddress: common.HexToAddress(os.Getenv("TAIKO_TOKEN")), L1ProverPrivKey: l1ProverPrivKey, Dummy: true, ProveUnassignedBlocks: true, RPCTimeout: 10 * time.Minute, BackOffRetryInterval: 3 * time.Second, BackOffMaxRetries: 12, - TxmgrConfigs: &txmgr.CLIConfig{ - L1RPCURL: os.Getenv("L1_NODE_WS_ENDPOINT"), - NumConfirmations: 0, - SafeAbortNonceTooLowCount: txmgr.DefaultBatcherFlagValues.SafeAbortNonceTooLowCount, - PrivateKey: common.Bytes2Hex(crypto.FromECDSA(l1ProverPrivKey)), - FeeLimitMultiplier: txmgr.DefaultBatcherFlagValues.FeeLimitMultiplier, - FeeLimitThresholdGwei: txmgr.DefaultBatcherFlagValues.FeeLimitThresholdGwei, - MinBaseFeeGwei: txmgr.DefaultBatcherFlagValues.MinBaseFeeGwei, - MinTipCapGwei: txmgr.DefaultBatcherFlagValues.MinTipCapGwei, - ResubmissionTimeout: txmgr.DefaultBatcherFlagValues.ResubmissionTimeout, - ReceiptQueryInterval: 1 * time.Second, - NetworkTimeout: txmgr.DefaultBatcherFlagValues.NetworkTimeout, - TxSendTimeout: txmgr.DefaultBatcherFlagValues.TxSendTimeout, - TxNotInMempoolTimeout: txmgr.DefaultBatcherFlagValues.TxNotInMempoolTimeout, - }, - })) + }, s.txmgr, s.txmgr)) } func (s *ProverTestSuite) TestOnBlockProposed() { @@ -167,28 +151,28 @@ func (s *ProverTestSuite) TestOnBlockProposed() { s.Nil(err) s.p.cfg.L1ProverPrivKey = l1ProverPrivKey // Valid block - e := s.ProposeAndInsertValidBlock(s.proposer, s.d.ChainSyncer().BlobSyncer()) - s.Nil(s.p.blockProposedHandler.Handle(context.Background(), e, func() {})) + m := s.ProposeAndInsertValidBlock(s.proposer, s.d.ChainSyncer().BlobSyncer()) + s.Nil(s.p.blockProposedHandler.Handle(context.Background(), m, func() {})) req := <-s.p.proofSubmissionCh - s.Nil(s.p.requestProofOp(req.Event, req.Tier)) - s.Nil(s.p.selectSubmitter(e.Meta.MinTier).SubmitProof(context.Background(), <-s.p.proofGenerationCh)) + s.Nil(s.p.requestProofOp(req.Meta, req.Tier)) + s.Nil(s.p.selectSubmitter(m.GetMinTier()).SubmitProof(context.Background(), <-s.p.proofGenerationCh)) // Empty blocks - for _, e = range s.ProposeAndInsertEmptyBlocks( + for _, m := range s.ProposeAndInsertEmptyBlocks( s.proposer, s.d.ChainSyncer().BlobSyncer(), ) { - s.Nil(s.p.blockProposedHandler.Handle(context.Background(), e, func() {})) + s.Nil(s.p.blockProposedHandler.Handle(context.Background(), m, func() {})) req := <-s.p.proofSubmissionCh - s.Nil(s.p.requestProofOp(req.Event, req.Tier)) - s.Nil(s.p.selectSubmitter(e.Meta.MinTier).SubmitProof(context.Background(), <-s.p.proofGenerationCh)) + s.Nil(s.p.requestProofOp(req.Meta, req.Tier)) + s.Nil(s.p.selectSubmitter(m.GetMinTier()).SubmitProof(context.Background(), <-s.p.proofGenerationCh)) } } func (s *ProverTestSuite) TestOnBlockVerifiedEmptyBlockHash() { s.T().Skip("Skipping, preconfer changes") s.NotPanics(func() { - s.p.blockVerifiedHandler.Handle(&bindings.TaikoL1ClientBlockVerified{ + s.p.blockVerifiedHandler.Handle(&bindings.TaikoL1ClientBlockVerifiedV2{ BlockId: common.Big1, BlockHash: common.Hash{}, }) @@ -201,7 +185,7 @@ func (s *ProverTestSuite) TestSubmitProofOp() { s.p.withRetry(func() error { return s.p.submitProofOp(&producer.ProofWithHeader{ BlockID: common.Big1, - Meta: &bindings.TaikoDataBlockMetadata{}, + Meta: &metadata.TaikoDataBlockMetadataOntake{}, Header: &types.Header{}, Proof: []byte{}, Tier: encoding.TierOptimisticID, @@ -213,7 +197,7 @@ func (s *ProverTestSuite) TestSubmitProofOp() { s.p.withRetry(func() error { return s.p.submitProofOp(&producer.ProofWithHeader{ BlockID: common.Big1, - Meta: &bindings.TaikoDataBlockMetadata{}, + Meta: &metadata.TaikoDataBlockMetadataOntake{}, Header: &types.Header{}, Proof: []byte{}, Tier: encoding.TierOptimisticID, @@ -226,7 +210,7 @@ func (s *ProverTestSuite) TestSubmitProofOp() { func (s *ProverTestSuite) TestOnBlockVerified() { id := testutils.RandomHash().Big().Uint64() s.NotPanics(func() { - s.p.blockVerifiedHandler.Handle(&bindings.TaikoL1ClientBlockVerified{ + s.p.blockVerifiedHandler.Handle(&bindings.TaikoL1ClientBlockVerifiedV2{ BlockId: testutils.RandomHash().Big(), Raw: types.Log{ BlockHash: testutils.RandomHash(), @@ -237,35 +221,32 @@ func (s *ProverTestSuite) TestOnBlockVerified() { } func (s *ProverTestSuite) TestContestWrongBlocks() { - s.T().Skip("This test is flaky and needs to be fixed") s.p.cfg.ContesterMode = false s.Nil(s.p.initEventHandlers()) - e := s.ProposeAndInsertValidBlock(s.proposer, s.d.ChainSyncer().BlobSyncer()) - s.Nil(s.p.transitionProvedHandler.Handle(context.Background(), &bindings.TaikoL1ClientTransitionProved{ - BlockId: e.BlockId, - Tier: e.Meta.MinTier, + m := s.ProposeAndInsertValidBlock(s.proposer, s.d.ChainSyncer().BlobSyncer()) + s.Nil(s.p.transitionProvedHandler.Handle(context.Background(), &bindings.TaikoL1ClientTransitionProvedV2{ + BlockId: m.GetBlockID(), + Tier: m.GetMinTier(), })) s.p.cfg.ContesterMode = true s.Nil(s.p.initEventHandlers()) // Submit a wrong proof at first. - sink := make(chan *bindings.TaikoL1ClientTransitionProved) - header, err := s.p.rpc.L2.HeaderByNumber(context.Background(), e.BlockId) + header, err := s.p.rpc.L2.HeaderByNumber(context.Background(), m.GetBlockID()) s.Nil(err) - - sub, err := s.p.rpc.TaikoL1.WatchTransitionProved(nil, sink, nil) + sink := make(chan *bindings.TaikoL1ClientTransitionProvedV2) + sub, err := s.p.rpc.TaikoL1.WatchTransitionProvedV2(nil, sink, nil) s.Nil(err) defer func() { sub.Unsubscribe() close(sink) }() - s.Nil(s.p.proveOp()) req := <-s.p.proofSubmissionCh - s.Nil(s.p.requestProofOp(req.Event, req.Tier)) + s.Nil(s.p.requestProofOp(req.Meta, req.Tier)) proofWithHeader := <-s.p.proofGenerationCh proofWithHeader.Opts.BlockHash = testutils.RandomHash() - s.Nil(s.p.selectSubmitter(e.Meta.MinTier).SubmitProof(context.Background(), proofWithHeader)) + s.Nil(s.p.selectSubmitter(m.GetMinTier()).SubmitProof(context.Background(), proofWithHeader)) event := <-sink s.Equal(header.Number.Uint64(), event.BlockId.Uint64()) @@ -274,9 +255,10 @@ func (s *ProverTestSuite) TestContestWrongBlocks() { s.Equal(header.ParentHash, common.BytesToHash(event.Tran.ParentHash[:])) // Contest the transition. - contestedSink := make(chan *bindings.TaikoL1ClientTransitionContested) - contestedSub, err := s.p.rpc.TaikoL1.WatchTransitionContested(nil, contestedSink, nil) + contestedSink := make(chan *bindings.TaikoL1ClientTransitionContestedV2) + contestedSub, err := s.p.rpc.TaikoL1.WatchTransitionContestedV2(nil, contestedSink, nil) s.Nil(err) + defer func() { contestedSub.Unsubscribe() close(contestedSink) @@ -284,10 +266,7 @@ func (s *ProverTestSuite) TestContestWrongBlocks() { contesterKey, err := crypto.ToECDSA(common.FromHex(os.Getenv("L1_CONTRACT_OWNER_PRIVATE_KEY"))) s.Nil(err) - s.NotNil(s.initProver( - context.Background(), - contesterKey, - )) + s.initProver(context.Background(), contesterKey) s.p.cfg.ContesterMode = true s.Nil(s.p.initEventHandlers()) @@ -303,8 +282,9 @@ func (s *ProverTestSuite) TestContestWrongBlocks() { s.Nil(s.p.transitionContestedHandler.Handle(context.Background(), contestedEvent)) - s.p.cfg.GuardianProverMajorityAddress = common.HexToAddress(os.Getenv("GUARDIAN_PROVER_CONTRACT_ADDRESS")) + s.p.cfg.GuardianProverMajorityAddress = common.HexToAddress(os.Getenv("GUARDIAN_PROVER_CONTRACT")) s.True(s.p.IsGuardianProver()) + s.p.cfg.GuardianProverMinorityAddress = common.HexToAddress(os.Getenv("GUARDIAN_PROVER_MINORITY")) txBuilder := transaction.NewProveBlockTxBuilder( s.p.rpc, @@ -317,13 +297,13 @@ func (s *ProverTestSuite) TestContestWrongBlocks() { // Protocol proof tiers tiers, err := s.RPCClient.GetTiers(context.Background()) s.Nil(err) - s.Nil(s.p.initProofSubmitters(s.p.txmgr, txBuilder, tiers)) + s.Nil(s.p.initProofSubmitters(txBuilder, tiers)) - s.p.rpc.GuardianProverMajority, err = bindings.NewGuardianProver(s.p.cfg.GuardianProverMajorityAddress, s.p.rpc.L1) + s.p.rpc.GuardianProverMinority, err = bindings.NewGuardianProver(s.p.cfg.GuardianProverMinorityAddress, s.p.rpc.L1) s.Nil(err) approvedSink := make(chan *bindings.GuardianProverGuardianApproval) - approvedSub, err := s.p.rpc.GuardianProverMajority.WatchGuardianApproval( + approvedSub, err := s.p.rpc.GuardianProverMinority.WatchGuardianApproval( nil, approvedSink, []common.Address{}, [](*big.Int){}, []([32]byte){}, ) s.Nil(err) @@ -332,43 +312,15 @@ func (s *ProverTestSuite) TestContestWrongBlocks() { close(approvedSink) }() req = <-s.p.proofSubmissionCh - s.Nil(s.p.requestProofOp(req.Event, req.Tier)) - s.Nil(s.p.selectSubmitter(encoding.TierGuardianMajorityID).SubmitProof(context.Background(), <-s.p.proofGenerationCh)) + s.Nil(s.p.requestProofOp(req.Meta, req.Tier)) + s.Nil(s.p.selectSubmitter(encoding.TierGuardianMinorityID).SubmitProof(context.Background(), <-s.p.proofGenerationCh)) approvedEvent := <-approvedSink s.Equal(header.Number.Uint64(), approvedEvent.BlockId.Uint64()) } -func (s *ProverTestSuite) TestProveExpiredUnassignedBlock() { - s.T().Skip("Skipping, preconfer changes") - e := s.ProposeAndInsertValidBlock(s.proposer, s.d.ChainSyncer().BlobSyncer()) - sink := make(chan *bindings.TaikoL1ClientTransitionProved) - - header, err := s.p.rpc.L2.HeaderByNumber(context.Background(), e.BlockId) - s.Nil(err) - - sub, err := s.p.rpc.TaikoL1.WatchTransitionProved(nil, sink, nil) - s.Nil(err) - defer func() { - sub.Unsubscribe() - close(sink) - }() - - e.AssignedProver = common.BytesToAddress(testutils.RandomHash().Bytes()) - s.p.cfg.GuardianProverMajorityAddress = common.Address{} - s.Nil(s.p.assignmentExpiredHandler.Handle(context.Background(), e)) - req := <-s.p.proofSubmissionCh - s.Nil(s.p.requestProofOp(req.Event, req.Tier)) - s.Nil(s.p.selectSubmitter(e.Meta.MinTier).SubmitProof(context.Background(), <-s.p.proofGenerationCh)) - - event := <-sink - s.Equal(header.Number.Uint64(), event.BlockId.Uint64()) - s.Equal(header.Hash(), common.BytesToHash(event.Tran.BlockHash[:])) - s.Equal(header.ParentHash, common.BytesToHash(event.Tran.ParentHash[:])) -} - func (s *ProverTestSuite) TestSelectSubmitter() { - s.p.cfg.GuardianProverMajorityAddress = common.HexToAddress(os.Getenv("GUARDIAN_PROVER_CONTRACT_ADDRESS")) + s.p.cfg.GuardianProverMajorityAddress = common.HexToAddress(os.Getenv("GUARDIAN_PROVER_CONTRACT")) s.True(s.p.IsGuardianProver()) submitter := s.p.selectSubmitter(encoding.TierGuardianMinorityID + 1) s.NotNil(submitter) @@ -381,7 +333,7 @@ func (s *ProverTestSuite) TestSelectSubmitterNotFound() { } func (s *ProverTestSuite) TestGetSubmitterByTier() { - s.p.cfg.GuardianProverMajorityAddress = common.HexToAddress(os.Getenv("GUARDIAN_PROVER_CONTRACT_ADDRESS")) + s.p.cfg.GuardianProverMajorityAddress = common.HexToAddress(os.Getenv("GUARDIAN_PROVER_CONTRACT")) s.True(s.p.IsGuardianProver()) submitter := s.p.getSubmitterByTier(encoding.TierGuardianMajorityID) @@ -391,14 +343,13 @@ func (s *ProverTestSuite) TestGetSubmitterByTier() { } func (s *ProverTestSuite) TestProveOp() { - s.T().Skip("Skipping, preconfer changes") - e := s.ProposeAndInsertValidBlock(s.proposer, s.d.ChainSyncer().BlobSyncer()) - sink := make(chan *bindings.TaikoL1ClientTransitionProved) + m := s.ProposeAndInsertValidBlock(s.proposer, s.d.ChainSyncer().BlobSyncer()) - header, err := s.p.rpc.L2.HeaderByNumber(context.Background(), e.BlockId) + header, err := s.p.rpc.L2.HeaderByNumber(context.Background(), m.GetBlockID()) s.Nil(err) - sub, err := s.p.rpc.TaikoL1.WatchTransitionProved(nil, sink, nil) + sink := make(chan *bindings.TaikoL1ClientTransitionProvedV2) + sub, err := s.p.rpc.TaikoL1.WatchTransitionProvedV2(nil, sink, nil) s.Nil(err) defer func() { sub.Unsubscribe() @@ -407,13 +358,13 @@ func (s *ProverTestSuite) TestProveOp() { s.Nil(s.p.proveOp()) req := <-s.p.proofSubmissionCh - s.Nil(s.p.requestProofOp(req.Event, req.Tier)) - s.Nil(s.p.selectSubmitter(e.Meta.MinTier).SubmitProof(context.Background(), <-s.p.proofGenerationCh)) + s.Nil(s.p.requestProofOp(req.Meta, req.Tier)) + s.Nil(s.p.selectSubmitter(m.GetMinTier()).SubmitProof(context.Background(), <-s.p.proofGenerationCh)) event := <-sink - s.Equal(header.Number.Uint64(), event.BlockId.Uint64()) - s.Equal(header.Hash(), common.BytesToHash(event.Tran.BlockHash[:])) - s.Equal(header.ParentHash, common.BytesToHash(event.Tran.ParentHash[:])) + tran := event.Tran + s.Equal(header.Hash(), common.BytesToHash(tran.BlockHash[:])) + s.Equal(header.ParentHash, common.BytesToHash(tran.ParentHash[:])) } func (s *ProverTestSuite) TestGetBlockProofStatus() { @@ -421,10 +372,16 @@ func (s *ProverTestSuite) TestGetBlockProofStatus() { parent, err := s.p.rpc.L2.HeaderByNumber(context.Background(), nil) s.Nil(err) - e := s.ProposeAndInsertValidBlock(s.proposer, s.d.ChainSyncer().BlobSyncer()) + m := s.ProposeAndInsertValidBlock(s.proposer, s.d.ChainSyncer().BlobSyncer()) // No proof submitted - status, err := rpc.GetBlockProofStatus(context.Background(), s.p.rpc, e.BlockId, s.p.ProverAddress(), rpc.ZeroAddress) + status, err := rpc.GetBlockProofStatus( + context.Background(), + s.p.rpc, + m.GetBlockID(), + s.p.ProverAddress(), + rpc.ZeroAddress, + ) s.Nil(err) s.False(status.IsSubmitted) @@ -440,44 +397,171 @@ func (s *ProverTestSuite) TestGetBlockProofStatus() { s.Nil(s.p.proveOp()) req := <-s.p.proofSubmissionCh - s.Nil(s.p.requestProofOp(req.Event, req.Tier)) - s.Nil(s.p.selectSubmitter(e.Meta.MinTier).SubmitProof(context.Background(), <-s.p.proofGenerationCh)) + s.Nil(s.p.requestProofOp(req.Meta, req.Tier)) + s.Nil(s.p.selectSubmitter(m.GetMinTier()).SubmitProof(context.Background(), <-s.p.proofGenerationCh)) - status, err = rpc.GetBlockProofStatus(context.Background(), s.p.rpc, e.BlockId, s.p.ProverAddress(), rpc.ZeroAddress) + status, err = rpc.GetBlockProofStatus( + context.Background(), + s.p.rpc, + m.GetBlockID(), + s.p.ProverAddress(), + rpc.ZeroAddress, + ) s.Nil(err) s.True(status.IsSubmitted) s.False(status.Invalid) s.Equal(parent.Hash(), status.ParentHeader.Hash()) - s.Equal(common.HexToAddress(os.Getenv("PROVER_SET_ADDRESS")), status.CurrentTransitionState.Prover) // Invalid proof submitted parent, err = s.p.rpc.L2.HeaderByNumber(context.Background(), nil) s.Nil(err) - e = s.ProposeAndInsertValidBlock(s.proposer, s.d.ChainSyncer().BlobSyncer()) + m = s.ProposeAndInsertValidBlock(s.proposer, s.d.ChainSyncer().BlobSyncer()) - status, err = rpc.GetBlockProofStatus(context.Background(), s.p.rpc, e.BlockId, s.p.ProverAddress(), rpc.ZeroAddress) + status, err = rpc.GetBlockProofStatus( + context.Background(), + s.p.rpc, + m.GetBlockID(), + s.p.ProverAddress(), + rpc.ZeroAddress, + ) s.Nil(err) s.False(status.IsSubmitted) s.Nil(s.p.proveOp()) req = <-s.p.proofSubmissionCh - s.Nil(s.p.requestProofOp(req.Event, req.Tier)) + s.Nil(s.p.requestProofOp(req.Meta, req.Tier)) proofWithHeader := <-s.p.proofGenerationCh proofWithHeader.Opts.BlockHash = testutils.RandomHash() - s.Nil(s.p.selectSubmitter(e.Meta.MinTier).SubmitProof(context.Background(), proofWithHeader)) + s.Nil(s.p.selectSubmitter(m.GetMinTier()).SubmitProof(context.Background(), proofWithHeader)) - status, err = rpc.GetBlockProofStatus(context.Background(), s.p.rpc, e.BlockId, s.p.ProverAddress(), rpc.ZeroAddress) + status, err = rpc.GetBlockProofStatus( + context.Background(), + s.p.rpc, + m.GetBlockID(), + s.p.ProverAddress(), + rpc.ZeroAddress, + ) s.Nil(err) s.True(status.IsSubmitted) s.True(status.Invalid) s.Equal(parent.Hash(), status.ParentHeader.Hash()) - s.Equal(common.HexToAddress(os.Getenv("PROVER_SET_ADDRESS")), status.CurrentTransitionState.Prover) s.Equal(proofWithHeader.Opts.BlockHash, common.BytesToHash(status.CurrentTransitionState.BlockHash[:])) } +func (s *ProverTestSuite) TestAggregateProofsAlreadyProved() { + batchSize := 2 + // Init batch prover + l1ProverPrivKey, err := crypto.ToECDSA(common.FromHex(os.Getenv("L1_PROVER_PRIVATE_KEY"))) + s.Nil(err) + decimal, err := s.RPCClient.TaikoToken.Decimals(nil) + s.Nil(err) + batchProver := new(Prover) + s.Nil(InitFromConfig(context.Background(), batchProver, &Config{ + L1WsEndpoint: os.Getenv("L1_WS"), + L2WsEndpoint: os.Getenv("L2_WS"), + L2HttpEndpoint: os.Getenv("L2_HTTP"), + TaikoL1Address: common.HexToAddress(os.Getenv("TAIKO_L1")), + TaikoL2Address: common.HexToAddress(os.Getenv("TAIKO_L2")), + TaikoTokenAddress: common.HexToAddress(os.Getenv("TAIKO_TOKEN")), + L1ProverPrivKey: l1ProverPrivKey, + Dummy: true, + ProveUnassignedBlocks: true, + Allowance: new(big.Int).Exp(big.NewInt(1_000_000_100), new(big.Int).SetUint64(uint64(decimal)), nil), + RPCTimeout: 3 * time.Second, + BackOffRetryInterval: 3 * time.Second, + BackOffMaxRetries: 12, + L1NodeVersion: "1.0.0", + L2NodeVersion: "0.1.0", + SGXProofBufferSize: uint64(batchSize), + }, s.txmgr, s.txmgr)) + + for i := 0; i < batchSize; i++ { + _ = s.ProposeAndInsertValidBlock(s.proposer, s.d.ChainSyncer().BlobSyncer()) + } + + sink := make(chan *bindings.TaikoL1ClientTransitionProvedV2, batchSize) + sub, err := s.p.rpc.TaikoL1.WatchTransitionProvedV2(nil, sink, nil) + s.Nil(err) + defer func() { + sub.Unsubscribe() + close(sink) + }() + + s.Nil(s.p.proveOp()) + s.Nil(batchProver.proveOp()) + for i := 0; i < batchSize; i++ { + req1 := <-s.p.proofSubmissionCh + s.Nil(s.p.requestProofOp(req1.Meta, req1.Tier)) + req2 := <-batchProver.proofSubmissionCh + s.Nil(batchProver.requestProofOp(req2.Meta, req2.Tier)) + s.Nil(s.p.selectSubmitter(req1.Tier).SubmitProof(context.Background(), <-s.p.proofGenerationCh)) + } + tier := <-batchProver.aggregationNotify + s.Nil(batchProver.aggregateOp(tier)) + s.ErrorIs( + batchProver.selectSubmitter(tier).BatchSubmitProofs(context.Background(), <-batchProver.batchProofGenerationCh), + proofSubmitter.ErrInvalidProof, + ) + for i := 0; i < batchSize; i++ { + <-sink + } +} + +func (s *ProverTestSuite) TestAggregateProofs() { + batchSize := 2 + // Init batch prover + l1ProverPrivKey, err := crypto.ToECDSA(common.FromHex(os.Getenv("L1_PROVER_PRIVATE_KEY"))) + s.Nil(err) + decimal, err := s.RPCClient.TaikoToken.Decimals(nil) + s.Nil(err) + batchProver := new(Prover) + s.Nil(InitFromConfig(context.Background(), batchProver, &Config{ + L1WsEndpoint: os.Getenv("L1_WS"), + L2WsEndpoint: os.Getenv("L2_WS"), + L2HttpEndpoint: os.Getenv("L2_HTTP"), + TaikoL1Address: common.HexToAddress(os.Getenv("TAIKO_L1")), + TaikoL2Address: common.HexToAddress(os.Getenv("TAIKO_L2")), + TaikoTokenAddress: common.HexToAddress(os.Getenv("TAIKO_TOKEN")), + L1ProverPrivKey: l1ProverPrivKey, + Dummy: true, + ProveUnassignedBlocks: true, + Allowance: new(big.Int).Exp(big.NewInt(1_000_000_100), new(big.Int).SetUint64(uint64(decimal)), nil), + RPCTimeout: 3 * time.Second, + BackOffRetryInterval: 3 * time.Second, + BackOffMaxRetries: 12, + L1NodeVersion: "1.0.0", + L2NodeVersion: "0.1.0", + SGXProofBufferSize: uint64(batchSize), + }, s.txmgr, s.txmgr)) + + for i := 0; i < batchSize; i++ { + _ = s.ProposeAndInsertValidBlock(s.proposer, s.d.ChainSyncer().BlobSyncer()) + } + + sink := make(chan *bindings.TaikoL1ClientTransitionProvedV2, batchSize) + sub, err := s.p.rpc.TaikoL1.WatchTransitionProvedV2(nil, sink, nil) + s.Nil(err) + defer func() { + sub.Unsubscribe() + close(sink) + }() + + s.Nil(batchProver.proveOp()) + for i := 0; i < batchSize; i++ { + req := <-batchProver.proofSubmissionCh + s.Nil(batchProver.requestProofOp(req.Meta, req.Tier)) + } + tier := <-batchProver.aggregationNotify + s.Nil(batchProver.aggregateOp(tier)) + s.Nil(batchProver.selectSubmitter(tier).BatchSubmitProofs(context.Background(), <-batchProver.batchProofGenerationCh)) + for i := 0; i < batchSize; i++ { + <-sink + } +} + func (s *ProverTestSuite) TestSetApprovalAlreadySetHigher() { originalAllowance, err := s.p.rpc.TaikoToken.Allowance(&bind.CallOpts{}, s.p.ProverAddress(), s.p.cfg.TaikoL1Address) s.Nil(err) @@ -505,58 +589,28 @@ func TestProverTestSuite(t *testing.T) { func (s *ProverTestSuite) initProver( ctx context.Context, key *ecdsa.PrivateKey, -) *url.URL { - proverServerURL := testutils.LocalRandomProverEndpoint() - port, err := strconv.Atoi(proverServerURL.Port()) - s.Nil(err) - +) { decimal, err := s.RPCClient.TaikoToken.Decimals(nil) s.Nil(err) p := new(Prover) s.Nil(InitFromConfig(ctx, p, &Config{ - L1WsEndpoint: os.Getenv("L1_NODE_WS_ENDPOINT"), - L1HttpEndpoint: os.Getenv("L1_NODE_HTTP_ENDPOINT"), - L2WsEndpoint: os.Getenv("L2_EXECUTION_ENGINE_WS_ENDPOINT"), - L2HttpEndpoint: os.Getenv("L2_EXECUTION_ENGINE_HTTP_ENDPOINT"), - TaikoL1Address: common.HexToAddress(os.Getenv("TAIKO_L1_ADDRESS")), - TaikoL2Address: common.HexToAddress(os.Getenv("TAIKO_L2_ADDRESS")), - TaikoTokenAddress: common.HexToAddress(os.Getenv("TAIKO_TOKEN_ADDRESS")), - AssignmentHookAddress: common.HexToAddress(os.Getenv("ASSIGNMENT_HOOK_ADDRESS")), - ProverSetAddress: common.HexToAddress(os.Getenv("PROVER_SET_ADDRESS")), + L1WsEndpoint: os.Getenv("L1_WS"), + L2WsEndpoint: os.Getenv("L2_WS"), + L2HttpEndpoint: os.Getenv("L2_HTTP"), + TaikoL1Address: common.HexToAddress(os.Getenv("TAIKO_L1")), + TaikoL2Address: common.HexToAddress(os.Getenv("TAIKO_L2")), + TaikoTokenAddress: common.HexToAddress(os.Getenv("TAIKO_TOKEN")), L1ProverPrivKey: key, Dummy: true, ProveUnassignedBlocks: true, - Capacity: 1024, - MinOptimisticTierFee: common.Big1, - MinSgxTierFee: common.Big1, - HTTPServerPort: uint64(port), Allowance: new(big.Int).Exp(big.NewInt(1_000_000_100), new(big.Int).SetUint64(uint64(decimal)), nil), RPCTimeout: 3 * time.Second, BackOffRetryInterval: 3 * time.Second, BackOffMaxRetries: 12, L1NodeVersion: "1.0.0", L2NodeVersion: "0.1.0", - TxmgrConfigs: &txmgr.CLIConfig{ - L1RPCURL: os.Getenv("L1_NODE_WS_ENDPOINT"), - NumConfirmations: 0, - SafeAbortNonceTooLowCount: txmgr.DefaultBatcherFlagValues.SafeAbortNonceTooLowCount, - PrivateKey: common.Bytes2Hex(crypto.FromECDSA(key)), - FeeLimitMultiplier: txmgr.DefaultBatcherFlagValues.FeeLimitMultiplier, - FeeLimitThresholdGwei: txmgr.DefaultBatcherFlagValues.FeeLimitThresholdGwei, - MinBaseFeeGwei: txmgr.DefaultBatcherFlagValues.MinBaseFeeGwei, - MinTipCapGwei: txmgr.DefaultBatcherFlagValues.MinTipCapGwei, - ResubmissionTimeout: txmgr.DefaultBatcherFlagValues.ResubmissionTimeout, - ReceiptQueryInterval: 1 * time.Second, - NetworkTimeout: txmgr.DefaultBatcherFlagValues.NetworkTimeout, - TxSendTimeout: txmgr.DefaultBatcherFlagValues.TxSendTimeout, - TxNotInMempoolTimeout: txmgr.DefaultBatcherFlagValues.TxNotInMempoolTimeout, - }, - })) - p.server = s.NewTestProverServer( - key, - proverServerURL, - ) + }, s.txmgr, s.txmgr)) p.guardianProverHeartbeater = guardianProverHeartbeater.New( key, @@ -565,6 +619,4 @@ func (s *ProverTestSuite) initProver( p.ProverAddress(), ) s.p = p - - return proverServerURL } diff --git a/packages/taiko-client/prover/server/api.go b/packages/taiko-client/prover/server/api.go deleted file mode 100644 index 5e305ad4bba..00000000000 --- a/packages/taiko-client/prover/server/api.go +++ /dev/null @@ -1,301 +0,0 @@ -package server - -import ( - "context" - "math/big" - "net/http" - "time" - - "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/log" - "github.com/labstack/echo/v4" - - "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/encoding" - "github.com/taikoxyz/taiko-mono/packages/taiko-client/internal/utils" - "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/rpc" -) - -const ( - rpcTimeout = 1 * time.Minute -) - -// @title Taiko Prover Server API -// @version 1.0 -// @termsOfService http://swagger.io/terms/ - -// @contact.name API Support -// @contact.url https://community.taiko.xyz/ -// @contact.email info@taiko.xyz - -// @license.name MIT -// @license.url https://github.com/taikoxyz/taiko-mono/packages/taiko-client/blob/main/LICENSE.md - -// CreateAssignmentRequestBody represents a request body when handling assignment creation request. -type CreateAssignmentRequestBody struct { - Proposer common.Address `json:"proposer"` - FeeToken common.Address `json:"feeToken"` - TierFees []encoding.TierFee `json:"tierFees"` - Expiry uint64 `json:"expiry"` - BlobHash common.Hash `json:"blobHash"` -} - -// Status represents the current prover server status. -type Status struct { - MinOptimisticTierFee uint64 `json:"minOptimisticTierFee"` - MinSgxTierFee uint64 `json:"minSgxTierFee"` - MinSgxAndZkVMTierFee uint64 `json:"minSgxAndZkVMTierFee"` - MaxExpiry uint64 `json:"maxExpiry"` - Prover string `json:"prover"` -} - -// GetStatus handles a query to the current prover server status. -// -// @Summary Get current prover server status -// @ID get-status -// @Accept json -// @Produce json -// @Success 200 {object} Status -// @Router /status [get] -func (s *ProverServer) GetStatus(c echo.Context) error { - return c.JSON(http.StatusOK, &Status{ - MinOptimisticTierFee: s.minOptimisticTierFee.Uint64(), - MinSgxTierFee: s.minSgxTierFee.Uint64(), - MinSgxAndZkVMTierFee: s.minSgxAndZkVMTierFee.Uint64(), - MaxExpiry: uint64(s.maxExpiry.Seconds()), - Prover: s.proverAddress.Hex(), - }) -} - -// ProposeBlockResponse represents the JSON response which will be returned by -// the ProposeBlock request handler. -type ProposeBlockResponse struct { - SignedPayload []byte `json:"signedPayload"` - Prover common.Address `json:"prover"` - MaxBlockID uint64 `json:"maxBlockID"` - MaxProposedIn uint64 `json:"maxProposedIn"` -} - -// CreateAssignment handles a block proof assignment request, decides if this prover wants to -// handle this block, and if so, returns a signed payload the proposer -// can submit onchain. -// -// @Summary Try to accept a block proof assignment -// @Param body body server.CreateAssignmentRequestBody true "assignment request body" -// @Accept json -// @Produce json -// @Success 200 {object} ProposeBlockResponse -// @Failure 422 {string} string "empty blob hash" -// @Failure 422 {string} string "only receive ETH" -// @Failure 422 {string} string "insufficient prover balance" -// @Failure 422 {string} string "proof fee too low" -// @Failure 422 {string} string "expiry too long" -// @Failure 422 {string} string "prover does not have capacity" -// @Router /assignment [post] -func (s *ProverServer) CreateAssignment(c echo.Context) error { - req := new(CreateAssignmentRequestBody) - if err := c.Bind(req); err != nil { - return c.JSON(http.StatusUnprocessableEntity, err) - } - - log.Info( - "Proof assignment request body", - "feeToken", req.FeeToken, - "expiry", req.Expiry, - "tierFees", req.TierFees, - "blobHash", req.BlobHash, - "currentUsedCapacity", len(s.proofSubmissionCh), - ) - - // If the prover set address is set, use it as the prover address. - prover := s.proverAddress - if s.proverSetAddress != rpc.ZeroAddress { - prover = s.proverSetAddress - } - - // 1. Check if the request body is valid. - if req.BlobHash == (common.Hash{}) { - log.Warn("Empty blob hash", "prover", s.proverAddress) - return echo.NewHTTPError(http.StatusUnprocessableEntity, "empty blob hash") - } - if req.FeeToken != (common.Address{}) { - log.Warn("Only receive ETH", "prover", s.proverAddress) - return echo.NewHTTPError(http.StatusUnprocessableEntity, "only receive ETH") - } - - // 2. Check if the prover has the required minimum on-chain ETH and Taiko token balance. - ok, err := s.checkMinEthAndToken(c.Request().Context(), prover) - if err != nil { - log.Error("Failed to check prover's ETH and Taiko token balance", "error", err) - return echo.NewHTTPError(http.StatusInternalServerError, err) - } - - if !ok { - log.Error("Insufficient prover balance", "prover", s.proverAddress) - return echo.NewHTTPError(http.StatusUnprocessableEntity, "insufficient prover balance") - } - - // 3. Check if the prover's token balance is enough to cover the bonds. - if ok, err = rpc.CheckProverBalance( - c.Request().Context(), - s.rpc, - prover, - s.assignmentHookAddress, - s.livenessBond, - ); err != nil { - log.Error("Failed to check prover's token balance", "error", err) - return echo.NewHTTPError(http.StatusInternalServerError, err) - } - if !ok { - log.Warn( - "Insufficient prover token balance, please get more tokens or wait for verification of the blocks you proved", - "prover", s.proverAddress, - ) - return echo.NewHTTPError(http.StatusUnprocessableEntity, "insufficient prover balance") - } - - // 4. Check if the proof fee meets prover's minimum requirement for each tier. - for _, tier := range req.TierFees { - if tier.Tier == encoding.TierGuardianMajorityID { - continue - } - - if tier.Tier == encoding.TierGuardianMinorityID { - continue - } - - var minTierFee *big.Int - switch tier.Tier { - case encoding.TierOptimisticID: - minTierFee = s.minOptimisticTierFee - case encoding.TierSgxID: - minTierFee = s.minSgxTierFee - case encoding.TierSgxAndZkVMID: - minTierFee = s.minSgxAndZkVMTierFee - default: - log.Warn("Unknown tier", "tier", tier.Tier, "fee", tier.Fee, "proposerIP", c.RealIP()) - return echo.NewHTTPError(http.StatusUnprocessableEntity, "unknown tier") - } - - if tier.Fee.Cmp(minTierFee) < 0 { - log.Warn( - "Proof fee too low", - "tier", tier.Tier, - "fee", tier.Fee, - "minTierFee", minTierFee, - "proposerIP", c.RealIP(), - ) - return echo.NewHTTPError(http.StatusUnprocessableEntity, "proof fee too low") - } - } - - // 5. Check if the expiry is too long. - if req.Expiry > uint64(time.Now().Add(s.maxExpiry).Unix()) { - log.Warn( - "Expiry too long", - "requestExpiry", req.Expiry, - "srvMaxExpiry", s.maxExpiry, - "proposerIP", c.RealIP(), - ) - return echo.NewHTTPError(http.StatusUnprocessableEntity, "expiry too long") - } - - // 6. Check if the prover has any capacity now. - if s.proofSubmissionCh != nil && len(s.proofSubmissionCh) == cap(s.proofSubmissionCh) { - log.Warn("Prover does not have capacity", "capacity", cap(s.proofSubmissionCh)) - return echo.NewHTTPError(http.StatusUnprocessableEntity, "prover does not have capacity") - } - - // 7. Encode and sign the prover assignment payload. - l1Head, err := s.rpc.L1.BlockNumber(c.Request().Context()) - if err != nil { - log.Error("Failed to get L1 block head", "error", err) - return echo.NewHTTPError(http.StatusUnprocessableEntity, err) - } - - encoded, err := encoding.EncodeProverAssignmentPayload( - s.protocolConfigs.ChainId, - s.taikoL1Address, - s.assignmentHookAddress, - req.Proposer, - prover, - req.BlobHash, - req.FeeToken, - req.Expiry, - l1Head+s.maxSlippage, - s.maxProposedIn, - req.TierFees, - ) - if err != nil { - log.Error("Failed to encode proverAssignment payload data", "error", err) - return echo.NewHTTPError(http.StatusUnprocessableEntity, err) - } - - signed, err := crypto.Sign(crypto.Keccak256Hash(encoded).Bytes(), s.proverPrivateKey) - if err != nil { - return echo.NewHTTPError(http.StatusInternalServerError, err) - } - - // 8. Return the signed payload. - return c.JSON(http.StatusOK, &ProposeBlockResponse{ - SignedPayload: signed, - Prover: prover, - MaxBlockID: l1Head + s.maxSlippage, - MaxProposedIn: s.maxProposedIn, - }) -} - -// checkMinEthAndToken checks if the prover has the required minimum on-chain Taiko token balance. -func (s *ProverServer) checkMinEthAndToken(ctx context.Context, proverAddress common.Address) (bool, error) { - ctx, cancel := context.WithTimeout(ctx, rpcTimeout) - defer cancel() - - // 1. Check prover's ETH balance, if it's using proverSet. - if proverAddress == s.proverAddress { - ethBalance, err := s.rpc.L1.BalanceAt(ctx, proverAddress, nil) - if err != nil { - return false, err - } - - log.Info( - "Prover's ETH balance", - "balance", utils.WeiToEther(ethBalance), - "address", proverAddress, - ) - - if ethBalance.Cmp(s.minEthBalance) <= 0 { - log.Warn( - "Prover does not have required minimum on-chain ETH balance", - "providedProver", proverAddress, - "ethBalance", utils.WeiToEther(ethBalance), - "minEthBalance", utils.WeiToEther(s.minEthBalance), - ) - return false, nil - } - } - - // 2. Check prover's Taiko token balance. - balance, err := s.rpc.TaikoToken.BalanceOf(&bind.CallOpts{Context: ctx}, proverAddress) - if err != nil { - return false, err - } - - log.Info( - "Prover's Taiko token balance", - "balance", utils.WeiToEther(balance), - "address", proverAddress, - ) - - if balance.Cmp(s.minTaikoTokenBalance) <= 0 { - log.Warn( - "Prover does not have required on-chain Taiko token balance", - "providedProver", proverAddress, - "taikoTokenBalance", utils.WeiToEther(balance), - "minTaikoTokenBalance", utils.WeiToEther(s.minTaikoTokenBalance), - ) - return false, nil - } - - return true, nil -} diff --git a/packages/taiko-client/prover/server/api_test.go b/packages/taiko-client/prover/server/api_test.go deleted file mode 100644 index 7f72c1a2f00..00000000000 --- a/packages/taiko-client/prover/server/api_test.go +++ /dev/null @@ -1,50 +0,0 @@ -package server - -import ( - "encoding/json" - "io" - "net/http" - "strings" - "time" - - "github.com/ethereum/go-ethereum/common" - - "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings/encoding" -) - -func (s *ProverServerTestSuite) TestGetStatusSuccess() { - res := s.sendReq("/status") - s.Equal(http.StatusOK, res.StatusCode) - - status := new(Status) - - defer res.Body.Close() - b, err := io.ReadAll(res.Body) - s.Nil(err) - s.Nil(json.Unmarshal(b, &status)) - - s.Equal(s.s.minOptimisticTierFee.Uint64(), status.MinOptimisticTierFee) - s.Equal(s.s.minSgxTierFee.Uint64(), status.MinSgxTierFee) - s.Equal(uint64(s.s.maxExpiry.Seconds()), status.MaxExpiry) - s.NotEmpty(status.Prover) -} - -func (s *ProverServerTestSuite) TestProposeBlockSuccess() { - data, err := json.Marshal(CreateAssignmentRequestBody{ - FeeToken: (common.Address{}), - TierFees: []encoding.TierFee{ - {Tier: encoding.TierOptimisticID, Fee: common.Big256}, - {Tier: encoding.TierSgxID, Fee: common.Big256}, - }, - Expiry: uint64(time.Now().Add(time.Minute).Unix()), - BlobHash: common.BigToHash(common.Big1), - }) - s.Nil(err) - res, err := http.Post(s.testServer.URL+"/assignment", "application/json", strings.NewReader(string(data))) - s.Nil(err) - s.Equal(http.StatusOK, res.StatusCode) - defer res.Body.Close() - b, err := io.ReadAll(res.Body) - s.Nil(err) - s.Contains(string(b), "signedPayload") -} diff --git a/packages/taiko-client/prover/server/server.go b/packages/taiko-client/prover/server/server.go deleted file mode 100644 index a996a81d0d1..00000000000 --- a/packages/taiko-client/prover/server/server.go +++ /dev/null @@ -1,148 +0,0 @@ -package server - -import ( - "context" - "crypto/ecdsa" - "math/big" - "net/http" - "os" - "time" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/crypto" - "github.com/labstack/echo/v4" - "github.com/labstack/echo/v4/middleware" - - "github.com/taikoxyz/taiko-mono/packages/taiko-client/bindings" - "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/rpc" - proofProducer "github.com/taikoxyz/taiko-mono/packages/taiko-client/prover/proof_producer" -) - -// @title Taiko Prover Server API -// @version 1.0 -// @termsOfService http://swagger.io/terms/ - -// @contact.name API Support -// @contact.url https://community.taiko.xyz/ -// @contact.email info@taiko.xyz - -// @license.name MIT -// @license.url https://github.com/taikoxyz/taiko-mono/blob/main/LICENSE.md -// ProverServer represents a prover server instance. -type ProverServer struct { - echo *echo.Echo - proverPrivateKey *ecdsa.PrivateKey - proverAddress common.Address - proverSetAddress common.Address - minOptimisticTierFee *big.Int - minSgxTierFee *big.Int - minSgxAndZkVMTierFee *big.Int - minEthBalance *big.Int - minTaikoTokenBalance *big.Int - maxExpiry time.Duration - maxSlippage uint64 - maxProposedIn uint64 - taikoL1Address common.Address - assignmentHookAddress common.Address - proofSubmissionCh chan<- proofProducer.ProofRequestBody - rpc *rpc.Client - protocolConfigs *bindings.TaikoDataConfig - livenessBond *big.Int -} - -// NewProverServerOpts contains all configurations for creating a prover server instance. -type NewProverServerOpts struct { - ProverPrivateKey *ecdsa.PrivateKey - ProverSetAddress common.Address - MinOptimisticTierFee *big.Int - MinSgxTierFee *big.Int - MinSgxAndZkVMTierFee *big.Int - MinEthBalance *big.Int - MinTaikoTokenBalance *big.Int - MaxExpiry time.Duration - MaxBlockSlippage uint64 - MaxProposedIn uint64 - TaikoL1Address common.Address - AssignmentHookAddress common.Address - ProofSubmissionCh chan<- proofProducer.ProofRequestBody - RPC *rpc.Client - ProtocolConfigs *bindings.TaikoDataConfig - LivenessBond *big.Int -} - -// New creates a new prover server instance. -func New(opts *NewProverServerOpts) (*ProverServer, error) { - srv := &ProverServer{ - proverPrivateKey: opts.ProverPrivateKey, - proverAddress: crypto.PubkeyToAddress(opts.ProverPrivateKey.PublicKey), - proverSetAddress: opts.ProverSetAddress, - echo: echo.New(), - minOptimisticTierFee: opts.MinOptimisticTierFee, - minSgxTierFee: opts.MinSgxTierFee, - minSgxAndZkVMTierFee: opts.MinSgxAndZkVMTierFee, - minEthBalance: opts.MinEthBalance, - minTaikoTokenBalance: opts.MinTaikoTokenBalance, - maxExpiry: opts.MaxExpiry, - maxProposedIn: opts.MaxProposedIn, - maxSlippage: opts.MaxBlockSlippage, - taikoL1Address: opts.TaikoL1Address, - assignmentHookAddress: opts.AssignmentHookAddress, - proofSubmissionCh: opts.ProofSubmissionCh, - rpc: opts.RPC, - protocolConfigs: opts.ProtocolConfigs, - livenessBond: opts.LivenessBond, - } - - srv.echo.HideBanner = true - srv.configureMiddleware() - srv.configureRoutes() - - return srv, nil -} - -// Start starts the HTTP server. -func (s *ProverServer) Start(address string) error { - return s.echo.Start(address) -} - -// Shutdown shuts down the HTTP server. -func (s *ProverServer) Shutdown(ctx context.Context) error { - return s.echo.Shutdown(ctx) -} - -// Health endpoints for probes. -func (s *ProverServer) Health(c echo.Context) error { - return c.NoContent(http.StatusOK) -} - -// LogSkipper implements the `middleware.Skipper` interface. -func LogSkipper(c echo.Context) bool { - switch c.Request().URL.Path { - case "/healthz": - return true - default: - return true - } -} - -// configureMiddleware configures the server middlewares. -func (s *ProverServer) configureMiddleware() { - s.echo.Use(middleware.RequestID()) - - s.echo.Use(middleware.LoggerWithConfig(middleware.LoggerConfig{ - Skipper: LogSkipper, - Format: `{"time":"${time_rfc3339_nano}","level":"INFO","message":{"id":"${id}","remote_ip":"${remote_ip}",` + - `"host":"${host}","method":"${method}","uri":"${uri}","user_agent":"${user_agent}",` + - `"response_status":${status},"error":"${error}","latency":${latency},"latency_human":"${latency_human}",` + - `"bytes_in":${bytes_in},"bytes_out":${bytes_out}}}` + "\n", - Output: os.Stdout, - })) -} - -// configureRoutes contains all routes which will be used by prover server. -func (s *ProverServer) configureRoutes() { - s.echo.GET("/", s.Health) - s.echo.GET("/healthz", s.Health) - s.echo.GET("/status", s.GetStatus) - s.echo.POST("/assignment", s.CreateAssignment) -} diff --git a/packages/taiko-client/prover/server/server_test.go b/packages/taiko-client/prover/server/server_test.go deleted file mode 100644 index 37907b2f7d8..00000000000 --- a/packages/taiko-client/prover/server/server_test.go +++ /dev/null @@ -1,128 +0,0 @@ -package server - -import ( - "context" - "fmt" - "net/http" - "net/http/httptest" - "net/url" - "os" - "testing" - "time" - - "github.com/cenkalti/backoff/v4" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/log" - "github.com/go-resty/resty/v2" - "github.com/phayes/freeport" - "github.com/stretchr/testify/suite" - - "github.com/taikoxyz/taiko-mono/packages/taiko-client/pkg/rpc" - proofProducer "github.com/taikoxyz/taiko-mono/packages/taiko-client/prover/proof_producer" -) - -type ProverServerTestSuite struct { - suite.Suite - s *ProverServer - testServer *httptest.Server -} - -func (s *ProverServerTestSuite) SetupTest() { - l1ProverPrivKey, err := crypto.ToECDSA(common.FromHex(os.Getenv("L1_PROVER_PRIVATE_KEY"))) - s.Nil(err) - - rpcClient, err := rpc.NewClient(context.Background(), &rpc.ClientConfig{ - L1Endpoint: os.Getenv("L1_NODE_WS_ENDPOINT"), - L2Endpoint: os.Getenv("L2_EXECUTION_ENGINE_WS_ENDPOINT"), - TaikoL1Address: common.HexToAddress(os.Getenv("TAIKO_L1_ADDRESS")), - TaikoL2Address: common.HexToAddress(os.Getenv("TAIKO_L2_ADDRESS")), - TaikoTokenAddress: common.HexToAddress(os.Getenv("TAIKO_TOKEN_ADDRESS")), - ProverSetAddress: common.HexToAddress(os.Getenv("PROVER_SET_ADDRESS")), - L2EngineEndpoint: os.Getenv("L2_EXECUTION_ENGINE_AUTH_ENDPOINT"), - JwtSecret: os.Getenv("JWT_SECRET"), - Timeout: 5 * time.Second, - }) - s.Nil(err) - - configs, err := rpcClient.TaikoL1.GetConfig(nil) - s.Nil(err) - - p, err := New(&NewProverServerOpts{ - ProverPrivateKey: l1ProverPrivKey, - MinOptimisticTierFee: common.Big1, - MinSgxTierFee: common.Big1, - MinSgxAndZkVMTierFee: common.Big1, - MinEthBalance: common.Big1, - MinTaikoTokenBalance: common.Big1, - MaxExpiry: time.Hour, - ProofSubmissionCh: make(chan<- proofProducer.ProofRequestBody, 1024), - TaikoL1Address: common.HexToAddress(os.Getenv("TAIKO_L1_ADDRESS")), - AssignmentHookAddress: common.HexToAddress(os.Getenv("ASSIGNMENT_HOOK_ADDRESS")), - RPC: rpcClient, - ProtocolConfigs: &configs, - LivenessBond: common.Big0, - }) - s.Nil(err) - - p.echo.HideBanner = true - p.configureMiddleware() - p.configureRoutes() - s.s = p - s.testServer = httptest.NewServer(p.echo) -} - -func (s *ProverServerTestSuite) TestHealth() { - resp := s.sendReq("/healthz") - defer resp.Body.Close() - s.Equal(http.StatusOK, resp.StatusCode) -} - -func (s *ProverServerTestSuite) TestRoot() { - resp := s.sendReq("/") - defer resp.Body.Close() - s.Equal(http.StatusOK, resp.StatusCode) -} - -func (s *ProverServerTestSuite) TestStartShutdown() { - port, err := freeport.GetFreePort() - s.Nil(err) - - url, err := url.Parse(fmt.Sprintf("http://localhost:%v", port)) - s.Nil(err) - - go func() { - if err := s.s.Start(fmt.Sprintf(":%v", port)); err != nil { - log.Error("Failed to start prover server", "error", err) - } - }() - - // Wait till the server fully started. - s.Nil(backoff.Retry(func() error { - res, err := resty.New().R().Get(url.String() + "/healthz") - if err != nil { - return err - } - if !res.IsSuccess() { - return fmt.Errorf("invalid response status code: %d", res.StatusCode()) - } - - return nil - }, backoff.NewExponentialBackOff())) - - s.Nil(s.s.Shutdown(context.Background())) -} - -func (s *ProverServerTestSuite) TearDownTest() { - s.testServer.Close() -} - -func TestProverServerTestSuite(t *testing.T) { - suite.Run(t, new(ProverServerTestSuite)) -} - -func (s *ProverServerTestSuite) sendReq(path string) *http.Response { - res, err := http.Get(s.testServer.URL + path) - s.Nil(err) - return res -} diff --git a/packages/taiko-client/scripts/gen_bindings.sh b/packages/taiko-client/scripts/gen_bindings.sh index b577b6294db..6848dde2e5c 100755 --- a/packages/taiko-client/scripts/gen_bindings.sh +++ b/packages/taiko-client/scripts/gen_bindings.sh @@ -26,55 +26,51 @@ echo "" echo "Start generating go contract bindings..." echo "" -cat ../protocol/out/TaikoL1.sol/TaikoL1.json | +cat ../protocol/out/layer1/TaikoL1.sol/TaikoL1.json | jq .abi | ${ABIGEN_BIN} --abi - --type TaikoL1Client --pkg bindings --out $DIR/../bindings/gen_taiko_l1.go -cat ../protocol/out/LibProving.sol/LibProving.json | +cat ../protocol/out/layer1/LibProving.sol/LibProving.json | jq .abi | ${ABIGEN_BIN} --abi - --type LibProving --pkg bindings --out $DIR/../bindings/gen_lib_proving.go -cat ../protocol/out/LibProposing.sol/LibProposing.json | +cat ../protocol/out/layer1/LibProposing.sol/LibProposing.json | jq .abi | ${ABIGEN_BIN} --abi - --type LibProposing --pkg bindings --out $DIR/../bindings/gen_lib_proposing.go -cat ../protocol/out/LibUtils.sol/LibUtils.json | +cat ../protocol/out/layer1/LibUtils.sol/LibUtils.json | jq .abi | ${ABIGEN_BIN} --abi - --type LibUtils --pkg bindings --out $DIR/../bindings/gen_lib_utils.go -cat ../protocol/out/LibVerifying.sol/LibVerifying.json | +cat ../protocol/out/layer1/LibVerifying.sol/LibVerifying.json | jq .abi | ${ABIGEN_BIN} --abi - --type LibVerifying --pkg bindings --out $DIR/../bindings/gen_lib_verifying.go -cat ../protocol/out/TaikoL2.sol/TaikoL2.json | +cat ../protocol/out/layer2/TaikoL2.sol/TaikoL2.json | jq .abi | ${ABIGEN_BIN} --abi - --type TaikoL2Client --pkg bindings --out $DIR/../bindings/gen_taiko_l2.go -cat ../protocol/out/TaikoToken.sol/TaikoToken.json | +cat ../protocol/out/layer1/TaikoToken.sol/TaikoToken.json | jq .abi | ${ABIGEN_BIN} --abi - --type TaikoToken --pkg bindings --out $DIR/../bindings/gen_taiko_token.go -cat ../protocol/out/AddressManager.sol/AddressManager.json | +cat ../protocol/out/layer1/AddressManager.sol/AddressManager.json | jq .abi | ${ABIGEN_BIN} --abi - --type AddressManager --pkg bindings --out $DIR/../bindings/gen_address_manager.go -cat ../protocol/out/GuardianProver.sol/GuardianProver.json | +cat ../protocol/out/layer1/GuardianProver.sol/GuardianProver.json | jq .abi | ${ABIGEN_BIN} --abi - --type GuardianProver --pkg bindings --out $DIR/../bindings/gen_guardian_prover.go -cat ../protocol/out/AssignmentHook.sol/AssignmentHook.json | - jq .abi | - ${ABIGEN_BIN} --abi - --type AssignmentHook --pkg bindings --out $DIR/../bindings/gen_assignment_hook.go - -cat ../protocol/out/ProverSet.sol/ProverSet.json | +cat ../protocol/out/layer1/ProverSet.sol/ProverSet.json | jq .abi | ${ABIGEN_BIN} --abi - --type ProverSet --pkg bindings --out $DIR/../bindings/gen_prover_set.go -cat ../protocol/out/DevnetTierProvider.sol/DevnetTierProvider.json | +cat ../protocol/out/layer1/MainnetTierRouter.sol/MainnetTierRouter.json | jq .abi | ${ABIGEN_BIN} --abi - --type TierProvider --pkg bindings --out $DIR/../bindings/gen_tier_provider.go -cat ../protocol/out/SgxVerifier.sol/SgxVerifier.json | +cat ../protocol/out/layer1/SgxVerifier.sol/SgxVerifier.json | jq .abi | ${ABIGEN_BIN} --abi - --type SgxVerifier --pkg bindings --out $DIR/../bindings/gen_sgx_verifier.go diff --git a/packages/taiko-client/scripts/gen_swagger_json.sh b/packages/taiko-client/scripts/gen_swagger_json.sh index 59dce311dbd..6d3a297c984 100755 --- a/packages/taiko-client/scripts/gen_swagger_json.sh +++ b/packages/taiko-client/scripts/gen_swagger_json.sh @@ -1,3 +1,3 @@ #/bin/sh -swag init -g api.go -d prover/server --pd +swag init -g server.go -d driver/soft_blocks --pd diff --git a/packages/taikoon-ui/.env.example b/packages/taikoon-ui/.env.example index eb45e513c7d..71ef193d99a 100644 --- a/packages/taikoon-ui/.env.example +++ b/packages/taikoon-ui/.env.example @@ -1,3 +1 @@ -PUBLIC_WALLETCONNECT_PROJECT_ID=fake -PUBLIC_IPFS_GATEWAY=https://taikoons.4everland.link/ipfs/ -PUBLIC_LAUNCH_DATE=2024-05-26T00:00:00 +export PUBLIC_WALLETCONNECT_PROJECT_ID="" diff --git a/packages/taikoon-ui/CHANGELOG.md b/packages/taikoon-ui/CHANGELOG.md index 5df91bb5749..39697bdcb00 100644 --- a/packages/taikoon-ui/CHANGELOG.md +++ b/packages/taikoon-ui/CHANGELOG.md @@ -1,5 +1,61 @@ # Changelog +## [1.3.0](https://github.com/taikoxyz/taiko-mono/compare/taikoon-ui-v1.2.0...taikoon-ui-v1.3.0) (2024-09-13) + + +### Features + +* **taikoons:** updated whitelist ([#18082](https://github.com/taikoxyz/taiko-mono/issues/18082)) ([e340c10](https://github.com/taikoxyz/taiko-mono/commit/e340c102f0537d1b1531806f4164d18976bae503)) + + +### Build + +* **deps-dev:** bump @sveltejs/kit from 2.5.7 to 2.5.21 ([#17901](https://github.com/taikoxyz/taiko-mono/issues/17901)) ([7a32ac4](https://github.com/taikoxyz/taiko-mono/commit/7a32ac40a654521c82cb3ff5b6f5af87d0a915a4)) +* **deps:** bump @web3modal/common from 4.1.11 to 5.0.11 ([#17876](https://github.com/taikoxyz/taiko-mono/issues/17876)) ([6ac4eb0](https://github.com/taikoxyz/taiko-mono/commit/6ac4eb0141be1bc3332da6ff63e8bebd9c00e326)) + +## [1.2.0](https://github.com/taikoxyz/taiko-mono/compare/taikoon-ui-v1.1.1...taikoon-ui-v1.2.0) (2024-07-04) + + +### Features + +* **nfts:** taikoon-ui performance upgrades ([#17720](https://github.com/taikoxyz/taiko-mono/issues/17720)) ([936bb95](https://github.com/taikoxyz/taiko-mono/commit/936bb95057815e5473d36304058a34be8c81ff76)) +* **nfts:** taikoon-ui updated whitelist ([#17719](https://github.com/taikoxyz/taiko-mono/issues/17719)) ([4e5bdbb](https://github.com/taikoxyz/taiko-mono/commit/4e5bdbbe497c56a52a150dcc15213e8effb7a0d8)) +* **nfts:** taikoon-ui updated whitelist 28-06-2024 ([#17701](https://github.com/taikoxyz/taiko-mono/issues/17701)) ([3687b1e](https://github.com/taikoxyz/taiko-mono/commit/3687b1eb81f6032713e3ca18824778e9193c1314)) + + +### Bug Fixes + +* **nfts:** taikoon-ui bug fixing ([#17644](https://github.com/taikoxyz/taiko-mono/issues/17644)) ([2c90a7f](https://github.com/taikoxyz/taiko-mono/commit/2c90a7fee984c8c1e3389076a3ed933de4e67215)) +* **nfts:** taikoon-ui error reporting improved ([#17683](https://github.com/taikoxyz/taiko-mono/issues/17683)) ([116d3f4](https://github.com/taikoxyz/taiko-mono/commit/116d3f4886dea01333b829677ec9b6d4492479c6)) + +## [1.1.1](https://github.com/taikoxyz/taiko-mono/compare/taikoon-ui-v1.1.0...taikoon-ui-v1.1.1) (2024-06-17) + + +### Bug Fixes + +* **nfts:** taikoon-ui whitelist update ([#17491](https://github.com/taikoxyz/taiko-mono/issues/17491)) ([403c18f](https://github.com/taikoxyz/taiko-mono/commit/403c18f7f77a94ef8675eacea7b512ea5a2ddfce)) + +## [1.1.0](https://github.com/taikoxyz/taiko-mono/compare/taikoon-ui-v1.0.0...taikoon-ui-v1.1.0) (2024-06-14) + + +### Features + +* **nfts:** adapt taikoon-ui to the new package structure ([#17271](https://github.com/taikoxyz/taiko-mono/issues/17271)) ([6b7f44a](https://github.com/taikoxyz/taiko-mono/commit/6b7f44a2e2e6dc9ee63a565c95ba5023e66940c6)) +* **nfts:** taikoon ui fixes, v3 ([#17218](https://github.com/taikoxyz/taiko-mono/issues/17218)) ([e0f064a](https://github.com/taikoxyz/taiko-mono/commit/e0f064aa7e288c17d23906127e6a77da5f81feda)) +* **nfts:** taikoon-ui adaptation for TaikoonTokenV2 ([#17593](https://github.com/taikoxyz/taiko-mono/issues/17593)) ([af33b3b](https://github.com/taikoxyz/taiko-mono/commit/af33b3bce7a0e940a1857f56d6e012331f147cce)) +* **nfts:** taikoon-ui pre-mint legal disclaimer ([#17482](https://github.com/taikoxyz/taiko-mono/issues/17482)) ([9fae4d0](https://github.com/taikoxyz/taiko-mono/commit/9fae4d04d8282424b8f74933381f0ef7c9a30255)) +* **nfts:** taikoon-ui updated list of blocked countries ([#17403](https://github.com/taikoxyz/taiko-mono/issues/17403)) ([78153ce](https://github.com/taikoxyz/taiko-mono/commit/78153ced57ddfb331e9ed3186bbf8edc675e8251)) +* **nfts:** ui-lib integration into taikoon-ui ([#17220](https://github.com/taikoxyz/taiko-mono/issues/17220)) ([849a3c4](https://github.com/taikoxyz/taiko-mono/commit/849a3c446936285c621176e332d1136c1f4ddb6b)) +* **taikoon:** geoblocking ([#17201](https://github.com/taikoxyz/taiko-mono/issues/17201)) ([6658f6a](https://github.com/taikoxyz/taiko-mono/commit/6658f6ae553c3c02560a9fa622f1dd3f938c119d)) +* **taikoon:** ipfs integration with 4everland ([#17119](https://github.com/taikoxyz/taiko-mono/issues/17119)) ([46670cf](https://github.com/taikoxyz/taiko-mono/commit/46670cfb8f087c87c42799d7ded3a0dc1258a963)) + + +### Bug Fixes + +* **nfts:** taikoon ui taiko-mainnet deployment ([#17405](https://github.com/taikoxyz/taiko-mono/issues/17405)) ([db40dbd](https://github.com/taikoxyz/taiko-mono/commit/db40dbdf5207dbcaad630d010728a621a644898d)) +* **nfts:** taikoon-ui design r4 ([#17423](https://github.com/taikoxyz/taiko-mono/issues/17423)) ([4cf0739](https://github.com/taikoxyz/taiko-mono/commit/4cf073997fd9d68bdf525a279a89fcbb2008ca0a)) +* **nfts:** taikoon-ui mobile visual fixes ([#17490](https://github.com/taikoxyz/taiko-mono/issues/17490)) ([fbfcc7f](https://github.com/taikoxyz/taiko-mono/commit/fbfcc7f3810d0122f46673944c39e5f4d759d4e0)) + ## 1.0.0 (2024-05-15) diff --git a/packages/taikoon-ui/package.json b/packages/taikoon-ui/package.json index 7d47b7ef9e8..cad577cca04 100644 --- a/packages/taikoon-ui/package.json +++ b/packages/taikoon-ui/package.json @@ -1,6 +1,6 @@ { "name": "taikoon-ui", - "version": "1.0.0", + "version": "1.3.0", "private": true, "scripts": { "dev": "vite dev", @@ -15,13 +15,14 @@ "test:integration": "playwright test", "test:unit": "vitest", "start": "npm run generate:abi && vite dev --open --host 0.0.0.0", + "start:prod": "vite dev --open --host 0.0.0.0 --mode production", "generate:abi": "cd ../nfts && pnpm compile && cd - && wagmi generate" }, "devDependencies": { "@chromatic-com/storybook": "^1.3.1", "@playwright/test": "^1.28.1", "@sveltejs/adapter-auto": "^3.0.0", - "@sveltejs/kit": "^2.0.0", + "@sveltejs/kit": "^2.5.21", "@sveltejs/vite-plugin-svelte": "^3.1.0", "@types/eslint": "^8.56.0", "@types/jest": "^29.5.12", @@ -58,7 +59,7 @@ "@wagmi/cli": "^2.1.4", "@wagmi/connectors": "^4.1.18", "@wagmi/core": "^2.8.0", - "@web3modal/common": "^4.1.1", + "@web3modal/common": "^5.0.11", "@web3modal/ui": "^4.1.1", "@web3modal/wagmi": "^4.1.1", "@zerodevx/svelte-toast": "^0.9.5", @@ -69,7 +70,7 @@ "minidenticons": "^4.2.1", "postcss": "^8.4.38", "tailwindcss": "^3.4.3", - "viem": "^2.9.29", + "viem": "^2.15.1", "@taiko/ui-lib": "workspace:*" } } diff --git a/packages/taikoon-ui/src/components/Collection/Collection.svelte b/packages/taikoon-ui/src/components/Collection/Collection.svelte index 8692ed6721a..932d922ef39 100644 --- a/packages/taikoon-ui/src/components/Collection/Collection.svelte +++ b/packages/taikoon-ui/src/components/Collection/Collection.svelte @@ -2,6 +2,7 @@ import { ResponsiveController } from '@taiko/ui-lib'; import { getContext, onMount } from 'svelte'; + import { Button } from '$components/core/Button'; import { classNames } from '$lib/util/classNames'; import type { ITaikoonDetail } from '$stores/taikoonDetail'; @@ -10,6 +11,7 @@ import { default as TaikoonDetail } from './TaikoonDetail.svelte'; export let tokenIds: number[] = []; + let windowSize: 'sm' | 'md' | 'lg' = 'md'; export let disableClick = false; @@ -21,10 +23,21 @@ $: selectedTaikoonId = -1; + $: visibleTokenIds = [] as number[]; onMount(() => { onRouteChange(); }); + $: tokenBatch = 50; + $: tokenIds, + visibleTokenIds.length === 0 && + (visibleTokenIds = tokenIds.length > tokenBatch ? tokenIds.slice(0, tokenBatch) : tokenIds); + + function loadMore() { + const nextBatch = tokenIds.slice(visibleTokenIds.length, visibleTokenIds.length + tokenBatch); + visibleTokenIds = [...visibleTokenIds, ...nextBatch]; + } + async function onRouteChange() { const hash = location.hash; const taikoonId = parseInt(hash.replace('#', '')); @@ -48,8 +61,9 @@
{title}
+
- {#each tokenIds as tokenId} + {#each visibleTokenIds as tokenId} @@ -57,6 +71,15 @@ {/each}
+ +
diff --git a/packages/taikoon-ui/src/components/Header/Header.svelte b/packages/taikoon-ui/src/components/Header/Header.svelte index 6e47bac663a..902f9970906 100644 --- a/packages/taikoon-ui/src/components/Header/Header.svelte +++ b/packages/taikoon-ui/src/components/Header/Header.svelte @@ -56,8 +56,8 @@ return; } - const canMint = await Token.canMint(); - const totalMintCount = await User.totalWhitelistMintCount(); + const canMint = await Token.canMint(address); + const totalMintCount = await User.totalWhitelistMintCount(address); displayYourTaikoonsButton = !canMint && totalMintCount > 0; isChecking = false; diff --git a/packages/taikoon-ui/src/components/Mint/Mint.svelte b/packages/taikoon-ui/src/components/Mint/Mint.svelte index 5d942c5c61c..cb2add99496 100644 --- a/packages/taikoon-ui/src/components/Mint/Mint.svelte +++ b/packages/taikoon-ui/src/components/Mint/Mint.svelte @@ -7,15 +7,16 @@ import { Divider } from '$components/core/Divider'; import InfoRow from '$components/core/InfoRow/InfoRow.svelte'; import { errorToast } from '$components/core/Toast'; + import { web3modal } from '$lib/connect'; + import Token from '$lib/token'; import User from '$lib/user'; import { classNames } from '$lib/util/classNames'; + import { account } from '$stores/account'; import type { IMint } from '$stores/mint'; import { Button } from '$ui/Button'; import { ProgressBar } from '$ui/ProgressBar'; import { Spinner } from '$ui/Spinner'; - import Token from '../../lib/token'; - import { account } from '../../stores/account'; import type { IAddress } from '../../types'; import { NftRenderer } from '../NftRenderer'; import { @@ -55,23 +56,20 @@ async function calculateGasCost() { isCalculating = true; - - gasCost = await Token.estimateMintGasCost(); + gasCost = await Token.estimateMintGasCost($mintState.address); isCalculating = false; } function reset() { canMint = false; - totalMintCount = 0; - gasCost = 0; - mintState.set({ ...$mintState, totalMintCount, address: zeroAddress }); - isReady = true; + mintState.set({ ...$mintState, address: zeroAddress, totalMintCount: -1 }); } async function load() { if (isReady && (!$account || ($account && !$account.isConnected))) { return reset(); } + isReady = false; if (totalSupply < 0 && mintMax < 0) { totalSupply = await Token.totalSupply(); @@ -80,6 +78,7 @@ } if (!$account || !$account.address || $account.address === zeroAddress) { + isReady = true; return reset(); } const address = $account.address as IAddress; @@ -87,21 +86,24 @@ const balance = await Token.balanceOf(address); hasAlreadyMinted = balance > 0; + if (totalMintCount < 0) { + totalMintCount = await User.totalWhitelistMintCount(address); + } + + await calculateGasCost(); + + mintState.set({ ...$mintState, totalMintCount }); + if (!hasAlreadyMinted) { - canMint = await Token.canMint(); + canMint = await Token.canMint(address); } - if (!canMint) { - mintState.set({ ...$mintState, address: address.toLowerCase() as IAddress }); + if (!canMint) { + mintState.set({ ...$mintState, totalMintCount, address: address.toLowerCase() as IAddress }); isReady = true; return; } - if (totalMintCount < 0) { - totalMintCount = await User.totalWhitelistMintCount(); - await calculateGasCost(); - } - mintState.set({ ...$mintState, totalMintCount, address: address.toLowerCase() as IAddress }); isReady = true; @@ -131,20 +133,25 @@ }); mintState.set({ ...$mintState, tokenIds }); } catch (e: any) { - console.warn(e); - //showMintConfirmationModal = false + console.error(e); mintState.set({ ...$mintState, isModalOpen: false }); + if ( + e.shortMessage && + e.shortMessage === + 'The total cost (gas * gas fee + value) of executing this transaction exceeds the balance of the account.' + ) { + e.shortMessage = 'You do not have enough ETH to cover the minting cost, please bridge some ETH to Taiko.'; + } + console.error('mint error', e.name); errorToast({ title: 'Mint Error', - message: e.message, + message: e.shortMessage || e.message, }); } mintState.set({ ...$mintState, isMinting: false }); await load(); } - import { web3modal } from '$lib/connect'; - let web3modalOpen = false; function connectWallet() { @@ -201,7 +208,7 @@ - {:else if !canMint || $mintState.totalMintCount === 0} + {:else if !canMint && $mintState.totalMintCount === 0}
@@ -223,13 +230,7 @@
- {/if} {:else} diff --git a/packages/taikoon-ui/src/components/NftRenderer/NftRenderer.svelte b/packages/taikoon-ui/src/components/NftRenderer/NftRenderer.svelte index 74a8ae7bf08..cef078fb9aa 100644 --- a/packages/taikoon-ui/src/components/NftRenderer/NftRenderer.svelte +++ b/packages/taikoon-ui/src/components/NftRenderer/NftRenderer.svelte @@ -6,7 +6,6 @@ import { DynamicImage } from '$components/DynamicImage'; import IPFS from '$lib/ipfs'; import { classNames } from '$lib/util/classNames'; - //import { nftCache } from '$stores/nftCache'; import { Theme, theme } from '$stores/theme'; import { Spinner } from '$ui/Spinner'; @@ -18,18 +17,6 @@ async function getTokenUri(id: number) { if (tokenId <= 0 || Number.isNaN(id)) return ''; - /* - const cached = $nftCache[id]; - let metadata; - if (!cached) { - metadata = await IPFS.getMetadata(id); - nftCache.set({ - ...$nftCache, - [id]: JSON.stringify(metadata), - }); - } else { - metadata = JSON.parse(cached); - }*/ const metadata = await IPFS.getMetadata(id); if (!metadata || !metadata.image) return ''; tokenURI = metadata.image; diff --git a/packages/taikoon-ui/src/components/SwitchChainModal/SwitchChainModal.svelte b/packages/taikoon-ui/src/components/SwitchChainModal/SwitchChainModal.svelte index 22fef90bd7c..294c5fbda33 100644 --- a/packages/taikoon-ui/src/components/SwitchChainModal/SwitchChainModal.svelte +++ b/packages/taikoon-ui/src/components/SwitchChainModal/SwitchChainModal.svelte @@ -2,8 +2,10 @@ import { switchChain } from '@wagmi/core'; import { t } from 'svelte-i18n'; import { type Chain, SwitchChainError, UserRejectedRequestError } from 'viem'; + import { taiko, taikoHekla } from 'viem/chains'; - import { config, taiko } from '$wagmi-config'; + import { isDevelopmentEnv } from '$lib/util/isDevelopmentEnv'; + import { config } from '$wagmi-config'; import { chains, getChainImage } from '../../lib/chain'; import { switchChainModal } from '../../stores/modal'; @@ -25,7 +27,7 @@ let switchingNetwork = false; - $: selectedChains = [taiko]; + $: selectedChains = [isDevelopmentEnv ? taikoHekla : taiko]; function closeModal() { $switchChainModal = false; diff --git a/packages/taikoon-ui/src/components/core/Section/Section.svelte b/packages/taikoon-ui/src/components/core/Section/Section.svelte index 08f7de001b8..53e7959957d 100644 --- a/packages/taikoon-ui/src/components/core/Section/Section.svelte +++ b/packages/taikoon-ui/src/components/core/Section/Section.svelte @@ -17,8 +17,8 @@ 'w-full', 'overflow-hidden', height === 'full' ? 'h-screen' : null, - height === 'min' ? 'h-[50vh] pt-32' : null, - height === 'fit' ? 'h-auto pt-32' : null, + height === 'min' ? 'h-[50vh] pt-16 md:pt-32' : null, + height === 'fit' ? 'h-auto pt-16 md:pt-32' : null, 'relative', 'flex flex-col', 'items-center', diff --git a/packages/taikoon-ui/src/components/modals/MintConfirmation.modal/MintConfirmation.modal.svelte b/packages/taikoon-ui/src/components/modals/MintConfirmation.modal/MintConfirmation.modal.svelte index 76d78c84c64..f93b23e54b3 100644 --- a/packages/taikoon-ui/src/components/modals/MintConfirmation.modal/MintConfirmation.modal.svelte +++ b/packages/taikoon-ui/src/components/modals/MintConfirmation.modal/MintConfirmation.modal.svelte @@ -47,7 +47,7 @@
Waiting for confirmation
- {$t('buttons.etherscan')} diff --git a/packages/taikoon-ui/src/components/sections/Countdown.section.svelte b/packages/taikoon-ui/src/components/sections/Countdown.section.svelte deleted file mode 100644 index 317bcae8e89..00000000000 --- a/packages/taikoon-ui/src/components/sections/Countdown.section.svelte +++ /dev/null @@ -1,99 +0,0 @@ - - -
- {#if windowSize === 'sm'} -
- -
- {/if} - -
- {#each counters as { label, value }, i} - {#if i == 2 && windowSize !== 'sm'} -
- -
- {/if} -
-
- -
-
- {label} -
-
- {/each} -
- - -
- - diff --git a/packages/taikoon-ui/src/components/sections/Information.section.svelte b/packages/taikoon-ui/src/components/sections/Information.section.svelte index 083b21c3c19..9d56ae499f4 100644 --- a/packages/taikoon-ui/src/components/sections/Information.section.svelte +++ b/packages/taikoon-ui/src/components/sections/Information.section.svelte @@ -1,4 +1,5 @@
-
+

{$t('content.sections.information.title')}

@@ -43,10 +45,18 @@
{#each eyes as _} -
+
{/each}
+ diff --git a/packages/taikoon-ui/src/components/sections/index.ts b/packages/taikoon-ui/src/components/sections/index.ts index 3ba0f039c7c..89c1a68886e 100644 --- a/packages/taikoon-ui/src/components/sections/index.ts +++ b/packages/taikoon-ui/src/components/sections/index.ts @@ -1,5 +1,4 @@ export { default as CollapsibleSection } from './Collapsible.section.svelte'; -export { default as CountdownSection } from './Countdown.section.svelte'; export { default as FaqSection } from './Faq.section.svelte'; export { default as FooterSection } from './Footer.section.svelte'; export { default as HeadingSection } from './Heading.section.svelte'; diff --git a/packages/taikoon-ui/src/generated/abi/index.ts b/packages/taikoon-ui/src/generated/abi/index.ts index 0ba9c8e2e43..9f635bd6338 100644 --- a/packages/taikoon-ui/src/generated/abi/index.ts +++ b/packages/taikoon-ui/src/generated/abi/index.ts @@ -3,8 +3,8 @@ ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /** - * - [__View Contract on Holesky Etherscan__](https://holesky.etherscan.io/address/0xe0c018615A074967db263abD4a98B4862dB4101f) - * - + * - [__View Contract on Taiko Mainnet Taikoscan__](https://taikoscan.network/address/0x4A045C5016B200F7E08a4caBB2cdA6E85bF53295) + * - [__View Contract on Taiko Hekla L2 Taikoscan__](https://hekla.taikoscan.network/address/0xf3FBa6f1E6C1998195239e7DD794c1EcEA8Da66B) */ export const taikoonTokenAbi = [ { @@ -38,6 +38,13 @@ export const taikoonTokenAbi = [ outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }], stateMutability: 'view', }, + { + type: 'function', + inputs: [], + name: 'baseURI', + outputs: [{ name: '', internalType: 'string', type: 'string' }], + stateMutability: 'view', + }, { type: 'function', inputs: [], @@ -292,6 +299,13 @@ export const taikoonTokenAbi = [ outputs: [], stateMutability: 'nonpayable', }, + { + type: 'function', + inputs: [{ name: '_rootURI', internalType: 'string', type: 'string' }], + name: 'updateBaseURI', + outputs: [], + stateMutability: 'nonpayable', + }, { type: 'function', inputs: [ @@ -588,18 +602,17 @@ export const taikoonTokenAbi = [ ] as const; /** - * - [__View Contract on Holesky Etherscan__](https://holesky.etherscan.io/address/0xe0c018615A074967db263abD4a98B4862dB4101f) - * - + * - [__View Contract on Taiko Mainnet Taikoscan__](https://taikoscan.network/address/0x4A045C5016B200F7E08a4caBB2cdA6E85bF53295) + * - [__View Contract on Taiko Hekla L2 Taikoscan__](https://hekla.taikoscan.network/address/0xf3FBa6f1E6C1998195239e7DD794c1EcEA8Da66B) */ export const taikoonTokenAddress = { - 17000: '0xe0c018615A074967db263abD4a98B4862dB4101f', - 31337: '0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9', 167000: '0x4A045C5016B200F7E08a4caBB2cdA6E85bF53295', + 167009: '0xf3FBa6f1E6C1998195239e7DD794c1EcEA8Da66B', } as const; /** - * - [__View Contract on Holesky Etherscan__](https://holesky.etherscan.io/address/0xe0c018615A074967db263abD4a98B4862dB4101f) - * - + * - [__View Contract on Taiko Mainnet Taikoscan__](https://taikoscan.network/address/0x4A045C5016B200F7E08a4caBB2cdA6E85bF53295) + * - [__View Contract on Taiko Hekla L2 Taikoscan__](https://hekla.taikoscan.network/address/0xf3FBa6f1E6C1998195239e7DD794c1EcEA8Da66B) */ export const taikoonTokenConfig = { address: taikoonTokenAddress, diff --git a/packages/taikoon-ui/src/generated/whitelist/hekla.json b/packages/taikoon-ui/src/generated/whitelist/hekla.json new file mode 100644 index 00000000000..69323d0f5ad --- /dev/null +++ b/packages/taikoon-ui/src/generated/whitelist/hekla.json @@ -0,0 +1,67 @@ +{ + "format": "standard-v1", + "tree": [ + "0x3ef68af24a0113b354ddcfcdf3479a7948847d9a97fb87b07ff560843f7118bc", + "0xb0bd9bfeaf58288fb1723a92daa4791abf328c732ab91da7e8d67987edbbbdf4", + "0x5b66179d07fbdf65657248cae6476c9964eb19fa61c15df17d9db924a074c884", + "0xb29fa98d9e85a98b085fb8831143a5ffe70e96245fb523a9d195963b76d8cc0b", + "0x5406cb9aa8f450c6702c6bcddcdb19077baaab45fd536a21c8e91cfd628343f7", + "0xaaa5072acbca877abbad0ad35c2e9742a5c826aedeb2517550beeb319ae8c911", + "0x761afa50edb0e77c4a68e268ace2d310f31dec658ed16bdb83b1b7232a2768bd", + "0x7eeeb1cb3bb43fa2c2e0b50fb043859ffff066610f9dbf89b4704e773f24a3c4", + "0x127b97cebbdc3cc5e8ed1c8c14d9b61f4de9a2301d5d10988322f71155308873", + "0xee3d903875927a1fd767e1fc8b850a5840596a21a00df4c2bec30a8f5d58d16d", + "0xafc473ef5147f5d39d32d4e4b466f4beea4e859f397980156d0470bb80900373", + "0xaf53707ab893501840153fc5f05a3a24c7d185d8bcfcc44ece20f8bd2f012339", + "0x921a6e0470293d600eead14aeb046dad51a5620ee1eb5e72b95112dbbe9b245a", + "0x7358742a31cea3f1d62dc77c7d63389fbd8a194073ad04ea25e4aa0071c7b4f3", + "0x630da9f66464f1194efd874ce95e65e7bf86b556cc479cf33820325eca6415fd", + "0x4c3456dc29191b3b77a77c904ea70867a20007fe2d73f7547e42b0dc5200c1f4", + "0x456e44977c40b6df1bcb531feb67a5857454ad14ef1a4c2dd80834d19b339d0a", + "0x2f70a518d7de1c625ba6bde8144aaf8d288b49240bae6a473fb85b800b52f6bd", + "0x1ca70bee94ece504eb73f7f0fa3af861b6243f580d3915daa19047facde9871d" + ], + "values": [ + { + "value": ["0x8f63e3cD0D14cAef993E59B4e01e3D404cF3c1B7", "10"], + "treeIndex": 13 + }, + { + "value": ["0x2E2989015f5818A256EB967940454EfE8a0B4b5d", "10"], + "treeIndex": 9 + }, + { + "value": ["0x927a146e18294efb36edCacC99D9aCEA6aB16b95", "10"], + "treeIndex": 16 + }, + { + "value": ["0x4757D97449acA795510b9f3152C6a9019A3545c3", "10"], + "treeIndex": 10 + }, + { + "value": ["0x424bFb32f78731252a6BCeDc828E38e2701DAAEf", "10"], + "treeIndex": 11 + }, + { + "value": ["0xC66fAdfFeb6DA3b9A7FA3C71130F881e3a9B13fb", "10"], + "treeIndex": 12 + }, + { + "value": ["0xFE5124f99f544a84C3C6D0A26339a04937cD2Ff4", "10"], + "treeIndex": 14 + }, + { + "value": ["0xeA1688488BE7D2E1fC259ceef2b9b514A701f1D2", "12"], + "treeIndex": 15 + }, + { + "value": ["0x4100a9B680B1Be1F10Cb8b5a57fE59eA77A8184e", "12"], + "treeIndex": 17 + }, + { + "value": ["0xCe433Dd6f23333799C11199104AA6986333b7B0b", "12"], + "treeIndex": 18 + } + ], + "leafEncoding": ["address", "uint256"] +} diff --git a/packages/taikoon-ui/src/generated/whitelist/mainnet.json b/packages/taikoon-ui/src/generated/whitelist/mainnet.json index 1a3519b3ac2..57ca7a4e2ca 100644 --- a/packages/taikoon-ui/src/generated/whitelist/mainnet.json +++ b/packages/taikoon-ui/src/generated/whitelist/mainnet.json @@ -1,316 +1,345 @@ { "format": "standard-v1", "tree": [ - "0xa7e510d5aed347e65609cf6f0e0738cdd752ffdf5980749057c634489fd09fc3", - "0xb973a488dd6a234ca421a2d0421677fd4b29e096455a60d7d105462748b4bad1", - "0x507dc9b325379dac07da6ead2076412a2bfcb86b9e768f0dfefa081b4408cba4", - "0x244e5e77e667b19d794163a7f24e23ca5042c6c9da87f841f5d6a51db2c55f4d", - "0x0d3296905943d3e337ef9ad0f2e027c49a85d38303de0d7bbeed1e9a9bd5623b", - "0x30b785c47fa6bd1b322ed2a05be570adf006057237d16e096f07efcbde05984d", - "0x40046112e151e45604135c479abd6fe27dd497ab2549b5f6b3ccc93b8a8f5f5d", - "0xbcd128611de8370ad79694442c42876eabe1d549b507ba037a42bcd91b82b789", - "0xd913f848f4c13e86aec7454ab5485a1aa212eac17a2e9c30fb6229ea21791a51", - "0x168d30ee4a4ef08732a136a5f151f671c188f1d3ce5ebc163e5391793fe809d9", - "0xd1efa6211308f85e7902bc88266938f677aca884afd35869c42b21aca6307f2b", - "0xb5da7f4c1e8b8f5ed3109772c2d652c73e3477fe6f2de3710a5de76d8b7618b4", - "0x24610a162ba43fc54dae8128b5dd1f37cdde1d4c02137273a095bfb9a681417d", - "0xfdbd58cbdc30946d5a7116b0208446bf3ec05c0876e7e57ffa95fd8457741111", - "0x08aa85777b263172c920a4c9631e99494a2de028a777163d00147b539944870b", - "0x0659b57ac5089e9a95e29d2544da2c261d560d61390e95e72164f6c2c8672bb0", - "0x541f4905b19b102b3955bb2fa096961c541788303c0adc90462ec5f1f1f51d8e", - "0x857e28500453424beddceccd7df1922284b1a30248d304401879504a385e56c0", - "0x47d21705f2f3a789452f6489e012bd5415da961a648a7741bf8ecbb46e993e74", - "0x535ec34158d8f8e6bd5f9a18f755166101d32964087e595d90914709b2c1196d", - "0xbbefe7f22213649df47dd829907b691c4d020aaa9a62824e5a9072fea402ff8c", - "0x2b7c88e79b3726ccd4f8ee538d756a0a8079d2dbfa68a940647cfc5257adff92", - "0x053a8a819d2bbc6e59e2d8ea0172ee49a318c0d1f96829fa7d0e41a9e03b9a56", - "0xc84402ec0bc364e38fb46c01c171341fd344a304716724b9a4163ad33483c05d", - "0xc646454f6a3bd02a7c230dc0dcb2161cbd860918f856886d64d2f60f3711a2ac", - "0x870e75d3b3bb5d6dda73f4ca2edeeb5b4736e3773671fee01db10d6d0834934f", - "0xc39e970a9edb3e655498b7084d105080f91745d9abb1e4b871e9c7d105c84c1e", - "0x1109b0710ec1c8c978d2ebc48a144e10c7b67e0773ec1490b707b585e071f58f", - "0x9287005fbaf60ca90177aba33b3c913969053e92a1e9fde53cdc4fb7f8493fb1", - "0x5ceb7896d89e82ae4eca0e0c4f9ea13f3ce50667c3e47d2f3f8735ee6d5a36bd", - "0xc07e708cf89c19eff5ab7516b40dbe8120c3831a6470b01f4deedc33e3e4af6f", - "0xf6c23adb20a800f69d67abd581baa5c965e43cbe75e4cc8870a82b867f9919f8", - "0x688e9da64a29a85b3d067ccf15d9b611f27e72cf3e6034aba43d06d4e67bee54", - "0x49827eb8ecbe29f462bc7d6c2cb8fd5e2c872d4cbd4bc8d9555963e63df55dbf", - "0x429458a181fdbb35e9ca0a5ba4d70ccd6494db0effb64c3aa35519727290abb6", - "0xb1614c740958f460c4361bffb21caa9f70e995936bb6f9763f1bf6592889657d", - "0xd81a19f138db1cf4ccff4d17e3edb351f654dba39f69c78f402a46af61d457a6", - "0xbf62185776acedf8b3361f32f0581668bb12df277c215847caef0c4e9f88af68", - "0xced0528489c9b4dbe42325cbf4d54839b15d075155c367394e11836dd168e81a", - "0x776ebfced442225bbfafcd45421c695f11d20e4c06e8b4351a1983305a145d5e", - "0xd2c2ab920d8b805032ac828a196207b7add731715dd4974c42794709e8d4f3cb", - "0x842efaefb50276471ecf65323d4af1278e228ab2c5443ea0e3d54a7d2493b4a5", - "0x4f461017fa1a9bdd687dc90df4e5dec1f25a2d714d666377a25e9bba67af0679", - "0x84e32632ad3f166107b14d7408bd7e004158a04cbdb339c97447ef20162fe765", - "0xab3f5be4d0475106d58ea93f3fe271e376d4a826e7afccf8e1e959d1256e8cfc", - "0x6b753b8835f5d80f6a9e379ef82506fbe815ceff48a0cec6518d33098d4fab78", - "0x014c2af007e4c67d8fee31917fb17aa02a4413a03b5d6a1d1c990d2c92ad74e2", - "0x5940fa5e15836311b8d7219ee07c93d7e7fe70e1fd10cd2746ce3c66c4d282de", - "0x9e6bf46ba02b49c9a35e054fe9a4f3386609ce3875bc2ae88e6b0fefafe83d90", - "0x24092a61f885db6a9b193518cbf24bf11d1b5991be2800c4cca56118844f48c0", - "0x4128ab2ea01362f515aa4e2d4e2166cbb0e36e893274303c7244bebade314e95", - "0x4f4132d4e443ba8610dc1a4ec2da072a1eafcbf6368a08bf132da529e67d9d5e", - "0x7d73063c396f1cce550f1694dd53ad61077921afb93012c1d5498a4fcdeb456b", - "0xd520dab426283c735fafa2a7ecef9877c54eab00676b56525d6baed4ba8386cc", - "0xc9428b87ed4231eec6655642e7e861665e152f960a0f097efb72e17335d39dac", - "0xb00e2c8a2926ce3169ddfabde7f94e3d9610ba5a097a8f699451dbede3b5d133", - "0xe4e61a738eec3e7216d17520f9c339b5a135892ac3d8474b6caf128f2d4be0eb", - "0x1ea74a3140c5cf980db74bf96b143180af9ae5ecd16070a309168c753085736e", - "0x1dadb1d2b8ecbec8145d714ad4ef5bcc37f7030c6e02385adadb6278986b0af2", - "0xd5afe03ed0dd67ff477df45fb187cce6bee3fdf41490ddc0e7f08c9ac98909b9", - "0xcfef2ddf055fdb9348540d41fca517b794748cc6359c3b2d802ab33f67a71b79", - "0xcc4dbcadad9ff88787326a39aedb7b6940a49ee6c889640a8906bf383148210f", - "0x290713188e2c1c6112c6735cd4b7fd4e2ec3d1837d54fab932ab84d591603564", - "0xaf8edf8d7815870ae141678ed8ddb3fa755fb7d3c1f73d8e9600696adffdc3db", - "0x15d96a33ffab2a5db7c25e7a4d9874d5dfe44f76c3c2f99b6d70979cb62a961b", - "0xbf04d3ee770a99e180002df57a20c4f6d8e92d83f181744b2f7fcb12e927806a", - "0xd30c9140a9481fd4f3c11b199c525beff194878e2feee741aa4b420587de13e0", - "0xf3e8672fa981fc84009a9cfb48e9a37c7a0f8b4bbc8ef2fc4f6e58cece07312f", - "0x461f43ed96ce9febf570e33a02bb8c5e2d7016f9fb47d3aec7435f5035a44d66", - "0x870746d3604041539da3b96f7f87f7465399bdb2d944cb8e15fef3a6625789f9", - "0xbde7fa32f67cd9de1c1871ef49f06d611460ebd3d04850c2f566e713c2efc032", - "0x5b5543a1c24bde2895287cd0a75b2d39f418411d71144de62ceb08a0ac422244", - "0x9f322aed8312cbbce9d74e084c830d10f645d29f2a2659757c80c26313c1baa6", - "0x79b98dfa7894daeeb4480ad078225bd065d769ac8e19b023a5a13bf6b65cbbca", - "0xe8dd23757bdefb74b2c179e886dd4f71b628e64444ac3ca2aa33ab23e971375e", - "0x85158f6c6b0aabe312b0cb0895b7e730ce04e851389e7e7686ffa1d998c8e1d2", - "0xd2997137cf607ac6029921a84a8ccc3f154eb97dd14933743c512be31eaf696b", - "0xca491c73023ae15fa815a3eead360b0e1bb3d790f22469f6504d77e1926cde7b", - "0xecc7d2a27288f50f77b30e6c366044a746dc2775f5f4e9b5ea875df4481bf20a", - "0x343f65086c1a352ad78ed024115dc7d4ba987eed47e09e8e27c8e5209a95e783", - "0xc97d1d15f953f7538c7ab99b7e2c4862e1bbc4206611f5e9d8ac0b587c13ec84", - "0x66018c7a68843b111451cdee76e40081c778896e6b0bb7afca6a78cb7026b7fb", - "0xab99e71c11e7bea7a2de3f83c7f2ab7e2f8752c3af64ec5aff9ac42c8dccb60c", - "0x1cd01df7c39b0bc6c13f9177ea05f429ef6259e7b51596a4e3096f442db37f1e", - "0x7cdfd20649819ecdac9c99ea2cb8257f5d1455febf5c795a261c059dc507f563", - "0x13620076c4535fe703ebfd081831ed61c4253ecb7f8dc073ee012f27e9c7c155", - "0x6ccf282ffda723a993c68d30368e70e08885d3f7d19cd0a223a7ecdb89a711ce", - "0x64d45cc3462251b5de969c3bc42490974dc3bb14ee29d349c5f9e6b464d99d42", - "0xd8d216f66e1f94250181cf7ebb04de2a9b63eb94ca1e5f28fe73d6520270c0f9", - "0x3122418fd738e690a7a2ff555f1e16e8ec6ddd66e83dfc88161bb039ede8d05f", - "0xa13d7ffa6cba5928d31e79c89fd60feb301ebbedac8dd0a79e403a88b4ee8451", - "0x6a3f79ac8489162cc393cc94988d34fe18b53519dd5fc0005bab67ce5223806c", - "0x7c31d17fbf7d929b4d451c055a070ae9648e5e8f3a9408f18a203eb8678658cf", - "0xe86e0ace64845b97d068046f4d115aa329c18e67a984a4efca7de3c5a9cbf9c4", - "0x7cb59ef97655231231a6b3da135ffe1db8c46f231d122269c22d56bd94bfe123", - "0x4c5ffe7d3353ecf40fc13824c606b78ef784daa734df99efcc9bf7588a607de5", - "0x7250f7af1cd5f2da6a1a68c52a56c3f6c6648f3578e272ecb483944a41289753", - "0xfa8b799c3e767be1fbc4698dcde46407cd86b0701a85b3f2ca3ece20a012ba79", - "0x3272aa1d98a3daad1d0138c1649d3b66daadf3b87981d980b45a4dd0764d0358", - "0xb8f09a2e8b68f66d5eb95f32c8ba0b565310342f1ffe4ea337af7c81c2075c45", - "0xc94d98798d809e2a1754bf0b7d062b39172c995c2f79c125dd29d5638dbc619f", - "0x0d5f5b77c52fcae32c74dd2f9a30e9bb2d3fc3f764e9fe2eeb94e9ce2a2d6bfa", - "0xec1789f46a7324f7b9bf08c59a628547725660a63e8e8e6d0a46f53d50732ace", - "0x0b62bdb1265f00a8e515167c8eef12d4910ed0c5a6db74c184403aea2632d48f", - "0xd44582e441e81f3a04ebd0d0e548761afe0d76afe1809c9a5109b245f05d0647", - "0xcddd400e93ad41e375c684ec0e30efc9869395175b1a9098516c7577a4533d2e", + "0xa6b035de5681d17a9ce065d4757d7be96dbd6ae7becb4a7c5403ae47030678af", + "0x4d20b9f93b3bdbd13a048a18f8ec07bfff6680c2c1902580634862f2f0e4e0ec", + "0x46aec261df803c89b8eb44e0f6352cac4a68395e80b77872c3ae3ffd8aa01413", + "0x495fbfaf336c2ee7b5a570d1bb20fe49841a8936fc037e41d8a2d088f0320088", + "0x1219a96768c675a3d925f8d187236f200aecfb10e33beea76ae6c746d57376fc", + "0x91b03b4b135e58aca58a5fbbb9080688a1af85e24662562756d4343e89e3d58b", + "0x8bbf8de235f2ca26d6658266a98a38bb0e6f4bea56972b511e366f3990379884", + "0x5005f522a9221e57d343546b4fd4b933e08ddea22c37c4a84546dc93393a62f5", + "0x89fbf20985590897fdbedb1664e64e1d76c96493d466d526cb291cb853a9b36b", + "0xf1cc32db22e673706a841139912b00de022174ee6a26a20d92a0f8a329871d7b", + "0x5945fc6f88897ff9f40561ea7e9b1a8324d38d51e1cfdcc953e5893b78807f91", + "0x6440f9b692ffb5301db8c3c32df6d7dafe5afd46ef9501de84f239ff12dfdaea", + "0x9a22ec25ef09b01d48330a740e727e2a2185ad4b6ee5fd3afddf7bd53d8e609a", + "0x8732f20ac65dd4717cb09272ff294049cbc7fed8d0f0023f4d720b8de40fb097", + "0x7f2fa30b337bb1c525d024ce55f2a935d39f854b020c0b4fca06eaa0f0eb8d99", + "0x1f74c18426f1df51841ca048318a13c3dc11903c7157a082df220f381d36222e", + "0x5ee929bf24541624dbbbf21dc3b3e52a4930f672542c197db35c42cb3103d9f3", + "0xfd7a14972384f51048bc42d5e4a08188b2e0c93e314fa022c2fb4aa3af5f5599", + "0x2669532085d80848b06ca734863e7f34f3bf194ccd1c8f34e14ea6a06afcd860", + "0xe0ae008d7db3a986266766f10548d5bd7d2157e21b2869b0a353bbf2b7be4fa9", + "0x8cad2069a7737bfe9b1fb81dc3dfb6feee60ef1b21f4eae322e05b357f7ada0a", + "0xa3bf64b2eef8c6317cebbe904030047591fe3f4a95a825ce9394d778816ffa0e", + "0x9dc9f0594ccf1ad886bcd0cf81d2caff402369751678c59bf8f7de24178fff8b", + "0xbb2aa11a9d2bc9e2d1e369b24a56221606d29ef5babffc7917d313458a1b97e5", + "0x1eb3bf33ff2c30e5d895e4e3e13c400c05e167398a4db4eccef90bdf15e29c22", + "0x2a059b54315b8a3116816610b3707ffd182abd40f5095ee68931a2f4768be170", + "0x34ac0eb35b506eed449e654ff6954522aeefe29c0f22631963c2cb83197031c0", + "0x0ff9cbbccab9f1dbf04151116c2d14f5c96e52d87c1e50f095dd3f1d840ff19f", + "0xd67d2d4ddfa2de16fb911cce076a4bcce0760cd94b7514a83e9c61ef86db85b1", + "0x371285b0261c3ff4cb1f3e629f9a9a94796b436d1c8afb425f1f71f5fb1bf235", + "0x22335780cd39c11a9c845918852f50a09fa3048979b3fe1d748652674b05b3e1", + "0x085ddf8df0066269e28f3b8ea53a8e3580fe7e11e55e6588a7e2009736bab664", + "0x50275a15d39b5bc3ee911f02bccb67caa5daa50d3da810c63922dfba6865fb46", + "0x5686765b9af2a612416b90f9e5d53a68b56321fbdd732ffcb8a25f7e2e6a17d2", + "0x7e53bdb76023259d7b1a2d1c17f870396611c954ab25c2db8049a445742f0830", + "0xa6260cbc5bb3a0d3cba7e6d1cddbd9cbddb2684e8b405af9a2e309f8789d5341", + "0x40434cc010536852ef39b1bd2a03692ed15bea4dc7485c83aa71a970c9b035fd", + "0x7ac24e3010f76a39fad7eab1d1d912c8e25e9f6a8ca6130e30d67e2fec5a4989", + "0xc9cebdda7f43a44d7f98b3e0c533fdb0a16e827b9b825e351f15c49c67f76bb0", + "0xdb87873eaa09abfeae4be73f9ff56beaa3f629b66c1b816ae29f5368a7273db7", + "0xf548c7b2198b7fae1ba400048a9510d71293b82edc37ed9080cc49a6ab94e459", + "0x661912017fc23499a45413a53f75566fc8a2e01e1409ae425766367288cb34ac", + "0x07b91a9d1056ea8ef3d197393bd4e14b14d806b756eb0ab63a964fd5a37d0f25", + "0xd4e53084ede2487c8981fcbd1a70779842932b805052eea81658f540a4b615c9", + "0xbbacc98f886573b4e78a30e19245df2e11e358d6d60c7db35ea18e03c74b8064", + "0x0b4b78ee67746fc79d62433e12ddb2789b8c6c8fe74b2b725b37170107e1d06d", + "0x23aa786920d46b98b411385586e9535beeddf1a9e555137f1e8940080184f788", + "0x08ed20fb9906529fbd884cc48706df937b0d85d186e6f1e8a2487148c85ab3a7", + "0x66d1ae2d98cc9d0e8bc21877769a79a0a8e210fe57d7312ffce1d8ec17fba998", + "0xb723de2aae1142cbf47709489e1141e6473c8ce7ccccc27f9aa679bcd62abf82", + "0xe83ac82aa680938b48ba5c03600d0281662d92fbb09e87a747549b194c00a30d", + "0xaebd682f1c6a5ee251f0e15030f12e10fa8c363c7fee6157f7b2a98212345f1b", + "0xf3cc841c639456a532a6141d38ea0225a6e53d783d74b6487c9115fe856aec6f", + "0x81f74fe5a7a78038b24a9f3edde4d525646b694bc167ad3cf5d66ad12cd720e2", + "0x381aa9890d6b99971a4ad92b9e329b659d64144c115c835d02481627a6abab4b", + "0x48583b8f4ca38cb1b60ee43ae44185c0896d07c749533a148980e4f57d6aeff8", + "0x884303185d244316cb5ddbac8abe7afff2976430bc1edec41bc3431ed9af35a6", + "0x136385db39c52329c77b198d2880a69e21925d382eec85e7c610d4b4cc2ea367", + "0xf0665c699d8cb45ad5a1735bfda75122e603f554080c52c3274d9564d57dd6e1", + "0xe937633003a99bec71353ba47f0ec31c3dcb69ae9826f730e11567f81e3b9816", + "0x244de10a5c5c2a1a3b0b84795e6a700c76e40f832ded5f3476cac1e3b79b303c", + "0xb8d786f7afd2edc2d3883f83026832783d1324fcae13cfca724056d04a5e4921", + "0x78bb514605cdef4dd3c90a99542051dee56a6f5b333b1e31572dab68abf09ed4", + "0xe6d626f81924c547d697ea0e7229b6acb0baf094023674c9779be02660a02d47", + "0x06dc75a27abb8770a4d4f0eb4dfbd37633faf06d9a87f0a97622fda31b199654", + "0x9d39bff0924b19689ef9dfc18c58acd1fa70795a9d134b206cfef0a7edec7961", + "0x996f83c2753b5e4d70f84e82c5cefe6b80b5456d89f48bd0ad6178ed27624364", + "0x8e9002d7989f127ff6e1566674e52e040e76e8bb26f4bfe0a190950431cbb095", + "0x0545fb8fc14c4a86973ab9f1e686248d6c5481f07994f1b6dc0818ff8ae4a8e0", + "0x88ef0c31a9d687bcb9b9fcfef4b7346d42efe8d5bb1246c9035cdc46ba20e62e", + "0xba7b6a4222e42681a7a6649229a425dc79f994724216ef7991b099d5727fbb11", + "0x6404b80d5c1659694c4987083940f8f349be9e0d96f7e34e4b577ba1d67a40c8", + "0xc40f8b507256af07afa9723fab15c3c3a2511dba128c356b218154b302fec9d3", + "0x71127f381f647c98d74e366c366c540aa5e384cb4dac7069b1a7c6dfbeef3d41", + "0x4d3f8926e27ed4276f4f597db2bd1bf24d99a7391674aaf3cd0978bea629a008", + "0xb99378fbc1e92d1e8c233f3db1d102ddcb344912dec81e9b9c9c6ac1174e2040", + "0x308aecebc810754aca4127d2e654a85e3ef0178f9922ccee533e6ddc6fa17966", + "0x294017a4e2a1ee97a47f75b9e25df1d22bc2df29eb96e12d01b23edf24b45d53", + "0x94558c74d35789cc2bdd3b2e7ce003be0da1a81aabb485ee9b2dce43512d6a92", + "0xcfbc746bee5b81188bef011d8835c28489cda965f6e3501ce239b8bfc0ce44b6", + "0x4c7a9d3ba01c912fe559040cb6711e19e46e1e73ed4cd0799f16eab9392cc7e5", + "0xa65558349507bf05fd3e9852e549f62ede41d745a60e62abc3a56271586f2707", + "0xdc0b35bfcd4f92539ca5209b2bc50e66eca777e6e7d413dd77bcfc390cd5a316", + "0x2893bc6247ae750a995c32d2e7b268e919d51397d8542c1789109704daf9bcd1", + "0x73cebcac3e16ef10d7bea8293ab13942fa9a1d09c67458fea109b40235a884a2", + "0xbc4f2d9876d0013c058fe0deee9800e75e3bd9a5ac1e6652fc5cf3bbfdc9b070", + "0x6ea34d8cfe84110a2d46dd58395957142ecbe713edfe518eec53e1e7f8902941", + "0xc4bd665423a3c9dc5f7e3164af22905897a21d5a117ed817faad5b5693c02b4e", + "0xd85d8c3e0bea39016d2c09c035b933b9c2dc5c56d0eb1d6b9a981fad85387085", + "0xa97e783dc101f19cb23fac07320c865665f40c13efafd9d47a1c4e1699606075", + "0x5a292b488af5f4c6d8c5a5b9adf2d18ed3528ff0c63652ea95bd5327e028d0b0", + "0xaedade9f7c8fede0afe0be19f341a04469a127c75e128093928980631a907de9", + "0xc8abdd4fd3e7407f56776e461b3cf24b41bff4341ea4b0a3ca84b148caff146d", + "0xe4685e7b34456ae851ed62d75a82bb76a5ea752b67f01acd180665e282a21195", + "0xb1e420b9fc93d779fde10d68e3e9ae448854be7df0362e87f6f26440ffae2aa5", + "0xce414ad5e4c2140c82f9087e2a1192d40afca9d4f6d9d77818e488677e50d98d", + "0x75339f4f254071dd9d4a945ed04a45ab33b91888bda9d6d38ec1a40459aaf910", + "0x0e6dcb22a5b859bf61a59c6557f9a9bb36724a6003106e4343f85a5108e3583d", + "0x8f30abbdaa9e041b71c1d1a048ca36cd67fc417d8d37e52003033f0e9097f193", + "0x6a84b1ad4384ebc079f8262c2e505fd5276048366473d7937435ca372bf7e75b", + "0x0bfe6d80eabeeb4118f485315173eba177dc750b8b1e16908c43c9fbaf0d1cc8", + "0xfaba5c7c0fee21a789d700f4cff54e35f23786150b4ac61bd80ca832c77f763a", + "0xdfd9eb218548b1d2fdaa5c637b59a8ee26d2061e721814d6e931ae9fb028dd83", + "0x5ff65ef02f8dc8069443df6ae4e26fa4e09656979eec8b0fad0c3a68ce1df447", + "0x2429e66b12783bfb2384f388fc8bb594d764384165464c4b60a7819bf4ff0d63", + "0x742769956aef30c4d5aa5b2cc0f4bd8f939d0b03cf951680a8f888390ac113a3", + "0x51c557f9320aecf0aaa1a75c7f3ec78c7a0e8c762668261216fabd48cecdc305", + "0x0115f4fa348e051b8488838eb5d418e4214cb065d5fed461897f2ea805c55a40", + "0x9e237af93d36ed6b7a8d7a5800cd5e14765decdc78f1c03440367d722ef77f7a", + "0x86a0bd73dee6c2801b31a3614a7da29d932c766aba9579e2f65e55d597675a38", + "0xc8e7b4052a5d88fee5df91eff2fcfe0f28823021e4c7b953d4264e12da6bf84e", + "0x0844a6503f9904623cc2620a168b451ff3071eaef7c6137d01c193776e354406", + "0xc5dd54966aa80f32ad94d5ffd7bb9ac7ef78435e5e6ed4bf3307af3b9690fb69", + "0xeeea2ec17a89f4a4f5df4f3663597cf60018c80c8f02ace25ec973fecb3142cf", + "0x4a011688ccd4b4b631631823bf78387f3044935cf09a0538451540f8099e8033", + "0x17d75889dd087977db39da13b918ee9e0fa89432a6730b6d87b20af7212b3e47", "0x5b17cebe1f9ff1901d27497b472ee1d8d1f2974f6e354d9b6d2cf60b542e9850", - "0x3a66c6fdd455923629b353adafc2e60c9843f133eac30e850c5925116403d055", - "0x5210f98b0713224ec2109266e2b2ca753cd3dd09bebdfb5d00ad898215afa467", - "0x398fb5f3def420c1fbb10ad87c6d5ed9539741b0cb5c73ac1ccfa587a5c85c61", - "0x8ba5243c10a5c1d0fb74952a424268240a89314b6e5f7399b73182f2240abcc4", - "0xeb90eaa7b6a67b9d6687542b3a5ee212961591d91a4e51485a08a2671becf005", - "0x27376e03f6b77a61b932b86c0ea3d599e4eb267b54c0ad4ce914bdce8a71dcad", - "0x1b39da28e5c89493227fef81213362ba9490869c2e9225c12cf69d95ca191fa7", - "0x8d5614cfa5da2835d970b6f717892af404a46d515da2cbe3f541774417c3da1c", - "0x4fa73689d30ab336b299e33649f0696fb80db057ce6b3dc404b1d7a2b1cfd50e", - "0x250053130fac3f1f1befd6e6915f7459611e053f2b8d5b84efd851baae867fed", - "0x9aea2843c5e1245cf311c328c0f6c21a5b17de8714b374286c9c111b24eac637", - "0x250a36976acb495e97ef0bd138d877fb4f682a15aaae56b6403941110cfe0c5e", - "0xb12d538604836d2533e30b15b6953b9e0aefba1b6fdf1adee4eb3eb60bf735b1", - "0xfe8b68a59e58e0b93c5b3460166cc83709c07b7742dbcb6fa753aa63e2b469dc", - "0x80d21de5b6b279167826da1ae6f39989282ba10a3fb33c826f847212e0f17229", - "0xcbb4e2690c41c45676b3a2cba575676fadf8731ba8d5baed2a0c207b2453de97", - "0xe7bb064f81b50add134bad4bfcc0e298160b2e454ec76b27d8788046a94bee68", - "0xa706465104144f6463c14389521950ee3fecae23affd6bd34ff4a6e459db243a", - "0xbdfe2d00b5c81627b79b37ac3cb932fa93f871ed9e75ff1564dd77cdaf12ffa3", - "0x3f7a04f93f6c2be8f126096c7198bb55e0bd0ff68f7702ba7a5e2ce3a7d6b5a4", - "0xecd28dd2f17d57ed234e0c31cd19ce8ac0ba365cf2ee1d8af0be228f675b4583", - "0x43be034a80ddf6b0d414b11c56a1e6e7b5557e2d0a9b027e76eaf0f83db4cce4", - "0x69d1942f795685a35f5e1ccf72f584f275d04551c1ad080008c3069b89eb55a9", - "0xba2783197881b35d405ff1782f337e02c74deb7f81d23c1672ad734b8eb9b260", - "0xc650b200df211c7cd28caaab9df66a55ed43edc7eb23f402d750c03518cdef1a", - "0x754c1ec6a4c37bced418af4dd526c68070297a749425681c2d688465deb2133a", - "0xb9ba5954a9719111ad2558469633d746cfc8e4772b1fdc44af03e1af33aaa0e8", - "0xc51dc03927294c76981b9ee81b5fdab0cc93c3236ff4885ad963cee66db5789e", - "0x15766c2c9f80236ae31b064ca80fc279fcf55de6bf479aae10a7e504c2eceec6", - "0xbd8359fe76c1d32e790df4c2a1d17ff8da5b853fb6a2fd6201bb07cf98fdcb5d", - "0xb2c6098618c2d81eb106c5ff78be482494c791af5657bb2229c5c16acd82346c", - "0x52e66f27017b5d5c28792ba5f62faec8f4b7e67bc22da90cbe52f142d5ec00af", - "0x49e1f4dad206c9c1b1fe2f91c9b275b974abbd229d2779aa466caad9db76fd9e", - "0x213505b8ed7f61edeb20eee352a1bc694ac78ff1f33a4ed0af174a5d72dc812f", - "0xd49d70ae3fdcdfd7068cc5a0f269bb37c7f475c938e08c6f2747b62a432a5078", - "0xc67b28cc8b42f9dc01e679422ddd3b8700d06c526d07a581a8efba474057064b", - "0x5134a6ff2210e906174a9c5b4c2c872db6a09e699c0899399641b7d1bc495b66", - "0x66a7b49ea70d29de0725d431a077dbaa75bbaaf8f4aeedfac5e9677820de938a", - "0x26ada66ac856632ac0529ae3fc8115a351350a90cde864115c1a2f9e3b09823c", - "0xe37f11244d5c5c3e8b46a058a5bd91da4c4dc20ba1bbdfce381a956eb8db8a1f", - "0x1a5dc8afd4532c3e1441075ecfd887bf83354d321bfe583cd48e7be79c4ff592", - "0xb875e83e9a270124a2d2199085aee6abd718dedd99427f19baf4f487b561a982", - "0xd47ed52d077dde864519d9cf8c058d799061a9dbe9a691ba585746b72ecf2e6c", - "0x040e7e16ccbb23a3a5a5d20563cd2d8ea4a483a40dc7b8df5765a86ba7138151", - "0x2f461cec32564c979efb0159e5c088ae4b8de4aae676c621f32b26ebf5c2d595", - "0x96e9a5b8b2a87973e4bf8061c106d8f5014d50e0a27aca2212825424b755dbee", - "0x2a19070a9069af3adfb32332de600bbaa57f2d502cfecdbf6f60f7f0b860901e", - "0x35f51899f0f3598f5404c717d54c8a87a73bf6c35e6bd853c3aea7d43ec25e5f", - "0x1d7543572dbe1182893edd295d4fb0b68b2dab4633ff57d1e0e4dd7b82c02d99", - "0x671a058da676eb022fdae5073c1426c968000716c4bbd6aef49c5c0a6b53c874", - "0x9c2452d62612b3fef97ac9963995fa3fd90d81a2db0289e90c79129d4dd894ab", - "0x2efa7c7e33116cee6fd57c9a8ee0248f23442e9c8399c3c1fe863d42db42286a", - "0x33abd8343db227759b7b5419e30b2250103ccc94a09e933d0e444f501aabb76f", - "0x7fc9ab128b3669a39a4182334734649d17cb25a6f1ba710216d5d9e57ee61e33", - "0xcad51ad3cb303fb50a8b241bdad048c1cd77ef798c5533390ab3b2080cb213cd", - "0xd2ce540eafdc2d2f3c39cb1e70bdbff8244fe4ba8fdac7642185ace6eaac503b", - "0xdecbfcb883f42e13246bb833abfc15da577dbc5339de8a51c839f52d223668a6", - "0x4090eb0f97581eaaee16fe46aa23972006cfb6eebda9ae8d277639591052e3dc", - "0xeb7593c93e2ed5a116558c62bd4495dc50aff43e285e04f3ea1b33fb1331fa17", - "0x09101aca7268ae0b23ea94d54946eee9dfa97ca3e48d94585d4aec3ab240a1c4", - "0x80eb63054ea8f92439af44ac62cc945b9f1305398cfba776db188d128ac2dd6f", - "0xfc3bbb9fb0863fd29b098dd0376c3d08bf86df147c5e34c4b23a6e98f70e40a6", - "0xe2a02d63280e95bc8170fca15f25b6d9b9c5727e54d2e8351d61872a869444db", - "0x19b5c57507eb74f93dab64566a8221e0bf5ee12d935dce0a91f9923a3adbe49a", + "0xdf6b35b8917fb4a329019f595fc8a8ed043094f69fce53cf25713b62eee12aa0", + "0xe4dba47ca5e497aeb8a3162092ba55b8693a89ec95446b5ac547ea7bbe1d3dd7", + "0xc676a66efd658406785df1b5132e048d915fbb482d2eba628b8c8effc3f94caa", + "0xf931b1cbf7812339072e2a947e85cb02ff97297a2b1e5b07754e082caa4ef509", + "0x33a6d5d2c6f50d12fd3da5882cc7ae52a3763fa41c863dedf387c06b2053eb13", + "0xb86c187a83c72f94e0bb008907fa6de29f9e1b192db988f77be6084515c94a67", + "0x8797912315d18270feb851e213fae6ffb9c37f382bfbf636396f2cc894f4129f", + "0xfc19517767b1669261883f8be9634ac15c68f6ae266040b715661d7cb01ac7e8", + "0x05446487b2f5080500bd6a80e36e4d3e7b613a438393b7c937cff3e825459d70", + "0x6ecd931a9843438251ff307b8b1f4302260de59157ca07e6d85972d05ea95fe4", + "0xb91d5efb0e751cb3ebbd24112cbda376f4eb7ad5e464c03186a93bba4b7d602a", + "0x6cb2fb51669631659dc8a1db6e52a77df3f8c66664f94ddac0bbb0ce43928621", + "0x75ca2a774877db1412883e3da943d1e2183a68a33d5964966fbc90bb0ec9e824", + "0xedba00768634109c66444c8db57d888d9e6ce42558293f6a23735ebfeffdcd75", + "0xdc60d8a80d749802df843c50e302e68a9e514aad9d43c6b0ce2454bcf6cfe8b8", + "0xc15f1d012a3792dacfc0b420ab1a6e3487a2df6e21c930d0a14ae905db9669f5", + "0xb7435a4968d24e6930851b7fcdae33096a3ba0e230889d86ab8f90ac2a7d5297", + "0x7914e5d872ed69611ac3a10209ffc5fefcb38c8ccf564b6512bc989ae95792b2", + "0x4a716b386f3da2aed0babe8292720e18bb92e55ce7679095743d1b740d697953", + "0x37ccc4dd2333348bc3e976ec4f570bbc511d76903d7bc9437c477dff4e63bb42", + "0xde3a6f4a387cf78dc63f2bf7f4eea18868b85abefb17e6d505b48cb09194a009", + "0x55b64b69b00c46385488c16d7817c5e81006b9a51889e5cdb2c32b7c9a4feff1", + "0x1e9e701ef313384832feb969252839b1ff4aaae277ef338561779c84f9c37b95", + "0x12e0a5796e735f4842856b65123986c2030565f539b39ea747f922c5fc03ccd3", + "0x61c89368bc7ac74ffd1ec44ee995b3db68191f57eefa6952d9233e5e9c6b60bb", + "0x3059ea102456b82919b637d3b538b5023435532036135d908727dcb900df186e", + "0x4c3a183c65e5ae082eb70d02245c7503cd107a9ed88368a49ce285c39c408531", + "0xc5474990ba1ea187b25527285be035a319dc209c770f85edd74831b8e0a334ef", + "0xbd2d03f5b8c3db183db0406da52d1da718722ab693c308274eeca73a187f411c", + "0x18b084dd6a1dea14f723e66b3ff0a4f7443b1e2f75102a18731856bdf8083a20", + "0xb382e9f817eff322c266b7a9f049d89ffffd6679891d0dc112cced1fa9f99b88", + "0xfdd73b0b331149f19fd10ae36f6b36f9c606d9c7a1e2f691723d3666224a18e0", + "0x4863141f0719e2e680dc3ef0ff4b653754b3c03dd7100352df6a258b8dd5706d", + "0xe723ffbe55d9bdc2fbdcfdcad4607b8de877a164df77e7e05a83f0e4d83eb85b", + "0xdc810ff9074fdd3775a88d85c2e8927dea227875c58c7fb5566f38f6488392a8", + "0x774fb725fcd97b11814a16bea69138ea116b73083fda7645bc65c51f4a819266", + "0x83880cc19b589492426547c6d58dd68a115b571cbe5acf5ff10fb8597c441aa4", + "0x9f7e00ddea20834dff9f34ae46d8bbda756bfd986fb589b0c2bc86ed459636d9", + "0x254f85226184761f26112118c2ef55579c733f630f2957698347d51f166255d8", + "0xeaf894baa7be3f2380eb45263b88f21e2e2e3b83c46b19f00ceab99d60ccc09f", + "0xdaa9f376cae86d5b033542cec806ae1d99f6ecb9782ce28db67d6c1a40409b87", + "0x15d002f40378d87b40bfbca9490077cc7499a1388aab2862502a0bddb91dbd58", + "0xd289a431a680f31f12f3b312753e3d058b2496a985b6d04ba6e734cb8bd91b36", + "0x2c310b010ea8e9e49445de60807302a1eab9422e05cfe444e1f8c1452445eb65", + "0x29126fa71b142c307aa0da1073a778ce671367b3f38efb1bc288f1944db098b9", + "0x70f68698699b897cb03f6591a82b496ceba50ddf322cfe106b4aafa6b46be137", + "0xb144cef201499639497a37909cdccada285a2d153d88c079b43e9d11df554d84", + "0x8a505a1647e870e0e83847cb2acc48c87bc6bc8168c6016ae0b51e2094bd3892", + "0x6caeb16232f5c1b116da04279e734a2fadd158c92a75b2f1a9a1a480cd5bb7f2", + "0x75a39e091c302a01658f7a3be2a25c5b6113367c515ef84302561fe944e83edf", + "0xff494293c659126587d496644275a55d65a89d661e9afe9cc02fb077447f3f6d", + "0x1d15d1c8cf05f50b6859fd4174616255bc69ce65bf1d0725246a5299f42b3779", + "0xfa1688bef4f00e35c727b246c303ee74908d39c27c96242e3dc43bb7bb0cba33", + "0x14cb9fa28869142a71854fe51babbdbb01819cd781dc04adc77ddd6850dccc18", + "0x9695982bfb6913fc1e57c7910df4e7b22a6e9933018f0fe73a177c63609adfee", + "0x40c4cd35210cc0a2ddbc450754d182421205a3edb2d957efb39ff5bb8eef8517", + "0x55348cb193e0b8dd1ead19ad6b993417de12d804aff532619340922542c1ce49", + "0x45d7aa4f6e056b58b025fd28b39eb1a6df6d19ca895f1d705a7ad60f5416d4d5", + "0x398cc2c9add8233e655f6d7afd30e40969a351b434f71b99908306d33c912281", + "0xda81ba81fe002d230d119b5afccf7d0237e7adc7337e813d6ec0a28843ca0625", + "0xb66c544e92b32d0628618f4018fa9de6632bd85587e89cbca98ee46615ec91b6", + "0xdcab26d03dadbba947389eafafb96c0706ec64a77459d842a32f9bbdaceb94e8", + "0xa28d2080acb86f11cab46295cf94ba8191ceac9028d5dae65090d64fb93c476f", + "0x8890f41f8a9f8af2294ee88fb451147c773a6da10bcfeb01fd3218884ca08935", + "0xd7a03d6919d4a25c229c5ea9184e944a609272baa0aa23edc9cfc61c3908ef7c", + "0x2da5bb5616b8d389e43c4a941db7e84174c096ec972ff000799cd324613a9f76", + "0x0849fdf089f5764f2ed3aa53d317927983adc489ce44b845b94f3fd0302f132c", + "0x9904885344ddd7bbe9827ce33e1a560881e13615d3e5e5901471934f7b04074a", + "0x0fb2fc7aa97751f64713da758273d02c94c9171f0170a1cb2ddc3786de2b37db", + "0x400975d18aa62d76029db3c4817d96448465adee36f530731218f1180c9a7cdb", "0x548f86b242cced4474aebef09438f0658c0443af56ca9924ece31ed9aebca3e0", - "0xdfb2f58023921853043d730f44c6f1317b219596adfa4537d5b2488e81e3199a", - "0x478a592c018e346f4d37cca840bb2e4e4e46ff7cb261706e7eed9c0c6c32cf58", - "0x10ed470540cd92dea01f67abefcf7f142f87cbe31095f28a8c0ff501e1c55b67", - "0xa1fcda329b4d793eba1a2067a36c7446b0238f0e18311f0655f0ce2dbea0b09c", - "0x6bd21a8dad8e584dc0d1e7ea34ec14cba5ee146ba5ea2b5845b2b3f72af10543", + "0x4c7e668c1646961d7236100423aa83591b513b6bb218e00ece79723bdff29b77", + "0xe5f52493bc940d929eb027247fba74f5ae68fb4af2e6feeb61d9533ae245c147", + "0x9d9e92185d65eced764d9a332ada4f17357a69b79576784e91474ed26d3dc831", + "0x9c037be359c8f11e138f87d6631cd31f6c6724047a9f92394e73c2b7c892ebe1", + "0x0993a940d28293ba4d701ec7bd8a9c024aa35f997e8d5681c9bc9c34a280413a", + "0xb7dcf710ba60a6f29eecf0b7df3cefe292aab5f6f186143671f7e9e15c8dd0b8", "0xa5873e0db289e9ac59bd09778828b8a93913b4613aafaf8bf6b5b2e9cdbc91a5", - "0x4e5cde8f9c70a26d67cc30b37a41d550d8635e26910b5796bf93eea2478e6bab", - "0x279ae6f2f6196c7f7bda689cd05ba7c931576098212cddbe504cd307f09a0da7", - "0x780d02169205d515e0e034db0d984945ecdb343639d42a508ccffea6ac937473", - "0x2c3fecb86591dd3c57a90588193a2f55a6acd7ee03082970d690feb35065f1c0", - "0x07cb1820baeb0e8ec2190b668d58f68eb4a934290b0bf6ca7ede0c5e2285db56", - "0x9be1b7fffca3dab8adacdcf2e2f4b70e3058f3511c20c787f695b38786c94a0f", - "0x833d0eb58238f3c1671cd0b502b6255feacd5f375651bf3c45a821d8d8df9819", - "0x74d9f671cd3ec5ddb3499efeb2e37b2865b7269b9e3d3354128c14b62e0c1cee", - "0x0dc9f2e17a035acac903ab0e3ed2aa15b8eb1b0837e831b6769f17a352f200e8", - "0x3f91d47f08ce757096c819e6dfc1fe242c66f8d5565241be9f74197f1b25f4d2", - "0x029e7019a8f520a6dcc178ba8902f48c3aaf30b4e3572d586daf8daed51d8c64", - "0x68e32476d20c901652a73fd72a0deb14b92d4db716b6115e1cc60a2c39f821fb", - "0x4db2f08742b1b86b80beb8a104fb348251bd7125e7835e84dc38a6c80615e439", - "0xb055fef10359523b088d94cbbac42fc61e58a40b22b8ab53b0eb1ca5ceb8f5d7", - "0x7f10f2c781b40a10c8888c075cce1e250cf070dad6ada5f34b3c63c8e66761e8", - "0x59b003cb8094a3810628b8fd8f6cd91c202ad57363a573d0ff5337a0f1c37700", - "0x87736c7f8f15b825db204a3959e1b90f13b66d20c6974068959c96bfe105e39e", + "0x2699d2744ac82416a85df765c4441686a8dc899fc90664fd6cb4d42ea1bfa70f", + "0x7666f82ad8d0b794b0450f9b95090c581772f4bebf5d7794c33a9eaba823106a", + "0x435c6bc2c64a2008e7bd3ecb98b69942a472b8b742ee5ddd8a4172b363319e69", + "0x136c3618a26829ab3cd24f4a18b344f8fae282353928f9d2b042bef6ac4ce967", + "0x8d2fb27b98af54eeee7e48dfcbf5000e92387921824c386855ec9bbfdc409b16", + "0x5e7b2d58a07ca9c12f0ee57404d5a6fc857256c470c020bf2ebfd83d2f635a10", + "0xa0643884fd145e1c7fc7ff49aa0670d1aa123fd949fecea5c2b73cd8c7f6fb65", + "0x40ab63894fdecb8e6bc71ee9ff62e0608b72e0d49a1d9a5c1473441821089a82", + "0x1f122cf8a4851bb6dd5ecd6b53d61548d42fe672220b3f9ac52448df18398f3d", + "0x2e1b58d008c8d80f12b54d8fbcaa8fe20088bed67d78465b41969f20f1bf2341", + "0xb2bff184e404be5a022b98dd04fb0f34f56197edb5c64900264ba9245afd3a07", + "0xf6333df7002f589e571f939fe3c6a1270867971cae04a1e8366a57cec78254e1", + "0xee34d54c40ef603cb8a4cc8f8c585f1050540ae60f9dc55a8db1931f44d50d3c", + "0x08ee5b97e66a5cdb5cf828fc1fb8f94ac6be2cd36b94d191385554b1da8284ed", + "0x3bf106806567f2f6e7b179559df51a71b5e3a525a71450a89ee01082b6323d3f", + "0x24a571db61b90f252acb4d3685c60c7245b5bbe70044d1814bddbeb3fb38ce1e", + "0xe2b7c64f2a89df1e61a7a5bcabe945555c906eec1427a5b31a1b6b22dbf423f4", + "0xc3bd4c375e31ed9cf73da7795b53cf37d78e604b0e25a2c1f1e92a344b691e8d", + "0xbeae1bdfb3f051da74449a74055f5053f101b5560b526a0d5b89932429d1b2f0", "0x8c01823b41a9f7bdbeeb2bf755beb9f8e7e55e855759c3866b23024ad11a810b", "0x4412fa13f83c6efcb68cbecec06abeb88ac3ab73ed3ba24e66de2bf8b16bf773", "0x2baa43e104a25d79b3d8fd128c7c9659fe8f0f7fc1f77a818e7c7c735a60addf", "0x1fd27edb9145ba15a69d77be6901b42135bb337ef4c99688ab6808b98cf1032a", "0xb0ac66a2bf55bac6a2ffa2fc51bfd5aeeae847d33eb598e317ca9b01ab2edb16", - "0x7076f3389f1ca1275d9be3c00913e0486cd93b4d8184fd09bac377cdaf70af0e", - "0x40999b94eceef7c42f8e63ef63bf69053d847a1ef1b45ea89589e7e6358de1a2", - "0xf260441296e1838e2ad4b8533e10b6a7d8d0ef3b70cede59bacdd601686207f7", - "0x11a62406b19d7942c0b3361387521ac0323af0fdd1daf06e0c3c608584154c67", - "0x5479024368d5fa0b9b3dd3556dfa9cea5396aa1032a240c892a004b959b5fe40", - "0x9e2edd07c2c5b5193c7e3de5cfc9db1d4a6f694f1fba5141a8f0343fbdcff963", - "0x061a6767161dc6d02a43280df0f2aee3c53dc504d73159d85e21ecdd94c88e3f", - "0x27c964f114ec53d9c1871c185a6b8b5bedd678c46249d52781a0557fef115324", - "0x4cf7217874d9fc4f42f4b36c475a63bdd9f6771cc6b24e26db135f51808d59bf", - "0x1422c91a4fee25d755ae3ab1cbb34099269e91a4cc92860aa5f93c99c9012f3d", - "0x22c7415ddbf31f17b3485234f8dc817d8161d6b0ae327a38c07da28106d114e4", - "0x4762f32ccc5afe5f2cc09eff8bdc0fef48e3d11680303be9d27576683a889126", + "0xc42027e865465c19d6458404c5db51c0e3f4a2346b2d7ebf823139b44a5b11e6", + "0x3a8853af8ece1daa2d6f724eb06610483375b0408811c9384df7dc0239c8dd40", + "0xe9419f2c466fffa8bdbfe24dc6cbe971c45735bdc448d704349ac333f1eadb0d", + "0x56c7459285df61ce68cfb3c76e63297006204c37e4fa247125663bfec82e1aa8", + "0x8684a6dbe6d74e3f32604517613fcf5cbdb53cda6cd2552bc3b8876ab2b6f9f2", + "0x8289ecd3d4ad58a845b3a6118a5a9ded71c89ec0352e226ff26490ee9d1980ea", + "0x91def919b21e0fe3b4f1d979097ab096b9e118c530a69d8837209ecafe04f655", + "0x5134751053068f736461591ccdf285fe4bb7dfc2c72c06464390b75de07bca91", + "0x5be1eab9070f0f04518e93e84ccc665224c35537c4ce1829669493c0357d4438", + "0xb10b30d6a272d5348bfe0dcccb209c2f62ce9c47e972fdc850878b5dd33b4700", + "0x22448ba3257f7b62ade1a50c93318684b7d0e8af0d8e16a10b0c1274df6db80f", + "0x89e3ba2174156a21ba794d8fef5e1bf3f24c1d2f5008eb99e8f5b1bb9cb0916b", + "0x51cd1b1e6b61787ce569c776bedcae8e393c6a28da2820edaaaebeeb4e424109", "0x25b8425978039bcd976507924ff7d609948b268529527ce274feff6b43757a17", "0xc585e0998941ca2260431dbae640fde6795cb519c8a49b3939d1f4f81d23fa6d", "0xd8dd72480139f21404d7456212ffb61f5e3ddc5902ff4a3152f80727cea6834b", "0x1a959742df084fea7436599236452a5a0a25fb4acc2c1f95416b83c6fcb10a94", - "0xbf8aa876018d3ee0bed0c11ef0149defdb13ac74a17568f269be7fbe568efe36", - "0x18578988dd4f7980ff84bc23813158dd80d71371936a4ec51a77742f88eea155", - "0x943f25563f2466ead01319d840d7ecc72f136605eb1cc49e8890fec847c25693", - "0xbf43b0a795f945b5d87556bb2f5bd8cf8872d7ac39df4ea75cfbc6be49a0daaa", - "0x83c007294cf4a10ddbff635930f41f8d28204667fdf7a6ef00a2e98ffa9ab39d", - "0xa72460baae2004b5caa54dd290596b4ec11d4f92dd3360bca3a659019499a8b0", - "0x99eadbcce3f0d487daad2b19d645283002bfe1e661b1e80d38690fd68b406b87", - "0x104d59ab76e9ae54e8a98d2e537c852c00e4fcd16591d074753088dbd0f8fbf5", - "0x2cb3bc4edb5b8ba4acd1fb86b05f1fc85c7268e1db06117f7539e9ce76f89134", - "0xc0848eec7ed651c769405d26d4309ebb2035375b0811341e3f8756baed2bfe15", - "0xcb84e7661a88caf8684358e409c1610d44d42da60040c51467a377afb7a04ef6", - "0x25af246752f40f673a46a71929143b2edc97a744f25f149b3064f8416869a144", - "0xfc7deed1d687c039a5ed13d47bb413bf848d8b157c7de0b6c6ffba9f8a57a680", - "0x2109130e681f0c671d44c461131b2322f1c0c9e8915a210c290570a8eef228d0", + "0x6929c5dc161d31dcd79bd4fdf3e147e913a98baefbf7b45195f10e3b8f92b873", + "0xa70b0262f3e45eb55f735ef1219e3cb0e02d47c1cbd4dfdbe61507a96b2b45fc", + "0x38e4706e43b28ed99629ab0f458257d015120a503c56537f5b1c26113ae2ea34", + "0x94d3b6eb7ae2c6d611c289ea78f914b8a4085c0860e73442fc5fec1e9c692a31", + "0x4dddccdb1235711fd18a51bfe8bbec86b6e1f0011c267ca1308bc7de76328e02", + "0xa2e8cdb8d05d04d04b2e4fd92631d97d36da10602b9081098de8c64b9f0e6997", + "0x633754501370b61b6a89b253a96c19bba1717e539bea3f6f628519c93ea64ca8", + "0x7be08951dc0714ec09e929602d1f5ba3daf509ccc7918722b201a85e5d6a3094", + "0xb258da6cdf55b8df38e2c285fd8531dd9bed21a7cd0ea19f45895d389b52ed09", + "0xf6c01265b3388b9324b2306c88993178af7968315491b615c49eb840ed3a87f3", + "0x4e17785f9709a70775692bb7358980c183eb63f9ee14304e37484fc3d208fd02", + "0xaf208ae1db4a0f7313302f132349c24be4516c5bf2fa120afed37d499f145b16", + "0x488a93a71b0b16365e122f4a137fe53712c301ea62b80ab818061d0b57613c69", + "0x024099c94492c8ec89f7c6928e8b2eb52dc9dabdf50215c59be78d95c96a8dfa", + "0x0fc13aab78aae553541dd0e9a10160ac4403077e35f24cd1d4426650f230cfb3", "0xab5f3c46e0e9827c8a7c79608ae5829e433b21ecbd2c6484233eb476c2c7ab09", - "0x498a24c26689639d0e5de0e02a090ecdd7a0129d4fba0acf88c9ad4478f51170", - "0xc0eafd8a0db80a9618fe136f8ad7bc9529b5507e80bf2a1b71a30c9308590784", - "0x84b1eec00baba1906dbac3759445d4d9d27195d65b9b248b376c30daf1645982", - "0xfa427b218dc8c8324540a61afc61eaad1fd3e91eabe13c912450cd099b42a575", - "0x8c73655251254a1529316c657fa2da188484816204b33fc7e80fcfedb173ab15", - "0xfa48e7f2737e227371767975131e497b2d07432dded9dcd6118f1102d44dea2b", - "0xc42187e8c7619ee9e85d9e084e00db3777a5024d4fe802d0b679267dbfd29948", - "0x24276c9d0ed54caf7f77bb4fd3e1478d26baa23f5ca657a7802c9f24cebd0408", - "0x4acd1fdccbdc4867f39ef0cdfb3eed2ed60a06e2718ee8380b19598516431c28", - "0x105d0340a3782268bdfc7925e32ae03dbaa997c51e66ff6d77bfb749b8e3f2ce", - "0x6aa2f3de7f641a0c12027cf6aacf886e08620981a29d340391bf8c2e39466454", - "0xef50ef7fe6f4351b6e5d757db4509cdcb4a4ee60633d2b262c8f8f544df18020", - "0xcf5aff8432d8a4cc87209a2003aa27b0ec5b55e5fddfdc084dd0cec61c177bb6", - "0xb954e141a0992f19b78b9440446f3ede62c38ed1892c28bf2a597b7d4d4507bd", + "0x65ce4423b3163c550b4a37f7e3523632d579f94a315719ca4505f6dca28385d9", + "0x317f013c3a7e9948520a1160bbca1a786af2912ebf8b2a52861c7d0df7fed08a", + "0xe9f5f7a0e49c8a1fbdab284c31c8009de796e6e0195763e1e147ca9201892dd9", + "0x07b4e6d2c5007a71fa99c67f25e98cd7e7422c76f5041a46f145aa832e861fea", + "0x3d0213e819bb0dc7d408a846625073bc4d957f757aa651716d7bdce17425c6a5", + "0x23ce42822b8a4d0be074fef3e3dbd4764080c901d3d2c19e201386f3fb65a7ae", + "0x639b75e1a6b0e63ef81d2ec540a3bfcebfa56698bf053daa9bc18da30ff1348c", + "0x41eb1cbf743bfdeb0997657cb77a806e0cebe425609b5a2f544f760a6d723be2", + "0x025e581f8a9dfc7a96def50f281885a55198646b2464f054d356a0efcc0feb80", + "0x429faa4bfdaa83c0d45f67894958758635c2e1a78ec3b63376da7e3237bfbb41", + "0xaf1c2ef24fa153637fdc2d67b1ffaa599b9a09fcf00086d20cc7c2d054d0aa91", + "0x8d28de3166d0f226fcd89899c622d7f43fa20b6ea4eeb81976c5a08ddf09e5c4", + "0xd6befb28c9dfd0c738797b15e237bfea883bf513b07c575259dd5a4f2c930692", + "0x1ef2170c922c4b149c888a1df7f3050e3f46b8ac1f0224f802771a0e8d38cfd4", + "0xd052117f2b8ac75d0446ab5d0e76b50a510f7482e65d0a6427a3d6873fbfe7e6", + "0x53408808bbe0893decb31a82c9716f56e93034d2a11d055fe71f5286e971e1bd", "0x1a1122d7112ad6c06ed06d7cf20a71fc3654f66cc0606e6725bcbaa0ae190f7a", - "0xcbf56267474c7b5e9dd04e148246bede54dcd9d2a26a307dc570e90d148e45cc", - "0x19b1e94f46d4493c35d0b65458091e5bec57a72da949cec30d9b2657765cc655", - "0x296c32fc49a6c7ffb948e27cc5454045f14aae3d89bb2effd868934f341fde9e", - "0x65639c5e880d338bfe50d102a8b169d2562a18fe7dc8df6fa91bdd4f6010d371", - "0x63c38ba78afb97b98d7931286606ec8d5f5065aa32a026e82733b28a9c0e7ed4", - "0x383b9a43737ac338353c9eec3d5f7e98afe14b6dbe5d36784d9f8602c6a6262a", - "0x3482a1fe9a6d41dd9eae7484ff756149be56fd91a0d772ea4a796e812bd65b10", - "0x2fee05502ac990a9dabce7982d8ca1e52e0fc3bb46316d3d7d5146ce5564267b", - "0x9f2867549450044a02a75a886466c9454f5b664c926621d9576e2555a1ae0e89", - "0xdff577d8ae14ce3abe1706353c37405a88532b29370ee3f8ad87e14a2f0873d2", + "0x1a55ff08504dce5ddd7a238eae153ce48971a6bd38d7a3dca060138996ccf1d6", + "0x2ce13ad2378c450200eca23f756c06071f3e612b2b9c73e1c6c501ff4c02b1f5", + "0x35f144ede85fc609a19a5748ab1a3a5fb2988bf6f78f8210c16febf929dba561", + "0x1df10cd4195b0904b792aeec7d5723d1d150386bd04b2f5f0df5deadf3c85ff6", + "0x5c7a6f272a83f6bab673609a539f31d7c67c67fafea6d3034e07ece1362a829d", + "0x7d668480e1d312a5362a3c5e8f885c1b2de095aa46891bff34592ab157ac230f", + "0x6162f3d46eaef20b59d1a491f74f9eb14b724a840d8d023ebc16df8fb775e7f3", + "0x5963e212267c43898316f3e1112f4834e7a271ea685f2388edbe888e97e38b7f", + "0x2731e65738446fde914975f713c57a8a8f4a125281d575c3a583a5dd36e0214f", + "0x3cf5ee7469fbf7063c7fa552dea1d0251841644e689dfe63e548e2dd0bfe2eb4", + "0xb28f87b5129aeb448bcab637389a294c87d8070fa18681eaab06278ea4178fe3", "0xcf22ca62643b004a97845a72d50d8f686151aba153f68a596a1bb90e9c42c45d", "0x64ebae35e39f00c73e11e3956ab4e7df723aeabbc3fe46b671ad5b54ed6a2cb2", - "0x717b01257f12a815d08b2241aef449c0f53dfaa831bfe52d97a0d1dbc051f1c4", - "0x1ad22b6f2432d6b2ac1473bbbb6e1aad1a924fa236090f68e2b070c6b168414a", - "0x4cc0a7bad191a71e7c3fb29ed53b52f3c1f665902781bf19403367edd8c3fe19", - "0xeabd7261d43b3abc08a4178a8e94919a69393d9a52c40eacaa95afef020f01f6", - "0xa1e92e86d33073ce01a07869237f29fe93fdff9826fee27d8fb6e7ddceb571e0", - "0x347be547c2d98c83362a8ea9d22ee327db4e85c808c277df8b4d63e5042e1dba", - "0xbcd1e2e05ca555533396ea9a4a3a9c30fc60518c7d1d5512a84fc9c22c5a3161", - "0x5c2eb0dc9801bc4724a45567308c65000cc752432300522e86809b257fe74615", - "0x4a2355181c6b808b154e2b92a15d704b58ccc9928bc554e53c93a3ec6b4e4c3c", - "0x710600ebdc8924bfe16725995a146552420916d96f24887c4413caae8ba6764d", - "0xdc047341bc7c3a5056b6443fff7eebd9eab52aa7a4f51b4ce8592f7a732f3b2e", - "0x355122b62e933ca43ffce9dfd1bff2fc5eb1a9218c8f9d82b598d1324146434c", - "0x488ee9ec2fc6c07f65b155a943fa08ee03f1c4a7dc7ff40451bdbc63df1ba8ff", - "0x2f6cf657733ffa474638975ca53d8589f696fdf719c261d991ab1c54417b4dab", - "0xd579e040a00927f24cf74a1c40d7f260af635e032bb2c2b97b59496ee112490b", - "0xb56eed5617482628beb1cfff96e6ce2e47527de7871f19af9cc8c474eac1198f", - "0xa4d211c3bcf1d3c29d62c374d9b50056ae6b95d0cbad490711bb792e1d15dd9d", - "0xd29223d30f7b106008ec250dc17304326b56b6ff2b3597f14187af55880e1531", - "0x18fae4157dd53882b4a9dcfa8e436b63cedde04a203bd2517e68cf869d6a81fa", - "0x7abb918390d894d5830bd65ccfe68661e52ab1a6218f856148d660c5e656ae90", - "0x83d8758d68b3b789151f143220d937344cf942c27e28c3db1976d1e24370da66", - "0x237cc063914133a7e47643f02c68da02b963ab66a782017a5f405803629fbef7", - "0xa5e7dc4a8fd30aa8b5c418055124a8c59a98f0959e4441aef7cc116d76318c31", - "0xb0d2131aeb093e758633ad5df607bb68bbd4944246491e7914aa6eec3f50848d", - "0xf4be91d1ea45d2cff0ca1827661fc79742e41631803cd54c9929c60fdaab7472", - "0x02309380d54482ef6fb745a801f53361cfe7f2c858f7025df7f14b949b223369", - "0x29fea7d0799994ba852ae43b58840ae0ff388c275c8197fa85e80537826334ce", - "0x70b14ade39a58b973136ba6b7300ea7024f5e58f9f84a9443a7cfbebcfc66a8c", - "0xb85cf1be91e3117933da3f67c83136d342cc03e20a7c0d5bc6c93e20c873fac8", - "0x4f23859b9dcd47be65b058f51a217b08ece7030b2cbe4abce9d5be96af616962", - "0x8859fb7c10977012c8c37a3908d0e9872bf5144067504efcb964b50f63d0deb9", + "0x42e2aa81b708f8dafbce1c10cebd49f8fe1a5c00ed9157beacca685f067ba692", + "0x443d868a7f7996ff6a05c986a637fc4ec1b64fdedc2c61447eef73546ec015f5", + "0xdeb3882ccc243aed58e3544b3f6ac9ddbb32bb26881f84b0e70ce0ab6ce80c16", + "0x6af064aa512f4834dd0e6e8b19bbb9046eaed604ae79f0ab8d872f2e3809ba6f", + "0xbf6e3dcf16b37125eff5e29429e48a890615ca887c6fc3ff05299b7432b6e470", + "0x735cde6d3129f769abd894615b22062f78e86087e3a0d2c2e80cc2d77d3b9e1b", + "0x6877f34a9fbfda060fcfb08ad55c23ceafd9c223ba860a0634ac1b8f2e89782b", + "0xd9189dc462222c2f14c11f63de4ab424d61bb83a83146d62df952e87a3e5da36", + "0x720eac89876cc9a772da7974d5e439b67f67ddc9baa3a9452cd4b74015a3e2ba", + "0x89824ae17ccab48a435b8c36320b18be8557a9dc44fa6fb2c3febb3087b481e5", + "0xe7d412126456b86597bc9aa0745dd13e8f057a79e8a547c1d478abd16bd28a07", + "0xc23a9160da1875e9c7d628f94d414a4db4aa2f5c4100e226484de948ffcf4b76", + "0x45b1b602c91d00a3abc8e567db3b17f75ad500da30b2c51c03767900495e361d", + "0x9caca224c29960f1d44b46ddcfbcc076e690f436f3f19980a0565af929402792", + "0xcdbc9adaddf96f8480c73360b4f06be947a420cb842cad3600b3645879d42c26", + "0x5f2cdc3d2a8bcfe0631c4f981cb69079342dacc4d564870f5574dfb1febb7c9a", + "0xdd004991aa02fd318fbdd65c14c5c333955b66e0e5f529896bff742d7a5adc34", + "0x4731042530e21dd524a9b599bc7d8824b7da45130f7f7702c9266fd6f5f5fb6e", + "0x966fbcc1576acc365efbb2ebba6dccb57cd211bd42bb10fecbac7577e38393c2", + "0x26dd365d2cb06f1430e28437aa350c21ce97e431f730e03bbc1ea734dd5b6139", + "0xd3ca1121c409364a6ac8295e790950ba94a91a9f161029e3c95f852ed3de405f", + "0x05cd39c1ddfec076c18da28f240551b1e78d930d4cb2eed4e749d37a8ca1e361", + "0x88b7084cf72b284e93c63729d3874ec3a805ea586b44e04d1ef31036d4d327ac", + "0xb54478d783008c30c6acc897d1e9e491ecf26c89fe88c1ec33a3b89534229876", + "0xb8dd2933944c78a8fc14a76ea4b140380ec751cabf3915e5a448145745b501dd", + "0x41ac0a58ff0aebca682eed3ec85b477a3ea81694e1492d90e5fc4ed663ab4c54", + "0x4a06d54cdc1be23a75c5240467745b8fa305c633ce75ed1cc54d6d02970f456c", + "0x259f8ae459874dc723fa5e3e34a918c98a88c0a3fe929d82055fd91b1bb05d2e", + "0x051be91ea29b718a7add99265046ef67873dbaef9a3155e1554c338717d515d4", + "0xedea3275ff9986281eb6d60cc5102ac7b839c20ad883db87d39e31a0a29dc114", + "0x11ddef1858c9ec82278078136e684305bcb7536faf9cfb57221b80ae25b429c1", + "0xa64006de9bb27c090e0ff1b5ea8796ec172baa7f27d73fbfda57584d00b254d3", + "0xa0189ea7fedbb90640f118b8967ce54accd3a7a9fbe09522c7a273d5b34fcc08", + "0xf4265ed608aa4c1c25a3ceacf4370ca9406280dfbf7db8a7f7516d3a1779fbdc", "0x01669f3a9ccb892e5723a4ad5a91d3c1fd28abb8144e660f1c56bd456ab71463", "0xa973b694b857005fb9671fd35ce6b5b9dc76b81f42d3bae64d80d04fd20d76df", "0x43eb3c5d577726e616b2e32c82fc2280873432f14590a5f64dd804ffb8b0ba89", - "0x42e831ddc9c5fe3b84a613c3dcc3441672c9fb7d71353f79aa9b67b52b08e641", - "0x9be737ef89b499aae3d096b4476b59b06f1c7d020e1c820d9c588ed918b4156b", - "0x688d8c0c773bd26cf511939e8c276b08413bdb808862171c60c6ecfafc703ea1", - "0x53edba14a851a94cbcba9eb19f464cc245a21d836f0fe2676d5f78a56251d574", - "0x5a11d24981aac061b2c5773334baede3f0bd841092abf79653581fa4e891bb91", - "0x2b68b7a11afc8fce2eb19e3d3fed332e0ae76f89495cee6d709449e8264b880f", - "0xd434f99da969426b273cf08be103b4449c19573e0301ca4593a1fe6d3ed05580", - "0x6544154ab7b8fb8e131d48fbb3e238ea63627cbd45c02594a00e539cf22ebe3f", - "0x506597d62c0049266e996f024664229bfbffe00fb7c1d243787b8024bc819423", - "0x7f3e71a6f8f8bbbed3ca04f9df449d8de225ac96790851a0f4d50d8dedcfc58e", - "0xeb6a12ffeff5d6a827237f67b3bc21e5d690acef72d2ec251144297466379934", - "0xed80e1c32284d5ee775a084cd605a8ff9f5776eae14a72cc49edb1a2227d7712", - "0xc59a779f7f6a8d6b3309a68b31d7bbb24b92f2f83a41590eb216dd314bef3389", - "0xab98f03f9f3c3809b29e51d6d18c3eff59ab4c982ad104227e81288e7c42b893", - "0x17efb05475125a17704a30180a4d1d977d9154546905251ce4ec9011fd7af203", - "0xdaa067bb9abfd830f1af36824b7fa824617ea60e71994948e8d56e8e570d8dd8", - "0x27b0206651ebae7c64716db3ed5f2328fa2e3ef8121d09adcd35b5e640030c72", - "0xb88fea5bde6f031231c9539aa865f852a66e0749119f5218efa1e14a00f7fd33", + "0x74b185addfe02130f2deaae75f43ae86e99704482c8a5b37b391271710692407", + "0x4a843bb52f67d924c656d669362b6746c0ea612a5fd354fe22541b28f2fbbe52", + "0x75c8cd349d00f09b0e6256ccde9e2695a5c5f6024b48a6215b9cd7b3cede2ee5", + "0x43a6d15e6839c6344cd10011354b25b480a3263262de2a358dc7e93c8ce0a0f7", + "0x0f74441a9c3ce76a08ed1ba535f8d84d57a7e8fc899bb5da529a23fa70a28dc8", + "0x2df1b7e2facc06bb29e451c799439ff4299f36982923ccc02aa2f9e07a77dd39", + "0x5ad0d3c266f944b8eee43ad41ffc0d60f16f287c7fbe151ff9e1ebda0b679ee6", + "0x825822586285b4fd8f0ab5d8c4a61da4e91aa922017ea02fc5630ab10ed06042", + "0x8a03470224323a36447c0e28ab363e972928cbd70a9ee49708f913f2381d077d", + "0x43f53515812eaf21872072725410d1da0fb4d6a115625f87c742fbcb993c44d7", + "0x2af1f3aa474800409875b50901a003987a7a8281028b6b5d6e28044ff6fde529", + "0xa3685feb85e5323f1e77c300246f0c34f8c0eb65f5422ffab434df4484a4324b", + "0x6f9924a114f18b63f8460b5691b0e9b987a239e58699496a68766493eb9f9d1e", + "0xb56e27045264eab13a2361ccd8e2517d495ae8291bf00a0bb3fed8508881a153", + "0x8edbe71b1dd1b1728904ec4a721fec0e2d729a3a2f29775141110586efd679d8", + "0xa1cf3bf7cb6af61e6f3faa2826c4962901b00dc6cf548323ec4c6710d3f59132", + "0x95c272c1a208abfc724bdae6a5775629f57598912b522446dadcb5dafbb69696", + "0x4883d4a7c6282329772b78fbec671893caf2faf6bc0fe455d2911b5360ec27b7", + "0xc1ee5e4cce9f2a0975d346c98c354439818eef689ecab30d235ff6bbe4cce844", + "0xf6fa578114e682895cb1c0382aff2d3edf004effb53cb25ddcfdf8be62222b3b", "0x4918b3e71c42a9209b8ebee1a99b4e36ac02ff60ba6921b2908aedc9a7585c36", "0x7a5a799a59c3993bde318668639598408cab463cf14aed9884f9e11a4d5aaa19", "0x00c5d806dd3daeeb5ed171516e967f1ec965352aa5b34ec41c87fcaadb7b11b7", @@ -320,18 +349,20 @@ "0xc4e1da3c2ad442bd0fdcecc641a5ae1efa2aa7201bd65e0bc1e4b00b0e799238", "0x105f340886d8ce3555dfc3a9d863421cda925522b21baebd5dc27870d83d8b23", "0xf5d919622d4c48ec64ef2e883264bb2aa856c2bb4e752d256042d3930e017c88", - "0x62dbc3849b57cdc4c686f533710b5dd634ebffc3a769df574583ccf1194fab0d", - "0x5ca9e2bb38fd8c0a92e94cc4c3fa3d2f9e179809d4e7ca4f15e1d05fbedc8b94", - "0x066ead76633a18d45b2d50d72e2fbba485fa834e5fc002991beb5fdd2993ceae", - "0xaf09b72e96fe111c787398c56ef3fb6df1e706f090431fc6305267e9952d0a5c", - "0x0b01ab14d14ea779797ae4f7e22c0f96982b3c56aac9ce773474c80f7de5be1b", - "0x49a206c18b480efbb48202b866557132cdac7e60ca16f528f236d87c563f8115", - "0x3fd421b41c3aed1952b537c4f1e0c0cacc26cf1ec655d7580503fbdf5ec1caa2", + "0x74d6e9e473d5b1cd37c6ab834425af7656f4c8e1b6568880c2e9f0260a401dce", + "0x5597681758fa83f8693d1b559101836e0bdc927193585f890b9a384e8ff9fbd6", + "0xaaa6f541d94a945f1ec7e393575ab408cd642f84dde8b0aa7f8430c19cd4bcfb", + "0x3260ed182f22d860e2b625533c808851589f2e41e55076f55b5cfc1f4341b537", + "0x459fe6b554f1ef48f468e61e8ff8b9d25427aa7f77ab2b6b14f630aebdb611e1", + "0xa84089150b7cf977942f5c82db37787316fa6f4940ac9eb06f4643b29ad17fea", + "0x25cd2c9ed7ba5e33babcf1afc091b79e06adf05de370d089646cb801129b9457", + "0x04d61067ba7fba6ed30cb4fe9a40bcbb8e2782b187d8d6a0e37766a6c01fcdb0", "0x5fc3f13afefc4b831b54c523ab256e780a4ba9fac52fb7dbba4f862ba44b9c1e", - "0x794f6893d5cbc5b958642b6f00e4da5b8f724b2ef78f1836bbe0bc58a21f3cd4", - "0x59f083418d0796b9eb9e47321eb13c78782cd1613ef847204f6e04a8044963b4", - "0x2b8a50800566718ec8efc339461a56c60c78846d7d1e3f308d43b0d45e98b788", - "0x3cf3908761e06ac258ccb2948e22cacf5b7f8472dbcbd3e60a084cc6422a3824", + "0xfc2679b65b13464cb3816807021e38ffa4e0bacf572747f8c046bc96a4739be0", + "0xc9e9598936eed048b87882f886c008e52cbc98bf54c8c39928fa779b96e1744b", + "0x9c067fd47dee866de589129dc58d7e8c098f9e9833e325926f7d655694f35bd5", + "0x18c678f0c0c1b29f5ff5a83d2468667f1a8aea2dcaa128360958ef5d67f0de3a", + "0xfadb813be9a88e50c4ea921c6a0ba6c031f024fb99b7d6a93b8cf1ea5f995856", "0x15b67bb4a517850355aecc0e79b5582f3bf3790fbb81bfbcd632dcafbaed487f", "0xe3ad603dd8539011480396f7551ae590d25cbcca85fd0475fc7949307af009a5", "0xe61be68bf57656076b8b638237cbd31bf3a0692e225b81694bcfe2183e0e2f3d", @@ -340,58 +371,65 @@ "0x1c16cd293f5688f7d77a767195f36a75a1a62b886a00e581d57b6370cbec0989", "0xc9b5271fa2bb8192b1e2f8f304477f9fba0010f3e6eacf9cfff8b7a5a77f37d7", "0x8b887ec9f6fab09f1f5d3a9e001a807654fb49be354cf3b0f705a80c048b5b97", - "0xb950aacb653444efac6e6fd49baa29677d73668df5cf100327cd1ce44d99bffc", - "0x4626d8d330a13e6d65834cbe5f455493c931be575c03415f43603a7770197912", - "0x326bf0770bc6fecee44eaade56504a93a22be4df2948c2cc30f6b9714a7c2f47", + "0xe4b637a114758ea5484dfae511a5f0d88a184c83e275366cfe82cf1b35c42ae5", + "0x38b9a537c5cf522f99ada24f759b200b6045cb9997f05ea2f09c54a554cdaa4e", + "0x27b4c2fc7d585a0fbcddcbc77dfa0444cb1e915b303f91fba43b9b3a95281902", + "0x1a4de326e3538a53a958a8055ca6adf756e6e9f93976627d112b8343bd445c52", "0x9b369fea35bd85dffb10a24f9bb0074f411899e3d505a1549938c4c1bf80111a", "0x4888ecb1b51dc5d4faf8ad987501b298985eb5814d0b8055d00bf34d940884eb", "0xc063a2893a30fbc55bfd4395db9d8854a4c900f726af26cb5d1905f7d9dd6a65", "0xae493057cb0f7a43a6477aa1e7d1e62406d6028f8d35ce4d0fcd4e309376e911", - "0x12be9f0e279823017cf800394ecaf7898259db86d0249f3ad771ab9c53884089", - "0xa5cf92a1f2de9419004b7fab8ee8391cec274e8c5bab6254946186047e9a2257", - "0x4a1394f5c2dddd0aafe519d731b40d52f1305c1c6bb675551d6553f6c28fc88a", - "0xb3ca7fd27d67c740262811f91cb1369987f0c7a5363341bf652b0b608ad93def", - "0x1eee63190a3b8165c3951de2ac1122feb89dc4e553a5b0be7d627a0bc17092c4", - "0x8daa5bf9eda723441048b241012f832d3b0084813a59279210c15cdbbefb6df8", - "0x7ffd0992b0b87f9ee8a75ba1f7f815ca6101da8173e83e474d1610aaf99a1017", - "0x9fe671120528faf71ce7ff08af6cd04792480af0fa5dfefa7e9e3e90edef3c74", - "0x761215d1594d0f956e37ef651852c0d3704ec7059b98587bb49aa441c69a3272", + "0x116288e2a06404aa3dd63eca83992b6d74b47bf0b45a795ebce730e76b78ce4d", + "0x3c22d9c7ee98226ba96ace7f7c019a1703ef292033ac253381a8a18c2fdc347f", + "0xecfb1e3a21cf817dc12ba477128dc494a61762b50e67b9aac2e69964fcf08251", + "0x586eff30542d02ec75cae827877e97d665fef3fc367eac461ec58475b32e0ac5", + "0x0a3944ead5ce6674361157bc5a434342b4790a6f648e9729073afd02729d683b", + "0x3fd7eee2a25ffedac4442b6e60cc95d654f42351cfd646b821c00d0c64fa0e54", + "0xca89d185428c8056e82feff16a21ce5effc6cfcd23ebc4e112d9a5bf92fe8d02", + "0x020513017d2e98ffe7d52c07074fe4f4a6e77ee285623eed269203295a9f3616", + "0x8596ca7f91be1ab40c026b00a54a9d2e41e7ec479c197af6abdee3c4bef94a1b", + "0x7455f7f237ec777303ed925caf869cc73c044da6d59836ebc65050cdce20a862", + "0xf2761788609c45098d080e6852b9ddf8a966f8a5776da9cd021538e11f84c081", "0x4cd1bdb39facd85e2260d74f182adc4859ac26ff7d1254108111f60ad3c0f4f8", "0x428b1167eb9dd51624d22256637ad2dbbfe2549077069bdab23dde71c21c244e", "0x004752875df306fb127c07bc528646be044e7aff6a42b9f8508dd6d379528246", - "0x6afe1a860fc38122a4a4a2a5c29f39e899d674b071ff9341360a5fb04ef80bc0", - "0xe9e7606a4c96278a0e30f56288c9d361e4bbc31fe130278d77fc6b9e08d3a3d6", - "0xae7099c4fee11a5908c4cf736df52d6f1530c8e68b2203b02294fd40c4ec9df0", - "0x35f0a2c11d5afa5c3196884ae6e7a9dc4191b8216abd4bb2b6bfcf032df3f579", - "0xd94baf7c32c26ac39c0d83801ebe53ab0294900ca0cc038e8f65db8e960b698c", - "0xd01d6c2b85a9fb3a4841ea3344deabc175c88ae558f125c6f9ed6ac27f36f457", + "0x6400285ad904ca915b47b7259e9d0d96c7dccd5b4e57c4884f03c22aeff271f0", + "0x5766c8b8f8edf43b0a1d732396124cc629eb2faeb8246bf37f56956d0d4ece9a", + "0x7462364f2782dbdacdb63ed9ad7997218c3617296a92232cbc22dddcc2dfad3a", + "0xa92894f0d3b92a92a600950da4308cf22d02c4bdeafde724221a4df6367f071f", + "0x530b781fb432211530f407c93a0da55d97f7816103dd236d35a5416852c0dd92", + "0x709ce3219758a439bae296a980ee12fd3241ec07fb5f5f7d4c69c96f379fda1f", + "0x247299713beb0522b1d4b3810830f4a39c9d86dd11cae19a23996771107f8ecb", "0x81520ebe99b2944cc3f4e7235fdac6afddd9537ca5ce8299ae65191241d404e4", - "0xff180d388cc7b72eb4c30a33546a7281b129afc1cd42ac1f1aa924b72fee4108", - "0xbff2580e9cbc2d8a74a4e484c94a9a4749519f1fa90dda9c8dbbca3db1148139", - "0x3da349213483c0ef14ef7eec97d4f651c2614a02529a4d5c3613ca5e26e699b1", - "0x40c5575c86da1790c5922c7c38c605c8e7e649031a4d514513231994228b54cd", - "0xfa441811115bd08021c4481baa365eb0f3afb7f3cea17fa5e62a8e84024be782", - "0x1fd833b72bfd4a954cc8dd805411db47117c5bda9e8008672b1f403ad775a12f", - "0x84cb1c4d255692ff9a55e6bcbd174e6c4f2ee50a1bd2a2c8cb2642004753cf6a", - "0x1b9146f37ae6a9d0a5231662252b4323c419c6abc59f7bfc3de07968f873423f", - "0xea7d17767a8836bff9be0561d15d0f89f12ae783656f067f081f102ed1a5e280", - "0x5b33cffb9a4d2c3410d99b94ef8279b6b99f5b46a2712d3670132af43fe4bc1c", - "0x23c387119716f1d70be19ef0e3f5a41e7badd874df8815fe6cf8ca2013503f32", - "0xee87159333cdee6915b2cc3eeff6001456e8e99fe55c8be21e91da120a83c6ad", - "0x645da769e74d2e378c51490e3f0e9486beac8bfd6756c08a487d1718f73bf5d3", - "0x0cdb239c8d6f557000c7733586a01a4cbde0315e5eaaff8d7fbb0c4ec1826875", - "0x8bf90a7fd9e29d439be0890a9a0e8ffe950ad63e4416c28aee05ef4aa9d7dd17", - "0x611a5fccd8305c75893da423ec77bce9adfaa6c8b89dceac22b50640672189c5", - "0x681241f34e9469a54a4327cb63bd3da0df111a5ca6d6ebdcf84fea4e1e454422", - "0x42e25ca107a29d4f631da50f0af0e783557539755cd352e7bb622abce33a5773", + "0x6042dfa21ffff40bd0974974b56367be8430f6b6123ea583e36b4124c5f29d08", + "0xdcfd4655c6221d55fad4cef35b1331b40b176fda7fb6c11db7d5cc04187b4882", + "0xbb260bb4aeb3af6deb85051d1748cebb7530217cc8260ccdef741ff2d598dc22", + "0x3be72c045f8ceb904d36dcc39bee464ba632402add4183ad31af06e919be2881", + "0xa59c464c149d78f5999fa5ca418ce226310b77e2a6b65eed2ceba9cb163f176e", + "0x211c6bfa31fa5634f909063f9f69cae230eac9d2ee73a8a6d2c720f237352e0f", + "0x6f4351f85a0ecc56a09411631cabc2fbb23ad70cea80472c807cd23cf62b4fa5", + "0x595919648aca1b0c0ef865851d50cbe0f4f237c3e0122ed6bd423b82b41003d4", + "0x4d8d8faeeb2bb1b649b2797c5c77f80b5c849fae29a173ca8184037b5fc6263d", + "0x1d9484438476411b84dbe20316aea9b58f2785242f6aad39bfadc106b6e80b92", + "0x6fdc8e6a1d473473d96b41db69d5e0f54c8bf336e85c4f4a6e4c8a24f94e89ae", + "0xa775d07b533321d278af6658f3498a66a6d243195e91bdc51567722496275b8c", + "0xf6952f3a1ee19c7bf1033bb9b3f042e831f9b4619f01e23253f4a0b029013f17", + "0xb1b1dff80ec1ebef8234c0dff341d9c698c7654571f2c25161667e4edacf8926", + "0x8320f1f61918ba5d9902c06efb94d6f6cbfe8920438826b6b67b2658bb68e877", + "0x3f3bbff8c2214a0d3698dfed1c9dd8a99123401750ee9544de3d771d6f96bbba", + "0xcd65458c19e6cae7b81dafae385b148914eb6ed976bbede8802562034b670c3a", + "0x3d0b8a8fee8ed214f36fc077878672ecc1ae54695bbbfa152a650c15bc397390", + "0x6ee818200d32c0070dc6b369f6394b25a0bf27a5965f195a3fe1f2cf65438bd3", + "0x9415bd868c4cd0390c37d2e65c3ca154a374381702f128665d90f3dab2fe962f", "0x68f5a344f33a3aaf6231060312dce5af095880ebc8514eb80ed87999b69fc385", "0x95ef1dd00f74577ef674316005e24d2400dd5780020c8fcca5f3f119977b4afe", "0xa3b5480878ad9eded8cba26dea3f80d0b961b9cfb8b44bca5a68eab1afd3f318", - "0x9781101b3e945a12b0a714ee260ae8b9bf73378d8a2fc06f2248acb66ccaa508", - "0x9ce15498a9b6c54166c88a3f818f17ea75a44002b5f18818d817308372dae275", - "0x489ecf5bfafe6504e600c7ee3898cd3c7f912c8c076b0ebcde6e96eec5b0afaa", - "0xaef3b57893256328ce3f0a835ae3bfe6ced29ec28c55d237f2e847fa4e34cc45", - "0xc9d611a422fded5a2c84f2ba996633149c59bd9f0e861794e58de0cc92ee3f09", + "0xff7b0e331bec7020af8aa904b9ab8c06cc48b7589135db941481420f0a280a42", + "0x1a24b4b3bfab2ba4cd843e1ac7608e49a81727c963400ea9fe3c4545a8521b83", + "0x7f07f91e32a8944b1da25cec3f6770a6c59006beb03d812a7abee86a9754c7cf", + "0x009a4881fc115cf0e4ba01a9e78cd863dcb54f621b2add7db668699629c95f4f", + "0x98699ed254446c76bedc8bb46a34a4542ced2e6ab8e2873aaefe723a9884f2dc", + "0x9e3bff6c2d66c93345136effaa8f2fd70ceb37d321c8bf3e75df06e09b95db3b", "0x1689b716920f09241e075f61af0f9563bf6ed0ab53ee7b7f04715375d5abe3fe", "0xfec5f5732f53ffd71664cd52067a1a27a452f42582f077d1d1b60964c7ecd63f", "0xf7eb9544c668994e209e152cae68d41cdb820ceb71fdfe663e6a4dacc7a0e7bf", @@ -402,29 +440,31 @@ "0x4a3b3b514a8b9ecce13517a33098ad0ea50b86be59afbce2d852d5e687b6e660", "0x9aae3602efedbaed3563dfd9822138f49b482e52c620450db9eb05bce487753b", "0x92b2598c57f7e21e2d88c24b7a53fd4f2f808a11b9f49f6e196664013ce0a4f4", - "0x1f7d6f682168afecbac8a4788070e42ce75b5109412d3bbf23fd4e7204d941a0", - "0xfbf929255beab2379dbbd2e803a332b4599f825c0afc8a521afb9f8fc516be0c", - "0x326187efbd05c4486faa0f9cbd8f5470a21d6ecc8dc0180c6639d97759720705", - "0x402a292cdb969a042ac5f08237ddbde99baa78d01b99f4e19d28c6ee443413e0", - "0x6106c2d89f966357387b6e4e9c411b1cdd04076d58eadc08b9acae90979acfeb", - "0x8a4e5e52f9387c0bbf4882191bf89c55fe12e1c0d4e53ba90fbca3982bb5c541", - "0x759e84a3ce14d6c948063a6326e8cb9ce862b80e2fee6e0fd173ce8af1e7e834", - "0x2875d4027bbb39e7b396a7b32cbc113c12b11269fb60c62dfac3a63dd05055f8", - "0x6834628af1ba47bd1559649f4c5c880e62b5b930708a7cfade9fdd4c901d7bb7", - "0x1e9bafbe1af5696265a9422093134b5518dac9e0a742cdcf30c8dfa80fdb708c", - "0x026110a5ec79422d662fcc93923803d2db1b62b26bdc106ead63d07a8ee21830", - "0x2a84c0aa91688988eddf5d3fa3d2f4e320ca9f8d38de096fa7e221416b169b8c", - "0xb6d9082930579b93ee9d063479a57fe7f0f9f06d28925b83b02103de7ad4e6b4", - "0x9567504b8fba477559d5cb9bd97e9e7a4180ab915349b2c58900ef9ee2cd8c98", + "0xfd028c76e9402356958141e99215251f84783ebda9b02026aa151f6e0c9a9bfb", + "0x032a4b576d27c63c75029d008259e0ae303e2483bc5089fa849969345e5acd37", + "0x275d7b842c0891f6b9d699707a8572fd433b2f2f216147650b80416b2f81689c", + "0xba648aa2aaea74758ae39d07c6211b116ab1f6bf3950a301d755f8683f1d2583", + "0x4de576cabea90df466294c60d04d6010d54323ae6f158f9a9bbd815446ff26a1", + "0xb9592ff44325d6b1f79e56111273ea33968ecc88c134b5fe89f99f36f458ce3a", + "0x14a9963e13b5ef4f2e2ef934cc9bb1f45eefb0a08bf422533583e614c560bf22", + "0xdf6f48fa144d89c7d4f22302a60b8b05fc12dc9552538e445addf27cec92f684", + "0xc0e851884860fb3cff32ecb2d978a7c410e83f51f3041e1354c9d2e5ee3e25fb", + "0x20262585f1696078100d070ab9a463816c20244365e735c964697ff05fea5d4b", + "0x4e7874bcf3a58d33b8bd444fab5a45260f1d4544cbc7611a548a77814c086810", + "0x3fb859ffc73e2c9d8af056e435f58ec04f7cd243b50804ba35ca0845efe3e887", + "0xe6e8a8b139b01c725725819cf92cf5e75d5d224db84895b7e7bf4ce479a86745", + "0xfbe9aaa6fe517b155cb2812769f3a0df7ed479ac142134ef9acd01701d4e15f9", + "0x58bb43dd312edcf8d630137a72b5219c04394d0032e1d00546b64fd59a42b6bc", "0xc1889bbfa8ff4d1c8c2e9bc1f0da2e92d3bd3e1f566fd51b63f39d45a7672a07", "0x836a90de1df417696627a0a525a71be6e15799fe58c0105c8bb1b88d914170e0", - "0x6280dbb8b88c69f10afb21f15ae7a6b47c65768e2d6592dbea315e17ccc463fa", - "0x36b37453aee4b4e4563f76e1982d38e67507225e78e463cc8a273466aa44b90c", - "0xe5f75cec24a80324b70d3a329000f7e803957f0ac554d79b446c1c2affcde0c5", - "0x3ff808fb13176710ebf6260ccd367f73a54b3a8a5b34abef931da30961398902", - "0xcea8df885edc0be705b856f4efa98e1b19f73ff7947b1226c3a2c2967ac64502", - "0x3692ffc2513933fab20d1eda90091b52f539c44876b34f6372797ed3e0213b93", - "0x6c0957d35a587d9912e43455eccd6c72a65e73ae1260183a801a8e8067642dc9", + "0xdfe492f017e71e3c5a6f45040e11744f85209f6c7fdc8ef63f29a5141d8d0cb2", + "0x4e6e62bb0c20d9041325cac14a412657cd501e5ca866156e5fa6721aee661109", + "0xbd0158d63fc20fd32652dbd430b170c6f5676bc8ecd9fb62e0c04bb605b0f5ec", + "0xbb9895aea70a934f732ab3aaa58256f78cff7fa7eb58f6529de4f55af2026ace", + "0x90af79ea726cb9415fce82763fbefcf80f7a5d86baf6685d2f68db0a941ab0fa", + "0xd953d8c1ad85c0d1a475d0dfe67b94901b03e71a7ec6f38055940c59ea41d88e", + "0x256ba01bd7e935f92053ab776201f1058feb53d2ee80a038fcaff1c4ef3dfab6", + "0xfd6ea22008e558fb8b11bcb3b1a23bc013541600d0f165bfa5f5755a067d4f0c", "0x7c40257d81b592f5c96f2074d346b5351b8459be4a35e4e66d2fc32ebeda5e3a", "0xc39c01667e00c979fb99e8730477eee4865edce058236efc6cbb1d0031d6142d", "0x300dd664079086ce538ebad71d697a686f5adec2adf41960ee92865d3686ac31", @@ -434,9 +474,10 @@ "0x82624bbfcebb620fc798b726f40ace38a40e5220b003272488cc4f1c1481b3f9", "0xa8b409e48d7eb1c412b7807b350c74f42e380f4c3a545ff0894d20ee9cc859f5", "0x5fca68af96cba1ebe748a2958e10ac935212c8ab711dc6c7c12bf0172278b08c", - "0x3af3f02715800ab9d2c82f5e07ceb2d03a994834027e49c60b0f15efb5293ba6", - "0x2075211373c4f514015d1d89bac6691ef41092448d6d8a00354661e2f2de47b2", - "0xb056ff02fc2f41738b769e14a77f8f005cdab6a7c1b91d9d75d2aaf6e017f015", + "0x3519235ef7895f472b1e3bd958b4eaf1467a7b8816bf20ba0800d9424bd3e413", + "0x0fa939f5f171b4bd043580cdd74f072a06d4038293aeb1d89866e4040d551188", + "0x8c9b3754ee18ebf5e3239a5eab49a9f83b03163ea2e8ee36e5b3d5cc24ed93ce", + "0x2f0d9bd84e845e36ae6b1cb8e12f54cd37cd1b6c796c3289730759e68fc12be0", "0x95fc4bbd2d7307a02e7888c4e35d57041a5984de5ef1b4b41e39c2e054d9ea16", "0x5ceee2dcda98a07bfc266a24aae9fb511022bf59230256f234a566233078031f", "0xbc3f0809c469433018c571b4c630e9142b3d6af106e1e3b0eb011489d2e47ea4", @@ -447,58 +488,64 @@ "0x8db969a1df60fb941f1575f05cc9f162408581c7afe7d5912c0f2e0b0ce713d9", "0x12c60b9d237cc8e050af9a38df3509b85b6ae787ab97e7d613af799e0b7ad8ba", "0x2677651b282f01c02a10a019b48e593e1bf9ccdb693d38ed1d79187d928585ca", - "0xa0711e77bdce8bd47b419798fe5fa8fe4ba887a4256fa17de30000762d4cbe99", - "0x48dd801e352eb4fc5e1c98dbeee9e3a20b03931ebca460723b6e02da0f290ee3", - "0x3dd78149c5b85022c6d4578af88c22ebc39d249b7c2b66123d1cd0e0001a1154", - "0x38804da17223906f2b1250e4cf2fbe210980be8563b313e02ec2fcd36e7e1eed", - "0xb634839f4781d6bf24bf215272ef9cdb4df69db53d32c8768aafba6ea5b259a5", - "0xd937d3be58a5ee05273f640633d5e05b3b696958e4fe1e8c325609dccfa6c249", - "0x3ccb7a02da80d0ae4431b3c4933a5db82d9d2b9fbcc89fce7f7cae338ea9b048", - "0x1c0792e3d5d8301b81d2012959ee96e6784563df4eb327856e9be1bd96064c19", - "0xfa5beec5b308c8eb7c70d06384b0ebaa094156863aaf99861c14352f8a73598d", - "0x93fbc42778ffd41e868fb840e78b3e75f749e104fa1f7c06e7b6cde8751e2994", - "0xa06ac3847f85ea6d0c67b0664123ffcff490033269ab1fc30682abfea0e5b94b", - "0x25090f63425b4c96bfcf84691370cfd7b22cbea1af30563a7ff0844fc4167723", - "0x0c18e5e5ce5d6a421bb13130538296dffc55580b4a5ee595a4893d8355b42a14", - "0xc4ccf1c2418c71cf57e946cb88cae603418fa9bb7d9356512ec8cd8255c3c376", - "0xdd147115d036340150436e5854dfb85e5b262fa1f91dd23782145d725c7c5244", + "0x29607907a175127b0f5081fab2d190f99d3101c53aabd36ee7c104e6c30f88cd", + "0x17db8ce2c3c299b5fd43881306a0f72d74fd66a917331852b8169180c2761098", + "0x19dfacd005a3aca6c69186b35933314663face614510f748eeae9692c4539e5d", + "0xdad044548226d931b0d941f9ba6c96ed91d476e51aeccf2cdf5064e701b74fa0", + "0x11cdb3bacb648e1555fea093e4b7e2a2b57214e5fcd1405fab79eab774b71d3b", + "0xddf1d7754c1e10fdbd6c084aa1bc221bdc2c2691e6d90d691d3af294f823e840", + "0x375663ee26a0de2b404ce552a7a2ba4b693b8e9f8dc5a2009afc6a8cf08397d0", + "0x9a6239688ea9224276a3752de1d34492a4de2a55517f309a2c0fa0ea55774828", + "0x9b4e81380a75233e36df8066cf044610b64853a245a6fc019e482ca97d0e9db8", + "0x97c7787c613ed92de118f3014985ebcded3a07995bb68cd4f4b553a815738716", + "0x02262900f998debf819bb465d9c79d4fb124dafcbda85901a109d46625a568c3", + "0x36175cad721be2df0b9315d20e60aadd6cbc2ecfe206863900f2ade5174ab780", + "0xf338cb8e5d68df17f9b0cf524fac6b2267d9375f19895d4d199d236fa32e340a", + "0x5652d0cf34cd2309fb7ec369d11678cf1e59c53495658b31f7c4daf32e53243d", + "0x06431970f1f3a90e66701570ff0d48f473121d60ea50c3e81fb1761941e7f5ca", + "0x9a33019bef8c2a463fbdd931c4faf7c6287fb1dffd68ecf6937b598c5a67a4a2", "0xd7bb10d0ea6a67dcb9a7ec32ab2e75e100fcbeed2b7416baa39978ef4738c021", "0xe8af41037867e7bcc44e5447f5d1a065b0897b38286a13e24fb218217b9ffeba", "0x9f5ec325bd97bf1009b72689b909865c2c462f60811460ca165f2ea24bc2d447", - "0x8b6df396844c2bf9d81e8c5d2b4d763d564d4668cfdb15a4f295ba067afe6505", + "0x96ce7f7a2b0fe13d2fd908aa1714129ae69ba470e2746c5dc4f25624d525d632", + "0xc47a9bba2c10a9f6d25b7a9aeed97af19c17da32ab8704e8efc6c528e903ee55", "0x200df5f1a4ac8c28c0d7b610c4a7fb436a5528064284deca1e0ac812c7d7a9ff", "0x599b3c29cf54f08323e0c538cd1424456bff5feee6c76a84e83ef5394de89a31", "0x8ad23d7f318402f40032075f6b5cc9008c9a08e0732e7754e60c66396018fd9e", "0x7a0a2b1747905d6b983649f6264d5fdff3a38c8b19af0caf18e7915675c7dbd1", "0x83cda1c530c0ab80a312fcb4e06b6a393162a8701cfda962e1f89fd61d8d13f7", "0xacd32a8e6d08ee6112249deb95e8d1e96eb9e8c5b93eada678a9dc411aa9639a", - "0x1931d89f3ce3b7190b990d1de5554f9d3f27ff1abc5038c9f08e2776381a6df8", + "0xdcf58334c56a501fe005f3b5102a092c042bc9f40e6d6e808224c35e00e8a895", + "0xa11371712b4b92c48cc2abda0a18637fe42c23589d69f361cc14ccb0ab16d919", "0x2a9f1a7820f22c1e9d5d31f79eb83880503e2ee101cafdfb92eba06ed4fd239f", "0x08cf988e3c47ded4d27037ebc3b2b0e083fb7216bf3540c730e8e7b11e5fb006", - "0x03117540ed7c354266739226d3bf3462d304c35c65348d96890344a0aaae227d", - "0x2b8fdc2458efbd3756f70389d05c7a6b52563dc25c418c34ee64567e4578d6b7", - "0x421c0e02378e609ef197a631e753768326f34dc6978748468cff10183e14cee6", - "0x330c4a46f218e9c9ba7b090975d3b0cff6af1fefd4dac03370c82c937dbad876", - "0xdcaf92153874ca41d2b2bc64f93f5e6285c4d600b2f9895f6100eee4d868165b", - "0xbbfaba78f501cfef8602cbc5086dcd056e34080817acbe1e0fb0667035de4783", - "0x41409dcf77b35619060216051a701013ac7a884337367b662988be8607da3dc0", - "0xa3bad310130904fd19965d81333851c13f820819b24f21ce0c5869410991bb2f", - "0xe75c81adc498ddc65b465e636c8fd85b2f082304429cc91b195107ea34db76be", - "0x0a00ba6c6b066b45ae2c81fb1a272a08002dfec1dabc418e9f63c4964b549954", - "0x59fe7fa025f0d425fecf4a20a7276c687e793525faea211060da6550319f75d5", - "0xf57b9c966e227ba950fcace96c645c7842adf267c412336676e6fc26411d71c3", - "0xb3f506f4d57ae4214e0f86618eeb123cf2d25fd97868b34fd3c66e16e44e8884", + "0x357b894f4c1771b043f7e0b96315e0aa289e6c4b77d3f1b297715866a2b1879a", + "0xa0b6d84acdfa9a87fbf3ea012b2c6fdf07bebb0f55bfce8026d381e899988406", + "0x75005979f62b9b04a595e3f65f5cfaa771cebce82e9c2665eac4ec36198d0084", + "0x3ca3e179ef4d6ce4b2def3ad4a87e5820d1227f782783f0663887420a63cb53c", + "0xf21f45ccaefc97e83ab9613c2a2547eb6dd3cb5b680d3a4966603a50306ecbbd", + "0xd7c2086e59a6f355a30c134cbb1b1eb046451f4b3f32e2e5658d853e03fca6a2", + "0x4f4feaa9c72cd085baeb229922b264b2cb440f3ff7171d489b3b03ea5f9e5786", + "0xeeda73a7cf307e9a98fc6c18eda1d845ba41a514e1d9b4771caa8235a4557ac9", + "0x397be959b1b0a643468572d621419a274d7b62d02c27e6e7de141aa9ab7919dd", + "0xdee751bd171b79a2f62f40732ea26a2fa37ad518e9759541832a9b18a0200acd", + "0x3f7b7c4220afd0d2cd760f7242d43c04dfca9115c53b530f2c9d5bffebd9ea6d", + "0x9be335b589037e925100e73798f9c58b75ba91f64d365e89680a4529059de148", + "0x15800f7ba5904c611b5b84dfffee7709aa85754c4decb8bccfdfcf4c69f800fb", + "0xbb69932f11d9f224fbbccf959ef48b76bb0c77886a77d2d2ee759ede01c7562d", "0xd4c599c88c29538f6ff52b78122f60567c91a70d51108cba74def2e2c7199dd7", - "0x0e10f203b9fe96ec09bc21a70eebd3aecf6f84f10e4724823626d61e17f960b6", - "0x2721891c949e138a49ad41c71f7dcc20d0699117da1cef28cfe8586b5408d107", - "0x07b6ae105e4279bccfdd7e0b686fdddefa355587d2b3afad99872ef27d4f8241", + "0xd73890a643c4184e2cacfb3538ec1208b23969435e02f890f98d9eca2acabb6a", + "0xbbd58bbbfafa1105e316f2864e3345e16011ec6ead66ff77a10e6239847fdcea", + "0xe99a997a8bd1029dfcacc31cd68539ecf7c61004abcef39ae2cbc141b6012405", + "0xa7022ff1b1c647a67644fc8e19da6fc6cd5d1c089cdabeda5e77cce819760cc9", "0x5615f45d7ed2f4facf5f811af5eb96bd981421089e2158ccc243d7bf0763c816", "0x260c762228c55fa7b840afa44cb948add374a5dfe2b528874a85575c1c591d7e", "0xf86666b6e5cc2cd63de57049fa8917cd3a1ba928acbc28e735a99f5c99cc67ce", - "0x30508524380ad18be193c5bed0515848bb852feeb4a72c60b94e9e2fd1bf123b", - "0xa52afe4ecf9418694bc7b08facbbe8495797e11ffeeffb00d17f26656bc7c921", - "0x0542985e8edd9f4d4b1934bb493cfc04183975077b549613ac24868caa206018", - "0xd9e903511a463bbe8b0e0bbe86489198f6dc435fdca96c9e6039bf145f1952fc", + "0x9e78cc696e6b1f2c009532af62cd942744960b9180ed379fd7988fbc17fdb444", + "0x220bb82bcfc80d8c6d0c2ab361342406a5ccc0f82f8dd9446e64fa277ea0bb11", + "0x5c075319da4382231f5e6923f5239d988002d0eb54ead24c91eca5aed6dc81a9", + "0xc80b4384a20097023540fdc43affec73c2bbe68b549c8e315dc60873e094f8e9", + "0x7e2904497da0f1d8dea7e0152137b20b27b8f442ec40d0f233b9902d33cff5a6", "0xaf47283d9a127fea1616a3a76e56102c9697daf0d74e2ce51ed784a6f41f6c2f", "0xf60da8281d5154c5123621bcaa348110406aacb6c804be4af86b60b333d77df3", "0xd57d86438039182617924ee1dde54f4eda6e4867c7696dc2f929738bbd840e4c", @@ -513,65 +560,71 @@ "0x17b3e993df54dda55d52dd23a0d2873693a049e90e450ff17dbc13c37d216586", "0xcb2d3c94ca920089e3d41c77f6c213c837b64ac6f5a46ce4b2bba687eeaf4381", "0x38f1f85cf4f99c489ea2fe3efc343a6411b4a4dc1671a20da73c6101953df8bc", - "0x0b9ed7a32278b02d773f890b6e5c37c588a9973d89c15212b64502a0fe763e56", + "0x199af47d3e2aa878553aa7a73c1f2231a57d906380f69622547cd6d81eabc762", + "0x1bb823ed8061a4c84feefa0803d9d4a2b468e97df0a6a7330cf7095b140067bd", "0xd4d5b432cafcce51da4ca83915040ddaeeb8edb1cf54f38fce530f0fea2cc94f", "0xbe86f59f903912e5c246e0c2b6eaa23c617494f2482a5b4f5ca498c18104f2cd", "0x5ffa6ffbe0be957c8560280e9294d56c694ee5b3904749f21febf55d02136974", "0xd873bdb1d1e66c58d52fd1e937cb77f5f492a733933f85f3a8bcc236d8000659", "0x7dbf35ae38236bdd10e415fda555eea6d9ceab3c77fa3ce48ebc06600a9bb6fc", - "0x79d923bdfc69a236058c890758d73fab9957cc649d2b4627278feca2965db671", + "0x29003513fa73a43887244793aabc711e191fc71e684c9591ae888387f39870d5", + "0x2c79c2cde3a704c0dd8ae703c2d1de985bb2f24517a033783e8f677d98ab37be", "0x8da5864ed0f50c5abf85cef78008b7be42858eb748e81dd1c7d4aa2085fd897e", "0xa6014ffa39c01c74454066ab6c902aeb5bdfabad005d76579c9163f709de246a", - "0x2f5b59237b4f8b323b11d0307c1923871aaac0ae93767044630c07376cee0338", - "0xa6d450f6fa8399bb4e0ca41754078924fbfb159b7e69aa8af528d4f3557e7d44", - "0xd6375b97a76a847878f2f1e9a098fb98a5c16f87f4d1b90591583370c72ada70", - "0x8acceb790dfc4c94bd5992ea51cb65283344fc7514c1c4ecf084c66904b2e0fc", - "0x117832eb9f145f4a99a4d975261805fb22c682e09a0b08416f20fcb361824677", - "0x1732f4312bdf005f4acd5c752399191746bcedf79cc9e229d95aaa382f6984cf", - "0x92b6cc3598d08127f2897c907fa9c1cc9ba5aef8efdacb2d39869b81c9120b21", - "0x2622608dd3aba2d6cc97b1a2b54b0211842df27024cf2354b0835ab3c33a9b22", + "0x894bf09562f5b4e1689f1ad32298af841e2b844f22a9f0968ff2d61e8333e1f9", + "0xd5ca61aba4c9898d6ec25f6346939a37842311e77646ead8c7b8fb3a45682553", + "0x153ef25dda81bcea816678dc37910612a239890bbcebdf30e4bf25b8c472e0dc", + "0x430bf3273eb982e2d21c375f83b68e3fbab156de27b4f38a72e119e0ab4e3433", + "0x9d56b391a255eb7e28c9defcfbc6667fcff893ee8f70bf208eef75ef1d82da54", + "0x492da100c91b6d5fd629ac733f24e7a1f0f44aa3549d34b6b029bfbc0bc8be83", + "0x45a96d12e00080247a768f1b597afab196b014c63e78cae3e9d519a0b294a306", + "0x195b8be2de8d7b71ad2bfa8246ac998f76203f6ae8ee54a175affeb301bb7280", + "0x7cb0a3b65b2a711d4930d85c8cdf528955ce56b960e4cd226c6ecf9763469ffa", + "0x47a10b3b554cb7f15c6cb9a7c45ffd304cb94fa833792ba9d91f8a51824e049d", "0x2fa01020500e219967833eeb3cfc04224f5fd65345e79a01e5742f541e5c7753", "0x085958e176a43ef6342829652ac064e76104a095122064baa3cb30e0f169f18c", "0x810b359848ba55a77f74e738396723e61e99498a1e0bf69f6494311ccb24e5ae", "0xa5de94f0600fd96bb97d3f2e27d01f3ae89b1f1f89cd00926a3518db7f4c2074", - "0xb6111077f85ff7b6765d33569874371f8208e002b269fee2f8a3e271bd7303f6", - "0xe9b809f07d806a5e59553ea0d76f6e55a22ec97c6011de85b903e38425526980", - "0x2728081f35e823038b341dba99fbc4abd684d5548aed5fff0f8db032a55a3236", - "0xe3116ce111501101bd6d9f03b879a7373e140d74f9e245884f7693cdb4d67d64", - "0xf542f6e7c9c1b6b49cabd2b1c192a96f680d88c434d8fd73caf3a8eaf68a6170", - "0x261b37b9bc73bea3963951a670e2e181040db3c00ad1b36dd5d8d391f23aaefd", + "0xdd9c405257b2e5bb96ad93797b44f79e1dc59badda798169284d69740119d6ca", + "0xe3b469731eacd23572c66b5e65b70ab005a3500b3a141cc931189096644bf805", + "0x482a485b9cafd061282e7b48b820ba2e1a2d8b8a58a3ad709338c4c030793dfc", + "0x23cf2a056e6e5a558ded825b405e31bcf94c8315d5b2e9e5ab5bddc24d44e241", + "0xe6baa0fea03bbc9bbe65be4014d8f1248af8173a7e3a15d9ebbac1eb20fddf13", + "0x94396dc82c2b48aa96867320d12d95d72138273ea654b8ebe256416856e40598", + "0x1ff2b3213e17a1c719afebfdebd0d1e3da3e232603f2f156ed9a96f179c38c0a", "0x7d4f288580c1f335df3938388d16dab5b8133c63cd3ab3f6b4c502b29ba14925", - "0xeb6ad2ebf141706b0b53a5ec2e19b0c452f5e5a8264b3aae69e52a98fc6e1d6a", - "0x90cb9b38dbabbce611e6a6a79f527a67cb61580d2524d515652a2d82bbbd562e", - "0xc2c951fe480b89f0038fa2e3332e82638d5052c944ed8cfe07167095409c86f5", - "0xac08e1edca44a1141e670684598177d1de2d40128c2c8a147fe051f6464e7572", - "0x722ebe919b768793809b9146a7247826733f4ca66ae67c31495e200e300d63b7", - "0x17b1687cc00e59bd88ba5a5085ec8468fe9e74c9fc86f6854916d667c8bb51b2", - "0x3bf60f113b4657c4d4e1a20f0b070efc915ea10f9d11a3c4a8866a0e60b90d59", - "0x90c878da0058e1202013bae7ca75577cbab1c501e6ad48c8d1d689c98985a5b7", - "0xeed736c9ded23b4aee4a7865bbbf6c2eadcef2af01b00c2097dcd39da7f32f4f", - "0x4e8433d0e00ecc76755db81499d357872a9da7418b5abaa89e292bab3088092b", - "0x1886e06c48d6375710eaced24a65c77f08ff2a82be6df1009e5a3a5bfa66c6e9", - "0x5dfbc2dbfdc3a179ae328208f4abc354955b0e72ae3ebeb1d65bcce62874e61c", - "0x129ae2b18a66629f5217798976ec5c32a5f34c3ff5822080f791f626aa970eb8", - "0xb044482860afd18548158611c8b8ecb8f66b7cc4b6c23a7c7a78610a03ccae03", - "0xb951074e1b3ad92620b92d502db67c5e0aeb4dc6c3f0097a43de3646afd7ca28", - "0xe3e315b3ce8c819fb4838a5a2cd7893bcc31bb44bb74d65c73e7291e3b682b44", - "0x3c979f03880f300303eae60d1ee71abdf8b1c4529614bab756bb7199c333fe56", - "0x18aba3971d53419d292d767c63515bbd1bf2536b10fab4649eea091b984b9815", - "0xb674de89365b0ddb619c3798003962ef4936c0406986fa3b506f20b15f8220e7", - "0x26b4153789b12b65d57cfee0186867406630d3e1ce6ea63bcdfc7dad68436d6b", - "0x61b7cdcdf1cf599028e3a78afd8d2c737900f1de9ee4dfcfde44774e11ed505b", + "0x9fbb0b2feddee9e6956f4bc9fe95dcf796f0cb53b52f4751f9845a76df290ca9", + "0x0a4c6a7aaf229355337828bb76a24bca7087d9431e618efd158cd267b647cd18", + "0xb4e13462e384180141b06782a05ab42d907c27260dfe4b24cef9a99d38f6578d", + "0xec796bfa4960a2e4cb7cfefa24662e79e76098a069eef17d71f7785959afb2f8", + "0x8c839c758ee78f41a2439d2fd99c55c1e40346ddccbac0fba00a334f3cf62a23", + "0xdb15b921d3af195cbbce05cbd9f5a09ca373252b911a4a8ff1b2211e624563de", + "0x79e46b9f00dba7af01d11ec4e44c749dd2d40377cc9b849f228a5f54182c5a61", + "0x60042bb2055bce73a9ed0c34591c83524ad89df02bf16f09f50707191e547160", + "0xe8b121c788a32393d1465b7eb5775de7cf53e076affbdbf010813974cca661a2", + "0xa69177ba3b5c9efd4e7c784aec490c6e095e254c54fe1e61425bdcef8c050b1c", + "0x1b520360a842c2442e9da7489dd2e31104baf9912b662c2e9cae5a72a1326939", + "0x25578191a2846c6161a4c4b09dac3c52d0c7428790328f4a007f6a8de4cd9adb", + "0xb0e320627548bc038676db9bec7aa1e46e15985c8244e211613a5e0fe9403b35", + "0xee59c76bdb80296594c355dca0a1fbdd80bc7eea134735cff411809db39b84ed", + "0x296585af396302a0de774eb6fdf6388d13e573c205b81135c47571de6337eff5", + "0x34547fdc267df4a8ce3d28e639a8d9bc5e02cc90eef57f53083e7a1ed1340392", + "0xffe209ee31f7906d47855738c9afafd2ec999c71f0e3bd6c946a13dc326422b8", + "0x31124494262bda2f604a24cf90686caad9b2c0b14cdf09e011d0b0ecb7910dc7", + "0x0b61d9dd0c2ba369dd913cbadbbe44d6fbf609b791275eb41d015de3336acf5f", + "0x821e4fd88263e209af03f3608bf9014c882502b99ad31cdd9dbfc1e5a587e0b3", + "0x7e3df0850d184c833cdcf14aa684e082bafdf874e3f1847bf446130244abad8d", + "0xdabbd985412ee38802ed10ac3ff2d9bbe668bf0e9dc2fc9b81fb28907489b34e", "0x60ed516a6ba96b4275f2dfbf1bdf6ab2f6b0b36c6ee99d4058bd44761e7146e3", - "0x7a7bb1199ea05f387bf8015aec4d3313e3b3fe800afdef336f6956a853cb63be", - "0x4cdf555c4d0f1c0a4f018552c9a5ccde9c3fbfbea71843639cf72e317162db37", - "0x95687fe5001080555fab489473a37db6b4ffe3f0b65f359a7840506e08bab4b6", - "0x2787d148aaa1d5fb6f9c14bca45e65d3f7a2ec0a967cd2305081b356508fff37", - "0x8585d40371d21cf21e8080e3f88d473bad8f3b9489b01ac72bc497d10b49aacd", - "0xb84410520fdca766b502928911efb0cb6aeae3017f90c43a34dea13a13f7f8c5", - "0x701d0d37ff6a3b722d20ce4830db0857eac37e9ab61c7d141d4f3f60c0a5c855", - "0x857ef53d0e5af71ffbec183e693466776a9f4b17e8b1142df727f246cb3ba97a", - "0xe6e2163c2bb8cf29f86be3f622c1279d6ccb60d3992ae72bb7b594d93e851fb7", + "0x4f4e60a037496953d6d64cba095720811a84bb98bca059a89f6760a43d22a41c", + "0xd9de0e61693491e4a185ead03b7ba65bb42618f637f762c079e1c6f25cbba1a9", + "0xe5dd6543fec7a91dae1ff4db6b293197df3a2917c037d319a86ce9896671ac4e", + "0xc2c31d3a012ab0906057be7a934562e692c0de17b8c53ea181f5c1c873a3c633", + "0x5a5e059c2db42ae792a2c35f0841ea1404e935713dd42e1332b22e2d9e5ee7ac", + "0x4f91c9347834091ee088e59d133b4bffeda1502d21b702cdddcf12d2771fea27", + "0x7865ebf7390b3a4261a0928728dee7e31e424c10fbe7268e3ba47e36c95cceb2", + "0x835b350ce13d1b93e60d7a536b0b863103028ae23f92e0ed930cf08c4ac8db24", + "0xe738f84c52acbe62b2d84e3a87ea1c397034bbd5b6fd54d8806b22a490d6bdcc", "0xf4765dd67e809663b9e92c257181eaa821f3352e3362807709d9c92bc13cd59e", "0x9a778f557803741024c6617bc8f9a36a0c05624185f77315861493a200c84e03", "0x9041ba9b4a97e3956d80f85972155202f805784298543749b22286a3a76ed8b3", @@ -579,6 +632,7 @@ "0x9c34e99e66c60b766e4caf06bff24f69c8c62386186e6a20f587704a242453f5", "0x87296150e2d912e2773523787f23db053592a41f74e720711999a5725b65c3e6", "0x9d74952bbc17f44d7ea89f5b74b013979d4ba82e24cb15868261ef48d7eaa016", + "0x8f797a044eb602dc251a28ca4e2a8cb1f5dc35ef6ebac808d59ba7cb12e39cc5", "0xc138ea2535601ac3c77678136e47c6314520a5b5878b68fb5823eca918ecedaa", "0x6863b2218568bdd9cc2091fb2d037b168166db215c2d20ecfda39734eb6f220c", "0x3f29cfafa9b782692a3fe401a0c1fa3299493916569c933e53dc89f3b7c5a381", @@ -587,28 +641,31 @@ "0x9e61852af4fa45760db9695c4e3de84e380b7d7340354194c00378bcf01cec46", "0xe439a9c05bd60f39697fe5fa1705bd191251054b6cbd9954ec81256969e558ed", "0xb4934e335aec9c56c74b5204fcbbf42515657872869d31889809579f8c324f55", - "0xc371345b77dd272ca96a59931e4e6b3ff496eb40fa01611dcd5f5767d808c57b", - "0x480188b6eb622f11ccef7df69ada0b400e384295a85afb1d1225dbda65e4b515", - "0x63623a7ab8f2c658317e7a8ec2f51a67ec6be4b0e1b4d1fba7b5b9b4da023aaa", + "0xc1dcff1d84c0e9dc9d6369325271378090eaaa082cecbdb94bd9d60be9b4e96c", + "0xf5f8c79b08f98ce6acf7718bce2b7f00ea5a5041da77c38cc8b7af2c891d3c9e", + "0xab11ae66e9ba5d6ecd11789628155d6d429516bb30071e277e083cf0edbf3477", + "0x2f008ef353ebab96a86645c2b6620bf023e5b377b71225cfb12d5f764e77a49d", "0xcb704e97692ac525c4ea9a170c59390edb82519b69b92aeb17e704ccff3f1fdb", "0x1027b2f8450fffcfcf7feffe7c593b59b77aee64cb926fc099c1d848793916fd", - "0x2e42a7577af57cd39b1baf9c8df6dcb6cd3c2a18eaeeb91f124da009d536851b", - "0xfe2ab22f912357a65adde680e1472933f01f7bd81b80f7c714d6d2094cba54cd", - "0x1c231b2072c59ff553a6b81e17543839e4179a7e6db45af299e9b86dc1b7ffcd", - "0x70265bdf8d36862ac21e92ef9a4906b7c01213afbbec42ccabbd94f586c9fccf", - "0xfd4d8b1c372b92c05c20433d12a067de4750072685943497a0f48da83330b203", - "0x64519328e2ed9dfdc694cbc3021ff4ccd3bf90e5ece9aa508f171a9e3e212f0e", - "0xcc0ad7b063e7a44346d7786c3193fb1720e9b8dc4905fb8589fefd7e89677ce3", - "0x0fe760bc22d8c1cc83b7e7331ec2e1c03ea4e09b3163f9d3344d0ec933aa4aa2", - "0xd0b06e66444f94b87628b1c2d1584a45197eb141b3ecef6735db511e49866f6e", - "0xff8807e03d5bac0959e51e5d64fdb1652d2588c610c50080bd32f153c55e16cc", - "0x242f6fa7f8f9d3057f9b6191ed62c5e51ebc92bef5ba9a63a3e28e063d5f0e0c", - "0x7d3257b42eb026a58d8e162a384db20c4da6492f10889c273919e7f5f81d0ff3", - "0x06f95ed8eb77c0d50590d05f9125563715688a32c626d21705b41382d8997b39", - "0xf95fe2d9446e4bb0accdd7e188b3b872d76bbf59fa53aa1b2355bc92c675687b", - "0x08c3538d9b6fcc5a9400b65a847ab87d9b65b71764be849c7d06f3a9751b9ca3", + "0x027a8b94ef416bb5b287a943462781bf57a0e43ef0d334c36c8f4fbf7779e356", + "0xfbb0e6107dceea02dac3a84cda1eba19e877efcc79f190a80e611908acdc29ec", + "0x276d1d481f85c35e58d347be3f8d1989f8ddb4287e7f3b2f64b20d1cb5b8b46a", + "0x2afdb94461ef5a586c62ad1b883c1c6b6217eb5a2047707cc45c5de00f2e4db3", + "0x33d0c585267fe45c3dd4163febab634edd3491b84184587ee8fddef998e1dbf2", + "0x74435ff3b32f46c67f04d11593d00bfd7a50c657db93dea4116a25a05c42ca57", + "0xc432d80ddd5b5904af8d58c4c5bc9af6b3f09640cd34688db3211a1aad79bd1f", + "0x81b0281b041d2f6d983140c89272386cf9be453d1c89f52a370b6c5a62de16da", + "0x00790b30e6f510d67408484160987f2856185d3c3e4e5c0329757ebb6bba0536", + "0xa2dd78f5deba216178f4a2b17320c1cc40898eef320c8caa32e8190b191bdede", + "0x3311086d0f806729175e0aa4240972f9cd970b4bbc82275afce06003a19f09fd", + "0xd11199b60f1e472fab2a8edd3662e1c1594b97d0bf7c1bf5cec3e2a6993ad9a3", + "0xa4ecbed738efdece0df9923307d542758e9822854d5310be41f4c9f99c49b614", + "0x4ec54eeb08158aac8e4da670f5806b05f54ec6f3cd9db0838295fc2d2e7eced7", + "0x5dbdf2d75a95804be58f11c5b0e122b8f88e8bab7828a98bde12f836f0ed1de7", + "0x6f8be99f33372e32dcbdc71ca30be5abfc82fe9ee64aecd63c6f5c5e5ef83e95", "0x4cd4c4b5e677d2875cb0ab712a50058db4907ec3f8f5d9d9d87bfd5b5dbeee98", "0xfdac44d92388bd86df658ce09a315742ad354b3f74ffc4a532be1df584447994", + "0xfd057a22b0110639c2fd3a28a506d76f7c5b6df02a0d2c75f25254aefb59762f", "0xfcdb4d483f016f3e28611cf732f8cf1d0e4d7e48fc3920c1ee1f78f3a88773cc", "0xfc99a99b282b8b44413533c045b38de8bb208cbd8f0ebd6d4c13c71138f1ea66", "0xfb744e03a2f4f89747e270f3ff0fac9f48da72e1d80c878ab7af2a47a43ce64d", @@ -622,6 +679,7 @@ "0xf7dc096c655e10072456bbd495188ce2ae67ae7754be85132279623bd0b759f9", "0xf75c4501fdfe4019be55646da151cd019fa474d29d72cfc26836e1283dfba918", "0xf73dc81ecd1e4eb792bd5fd3199c7cfaa64cbe2a83554195ebda99e65e3067e1", + "0xf6d78f96bef5e0550ec544b20e93b775a464b3b8be3070bce4af4941a82e31a6", "0xf58ba443a1ad5080656e0cd1b302843e72a6366e399a5e637143e7d69ecda19a", "0xf520ebb78f7279904c22ce9a99c99969ca23bd3fd16092c48fdeea2d58abaef1", "0xf4a1d837a03db307afcaaba8968fc4695d32611004115cb1effd76e08a7f5f50", @@ -641,6 +699,7 @@ "0xefae64f750c34405057e4a332026d1d714080aa8f22960b23fd0e27d53a981c9", "0xef1956449fd4dc2a2d1146d961456ef97506a136d6c633114b9d6bafb5737258", "0xef13557b672b81b9859141cfcc503c2c699087c39e7be07e9ca16d51993c84b5", + "0xef0527b818a5bac3a9b4ba9349bb0d0e6a613e25a1101a62fc14c6f9d44be77f", "0xeee91cbd1f902474839e93e64092d134766013658d2e48fad4032548d7c4a59e", "0xed95a2ba45dbf9ca0b006efa5c0201a6124cab85ba5233210219c812b5ba25e6", "0xec366a77764ae13e2c4261d9d253b838a5ff506799b9a31653de7cc53e800499", @@ -653,10 +712,12 @@ "0xe8f17156b926390edc89dc451b011f6fad50173420e0cabdcb4faf34b17bdd20", "0xe8915abd8b500390aa7d2eb29a6878e26a675a5ddcb634da7ac331ecf7c5ae8c", "0xe75866b57558e18faddd73a6fbeb32b29b03523889182dd95554e740006fe4f6", + "0xe7489ae1567f246f6888ed15c93bf950199d2ef44709b231adc943dcdbcd9c0e", "0xe740462c910fd8293d971a5e5ad5a5d0fc096ee9e0811ad61dc8e388f7733b61", "0xe71cf551edb2002cf553c422170f334f332c1f09cfdfe29d00c8dece6530928c", "0xe65756d687d74583b844ae882b3ec01fda27845ef4f977a9198e3bb8658ef62d", "0xe5ef3fdfc3a73a343dbe5bea6e8b37d5138abc88bb34d8d573ddba8624c20b2d", + "0xe5b658c31aa5880cb1427ababa781ec8290a0d8b46bbcde630f4ec5b27b63fe8", "0xe5961053fd6c151816ee128b75a19bc36835c20bad09adb07481b8fefab673aa", "0xe585dae669a96960ba14842affd24f7f2091748247849fbfe27b3449cead372f", "0xe52d60a0dd9163c810b9eec7a6002c9707b66be93443870f5f81a9656660b508", @@ -664,6 +725,7 @@ "0xe4b175787880220045dacfbd48a337605c4ac8bc303e55cd561aa91a22848aef", "0xe4aa87f1a6e6397ec8e9b0ebb08349ead5a625e6e14b4b83ffafbfdec7cc9711", "0xe492f5e4975c8419e1e6afc814d0576f941c704fa15c6af1f0fba366eb0df36b", + "0xe491d8313904e4c1437b2f8384a164fe848da950f2157006afa7eb91c70dacdd", "0xe45c128d391161d80ce762e995a4add4cbf18273fa4095553736c7fdaa668a62", "0xe3d9ac6dec53915d773dc44f434405192a45d0bd65ddd7e288eca3e35f87f0a6", "0xe384830db85f4ffcf60d0ef346f61da09e4d39a2df3c1d33513b2a3006fa7b37", @@ -681,10 +743,12 @@ "0xdf37481111069faa8fecfad2386c2a0fb21ea20be3d09ac13f6abee37991ef0f", "0xdef296fedb34f6d2e1b0135a0ae8f611f554a8745406323cfc95ccf0430ac4c1", "0xdeb74938ddce950735daa50023bc93c4516ed51fdbecc59c7c5963f0c91a9cdd", + "0xde85a1ef0e600b6aa4ee4af6062e49ee805dd15ec7ba510a3af774e7f460a6ca", "0xde458522ac8d07a878e7aab8e562ffc654ec76635457ad2637796fec7019c6b3", "0xde302e58899b8068d509a92c47f6b782240e3703d7c60b98a0d720fac8a84721", "0xddfe683f3b034d67c650e8e27942f484c65d868d1c839fb57ad6d402d5c620ea", "0xdcc4ced704377a3d3f97e872bf655a2b675cd0741f3c44d618adb545a418cfc6", + "0xdcab0e893dc96690e65b3ed38e7e2ba6d527bd56f826a25ca16e607ece3b54e2", "0xdca99123a9710c1c7e0eccd3c51e58ab0aef5a627ac223a1f0cff2b5bbf8fad1", "0xdc487c68ce156e6de3cb674cccdf0b418e4f1a28b42264a2ec5d3fcefe45d09a", "0xdc11709cf0424ff1e41e8bf6d9978cc60fede50e8f9b2910a01076ff7d0d2a9e", @@ -695,10 +759,13 @@ "0xdaf6771d3cc3c18d150214a69e19a9dfffcabfbdedd417435edaf4839a3b707d", "0xda93a2867abba7c0479629637adc7ba3e7e8a9b38a69173d6d4593d22a325c17", "0xda8204e447cd3d523eabf553d8660de2d9fb7601f5212c3d2db6520798b574b4", + "0xda0f534cca5da252380c34d7dde62bdb377097dd300f3e8fb7b7a9ff84d8bdc5", "0xd9ff7767b45843509ce8b5993ae670baca3ea1cc11ca1794767cf977f6c4beb9", "0xd8d557f44f2192f512dccba2a3830af98c1290ae8563f6226685092e3af03a81", + "0xd867b815066f4f92ec91bd9e42d297e198c696ed02062dd781da3465b91c9b7f", "0xd83247bf0f068a692198d42ab5453f0ac54d8b5e8eda718bbb42602898d3fa28", "0xd82e204aa031dae8ed9f3d290681f1e144fb31736319ae6ab2ab3743103142ce", + "0xd827250fd70e40d47c6f4c2101302d708131dbd0a3eb55d59a5e7cd145a67b22", "0xd7be708815f37d69ee680da9b313eb77cf7d137de041b5e44d181e4520f866b8", "0xd6f208a2191a08f6f35dd92c56079bd7007e9fcba6e26b3d7f1eecf523e98cb4", "0xd68a91b5e1424f8713e33e84b8c0219769dd4c247348f9659f345d2a61492930", @@ -712,12 +779,14 @@ "0xd4cceda7641f4debc22550312a257451a74c28e748ee77a4b9e390524f22817b", "0xd41c8325910fd8162c05cfdea91051f737d834177a11961225450ea9e53190a0", "0xd39506bddb54eb6b1352605d33d2a1076420d32e14a3a8737d55a134a6bc4c64", + "0xd2bbac5f9412f99d5e64678a896724edbc01d7722b1c95842506957294364088", "0xd25501b0234cfa281cdf3bf4e43f76dc58cc5d880eb7c16d388b393f6e66b1c7", "0xd23a429b8a5f736178a8b917f67a53a59ea4b7436d15792888db8d7435e22d74", "0xd1ae9cda64a7830f9b8137ab9baa0c7a9fd5e3f2f7b4294cc49ba4638088aec3", "0xd112dd86ec45f4183e73b776bc1cbda81c6d0ad52dde395e8ea26973003a5c2d", "0xd06e77dfb05f5b0915fbb5e73b7ce10cf4c504467e512601a397c349c637cc36", "0xd02e4cfe8ab10f7e7c956807f541b3563008e0ea9bbb3fa5cfc73582f3001d4a", + "0xcfd8745e7d476eb3ae782d4f541e1c6b0f38fe2d1246b6e60943d28f68ade509", "0xcfbff9e0d322e6cf9e99f37647403973c8b07e010a1bfdb5014fb15738226771", "0xcf3512f101f51bcd17634a320f949ef1b60028960525ab16f38daffc88502f3b", "0xcf2279bb28c09f92c3f21d5f57fcd4a18142aae1cff1dba8f58a22be091a0405", @@ -729,10 +798,12 @@ "0xcda8a42acfa0b5ad0aa296ceff2282ce27a538cc7fa62059b8f7834362db8bf0", "0xcd488f925aa428a69af217141aff47c753f90323c05c363196c802aa0b757947", "0xccfe1541502243898676dd6b76d4d590e841e1fadbdedcea73d23d6e005d3974", + "0xcce986041ed45a0232327edd5dea3f352d7de54cd2f60f4bc68984d0af07bc4f", "0xcca24d95819c3e88ee80aacf6e40361a828eb8b855927f4d81b02706b4d46e66", "0xcc90d4950db7120c0b40481d6c6c504d6e1ba0b677da5d73def4f3fc7aa0f5b3", "0xcc606395472addbf5e288f66b2b8c5a9b41519db7e74d9ea46b9d2551907b844", "0xcc55f0acd6af048ff782c86a2f5400a2bb9f8d1feb411a6a4ea3255d6dfab440", + "0xcc3d8fedf4953626dfcf3a4b2ebb9c5a92861fcbc0b6192e185a764f9dcd85ba", "0xca865987c2b4e490189e09830baaa8f31bd733e5e1cf4acb1fd1f0f80285ff19", "0xca3e4e9f7f43153d66a8da3e5e524f5648abf2a9fd31f0e1aecb87c0d4711fee", "0xca2c322ff8c6a1b5f6eca8ff01b51075e2797ca0fb87b5972a2ac72db6df0951", @@ -756,6 +827,8 @@ "0xc50327a7e9ac001da15bfd0902018ff384ff7909d102901bd9b655b2c0e67200", "0xc4a1cf419cd66c42102ec4f43b77918436d139389f149dd5c1723e0f0d148199", "0xc49758b8b12288383f7d23e6bcbf113c13112585108bd1b8d93a317757e1b50b", + "0xc430c75372084e8dfbd0908caa8b11010e8a4f81a9690aaf6dfb434fe2f70b8f", + "0xc375e3de036115109222b60fac4f8d9857fea330ce95be794c81d8ffa8065037", "0xc2ce440a029247d4ac713f3553b110afabc837dcd8569fbbd03e1316b0429d7d", "0xc27882ccc946ea879447ae7d6531d9522bf566cd114e6beba89ddef0fc59c92d", "0xc242a23cab714a6f060d99b625883f62d13b05f3faec0dc4752bc560b351cf98", @@ -768,12 +841,14 @@ "0xc0248634b28039548064f50791837acfd79b4034c2db114cecd782ddb9e774b7", "0xbff070374531579011d512403895f0513e8d8dc9d795a83e9b54504b546738b2", "0xbf89ed60de855cb74cfab0bcaeeb994ef201d94c2d7e146f14895e4448c1cafd", + "0xbf066b48ca7d738c32a9585e53dfc0f3b2966469aab9a007f74fc2cf50d7ad82", "0xbed6885214a0f98fe5ac2791139b29fbe34ecafa8055de4a2cbb86f9fc196a2a", "0xbe5dde6ac6b6df39a18c8e30f847fca2eca2a761520b785092fb28d512153697", "0xbdee5154401192f5c769691c10c2e6d579c86792973520268633fc6a92b5b09c", "0xbcaa96dabd0da2832f06e8b37091cb9dcbb54644594748a013a5ef54e8ad6336", "0xbc90fa7fb1f8b5c0a83ebd63d30f4bdfb13226624ecd612134db666cb5d7a354", "0xbc6e104c4cd70eae2b1d19add2bcd7115a6b956aa4bb3d069baa876f0ef2a901", + "0xbb3c2420e1d8f2e53dba16d272fdef460b6c111737f2963cf1c610cd777f1f1a", "0xbabe4b5c307c4f7137e7a67835cc92745d3220fbff7840121be4367554165d26", "0xbab7fe01bb7dcda8c4bf7feaf40d6db8da8f2e15fb270cf9925d09ed7bd88b84", "0xbaa16a78f9e2990c951359ccd040eee7ac458dd7a14e464a1f0708e82b8f8bc2", @@ -784,6 +859,7 @@ "0xb7955c2a243da8776e749cd470e768b2ae5bbbf70ca042af4bb912f3e9b8fdea", "0xb6f303159ff02dabb59948be936e8f684e0d2d6bfcce673e10206a302184571d", "0xb6854b548474bdea51899871928ab71447dc9a7de7828f9f485520ca8f9ed376", + "0xb4d43896a51cfcbbea64d683f354a24aac87c8464076641cd82531bc39a14cf0", "0xb3dfe5bbeeabb3507e6ce7f6feeaf9fec3e8a28e50dd80f0e8ba2f35040cb8b1", "0xb36cb3a4910eb9fab788e6ef0329a2f9c281c98539362c738a4b3b3b0eed6cbe", "0xb2f2d4d9008ef8b4ac5631209ad026af12a91b38d834a01b849988c16ead3653", @@ -804,6 +880,7 @@ "0xacc43503e41c664dc85d3cb6f76b21774bad55c54a796db02fd735d15c468d86", "0xabf793e9c686fd18bd110e21bb23be57068da87199b5f143af303948c1e35a27", "0xab18f54d3cf8cb7c6d2a6632b75c9022d69325f98deec7db6db86c6f8e33b011", + "0xaac58b25cf346bc6ff1afba7ce8e42774bba40be9bd834c4cb20361bec3186b3", "0xaa5af83f98f3607987df4b532d89d314bf2558bec44591fe6428d9f397329324", "0xaa2ba20ee85e0483503b7d98a1a8c61c826acb4701162914d01388c78a0eb7b4", "0xaa17c41f838f1432965a325a281b3584dbb886775e80b89e44a2743e27d7172b", @@ -832,11 +909,13 @@ "0xa18d0123e07446f4c6c840fdd6091e967cdd3ca12e0ffd622c509f3e8467cd5d", "0xa15e066acf91a9f2cf0b49ab8c60871232a07304c853cffefa08483330b93e18", "0xa0ee5a9f33701ae3a0f981f90df570a4e869f8824f42ecf2c85f5915f06063e7", + "0xa0d3d7e41713e196bd8fb41e395aa97785e8b753cc723ed95c89400b13a10152", "0xa04f37682bee3e6fce686a8eb97b8cef1192f6f436e3f7b23b5d8b3aac49d327", "0xa00a20fcd3b7ea4353656f270418c81cdb9b84713ded33cff7697f29c0405bb0", "0x9f5096522ad1c0c7933edef4bde28d672c3ef54b6caa9623e1f3212422277dfb", "0x9f4b0169e022df8a9ba570e72c2331608ee7fa5af6a4e04066bd30f763b09d16", "0x9ee096f6d9f308c0ee4a98e8ebe6b44705caecc579f35d03324cbf21a6bd23b0", + "0x9ee096f6d9f308c0ee4a98e8ebe6b44705caecc579f35d03324cbf21a6bd23b0", "0x9e6a7595f8e413f8244c51aa91e93cbef9512f615d37c6e63eed50953edd0537", "0x9e5fb3d240e8d084eda86e0bdff595054fdd3f36a7e07866c8d9d5e2bbe56fa4", "0x9e033a2ded71185a62dd58ba7356fdc58adc37b2d7899eeedcfb35b30dc0debb", @@ -849,6 +928,7 @@ "0x998d09a1c0d5c72b78c2b3d912ec913693c40d443e38c76471e980e85bada794", "0x9981b6f6d6bc102d3f7fa1614ee1eb6de9d1f7d8f35317200c850d83d30f4808", "0x990a89e371dd269d4cac7c17d094979d77330c2b4ab92f77279f9959b708f360", + "0x98b8975b2af2c21c011d25a1de07fe317d216deaf25f74615971561af6b2353f", "0x98911a0fdaf38054c3db6eb948dc87f7c897d7dafb6bc9580b8aad79a4722ec7", "0x981448bbf4818fa9f8022f08a7b909abfe81def1fd13a17c485e338abaeecf4f", "0x97191a7db9fe45bdd29a5e234de937b06fd5150719d6ac2a0314279c9905df17", @@ -869,11 +949,13 @@ "0x91046ca0523d9320f73a458ce15082d194acc09ce16c4705b058ed71c0be1551", "0x90e9de02e10a9a4a40f4b06511f31f132f65e7e2c0d9f28cf771ddb2511a2265", "0x90de6f584b268fa1d6b3acb7894c5aebbf489b748b64d72baf215223077c952a", + "0x9099bc63d8bed56dd1d833aab0cbea8267b0d0b121d5f9fdd73969774918a0c4", "0x907c003e4f80434179c12608b24b0067529630dfd6675dd6c63c0c3f9e8f56cf", "0x9057e26bda5f3664bf252228f12dcad1010845e524b55a5e8017e482cf57b43b", "0x9039ef3bb20e67e5e62528e0c2ad9187d14d633b47ea3d5de8cd0f88dbd4ab67", "0x9004073317290a68f4b78e026561d32de8f32f01fe7e659e3d4462b6d3d11102", "0x8fcd02dd3114a05e1f4a7f88042d264a5863244b2fa8811549dcb540191fca79", + "0x8f3fe0ad9d9e4c67b73067657042220102ed316c40ccc1e0f8c6dae46d36cd17", "0x8ee6a7f360c765e27c4f27c57392717d8105be1c1956b5a2dffdb106f7ab0033", "0x8edfd1178fd58091ac71ea09061f99019e094055ad4d6a993e2ce89f3c8d4999", "0x8eda6f509e576f8a4235892f3c367bb96c9813c524dc6ada821198a655e82fc3", @@ -895,6 +977,7 @@ "0x89f362685422d44a37b2f4d7be6a485c0fc8139e0b2c33964cb10818897af108", "0x896f1865f8d9f59cb1126ac162764b2916ae6addaec1483960a6297ece594131", "0x88fc8a59e1755810f50e1ba7c8c9c2b9d212e26b496fe076537b24e045b44fbc", + "0x88df987e5dc1c188b7307b9139939eff3ad0cb5aa79f0ade75e4e7b5836760a5", "0x87ef83aa7e62d45a88ed7022f66ff90a599b33b9c1cde5d04837342fc26b3a1c", "0x8783fb0be0ed12d8a84ebbcf9991e0ea3953fc924ef060ef727d26bda364df97", "0x874c9bfc92ecc187bc6872be42fd87f242cf8e93dfc512f04a871c6cba052a5d", @@ -923,6 +1006,7 @@ "0x7bd2b72af24c67765b00ca4a6d842a4a5d1efee598a4fe10cc9780799ab26145", "0x7bb462b25aa90e54f4e7996e0d64b8ae9a6927f124b267d06bb11364189872a5", "0x7b94f8efbf31a93e7d45f5af325ccde6ce418391791bd9dbf3abc70440f4af78", + "0x7a3f4a9fa1ffabb64710f7d8b3f6aab6dde57c73695c40448a479d3df6766e88", "0x7a0a8f536edc44c34367d91ecea5d787315871a0eeb9470265970f334e2c334f", "0x79d565d5d241b1edc10df51923e2a7401170ba0de0772368d1330c01dde9d5ac", "0x7867b781c9e6fb402ceed0a81e69c1d60993b840dea9cacf57ff9b7d8a6e0e76", @@ -931,7 +1015,9 @@ "0x782de690bdc23a23ded9ccc48292f5060a5dfdd39e16d8501c7b9e8e21f12de3", "0x77c96af20df45cecb241a1ac65e60bdec235bd4225a952c936d362f0dc22da36", "0x779d95a2168b4fc42a2fa8847416eeafd5d4cf8059e707c28f1261335ace440c", + "0x7753137c18b520d01b87216c9b02e64309b0bdde0394c6348657afacdd6cd13a", "0x76c45c1201790fde7c1f7ae826a40bf319385cd9651b3da7f8a0357e5866d881", + "0x768a8fb5fe41fb970c20446a7fa9530d6c84da8711e59c27013ae341c6c4e4e1", "0x7649d4906d0228120798a47cda0a9beba06d43aeb6d1bb8c45f5be835f8b6d00", "0x75c24b798f12ef7e30e9a98f2781c92fe4b0692dfcfe4a68844381eaab3c6b68", "0x7572ed42285bfdd75addf23f023e897e8e95dc72613603c02abf48ce091c5ae8", @@ -944,12 +1030,15 @@ "0x724b27c4cbd5e0a2bd66840ae8927ec5512b74986e4d33f4b7c7d2002289fb48", "0x722ad7dc2e610fb0bfd364dd056a5024b444c3fe8af83c03bc3d04a36e02089e", "0x71daf8575ad49dc67702ddf0e78cd31cba934e989ba1aa4e743e785b25a81725", + "0x70f97a1182559f553192e6bfed2e73e3b15aae7d8f04a967856c4122d7e16018", "0x70e16ebd2a54cea61de7f41c296183bab0b82b6560a396e628ee22863c892304", + "0x70a182eb3a55a5ba77c28b53269d11f216810753f7749cccfc6b34df3dafb12d", "0x7058b0f33dc62331d3db646bdc29635931e0d33452172b7ea43082e96151cb9b", "0x704c26063525f4fa946a5eaaae747eaaddd418182771aeae247a8bb55fc41f84", "0x702dc012f2aa123f9f9ce1407421dc57c6d23f50e211118b199fbbcf2d3616a3", "0x701d39eb53efd4f2eb70060bb15705016fbe493c6c6c580cecf4135f3b2a5ffa", "0x7001c72c4bd395954c9f7362f302d584826a102b9d018b3342092a30477c76e6", + "0x6fe3e97c971e72c83e0d7f94a47ca134892757b050898c6c69de2780bccb01ea", "0x6f1cc08c4919326868649ca1b82e92ebc3220809fd3c0d9f8abd70f66b5d4929", "0x6e199e1c877da0b4d7f10bf4285bbac6db4252127cc9848fab2864717e3fd22f", "0x6ce68822c996fdfb8ff3c063c2cf59e54a1c0fc3a9e441c9b61a19ae514d7737", @@ -976,13 +1065,16 @@ "0x65ca6a611e79e072c91533d0e3f0fcd1acd361477db6963959b3bc1b43e7e2b5", "0x65c90b3854184cd6caad673569ca03ab6b5206d0073993b737f1bd7fa3b194d2", "0x659ec47803404ff40610e5b513079ab5eb507434a1ed5bd5745b6f85b24265d2", + "0x653b69edc7d8d39847cb93de498478892edf5cbab0117e21657d08c6adce29ec", "0x64a7180432b0f5dc8634fae53ee9e55c4c9471df02efe14b9063dbbaef2670ad", "0x64452851f8c18933b010d4531332a619847a05dcdd0f06cf9621771d7ddf243a", + "0x6436b58b3e374f80c29c2a5427ec9b329e844da569ef7a4317b46d6726be20a7", "0x64191e209f9091a5c23032df110b5e4fbb0c909fe3a17d9cf34ef4f0cb1ad360", "0x6367e6ba8024776ee081a70386a7785195b25c47a8c68f6f9f628d3835dc8a5a", "0x63386d82f8428bdbfe586417249d30918a72705d1eb45046dad7af5ab5300548", "0x6297798d6ff8aa392fb23dcb2cdb99f9175362c2d1191bea1be004f626552ef4", "0x62907f1a3f26e25dd1ed0275a1c82c64535b7e33eee8595c04e050d1db4712c3", + "0x620d3a2fb0d0863758f8bafd728c0baa827a92caac31f52b2b21698bd41b0037", "0x61f22a547b46e6d8bc7f5a936ce0933ab85ee4b7ac58d210cc9f020e0cbbf4bf", "0x61a1ee737d8ddfb196b144d91deac512b512419fbd39785f807f096a1709a889", "0x60b3469f58a1d06bebebb05fae97f014fbf06555c03569c4a9ac9c50c8aef7b8", @@ -990,6 +1082,7 @@ "0x60a2a196bf87afa973d9d2175266d37199b504f1af6bf3668d92714a1968db16", "0x6070dee088335ea94da705ca8ffcd0998f6ff83db5b1ec2141be56c9e577a0c7", "0x5ffb91398f908954aa5a20fa6281a41d53e962ed35c93943c6310968bb67f6a9", + "0x5ed4c2f6455d6ffae6f4461c4344cf58404b42c0d0c27d33277e6ee1d9fade39", "0x5e9052c4abc2dcdd2548de6e21b30e7d5db763e35f476796371e8dcd40fbb00f", "0x5e5f0dffa7d7e9bdd48ebc9641bfebcd7573ac5ff14faba46e455e9921ca1db7", "0x5e0ce80dda77b99f48420f228a334fcc2d1d653bd367c0d2b76126f51fcb51f8", @@ -998,6 +1091,7 @@ "0x5c9b4fd266a9cea32c32a79aab01fd3b778f6b0b19e3c37b2a2d86f1e40a6a96", "0x5c4f717f4661fdcb45408c30732731f1229f28b8e5852e59c8a96a5aa3283f97", "0x5c324eec3d9dedd5bbc528b4d4112e55cfb98437bd0f1615cbd9b6238211afac", + "0x5bdc4f941aae448aa4e555e74107bbfef30f6b714e36657584792fa9bcd6960e", "0x5b8e0f4d6297603b7840db86830bc7a5d6d52529a8736e95125f60ac6a038bd0", "0x5b84e04ebdf28b45aa017e7f27fd2fa7c4cffde3dfcfa0b518f671c48f48b439", "0x5b1dc7d05ab86c2931d34df3bed8eddde0d26f9aac6455edbd1beaee08f71092", @@ -1027,6 +1121,8 @@ "0x5081771ed23034ee299997ce1bd0e5a69557828448b6191ed6dbe580e7118b1c", "0x504d60e9f67ddf756a5e7f7f20bb9521b46131150aeebc78ba8b3effaead08e5", "0x504a610aaf199b6749990602e77ed50f2153bc4688613377e2f1bd015ce2b5ad", + "0x4fc03982e20abd384cd494dff781152c22eeefb15c56bd5fd37399ab3c87d4c3", + "0x4f03879bcdaece9515067c8c569e85e1badbe04b3f1b935f641792d14aa2e1cf", "0x4e81b90a2213a248cf0ba364cc09012a26f44862f1d1febce1f013f5a230d43a", "0x4e7c95423f147d884e3be846d6779df3189a7c9ea2821c7ad0af97085917db39", "0x4e28e5799c8912a85546586b865363acbcb88587da470569c078c526163e2203", @@ -1039,16 +1135,21 @@ "0x4c352104be4b157d6df585083dec1cc0e4a2dc660ab5de6f11665ec736625656", "0x4bfd450ecd69ace096b7fd1e704cc0c9665cf0c73db699b2a15a2f6d636ca748", "0x4bb4d5906d886930d705fb7bc261c480c86505f888c713331b8969e59fde5bc4", + "0x4ba2d8b2e3fc5038e602bda8b417f5829d5ae5269666d4935cab6456390559da", + "0x4b0f2e5afc5e96a64fed657e9b83bb020865264c616b04d3c9298eafa2006a6a", "0x4a8cdee2df016ba2fbdd6686830d2a23506d0678aec3904e10a6c1b31f995755", "0x4a12baff0066a434dc7506dfaec76cc9b45c4e3ff9c973d51a7132ca8a6f588b", "0x4a09e6ba2987b4f2b252311a0bad0f73050179b2e7f535fdaeaa6c2f60a2a7f9", "0x49e9750fd4c9b4f16408ee0e36f553e6ae07e180209fdf7d72af93f105400804", "0x48f691b4a849125052a743b17ae5ab3de98640867d497e8cbdcf9f53f298773b", + "0x489c2a9cb387fae2b3aeb30fca981c5b55283a0a1acb5fa6d72262375688b15b", "0x481953359b9d7bcf72d4ebcca7e559a258f9047b804675b21ee4609d3acdb821", "0x47f42ec0b01efa8e1cff8bfcc7ab41b1b35ea5ab7702d31217771812511de43c", "0x47ba0ef61c967c94f38160c32cd0717785a75e4e77496800e37450da2b140c1b", + "0x478bce1399bc6763bc20805b2b0eb50a3b581748984442603bd693f0391a8fde", "0x477a018d9316bbb3107a6295a260114636e1401591f9da5460b7ac71acd2dcdb", "0x476adc4cbc94dd9326ae3d3155ccfcbe39a47635a03312eb2c773631c1cabd65", + "0x460b9bc4afd011efdaebd7e879bdd9b3b67a1c8c88947263e75ffdb896368b60", "0x45cc3661bda47961bb14a7a2daf81f3ff1020a050cff302b78db7b3626c055e6", "0x459496371ec299edb7b511722dde5c23cf5f8d14ebd8d3382bfc2c6a2eecae01", "0x4504b9e0c2dad195d7eed1abb135d4c0ee27d21a11ee663a00c20abc89f478b9", @@ -1059,6 +1160,7 @@ "0x435419014bdaf9d57031fda1d067e60e1e188fbc20f25081ae5112f64e89637f", "0x42225e4f2fb6956e678dd821bf5712771d14817d4df291788da9cd80313de288", "0x419e0159dae7e2c4c09e1452ae1df812c19e64656fac04745b5bf02612aabd93", + "0x40c0f455cd33e60b5bf8f7afe0d278a054de4db63558e318e7cda8dee1575968", "0x404282a4b3c82b2c61655494e22c9d64f714d2bd1d85b48152e830b67a966b02", "0x402027d798d7d308f38ddb7750b0136c213978521b7233758815ee88bf5274f5", "0x401fe70e7a7ad6f6af8b41a6332f747fcdef35d5681464d7593631d6d1cce38e", @@ -1068,6 +1170,7 @@ "0x3efe05f6fd529a51b930cbce1c0e50ad74491f830c5e40bb980b4e1bed0d4893", "0x3e53e9bcbd804c31b234f80471e202144ce813555fd591828e8a339ffa18bd35", "0x3e4c127e067d5b4ba310fe222145c84f870237b0d50e08c2a8ab611ff1e539eb", + "0x3e4397309d25ebed330fd2fcee3c9d60aa09af284abc8683101d0540d8afa90a", "0x3df78c65a0dbaebe1ee9510c145d729d240478134225c837013d996941633159", "0x3dc3f80dd4ddc9a95fb56ec4bcc4b72c13e9c0c64878b69ab0890b7f7947e200", "0x3dad4e2198e63353eca046dfcfdc4968339196777fc23058ddd085071c8c9d8a", @@ -1080,9 +1183,11 @@ "0x3a881ffdb3da446d220952f3a36c1ee902f736a79e6ef43d3a7947721719f04b", "0x3963285656fab596f646b649be3d3502da07c98f1e97547e9fd3a42bacc91533", "0x37bbf3a4adaa935d0dcfc8c177d37a47cf0c9dce034b5bb0a0da5f50e597c803", + "0x37ae64eb1c2c800558c957606b5ea8799db9e9761a0644c14da0708536e2d3c7", "0x3775b238fcdec0e39427d1e4759fbf8b6384f884b00ab78fb2834cf2065aa927", "0x372ed8fd2167b5413bd5ea5d6e208cb23bb82470d907368e62924574f3590710", "0x369f1395546595ccad046b54465a0fea4bbc22bbe13a9622a42f80aa14caf37d", + "0x36531902a9d0a3b812563f7473db89ff777110a42a13215120b94defb23ea7f0", "0x35e1c3ecd865b6cca8a09f1279f772f313af8f10b71a4d90e2dd324a91b85e72", "0x35d76ce3b67475ed49931650195866d6ca1530066c3d3118be39cfc10fa38816", "0x35d1ce12816ede11988a3307113ee3e430dd46add0af4c008562fb42efd09ba1", @@ -1120,14 +1225,14 @@ "0x2770ce3330d55eee35d288bc2da9c23e97133ebed145f42131cf74bf428d4712", "0x274385590b6ff154fc25054a445cac1d5339dc02c8e8a9e0f23ffc7767fabce1", "0x26c1848499c2ac6c5dd627feb99fdf1d1fc3aa987a1d54f2f5324fc897a6bbff", - "0x2502a18a1466a0e28f398c3535032a3a46d53f94ef7e3ccef4d38795cc77ad3f", + "0x255b2f8eaa49f5ea4bbe842a02033089b2c17d3f90702d5f83334c8744204abd", "0x24452b5b4ed14579cabf2a13243c319e979bab5f140f7d02ededb1cf953466d9", "0x23d7b8ad7616c3aea9b06eb4a7884fb3ef426ce1df9f13c4476bbeefa05fd64e", + "0x232966be6225ca65c39d6723806948650d36ded544127d43e78f893501c9dc61", "0x23200642e349ce3f50e75d590338372e7553f8f5d295d5124eeac4ae6cf6c2cf", "0x2300f3d3cb42080c2bcbbf95005f7a5a38130e451daa37f95014aced1bcd0a6c", "0x2272e8fed32f9afc028b8a6def1d2ea8371dd00599c7f1df5da1a29c381460da", "0x2244deff2e22ca1a6325d18ff5b9e517c0fd0c4bdbb55f859710733cda85593a", - "0x223e07e43cfbf024c66a5f5d7c94cfcbc868ab056e4595873b729722968da6c2", "0x222339ab58e3faf20a795878f7a686e7ecd9b637b7d8150df19f1f904d06ef03", "0x21fb9e46698ac3cf1f2e6f8c583fa34b1277aef6b473a2aac99d3fe6e202910d", "0x21f59d889ad27ee62f29862573831f7edcb708d447858a3f70cd94944169df4f", @@ -1144,6 +1249,7 @@ "0x1f9c34d422588d5c6b867ae831093f312a2c8d5e837c383169fd1f5dac310b18", "0x1f2f18de89846adfd6118700bd03b479a1d225c5866ba9a492fa75ae7218aebf", "0x1efa73145b87a0b42b5afae0cf3eaf716d2b89d8b89695281386287440c46fd7", + "0x1eb1f70fabcbae75a662aeface34688cac40777f5a10430c3cd8ff0d256cdff6", "0x1eac45cf92999a29d9947e3b75ae8c9ba1069e11515ae300fca6b742ce5c1df0", "0x1e66f98560e7a43e1ebb1a3df215df1df31b9fdef12b416bd059eec8d9690042", "0x1e1d98ef9e40bb792e65311df273291a38eec6e8b83ec477300a43631fc4e4b1", @@ -1158,6 +1264,8 @@ "0x196943dc5cdfaf45338eaaf14327c1939eb673e1fad7248635132e013b75b252", "0x19552825f75f6a6a38fdfcb63b56f006cb35602f25c2247f245d9e88c8eacb97", "0x191e6ac14751a0abede9ae489b8e9a3763940b5fed14942526305be9f4b0265a", + "0x18ce7a8514282de9588772b134e650e84a9fa978ecf54659999f2d4e13440b57", + "0x18252d1ca7085cf06881aaa1ccb6efe3b786306b96e63572232e329e58b20f08", "0x18133cf06fd1dde3920d0e954d0c7fffbdcfbd01f4a46b1737650da9b6bbce94", "0x17f71e5c505a0090b88a2fa0d748bc3eb1d7074db7c6fb2008bbc88aad6d1180", "0x178dbb20f60ee6fe3148e8e89d1d02055903a77bdb99f677194b7a3fe1a46bc3", @@ -1174,17 +1282,20 @@ "0x15615876aa697f07eee82b3bcf810c003854afeca98eacc94955b5d0b0d70048", "0x144537f4919fff758e1f3ea0eacc0de42521d7a24db15e0ff42a4d48090de5de", "0x14270eecbc8e3f88d54dca730150e86888722f05939341b4e7e3bd241adae3c0", + "0x1422f2c95bdfb07fc803f7f2307ce76cbcf5dd740867a75268c22efe5605711a", "0x13e12782b8d17665d0905fd5e9cd819811ae88471006a6f95a449d6ea0edd48c", "0x136afeecc83ca2242646c851292874ba850638f56894855cf243ce8e880c96f0", "0x13468b2d30abd40653fcf4be00fcc78f00318e8e6d3e32d8d1b79e7cefeb4c1c", "0x129640a0922b479e6f5f604797fb53c5c094913a7cd2d6bae945bedc3b1ee9ca", "0x126438123275587069017010be0c57a719b1fba7439d940aa947c2cae5d535ff", + "0x119bc28188846badb31529a65bee2d722d9d9860dfcb3711c2260102c93c1875", "0x116ea0242c48b17b071ceda2caccd0ac46a8e637a42e21e65fab5fcd9837b939", "0x1148fb056cdfb772f971ec418ec09a11db35f71661637eed54ceafdc8b546de6", "0x10c6e39462f1b346d3a531048731d3a1b67773f41f05406a1fa741911f6d69e5", "0x109c8e968486d2304b4ff1bdc03d18f41b539ee3fe7d8bd3250316e4f88b337d", "0x0fc7c5fac39803137b4e3438dbf750a1a4fc1a098b83c2fbd9a59b3dc037a890", "0x0f4b7d163f94c80aafaaec5278ea5adf0e38df31ad2b19db4463e68afb4ae44f", + "0x0f155e814dcbdf4ad8a5919c7e3f3679be8b65e04c766a48367eb51627719d01", "0x0eac88d26629fccac8f9392f20de0c6bb128bb47945809e12e2a91791f9a3a8f", "0x0e8a4242089899dd959dfa280f6fc8edde00102e098aae1601ebe835d4aa69da", "0x0e3f5760a175b5479eebe18e8d19b0f50df82ac3f41cf5b7e2901b41baf3292d", @@ -1213,6 +1324,7 @@ "0x0385f85b3887a3ec65c69ed4912f075b1ed9cbdf0ac11f31fd95faa786aa2bad", "0x01c8da31816f3c41d14ef13f72a156851bb13c28635442fd03c2747c8adb9ce5", "0x0149a964edd2933dc4a2464fdaebe864938a1ff607695a9483c324b5c51a9c6f", + "0x00fc8683516efeb9676e3c27d0aa292b674aa2e912ec3b23f6800aee0d696c13", "0x008d4a1755c9e050b2a109e181c00817a82021dfade19b44caaaf846caca9f88", "0x0083c1dbdfce70b215beb476cf0a8afe7186c7e1c34d5d1ad7c9069376a100b2", "0x00144382e6661615594266216ddc01e3dbe11ce27aef0608a4a2676542401393" @@ -1220,2435 +1332,2659 @@ "values": [ { "value": ["0x616b958904940c789e104Cb39bd2BFF82427CCCB", "1"], - "treeIndex": 766 + "treeIndex": 839 }, { "value": ["0xb1584a8B7A32FE4573FaF3Bc8013Dbb3D9ae16A5", "1"], - "treeIndex": 1009 + "treeIndex": 1103 }, { "value": ["0xE52Ee356E4320DBC467D72A5e7931C1F24Be2912", "1"], - "treeIndex": 969 + "treeIndex": 1058 }, { "value": ["0x2ec31068d6451510841578981081124a0f75cC64", "1"], - "treeIndex": 641 + "treeIndex": 700 }, { "value": ["0xB5CC80D2423bf3a47163DdBaBe7A49e0473173Fb", "1"], - "treeIndex": 901 + "treeIndex": 984 }, { "value": ["0xCf2b7c6Bc98bfE0D6138A25a3b6162B51F75e05d", "1"], - "treeIndex": 980 + "treeIndex": 1071 }, { "value": ["0xebfd96B294c7eb1eF31B856958B1A9287D34Fc4C", "1"], - "treeIndex": 694 + "treeIndex": 759 }, { "value": ["0xb91b3dec63690356bdfc2d664cdae19b3d96e5a1", "1"], - "treeIndex": 734 + "treeIndex": 805 }, { "value": ["0x3C474891be0bA5FA5215D33eAc59B8547cd00DFe", "1"], - "treeIndex": 947 + "treeIndex": 1035 }, { "value": ["0xC8D46eb7881975F9aE15216FeEBa2ff58E55803c", "1"], - "treeIndex": 1078 + "treeIndex": 1181 }, { "value": ["0x50B73d52a00dD10fEef49a074657285515020320", "1"], - "treeIndex": 890 + "treeIndex": 972 }, { "value": ["0xF23e0D6E328a13De1910D78B6a0D4D1aeFaDDda4", "1"], - "treeIndex": 797 + "treeIndex": 873 }, { "value": ["0x02847216Cf4C32bffBE3653377D57CcA70B00aE7", "1"], - "treeIndex": 872 + "treeIndex": 953 }, { "value": ["0x2179A901c2Fa2f3ebA7C9D7aEE63807384c7B36c", "1"], - "treeIndex": 723 + "treeIndex": 792 }, { "value": ["0x73A5e302aB43D6F9a444c30b23286f0751A261F7", "1"], - "treeIndex": 983 + "treeIndex": 1075 }, { "value": ["0xa9B1a760b56df3C18A93D596F7851D0d7144C866", "1"], - "treeIndex": 1002 + "treeIndex": 1096 }, { "value": ["0x1aeeaa375b4112f537FaFDEA5AA3BAB0e1257557", "1"], - "treeIndex": 626 + "treeIndex": 684 }, { "value": ["0x64b561B2E08a316574E698C8Bc18a3F8645461E6", "1"], - "treeIndex": 720 + "treeIndex": 789 }, { "value": ["0x08dBD4347AC04A8DC6BC24fa6511A03aBDA3E05e", "1"], - "treeIndex": 655 + "treeIndex": 715 }, { "value": ["0x7549ab7a4453aad643046d60347b1143c3c1cc4f", "1"], - "treeIndex": 935 + "treeIndex": 1021 }, { "value": ["0xC69aE428f6049e78D445F053D2c1df879C59b34C", "1"], - "treeIndex": 1181 + "treeIndex": 1291 }, { "value": ["0xe8C6cEe0408D8fcb1E09dC13149b6D516c32ff70", "1"], - "treeIndex": 869 + "treeIndex": 950 }, { "value": ["0x40cf8142bCb573c3882d5723D8AB3cc6D11ED68D", "1"], - "treeIndex": 794 + "treeIndex": 870 }, { "value": ["0x6Ee7ccecF5664eF9c3645eB103450319bf291945", "1"], - "treeIndex": 1178 + "treeIndex": 1288 }, { "value": ["0x589A9b567c48d3B2FC208727D41BC78c0746cfcB", "1"], - "treeIndex": 716 + "treeIndex": 784 }, { "value": ["0x73A1d547A12a03fB5aE816bf4a8E6D90d4C02D2A", "1"], - "treeIndex": 939 + "treeIndex": 1025 }, { "value": ["0xbC0C8761f2b093Ba910cEA4E0C9Ac3700d3BdE73", "1"], - "treeIndex": 1204 + "treeIndex": 1315 }, { "value": ["0x1a8c8ac53eaaced7e667d6eea68eaedb6069dc59", "1"], - "treeIndex": 847 + "treeIndex": 926 }, { "value": ["0xC279F761e8eEcC16954c0c1457523f13aED12edD", "1"], - "treeIndex": 842 + "treeIndex": 921 }, { "value": ["0x674A7E635956AE62bFFb8b0ddDbC7fff86FBeFe6", "1"], - "treeIndex": 798 + "treeIndex": 874 }, { "value": ["0xe0854ff3e73df0f4b421004d7313fdaf8fd5ec17", "1"], - "treeIndex": 850 + "treeIndex": 930 }, { "value": ["0x1f8aeAb0219843C65b4A0A7cC42E69E3e3b97d73", "1"], - "treeIndex": 773 + "treeIndex": 848 }, { "value": ["0xeCD40Ff016c263a06Ebf6958854FEcaDb2622818", "1"], - "treeIndex": 898 + "treeIndex": 981 }, { "value": ["0xc85628409af9001f3e70a73516b7a5cd163d8185", "1"], - "treeIndex": 922 + "treeIndex": 1006 }, { "value": ["0x8E2ef60Ccf0b6478Baf08f52618A63D09404f267", "1"], - "treeIndex": 1172 + "treeIndex": 1280 }, { "value": ["0xA8327cF803d9851E4eAfDC2669000fd2630a35B1", "1"], - "treeIndex": 704 + "treeIndex": 771 }, { "value": ["0x34c3dc8affba68d772a42d794eae085060f35e04", "1"], - "treeIndex": 781 + "treeIndex": 856 }, { "value": ["0xbcafff4b4e5446fb58708cf298185f3bffc03d2c", "1"], - "treeIndex": 1203 + "treeIndex": 1314 }, { "value": ["0xe0aab54593d19336d77f460f055211892d5f8876", "1"], - "treeIndex": 625 + "treeIndex": 683 }, { "value": ["0x94dBd1af9b88f924a51164C80195C38c1d6029be", "1"], - "treeIndex": 707 + "treeIndex": 774 }, { "value": ["0x490e2fbb7879457868673234a8ffdb1d86fbce4f", "1"], - "treeIndex": 795 + "treeIndex": 871 }, { "value": ["0x598eb27e7564fa83dd03c326e38be38c1a47fc82", "1"], - "treeIndex": 958 + "treeIndex": 1047 }, { "value": ["0x9c2Dd66C10Ddf7a2e543f1936d123CD8Ffc377b7", "1"], - "treeIndex": 999 + "treeIndex": 1093 }, { "value": ["0xAA19Dd3FC67ccBbba25ef76d1f8E72989E06f921", "1"], - "treeIndex": 609 + "treeIndex": 666 }, { "value": ["0xeEB8505490728278cC16a9087De853b97b6D67d7", "1"], - "treeIndex": 1031 + "treeIndex": 1127 }, { "value": ["0x2C417b8E154A99f962b3B386313Ab23f99Fa6171", "1"], - "treeIndex": 891 + "treeIndex": 973 }, { "value": ["0xc52e7e835d36745d3b0e8cf5610e3b503507701b", "1"], - "treeIndex": 938 + "treeIndex": 1024 }, { "value": ["0xE8153E9e32ee62764d4512B89BdA0F712A291D8F", "1"], - "treeIndex": 811 + "treeIndex": 888 }, { "value": ["0x99C8140c30cBFDfAf3454d2E8B21375D9f83e239", "1"], - "treeIndex": 870 + "treeIndex": 951 }, { "value": ["0xE7691BA06eB4a302652d3290e4A89A504b3860fC", "1"], - "treeIndex": 1087 + "treeIndex": 1192 }, { "value": ["0xa342C0cFD847E696399B0c391Fe3375D8Fb732F9", "1"], - "treeIndex": 632 + "treeIndex": 690 }, { "value": ["0xB67a420656e338f1854926649ff74BBA6254700E", "1"], - "treeIndex": 1055 + "treeIndex": 1156 }, { "value": ["0x5f791Fd1f4ec3617a5C80f76FE39409A27AeA8C5", "1"], - "treeIndex": 885 + "treeIndex": 967 }, { "value": ["0x607573032fA3C6113Ad2B864b830b76c09440A77", "1"], - "treeIndex": 957 + "treeIndex": 1046 }, { "value": ["0x0B6d7ED622124A9B9e5ab041A86648630804fe19", "1"], - "treeIndex": 1060 + "treeIndex": 1162 }, { "value": ["0x9452Db8bc3cBc87b8cb27706AECf95eeAc3E75d9", "1"], - "treeIndex": 1081 + "treeIndex": 1185 }, { "value": ["0x2198a010055D46214c66cc6CaeC4f9Be1FDc0B92", "1"], - "treeIndex": 1041 + "treeIndex": 1139 }, { "value": ["0x020828395e3ca320Ff83BcE697166CC8235082DE", "1"], - "treeIndex": 1162 + "treeIndex": 1270 }, { "value": ["0xef109b4398e3ee1e612f0a2fcfafe63c00d3133a", "1"], - "treeIndex": 777 + "treeIndex": 852 }, { "value": ["0x924D809a508326a204e158E8568ff0F57b115401", "1"], - "treeIndex": 1064 + "treeIndex": 1166 }, { "value": ["0xF21bdF3B8A0B0e6FbFDbf087A6c2D712c37847cC", "1"], - "treeIndex": 730 + "treeIndex": 800 }, { "value": ["0x761b3E92A753B162a7C552615700CF76b806e24c", "1"], - "treeIndex": 860 + "treeIndex": 940 }, { "value": ["0x432c53218a11bed08d238cf84ff547ce4fe933ab", "1"], - "treeIndex": 1084 + "treeIndex": 1189 }, { "value": ["0x62c7db69210cb72fe1f8966c87131e9c0abf7ce7", "1"], - "treeIndex": 818 + "treeIndex": 895 }, { "value": ["0x1025524d214860efD49F6CBcE255242Fa42F87Fe", "1"], - "treeIndex": 828 + "treeIndex": 905 }, { "value": ["0x2696f3039f82aF63C0474ac36d4Ab8b7934c9cC3", "1"], - "treeIndex": 1086 + "treeIndex": 1191 }, { "value": ["0xC9071e64D1C484046908cC149173b32A0EeB9506", "1"], - "treeIndex": 634 + "treeIndex": 692 }, { "value": ["0x1cb1ED0E32825f025b9432c94E6ecA50aF596Aa5", "1"], - "treeIndex": 1180 + "treeIndex": 1290 }, { "value": ["0xaCB51D5383371D31B47Ee111f13553e8580B5842", "1"], - "treeIndex": 682 + "treeIndex": 745 }, { "value": ["0x66fe01302438617343cd5c1022547a5c9f57062b", "1"], - "treeIndex": 700 + "treeIndex": 767 }, { "value": ["0x723c5a83b6b2b5ac1a1ddcc75fd2c484d53e0053", "1"], - "treeIndex": 921 + "treeIndex": 1004 }, { "value": ["0x0D2a7ad3f3114D225521ec9B722014E6C3dAd1e7", "1"], - "treeIndex": 1049 + "treeIndex": 1150 }, { "value": ["0x904AA398a9E759054c2EF3ae3f51cdbDDf692f34", "1"], - "treeIndex": 1056 + "treeIndex": 1157 }, { "value": ["0x5d8a42c1c8d1b78734f5f3877d9fb1c27f31d1be", "1"], - "treeIndex": 884 + "treeIndex": 966 }, { "value": ["0x977A2fd06F589531F8F0e199aBaa3f715e8A221F", "1"], - "treeIndex": 649 + "treeIndex": 708 }, { "value": ["0x0cD07E6B92ae3FE61fA57941d3F461057450c160", "1"], - "treeIndex": 724 + "treeIndex": 793 }, { "value": ["0x349b90a8be1fd92745dc30c7b61b8623280f05a9", "1"], - "treeIndex": 746 + "treeIndex": 817 }, { "value": ["0xaE29EeC679D4c7838FAF3Bf1c30fa8edEB6d1457", "1"], - "treeIndex": 831 + "treeIndex": 909 }, { "value": ["0x97a9552af7eC74ab719C932E40d7194340C83900", "1"], - "treeIndex": 765 + "treeIndex": 838 }, { "value": ["0xB73aB29Ae0623aF31ae027820FFEb5eE5fD56a59", "1"], - "treeIndex": 1191 + "treeIndex": 1302 }, { "value": ["0x8f364fBE6cE4431a5169F78014FfDBD08957421f", "1"], - "treeIndex": 1062 + "treeIndex": 1164 }, { "value": ["0x1B3f0Fd412309baF6F107320Ec1523226ae212bd", "1"], - "treeIndex": 960 + "treeIndex": 1049 }, { "value": ["0x4888E5Fb2968Ee0F3505C99743Aa554D0c1f9f60", "1"], - "treeIndex": 942 + "treeIndex": 1028 }, { "value": ["0x61aab1962798ee45aabf6ae864949b83f9e97d72", "1"], - "treeIndex": 1034 + "treeIndex": 1130 }, { "value": ["0x75A6a228F9AB9c01beFABE7F5D87d8d42338b9A8", "1"], - "treeIndex": 1160 + "treeIndex": 1268 }, { "value": ["0x4dfA53e81d6FEd78015d03f30eF6433DAE601555", "1"], - "treeIndex": 909 + "treeIndex": 992 }, { "value": ["0x40a522034b38d5f46069981433e9b673114eb57f", "1"], - "treeIndex": 670 + "treeIndex": 732 }, { "value": ["0x0a40f6C90a04afF08C5dE786C91d53bC518c254C", "1"], - "treeIndex": 692 + "treeIndex": 756 }, { "value": ["0x00C5eb104e91Be86153dd72dD1C9A45b7dB28B71", "1"], - "treeIndex": 1201 + "treeIndex": 1312 }, { "value": ["0xF9c2FBe8A51eDEcb2CcA8B6778a8e3Ccc0593571", "1"], - "treeIndex": 640 + "treeIndex": 699 }, { "value": ["0x63072959a9d9Ef7F572bDE7207f386D8b5Cab26c", "1"], - "treeIndex": 1131 + "treeIndex": 1236 }, { "value": ["0x99e27746e33c9886f6A3A19336E0aB753F962db9", "1"], - "treeIndex": 706 + "treeIndex": 773 }, { "value": ["0xf48CB9dCD55F0eaD3516a60868F6bFb6f1Ce86d3", "1"], - "treeIndex": 1168 + "treeIndex": 1276 }, { "value": ["0x281c1be0eb4d97b34bb1ace5959b53792ffb07e7", "1"], - "treeIndex": 1140 + "treeIndex": 1245 }, { "value": ["0x6ae9ca4bc999e280c0bc3ef30149d222603953bd", "1"], - "treeIndex": 845 + "treeIndex": 924 }, { "value": ["0xb75FD020a1b82bc96fB62adf739653e7e754F7D0", "1"], - "treeIndex": 732 + "treeIndex": 803 }, { "value": ["0xf136A4ccD982036E3fB6e8B63D0E82DC7BB20588", "1"], - "treeIndex": 783 + "treeIndex": 859 }, { "value": ["0xfa2eAAAC27d4f54AAb1680FAe162543c3dcB031c", "1"], - "treeIndex": 1154 + "treeIndex": 1260 }, { "value": ["0x1b984908c807BC22E1732F2F705e23DdA41a7593", "1"], - "treeIndex": 804 + "treeIndex": 881 }, { "value": ["0xcd0a8bb5ddd927140e2a2e3add0b0eba546519e5", "1"], - "treeIndex": 653 + "treeIndex": 713 }, { "value": ["0x10743eea87e91a8a9da3f2d815d92e86ba577a6c", "1"], - "treeIndex": 1113 + "treeIndex": 1218 }, { "value": ["0x8bD036Ec5Fce5341fdFd3A8c1F108a6820B55D92", "1"], - "treeIndex": 1196 + "treeIndex": 1307 }, { "value": ["0x744b4FfeD79071fdcDC03fdFBF61B639BAef4426", "1"], - "treeIndex": 830 + "treeIndex": 907 }, { "value": ["0xd70559c1A3EA4b435B8b592345Fc4676bAd69543", "1"], - "treeIndex": 849 + "treeIndex": 929 }, { "value": ["0xec17faa8f8bf4f43a62f7ba2b89f162973f07d66", "1"], - "treeIndex": 717 + "treeIndex": 786 }, { "value": ["0x240795B0A85A4508D4dEDfF3D12A42368d157BA0", "1"], - "treeIndex": 796 + "treeIndex": 872 }, { "value": ["0x39ED71268D7596D58Ba4969ed1cB8ff43Bfe373C", "1"], - "treeIndex": 630 + "treeIndex": 688 }, { "value": ["0x6dDcBC9544954dd52B28e83Bb3Ec1c02d5787146", "1"], - "treeIndex": 819 + "treeIndex": 896 }, { "value": ["0x160aE01BbE3EA103Ab3d63FCFA6D04A4267bc7eb", "1"], - "treeIndex": 945 + "treeIndex": 1033 }, { "value": ["0x27fd40568660de78e7e5eda2ff7c55ff689b9c3e", "1"], - "treeIndex": 887 + "treeIndex": 969 }, { "value": ["0xe60f18fe1c9f5f72c4c823bf672c1c65e48c5996", "1"], - "treeIndex": 964 + "treeIndex": 1053 }, { "value": ["0x7ca6661ae5e93afb6c5b8434dc279bb1553c095a", "1"], - "treeIndex": 1095 + "treeIndex": 1200 }, { "value": ["0x2E437973EEf4a38Bae8De1eCe6FC74B12a65eC7c", "1"], - "treeIndex": 1189 + "treeIndex": 1300 }, { "value": ["0xd87Ba7167329ED47F53b81DC186044D44C2B2e1D", "1"], - "treeIndex": 1150 + "treeIndex": 1256 }, { "value": ["0xF73A1Ef7Fb53Dda5cC475629972F14480a3B2E1d", "1"], - "treeIndex": 950 + "treeIndex": 1039 }, { "value": ["0xDACfcDcbB44692D8223003a42f2832bad1B00359", "1"], - "treeIndex": 1120 + "treeIndex": 1225 }, { "value": ["0x7f2d7d2d81e89d372dee78f5e0e4e526c8635715", "1"], - "treeIndex": 854 + "treeIndex": 934 }, { "value": ["0xd778651EAf49AFb2dD334CC157eeD34d357b8733", "1"], - "treeIndex": 1010 + "treeIndex": 1104 }, { "value": ["0x770e53470BBE7a03d19471a58Ad98D5Ba0388B01", "1"], - "treeIndex": 662 + "treeIndex": 723 }, { "value": ["0xa9d3c061dcbfacfe8a52b8093c89267614f0d0bf", "1"], - "treeIndex": 1136 + "treeIndex": 1241 }, { "value": ["0xC9770cd0D9431F3250177Da2757f02864A87ff88", "1"], - "treeIndex": 978 + "treeIndex": 1069 }, { "value": ["0x5a5c3318281c29eef99179f2b613c00b0fa393f5", "1"], - "treeIndex": 792 + "treeIndex": 868 }, { "value": ["0xc025D7026fDDe8ACBe8f2DA4F7F338bbA95BC0FD", "1"], - "treeIndex": 775 + "treeIndex": 850 }, { "value": ["0x57e29fd91a1fab03942ac1389d9b0ca16fb8026C", "1"], - "treeIndex": 708 + "treeIndex": 775 }, { "value": ["0x3DE5Ee31a5116f24dd3CCB9745c187471FBB8cf6", "1"], - "treeIndex": 726 + "treeIndex": 795 }, { "value": ["0x47d761f841a450c275618c87eb5b75db69661d8d", "1"], - "treeIndex": 838 + "treeIndex": 917 }, { "value": ["0xED334EC7B60C15ddbB3B1200864768eB449A1a6E", "1"], - "treeIndex": 616 + "treeIndex": 673 }, { "value": ["0xebfC0724D2D891326492e87500A931895D4758bd", "1"], - "treeIndex": 977 + "treeIndex": 1068 }, { "value": ["0x20d673a33fb82C4ceaf1F91e76C1720DDA7ca931", "1"], - "treeIndex": 931 + "treeIndex": 1017 }, { "value": ["0x3fc0f10029b113a187c5817d35de0f3de2a39ebc", "1"], - "treeIndex": 665 + "treeIndex": 727 }, { "value": ["0xFED66c4c0C79d0ACE410c44c619a1cDbFf931e65", "1"], - "treeIndex": 799 + "treeIndex": 875 }, { "value": ["0x18b420Da3D0e4e9c5da1D207561823715C232079", "1"], - "treeIndex": 695 + "treeIndex": 760 }, { "value": ["0x99F11237a5CAeb22C44dB6063f18c9BBF370291E", "1"], - "treeIndex": 937 + "treeIndex": 1023 }, { "value": ["0x3219f17138320805Cb6C17555BbEbB54F8ADb4BE", "1"], - "treeIndex": 1159 + "treeIndex": 1267 }, { "value": ["0x463d90025d31da9d1fd0eb51669edeb2a68b0b1e", "1"], - "treeIndex": 994 + "treeIndex": 1087 }, { "value": ["0x27deE0791881deE7c4e2A5F49Fdc6ed4cF7DDF7d", "1"], - "treeIndex": 910 + "treeIndex": 993 }, { "value": ["0x94d09d1c74763807149746e9bd265721e6527946", "1"], - "treeIndex": 936 + "treeIndex": 1022 }, { "value": ["0xA3875cF5d001458C1E2F516c98f2994981ED69Fa", "1"], - "treeIndex": 853 + "treeIndex": 933 }, { "value": ["0xb147eacaf85d77f68e30be6090e67851d084e3c7", "1"], - "treeIndex": 1004 + "treeIndex": 1098 }, { "value": ["0x2FAf55a544c5F73666438BC185aeCC9D685E6E3C", "1"], - "treeIndex": 993 + "treeIndex": 1086 }, { "value": ["0x00A9E0A913b40975b3b30F7e196a9d159E1a1e49", "1"], - "treeIndex": 735 + "treeIndex": 806 }, { "value": ["0x486a2acA683807CDeB4AA73d4Cf94eADC7A9ac13", "1"], - "treeIndex": 1107 + "treeIndex": 1212 }, { "value": ["0xF53F564D7c1ac2875D9bA48aD643C249EcaB3877", "1"], - "treeIndex": 1097 + "treeIndex": 1202 }, { "value": ["0x8dF1379C5661071928576E8136f055DA9610619f", "1"], - "treeIndex": 778 + "treeIndex": 853 }, { "value": ["0x266a78d3c6ee02ac304fef8171d46d145d939b48", "1"], - "treeIndex": 823 + "treeIndex": 900 }, { "value": ["0x23f79785487112f9323673d1e6127340a4b3ea20", "1"], - "treeIndex": 1102 + "treeIndex": 1207 }, { "value": ["0xa52d736277e174973626f92a65e12ca193aaf4fb", "1"], - "treeIndex": 979 + "treeIndex": 1070 }, { "value": ["0xe080aaffbfeca6108c1cb6e5f74dfe399843fb09", "1"], - "treeIndex": 976 + "treeIndex": 1066 }, { "value": ["0xe614436af4dce18bb711a46a1eb88c9bd6752f90", "1"], - "treeIndex": 683 + "treeIndex": 746 }, { "value": ["0x74A4Db35E431a6f8371C0Fbabe1dD029cB762Bc8", "1"], - "treeIndex": 1138 + "treeIndex": 1243 }, { "value": ["0x665d7f0b9521141b2d4F7929dd83C14123eF5050", "1"], - "treeIndex": 1089 + "treeIndex": 1194 }, { "value": ["0x53cD242585F72EDD4C92ED3dC4A944AAdACCE413", "1"], - "treeIndex": 651 + "treeIndex": 710 }, { "value": ["0x6aD23fA82Bc63b680F06823E36605Dfe9D828FA6", "1"], - "treeIndex": 972 + "treeIndex": 1061 }, { "value": ["0xB413f9647FcDd43bF272aDa2512262D217502396", "1"], - "treeIndex": 1025 + "treeIndex": 1119 }, { "value": ["0xe538fa7f300ac3d54f272d26aea43412fd15d013", "1"], - "treeIndex": 744 + "treeIndex": 815 }, { "value": ["0x84df46fbcba64a85941730f714cb5d6f55872b78", "1"], - "treeIndex": 1061 + "treeIndex": 1163 }, { "value": ["0xD62B71294BC545606c09dA4D070785E9e135269B", "1"], - "treeIndex": 840 + "treeIndex": 919 }, { "value": ["0x1E1667F16F725d7fCBFFa707e7E576fc64249902", "1"], - "treeIndex": 1027 + "treeIndex": 1123 }, { "value": ["0xDa6d0eB80629053cb3dc655925f6d73adA09D3c5", "1"], - "treeIndex": 664 + "treeIndex": 726 }, { "value": ["0x1a8eb494c2ceb2241c1572e663ff23211dedf8fc", "1"], - "treeIndex": 627 + "treeIndex": 685 }, { "value": ["0x149569a5e5eff2e7a39ef384bc62fb932cc053fd", "1"], - "treeIndex": 895 + "treeIndex": 978 }, { "value": ["0xb4eE750690b58204Bfe53bc2A6E0f77EC36DEC79", "1"], - "treeIndex": 657 + "treeIndex": 718 }, { "value": ["0x82c6d9ca5c2dca7bd454bc9b45d88212de5037cd", "1"], - "treeIndex": 1143 + "treeIndex": 1249 }, { "value": ["0x130cb2e9645c583e806b5dd2deb061b7f1dc38a3", "1"], - "treeIndex": 615 + "treeIndex": 672 }, { "value": ["0x74d6afbe4126ad32b57924cc030adae9596dab91", "1"], - "treeIndex": 691 + "treeIndex": 755 }, { "value": ["0x53E5c026413AED0a1a82F0cEBDe54De3288cFDE9", "1"], - "treeIndex": 1026 + "treeIndex": 1122 }, { "value": ["0x61af296ef49ac27c25521dd793156837cdfaa472", "1"], - "treeIndex": 693 + "treeIndex": 757 }, { "value": ["0x912123352931671e709Ba3DC036c17251Aca7d26", "1"], - "treeIndex": 846 + "treeIndex": 925 }, { "value": ["0xd2C41cC04EB699bE26546FcbB74815bd68283A6d", "1"], - "treeIndex": 1202 + "treeIndex": 1313 }, { "value": ["0x3bc2bCde4F0c6875Ae591cf6e8365688E90134a0", "1"], - "treeIndex": 736 + "treeIndex": 807 }, { "value": ["0x031c3f0a76308dd054acd484b790c2383ee6d1cc", "1"], - "treeIndex": 968 + "treeIndex": 1057 }, { "value": ["0x3a3e6bb88266bd06d935811ba1ae3520eafd0f6a", "1"], - "treeIndex": 628 + "treeIndex": 686 }, { "value": ["0x3913ecc1c8e2a97a34f51efbccaab5848081cdcd", "1"], - "treeIndex": 756 + "treeIndex": 829 }, { "value": ["0xDa186dB644Da3446BCF81F9c8e28108249B767BA", "1"], - "treeIndex": 1129 + "treeIndex": 1234 }, { "value": ["0x9B58A215A2F99Cb89B707764cC38Ae95AE6eC01c", "1"], - "treeIndex": 709 + "treeIndex": 776 }, { "value": ["0x63a27217100a2c1c9df370Dbf65E97fE2795344B", "1"], - "treeIndex": 899 + "treeIndex": 982 }, { "value": ["0x407ebda1e27fe0b68636266ef2edbdb45e2ee484", "1"], - "treeIndex": 857 + "treeIndex": 937 }, { "value": ["0xC77c6bf8AB14BB3C391b39AC505e2151cD4b489C", "1"], - "treeIndex": 698 + "treeIndex": 765 }, { "value": ["0xc901a6ee755047F254Cfb2cb0779dEd5395E348d", "1"], - "treeIndex": 769 + "treeIndex": 843 }, { "value": ["0xa4779581661e27A59Fe6444ed4473e72c5dB8f0F", "1"], - "treeIndex": 924 + "treeIndex": 1008 }, { "value": ["0xC0f8C3EC1b30933A7b7e7dF4Dfa49324b9598eA9", "1"], - "treeIndex": 779 + "treeIndex": 854 }, { "value": ["0x2F01FF5975700cecF113D9bAFCa3f2409BFf4d24", "1"], - "treeIndex": 703 + "treeIndex": 770 }, { "value": ["0x995995c6FE5559ec36292F2e730618dF19f8c5A9", "1"], - "treeIndex": 886 + "treeIndex": 968 }, { "value": ["0xBCa32127AccBeb924490780B82080c54ee15AaC0", "1"], - "treeIndex": 961 + "treeIndex": 1050 }, { "value": ["0xf605eEE0Ec810eA5084f9E6B6E3994F1293F2540", "1"], - "treeIndex": 741 + "treeIndex": 812 }, { "value": ["0x014682decc5226cdaa86b9108906fbf56f533d37", "1"], - "treeIndex": 920 + "treeIndex": 1003 }, { "value": ["0x1BfEf10693Dd39A78afD9C90aD9b16A779C4E538", "1"], - "treeIndex": 646 + "treeIndex": 705 }, { "value": ["0xcfb9a538a87c107f579fbbdca184c4e7831fd506", "1"], - "treeIndex": 755 + "treeIndex": 828 }, { "value": ["0xe81b6cBB6ED71C731e16E132b92F117C96F072D2", "1"], - "treeIndex": 1065 + "treeIndex": 1167 }, { "value": ["0x52901c7a466D769Db350a3714d9A8CE1CbBf27Cb", "1"], - "treeIndex": 815 + "treeIndex": 892 }, { "value": ["0x198c34Ab14bBc8312E5A35f6A3f95B5687370B7a", "1"], - "treeIndex": 929 + "treeIndex": 1013 }, { "value": ["0x281e3d092ece1667141dc6f4f45ce0f72fc81b3c", "1"], - "treeIndex": 1057 + "treeIndex": 1158 }, { "value": ["0x7138483eb4EF5952D53A258F18fd88a6abAd775d", "1"], - "treeIndex": 1176 + "treeIndex": 1285 }, { "value": ["0x1a67dce1adF3f4c6a13c7d75447b5D04840E0Fa5", "1"], - "treeIndex": 903 + "treeIndex": 986 }, { "value": ["0x24Bea75f0423eDfc9dc780804b9c9A2FB787c85c", "1"], - "treeIndex": 996 + "treeIndex": 1089 }, { "value": ["0x8821612d27a1C6A958a9D6b131BFa8Dd1CA4fc34", "1"], - "treeIndex": 1014 + "treeIndex": 1108 }, { "value": ["0x1fc9efDE651191f61711127ae1f427656105304A", "1"], - "treeIndex": 1005 + "treeIndex": 1099 }, { "value": ["0xc196829c7Ce846b82b40eAa8b5bb31e8D6Dde224", "1"], - "treeIndex": 1046 + "treeIndex": 1146 }, { "value": ["0xb37f40e20E8Db2818ecee0ecDbD48Ef6c88794F0", "1"], - "treeIndex": 906 + "treeIndex": 989 }, { "value": ["0x339a4bF2969ff548AfBdeFd8Fb21aADE69bc97e0", "1"], - "treeIndex": 1074 + "treeIndex": 1177 }, { "value": ["0x69AbA62e098D8215d1e662b57eEC4CC6059DEA73", "1"], - "treeIndex": 1007 + "treeIndex": 1101 }, { "value": ["0x111bB5a704305Da4D3E980d6211badb1Fc064012", "1"], - "treeIndex": 986 + "treeIndex": 1078 }, { "value": ["0xBAcB35A7f1E19b3E4A40d6b333900839a9447594", "1"], - "treeIndex": 973 + "treeIndex": 1062 }, { "value": ["0x66d67e220c61df5836da18d55f4f595ac7514792", "1"], - "treeIndex": 697 + "treeIndex": 763 }, { "value": ["0x08C08EDC97fCA5d1BAdeDE6e2776A6Bba58f427f", "1"], - "treeIndex": 893 + "treeIndex": 975 }, { "value": ["0xF82b8318fbE5048ecc4a6F3FA601ce0079671933", "1"], - "treeIndex": 1194 + "treeIndex": 1305 }, { "value": ["0xb911960B52FaEf62e9b10dE3B8efFb8e3C5E5D53", "1"], - "treeIndex": 1156 + "treeIndex": 1262 }, { "value": ["0x341e1B44c08AD9309Ea3F582940A15961357Dc80", "1"], - "treeIndex": 1003 + "treeIndex": 1097 }, { "value": ["0x5730dad2a5f35683ce208ba923631d3a99ac9720", "1"], - "treeIndex": 772 + "treeIndex": 846 }, { "value": ["0x0baB49313f18F2869Bf89b89C7Dd536efeBFd85B", "1"], - "treeIndex": 802 + "treeIndex": 878 }, { "value": ["0x9128c2390659a1b8248f1cb7880ea4b80b197bdb", "1"], - "treeIndex": 800 + "treeIndex": 876 }, { "value": ["0xd848670974109D0122fd2eC492C3783F2ABc157D", "1"], - "treeIndex": 1123 + "treeIndex": 1229 }, { "value": ["0x517A4551c6B2E906DEdC2AD9Da11B9888FDAe4ba", "1"], - "treeIndex": 1079 + "treeIndex": 1183 }, { "value": ["0x65D8EbAA463bA8774C3a39ed4E87218A7532EB04", "1"], - "treeIndex": 719 + "treeIndex": 788 }, { "value": ["0x7494Acaf0a5957281Bbf6D6ae4F97e3FAfce8F92", "1"], - "treeIndex": 1047 + "treeIndex": 1147 }, { "value": ["0x882A4163961D707EfDD75B54dACA7Bf93288C001", "1"], - "treeIndex": 1195 + "treeIndex": 1306 }, { "value": ["0xBe701BE8123D9AAd7206c04D6408985DA1271223", "1"], - "treeIndex": 1187 + "treeIndex": 1298 }, { "value": ["0x20f86bCC7158d26daBFbCB4D2aD31623CDcB053c", "1"], - "treeIndex": 1103 + "treeIndex": 1208 }, { "value": ["0x264DaB3DFC4e6d425AD1DE5085eB807DdBa51Adb", "1"], - "treeIndex": 1155 + "treeIndex": 1261 }, { "value": ["0xa6D4FA2682B60b8f2eE12937ec70ac26e722D3f3", "1"], - "treeIndex": 949 + "treeIndex": 1038 }, { "value": ["0x0fFE1E2FE7BE75Ce9312AD20538eE2D92720d00D", "1"], - "treeIndex": 911 + "treeIndex": 994 }, { "value": ["0x5d20384C0BfE0BF2081aC51733871f7bF9123E34", "1"], - "treeIndex": 1059 + "treeIndex": 1161 }, { "value": ["0x485f09Ef9fB22a1CAF961Fc5405BD5B2e28ef6A3", "1"], - "treeIndex": 696 + "treeIndex": 762 }, { "value": ["0x7D0777892bb92E40DbDA17742ce0ddd5c1f657c0", "1"], - "treeIndex": 762 + "treeIndex": 835 }, { "value": ["0xC29aeBfebF30cBA49EDaf6CC16611b1fEfB95Cb3", "1"], - "treeIndex": 1022 + "treeIndex": 1116 }, { "value": ["0xEcb9EaC7D2B1ff58D2629467CabEcc8A81EE2531", "1"], - "treeIndex": 1018 + "treeIndex": 1112 }, { "value": ["0x14bE0fcB885A9aA367832406EA6759Db5223502F", "1"], - "treeIndex": 680 + "treeIndex": 743 }, { "value": ["0xc7eD41223d0468D814eFC8424F85D706f9d19d2D", "1"], - "treeIndex": 990 + "treeIndex": 1083 }, { "value": ["0xD685Da88Eab2FD3055ac03CD1984D8307Bb997cF", "1"], - "treeIndex": 1199 + "treeIndex": 1310 }, { "value": ["0xFde0Cea93881bC1cE9F0e4f44b79C60b76095316", "1"], - "treeIndex": 808 + "treeIndex": 885 }, { "value": ["0xf6144e1FAFfcccF7060EbA3856394eB2FcA84adc", "1"], - "treeIndex": 1118 + "treeIndex": 1223 }, { "value": ["0x870928863E80eB02e3060dffe05533dEa0a5d8F9", "1"], - "treeIndex": 883 + "treeIndex": 965 }, { "value": ["0xc7170C41CeaEdE926801ae60160777954b5c6836", "1"], - "treeIndex": 824 + "treeIndex": 901 }, { "value": ["0x8921F59Bab0052dEaeE29CCD4D9Ab808ebe499aE", "1"], - "treeIndex": 623 + "treeIndex": 681 }, { "value": ["0x7F2a4c5cce3a5ca00aEa9E81b8e156Ae08Fe3118", "1"], - "treeIndex": 930 + "treeIndex": 1015 }, { "value": ["0xAc43F908718C7bf08eca3490245dcae0aE3d34e8", "1"], - "treeIndex": 1197 + "treeIndex": 1308 }, { "value": ["0x11F83D90aF5b5E3a0740731D7926Ad27803fe220", "1"], - "treeIndex": 768 + "treeIndex": 842 }, { "value": ["0x0C6D7f0beF79fED15a949501b2e6CbE6E9B515A8", "1"], - "treeIndex": 710 + "treeIndex": 777 }, { "value": ["0x587080976e19355a4a57fe306cfe7688573ba8ec", "1"], - "treeIndex": 786 + "treeIndex": 862 }, { "value": ["0x7626a3cbc934fcf8fc957788c6482e3683868254", "1"], - "treeIndex": 1128 + "treeIndex": 1233 }, { "value": ["0xC47AC2f3D5F0bC244e48B7626B1c235f4FDBfE06", "1"], - "treeIndex": 1070 + "treeIndex": 1173 }, { "value": ["0xf9BA8D882B49d7c4bF67FDFC2D8564713E85945b", "1"], - "treeIndex": 1032 + "treeIndex": 1128 }, { "value": ["0xE3976729E8a80E9BEBf3c90ac708A203F4cAD84d", "1"], - "treeIndex": 915 + "treeIndex": 998 }, { "value": ["0x4e9f38742351f19b41603963231f015c2501a5a3", "1"], - "treeIndex": 959 + "treeIndex": 1048 }, { "value": ["0x02A8c10f6C39A63Cae8c0e984BAaC0427914481A", "1"], - "treeIndex": 1045 + "treeIndex": 1144 }, { "value": ["0xB53D86CAE1dE6c8CDaDD4A59559317C4c98657E0", "1"], - "treeIndex": 1043 + "treeIndex": 1142 }, { "value": ["0x2A184B7aECaBD4d92a26CF4d989558559661c306", "1"], - "treeIndex": 821 + "treeIndex": 898 }, { "value": ["0x73254cC8f2fe472ef81B53A92dEd4293F63D5AB4", "1"], - "treeIndex": 659 + "treeIndex": 720 }, { "value": ["0x447024B90D9cdcd3A33C05b4512490a823e85ebf", "1"], - "treeIndex": 1015 + "treeIndex": 1109 }, { "value": ["0x5AE1980Fffd8444be97e5Aa4b46b49D11be2b7B6", "1"], - "treeIndex": 948 + "treeIndex": 1036 }, { "value": ["0xD3366317a4Fe27bA0100B48659e05969811bD2dB", "1"], - "treeIndex": 806 + "treeIndex": 883 }, { "value": ["0x7F33aea3786D88AEE80701AF7e1B7d6F074d3C60", "1"], - "treeIndex": 1106 + "treeIndex": 1211 }, { "value": ["0x7989cf8798581BA46d4D0572405A0Adb1a2d0999", "1"], - "treeIndex": 685 + "treeIndex": 749 }, { "value": ["0x9ea4b029404D4B957984b568Bbc07b4a3b98F2b3", "1"], - "treeIndex": 1093 + "treeIndex": 1198 }, { "value": ["0xCEe7540737e33763DC9F929714C48d60c08348b7", "1"], - "treeIndex": 832 + "treeIndex": 910 }, { "value": ["0xe308023816491913f15e3502C8073098687a2417", "1"], - "treeIndex": 837 + "treeIndex": 916 }, { "value": ["0x25bB6CA37385DF923Dc1998D9E944ddD9e259C98", "1"], - "treeIndex": 654 + "treeIndex": 714 }, { "value": ["0x9d4928eB2580077017484B673ceb2c5E9fCB4549", "1"], - "treeIndex": 888 + "treeIndex": 970 }, { "value": ["0x892bb2CDA62B23a728102139aA27Dd9f09D99197", "1"], - "treeIndex": 954 + "treeIndex": 1043 }, { "value": ["0x7425fdd976742c1D64F897Fb10c9bA5711E4839d", "1"], - "treeIndex": 742 + "treeIndex": 813 }, { "value": ["0x3d25156E75208710117D37Cd448Fb5bff3614E62", "1"], - "treeIndex": 897 + "treeIndex": 980 }, { "value": ["0x991f45376EC0c30679f31deedfAB965be61eE0aF", "1"], - "treeIndex": 1137 + "treeIndex": 1242 }, { "value": ["0x248ae56b53B86d4F1C0F3ecEebb0818E886b9e4d", "1"], - "treeIndex": 1122 + "treeIndex": 1228 }, { "value": ["0x5CA4E238464C839142DE88434544af58a63c3FE2", "1"], - "treeIndex": 1063 + "treeIndex": 1165 }, { "value": ["0x87b5602E9f7e932Fa1F3c2982e9eC1681d6675cA", "1"], - "treeIndex": 1085 + "treeIndex": 1190 }, { "value": ["0x1464bBf08282A9FE94EE0136178FAA04F283ACB8", "1"], - "treeIndex": 676 + "treeIndex": 738 }, { "value": ["0xBdc5434D53E17b596cb7FaDB1f4edA76f2a0ba0C", "1"], - "treeIndex": 631 + "treeIndex": 689 }, { "value": ["0xfaF013dC4e217241Fc0719eCE977EAD89A8AFDC2", "1"], - "treeIndex": 861 + "treeIndex": 941 }, { "value": ["0xD77D0aA1f1Ab7042eacB6b1e3d48f7607fDdc446", "1"], - "treeIndex": 803 + "treeIndex": 880 }, { "value": ["0x1742C82B2C7c060E5cACd2389F31936C8ab4faED", "1"], - "treeIndex": 1212 + "treeIndex": 1324 }, { "value": ["0x5B317bE1872A5FA11b1ebBC07065516E4FAaef03", "1"], - "treeIndex": 1147 + "treeIndex": 1253 }, { "value": ["0x4Bc3DcB08e12eF4E9c38A9c01aCe15F641b05886", "1"], - "treeIndex": 635 + "treeIndex": 693 }, { "value": ["0xe41e23bBc314B153908cE6b09824d3e3eFE9A2e3", "1"], - "treeIndex": 951 + "treeIndex": 1040 }, { "value": ["0xA5A8cc6642d3075262196467C9CB676e9f3683C6", "1"], - "treeIndex": 618 + "treeIndex": 675 }, { "value": ["0xe2f6D1ceE169B8B90494e551DDaAf8A3d0C4Ccb6", "1"], - "treeIndex": 1104 + "treeIndex": 1209 }, { "value": ["0xCBC3A31a951F4c91D3B5792c2Adc57641cFf633c", "1"], - "treeIndex": 764 + "treeIndex": 837 }, { "value": ["0x072F145971fa65217ABF340A201b795Bf99Fa665", "1"], - "treeIndex": 782 + "treeIndex": 857 }, { "value": ["0x6F0BF88779e02959Fc80d1e73A80DC832EEC4688", "1"], - "treeIndex": 877 + "treeIndex": 959 }, { "value": ["0x48985340229bfCFab86b0C5De1F5Eed91cc551A1", "1"], - "treeIndex": 1030 + "treeIndex": 1126 }, { "value": ["0xc64550ef5f1781e8c497a548e53b44589603E78D", "1"], - "treeIndex": 1028 + "treeIndex": 1124 }, { "value": ["0xd9fd327df84bb551e3f359f23c405e7f79cc4c34", "1"], - "treeIndex": 740 + "treeIndex": 811 }, { "value": ["0x8e1ec2d3b0c006d234190a212704b6e85d623efa", "1"], - "treeIndex": 722 + "treeIndex": 791 }, { "value": ["0x0183349f7d059D53d69033652EBe921d8B05D7E1", "1"], - "treeIndex": 684 + "treeIndex": 748 }, { "value": ["0x7D73bc3fB04F20d58DE526105684BD9D7D1A0BDf", "1"], - "treeIndex": 1166 + "treeIndex": 1274 }, { "value": ["0xCf1ed754F6853b0840b8575c174dbdCd51909D0a", "1"], - "treeIndex": 753 + "treeIndex": 824 }, { "value": ["0x4a0834a733638fef294ea2bb241d3888cf715cfc", "1"], - "treeIndex": 1214 + "treeIndex": 1326 }, { "value": ["0xEA2d1fF3e5F524B080cc609226b019F091113554", "1"], - "treeIndex": 790 + "treeIndex": 866 }, { "value": ["0x86Baf5f5Ee5696BCc71aBb93751d6e3D46Ea47f4", "1"], - "treeIndex": 812 + "treeIndex": 889 }, { "value": ["0x1E56aAaD2661540bEB5dcc92b4BeDaD8975D80C0", "1"], - "treeIndex": 687 + "treeIndex": 751 }, { "value": ["0xf5de2dde6a9694ba171d3760b448e89e7050dfa9", "1"], - "treeIndex": 1100 + "treeIndex": 1205 }, { "value": ["0x86727defBEd7bCFb2F93bAb3d8aD23624e2B0F22", "1"], - "treeIndex": 1024 + "treeIndex": 1118 }, { "value": ["0xD990618a8bB5a80AB37247f8615e393FA23648f4", "1"], - "treeIndex": 1053 + "treeIndex": 1154 }, { "value": ["0x3c777f983158e6ad5ef7a937508c08f8a712c251", "1"], - "treeIndex": 1054 + "treeIndex": 1155 }, { "value": ["0xb07c3607eA7e0bc8f591331D19Cf08804c7b82Df", "1"], - "treeIndex": 1198 + "treeIndex": 1309 }, { "value": ["0x19b58151c2a9edb6164ddf69fa96f9b106f47df4", "1"], - "treeIndex": 656 + "treeIndex": 717 }, { "value": ["0x1672Bc8d5E342048A4B3cd2a5038069414Fa95b3", "1"], - "treeIndex": 904 + "treeIndex": 987 }, { "value": ["0xB6acA8CAa4147ad88FCD05f5F15A2083e192C4ab", "1"], - "treeIndex": 1094 + "treeIndex": 1199 }, { "value": ["0x3ba9ba5b405ccfb85c7c16e929a4f81aec65f318", "1"], - "treeIndex": 1127 + "treeIndex": 1232 }, { "value": ["0xaF28D9A215884b5E0F7c68709877FC205E335BD9", "1"], - "treeIndex": 905 + "treeIndex": 988 }, { "value": ["0x3f71EaccdFdFbEa79c3f357dfb0Db53aaAE3f712", "1"], - "treeIndex": 705 + "treeIndex": 772 }, { "value": ["0x00700406274a017375C465D27F24CCBD51eA3A53", "1"], - "treeIndex": 1115 + "treeIndex": 1220 }, { "value": ["0xfDE0F525D7d029E646F011b87FD0a105f80fD347", "1"], - "treeIndex": 622 + "treeIndex": 680 }, { "value": ["0xA6B6f3f5A880F09aC536af2DFF08D93534ff7930", "1"], - "treeIndex": 686 + "treeIndex": 750 }, { "value": ["0x801D678688C0B5A3eCAa4b06bE2b56ff57E309A6", "1"], - "treeIndex": 1105 + "treeIndex": 1210 }, { "value": ["0x85132deace772ec40b2326da69cce771853cc2f8", "1"], - "treeIndex": 660 + "treeIndex": 721 }, { "value": ["0xd7D26c106285ACA2419F4f9CCFdafa3C765C1c2d", "1"], - "treeIndex": 1158 + "treeIndex": 1266 }, { "value": ["0xe90286618AB09067354139f478eFc0FC874da50e", "1"], - "treeIndex": 810 + "treeIndex": 887 }, { "value": ["0x9D5dC516331Dee44d16a0EDcE1A8206937163D2B", "1"], - "treeIndex": 776 + "treeIndex": 851 }, { "value": ["0x478eDd1F3bd4559B407B8528e1D2166e9627A891", "1"], - "treeIndex": 1066 + "treeIndex": 1168 }, { "value": ["0x74fa7F91Ea3B290Ca00B049F0D048a816B3443cC", "1"], - "treeIndex": 1019 + "treeIndex": 1113 }, { "value": ["0x9505e4f134548dc577edab5aab870ebb8fd2ab26", "1"], - "treeIndex": 667 + "treeIndex": 729 }, { "value": ["0x3FE46d8b26d8084ABCc723FA12b91C13aef21190", "1"], - "treeIndex": 1171 + "treeIndex": 1279 }, { "value": ["0xd4c210871fd8912bdc080b47ef644849f6163d11", "1"], - "treeIndex": 1006 + "treeIndex": 1100 }, { "value": ["0x05407A60F9D4556c1c52422A77d6c6Bd8A9c6AcB", "1"], - "treeIndex": 867 + "treeIndex": 947 }, { "value": ["0x0a4896a6abb9e603fda98ac35e3bc34297a2f964", "1"], - "treeIndex": 788 + "treeIndex": 864 }, { "value": ["0xb59A1f04AfF6fCA59729Ed8f4f534591382c43eb", "1"], - "treeIndex": 1058 + "treeIndex": 1160 }, { "value": ["0xbAa3295A3351DE503c13E6d6cF00396eBE1DD5d9", "1"], - "treeIndex": 962 + "treeIndex": 1051 }, { "value": ["0xb180a132d8c64c88501f2946ae93b311052e067e", "1"], - "treeIndex": 1082 + "treeIndex": 1187 }, { "value": ["0x43ef7d83943448f3c2dd9cc325b0a949f19a3e4b", "1"], - "treeIndex": 629 + "treeIndex": 687 }, { "value": ["0x1E922DB639CA197014cbd9a815F3D706Bf962eAb", "1"], - "treeIndex": 1048 + "treeIndex": 1149 }, { "value": ["0x7412b20a5B15948954a3de1CaEdD5806AAf9aDA7", "1"], - "treeIndex": 1130 + "treeIndex": 1235 }, { "value": ["0x4d844c3B736916808E1Eff456e4949E376963a28", "1"], - "treeIndex": 913 + "treeIndex": 996 }, { "value": ["0x133dCbdE39418Cff99d10dC3a1515878aBfe4A44", "1"], - "treeIndex": 689 + "treeIndex": 753 }, { "value": ["0x593a10fc2bc453fee3adbbe989e8be43967afde4", "1"], - "treeIndex": 956 + "treeIndex": 1045 }, { "value": ["0x799179D0Ed9b2715BdF377Ca67Dc11706a23f03a", "1"], - "treeIndex": 1206 + "treeIndex": 1317 }, { "value": ["0xAE3f01c727a685bB7c03722fDA4a3ef306B1C0b4", "1"], - "treeIndex": 1148 + "treeIndex": 1254 }, { "value": ["0x6Eee3b6b9DB311D9F1435Ae28A507a940398b75C", "1"], - "treeIndex": 1101 + "treeIndex": 1206 }, { "value": ["0x24D811AC39b0fD7037e1D501e5f0605CE37B2bb1", "1"], - "treeIndex": 865 + "treeIndex": 945 }, { "value": ["0xaCDEcf79986Db9d509e4F3FF6D55EBa2f4acBcb0", "1"], - "treeIndex": 984 + "treeIndex": 1076 }, { "value": ["0xfB6E3BadA09A320676cE37056A6FD1390a19Fc9c", "1"], - "treeIndex": 946 + "treeIndex": 1034 }, { "value": ["0xb1e745e9a67be8ceee1864558e7608021a5ba4e0", "1"], - "treeIndex": 835 + "treeIndex": 914 }, { "value": ["0x3e5e34DEAFC39FF2D08a523C3fCC47065dc784CB", "1"], - "treeIndex": 1111 + "treeIndex": 1216 }, { "value": ["0xd861bC853dDFFCF938cA385caeae4131b16B103a", "1"], - "treeIndex": 859 + "treeIndex": 939 }, { "value": ["0x508D0ed6273F83C1D442C89C8935C4c11Ad4f6d9", "1"], - "treeIndex": 611 + "treeIndex": 668 }, { "value": ["0x577781dDaeC287623273c38f459840b279cF323e", "1"], - "treeIndex": 785 + "treeIndex": 861 }, { "value": ["0x0eF696B2Da7e7c6A3113681ce57344B66BBCF559", "1"], - "treeIndex": 1125 + "treeIndex": 1231 }, { "value": ["0xec2b42a2b501e9b8f639d2b4e17f0e5166035155", "1"], - "treeIndex": 661 + "treeIndex": 722 }, { "value": ["0x408983424Bf7B5bE6e12bb731a26F16C8Bd63eBa", "1"], - "treeIndex": 892 + "treeIndex": 974 }, { "value": ["0x583C21200cb1306280CfD38e56786083D956Cb3D", "1"], - "treeIndex": 780 + "treeIndex": 855 }, { "value": ["0x97675d5d3ffd22401b78ba4c0a34faadd2039250", "1"], - "treeIndex": 834 + "treeIndex": 912 }, { "value": ["0x91c3e2E1A43638aD626C4971F343c457E643c9c3", "1"], - "treeIndex": 975 + "treeIndex": 1065 }, { "value": ["0xFFdA83BFD8b8c1EdB0A8A89B255cfe87D01a1d92", "1"], - "treeIndex": 1142 + "treeIndex": 1247 }, { "value": ["0x8b92183A022D4dF72B2834e33c4FB7bd0462CD3E", "1"], - "treeIndex": 748 + "treeIndex": 819 }, { "value": ["0xfa2336eCA18b9BC384144Ad7f29E2137EE0564D1", "1"], - "treeIndex": 679 + "treeIndex": 741 }, { "value": ["0xCB53a818042Db647cb01672751B0E4efCa29cF55", "1"], - "treeIndex": 1177 + "treeIndex": 1286 }, { "value": ["0x054becf10c79afa4e60f75b187837be9fb83867d", "1"], - "treeIndex": 727 + "treeIndex": 796 }, { "value": ["0xf8926A177273202755F9Fa930c96285e612375AC", "1"], - "treeIndex": 912 + "treeIndex": 995 }, { "value": ["0xAbD8Cee5a93265fc7D1F9e45f0169294d01B8802", "1"], - "treeIndex": 851 + "treeIndex": 931 }, { "value": ["0x481b1E34fc679b94E78571dE1369D8EBE4bacDBF", "1"], - "treeIndex": 841 + "treeIndex": 920 }, { "value": ["0x71adD64adBB965Bafd01437295968502eB61145e", "1"], - "treeIndex": 1029 + "treeIndex": 1125 }, { "value": ["0x3D1e10eeC9256f832a46F3f8AdaC60c7a80828B6", "1"], - "treeIndex": 875 + "treeIndex": 957 }, { "value": ["0xad9518b0360f417cd60c172ffa5d7b9a1d6d1ebc", "1"], - "treeIndex": 643 + "treeIndex": 702 }, { "value": ["0x64be8D7B2B598cd2Bb09275bC943C3f663e23fb7", "1"], - "treeIndex": 944 + "treeIndex": 1032 }, { "value": ["0x8FC58267E4b4a4f93e3BE17934db63337676b01d", "1"], - "treeIndex": 729 + "treeIndex": 799 }, { "value": ["0xEc8EDfAe340278B79a9a7Ba58C8f97b36f3739Ef", "1"], - "treeIndex": 715 + "treeIndex": 783 }, { "value": ["0xb6650c5675fdef1498d3965973cd9fe598baf843", "1"], - "treeIndex": 991 + "treeIndex": 1084 }, { "value": ["0x399b6775b25F98fCb0295a42DE85107514E36697", "1"], - "treeIndex": 822 + "treeIndex": 899 }, { "value": ["0x955d73eD63db714829CAFe740123D035854f8ff0", "1"], - "treeIndex": 759 + "treeIndex": 832 }, { "value": ["0xbb3Fa251c16f9d7BB03aD3896547A93391C6F1CF", "1"], - "treeIndex": 862 + "treeIndex": 942 }, { "value": ["0x98b7F918738bE89D2B91cec0d6Ed695888aaB458", "1"], - "treeIndex": 1211 + "treeIndex": 1322 }, { "value": ["0x8be4491ced884d5c6b1667bd4e20b975e079a469", "1"], - "treeIndex": 1135 + "treeIndex": 1240 }, { "value": ["0xd8C860D789Ec1c6aE9631B680E6555F25Bc28331", "1"], - "treeIndex": 974 + "treeIndex": 1063 }, { "value": ["0xD24aB99f90532BC217a12bCD644B96517de3B842", "1"], - "treeIndex": 1188 + "treeIndex": 1299 }, { "value": ["0x07B4cfa4e6d65F7A689390951a4fEA8A6583de92", "1"], - "treeIndex": 839 + "treeIndex": 918 }, { "value": ["0xA6Be47CAfFD637a13FB723C936e6AF495F0c9945", "1"], - "treeIndex": 997 + "treeIndex": 1091 }, { "value": ["0x88a45767F348BC66D9e83ebf8A8ACec7d7e3d24e", "1"], - "treeIndex": 642 + "treeIndex": 701 }, { "value": ["0x43cb33e6f2bada9d359e31d42b7da5ee848100a9", "1"], - "treeIndex": 718 + "treeIndex": 787 }, { "value": ["0xd37f5756D70d826d47DfF516B1021Cc52BeA66B5", "1"], - "treeIndex": 967 + "treeIndex": 1056 }, { "value": ["0xcf991e3f8414a8949967d51550683852d47f88f2", "1"], - "treeIndex": 1068 + "treeIndex": 1171 }, { "value": ["0xB32c7a9D7c57d196628074549767F73280Fa0f23", "1"], - "treeIndex": 987 + "treeIndex": 1079 }, { "value": ["0xd957fcdb8fd06866aa4e2e38c128be655d5eddc0", "1"], - "treeIndex": 1091 + "treeIndex": 1196 }, { "value": ["0x0aa5c17737fa41ec5078032e353497754c520fe0", "1"], - "treeIndex": 917 + "treeIndex": 1000 }, { "value": ["0xc60188ebfcbfc4f0771ad9c2ebc02ed5c58f1aed", "1"], - "treeIndex": 737 + "treeIndex": 808 }, { "value": ["0xa47dcc127bd2487b01477d8e381dced5de5e5033", "1"], - "treeIndex": 1039 + "treeIndex": 1137 }, { "value": ["0x48707199060302639ad0d4bbe9225954326bd007", "1"], - "treeIndex": 752 + "treeIndex": 823 }, { "value": ["0x01b86AEEbCD1Ff94aC1195cFc8FD9e39dB24db45", "1"], - "treeIndex": 1164 + "treeIndex": 1272 }, { "value": ["0xefB1b61DAc569aC6E8A7B860967978976DB4561d", "1"], - "treeIndex": 1044 + "treeIndex": 1143 }, { "value": ["0x63b3b70e0162e19D5239cb1864E2E4eE6C60b61d", "1"], - "treeIndex": 757 + "treeIndex": 830 }, { "value": ["0x8cd11d507defb717a596e381be860ed1331eb516", "1"], - "treeIndex": 1092 + "treeIndex": 1197 }, { "value": ["0x407e138a1c800c469e207b811a2964a3f5cf8853", "1"], - "treeIndex": 955 + "treeIndex": 1044 }, { "value": ["0x658472DA56EB30F30EA001C6896DD5BF3CF23b19", "1"], - "treeIndex": 1067 + "treeIndex": 1170 }, { "value": ["0xa6c885ba8b5b5e69cBC38E8fa5cbceE569777A79", "1"], - "treeIndex": 879 + "treeIndex": 961 }, { "value": ["0xad80ae3a70189ef34bcd8cff931974477d16fb6e", "1"], - "treeIndex": 1209 + "treeIndex": 1320 }, { "value": ["0x68D1BaC05bf08E8c6db979f4b6024cBcB188DE93", "1"], - "treeIndex": 963 + "treeIndex": 1052 }, { "value": ["0x82b4037eB07B81136B0acf8Dd72866C58a60A893", "1"], - "treeIndex": 1141 + "treeIndex": 1246 }, { "value": ["0x334b7950B87166F67d72Ff93e6a9F577B3963938", "1"], - "treeIndex": 1077 + "treeIndex": 1180 }, { "value": ["0x862d3e1185754f98d64912c129f380209e4b14d6", "1"], - "treeIndex": 1012 + "treeIndex": 1106 }, { "value": ["0x42F4dc5707AC046e0E1c606e56d262D7D9A56A57", "1"], - "treeIndex": 1017 + "treeIndex": 1111 }, { "value": ["0x1951164a1cc60BbBe5996922997255A56761CA14", "1"], - "treeIndex": 900 + "treeIndex": 983 }, { "value": ["0x74799311F1BDd1dB053440D91aed281726b76797", "1"], - "treeIndex": 880 + "treeIndex": 962 }, { "value": ["0x68599057d850c6f99b05fe3b2fb6f4900e9596eb", "1"], - "treeIndex": 1011 + "treeIndex": 1105 }, { "value": ["0x60b4dFD79162664307c5CF697e649513D6428cd2", "1"], - "treeIndex": 1008 + "treeIndex": 1102 }, { "value": ["0x26a79FEacb76f2dCC8305C24Cd007a47b48Fb875", "1"], - "treeIndex": 965 + "treeIndex": 1054 }, { "value": ["0x327cD3aeEa33ccf35689687a20c5dB935aa96C89", "1"], - "treeIndex": 833 + "treeIndex": 911 }, { "value": ["0xa7A7a115a827FDEAbb6c0729409d068bD82401FF", "1"], - "treeIndex": 807 + "treeIndex": 884 }, { "value": ["0xc07d659f3e1c727df7bea64e0ddc0c03f7a9c0fb", "1"], - "treeIndex": 855 + "treeIndex": 935 }, { "value": ["0xb6c2b662e4e9388349e7015f2b9b7a2f878d706c", "1"], - "treeIndex": 1153 + "treeIndex": 1259 }, { "value": ["0x43b0506f6b000327153b055c7e630f67be4096b7", "1"], - "treeIndex": 825 + "treeIndex": 902 }, { "value": ["0x00f884b294766d858db5c7cf70a806820a8d15f0", "1"], - "treeIndex": 607 + "treeIndex": 663 }, { "value": ["0x72A363e15676ec9B2Ba00c2f62dBDb8f1B1bd1B2", "1"], - "treeIndex": 1144 + "treeIndex": 1250 }, { "value": ["0x111222965183438ac14042548e20aE48E443f2f9", "1"], - "treeIndex": 1182 + "treeIndex": 1292 }, { "value": ["0xE65F1CCC3Ba766a1436625A408E2358B7d3eC482", "1"], - "treeIndex": 671 + "treeIndex": 733 }, { "value": ["0xbe137fb6a4872fC2c830A56280de3134872bcdE1", "1"], - "treeIndex": 940 + "treeIndex": 1026 }, { "value": ["0xcc72ffa1f471360dc6964fe6b9e2907d7ca55c28", "1"], - "treeIndex": 1134 + "treeIndex": 1239 }, { "value": ["0xb412262d43118a498e7a884b5ac0fa4bfaf8daaa", "1"], - "treeIndex": 721 + "treeIndex": 790 }, { "value": ["0x5cA3A5c09c556a508940b9bFb08c7DaF4d8bcec1", "1"], - "treeIndex": 871 + "treeIndex": 952 }, { "value": ["0x443ff33b53fda8c55d9d9019bb52509dcc24209b", "1"], - "treeIndex": 658 + "treeIndex": 719 }, { "value": ["0x009B64175634D39B1FE81f97270f516544F04307", "1"], - "treeIndex": 1073 + "treeIndex": 1176 }, { "value": ["0x70619d577548faa0E11c1feDa79Bd4347503715D", "1"], - "treeIndex": 1108 + "treeIndex": 1213 }, { "value": ["0x1a84333ad6371f1dac13dcf5477dccce771c7655", "1"], - "treeIndex": 1036 + "treeIndex": 1132 }, { "value": ["0xD3Bd3A596CeEE552D4e81fa9B6Eb2eAF090d03B7", "1"], - "treeIndex": 608 + "treeIndex": 665 }, { "value": ["0x8a10C1906f1Da22FA37B69A8058dB04dBf403089", "1"], - "treeIndex": 889 + "treeIndex": 971 }, { "value": ["0x72c07C4980bFa0995942d375d9092F1f6876ba00", "1"], - "treeIndex": 1072 + "treeIndex": 1175 }, { "value": ["0x10b490cf79f478ff90a994c7a4105af8d73cbc56", "1"], - "treeIndex": 731 + "treeIndex": 801 }, { "value": ["0x55cbfdfe4f98b759944aee681ce63febc03bd4fa", "1"], - "treeIndex": 1042 + "treeIndex": 1140 }, { "value": ["0x9d5fc106ef22538b3cb7f0428cfa04b9a3083151", "1"], - "treeIndex": 745 + "treeIndex": 816 }, { - "value": ["0x53d75D56a7741F94A40A11C68649Ac1401D3563E", "1"], - "treeIndex": 1119 + "value": ["0x3ede3dD0b09Ea347aa120B9813B0730Dd11e8dFB", "1"], + "treeIndex": 785 }, { "value": ["0x627AE166a9491a2D6327db8058065ff7aaF25a1E", "1"], - "treeIndex": 636 + "treeIndex": 694 }, { "value": ["0x2fa14daad079c26cd5293d6bb3de90ef2c637b2a", "1"], - "treeIndex": 882 + "treeIndex": 964 }, { "value": ["0xfbd035252548d095e2184507a8c4ef8fde37ebcf", "1"], - "treeIndex": 843 + "treeIndex": 922 }, { "value": ["0x946c8b755e0f448a09172a7e985e96935954a221", "1"], - "treeIndex": 1001 + "treeIndex": 1095 }, { "value": ["0x959F5C4Fa5b60Fe1Aa99C1C060657d8abBF9C3Bc", "1"], - "treeIndex": 761 + "treeIndex": 834 }, { "value": ["0x3B27515853608532599DE505F4E79b0EbB5e4B56", "1"], - "treeIndex": 725 + "treeIndex": 794 }, { "value": ["0x14d18d87424b73c1a1d91a2759eab88f44fbe32f", "1"], - "treeIndex": 750 + "treeIndex": 821 }, { "value": ["0x9538d52c3682f807f3cd27e1573bcefa8a0d0884", "1"], - "treeIndex": 820 + "treeIndex": 897 }, { "value": ["0x28d81c0660d627083e430497f299edff5cfabe76", "1"], - "treeIndex": 1152 + "treeIndex": 1258 }, { "value": ["0x24897A16C70da3E438083545eFb795aF49AB1f53", "1"], - "treeIndex": 712 + "treeIndex": 780 }, { "value": ["0xad062b56501042d97d2c26def7aff6b5ff966ee9", "1"], - "treeIndex": 650 + "treeIndex": 709 }, { "value": ["0x1e712E83acc07470FBEd55934de94b5DAAEc97f7", "1"], - "treeIndex": 1071 + "treeIndex": 1174 }, { "value": ["0x2a7ddcf6c76331ff70f0c2b4a7a57ca50bd5cb73", "1"], - "treeIndex": 1116 + "treeIndex": 1221 }, { "value": ["0x77Da9d6B211d6AE719D0fE348743065e5532da0c", "1"], - "treeIndex": 1149 + "treeIndex": 1255 }, { "value": ["0xcbb3fbf562a93006eddc83ae86fb6152968abacc", "1"], - "treeIndex": 928 + "treeIndex": 1012 + }, + { + "value": ["0x3Eb73235225F0a4C8e7612ED3C0eb93f947CFE80", "1"], + "treeIndex": 960 }, { "value": ["0xf34bf8635ce2a93f3cd4021e17ffbbb1a5eedd3e", "1"], - "treeIndex": 1170 + "treeIndex": 1278 }, { "value": ["0xd921b08b862a346463024b4cfa201923593033f0", "1"], - "treeIndex": 1139 + "treeIndex": 1244 }, { "value": ["0x51601cdd21bdfe246da02a2645de145c085b7722", "1"], - "treeIndex": 1040 + "treeIndex": 1138 }, { "value": ["0x1a196188342bd1523fe23d41defc459c09190559", "1"], - "treeIndex": 926 + "treeIndex": 1010 }, { "value": ["0x6c02c390ed91d717e1d1da61e85559f3b6251997", "1"], - "treeIndex": 666 + "treeIndex": 728 }, { "value": ["0x8655290Cb24CbD4dD90d0d8EB77404cf2c300d2f", "1"], - "treeIndex": 1088 + "treeIndex": 1193 }, { "value": ["0xF29942f2C6AD54b53Ad536d9A3201aa9D25355bD", "1"], - "treeIndex": 751 + "treeIndex": 822 }, { "value": ["0x46c940ac083b5637b9a27efa6ec81fa7485300c7", "1"], - "treeIndex": 1110 + "treeIndex": 1215 }, { "value": ["0xfbe30bb0dac58e8a10493f0c04f521c96925c29e", "1"], - "treeIndex": 1050 + "treeIndex": 1151 }, { "value": ["0x4591c0d02cb8b7c70a697e5e9d3df2fdb4316961", "1"], - "treeIndex": 1121 + "treeIndex": 1226 }, { "value": ["0xD513aA3cB6B3Ba62b0E7FF1BB86c7b1A409e9C51", "1"], - "treeIndex": 1175 + "treeIndex": 1284 }, { "value": ["0xaeadc04e3c357de9e49d238d7d5628ee30612da7", "1"], - "treeIndex": 1173 + "treeIndex": 1282 }, { "value": ["0x869276ef1fca605ac1b816796dd41ec4a52ec8c8", "1"], - "treeIndex": 934 + "treeIndex": 1020 }, { "value": ["0xa6ee6741836b87571a907de94ef5bcfa8a2b2fbe", "1"], - "treeIndex": 617 + "treeIndex": 674 }, { "value": ["0xf155f68aaefb6607a893fbb870d95fb161adc7a6", "1"], - "treeIndex": 896 + "treeIndex": 979 }, { "value": ["0xCF3Eb886D2EeF460Cb64525EBed7DaE0840044A6", "1"], - "treeIndex": 1192 + "treeIndex": 1303 }, { "value": ["0x59389cb3f680fe74b801b8452c1d1db9f6d68cd2", "1"], - "treeIndex": 677 + "treeIndex": 739 }, { "value": ["0x7559f5d17dd93df1b8bfaae7b5091380392bbbea", "1"], - "treeIndex": 637 + "treeIndex": 695 }, { "value": ["0x70a1c7d12a0f59ca8bc233d50cdc1b16053c4f14", "1"], - "treeIndex": 836 + "treeIndex": 915 }, { "value": ["0xf9aa47a4647398a45a41ced6cac4c8fc8c0f3d9b", "1"], - "treeIndex": 1124 + "treeIndex": 1230 }, { "value": ["0x2c3e1f5e6d4f9072216991b2a684df1ee93033ce", "1"], - "treeIndex": 982 + "treeIndex": 1074 }, { "value": ["0xF08c6cbC8bcd68D5A6Ec8498f911d45a9C8035F9", "1"], - "treeIndex": 713 + "treeIndex": 781 }, { "value": ["0x8A1572d4edD4D28dBe9B0dFA22641Dd26Bb60B96", "1"], - "treeIndex": 970 + "treeIndex": 1059 }, { "value": ["0x425400d9642aeac4e8b88e0447552ffdc6fad752", "1"], - "treeIndex": 826 + "treeIndex": 903 }, { "value": ["0x6c50686cb8024C23F76d723b533110580DC629eE", "1"], - "treeIndex": 767 + "treeIndex": 841 }, { "value": ["0xBD73cF5baf12F120Ee3f6C4ad82df9a12649e578", "1"], - "treeIndex": 1037 + "treeIndex": 1133 }, { "value": ["0x93BBF2b1Ffe750FAD9a83384e6C4fBcA01401B03", "1"], - "treeIndex": 1109 + "treeIndex": 1214 }, { "value": ["0xE712D64e2d9C5280d6cB319B20654859cC06Bb9B", "1"], - "treeIndex": 809 + "treeIndex": 886 }, { "value": ["0x0f8D1999000Fb5093008344B2D73407c9fB71337", "1"], - "treeIndex": 1099 + "treeIndex": 1204 }, { "value": ["0xB80970A96c6B49e1678Aa147Eb83c1aA0a3818b8", "1"], - "treeIndex": 690 + "treeIndex": 754 }, { "value": ["0x8f4EA9ad88DB773e4a086884EBBf0Cf813915D38", "1"], - "treeIndex": 1080 + "treeIndex": 1184 }, { "value": ["0x7b63B3037D37751bb25c067552f44b25Ff453702", "1"], - "treeIndex": 1190 + "treeIndex": 1301 }, { "value": ["0xa9c178D179C2EeD40e60C425d76e354973B3DbBd", "1"], - "treeIndex": 728 + "treeIndex": 798 }, { "value": ["0xb16f17769b03AC0997c100A344E6d81d3Bc1f0C0", "1"], - "treeIndex": 612 + "treeIndex": 669 }, { "value": ["0xE37FdAfE569461fe4998598838b06597D9ADeC21", "1"], - "treeIndex": 813 + "treeIndex": 890 }, { "value": ["0xc8d81C03F98a4656Fe7f3bF32B9A9ee0BD6c8903", "1"], - "treeIndex": 881 + "treeIndex": 963 }, { "value": ["0xE5F87e969D10e2d3Bc497671BAc5729fE9Ab1521", "1"], - "treeIndex": 739 + "treeIndex": 810 }, { "value": ["0x9B61a616d18562D7B667Ed83c8Ad5d9e1B00080E", "1"], - "treeIndex": 621 + "treeIndex": 679 }, { "value": ["0x17ED40E78492538e1A0101CF9d60105b7629C414", "1"], - "treeIndex": 1161 + "treeIndex": 1269 }, { "value": ["0xf9305317843951711c6579C2997C5d8Dc542e6B5", "1"], - "treeIndex": 639 + "treeIndex": 697 }, { "value": ["0xe0b11855eb530c36a323f92e93c299ad93922d0f", "1"], - "treeIndex": 941 + "treeIndex": 1027 }, { "value": ["0x48cc3c16d414f6eb616e78fe0354f1baeb254de9", "1"], - "treeIndex": 985 + "treeIndex": 1077 }, { "value": ["0x6b23333bc26215e88a87489e1021e9f62f5399d1", "1"], - "treeIndex": 610 + "treeIndex": 667 }, { "value": ["0xd777edffaf1eb956159419f087b6666b09be2bac", "1"], - "treeIndex": 868 + "treeIndex": 949 }, { "value": ["0x5bc0cc50aa58a851a7f5ecfb32f0d9cd495cfbf6", "1"], - "treeIndex": 758 + "treeIndex": 831 }, { "value": ["0x7b75bc70b928472856047fdef0d08d5b5816aefd", "1"], - "treeIndex": 669 + "treeIndex": 731 }, { "value": ["0x2c3474bfe64cd9748be69d24c30cc91639265e68", "1"], - "treeIndex": 864 + "treeIndex": 944 }, { "value": ["0xfEBded7dF0b739564Dcb218B4e673f0918528B8d", "1"], - "treeIndex": 791 + "treeIndex": 867 }, { "value": ["0xF08576f40D74A3D0A6f7709a1e3f603DEAc39f05", "1"], - "treeIndex": 943 + "treeIndex": 1030 }, { "value": ["0x97cb91642902ef48709bEcA1236813495FceEB71", "1"], - "treeIndex": 829 + "treeIndex": 906 }, { "value": ["0x26f128ca082cc1C28670000E6274f275723C8f1e", "1"], - "treeIndex": 1167 + "treeIndex": 1275 }, { "value": ["0x381B0A70687c60bffeEa61d2FE1B9B340C506F71", "1"], - "treeIndex": 1052 + "treeIndex": 1153 }, { "value": ["0x6905435fa2e1cB31972bb0F0bFF16F5744A91876", "1"], - "treeIndex": 613 + "treeIndex": 670 }, { "value": ["0xF906D4C20f46AA7b54c79A730332371EF420cc0e", "1"], - "treeIndex": 733 + "treeIndex": 804 }, { "value": ["0x88193fc66f2cab15e03add807d11adc08b5352df", "1"], - "treeIndex": 1023 + "treeIndex": 1117 }, { "value": ["0x41AfDc422831dCCC8505762c75E69da983B83F92", "1"], - "treeIndex": 647 + "treeIndex": 706 }, { "value": ["0xf2177e53db73cdaa0bd15d891d3d3378a4098376", "1"], - "treeIndex": 749 + "treeIndex": 820 }, { "value": ["0x79de94f7db2800b4d8a56fd8a5becef416bbd02b", "1"], - "treeIndex": 852 + "treeIndex": 932 }, { "value": ["0x5743e93ab23a457150724ca18d9a0e35b17cc8fc", "1"], - "treeIndex": 932 + "treeIndex": 1018 }, { "value": ["0x137331ed7e7C9fffFb24f738C6D0Fb52BEdD97F9", "1"], - "treeIndex": 1098 + "treeIndex": 1203 }, { "value": ["0x6F69F79cEA418024b9E0acfD18bD8DE26f9BBE39", "1"], - "treeIndex": 681 + "treeIndex": 744 }, { "value": ["0x102f468314e062958c2ff7555a62356f505c1d1e", "1"], - "treeIndex": 923 + "treeIndex": 1007 }, { "value": ["0xc6cfeDaAA225Bb433E00d762FE898707a3c077aD", "1"], - "treeIndex": 925 + "treeIndex": 1009 }, { "value": ["0x52dbD5AeA5D61A4f7Fb760CFDc431Fbe3dC531A7", "1"], - "treeIndex": 663 + "treeIndex": 725 }, { "value": ["0x41955ab7d12f9f6c03de972b91d9b895d9c2eaf8", "1"], - "treeIndex": 1112 + "treeIndex": 1217 }, { "value": ["0x28e15b0eb947333fbc71a83f4a20c2a95acccf6a", "1"], - "treeIndex": 814 + "treeIndex": 891 }, { "value": ["0x6beEF2B2fE00FDDCa12A8CDA2D4B00435b0ba3b6", "1"], - "treeIndex": 793 + "treeIndex": 869 }, { "value": ["0x8C26CC23c671be30c6f701417FBC153B6998fF68", "1"], - "treeIndex": 989 + "treeIndex": 1082 }, { "value": ["0x38016c4Dadd92c0C74B5EcE7A9B4AB859777B81A", "1"], - "treeIndex": 633 + "treeIndex": 691 }, { "value": ["0xfDc2B224cc1fd65d6cdCcDd896510A7d89aF81c3", "1"], - "treeIndex": 711 + "treeIndex": 779 }, { "value": ["0x34b5f399cc5a1dd491666c9866941fb8e8d09746", "1"], - "treeIndex": 919 + "treeIndex": 1002 }, { "value": ["0xdb27D37572eA22A7c2b82D15101d6CABdb0b6F74", "1"], - "treeIndex": 673 + "treeIndex": 735 }, { "value": ["0x33CC5926289066C0bc7080e3eF133Cf761D527bD", "1"], - "treeIndex": 672 + "treeIndex": 734 }, { "value": ["0x0990cC53F3503281737a57E3FD4fa09aaa63f8e2", "1"], - "treeIndex": 619 + "treeIndex": 676 }, { "value": ["0x18AEB8064beCa45C264342EF13355DF535F8Fa37", "1"], - "treeIndex": 789 + "treeIndex": 865 }, { "value": ["0x3aBfC7FFA744edc456D361Be957f972D1BaC4991", "1"], - "treeIndex": 1033 + "treeIndex": 1129 }, { "value": ["0x2c79aC9f76c3310B59D4C5E3FD214a73AEC68553", "1"], - "treeIndex": 645 + "treeIndex": 704 }, { "value": ["0xaD5116D1f9F3D2816935b0Df95a58750745eB308", "1"], - "treeIndex": 1185 + "treeIndex": 1296 }, { "value": ["0x026C9072199156739837Ef6e2cCEF2A23D554DAF", "1"], - "treeIndex": 771 + "treeIndex": 845 }, { "value": ["0x3635B3d38B971ED37b17E6E1Ac685Af87bc8d930", "1"], - "treeIndex": 770 + "treeIndex": 844 }, { "value": ["0x563153823D702516F92fc24edD9358D6973f60F9", "1"], - "treeIndex": 805 + "treeIndex": 882 }, { "value": ["0xC5440A5e857102620Bd2E7B1C28895f4D99934c0", "1"], - "treeIndex": 933 + "treeIndex": 1019 }, { "value": ["0x45a5c8a2ea84f48537a74e2e8f96790c90a0046c", "1"], - "treeIndex": 1146 + "treeIndex": 1252 }, { "value": ["0xbB05E34C2315DfFb3a2e5EA345C489d3e190eb32", "1"], - "treeIndex": 902 + "treeIndex": 985 }, { "value": ["0x875FB048e3b6A5d2dcA69c5e29D730f4040d50aa", "1"], - "treeIndex": 1184 + "treeIndex": 1295 }, { "value": ["0x5e11534344b8c1fda947b37dc57b8734232a6b1c", "1"], - "treeIndex": 1117 + "treeIndex": 1222 }, { "value": ["0x8dC24f29bB67BAd92A90dFB7aB58c702B4Bd73f1", "1"], - "treeIndex": 1021 + "treeIndex": 1115 }, { "value": ["0x7535B9c39d66Fa6cC0b67c74E1F6dFBfe917a4a2", "1"], - "treeIndex": 866 + "treeIndex": 946 }, { "value": ["0x0edeF718166D6B239f965229C8Dd306ea52626E4", "1"], - "treeIndex": 876 + "treeIndex": 958 }, { "value": ["0x68647DDA6e001B620d36A6472e975f6405262C7f", "1"], - "treeIndex": 1165 + "treeIndex": 1273 }, { "value": ["0xC3F8E3b3808d2e33b06abFB8731b88948E1f2b8b", "1"], - "treeIndex": 1210 + "treeIndex": 1321 }, { "value": ["0x27e15abc9644c11bdad575748f7839e6783acdd5", "1"], - "treeIndex": 952 + "treeIndex": 1041 }, { "value": ["0x260dB26a5D85E9e6983257e8Af71A60e95873d6b", "1"], - "treeIndex": 1157 + "treeIndex": 1265 }, { "value": ["0xBF222CA2Ef5126afFe94EA72903764D52cD12642", "1"], - "treeIndex": 738 + "treeIndex": 809 }, { "value": ["0x033485Ae1cce7a1Fbc9024469062Fa5a9E7c0799", "1"], - "treeIndex": 1035 + "treeIndex": 1131 }, { "value": ["0x4170AeF5c413915bafdc1980dC2f62c501559132", "1"], - "treeIndex": 966 + "treeIndex": 1055 }, { "value": ["0x3265A39fa1bDD28b9029568208e3cb4639Adbf3e", "1"], - "treeIndex": 801 + "treeIndex": 877 }, { "value": ["0x112F5c6B85D5dF1594DE75E5Cc655dD011e61d78", "1"], - "treeIndex": 714 + "treeIndex": 782 }, { "value": ["0x7a3e92078919273318e3396c92E477E7373fef79", "1"], - "treeIndex": 1000 + "treeIndex": 1094 }, { "value": ["0x2cf8bd93c36dc34d35208fe7a598a13e7783c69a", "1"], - "treeIndex": 668 + "treeIndex": 730 }, { "value": ["0x520c7792f2343c7A5c9F230bD39C565918Fcf215", "1"], - "treeIndex": 1132 + "treeIndex": 1237 }, { "value": ["0x899B2d61a5943Dd2452cbc9Ff5d158c63a2275dd", "1"], - "treeIndex": 743 + "treeIndex": 814 }, { "value": ["0x51D0A5CBe5666ad3EEe303f0d16FcDe9C5Cd3009", "1"], - "treeIndex": 1205 + "treeIndex": 1316 }, { "value": ["0x44aa0725a9D7F7b2F86DB37F667E5a3E11388CBc", "1"], - "treeIndex": 995 + "treeIndex": 1088 }, { "value": ["0xCC546bAA3cA03C25294a901608049d5E045FBFA2", "1"], - "treeIndex": 1174 + "treeIndex": 1283 }, { "value": ["0xcE727050002F2a1398E819328fa501D952a05aAC", "1"], - "treeIndex": 817 + "treeIndex": 894 }, { "value": ["0x7d7337FcDefe5771e3280f25c3Ba670700E8560c", "1"], - "treeIndex": 1038 + "treeIndex": 1136 }, { "value": ["0xFaDd3C023e295FDBA31fc2b57770029318960beD", "1"], - "treeIndex": 699 + "treeIndex": 766 }, { "value": ["0xbA55BDbF959DF826dA6c35487eB15FaD2164662d", "1"], - "treeIndex": 844 + "treeIndex": 923 }, { "value": ["0x01fd2245a54411819011550b1c8799814aa2cc0b", "1"], - "treeIndex": 652 + "treeIndex": 712 }, { "value": ["0xE6e7A811aC96c93cd6b555C2aD4430121321f41B", "1"], - "treeIndex": 1200 + "treeIndex": 1311 }, { "value": ["0xe8142000ef4dad30b1b84705b32fdd8d906366d9", "1"], - "treeIndex": 971 + "treeIndex": 1060 }, { "value": ["0x94365edc741d589320602ce66677B5ddB64d3687", "1"], - "treeIndex": 874 + "treeIndex": 956 }, { "value": ["0x3df6c1D54ad103233B3c74a12042f67239d69f70", "1"], - "treeIndex": 675 + "treeIndex": 737 }, { "value": ["0xa195AF9e11997c4852929f89225894dD5F4E1418", "1"], - "treeIndex": 988 + "treeIndex": 1080 }, { "value": ["0x09E102414813d84519c21e03C32001b123cD58C9", "1"], - "treeIndex": 816 + "treeIndex": 893 }, { "value": ["0x380b5F11406AAd00D3398f838089D9d43FcDAbf8", "1"], - "treeIndex": 953 + "treeIndex": 1042 }, { "value": ["0x2E92072fd9e6189E07FE977CC35Cb72DDfa1111E", "1"], - "treeIndex": 614 + "treeIndex": 671 }, { "value": ["0xEF6BF72663897B1993f680519c1EC7962893D00F", "1"], - "treeIndex": 624 + "treeIndex": 682 }, { "value": ["0xbC8f491D5c7cbd999b1E742D645acDB77a017ef3", "1"], - "treeIndex": 1207 + "treeIndex": 1318 }, { "value": ["0x13c0c1F31368C39297F3fAd4FB6bbb9C96bbC988", "1"], - "treeIndex": 1051 + "treeIndex": 1152 }, { "value": ["0xbd40A797140f36e608b41390E669F11E79DE4b6D", "1"], - "treeIndex": 1179 + "treeIndex": 1289 }, { "value": ["0xc6adE353C837ebA0CB2a85419B7aB50e59eb2A95", "1"], - "treeIndex": 1133 + "treeIndex": 1238 }, { "value": ["0xaA26fC5AeAfd9E17b8e5A3fFc6E5041b12137105", "1"], - "treeIndex": 856 + "treeIndex": 936 }, { "value": ["0xA9Cdc432A3d1a1A5F43b353950389790be640b4A", "1"], - "treeIndex": 1016 + "treeIndex": 1110 }, { "value": ["0xaa3cD95439557cAfD4498aAC4a9489E39Be98AA5", "1"], - "treeIndex": 863 + "treeIndex": 943 }, { "value": ["0xcb7329E0b62F79634c0e8EAD7cE46108564f2F0B", "1"], - "treeIndex": 1145 + "treeIndex": 1251 }, { "value": ["0x0f49efe399584b13f9d0f77198319ed030ac3f20", "1"], - "treeIndex": 858 + "treeIndex": 938 }, { "value": ["0xBea1771efeD9D4a80D6cE19Aedb70e56Dd739B49", "1"], - "treeIndex": 1083 + "treeIndex": 1188 }, { "value": ["0xD7efAE6e8e0556eBb5E77A499a34FCe6a4D8c722", "1"], - "treeIndex": 1213 + "treeIndex": 1325 }, { "value": ["0x34BEB2e3660624A94504A8C9e5c8aA29fBD14E31", "1"], - "treeIndex": 908 + "treeIndex": 991 }, { "value": ["0x78d3C01365B196aC94Ec0754Ef0ee051572bBbdD", "1"], - "treeIndex": 688 + "treeIndex": 752 }, { "value": ["0x049808d5EAA90a2665b9703d2246DDed34F1EB73", "1"], - "treeIndex": 894 + "treeIndex": 977 }, { "value": ["0xCD7f6b72049C3b54416f9F26392cB271e74ca3FD", "1"], - "treeIndex": 1183 + "treeIndex": 1293 }, { "value": ["0x7565DEdDCB83a14B185eb9520914bB918cDfE983", "1"], - "treeIndex": 1069 + "treeIndex": 1172 }, { "value": ["0xb3eb1838512d6172911505edafee3a6535d69e34", "1"], - "treeIndex": 747 + "treeIndex": 818 }, { "value": ["0x94507bc0C3fa6483F84453D8DD85AA1617e0d88F", "1"], - "treeIndex": 992 + "treeIndex": 1085 }, { "value": ["0x89b0fB6eb9d83e6E50915ABa19B92fc80a58f065", "1"], - "treeIndex": 848 + "treeIndex": 928 }, { "value": ["0x3676828AdDB128eCD9F51D49Ca5b5F755607662e", "1"], - "treeIndex": 918 + "treeIndex": 1001 }, { "value": ["0x00bCD13eF3cD3D835Db9Ab66f8F440101295A82d", "1"], - "treeIndex": 674 + "treeIndex": 736 }, { "value": ["0x85893cc28f86c3138e1e3f888b16466e8accafc6", "1"], - "treeIndex": 1075 + "treeIndex": 1178 }, { "value": ["0xca93c1c564bf5a4e8dcca65ce80fbdf66990927d", "1"], - "treeIndex": 763 + "treeIndex": 836 }, { "value": ["0x904B8C6696Df18dBb88Dc810075c16805e03E909", "1"], - "treeIndex": 1208 + "treeIndex": 1319 }, { "value": ["0x7e1A81D62f762a4232300f3f68A23Cff376B06Bd", "1"], - "treeIndex": 1090 + "treeIndex": 1195 }, { "value": ["0x8cf36632D7305619EB6b07c532Ad4DD0971F6282", "1"], - "treeIndex": 760 + "treeIndex": 833 }, { "value": ["0xF637978800670ba2a978501D86f73442e108f946", "1"], - "treeIndex": 1013 + "treeIndex": 1107 }, { "value": ["0x893E7C3d5fb639d0964A16037f7E1b5Ab595dBe8", "1"], - "treeIndex": 620 + "treeIndex": 677 }, { "value": ["0xbf47F68f0Cf07Ab56180D25D083ce73Db66AbCC9", "1"], - "treeIndex": 644 + "treeIndex": 703 }, { "value": ["0x9898C676b550110dB42240Ed11Cae6A8Cf8Ccb48", "1"], - "treeIndex": 907 + "treeIndex": 990 }, { "value": ["0x373250CCe67642B3fDa31B172150C8Cf10376B88", "1"], - "treeIndex": 701 + "treeIndex": 768 }, { "value": ["0x896b2797442e7066f2e46959a0B32398999fCC0d", "1"], - "treeIndex": 916 + "treeIndex": 999 }, { "value": ["0x64897dBB52C2BFa0Ae107101b4983f365fb9a390", "1"], - "treeIndex": 702 + "treeIndex": 769 }, { "value": ["0xee7028E9C5240d77876efBAC5acD0E7cE2012b19", "1"], - "treeIndex": 998 + "treeIndex": 1092 }, { "value": ["0x97Ba60ccd56b319096cf3f0Cb3429114a0A184E5", "1"], - "treeIndex": 1151 + "treeIndex": 1257 }, { "value": ["0x9BD48e08E3444B30113812acd52458b35C33803A", "1"], - "treeIndex": 648 + "treeIndex": 707 }, { "value": ["0x9BA7053384784B3D2949803b83F2520572CB5452", "1"], - "treeIndex": 1163 + "treeIndex": 1271 }, { "value": ["0x11BDd3E134A0c3dC242b7b9d399896b3587a8daC", "1"], - "treeIndex": 927 + "treeIndex": 1011 }, { "value": ["0xc6571c2FB66825F13b7751b1c334810D397618Eb", "1"], - "treeIndex": 1076 + "treeIndex": 1179 }, { "value": ["0x3961a7966F6E8eA422CaF1362530d3F5c2D778CA", "1"], - "treeIndex": 1169 + "treeIndex": 1277 }, { "value": ["0xa2DE0B80D24C3Bc37A9F6C44683fA51d67852c38", "1"], - "treeIndex": 1096 + "treeIndex": 1201 }, { "value": ["0xa7F343a7C53f3A852a7Ae51F5E62b4D9b0594336", "1"], - "treeIndex": 784 + "treeIndex": 860 }, { "value": ["0x0c4E0544F0eCfdF4387B45E44d2F45d26aE65D02", "1"], - "treeIndex": 1186 + "treeIndex": 1297 }, { "value": ["0x217A94e97287659bD9288862BA28C2f02cc5A4d1", "1"], - "treeIndex": 1114 + "treeIndex": 1219 }, { "value": ["0xFE67648A6b97751D7931E73b74a5b65917BDB06a", "1"], - "treeIndex": 1193 + "treeIndex": 1304 }, { "value": ["0x84924bfFabFC9601D22bAEe4cF4911b40AD41664", "1"], - "treeIndex": 678 + "treeIndex": 740 }, { "value": ["0x5e81c5F7fAB13D3708ABb8679cbdBF863E09409c", "1"], - "treeIndex": 827 + "treeIndex": 904 }, { "value": ["0x90edD7024Dd948892Cdd063FEF6EcC167bEa2304", "1"], - "treeIndex": 981 + "treeIndex": 1072 }, { "value": ["0x4B2F6D3A23bADb60c8405d50289eF3daB9109936", "1"], - "treeIndex": 1020 + "treeIndex": 1114 }, { "value": ["0x1314ba5224256A2092869e91098f101BF1182934", "1"], - "treeIndex": 787 + "treeIndex": 863 }, { "value": ["0xe1dbD2c71ded411DB6Ce029785E9bA9c1Ae0c801", "1"], - "treeIndex": 638 + "treeIndex": 696 }, { "value": ["0x82584A2e294fC67C390f059227490DA7390dF331", "1"], - "treeIndex": 754 + "treeIndex": 825 }, { "value": ["0x24d697503CEDA3e33c6Cd9cDCf769702f32b5974", "1"], - "treeIndex": 774 + "treeIndex": 849 }, { "value": ["0xb9E500CF14b355f50217f1a89040DF1765C5E70e", "1"], - "treeIndex": 914 + "treeIndex": 997 }, { "value": ["0x79fb4ebdd543d0927b809b1e8f552f1bf74dec65", "1"], - "treeIndex": 873 + "treeIndex": 955 }, { - "value": ["0x3Eb73235225F0a4C8e7612ED3C0eb93f947CFE80", "1"], - "treeIndex": 878 + "value": ["0xd6d965bd7f73fb1de3060c09483a14601d5317d8", "1"], + "treeIndex": 1016 }, { - "value": ["0x9dD295D8557c61AD14408A92645C961f47300455", "1"], - "treeIndex": 1126 + "value": ["0x8eea53fc41b248af0cb8dc72ec17eb2caf9f32c0", "1"], + "treeIndex": 1067 + }, + { + "value": ["0xe5f7c6e25ff2f6496de5c08f02e6d4fb5fce23c9", "1"], + "treeIndex": 1120 + }, + { + "value": ["0xc19603c6b2b3f64afeffd30c4580428317c1a692", "1"], + "treeIndex": 1031 + }, + { + "value": ["0x81abbcccf44b3102c0cd8159c1ab8b295849df23", "1"], + "treeIndex": 1287 + }, + { + "value": ["0x6026dcf4a4146bad240066c670b62c831e94dc1a", "1"], + "treeIndex": 761 + }, + { + "value": ["0xc74796ea4d76333e38638bb2cb8ddfe0bffaa749", "1"], + "treeIndex": 927 + }, + { + "value": ["0x38de4b9714640d7d86160f4bfd45d9e796c0fe49", "1"], + "treeIndex": 797 + }, + { + "value": ["0x55792e1f0a41d3af8b6d41dfdcf24651aa80fa1e", "1"], + "treeIndex": 778 + }, + { + "value": ["0xc66fadffeb6da3b9a7fa3c71130f881e3a9b13fb", "1"], + "treeIndex": 1263 + }, + { + "value": ["0x812b6cd80f38bdb8078043609c55f8b55fa7eab4", "1"], + "treeIndex": 826 + }, + { + "value": ["0x7152cd3891d5b80ca162bbb807e2d4310c084207", "1"], + "treeIndex": 716 + }, + { + "value": ["0x00b824a7aebd7ab7cfd5fafa470c690f0dba7cb6", "1"], + "treeIndex": 678 + }, + { + "value": ["0x9b437ee080d4d8c579ff947d86319e59b2f7b1ee", "1"], + "treeIndex": 724 + }, + { + "value": ["0xcd922764c55c4156c9e03e815aedc35dc263700f", "1"], + "treeIndex": 1141 + }, + { + "value": ["0xc56993491eb1fa12c17863f922a8393de8ab4413", "1"], + "treeIndex": 747 + }, + { + "value": ["0x9a1c6e462961422168b4d958cff3344ea7430507", "1"], + "treeIndex": 1227 + }, + { + "value": ["0xda65d415cc9d5ddc2a08bdffc996750755fc3cf0", "1"], + "treeIndex": 1145 + }, + { + "value": ["0x9753a6122349933f933c0fe6200e67bbb1199c09", "1"], + "treeIndex": 879 + }, + { + "value": ["0x14b35ea598a18e171a8f1e724c356f83fb4a0f18", "1"], + "treeIndex": 827 + }, + { + "value": ["0xe4557a032c75bf2ea06a8212e36f18f60e7ee7ac", "1"], + "treeIndex": 1281 + }, + { + "value": ["0x6dff0c088cfb81ecaae1aef739219f1ec1bd0bc6", "1"], + "treeIndex": 742 + }, + { + "value": ["0x1714859bc91dee08c2355251cd3a13784152aadf", "1"], + "treeIndex": 1135 + }, + { + "value": ["0x503a47280852033dcdbdd113663ff9e6e7a0a338", "1"], + "treeIndex": 1182 + }, + { + "value": ["0xbefaadd4a558637646a7f0697022e1f767c7b491", "1"], + "treeIndex": 764 + }, + { + "value": ["0x773674eba65277e47faa2bf4fd2e3fa6c2f01228", "1"], + "treeIndex": 1148 + }, + { + "value": ["0xb1e745e9a67be8ceee1864558e7608021a5ba4e0", "1"], + "treeIndex": 913 + }, + { + "value": ["0xfac906b02e9e1f54c5b9f891db5e8fe428889448", "1"], + "treeIndex": 1323 + }, + { + "value": ["0x0ef7871ea3ef1952621c389598386368896ccd8b", "1"], + "treeIndex": 664 + }, + { + "value": ["0xaea29c04e32ebce118ea8cee975a3317190cccdd", "1"], + "treeIndex": 1186 + }, + { + "value": ["0x71e18c339795799fe56aaf3d5c9bd4dc93be2842", "1"], + "treeIndex": 1294 + }, + { + "value": ["0x4e7a933b61999dcc712e056cf94595591958eda6", "1"], + "treeIndex": 711 + }, + { + "value": ["0xa56bf93a4bc592d446f3712c0db17b4e33e14b71", "1"], + "treeIndex": 847 + }, + { + "value": ["0x8337478ae2e798230624dcb3bec342fddc6248a0", "1"], + "treeIndex": 1248 + }, + { + "value": ["0xa63dddb69e6e470bf3d236b434ef80a213b998a7", "1"], + "treeIndex": 1169 + }, + { + "value": ["0x081a919a2e2e43eedfc6a618b76be5a2381adc00", "1"], + "treeIndex": 1134 + }, + { + "value": ["0xd202a56c5e7ba279431e43d945c5cc6f68d083b7", "1"], + "treeIndex": 1064 + }, + { + "value": ["0x9782f2b0878d97ed2d79b38cbbc494c6bd3999a8", "1"], + "treeIndex": 1121 + }, + { + "value": ["0x38c596da5aa8fe9f91eaf30c431dffccc09394a6", "1"], + "treeIndex": 948 + }, + { + "value": ["0x56706f118e42ae069f20c5636141b844d1324ae1", "1"], + "treeIndex": 1073 + }, + { + "value": ["0x2019aa6811c84c7cc4df4fe0f3f3914631aae315", "1"], + "treeIndex": 1037 + }, + { + "value": ["0x69aa0361dbb0527d4f1e5312403bd41788fe61fe", "1"], + "treeIndex": 908 + }, + { + "value": ["0x90b285c1bbddb36fbfc363773d6689975cccdbfc", "1"], + "treeIndex": 954 + }, + { + "value": ["0xdee983c30a123f1798437ead4587dd87cb96dcda", "5"], + "treeIndex": 1264 + }, + { + "value": ["0x418edf05d862ec3d591cb16f7e2efa88de8f2b00", "1"], + "treeIndex": 1005 + }, + { + "value": ["0x02e725b7e99091bd4ccbf15228384e160ecdf78f", "1"], + "treeIndex": 802 + }, + { + "value": ["0xa0fe02a5078922fe067b1c4d69b4d7c722ed78d9", "1"], + "treeIndex": 976 + }, + { + "value": ["0x388a519241457b90e1349e342dca1fb093b50378", "1"], + "treeIndex": 758 + }, + { + "value": ["0xa693670efa475ad547c29d67d9d9bd6d8d1b3c34", "1"], + "treeIndex": 1090 + }, + { + "value": ["0x0efadbe8328a1a07bb3ddec22f69f88adb61b8b4", "1"], + "treeIndex": 1159 + }, + { + "value": ["0x7bb998a98f60811dea7df9048134e14dc3a38f97", "1"], + "treeIndex": 840 + }, + { + "value": ["0x507B96026abF97845b68b605ED82BAc8FaFb23ff", "1"], + "treeIndex": 1029 + }, + { + "value": ["0x082087d48cA764Bb1A5848b56869C1edd4407aC9", "1"], + "treeIndex": 1224 + }, + { + "value": ["0x3C75b7d9C82924E668368f512309FBfA4f1d7480", "1"], + "treeIndex": 1081 + }, + { + "value": ["0x0e440bd9798ad22cb8fd6f1a433f2f16e8786770", "1"], + "treeIndex": 858 + }, + { + "value": ["0x89172e6ecd0f83E0B31dA700f022E39ddD891D0c", "1"], + "treeIndex": 698 + }, + { + "value": ["0xa400ff8a4ba8bf0b2e46c692aaf48650e186487b", "1"], + "treeIndex": 1014 } ], "leafEncoding": ["address", "uint256"] diff --git a/packages/taikoon-ui/src/i18n/en.json b/packages/taikoon-ui/src/i18n/en.json index abff20f7e2c..d9b2c54195a 100644 --- a/packages/taikoon-ui/src/i18n/en.json +++ b/packages/taikoon-ui/src/i18n/en.json @@ -18,7 +18,7 @@ "mintNow": "Mint Now", "learnMore": "FAQs", "mint": "Mint", - "etherscan": "View on Chain Explorer", + "etherscan": "View on Taiko explorer", "share": "Share", "yourTaikoons": "Your Taikoons", "cancel": "Cancel", @@ -85,7 +85,6 @@ "title": "How many NFTs does the Taikoons collection consist of?", "text": "Taiko's Genesis NFT collection consists of 888 Taikoons." }, - { "title": "How many NFTs will be minted now, and how many NFTs are reserved for future activities?", "text": "608 NFTs will be minted now, and the remaining 280 will be reserved for future activities." diff --git a/packages/taikoon-ui/src/lib/chain/chains.ts b/packages/taikoon-ui/src/lib/chain/chains.ts index d1f95ea7da2..b3a5d1008fb 100644 --- a/packages/taikoon-ui/src/lib/chain/chains.ts +++ b/packages/taikoon-ui/src/lib/chain/chains.ts @@ -1,122 +1,28 @@ import type { Chain } from 'viem'; +import { taiko, taikoHekla } from 'viem/chains'; -import { type ChainConfig, type ChainConfigMap, LayerType } from '.'; +import { isDevelopmentEnv } from '$lib/util/isDevelopmentEnv'; -//import { chainConfig } from '$chainConfig'; - -const chainConfigs: ChainConfigMap = { - '31337': { - name: 'Hardhat', - rpcUrls: { - default: { - http: ['http://localhost:8545'], - //webSocket: ['wss://mainnet.infura.io/ws/v3/'], - }, - }, - nativeCurrency: { - name: 'Ether', - symbol: 'ETH', - decimals: 18, - }, - icon: '/chains/ethereum.svg', - type: 'L1' as LayerType, // Add the missing 'type' property with the value of 'LayerType' - }, - '167001': { - name: 'Devnet', - rpcUrls: { - default: { - http: ['https://rpc.internal.taiko.xyz'], - }, - }, - nativeCurrency: { - name: 'Ether', - symbol: 'ETH', - decimals: 18, - }, - icon: '/chains/ethereum.svg', - type: 'L1' as LayerType, // Add the missing 'type' property with the value of 'LayerType' - }, - '17000': { - name: 'Holesky', - rpcUrls: { - default: { - http: ['https://1rpc.io/holesky'], - }, - }, - nativeCurrency: { - name: 'Ether', - symbol: 'ETH', - decimals: 18, - }, - icon: '/chains/ethereum.svg', - type: 'L1' as LayerType, // Add the missing 'type' property with the value of 'LayerType' - }, - '167000': { - name: 'Taiko', - rpcUrls: { - default: { - http: ['https://rpc.mainnet.taiko.xyz'], - }, - }, - nativeCurrency: { - name: 'Ether', - symbol: 'ETH', - decimals: 18, - }, - icon: '/chains/taiko.svg', - type: 'L1' as LayerType, // Add the missing 'type' property with the value of 'LayerType' - }, -}; - -function mapChainConfigToChain(chainId: string, chainConfig: ChainConfig): Chain { - return { - id: Number(chainId), - name: chainConfig.name, - rpcUrls: chainConfig.rpcUrls, - nativeCurrency: chainConfig.nativeCurrency, - blockExplorers: chainConfig.blockExplorers, +export const getChainImages = (): Record => { + const map = { + 167000: '/chains/taiko.svg', + 167009: '/chains/taiko.svg', }; -} + return map; +}; -export const chainIdToChain = (chainId: number): Chain => { - const chain = chains.find((chain) => chain.id === chainId); +export const getChainImage = (chainId: number) => { + const chain = getChainImages()[chainId]; if (!chain) { throw new Error(`Chain with id ${chainId} not found`); } return chain; }; -export const chains: Chain[] = Object.entries(chainConfigs).map(([chainId, chainConfig]) => - mapChainConfigToChain(chainId, chainConfig as ChainConfig), -); - -export function getConfiguredChainIds(): number[] { - return chains.map((chain) => Number(chain.id)); -} - -export function isSupportedChain(chainId: number) { +export const isSupportedChain = (chainId: number) => { return chains.some((chain) => chain.id === chainId); -} - -export function getChainImages(): Record { - return Object.fromEntries( - Object.entries(chainConfigs).map(([chainId]) => [Number(chainId), chainConfigs[Number(chainId)].icon]), - ); -} - -export function getChainImage(chainId: number) { - const images = getChainImages(); - if (!images[chainId]) { - throw new Error(`Chain with id ${chainId} not found`); - } +}; - return images[chainId]; -} +export const chains: [Chain, ...Chain[]] = isDevelopmentEnv ? [taikoHekla] : [taiko]; -export function getChainName(chainId: number) { - const chain = chains.find((chain) => chain.id === chainId); - if (!chain) { - throw new Error(`Chain with id ${chainId} not found`); - } - return chain.name; -} +export const chainId = isDevelopmentEnv ? taikoHekla.id : taiko.id; diff --git a/packages/taikoon-ui/src/lib/ens/getAddress.ts b/packages/taikoon-ui/src/lib/ens/getAddress.ts index bbe8ada40b8..077b35d2b2a 100644 --- a/packages/taikoon-ui/src/lib/ens/getAddress.ts +++ b/packages/taikoon-ui/src/lib/ens/getAddress.ts @@ -2,11 +2,13 @@ import { getEnsAddress } from '@wagmi/core'; import { type GetEnsAddressReturnType } from '@wagmi/core'; import { normalize } from 'viem/ens'; +import { chainId } from '$lib/chain'; + import type { IAddress } from '../../types'; import getConfig from '../wagmi/getConfig'; export default async function getAddress(ensName: string): Promise { - const { config, chainId } = getConfig(); + const config = getConfig(); const address = (await getEnsAddress(config, { name: normalize(ensName), chainId, diff --git a/packages/taikoon-ui/src/lib/ens/getName.ts b/packages/taikoon-ui/src/lib/ens/getName.ts index 9c6f0a6717f..077ff953e12 100644 --- a/packages/taikoon-ui/src/lib/ens/getName.ts +++ b/packages/taikoon-ui/src/lib/ens/getName.ts @@ -1,11 +1,13 @@ import { getEnsName } from '@wagmi/core'; import { type GetEnsNameReturnType } from '@wagmi/core'; +import { chainId } from '$lib/chain'; + import type { IAddress } from '../../types'; import getConfig from '../wagmi/getConfig'; export default async function getName(address: IAddress): Promise { - const { config, chainId } = getConfig(); + const config = getConfig(); const ensName = (await getEnsName(config, { address, chainId, diff --git a/packages/taikoon-ui/src/lib/ipfs/config.ts b/packages/taikoon-ui/src/lib/ipfs/config.ts deleted file mode 100644 index ce6b37a9aab..00000000000 --- a/packages/taikoon-ui/src/lib/ipfs/config.ts +++ /dev/null @@ -1 +0,0 @@ -export { PUBLIC_IPFS_GATEWAY } from '$env/static/public'; diff --git a/packages/taikoon-ui/src/lib/ipfs/get.ts b/packages/taikoon-ui/src/lib/ipfs/get.ts deleted file mode 100644 index f43218d7068..00000000000 --- a/packages/taikoon-ui/src/lib/ipfs/get.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { PUBLIC_IPFS_GATEWAY } from './config'; - -export default async function get(hash: string, json?: boolean): Promise { - const response = await fetch(`${PUBLIC_IPFS_GATEWAY}${hash}`); - return json ? response.json() : response.text(); -} diff --git a/packages/taikoon-ui/src/lib/ipfs/getMetadata.ts b/packages/taikoon-ui/src/lib/ipfs/getMetadata.ts index a402e91fc8d..35df21346ed 100644 --- a/packages/taikoon-ui/src/lib/ipfs/getMetadata.ts +++ b/packages/taikoon-ui/src/lib/ipfs/getMetadata.ts @@ -1,7 +1,10 @@ -import { IpfsError } from '../error'; +import { get } from 'svelte/store'; + +import { nftCache } from '$stores/nftCache'; + import Token from '../token'; -import { PUBLIC_IPFS_GATEWAY } from './config'; -import get from './get'; +import httpGet from './httpGet'; +//import get from './get'; export interface ITokenMetadata { name: string; @@ -10,16 +13,20 @@ export interface ITokenMetadata { } export default async function getMetadata(tokenId: number): Promise { const tokenURI = await Token.tokenURI(tokenId); - const hash = tokenURI.split('ipfs://').pop(); - if (!hash) throw new IpfsError('Invalid token URI:' + tokenURI); - const metadata = (await get(hash, true)) as ITokenMetadata; - - const imageHash = metadata.image.split('ipfs://').pop(); + // const metadata = (await get(tokenURI, true)) as ITokenMetadata; - if (!imageHash) throw new IpfsError('Invalid image URI:' + metadata.image); + const cachedIds = get(nftCache); + const cached = cachedIds[tokenId]; + let metadata; + if (!cached) { + metadata = (await httpGet(tokenURI, true)) as ITokenMetadata; + nftCache.set({ + ...cachedIds, + [tokenId]: JSON.stringify(metadata), + }); + } else { + metadata = JSON.parse(cached); + } - return { - ...metadata, - image: `${PUBLIC_IPFS_GATEWAY}${imageHash}`, - }; + return metadata; } diff --git a/packages/taikoon-ui/src/lib/ipfs/httpGet.ts b/packages/taikoon-ui/src/lib/ipfs/httpGet.ts new file mode 100644 index 00000000000..090659e2b31 --- /dev/null +++ b/packages/taikoon-ui/src/lib/ipfs/httpGet.ts @@ -0,0 +1,4 @@ +export default async function httpGet(url: string, json?: boolean): Promise { + const response = await fetch(url); + return json ? response.json() : response.text(); +} diff --git a/packages/taikoon-ui/src/lib/ipfs/index.ts b/packages/taikoon-ui/src/lib/ipfs/index.ts index aaf516e2bb2..7d30d458f33 100644 --- a/packages/taikoon-ui/src/lib/ipfs/index.ts +++ b/packages/taikoon-ui/src/lib/ipfs/index.ts @@ -1,8 +1,8 @@ -import get from './get'; import getMetadata from './getMetadata'; +import httpGet from './httpGet'; const IPFS = { - get, + get: httpGet, getMetadata, }; diff --git a/packages/taikoon-ui/src/lib/token/balanceOf.ts b/packages/taikoon-ui/src/lib/token/balanceOf.ts index 58daec95bb5..9c104f36801 100644 --- a/packages/taikoon-ui/src/lib/token/balanceOf.ts +++ b/packages/taikoon-ui/src/lib/token/balanceOf.ts @@ -1,16 +1,12 @@ import { readContract } from '@wagmi/core'; +import { chainId } from '$lib/chain'; import { config } from '$wagmi-config'; import { taikoonTokenAbi, taikoonTokenAddress } from '../../generated/abi/'; -import { web3modal } from '../../lib/connect'; -import type { IAddress, IChainId } from '../../types'; +import type { IAddress } from '../../types'; export async function balanceOf(address: IAddress): Promise { - const { selectedNetworkId } = web3modal.getState(); - if (!selectedNetworkId) return 0; - - const chainId = selectedNetworkId as IChainId; const result = await readContract(config, { abi: taikoonTokenAbi, address: taikoonTokenAddress[chainId], diff --git a/packages/taikoon-ui/src/lib/token/canMint.ts b/packages/taikoon-ui/src/lib/token/canMint.ts index b6102b5672f..7def2c9e6ef 100644 --- a/packages/taikoon-ui/src/lib/token/canMint.ts +++ b/packages/taikoon-ui/src/lib/token/canMint.ts @@ -1,27 +1,26 @@ -import { getAccount, readContract } from '@wagmi/core'; +import { readContract } from '@wagmi/core'; +import type { Address } from 'viem'; + +import { chainId } from '$lib/chain'; import { taikoonTokenAbi, taikoonTokenAddress } from '../../generated/abi'; -import type { IAddress } from '../../types'; import { totalWhitelistMintCount } from '../user/totalWhitelistMintCount'; import getConfig from '../wagmi/getConfig'; -export async function canMint(): Promise { +export async function canMint(address: Address): Promise { try { - const { config, chainId } = getConfig(); - - const account = getAccount(config); - if (!account.address) return false; - const accountAddress = account.address as IAddress; - - const freeMintCount = await totalWhitelistMintCount(); + const config = getConfig(); + const freeMintCount = await totalWhitelistMintCount(address); + if (freeMintCount === 0) return false; const result = await readContract(config, { abi: taikoonTokenAbi, address: taikoonTokenAddress[chainId], functionName: 'canMint', - args: [accountAddress, BigInt(freeMintCount)], + args: [address, BigInt(freeMintCount)], chainId, }); + return result as boolean; } catch (e) { console.warn(e); diff --git a/packages/taikoon-ui/src/lib/token/estimateMintGasCost.ts b/packages/taikoon-ui/src/lib/token/estimateMintGasCost.ts index e6234bd4aec..91afdb7cb66 100644 --- a/packages/taikoon-ui/src/lib/token/estimateMintGasCost.ts +++ b/packages/taikoon-ui/src/lib/token/estimateMintGasCost.ts @@ -1,24 +1,18 @@ -import { formatGwei } from 'viem'; +import { type Address, formatGwei } from 'viem'; +import { chainId } from '$lib/chain'; import getProof from '$lib/whitelist/getProof'; import { taikoonTokenAbi, taikoonTokenAddress } from '../../generated/abi'; -import type { IChainId } from '../../types'; -import { web3modal } from '../connect'; import { totalWhitelistMintCount } from '../user/totalWhitelistMintCount'; import estimateContractGas from '../wagmi/estimateContractGas'; import { canMint } from './canMint'; -export async function estimateMintGasCost(): Promise { - const { selectedNetworkId } = web3modal.getState(); - if (!selectedNetworkId) return 0; - const chainId = selectedNetworkId as IChainId; - - const freeMintLeft = await totalWhitelistMintCount(); - - if (await canMint()) { - const proof = getProof(); +export async function estimateMintGasCost(address: Address): Promise { + const freeMintLeft = await totalWhitelistMintCount(address); + if (await canMint(address)) { + const proof = getProof(address); const gasEstimate = await estimateContractGas({ abi: taikoonTokenAbi, address: taikoonTokenAddress[chainId], diff --git a/packages/taikoon-ui/src/lib/token/index.ts b/packages/taikoon-ui/src/lib/token/index.ts index d9160a908d2..15aa05bde56 100644 --- a/packages/taikoon-ui/src/lib/token/index.ts +++ b/packages/taikoon-ui/src/lib/token/index.ts @@ -1,8 +1,7 @@ -import { zeroAddress } from 'viem'; +import { chainId } from '$lib/chain'; import { taikoonTokenAddress } from '../../generated/abi'; -import { web3modal } from '../../lib/connect'; -import type { IAddress, IChainId } from '../../types'; +import type { IAddress } from '../../types'; import { balanceOf } from './balanceOf'; import { canMint } from './canMint'; import { estimateMintGasCost } from './estimateMintGasCost'; @@ -15,10 +14,6 @@ import { tokenURI } from './tokenURI'; import { totalSupply } from './totalSupply'; function address(): IAddress { - const { selectedNetworkId } = web3modal.getState(); - if (!selectedNetworkId) return zeroAddress; - - const chainId = selectedNetworkId as IChainId; return taikoonTokenAddress[chainId]; } diff --git a/packages/taikoon-ui/src/lib/token/maxSupply.ts b/packages/taikoon-ui/src/lib/token/maxSupply.ts index b74234c7caf..b3eb6731a10 100644 --- a/packages/taikoon-ui/src/lib/token/maxSupply.ts +++ b/packages/taikoon-ui/src/lib/token/maxSupply.ts @@ -1,10 +1,12 @@ import { readContract } from '@wagmi/core'; +import { chainId } from '$lib/chain'; + import { taikoonTokenAbi, taikoonTokenAddress } from '../../generated/abi'; import getConfig from '../wagmi/getConfig'; export async function maxSupply(): Promise { - const { config, chainId } = getConfig(); + const config = getConfig(); const result = await readContract(config, { abi: taikoonTokenAbi, diff --git a/packages/taikoon-ui/src/lib/token/mint.ts b/packages/taikoon-ui/src/lib/token/mint.ts index 1d80174421e..74ad635c76e 100644 --- a/packages/taikoon-ui/src/lib/token/mint.ts +++ b/packages/taikoon-ui/src/lib/token/mint.ts @@ -1,13 +1,13 @@ -import { waitForTransactionReceipt, writeContract } from '@wagmi/core'; +import { getAccount, waitForTransactionReceipt, writeContract } from '@wagmi/core'; import { decodeEventLog } from 'viem'; -import { FilterLogsError, MintError } from '$lib/error'; +import { chainId } from '$lib/chain'; +import { FilterLogsError } from '$lib/error'; +import calculateGasPrice from '$lib/util/calculateGasPrice'; import getProof from '$lib/whitelist/getProof'; import { config } from '$wagmi-config'; import { taikoonTokenAbi, taikoonTokenAddress } from '../../generated/abi'; -import { web3modal } from '../../lib/connect'; -import type { IChainId } from '../../types'; import { totalWhitelistMintCount } from '../user/totalWhitelistMintCount'; import { canMint } from './canMint'; @@ -18,31 +18,36 @@ export async function mint({ freeMintCount: number; onTransaction: (tx: string) => void; }): Promise { - const { selectedNetworkId } = web3modal.getState(); - if (!selectedNetworkId) return []; - let tx: any; - const chainId = selectedNetworkId as IChainId; - - const mintCount = await totalWhitelistMintCount(); + const account = getAccount(config); + if (!account.address) { + throw new Error('No account address'); + } + const mintCount = await totalWhitelistMintCount(account.address); if (freeMintCount > mintCount) { - throw new MintError('Not enough free mints left'); + throw new Error('Not enough free mints left'); } - if (await canMint()) { - const proof = getProof(); + let tx: any; + + if (await canMint(account.address)) { + const proof = getProof(account.address); + const gasPrice = await calculateGasPrice(); tx = await writeContract(config, { abi: taikoonTokenAbi, address: taikoonTokenAddress[chainId], functionName: 'mint', args: [proof, BigInt(mintCount)], - chainId: chainId as number, + chainId, + gasPrice, }); onTransaction(tx); + } else { + throw new Error(`Connected account cannot mint`); } - let nounId: number = 0; + let tokenId: number = 0; const receipt = await waitForTransactionReceipt(config, { hash: tx }); @@ -61,8 +66,8 @@ export async function mint({ to: string; tokenId: bigint; } = decoded.args as any; - nounId = parseInt(args.tokenId.toString()); - tokenIds.push(nounId); + tokenId = parseInt(args.tokenId.toString()); + tokenIds.push(tokenId); } } catch (e: any) { throw new FilterLogsError(e.message); diff --git a/packages/taikoon-ui/src/lib/token/name.ts b/packages/taikoon-ui/src/lib/token/name.ts index 554426efbc4..d560f46a011 100644 --- a/packages/taikoon-ui/src/lib/token/name.ts +++ b/packages/taikoon-ui/src/lib/token/name.ts @@ -1,17 +1,11 @@ import { readContract } from '@wagmi/core'; +import { chainId } from '$lib/chain'; import { config } from '$wagmi-config'; import { taikoonTokenAbi, taikoonTokenAddress } from '../../generated/abi/'; -import { web3modal } from '../../lib/connect'; -import type { IChainId } from '../../types'; export async function name(): Promise { - const { selectedNetworkId } = web3modal.getState(); - if (!selectedNetworkId) return ''; - - const chainId = selectedNetworkId as IChainId; - const result = await readContract(config, { abi: taikoonTokenAbi, address: taikoonTokenAddress[chainId], diff --git a/packages/taikoon-ui/src/lib/token/ownerOf.ts b/packages/taikoon-ui/src/lib/token/ownerOf.ts index cd6f74b49af..17aa4baa617 100644 --- a/packages/taikoon-ui/src/lib/token/ownerOf.ts +++ b/packages/taikoon-ui/src/lib/token/ownerOf.ts @@ -1,18 +1,12 @@ import { readContract } from '@wagmi/core'; -import { zeroAddress } from 'viem'; +import { chainId } from '$lib/chain'; import { config } from '$wagmi-config'; import { taikoonTokenAbi, taikoonTokenAddress } from '../../generated/abi/'; -import { web3modal } from '../../lib/connect'; -import type { IAddress, IChainId } from '../../types'; +import type { IAddress } from '../../types'; export async function ownerOf(tokenId: number): Promise { - const { selectedNetworkId } = web3modal.getState(); - if (!selectedNetworkId) return zeroAddress; - - const chainId = selectedNetworkId as IChainId; - const result = await readContract(config, { abi: taikoonTokenAbi, address: taikoonTokenAddress[chainId], diff --git a/packages/taikoon-ui/src/lib/token/tokenOfOwner.ts b/packages/taikoon-ui/src/lib/token/tokenOfOwner.ts index 13a2c36bb6d..0ef02872cba 100644 --- a/packages/taikoon-ui/src/lib/token/tokenOfOwner.ts +++ b/packages/taikoon-ui/src/lib/token/tokenOfOwner.ts @@ -1,5 +1,7 @@ import { readContracts } from '@wagmi/core'; +import { chainId } from '$lib/chain'; + import { taikoonTokenAbi, taikoonTokenAddress } from '../../generated/abi'; import getConfig from '../../lib/wagmi/getConfig'; import type { IAddress } from '../../types'; @@ -8,7 +10,7 @@ import { balanceOf } from './balanceOf'; export async function tokenOfOwner(address: IAddress): Promise { const balance = await balanceOf(address); - const { config, chainId } = getConfig(); + const config = getConfig(); const params = { contracts: [] } as any; diff --git a/packages/taikoon-ui/src/lib/token/tokenURI.ts b/packages/taikoon-ui/src/lib/token/tokenURI.ts index 92a9da0c101..65e87d9fa2c 100644 --- a/packages/taikoon-ui/src/lib/token/tokenURI.ts +++ b/packages/taikoon-ui/src/lib/token/tokenURI.ts @@ -1,10 +1,12 @@ import { readContract } from '@wagmi/core'; +import { chainId } from '$lib/chain'; + import { taikoonTokenAbi, taikoonTokenAddress } from '../../generated/abi/'; import getConfig from '../../lib/wagmi/getConfig'; export async function tokenURI(tokenId: number): Promise { - const { config, chainId } = getConfig(); + const config = getConfig(); const result = await readContract(config, { abi: taikoonTokenAbi, diff --git a/packages/taikoon-ui/src/lib/token/totalSupply.ts b/packages/taikoon-ui/src/lib/token/totalSupply.ts index 2969756b88c..6f73dcfebab 100644 --- a/packages/taikoon-ui/src/lib/token/totalSupply.ts +++ b/packages/taikoon-ui/src/lib/token/totalSupply.ts @@ -1,10 +1,12 @@ import { readContract } from '@wagmi/core'; +import { chainId } from '$lib/chain'; + import { taikoonTokenAbi, taikoonTokenAddress } from '../../generated/abi'; import getConfig from '../../lib/wagmi/getConfig'; export async function totalSupply(): Promise { - const { config, chainId } = getConfig(); + const config = getConfig(); const result = await readContract(config, { abi: taikoonTokenAbi, diff --git a/packages/taikoon-ui/src/lib/user/totalWhitelistMintCount.ts b/packages/taikoon-ui/src/lib/user/totalWhitelistMintCount.ts index 9cd90f30209..9533059e603 100644 --- a/packages/taikoon-ui/src/lib/user/totalWhitelistMintCount.ts +++ b/packages/taikoon-ui/src/lib/user/totalWhitelistMintCount.ts @@ -1,20 +1,16 @@ import { StandardMerkleTree } from '@openzeppelin/merkle-tree'; -import { getAccount } from '@wagmi/core'; +import { type Address, getAddress } from 'viem'; -import getConfig from '../wagmi/getConfig'; -import { whitelist } from '../whitelist'; +import { chainId } from '$lib/chain'; -export async function totalWhitelistMintCount(): Promise { - const { config, chainId } = getConfig(); +import { whitelist } from '../whitelist'; +export async function totalWhitelistMintCount(address: Address): Promise { try { - const account = getAccount(config); - if (!account.address) return -1; - const tree = StandardMerkleTree.load(whitelist[chainId]); // eslint-disable-next-line @typescript-eslint/no-unused-vars - for (const [_, [address, amount]] of tree.entries()) { - if (address.toString().toLowerCase() === account.address.toString().toLowerCase()) { + for (const [_, [leafAddress, amount]] of tree.entries()) { + if (getAddress(leafAddress) === getAddress(address)) { return parseInt(amount); } } diff --git a/packages/taikoon-ui/src/lib/util/calculateGasPrice.ts b/packages/taikoon-ui/src/lib/util/calculateGasPrice.ts new file mode 100644 index 00000000000..95069a36b18 --- /dev/null +++ b/packages/taikoon-ui/src/lib/util/calculateGasPrice.ts @@ -0,0 +1,13 @@ +import { getGasPrice } from '@wagmi/core'; +import { parseGwei } from 'viem'; + +import getConfig from '$lib/wagmi/getConfig'; + +export default async function calculateGasPrice(): Promise { + const config = getConfig(); + const currentGasPrice = parseInt((await getGasPrice(config)).toString()); + const minGasPrice = parseInt(parseGwei('0.01').toString()); + const out = Math.max(currentGasPrice, minGasPrice); + + return BigInt(out); +} diff --git a/packages/taikoon-ui/src/lib/util/isDevelopmentEnv.ts b/packages/taikoon-ui/src/lib/util/isDevelopmentEnv.ts new file mode 100644 index 00000000000..4ff6e60878c --- /dev/null +++ b/packages/taikoon-ui/src/lib/util/isDevelopmentEnv.ts @@ -0,0 +1,3 @@ +const { MODE } = import.meta.env; + +export const isDevelopmentEnv = MODE === 'development'; diff --git a/packages/taikoon-ui/src/lib/wagmi/estimateContractGas.ts b/packages/taikoon-ui/src/lib/wagmi/estimateContractGas.ts index 4b25be97c22..37149260522 100644 --- a/packages/taikoon-ui/src/lib/wagmi/estimateContractGas.ts +++ b/packages/taikoon-ui/src/lib/wagmi/estimateContractGas.ts @@ -5,7 +5,7 @@ import getConfig from './getConfig'; export default async function estimateContractGas(params: Parameters[1]) { try { - const { config } = getConfig(); + const config = getConfig(); const client = await getConnectorClient(config); return await viemEstimateContractGas(client, params); diff --git a/packages/taikoon-ui/src/lib/wagmi/getBalance.ts b/packages/taikoon-ui/src/lib/wagmi/getBalance.ts index 14c35490e63..0bd4a220877 100644 --- a/packages/taikoon-ui/src/lib/wagmi/getBalance.ts +++ b/packages/taikoon-ui/src/lib/wagmi/getBalance.ts @@ -1,11 +1,13 @@ import { getBalance as wagmiGetBalance } from '@wagmi/core'; import { type GetBalanceReturnType } from '@wagmi/core'; +import { chainId } from '$lib/chain'; + import type { IAddress } from '../../types'; import getConfig from './getConfig'; export default async function getBalance(address: IAddress): Promise { - const { config, chainId } = getConfig(); + const config = getConfig(); const balance = (await wagmiGetBalance(config, { address, chainId, diff --git a/packages/taikoon-ui/src/lib/wagmi/getConfig.ts b/packages/taikoon-ui/src/lib/wagmi/getConfig.ts index 88b5682d544..9f900e870c8 100644 --- a/packages/taikoon-ui/src/lib/wagmi/getConfig.ts +++ b/packages/taikoon-ui/src/lib/wagmi/getConfig.ts @@ -1,16 +1,21 @@ -import { config, publicConfig, taiko } from '$wagmi-config'; +import { defaultWagmiConfig } from '@web3modal/wagmi'; -import type { IChainId } from '../../types'; -import { web3modal } from '../connect'; +import { PUBLIC_WALLETCONNECT_PROJECT_ID } from '$env/static/public'; +import { chains } from '$lib/chain'; -export default function getConfig() { - const { selectedNetworkId } = web3modal.getState(); - const wagmiConfig = selectedNetworkId ? config : publicConfig; +const projectId = PUBLIC_WALLETCONNECT_PROJECT_ID; - const chainId = selectedNetworkId ? selectedNetworkId : taiko.id; +const metadata = { + name: 'Taiko Trailblazer', + description: 'Taiko Trailblazer', + url: 'https://trailblazers.taiko.xyz/', + icons: ['https://avatars.githubusercontent.com/u/99078433'], +}; - return { - config: wagmiConfig, - chainId: chainId as IChainId, - }; +export default function getConfig() { + return defaultWagmiConfig({ + projectId, + chains, + metadata, + }); } diff --git a/packages/taikoon-ui/src/lib/wagmi/getLogs.ts b/packages/taikoon-ui/src/lib/wagmi/getLogs.ts index 32ecc543903..f605c47201b 100644 --- a/packages/taikoon-ui/src/lib/wagmi/getLogs.ts +++ b/packages/taikoon-ui/src/lib/wagmi/getLogs.ts @@ -3,7 +3,7 @@ import { getLogs as viemGetLogs } from 'viem/actions'; import getConfig from './getConfig'; export default async function getLogs(params: Parameters[1]) { - const { config } = getConfig(); + const config = getConfig(); const client = await getConnectorClient(config); return await viemGetLogs(client, params); diff --git a/packages/taikoon-ui/src/lib/wagmi/publicClient.ts b/packages/taikoon-ui/src/lib/wagmi/publicClient.ts index fca3f71006e..4c9f626f7f4 100644 --- a/packages/taikoon-ui/src/lib/wagmi/publicClient.ts +++ b/packages/taikoon-ui/src/lib/wagmi/publicClient.ts @@ -1,10 +1,10 @@ import { createPublicClient, http } from 'viem'; -import { holesky } from 'viem/chains'; +import { taiko } from 'viem/chains'; export default async function publicClient() { const client = createPublicClient({ - chain: holesky, - transport: http('https://1rpc.io/holesky'), + chain: taiko, + transport: http('https://rpc.mainnet.taiko.xyz'), }); return client; } diff --git a/packages/taikoon-ui/src/lib/wagmi/watcher.ts b/packages/taikoon-ui/src/lib/wagmi/watcher.ts index 97222b5bc98..16da0160cee 100644 --- a/packages/taikoon-ui/src/lib/wagmi/watcher.ts +++ b/packages/taikoon-ui/src/lib/wagmi/watcher.ts @@ -1,8 +1,8 @@ import { watchAccount } from '@wagmi/core'; -import { config, taiko } from '$wagmi-config'; +import { config } from '$wagmi-config'; -import { isSupportedChain } from '../../lib/chain'; +import { chainId, isSupportedChain } from '../../lib/chain'; import { refreshUserBalance } from '../../lib/util/balance'; import { account } from '../../stores/account'; import { switchChainModal } from '../../stores/modal'; @@ -24,7 +24,7 @@ export async function startWatching() { const isLocalHost = false; // window.location.hostname === 'localhost'; const isVercel = false; // window.location.hostname === 'taikoons-dev.vercel.app'; const isSupportedChainId = - isLocalHost || isVercel ? isSupportedChain(Number(data.chainId)) : data.chainId === taiko.id; + isLocalHost || isVercel ? isSupportedChain(Number(data.chainId)) : data.chainId === chainId; const isConnected = data.address !== undefined; if (!isSupportedChainId && isConnected) { diff --git a/packages/taikoon-ui/src/lib/whitelist/getProof.ts b/packages/taikoon-ui/src/lib/whitelist/getProof.ts index c0e29f57afe..97b6127f410 100644 --- a/packages/taikoon-ui/src/lib/whitelist/getProof.ts +++ b/packages/taikoon-ui/src/lib/whitelist/getProof.ts @@ -1,25 +1,17 @@ import { StandardMerkleTree } from '@openzeppelin/merkle-tree'; -import { getAccount } from '@wagmi/core'; -import getConfig from '$lib/wagmi/getConfig'; +import { chainId } from '$lib/chain'; import type { IAddress } from '../../types'; import { whitelist } from './index'; -export default function getProof(address?: IAddress): IAddress[] { - const { config, chainId } = getConfig(); - +export default function getProof(address: IAddress): IAddress[] { try { - if (!address) { - const account = getAccount(config); - if (!account.address) return []; - address = account.address; - } - const tree = StandardMerkleTree.load(whitelist[chainId]); for (const [i, [leafAddress]] of tree.entries()) { if (leafAddress.toString().toLowerCase() === address.toString().toLowerCase()) { const proof = tree.getProof(i); + return proof as IAddress[]; } } diff --git a/packages/taikoon-ui/src/lib/whitelist/index.ts b/packages/taikoon-ui/src/lib/whitelist/index.ts index 0351079005a..a27a93865ed 100644 --- a/packages/taikoon-ui/src/lib/whitelist/index.ts +++ b/packages/taikoon-ui/src/lib/whitelist/index.ts @@ -1,13 +1,9 @@ -import { hardhat, holesky } from '@wagmi/core/chains'; +import { taiko, taikoHekla } from '@wagmi/core/chains'; -import { taiko } from '$wagmi-config'; - -import { default as HardhatWhitelist } from '../../generated/whitelist/hardhat.json'; -import { default as HoleskyWhitelist } from '../../generated/whitelist/holesky.json'; +import { default as HeklaWhitelist } from '../../generated/whitelist/hekla.json'; import { default as TaikoWhitelist } from '../../generated/whitelist/mainnet.json'; export const whitelist: Record = { - [hardhat.id]: HardhatWhitelist, - [holesky.id]: HoleskyWhitelist, + [taikoHekla.id]: HeklaWhitelist, [taiko.id]: TaikoWhitelist, }; diff --git a/packages/taikoon-ui/src/wagmi.config.ts b/packages/taikoon-ui/src/wagmi.config.ts index d00d2d35f2f..19be8178306 100644 --- a/packages/taikoon-ui/src/wagmi.config.ts +++ b/packages/taikoon-ui/src/wagmi.config.ts @@ -1,31 +1,22 @@ import { injected, walletConnect } from '@wagmi/connectors'; import { createConfig, http, reconnect } from '@wagmi/core'; +import { taiko, taikoHekla } from 'viem/chains'; -//import { hardhat, holesky } from '@wagmi/core/chains'; import { PUBLIC_WALLETCONNECT_PROJECT_ID } from '$env/static/public'; +import { isDevelopmentEnv } from '$lib/util/isDevelopmentEnv'; const projectId = PUBLIC_WALLETCONNECT_PROJECT_ID; -import { chainIdToChain } from '$lib/chain/chains'; - -export const devnet = chainIdToChain(167001); -export const taiko = chainIdToChain(167000); - const baseConfig = { - chains: [ - // hardhat, - taiko, - // holesky - ], + chains: [isDevelopmentEnv ? taikoHekla : taiko], projectId, metadata: {}, batch: { multicall: true, }, transports: { - // [hardhat.id]: http('http://localhost:8545'), + [taikoHekla.id]: http('https://rpc.hekla.taiko.xyz'), [taiko.id]: http('https://rpc.mainnet.taiko.xyz'), - // [holesky.id]: http('https://1rpc.io/holesky'), }, } as const; diff --git a/packages/taikoon-ui/wagmi.config.ts b/packages/taikoon-ui/wagmi.config.ts index 919d9d5ad21..3483b2d877a 100644 --- a/packages/taikoon-ui/wagmi.config.ts +++ b/packages/taikoon-ui/wagmi.config.ts @@ -3,8 +3,7 @@ import { defineConfig } from '@wagmi/cli' import type { Abi, Address } from 'abitype' import { existsSync, mkdirSync,readFileSync, writeFileSync } from 'fs' -import * as HoleskyDeployment from '../nfts/deployments/taikoon/holesky.json' -import * as LocalhostDeployment from '../nfts/deployments/taikoon/localhost.json' +import * as HeklaDeployment from '../nfts/deployments/taikoon/hekla.json' import * as MainnetDeployment from '../nfts/deployments/taikoon/mainnet.json' import TaikoonToken from '../nfts/out/TaikoonToken.sol/TaikoonToken.json' @@ -30,8 +29,7 @@ function generateWhitelistJson() { mkdirSync(whitelistDir, { recursive: true }); } - generateNetworkWhitelist("hardhat"); - generateNetworkWhitelist("holesky"); + generateNetworkWhitelist("hekla"); generateNetworkWhitelist("mainnet"); } @@ -44,8 +42,7 @@ export default defineConfig({ { name: 'TaikoonToken', address: { - 31337: LocalhostDeployment.TaikoonToken as Address, - 17000: HoleskyDeployment.TaikoonToken as Address, + 167009: HeklaDeployment.TaikoonToken as Address, 167000: MainnetDeployment.TaikoonToken as Address, }, abi: TaikoonToken.abi as Abi, diff --git a/packages/ui-lib/package.json b/packages/ui-lib/package.json index cf904d9fb64..b9b2247a2aa 100644 --- a/packages/ui-lib/package.json +++ b/packages/ui-lib/package.json @@ -50,7 +50,7 @@ "@storybook/sveltekit": "^8.0.10", "@storybook/test": "^8.0.10", "@sveltejs/adapter-auto": "^3.0.0", - "@sveltejs/kit": "^2.0.0", + "@sveltejs/kit": "^2.5.21", "@sveltejs/package": "^2.0.0", "@sveltejs/vite-plugin-svelte": "^3.0.0", "@types/eslint": "^8.56.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0a2fa530d07..aa4a7afd155 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,75 +10,73 @@ importers: devDependencies: lefthook: specifier: ^1.6.10 - version: 1.6.10 + version: 1.6.18 prettier: specifier: ^3.2.5 - version: 3.2.5 + version: 3.3.2 packages/blobstorage: {} - packages/branding: {} - packages/bridge-ui: dependencies: '@moralisweb3/common-evm-utils': specifier: ^2.26.1 - version: 2.26.1(debug@4.3.4) + version: 2.26.2(debug@4.3.4) '@wagmi/connectors': specifier: ^4.3.1 - version: 4.3.5(@types/react@18.3.2)(@wagmi/core@2.9.3(@types/react@18.3.2)(bufferutil@4.0.8)(react@18.3.1)(typescript@5.4.5)(utf-8-validate@6.0.3)(viem@2.10.2(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8))(zod@3.23.8))(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react-i18next@13.5.0(i18next@22.5.1)(react-dom@18.3.1(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.3.2)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.3.2)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1)(rollup@4.17.2)(typescript@5.4.5)(utf-8-validate@6.0.3)(viem@2.10.2(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8))(zod@3.23.8) + version: 4.3.10(vnbhrjghrun7rfuxsawo7otej4) '@wagmi/core': specifier: ^2.8.1 - version: 2.9.3(@types/react@18.3.2)(bufferutil@4.0.8)(react@18.3.1)(typescript@5.4.5)(utf-8-validate@6.0.3)(viem@2.10.2(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8))(zod@3.23.8) + version: 2.10.2(@types/react@18.3.5)(bufferutil@4.0.8)(react@18.2.0)(typescript@5.4.3)(utf-8-validate@5.0.10)(viem@2.9.29(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.23.8))(zod@3.23.8) '@walletconnect/ethereum-provider': specifier: ^2.12.2 - version: 2.13.0(@types/react@18.3.2)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3) + version: 2.12.2(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(@types/react@18.3.5)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10) '@walletconnect/modal': specifier: ^2.6.2 - version: 2.6.2(@types/react@18.3.2)(react@18.3.1) + version: 2.6.2(@types/react@18.3.5)(react@18.2.0) '@web3modal/wagmi': specifier: ^4.1.11 - version: 4.1.11(@types/react@18.3.2)(@wagmi/connectors@4.3.5(@types/react@18.3.2)(@wagmi/core@2.9.3(@types/react@18.3.2)(bufferutil@4.0.8)(react@18.3.1)(typescript@5.4.5)(utf-8-validate@6.0.3)(viem@2.10.2(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8))(zod@3.23.8))(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react-i18next@13.5.0(i18next@22.5.1)(react-dom@18.3.1(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.3.2)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.3.2)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1)(rollup@4.17.2)(typescript@5.4.5)(utf-8-validate@6.0.3)(viem@2.10.2(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8))(zod@3.23.8))(@wagmi/core@2.9.3(@types/react@18.3.2)(bufferutil@4.0.8)(react@18.3.1)(typescript@5.4.5)(utf-8-validate@6.0.3)(viem@2.10.2(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8))(zod@3.23.8))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(viem@2.10.2(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8)) + version: 4.1.11(@types/react@18.3.5)(@wagmi/connectors@4.3.10(vnbhrjghrun7rfuxsawo7otej4))(@wagmi/core@2.10.2(@types/react@18.3.5)(bufferutil@4.0.8)(react@18.2.0)(typescript@5.4.3)(utf-8-validate@5.0.10)(viem@2.9.29(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.23.8))(zod@3.23.8))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(viem@2.9.29(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.23.8)) '@zerodevx/svelte-toast': specifier: ^0.9.5 - version: 0.9.5(svelte@4.2.16) + version: 0.9.5(svelte@4.2.17) axios: specifier: ^1.6.7 - version: 1.6.8(debug@4.3.4) + version: 1.6.7(debug@4.3.4) buffer: specifier: ^6.0.3 version: 6.0.3 debug: specifier: ^4.3.4 - version: 4.3.4 + version: 4.3.5 events: specifier: ^3.3.0 version: 3.3.0 moralis: specifier: ^2.26.1 - version: 2.26.1(debug@4.3.4) + version: 2.26.2(debug@4.3.4) object-hash: specifier: ^3.0.0 version: 3.0.0 svelte-i18n: specifier: ^4.0.0 - version: 4.0.0(svelte@4.2.16) + version: 4.0.0(svelte@4.2.17) viem: specifier: ^2.9.29 - version: 2.10.2(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8) + version: 2.9.29(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.23.8) devDependencies: '@playwright/test': specifier: ^1.43.1 - version: 1.44.0 + version: 1.43.1 '@sveltejs/adapter-auto': specifier: ^3.2.0 - version: 3.2.0(@sveltejs/kit@2.5.7(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.16)(vite@5.2.11(@types/node@20.12.11)(terser@5.31.0)))(svelte@4.2.16)(vite@5.2.11(@types/node@20.12.11)(terser@5.31.0))) + version: 3.2.0(@sveltejs/kit@2.5.27(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.17)(vite@5.2.11(@types/node@20.12.7)(terser@5.27.2)))(svelte@4.2.17)(vite@5.2.11(@types/node@20.12.7)(terser@5.27.2))) '@sveltejs/kit': - specifier: ^2.5.7 - version: 2.5.7(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.16)(vite@5.2.11(@types/node@20.12.11)(terser@5.31.0)))(svelte@4.2.16)(vite@5.2.11(@types/node@20.12.11)(terser@5.31.0)) + specifier: ^2.5.21 + version: 2.5.27(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.17)(vite@5.2.11(@types/node@20.12.7)(terser@5.27.2)))(svelte@4.2.17)(vite@5.2.11(@types/node@20.12.7)(terser@5.27.2)) '@sveltejs/vite-plugin-svelte': specifier: ^3.1.0 - version: 3.1.0(svelte@4.2.16)(vite@5.2.11(@types/node@20.12.11)(terser@5.31.0)) + version: 3.1.0(svelte@4.2.17)(vite@5.2.11(@types/node@20.12.7)(terser@5.27.2)) '@types/debug': specifier: ^4.1.12 version: 4.1.12 @@ -87,124 +85,124 @@ importers: version: 3.0.6 '@typescript-eslint/eslint-plugin': specifier: ^7.8.0 - version: 7.8.0(@typescript-eslint/parser@7.8.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5) + version: 7.9.0(@typescript-eslint/parser@7.9.0(eslint@8.56.0)(typescript@5.4.3))(eslint@8.56.0)(typescript@5.4.3) '@typescript-eslint/parser': specifier: ^7.8.0 - version: 7.8.0(eslint@8.57.0)(typescript@5.4.5) + version: 7.9.0(eslint@8.56.0)(typescript@5.4.3) '@vitest/coverage-v8': specifier: ^1.4.0 - version: 1.6.0(vitest@1.6.0(@types/node@20.12.11)(jsdom@24.0.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))(terser@5.31.0)) + version: 1.4.0(vitest@1.6.0(@types/node@20.12.7)(jsdom@24.0.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(terser@5.27.2)) '@wagmi/cli': specifier: ^2.1.4 - version: 2.1.4(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3) + version: 2.1.4(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10) abitype: specifier: ^1.0.2 - version: 1.0.2(typescript@5.4.5)(zod@3.23.8) + version: 1.0.2(typescript@5.4.3)(zod@3.23.8) ajv: specifier: ^8.12.0 - version: 8.13.0 + version: 8.12.0 autoprefixer: specifier: ^10.4.18 - version: 10.4.19(postcss@8.4.38) + version: 10.4.18(postcss@8.4.38) daisyui: specifier: ^4.10.3 - version: 4.11.1(postcss@8.4.38) + version: 4.12.10(postcss@8.4.39) dotenv: specifier: ^16.4.5 version: 16.4.5 eslint: specifier: ^8.56.0 - version: 8.57.0 + version: 8.56.0 eslint-config-prettier: specifier: ^9.1.0 - version: 9.1.0(eslint@8.57.0) + version: 9.1.0(eslint@8.56.0) eslint-plugin-simple-import-sort: specifier: ^12.0.0 - version: 12.1.0(eslint@8.57.0) + version: 12.0.0(eslint@8.56.0) eslint-plugin-svelte: specifier: ^2.38.0 - version: 2.38.0(eslint@8.57.0)(svelte@4.2.16)(ts-node@10.9.2(@types/node@20.12.11)(typescript@5.4.5)) + version: 2.38.0(eslint@8.56.0)(svelte@4.2.17)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.3)) ethereum-address: specifier: ^0.0.4 version: 0.0.4 jsdom: specifier: ^24.0.0 - version: 24.0.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) + version: 24.0.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) lokijs: specifier: ^1.5.12 version: 1.5.12 postcss: specifier: ^8.4.38 - version: 8.4.38 + version: 8.4.39 prettier: specifier: ^3.2.5 - version: 3.2.5 + version: 3.3.2 prettier-plugin-svelte: specifier: ^3.2.3 - version: 3.2.3(prettier@3.2.5)(svelte@4.2.16) + version: 3.2.3(prettier@3.2.5)(svelte@4.2.17) svelte: specifier: ^4.2.15 - version: 4.2.16 + version: 4.2.17 svelte-check: specifier: ^3.7.1 - version: 3.7.1(@babel/core@7.24.5)(postcss-load-config@4.0.2(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.12.11)(typescript@5.4.5)))(postcss@8.4.38)(svelte@4.2.16) + version: 3.7.1(@babel/core@7.25.2)(postcss-load-config@4.0.2(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.3)))(postcss@8.4.38)(svelte@4.2.17) tailwindcss: specifier: ^3.4.3 - version: 3.4.3(ts-node@10.9.2(@types/node@20.12.11)(typescript@5.4.5)) + version: 3.4.3(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.3)) ts-morph: specifier: ^19.0.0 version: 19.0.0 tslib: specifier: ^2.6.2 - version: 2.6.2 + version: 2.6.3 typescript: specifier: ^5.4.3 - version: 5.4.5 + version: 5.4.3 vite: specifier: ^5.2.10 - version: 5.2.11(@types/node@20.12.11)(terser@5.31.0) + version: 5.2.11(@types/node@20.12.7)(terser@5.27.2) vite-tsconfig-paths: specifier: ^4.3.2 - version: 4.3.2(typescript@5.4.5)(vite@5.2.11(@types/node@20.12.11)(terser@5.31.0)) + version: 4.3.2(typescript@5.4.3)(vite@5.2.11(@types/node@20.12.7)(terser@5.27.2)) vitest: specifier: ^1.5.3 - version: 1.6.0(@types/node@20.12.11)(jsdom@24.0.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))(terser@5.31.0) + version: 1.6.0(@types/node@20.12.7)(jsdom@24.0.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(terser@5.27.2) vitest-fetch-mock: specifier: ^0.2.2 - version: 0.2.2(encoding@0.1.13)(vitest@1.6.0(@types/node@20.12.11)(jsdom@24.0.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))(terser@5.31.0)) + version: 0.2.2(encoding@0.1.13)(vitest@1.6.0(@types/node@20.12.7)(jsdom@24.0.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(terser@5.27.2)) vitest-mock-extended: specifier: 1.3.1 - version: 1.3.1(typescript@5.4.5)(vitest@1.6.0(@types/node@20.12.11)(jsdom@24.0.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))(terser@5.31.0)) + version: 1.3.1(typescript@5.4.3)(vitest@1.6.0(@types/node@20.12.7)(jsdom@24.0.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(terser@5.27.2)) packages/docs-site: dependencies: '@astrojs/check': - specifier: ^0.6.0 - version: 0.6.0(prettier@3.2.5)(typescript@5.4.5) + specifier: ^0.8.0 + version: 0.8.3(prettier@3.2.5)(typescript@5.4.5) '@astrojs/starlight': - specifier: ^0.22.2 - version: 0.22.2(astro@4.8.3(@types/node@20.12.11)(terser@5.31.0)(typescript@5.4.5)) + specifier: ^0.25.0 + version: 0.25.5(astro@4.15.6(@types/node@20.12.7)(rollup@4.21.3)(terser@5.27.2)(typescript@5.4.5)) astro: - specifier: ^4.8.3 - version: 4.8.3(@types/node@20.12.11)(terser@5.31.0)(typescript@5.4.5) + specifier: ^4.11.5 + version: 4.15.6(@types/node@20.12.7)(rollup@4.21.3)(terser@5.27.2)(typescript@5.4.5) astro-og-canvas: specifier: ^0.5.0 - version: 0.5.0(astro@4.8.3(@types/node@20.12.11)(terser@5.31.0)(typescript@5.4.5)) + version: 0.5.0(astro@4.15.6(@types/node@20.12.7)(rollup@4.21.3)(terser@5.27.2)(typescript@5.4.5)) canvaskit-wasm: specifier: ^0.39.1 version: 0.39.1 sharp: specifier: ^0.33.3 - version: 0.33.3 + version: 0.33.4 starlight-links-validator: specifier: ^0.8.0 - version: 0.8.0(@astrojs/starlight@0.22.2(astro@4.8.3(@types/node@20.12.11)(terser@5.31.0)(typescript@5.4.5)))(astro@4.8.3(@types/node@20.12.11)(terser@5.31.0)(typescript@5.4.5)) + version: 0.8.0(@astrojs/starlight@0.25.5(astro@4.15.6(@types/node@20.12.7)(rollup@4.21.3)(terser@5.27.2)(typescript@5.4.5)))(astro@4.15.6(@types/node@20.12.7)(rollup@4.21.3)(terser@5.27.2)(typescript@5.4.5)) starlight-openapi: specifier: ^0.6.3 - version: 0.6.3(@astrojs/markdown-remark@5.1.0)(@astrojs/starlight@0.22.2(astro@4.8.3(@types/node@20.12.11)(terser@5.31.0)(typescript@5.4.5)))(astro@4.8.3(@types/node@20.12.11)(terser@5.31.0)(typescript@5.4.5))(openapi-types@12.1.3) + version: 0.6.3(@astrojs/markdown-remark@5.2.0)(@astrojs/starlight@0.25.5(astro@4.15.6(@types/node@20.12.7)(rollup@4.21.3)(terser@5.27.2)(typescript@5.4.5)))(astro@4.15.6(@types/node@20.12.7)(rollup@4.21.3)(terser@5.27.2)(typescript@5.4.5))(openapi-types@12.1.3) typescript: specifier: ^5.4.5 - version: 5.4.5 + version: 5.5.3 packages/eventindexer: {} @@ -216,104 +214,113 @@ importers: dependencies: '@wagmi/core': specifier: ^2.8.0 - version: 2.9.3(@types/react@18.3.2)(bufferutil@4.0.8)(react@18.3.1)(typescript@5.4.5)(utf-8-validate@6.0.3)(viem@2.10.2(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8))(zod@3.23.8) + version: 2.8.0(@types/react@18.3.5)(bufferutil@4.0.8)(react@18.2.0)(typescript@5.4.3)(utf-8-validate@6.0.3)(viem@2.9.29(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@6.0.3)(zod@3.23.8))(zod@3.23.8) axios: specifier: ^1.6.7 - version: 1.6.8(debug@4.3.4) + version: 1.6.7(debug@4.3.4) debug: specifier: ^4.3.4 - version: 4.3.4 + version: 4.3.5 svelte-i18n: specifier: ^4.0.0 - version: 4.0.0(svelte@4.2.16) + version: 4.0.0(svelte@4.2.13) viem: specifier: ^2.9.29 - version: 2.10.2(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8) + version: 2.9.29(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@6.0.3)(zod@3.23.8) devDependencies: '@playwright/test': specifier: ^1.43.1 - version: 1.44.0 + version: 1.43.1 '@sveltejs/adapter-auto': specifier: ^3.2.0 - version: 3.2.0(@sveltejs/kit@2.5.7(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.16)(vite@4.5.3(@types/node@20.12.11)(terser@5.31.0)))(svelte@4.2.16)(vite@4.5.3(@types/node@20.12.11)(terser@5.31.0))) + version: 3.2.0(@sveltejs/kit@2.5.27(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.13)(vite@4.5.3(@types/node@20.12.7)(terser@5.27.2)))(svelte@4.2.13)(vite@4.5.3(@types/node@20.12.7)(terser@5.27.2))) '@sveltejs/kit': - specifier: ^2.5.5 - version: 2.5.7(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.16)(vite@4.5.3(@types/node@20.12.11)(terser@5.31.0)))(svelte@4.2.16)(vite@4.5.3(@types/node@20.12.11)(terser@5.31.0)) + specifier: ^2.5.21 + version: 2.5.27(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.13)(vite@4.5.3(@types/node@20.12.7)(terser@5.27.2)))(svelte@4.2.13)(vite@4.5.3(@types/node@20.12.7)(terser@5.27.2)) '@sveltejs/vite-plugin-svelte': specifier: ^3.1.0 - version: 3.1.0(svelte@4.2.16)(vite@4.5.3(@types/node@20.12.11)(terser@5.31.0)) + version: 3.1.0(svelte@4.2.13)(vite@4.5.3(@types/node@20.12.7)(terser@5.27.2)) '@tailwindcss/nesting': specifier: 0.0.0-insiders.565cd3e - version: 0.0.0-insiders.565cd3e(postcss@8.4.38) + version: 0.0.0-insiders.565cd3e(postcss@8.4.39) '@typescript-eslint/eslint-plugin': specifier: ^7.4.0 - version: 7.8.0(@typescript-eslint/parser@7.8.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5) + version: 7.4.0(@typescript-eslint/parser@7.7.0(eslint@8.56.0)(typescript@5.4.3))(eslint@8.56.0)(typescript@5.4.3) '@typescript-eslint/parser': specifier: ^7.7.0 - version: 7.8.0(eslint@8.57.0)(typescript@5.4.5) + version: 7.7.0(eslint@8.56.0)(typescript@5.4.3) autoprefixer: specifier: ^10.4.18 - version: 10.4.19(postcss@8.4.38) + version: 10.4.18(postcss@8.4.38) daisyui: specifier: ^4.10.1 - version: 4.11.1(postcss@8.4.38) + version: 4.10.1(postcss@8.4.38) eslint: specifier: ^8.56.0 - version: 8.57.0 + version: 8.56.0 eslint-config-prettier: specifier: ^9.1.0 - version: 9.1.0(eslint@8.57.0) + version: 9.1.0(eslint@8.56.0) eslint-plugin-svelte: specifier: ^2.38.0 - version: 2.38.0(eslint@8.57.0)(svelte@4.2.16)(ts-node@10.9.2(@types/node@20.12.11)(typescript@5.4.5)) + version: 2.38.0(eslint@8.56.0)(svelte@4.2.13)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.3)) postcss: specifier: ^8.4.38 - version: 8.4.38 + version: 8.4.39 postcss-import: specifier: ^16.1.0 - version: 16.1.0(postcss@8.4.38) + version: 16.1.0(postcss@8.4.39) postcss-nesting: specifier: ^12.1.0 - version: 12.1.2(postcss@8.4.38) + version: 12.1.0(postcss@8.4.38) prettier: specifier: ^3.2.5 - version: 3.2.5 + version: 3.3.2 prettier-plugin-svelte: specifier: ^3.2.2 - version: 3.2.3(prettier@3.2.5)(svelte@4.2.16) + version: 3.2.2(prettier@3.2.5)(svelte@4.2.13) svelte: specifier: ^4.2.13 - version: 4.2.16 + version: 4.2.13 svelte-check: specifier: ^3.7.1 - version: 3.7.1(@babel/core@7.24.5)(postcss-load-config@4.0.2(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.12.11)(typescript@5.4.5)))(postcss@8.4.38)(svelte@4.2.16) + version: 3.7.1(@babel/core@7.25.2)(postcss-load-config@4.0.2(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.3)))(postcss@8.4.38)(svelte@4.2.13) tailwindcss: specifier: ^3.4.3 - version: 3.4.3(ts-node@10.9.2(@types/node@20.12.11)(typescript@5.4.5)) + version: 3.4.3(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.3)) tslib: specifier: ^2.6.2 - version: 2.6.2 + version: 2.6.3 typescript: specifier: ^5.4.3 - version: 5.4.5 + version: 5.4.3 vite: specifier: ^4.5.3 - version: 4.5.3(@types/node@20.12.11)(terser@5.31.0) + version: 4.5.3(@types/node@20.12.7)(terser@5.27.2) vite-tsconfig-paths: specifier: ^4.3.2 - version: 4.3.2(typescript@5.4.5)(vite@4.5.3(@types/node@20.12.11)(terser@5.31.0)) + version: 4.3.2(typescript@5.4.3)(vite@4.5.3(@types/node@20.12.7)(terser@5.27.2)) vitest: specifier: ^1.5.0 - version: 1.6.0(@types/node@20.12.11)(jsdom@24.0.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))(terser@5.31.0) + version: 1.5.0(@types/node@20.12.7)(jsdom@24.0.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))(terser@5.27.2) + + packages/monitors: + devDependencies: + '@openzeppelin/defender-as-code': + specifier: ^3.0.1 + version: 3.0.1(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)(web3-core-helpers@1.10.4)(web3-core@1.10.4(encoding@0.1.13))(web3-utils@1.10.4)(web3@1.10.4(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)) + serverless: + specifier: 4.4.3 + version: 4.4.3 packages/nfts: dependencies: '@aws-sdk/client-s3': specifier: ^3.574.0 - version: 3.575.0 + version: 3.577.0 '@aws-sdk/lib-storage': specifier: ^3.574.0 - version: 3.575.0(@aws-sdk/client-s3@3.575.0) + version: 3.578.0(@aws-sdk/client-s3@3.577.0) '@openzeppelin/contracts': specifier: 5.0.2 version: 5.0.2 @@ -328,7 +335,7 @@ importers: version: link:../supplementary-contracts convert-csv-to-json: specifier: ^2.46.0 - version: 2.46.0 + version: 2.48.0 dotenv: specifier: ^16.4.5 version: 16.4.5 @@ -337,13 +344,13 @@ importers: version: https://codeload.github.com/dapphub/ds-test/tar.gz/e282159d5170298eb2455a6c05280ab5a73a4ef0 forge-std: specifier: github:foundry-rs/forge-std - version: https://codeload.github.com/foundry-rs/forge-std/tar.gz/52715a217dc51d0de15877878ab8213f6cbbbab5 + version: https://codeload.github.com/foundry-rs/forge-std/tar.gz/8f24d6b04c92975e0795b5868aa0d783251cdeaa ipfs-http-client: specifier: ^60.0.1 - version: 60.0.1(encoding@0.1.13) + version: 60.0.1 merkletreejs: - specifier: ^0.3.11 - version: 0.3.11 + specifier: ^0.4.0 + version: 0.4.0 murky: specifier: github:dmfxyz/murky version: https://codeload.github.com/dmfxyz/murky/tar.gz/5feccd1253d7da820f7cccccdedf64471025455d @@ -352,7 +359,7 @@ importers: version: p256-verifier#v0.1.0@https://codeload.github.com/taikoxyz/p256-verifier/tar.gz/6ef45b117642786b08a37b4c37c6a6ce151166da sharp: specifier: ^0.33.3 - version: 0.33.3 + version: 0.33.4 solady: specifier: github:Vectorized/solady#v0.0.167 version: https://codeload.github.com/Vectorized/solady/tar.gz/de0f336d2033d04e0f77c923d639c7fbffd48b6d @@ -362,49 +369,49 @@ importers: devDependencies: '@types/node': specifier: ^20.11.30 - version: 20.12.11 + version: 20.12.7 '@typescript-eslint/eslint-plugin': specifier: ^7.4.0 - version: 7.8.0(@typescript-eslint/parser@7.8.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5) + version: 7.9.0(@typescript-eslint/parser@7.9.0(eslint@8.56.0)(typescript@5.4.5))(eslint@8.56.0)(typescript@5.4.5) '@typescript-eslint/parser': specifier: ^7.7.0 - version: 7.8.0(eslint@8.57.0)(typescript@5.4.5) + version: 7.9.0(eslint@8.56.0)(typescript@5.4.5) eslint: specifier: ^8.51.0 - version: 8.57.0 + version: 8.56.0 eslint-config-prettier: specifier: ^9.1.0 - version: 9.1.0(eslint@8.57.0) + version: 9.1.0(eslint@8.56.0) eslint-config-standard: specifier: ^17.1.0 - version: 17.1.0(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.8.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0))(eslint-plugin-n@16.6.2(eslint@8.57.0))(eslint-plugin-promise@6.1.1(eslint@8.57.0))(eslint@8.57.0) + version: 17.1.0(eslint-plugin-import@2.29.0(@typescript-eslint/parser@7.9.0(eslint@8.56.0)(typescript@5.4.5))(eslint@8.56.0))(eslint-plugin-n@16.6.2(eslint@8.56.0))(eslint-plugin-promise@6.1.1(eslint@8.56.0))(eslint@8.56.0) eslint-plugin-import: specifier: ^2.28.1 - version: 2.29.1(@typescript-eslint/parser@7.8.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0) + version: 2.29.0(@typescript-eslint/parser@7.9.0(eslint@8.56.0)(typescript@5.4.5))(eslint@8.56.0) eslint-plugin-node: specifier: ^11.1.0 - version: 11.1.0(eslint@8.57.0) + version: 11.1.0(eslint@8.56.0) eslint-plugin-prettier: specifier: ^5.1.3 - version: 5.1.3(@types/eslint@8.56.10)(eslint-config-prettier@9.1.0(eslint@8.57.0))(eslint@8.57.0)(prettier@3.2.5) + version: 5.1.3(@types/eslint@8.56.10)(eslint-config-prettier@9.1.0(eslint@8.56.0))(eslint@8.56.0)(prettier@3.2.5) eslint-plugin-promise: specifier: ^6.1.1 - version: 6.1.1(eslint@8.57.0) + version: 6.1.1(eslint@8.56.0) ethers: specifier: ^5.7.2 - version: 5.7.2(bufferutil@4.0.8)(utf-8-validate@6.0.3) + version: 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) solc: specifier: 0.8.24 version: 0.8.24 solhint: specifier: ^4.5.4 - version: 4.5.4(typescript@5.4.5) + version: 4.5.4(typescript@5.5.3) ts-node: specifier: ^10.9.2 - version: 10.9.2(@types/node@20.12.11)(typescript@5.4.5) + version: 10.9.2(@types/node@20.12.7)(typescript@5.4.5) typescript: specifier: ^5.2.2 - version: 5.4.5 + version: 5.5.3 packages/protocol: dependencies: @@ -417,64 +424,79 @@ importers: ds-test: specifier: github:dapphub/ds-test#e282159d5170298eb2455a6c05280ab5a73a4ef0 version: https://codeload.github.com/dapphub/ds-test/tar.gz/e282159d5170298eb2455a6c05280ab5a73a4ef0 + eigenlayer-contracts: + specifier: github:Layr-labs/eigenlayer-contracts#dev + version: https://codeload.github.com/Layr-labs/eigenlayer-contracts/tar.gz/30040aa273edeefe83333fa9183a0a26a84cebf0(hardhat@2.22.13(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.3))(typescript@5.4.3)(utf-8-validate@5.0.10)) + eigenlayer-middleware: + specifier: github:layr-Labs/eigenlayer-middleware#mainnet + version: https://codeload.github.com/layr-Labs/eigenlayer-middleware/tar.gz/7d49b5181b09198ed275783453aa082bb3766990 forge-std: specifier: github:foundry-rs/forge-std#v1.7.5 version: https://codeload.github.com/foundry-rs/forge-std/tar.gz/36c303b7ffdd842d06b1ec2744c9b9b5fb3083f3 merkletreejs: - specifier: ^0.3.11 - version: 0.3.11 + specifier: ^0.4.0 + version: 0.4.0 + optimism: + specifier: github:ethereum-optimism/optimism#v1.8.0 + version: https://codeload.github.com/ethereum-optimism/optimism/tar.gz/ab3a54febb36398539fd3b849c222b7e70169dc8 p256-verifier: specifier: github:taikoxyz/p256-verifier#v0.1.0 version: p256-verifier#v0.1.0@https://codeload.github.com/taikoxyz/p256-verifier/tar.gz/6ef45b117642786b08a37b4c37c6a6ce151166da + risc0-ethereum: + specifier: github:risc0/risc0-ethereum#v1.1.2 + version: risc0-ethereum#v1.1.2@https://codeload.github.com/risc0/risc0-ethereum/tar.gz/b8a14213d92fff07dacda993804e7edb7946ca58 solady: - specifier: github:Vectorized/solady#v0.0.167 - version: https://codeload.github.com/Vectorized/solady/tar.gz/de0f336d2033d04e0f77c923d639c7fbffd48b6d + specifier: github:Vectorized/solady#v0.0.231 + version: https://codeload.github.com/Vectorized/solady/tar.gz/a12a2575c899a328c1bafdada632dabbff27cf6b + sp1-contracts: + specifier: github:succinctlabs/sp1-contracts#v3.0.0 + version: sp1-contracts#v3.0.0@https://codeload.github.com/succinctlabs/sp1-contracts/tar.gz/1c4acaeab86789995ae5c6baced66f81e4a57f4d devDependencies: '@types/node': specifier: ^20.11.30 - version: 20.12.11 + version: 20.12.7 '@typescript-eslint/eslint-plugin': specifier: ^7.4.0 - version: 7.8.0(@typescript-eslint/parser@7.8.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5) + version: 7.4.0(@typescript-eslint/parser@7.7.0(eslint@8.55.0)(typescript@5.4.3))(eslint@8.55.0)(typescript@5.4.3) '@typescript-eslint/parser': specifier: ^7.7.0 - version: 7.8.0(eslint@8.57.0)(typescript@5.4.5) + version: 7.7.0(eslint@8.55.0)(typescript@5.4.3) eslint: specifier: ^8.51.0 - version: 8.57.0 + version: 8.55.0 eslint-config-prettier: specifier: ^9.1.0 - version: 9.1.0(eslint@8.57.0) + version: 9.1.0(eslint@8.55.0) eslint-config-standard: specifier: ^17.1.0 - version: 17.1.0(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.8.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0))(eslint-plugin-n@16.6.2(eslint@8.57.0))(eslint-plugin-promise@6.1.1(eslint@8.57.0))(eslint@8.57.0) + version: 17.1.0(eslint-plugin-import@2.29.0(@typescript-eslint/parser@7.7.0(eslint@8.55.0)(typescript@5.4.3))(eslint@8.55.0))(eslint-plugin-n@16.6.2(eslint@8.55.0))(eslint-plugin-promise@6.1.1(eslint@8.55.0))(eslint@8.55.0) eslint-plugin-import: specifier: ^2.28.1 - version: 2.29.1(@typescript-eslint/parser@7.8.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0) + version: 2.29.0(@typescript-eslint/parser@7.7.0(eslint@8.55.0)(typescript@5.4.3))(eslint@8.55.0) eslint-plugin-node: specifier: ^11.1.0 - version: 11.1.0(eslint@8.57.0) + version: 11.1.0(eslint@8.55.0) eslint-plugin-prettier: specifier: ^5.1.3 - version: 5.1.3(@types/eslint@8.56.10)(eslint-config-prettier@9.1.0(eslint@8.57.0))(eslint@8.57.0)(prettier@3.2.5) + version: 5.1.3(@types/eslint@8.56.10)(eslint-config-prettier@9.1.0(eslint@8.55.0))(eslint@8.55.0)(prettier@3.2.5) eslint-plugin-promise: specifier: ^6.1.1 - version: 6.1.1(eslint@8.57.0) + version: 6.1.1(eslint@8.55.0) ethers: specifier: ^5.7.2 - version: 5.7.2(bufferutil@4.0.8)(utf-8-validate@6.0.3) + version: 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) solc: specifier: 0.8.24 version: 0.8.24 solhint: - specifier: ^5.0.1 - version: 5.0.1(typescript@5.4.5) + specifier: ^5.0.3 + version: 5.0.3(typescript@5.4.3) ts-node: specifier: ^10.9.2 - version: 10.9.2(@types/node@20.12.11)(typescript@5.4.5) + version: 10.9.2(@types/node@20.12.7)(typescript@5.4.3) typescript: specifier: ^5.2.2 - version: 5.4.5 + version: 5.4.3 packages/relayer: {} @@ -485,65 +507,65 @@ importers: version: 1.0.6 '@wagmi/cli': specifier: ^2.1.8 - version: 2.1.8(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3) + version: 2.1.15(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10) '@wagmi/connectors': specifier: ^5.0.6 - version: 5.0.6(@types/react@18.3.2)(@wagmi/core@2.10.4(@types/react@18.3.2)(bufferutil@4.0.8)(react@18.3.1)(typescript@5.4.5)(utf-8-validate@6.0.3)(viem@2.13.1(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8))(zod@3.23.8))(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react-i18next@13.5.0(i18next@22.5.1)(react-dom@18.3.1(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.3.2)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.3.2)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1)(rollup@4.17.2)(typescript@5.4.5)(utf-8-validate@6.0.3)(viem@2.13.1(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8))(zod@3.23.8) + version: 5.1.10(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(@types/react@18.3.5)(@wagmi/core@2.13.5(@types/react@18.3.5)(react@18.2.0)(typescript@5.4.5)(viem@2.21.7(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8)))(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))(react@18.2.0)(rollup@4.21.3)(typescript@5.4.5)(utf-8-validate@5.0.10)(viem@2.21.7(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8))(zod@3.23.8) '@wagmi/core': specifier: ^2.10.4 - version: 2.10.4(@types/react@18.3.2)(bufferutil@4.0.8)(react@18.3.1)(typescript@5.4.5)(utf-8-validate@6.0.3)(viem@2.13.1(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8))(zod@3.23.8) + version: 2.13.5(@types/react@18.3.5)(react@18.2.0)(typescript@5.4.5)(viem@2.21.7(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8)) '@web3modal/common': - specifier: ^4.2.2 - version: 4.2.2 + specifier: ^5.0.11 + version: 5.1.8 '@web3modal/ui': specifier: ^4.2.2 - version: 4.2.2 + version: 4.2.3 '@web3modal/wagmi': specifier: ^4.2.2 - version: 4.2.2(@types/react@18.3.2)(@wagmi/connectors@5.0.6(@types/react@18.3.2)(@wagmi/core@2.10.4(@types/react@18.3.2)(bufferutil@4.0.8)(react@18.3.1)(typescript@5.4.5)(utf-8-validate@6.0.3)(viem@2.13.1(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8))(zod@3.23.8))(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react-i18next@13.5.0(i18next@22.5.1)(react-dom@18.3.1(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.3.2)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.3.2)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1)(rollup@4.17.2)(typescript@5.4.5)(utf-8-validate@6.0.3)(viem@2.13.1(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8))(zod@3.23.8))(@wagmi/core@2.10.4(@types/react@18.3.2)(bufferutil@4.0.8)(react@18.3.1)(typescript@5.4.5)(utf-8-validate@6.0.3)(viem@2.13.1(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8))(zod@3.23.8))(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(utf-8-validate@6.0.3)(viem@2.13.1(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8)) + version: 4.2.3(hoyagxhmve75vyxjsj4tjya6zm) '@zerodevx/svelte-toast': specifier: ^0.9.5 - version: 0.9.5(svelte@4.2.16) + version: 0.9.5(svelte@4.2.17) autoprefixer: specifier: ^10.4.19 - version: 10.4.19(postcss@8.4.38) + version: 10.4.19(postcss@8.4.39) daisyui: specifier: ^4.10.1 - version: 4.11.1(postcss@8.4.38) + version: 4.12.10(postcss@8.4.39) dayjs: specifier: ^1.11.10 - version: 1.11.11 + version: 1.11.10 debug: specifier: ^4.3.4 - version: 4.3.4 + version: 4.3.5 minidenticons: specifier: ^4.2.1 version: 4.2.1 postcss: specifier: ^8.4.38 - version: 8.4.38 + version: 8.4.39 tailwindcss: specifier: ^3.4.3 - version: 3.4.3(ts-node@10.9.2(@types/node@20.12.11)(typescript@5.4.5)) + version: 3.4.3(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.5)) viem: specifier: ^2.13.1 - version: 2.13.1(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8) + version: 2.21.7(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8) devDependencies: '@chromatic-com/storybook': specifier: ^1.3.1 - version: 1.3.4(react@18.3.1) + version: 1.9.0(react@18.2.0) '@playwright/test': specifier: ^1.28.1 - version: 1.44.0 + version: 1.43.1 '@sveltejs/adapter-auto': specifier: ^3.0.0 - version: 3.2.0(@sveltejs/kit@2.5.7(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.16)(vite@5.2.11(@types/node@20.12.11)(terser@5.31.0)))(svelte@4.2.16)(vite@5.2.11(@types/node@20.12.11)(terser@5.31.0))) + version: 3.2.0(@sveltejs/kit@2.5.27(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.17)(vite@5.2.11(@types/node@20.12.7)(terser@5.27.2)))(svelte@4.2.17)(vite@5.2.11(@types/node@20.12.7)(terser@5.27.2))) '@sveltejs/kit': - specifier: ^2.0.0 - version: 2.5.7(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.16)(vite@5.2.11(@types/node@20.12.11)(terser@5.31.0)))(svelte@4.2.16)(vite@5.2.11(@types/node@20.12.11)(terser@5.31.0)) + specifier: ^2.5.21 + version: 2.5.27(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.17)(vite@5.2.11(@types/node@20.12.7)(terser@5.27.2)))(svelte@4.2.17)(vite@5.2.11(@types/node@20.12.7)(terser@5.27.2)) '@sveltejs/vite-plugin-svelte': specifier: ^3.0.0 - version: 3.1.0(svelte@4.2.16)(vite@5.2.11(@types/node@20.12.11)(terser@5.31.0)) + version: 3.1.0(svelte@4.2.17)(vite@5.2.11(@types/node@20.12.7)(terser@5.27.2)) '@taiko/ui-lib': specifier: workspace:* version: link:../ui-lib @@ -555,79 +577,79 @@ importers: version: 29.5.12 '@types/node': specifier: ^20.12.7 - version: 20.12.11 + version: 20.12.7 '@typescript-eslint/eslint-plugin': specifier: ^7.0.0 - version: 7.8.0(@typescript-eslint/parser@7.8.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5) + version: 7.9.0(@typescript-eslint/parser@7.9.0(eslint@8.56.0)(typescript@5.4.5))(eslint@8.56.0)(typescript@5.4.5) '@typescript-eslint/parser': specifier: ^7.0.0 - version: 7.8.0(eslint@8.57.0)(typescript@5.4.5) + version: 7.9.0(eslint@8.56.0)(typescript@5.4.5) convert-csv-to-json: specifier: ^2.44.0 - version: 2.46.0 + version: 2.48.0 dotenv: specifier: ^16.4.5 version: 16.4.5 eslint: specifier: ^8.56.0 - version: 8.57.0 + version: 8.56.0 eslint-config-prettier: specifier: ^9.1.0 - version: 9.1.0(eslint@8.57.0) + version: 9.1.0(eslint@8.56.0) eslint-plugin-simple-import-sort: specifier: ^12.0.0 - version: 12.1.0(eslint@8.57.0) + version: 12.0.0(eslint@8.56.0) eslint-plugin-storybook: specifier: ^0.8.0 - version: 0.8.0(eslint@8.57.0)(typescript@5.4.5) + version: 0.8.0(eslint@8.56.0)(typescript@5.4.5) eslint-plugin-svelte: specifier: ^2.38.0 - version: 2.38.0(eslint@8.57.0)(svelte@4.2.16)(ts-node@10.9.2(@types/node@20.12.11)(typescript@5.4.5)) + version: 2.38.0(eslint@8.56.0)(svelte@4.2.17)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.5)) p-map: specifier: ^7.0.2 version: 7.0.2 prettier: specifier: ^3.1.1 - version: 3.2.5 + version: 3.3.2 prettier-plugin-svelte: specifier: ^3.1.2 - version: 3.2.3(prettier@3.2.5)(svelte@4.2.16) + version: 3.2.3(prettier@3.2.5)(svelte@4.2.17) raw-body: specifier: ^2.5.2 version: 2.5.2 svelte: specifier: ^4.2.7 - version: 4.2.16 + version: 4.2.17 svelte-check: specifier: ^3.7.1 - version: 3.7.1(@babel/core@7.24.5)(postcss-load-config@4.0.2(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.12.11)(typescript@5.4.5)))(postcss@8.4.38)(svelte@4.2.16) + version: 3.7.1(@babel/core@7.25.2)(postcss-load-config@4.0.2(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.5)))(postcss@8.4.38)(svelte@4.2.17) svelte-copy: specifier: ^1.4.2 - version: 1.4.2(svelte@4.2.16) + version: 1.4.2(svelte@4.2.17) svelte-i18n: specifier: ^4.0.0 - version: 4.0.0(svelte@4.2.16) + version: 4.0.0(svelte@4.2.17) svelte-scrolling: specifier: ^1.4.0 - version: 1.4.0(svelte@4.2.16) + version: 1.4.0(svelte@4.2.17) tailwindcss-image-rendering: specifier: ^1.0.2 version: 1.0.2 tslib: specifier: ^2.4.1 - version: 2.6.2 + version: 2.6.3 typescript: specifier: ^5.0.0 - version: 5.4.5 + version: 5.5.3 vite: specifier: ^5.0.3 - version: 5.2.11(@types/node@20.12.11)(terser@5.31.0) + version: 5.2.11(@types/node@20.12.7)(terser@5.27.2) vite-tsconfig-paths: specifier: ^4.3.2 - version: 4.3.2(typescript@5.4.5)(vite@5.2.11(@types/node@20.12.11)(terser@5.31.0)) + version: 4.3.2(typescript@5.4.5)(vite@5.2.11(@types/node@20.12.7)(terser@5.27.2)) vitest: specifier: ^1.2.0 - version: 1.6.0(@types/node@20.12.11)(jsdom@24.0.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))(terser@5.31.0) + version: 1.6.0(@types/node@20.12.7)(jsdom@24.0.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(terser@5.27.2) which: specifier: ^4.0.0 version: 4.0.0 @@ -647,8 +669,8 @@ importers: specifier: github:foundry-rs/forge-std#v1.7.5 version: https://codeload.github.com/foundry-rs/forge-std/tar.gz/36c303b7ffdd842d06b1ec2744c9b9b5fb3083f3 merkletreejs: - specifier: ^0.3.11 - version: 0.3.11 + specifier: ^0.4.0 + version: 0.4.0 p256-verifier: specifier: github:taikoxyz/p256-verifier#v0.1.0 version: p256-verifier#v0.1.0@https://codeload.github.com/taikoxyz/p256-verifier/tar.gz/6ef45b117642786b08a37b4c37c6a6ce151166da @@ -658,49 +680,49 @@ importers: devDependencies: '@types/node': specifier: ^20.11.30 - version: 20.12.11 + version: 20.12.7 '@typescript-eslint/eslint-plugin': specifier: ^7.4.0 - version: 7.8.0(@typescript-eslint/parser@7.8.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5) + version: 7.4.0(@typescript-eslint/parser@7.7.0(eslint@8.56.0)(typescript@5.4.3))(eslint@8.56.0)(typescript@5.4.3) '@typescript-eslint/parser': specifier: ^7.7.0 - version: 7.8.0(eslint@8.57.0)(typescript@5.4.5) + version: 7.7.0(eslint@8.56.0)(typescript@5.4.3) eslint: specifier: ^8.51.0 - version: 8.57.0 + version: 8.56.0 eslint-config-prettier: specifier: ^9.1.0 - version: 9.1.0(eslint@8.57.0) + version: 9.1.0(eslint@8.56.0) eslint-config-standard: specifier: ^17.1.0 - version: 17.1.0(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.8.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0))(eslint-plugin-n@16.6.2(eslint@8.57.0))(eslint-plugin-promise@6.1.1(eslint@8.57.0))(eslint@8.57.0) + version: 17.1.0(eslint-plugin-import@2.29.0(@typescript-eslint/parser@7.7.0(eslint@8.56.0)(typescript@5.4.3))(eslint@8.56.0))(eslint-plugin-n@16.6.2(eslint@8.56.0))(eslint-plugin-promise@6.1.1(eslint@8.56.0))(eslint@8.56.0) eslint-plugin-import: specifier: ^2.28.1 - version: 2.29.1(@typescript-eslint/parser@7.8.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0) + version: 2.29.0(@typescript-eslint/parser@7.7.0(eslint@8.56.0)(typescript@5.4.3))(eslint@8.56.0) eslint-plugin-node: specifier: ^11.1.0 - version: 11.1.0(eslint@8.57.0) + version: 11.1.0(eslint@8.56.0) eslint-plugin-prettier: specifier: ^5.1.3 - version: 5.1.3(@types/eslint@8.56.10)(eslint-config-prettier@9.1.0(eslint@8.57.0))(eslint@8.57.0)(prettier@3.2.5) + version: 5.1.3(@types/eslint@8.56.10)(eslint-config-prettier@9.1.0(eslint@8.56.0))(eslint@8.56.0)(prettier@3.2.5) eslint-plugin-promise: specifier: ^6.1.1 - version: 6.1.1(eslint@8.57.0) + version: 6.1.1(eslint@8.56.0) ethers: specifier: ^5.7.2 - version: 5.7.2(bufferutil@4.0.8)(utf-8-validate@6.0.3) + version: 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) solc: specifier: 0.8.24 version: 0.8.24 solhint: specifier: ^4.5.4 - version: 4.5.4(typescript@5.4.5) + version: 4.5.4(typescript@5.4.3) ts-node: specifier: ^10.9.2 - version: 10.9.2(@types/node@20.12.11)(typescript@5.4.5) + version: 10.9.2(@types/node@20.12.7)(typescript@5.4.3) typescript: specifier: ^5.2.2 - version: 5.4.5 + version: 5.4.3 packages/taiko-client: {} @@ -714,65 +736,65 @@ importers: version: link:../ui-lib '@wagmi/cli': specifier: ^2.1.4 - version: 2.1.4(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3) + version: 2.1.4(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10) '@wagmi/connectors': specifier: ^4.1.18 - version: 4.3.5(@types/react@18.3.2)(@wagmi/core@2.9.3(@types/react@18.3.2)(bufferutil@4.0.8)(react@18.3.1)(typescript@5.4.5)(utf-8-validate@6.0.3)(viem@2.10.2(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8))(zod@3.23.8))(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react-i18next@13.5.0(i18next@22.5.1)(react-dom@18.3.1(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.3.2)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.3.2)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1)(rollup@4.17.2)(typescript@5.4.5)(utf-8-validate@6.0.3)(viem@2.10.2(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8))(zod@3.23.8) + version: 4.1.18(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(@types/react@18.3.5)(@wagmi/core@2.8.0(@types/react@18.3.5)(bufferutil@4.0.8)(react@18.2.0)(typescript@5.4.3)(utf-8-validate@5.0.10)(viem@2.21.7(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.22.4))(zod@3.22.4))(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))(react@18.2.0)(rollup@4.21.3)(typescript@5.4.3)(utf-8-validate@5.0.10)(viem@2.21.7(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.22.4))(zod@3.22.4) '@wagmi/core': specifier: ^2.8.0 - version: 2.9.3(@types/react@18.3.2)(bufferutil@4.0.8)(react@18.3.1)(typescript@5.4.5)(utf-8-validate@6.0.3)(viem@2.10.2(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8))(zod@3.23.8) + version: 2.8.0(@types/react@18.3.5)(bufferutil@4.0.8)(react@18.2.0)(typescript@5.4.3)(utf-8-validate@5.0.10)(viem@2.21.7(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.22.4))(zod@3.22.4) '@web3modal/common': - specifier: ^4.1.1 - version: 4.1.11 + specifier: ^5.0.11 + version: 5.1.8 '@web3modal/ui': specifier: ^4.1.1 - version: 4.1.11 + version: 4.2.3 '@web3modal/wagmi': specifier: ^4.1.1 - version: 4.1.11(@types/react@18.3.2)(@wagmi/connectors@4.3.5(@types/react@18.3.2)(@wagmi/core@2.9.3(@types/react@18.3.2)(bufferutil@4.0.8)(react@18.3.1)(typescript@5.4.5)(utf-8-validate@6.0.3)(viem@2.10.2(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8))(zod@3.23.8))(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react-i18next@13.5.0(i18next@22.5.1)(react-dom@18.3.1(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.3.2)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.3.2)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1)(rollup@4.17.2)(typescript@5.4.5)(utf-8-validate@6.0.3)(viem@2.10.2(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8))(zod@3.23.8))(@wagmi/core@2.9.3(@types/react@18.3.2)(bufferutil@4.0.8)(react@18.3.1)(typescript@5.4.5)(utf-8-validate@6.0.3)(viem@2.10.2(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8))(zod@3.23.8))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(viem@2.10.2(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8)) + version: 4.1.11(7bejpi3a2bqeihrssz3xbwxki4) '@zerodevx/svelte-toast': specifier: ^0.9.5 - version: 0.9.5(svelte@4.2.16) + version: 0.9.5(svelte@4.2.13) autoprefixer: specifier: ^10.4.19 - version: 10.4.19(postcss@8.4.38) + version: 10.4.19(postcss@8.4.39) daisyui: specifier: ^4.10.1 - version: 4.11.1(postcss@8.4.38) + version: 4.10.1(postcss@8.4.38) dayjs: specifier: ^1.11.10 - version: 1.11.11 + version: 1.11.10 debug: specifier: ^4.3.4 - version: 4.3.4 + version: 4.3.5 minidenticons: specifier: ^4.2.1 version: 4.2.1 postcss: specifier: ^8.4.38 - version: 8.4.38 + version: 8.4.39 tailwindcss: specifier: ^3.4.3 - version: 3.4.3(ts-node@10.9.2(@types/node@20.12.11)(typescript@5.4.5)) + version: 3.4.3(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.3)) viem: - specifier: ^2.9.29 - version: 2.10.2(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8) + specifier: ^2.15.1 + version: 2.21.7(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.22.4) devDependencies: '@chromatic-com/storybook': specifier: ^1.3.1 - version: 1.3.4(react@18.3.1) + version: 1.3.3(react@18.2.0) '@playwright/test': specifier: ^1.28.1 - version: 1.44.0 + version: 1.43.1 '@sveltejs/adapter-auto': specifier: ^3.0.0 - version: 3.2.0(@sveltejs/kit@2.5.7(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.16)(vite@5.2.11(@types/node@20.12.11)(terser@5.31.0)))(svelte@4.2.16)(vite@5.2.11(@types/node@20.12.11)(terser@5.31.0))) + version: 3.2.0(@sveltejs/kit@2.5.27(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.13)(vite@5.1.3(@types/node@20.12.7)(terser@5.27.2)))(svelte@4.2.13)(vite@5.1.3(@types/node@20.12.7)(terser@5.27.2))) '@sveltejs/kit': - specifier: ^2.0.0 - version: 2.5.7(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.16)(vite@5.2.11(@types/node@20.12.11)(terser@5.31.0)))(svelte@4.2.16)(vite@5.2.11(@types/node@20.12.11)(terser@5.31.0)) + specifier: ^2.5.21 + version: 2.5.27(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.13)(vite@5.1.3(@types/node@20.12.7)(terser@5.27.2)))(svelte@4.2.13)(vite@5.1.3(@types/node@20.12.7)(terser@5.27.2)) '@sveltejs/vite-plugin-svelte': specifier: ^3.1.0 - version: 3.1.0(svelte@4.2.16)(vite@5.2.11(@types/node@20.12.11)(terser@5.31.0)) + version: 3.1.0(svelte@4.2.13)(vite@5.1.3(@types/node@20.12.7)(terser@5.27.2)) '@types/eslint': specifier: ^8.56.0 version: 8.56.10 @@ -781,79 +803,79 @@ importers: version: 29.5.12 '@types/node': specifier: ^20.12.7 - version: 20.12.11 + version: 20.12.7 '@typescript-eslint/eslint-plugin': specifier: ^7.0.0 - version: 7.8.0(@typescript-eslint/parser@7.8.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5) + version: 7.4.0(@typescript-eslint/parser@7.7.0(eslint@8.56.0)(typescript@5.4.3))(eslint@8.56.0)(typescript@5.4.3) '@typescript-eslint/parser': specifier: ^7.0.0 - version: 7.8.0(eslint@8.57.0)(typescript@5.4.5) + version: 7.7.0(eslint@8.56.0)(typescript@5.4.3) convert-csv-to-json: specifier: ^2.44.0 - version: 2.46.0 + version: 2.48.0 dotenv: specifier: ^16.4.5 version: 16.4.5 eslint: specifier: ^8.56.0 - version: 8.57.0 + version: 8.56.0 eslint-config-prettier: specifier: ^9.1.0 - version: 9.1.0(eslint@8.57.0) + version: 9.1.0(eslint@8.56.0) eslint-plugin-simple-import-sort: specifier: ^12.0.0 - version: 12.1.0(eslint@8.57.0) + version: 12.0.0(eslint@8.56.0) eslint-plugin-storybook: specifier: ^0.8.0 - version: 0.8.0(eslint@8.57.0)(typescript@5.4.5) + version: 0.8.0(eslint@8.56.0)(typescript@5.4.3) eslint-plugin-svelte: specifier: ^2.38.0 - version: 2.38.0(eslint@8.57.0)(svelte@4.2.16)(ts-node@10.9.2(@types/node@20.12.11)(typescript@5.4.5)) + version: 2.38.0(eslint@8.56.0)(svelte@4.2.13)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.3)) p-map: specifier: ^7.0.2 version: 7.0.2 prettier: specifier: ^3.1.1 - version: 3.2.5 + version: 3.3.2 prettier-plugin-svelte: specifier: ^3.1.2 - version: 3.2.3(prettier@3.2.5)(svelte@4.2.16) + version: 3.2.2(prettier@3.2.5)(svelte@4.2.13) raw-body: specifier: ^2.5.2 version: 2.5.2 svelte: specifier: ^4.2.7 - version: 4.2.16 + version: 4.2.13 svelte-check: specifier: ^3.7.1 - version: 3.7.1(@babel/core@7.24.5)(postcss-load-config@4.0.2(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.12.11)(typescript@5.4.5)))(postcss@8.4.38)(svelte@4.2.16) + version: 3.7.1(@babel/core@7.25.2)(postcss-load-config@4.0.2(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.3)))(postcss@8.4.38)(svelte@4.2.13) svelte-copy: specifier: ^1.4.2 - version: 1.4.2(svelte@4.2.16) + version: 1.4.2(svelte@4.2.13) svelte-i18n: specifier: ^4.0.0 - version: 4.0.0(svelte@4.2.16) + version: 4.0.0(svelte@4.2.13) svelte-scrolling: specifier: ^1.4.0 - version: 1.4.0(svelte@4.2.16) + version: 1.4.0(svelte@4.2.13) tailwindcss-image-rendering: specifier: ^1.0.2 version: 1.0.2 tslib: specifier: ^2.4.1 - version: 2.6.2 + version: 2.6.3 typescript: specifier: ^5.0.0 - version: 5.4.5 + version: 5.4.3 vite: specifier: ^5.0.3 - version: 5.2.11(@types/node@20.12.11)(terser@5.31.0) + version: 5.1.3(@types/node@20.12.7)(terser@5.27.2) vite-tsconfig-paths: specifier: ^4.3.2 - version: 4.3.2(typescript@5.4.5)(vite@5.2.11(@types/node@20.12.11)(terser@5.31.0)) + version: 4.3.2(typescript@5.4.3)(vite@5.1.3(@types/node@20.12.7)(terser@5.27.2)) vitest: specifier: ^1.2.0 - version: 1.6.0(@types/node@20.12.11)(jsdom@24.0.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))(terser@5.31.0) + version: 1.5.0(@types/node@20.12.7)(jsdom@24.0.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(terser@5.27.2) which: specifier: ^4.0.0 version: 4.0.0 @@ -862,125 +884,132 @@ importers: dependencies: daisyui: specifier: ^4.11.1 - version: 4.11.1(postcss@8.4.38) + version: 4.11.1(postcss@8.4.47) tailwindcss-image-rendering: specifier: ^1.0.2 version: 1.0.2 devDependencies: '@chromatic-com/storybook': specifier: ^1.3.4 - version: 1.3.4(react@18.3.1) + version: 1.9.0(react@18.2.0) '@playwright/test': specifier: ^1.28.1 - version: 1.44.0 + version: 1.43.1 '@storybook/addon-essentials': specifier: ^8.0.10 - version: 8.1.1(@types/react@18.3.2)(encoding@0.1.13)(prettier@3.2.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 8.3.0(storybook@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3)) '@storybook/addon-interactions': specifier: ^8.0.10 - version: 8.1.1(@types/jest@29.5.12)(vitest@1.6.0(@types/node@20.12.11)(jsdom@24.0.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))(terser@5.31.0)) + version: 8.3.0(storybook@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3)) '@storybook/addon-links': specifier: ^8.0.10 - version: 8.1.1(react@18.3.1) + version: 8.3.0(react@18.2.0)(storybook@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3)) '@storybook/addon-themes': specifier: ^8.1.1 - version: 8.1.1 + version: 8.3.0(storybook@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3)) '@storybook/blocks': specifier: ^8.0.10 - version: 8.1.1(@types/react@18.3.2)(encoding@0.1.13)(prettier@3.2.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 8.3.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3)) '@storybook/svelte': specifier: ^8.0.10 - version: 8.1.1(encoding@0.1.13)(prettier@3.2.5)(svelte@4.2.16) + version: 8.3.0(storybook@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))(svelte@4.2.17) '@storybook/sveltekit': specifier: ^8.0.10 - version: 8.1.1(@babel/core@7.24.5)(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.16)(vite@5.2.11(@types/node@20.12.11)(terser@5.31.0)))(encoding@0.1.13)(postcss-load-config@4.0.2(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.12.11)(typescript@5.4.5)))(postcss@8.4.38)(prettier@3.2.5)(svelte@4.2.16)(typescript@5.4.5)(vite@5.2.11(@types/node@20.12.11)(terser@5.31.0)) + version: 8.3.0(@babel/core@7.25.2)(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.17)(vite@5.2.11(@types/node@20.12.7)(terser@5.27.2)))(postcss-load-config@4.0.2(postcss@8.4.47)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.5)))(postcss@8.4.47)(storybook@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))(svelte@4.2.17)(typescript@5.4.5)(vite@5.2.11(@types/node@20.12.7)(terser@5.27.2)) '@storybook/test': specifier: ^8.0.10 - version: 8.1.1(@types/jest@29.5.12)(vitest@1.6.0(@types/node@20.12.11)(jsdom@24.0.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))(terser@5.31.0)) + version: 8.3.0(storybook@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3)) '@sveltejs/adapter-auto': specifier: ^3.0.0 - version: 3.2.0(@sveltejs/kit@2.5.7(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.16)(vite@5.2.11(@types/node@20.12.11)(terser@5.31.0)))(svelte@4.2.16)(vite@5.2.11(@types/node@20.12.11)(terser@5.31.0))) + version: 3.2.0(@sveltejs/kit@2.5.27(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.17)(vite@5.2.11(@types/node@20.12.7)(terser@5.27.2)))(svelte@4.2.17)(vite@5.2.11(@types/node@20.12.7)(terser@5.27.2))) '@sveltejs/kit': - specifier: ^2.0.0 - version: 2.5.7(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.16)(vite@5.2.11(@types/node@20.12.11)(terser@5.31.0)))(svelte@4.2.16)(vite@5.2.11(@types/node@20.12.11)(terser@5.31.0)) + specifier: ^2.5.21 + version: 2.5.27(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.17)(vite@5.2.11(@types/node@20.12.7)(terser@5.27.2)))(svelte@4.2.17)(vite@5.2.11(@types/node@20.12.7)(terser@5.27.2)) '@sveltejs/package': specifier: ^2.0.0 - version: 2.3.1(svelte@4.2.16)(typescript@5.4.5) + version: 2.3.5(svelte@4.2.17)(typescript@5.4.5) '@sveltejs/vite-plugin-svelte': specifier: ^3.0.0 - version: 3.1.0(svelte@4.2.16)(vite@5.2.11(@types/node@20.12.11)(terser@5.31.0)) + version: 3.1.0(svelte@4.2.17)(vite@5.2.11(@types/node@20.12.7)(terser@5.27.2)) '@types/eslint': specifier: ^8.56.0 version: 8.56.10 '@typescript-eslint/eslint-plugin': specifier: ^7.0.0 - version: 7.8.0(@typescript-eslint/parser@7.8.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5) + version: 7.9.0(@typescript-eslint/parser@7.9.0(eslint@8.56.0)(typescript@5.4.5))(eslint@8.56.0)(typescript@5.4.5) '@typescript-eslint/parser': specifier: ^7.0.0 - version: 7.8.0(eslint@8.57.0)(typescript@5.4.5) + version: 7.9.0(eslint@8.56.0)(typescript@5.4.5) autoprefixer: specifier: ^10.4.19 - version: 10.4.19(postcss@8.4.38) + version: 10.4.19(postcss@8.4.47) eslint: specifier: ^8.56.0 - version: 8.57.0 + version: 8.56.0 eslint-config-prettier: specifier: ^9.1.0 - version: 9.1.0(eslint@8.57.0) + version: 9.1.0(eslint@8.56.0) eslint-plugin-storybook: specifier: ^0.8.0 - version: 0.8.0(eslint@8.57.0)(typescript@5.4.5) + version: 0.8.0(eslint@8.56.0)(typescript@5.4.5) eslint-plugin-svelte: specifier: ^2.35.1 - version: 2.38.0(eslint@8.57.0)(svelte@4.2.16)(ts-node@10.9.2(@types/node@20.12.11)(typescript@5.4.5)) + version: 2.38.0(eslint@8.56.0)(svelte@4.2.17)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.5)) prettier: specifier: ^3.1.1 - version: 3.2.5 + version: 3.3.2 prettier-plugin-svelte: specifier: ^3.1.2 - version: 3.2.3(prettier@3.2.5)(svelte@4.2.16) + version: 3.2.3(prettier@3.2.5)(svelte@4.2.17) publint: specifier: ^0.1.9 version: 0.1.16 storybook: specifier: ^8.0.10 - version: 8.1.1(@babel/preset-env@7.24.5(@babel/core@7.24.5))(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(utf-8-validate@6.0.3) + version: 8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) svelte: specifier: ^4.2.7 - version: 4.2.16 + version: 4.2.17 svelte-check: specifier: ^3.6.0 - version: 3.7.1(@babel/core@7.24.5)(postcss-load-config@4.0.2(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.12.11)(typescript@5.4.5)))(postcss@8.4.38)(svelte@4.2.16) + version: 3.7.1(@babel/core@7.25.2)(postcss-load-config@4.0.2(postcss@8.4.47)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.5)))(postcss@8.4.47)(svelte@4.2.17) tailwindcss: specifier: ^3.4.3 - version: 3.4.3(ts-node@10.9.2(@types/node@20.12.11)(typescript@5.4.5)) + version: 3.4.3(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.5)) tslib: specifier: ^2.4.1 - version: 2.6.2 + version: 2.6.3 typescript: specifier: ^5.0.0 - version: 5.4.5 + version: 5.5.3 vite: specifier: ^5.0.11 - version: 5.2.11(@types/node@20.12.11)(terser@5.31.0) + version: 5.2.11(@types/node@20.12.7)(terser@5.27.2) vitest: specifier: ^1.2.0 - version: 1.6.0(@types/node@20.12.11)(jsdom@24.0.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))(terser@5.31.0) + version: 1.6.0(@types/node@20.12.7)(jsdom@24.0.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))(terser@5.27.2) packages: - '@adobe/css-tools@4.3.3': - resolution: {integrity: sha512-rE0Pygv0sEZ4vBWHlAgJLGDU7Pm8xoO6p3wsEceb7GYAjScrOHpEo8KK/eVkAcnSM+slAEtXjA2JpdjLp4fJQQ==} + '@aashutoshrathi/word-wrap@1.2.6': + resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} + engines: {node: '>=0.10.0'} + + '@adobe/css-tools@4.4.0': + resolution: {integrity: sha512-Ff9+ksdQQB3rMncgqDK78uLznstjyfIf2Arnh22pW8kBpLs6rpKDwgnZT46hin5Hl1WzazzK64DOrhSwYpS7bQ==} '@adraffy/ens-normalize@1.10.0': resolution: {integrity: sha512-nA9XHtlAkYfJxY7bce8DcN7eKxWWCWkU+1GR9d+U6MbNpfwQp8TI7vqOsBsMcHoT4mBu2kypKoSKnghEzOOq5Q==} + '@adraffy/ens-normalize@1.10.1': + resolution: {integrity: sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw==} + '@alloc/quick-lru@5.2.0': resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} engines: {node: '>=10'} - '@ampproject/remapping@2.3.0': - resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + '@ampproject/remapping@2.2.1': + resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} engines: {node: '>=6.0.0'} '@apidevtools/openapi-schemas@2.1.0': @@ -990,20 +1019,20 @@ packages: '@apidevtools/swagger-methods@3.0.2': resolution: {integrity: sha512-QAkD5kK2b1WfjDS/UQn/qQkbwF31uqRjPTrsCs5ZG9BQGAkjwvqGFjjPqAuzac/IYzpPtRzjCP1WrTuAIjMrXg==} - '@astrojs/check@0.6.0': - resolution: {integrity: sha512-Q6fct7FvByTf0L5lvH2QwFelXtLViWhPNgMfOvrGq7spV5SPX9jQPoFxH+nRFh1oDhBBIWImRjkSpSyhX9fQHA==} + '@astrojs/check@0.8.3': + resolution: {integrity: sha512-ajcSe+ezX5jCc3dreQlWzbknzXgSGnDETNe3C1mawUOtGpO4t5z2YGaD0y+wzB84lmgPWaWZa0fKSPwLq/wUHw==} hasBin: true peerDependencies: typescript: ^5.0.0 - '@astrojs/compiler@2.8.0': - resolution: {integrity: sha512-yrpD1WRGqsJwANaDIdtHo+YVjvIOFAjC83lu5qENIgrafwZcJgSXDuwVMXOgok4tFzpeKLsFQ6c3FoUdloLWBQ==} + '@astrojs/compiler@2.10.3': + resolution: {integrity: sha512-bL/O7YBxsFt55YHU021oL+xz+B/9HvGNId3F9xURN16aeqDK9juHGktdkCSXz+U4nqFACq6ZFvWomOzhV+zfPw==} - '@astrojs/internal-helpers@0.4.0': - resolution: {integrity: sha512-6B13lz5n6BrbTqCTwhXjJXuR1sqiX/H6rTxzlXx+lN1NnV4jgnq/KJldCQaUWJzPL5SiWahQyinxAbxQtwgPHA==} + '@astrojs/internal-helpers@0.4.1': + resolution: {integrity: sha512-bMf9jFihO8YP940uD70SI/RDzIhUHJAolWVcO1v5PUivxGKvfLZTLTVVxEYzGYyPsA3ivdLNqMnL5VgmQySa+g==} - '@astrojs/language-server@2.9.0': - resolution: {integrity: sha512-Q3wtoDh3RRfjYNfE5c7GPncAmZ6RMo3AQQCHBExtH5G4UiXYSxg4mPmSBdq+97yIXZWlN63W5V77OxUReAwQYA==} + '@astrojs/language-server@2.14.2': + resolution: {integrity: sha512-daUJ/+/2pPF3eGG4tVdXKyw0tabUDrJKwLzU8VTuNhEHIn3VZAIES6VT3+mX0lmKcMiKM8/bjZdfY+fPfmnsMA==} hasBin: true peerDependencies: prettier: ^3.0.0 @@ -1014,34 +1043,33 @@ packages: prettier-plugin-astro: optional: true - '@astrojs/markdown-remark@5.1.0': - resolution: {integrity: sha512-S6Z3K2hOB7MfjeDoHsotnP/q2UsnEDB8NlNAaCjMDsGBZfTUbWxyLW3CaphEWw08f6KLZi2ibK9yC3BaMhh2NQ==} + '@astrojs/markdown-remark@5.2.0': + resolution: {integrity: sha512-vWGM24KZXz11jR3JO+oqYU3T2qpuOi4uGivJ9SQLCAI01+vEkHC60YJMRvHPc+hwd60F7euNs1PeOEixIIiNQw==} - '@astrojs/mdx@2.3.1': - resolution: {integrity: sha512-BOQFKD2Pi9cRntNQJlpF2fh4xV8doNpmVy9NKI95r4jsitrY4X5aTOhAowi+fkQgP/zW1A4HwCyQ6Pdam6z8zQ==} + '@astrojs/mdx@3.1.6': + resolution: {integrity: sha512-YCEIvNgoQG3oVhe9codH4TX6zjvkl7KGla19yZO5RCnvjv2d9zyrfWqJ98I6/m18PbEY3k8Wjvha0IIf5eZ2sQ==} engines: {node: ^18.17.1 || ^20.3.0 || >=21.0.0} peerDependencies: - astro: ^4.0.0 + astro: ^4.8.0 '@astrojs/prism@3.1.0': resolution: {integrity: sha512-Z9IYjuXSArkAUx3N6xj6+Bnvx8OdUSHA8YoOgyepp3+zJmtVYJIl/I18GozdJVW1p5u/CNpl3Km7/gwTJK85cw==} engines: {node: ^18.17.1 || ^20.3.0 || >=21.0.0} - '@astrojs/sitemap@3.1.4': - resolution: {integrity: sha512-po8CqDCK14O6phU1mB5C8SyVLyQEa+7pJM8oXxs1mVh8DgvxxaA5E7lak1vzOmBcyyyHBW32jakGqNYc66sBRw==} + '@astrojs/sitemap@3.1.6': + resolution: {integrity: sha512-1Qp2NvAzVImqA6y+LubKi1DVhve/hXXgFvB0szxiipzh7BvtuKe4oJJ9dXSqaubaTkt4nMa6dv6RCCAYeB6xaQ==} - '@astrojs/starlight@0.22.2': - resolution: {integrity: sha512-z9OR6ChDKIqaw8P9Xer0u7mG33icnszBhqi28BAb1zDt21yHgOjXcGbP73T+3bzG1aWdZD85/4WmktufzD1DPA==} + '@astrojs/starlight@0.25.5': + resolution: {integrity: sha512-JQsfoqRUX/HBpOW8LWPdiIxcfXZ5HOvi4Dz4Ez61U99hDyX3Ix2Q+pmsek1sH5R1MHWx/wlki2VPEqidtKXyiQ==} peerDependencies: - astro: ^4.2.7 + astro: ^4.8.6 '@astrojs/telemetry@3.1.0': resolution: {integrity: sha512-/ca/+D8MIKEC8/A9cSaPUqQNZm+Es/ZinRv0ZAzvu2ios7POQSsVD+VOj7/hypWNsNM3T7RpfgNq7H2TU1KEHA==} engines: {node: ^18.17.1 || ^20.3.0 || >=21.0.0} - '@aw-web-design/x-default-browser@1.4.126': - resolution: {integrity: sha512-Xk1sIhyNC/esHGGVjL/niHLowM0csl/kFO5uawBy4IrWwy0o1G8LGt3jP6nmWGz+USxeeqbihAmp/oVZju6wug==} - hasBin: true + '@astrojs/yaml2ts@0.2.1': + resolution: {integrity: sha512-CBaNwDQJz20E5WxzQh4thLVfhB3JEEGz72wRA+oJp6fQR37QLAqXZJU0mHC+yqMOQ6oj0GfRPJrz6hjf+zm6zA==} '@aws-crypto/crc32@3.0.0': resolution: {integrity: sha512-IzSgsrxUcsrejQbPVilIKy16kAT52EwB6zSaI+M3xxIhKh5+aldEyvI+z6erM7TCLB2BJsFrtHjp6/4/sr+3dA==} @@ -1058,152 +1086,158 @@ packages: '@aws-crypto/sha256-browser@3.0.0': resolution: {integrity: sha512-8VLmW2B+gjFbU5uMeqtQM6Nj0/F1bro80xQXCW6CQBWgosFWXTx77aeOF5CAIAmbOK64SdMBJdNr6J41yP5mvQ==} + '@aws-crypto/sha256-js@1.2.2': + resolution: {integrity: sha512-Nr1QJIbW/afYYGzYvrF70LtaHrIRtd4TNAglX8BvlfxJLZ45SAmueIKYl5tWoNBPzp65ymXGFK0Bb1vZUpuc9g==} + '@aws-crypto/sha256-js@3.0.0': resolution: {integrity: sha512-PnNN7os0+yd1XvXAy23CFOmTbMaDxgxXtTKHybrJ39Y8kGzBATgBFibWJKH6BhytLI/Zyszs87xCOBNyBig6vQ==} '@aws-crypto/supports-web-crypto@3.0.0': resolution: {integrity: sha512-06hBdMwUAb2WFTuGG73LSC0wfPu93xWwo5vL2et9eymgmu3Id5vFAHBbajVWiGhPO37qcsdCap/FqXvJGJWPIg==} + '@aws-crypto/util@1.2.2': + resolution: {integrity: sha512-H8PjG5WJ4wz0UXAFXeJjWCW1vkvIJ3qUUD+rGRwJ2/hj+xT58Qle2MTql/2MGzkU+1JLAFuR6aJpLAjHwhmwwg==} + '@aws-crypto/util@3.0.0': resolution: {integrity: sha512-2OJlpeJpCR48CC8r+uKVChzs9Iungj9wkZrl8Z041DWEWvyIHILYKCPNzJghKsivj+S3mLo6BVc7mBNzdxA46w==} - '@aws-sdk/client-s3@3.575.0': - resolution: {integrity: sha512-4h0YIvLNcKNqwPbxWqwHCH3KWMpRdKhfQPq7kZcZXzFRi3yVAVaAsZcH8eXZsKPlitxkfWNgvfcTXOjStL1uHA==} + '@aws-sdk/client-s3@3.577.0': + resolution: {integrity: sha512-mQYXwn6E4Rwggn6teF6EIWJtK8jsKcxnPj2QVETkSmD8QaFLm4g/DgLPdamDE97UI8k1k0cmWqXcTOLIaZ7wQg==} engines: {node: '>=16.0.0'} - '@aws-sdk/client-sso-oidc@3.575.0': - resolution: {integrity: sha512-YCstVaW5tAvXs+v4LR9gNAO+VRhIObjk1/knCdVQ5QQRTevtVQtdJWeNrDZYo4ATo0OHGyqGCj5Z09TWMv+e1Q==} + '@aws-sdk/client-sso-oidc@3.577.0': + resolution: {integrity: sha512-njmKSPDWueWWYVFpFcZ2P3fI6/pdQVDa0FgCyYZhOnJLgEHZIcBBg1AsnkVWacBuLopp9XVt2m+7hO6ugY1/1g==} engines: {node: '>=16.0.0'} - '@aws-sdk/client-sso@3.575.0': - resolution: {integrity: sha512-elFWpAtktD3XBy47etG80GKXK9Lh3sNCMXLjcSs0NS0fdRIQJS2zKxC8qK22UQmdFKpXxthND5FKk7fNEqrR+g==} + '@aws-sdk/client-sso@3.577.0': + resolution: {integrity: sha512-BwujdXrydlk6UEyPmewm5GqG4nkQ6OVyRhS/SyZP/6UKSFv2/sf391Cmz0hN0itUTH1rR4XeLln8XCOtarkrzg==} engines: {node: '>=16.0.0'} - '@aws-sdk/client-sts@3.575.0': - resolution: {integrity: sha512-8MrT4J2dRiskf0JFMGL5VNBqPvc6igNa218LGBJzHXmLsm1WfGCGnce84R7U2USr8oPOenu0XzSCLvMQyZbGWQ==} + '@aws-sdk/client-sts@3.577.0': + resolution: {integrity: sha512-509Kklimva1XVlhGbpTpeX3kOP6ORpm44twJxDHpa9TURbmoaxj7veWlnLCbDorxDTrbsDghvYZshvcLsojVpg==} engines: {node: '>=16.0.0'} - '@aws-sdk/core@3.575.0': - resolution: {integrity: sha512-117U+kQki2XoKcYQfepmlRcNxn6rELGlOFOBQ8Z2JTBXEYHblW2ke067a0CLmxFwp/zCWuc7IGjd3in3x4Q3rg==} + '@aws-sdk/core@3.576.0': + resolution: {integrity: sha512-KDvDlbeipSTIf+ffKtTg1m419TK7s9mZSWC8bvuZ9qx6/sjQFOXIKOVqyuli6DnfxGbvRcwoRuY99OcCH1N/0w==} engines: {node: '>=16.0.0'} - '@aws-sdk/credential-provider-env@3.575.0': - resolution: {integrity: sha512-YTgpq3rvYBXzW6OTDB00cE79evQtss/lz2GlJXgqqVXD0m7i77hGA8zb44VevP/WxtDaiSW7SSjuu8VCBGsg4g==} + '@aws-sdk/credential-provider-env@3.577.0': + resolution: {integrity: sha512-Jxu255j0gToMGEiqufP8ZtKI8HW90lOLjwJ3LrdlD/NLsAY0tOQf1fWc53u28hWmmNGMxmCrL2p66IOgMDhDUw==} engines: {node: '>=16.0.0'} - '@aws-sdk/credential-provider-http@3.575.0': - resolution: {integrity: sha512-xQfVmYI+9KqRvhWY8fyElnpcVUBBUgi/Hoji3oU6WLrUjrX98k93He7gKDQSyHf7ykMLUAJYWwsV4AjQ2j6njA==} + '@aws-sdk/credential-provider-http@3.577.0': + resolution: {integrity: sha512-n++yhCp67b9+ZRGEdY1jhamB5E/O+QsIDOPSuRmdaSGMCOd82oUEKPgIVEU1bkqxDsBxgiEWuvtfhK6sNiDS0A==} engines: {node: '>=16.0.0'} - '@aws-sdk/credential-provider-ini@3.575.0': - resolution: {integrity: sha512-BdM6a/5VUuNge3c6yRuxvO+4srLoSfqHfkQGfUDfhTdTJpljlpfnc9h3z2Ni1+aueOHPZMNFWIktHDcX5wUGBg==} + '@aws-sdk/credential-provider-ini@3.577.0': + resolution: {integrity: sha512-q7lHPtv6BjRvChUE3m0tIaEZKxPTaZ1B3lKxGYsFl3VLAu5N8yGCUKwuA1izf4ucT+LyKscVGqK6VDZx1ev3nw==} engines: {node: '>=16.0.0'} peerDependencies: - '@aws-sdk/client-sts': 3.575.0 + '@aws-sdk/client-sts': ^3.577.0 - '@aws-sdk/credential-provider-node@3.575.0': - resolution: {integrity: sha512-rEdNpqW2jEc5kwbf/s9XQywMLQlIkMjuCK6mw9sF2OVRGHGVnh+6eh/1JFx8Kj+eU51ctifQ7KaHe8dGco8HYQ==} + '@aws-sdk/credential-provider-node@3.577.0': + resolution: {integrity: sha512-epZ1HOMsrXBNczc0HQpv0VMjqAEpc09DUA7Rg3gUJfn8umhML7A7bXnUyqPA+S54q397UYg1leQKdSn23OiwQQ==} engines: {node: '>=16.0.0'} - '@aws-sdk/credential-provider-process@3.575.0': - resolution: {integrity: sha512-2/5NJV7MZysKglqJSQ/O8OELNcwLcH3xknabL9NagtzB7RNB2p1AUXR0UlTey9sSDLL4oCmNa/+unYuglW/Ahg==} + '@aws-sdk/credential-provider-process@3.577.0': + resolution: {integrity: sha512-Gin6BWtOiXxIgITrJ3Nwc+Y2P1uVT6huYR4EcbA/DJUPWyO0n9y5UFLewPvVbLkRn15JeEqErBLUrHclkiOKtw==} engines: {node: '>=16.0.0'} - '@aws-sdk/credential-provider-sso@3.575.0': - resolution: {integrity: sha512-NtXA9OPIKsqavs2F7hhLT/t2ZDjwJsvQevj31ov1NpmTNYMc7OWFWDptOG7rppsWMsk5KKmfiL2qViQJnezXNA==} + '@aws-sdk/credential-provider-sso@3.577.0': + resolution: {integrity: sha512-iVm5SQvS7EgZTJsRaqUOmDQpBQPPPat42SCbWFvFQOLrl8qewq8OP94hFS5w2mP62zngeYzqhJnDel79HXbxew==} engines: {node: '>=16.0.0'} - '@aws-sdk/credential-provider-web-identity@3.575.0': - resolution: {integrity: sha512-QcvVH7wpvpFRXGAGgCBfQeiF/ptD0NJ+Hrc8dDYfPGhFeZ0EoVQBYNphLi25xe7JZ+XbaqCKrURHZtr4fAEOJw==} + '@aws-sdk/credential-provider-web-identity@3.577.0': + resolution: {integrity: sha512-ZGHGNRaCtJJmszb9UTnC7izNCtRUttdPlLdMkh41KPS32vfdrBDHs1JrpbZijItRj1xKuOXsiYSXLAaHGcLh8Q==} engines: {node: '>=16.0.0'} peerDependencies: - '@aws-sdk/client-sts': 3.575.0 + '@aws-sdk/client-sts': ^3.577.0 - '@aws-sdk/lib-storage@3.575.0': - resolution: {integrity: sha512-Ejk449EDqrJ1rSKP3T8nIn7n6jVxRTmomY0tmgsbCE0d17b2PzK4J2hjbbIT7AAi4E3kiRYptyIVG8y5Ga1gnw==} + '@aws-sdk/lib-storage@3.578.0': + resolution: {integrity: sha512-SluLJrA/fG82UnE83Albh+gv48McmXkz17kmAMhhNswOxqHsklb5Vu5d/G0DUDAQdeC30sS/9Vhu2zAiJokunw==} engines: {node: '>=16.0.0'} peerDependencies: - '@aws-sdk/client-s3': ^3.575.0 + '@aws-sdk/client-s3': ^3.577.0 - '@aws-sdk/middleware-bucket-endpoint@3.575.0': - resolution: {integrity: sha512-ytsp7xcmbpkVk4TLoi91YyXQh/vwSIGdJ2Awo/pi6ac5Fqe6OntPijh5GHSVj5ZrxW4haPWb6HdBmKMo4liGEw==} + '@aws-sdk/middleware-bucket-endpoint@3.577.0': + resolution: {integrity: sha512-twlkNX2VofM6kHXzDEiJOiYCc9tVABe5cbyxMArRWscIsCWG9mamPhC77ezG4XsN9dFEwVdxEYD5Crpm/5EUiw==} engines: {node: '>=16.0.0'} - '@aws-sdk/middleware-expect-continue@3.575.0': - resolution: {integrity: sha512-8Nq4UtEi63MJPoYBACW5YoMKQdbrkLNGIdTyrolNRNwVS+6nQqDMvBplakCzQ1nL1rHOEEsKKc8e2BlG9SkR5A==} + '@aws-sdk/middleware-expect-continue@3.577.0': + resolution: {integrity: sha512-6dPp8Tv4F0of4un5IAyG6q++GrRrNQQ4P2NAMB1W0VO4JoEu1C8GievbbDLi88TFIFmtKpnHB0ODCzwnoe8JsA==} engines: {node: '>=16.0.0'} - '@aws-sdk/middleware-flexible-checksums@3.575.0': - resolution: {integrity: sha512-UbyqN39v6s+olyuVKwX778w6J2ZuYpxb1j+KdhFtZwpMSLd/UIQ0+A71U2vB6TrC52OEW0jIXEEBv6PcMBz9nw==} + '@aws-sdk/middleware-flexible-checksums@3.577.0': + resolution: {integrity: sha512-IHAUEipIfagjw92LV8SOSBiCF7ZnqfHcw14IkcZW2/mfrCy1Fh/k40MoS/t3Tro2tQ91rgQPwUoSgB/QCi2Org==} engines: {node: '>=16.0.0'} - '@aws-sdk/middleware-host-header@3.575.0': - resolution: {integrity: sha512-V2WoLBiXNCc4rIWZt6FUcP4TN0Vk02A9PPCBWkTfyOooiqfq+WZmZjRRBpwl1+5UsvARslrKWF0VzheMRXPJLQ==} + '@aws-sdk/middleware-host-header@3.577.0': + resolution: {integrity: sha512-9ca5MJz455CODIVXs0/sWmJm7t3QO4EUa1zf8pE8grLpzf0J94bz/skDWm37Pli13T3WaAQBHCTiH2gUVfCsWg==} engines: {node: '>=16.0.0'} - '@aws-sdk/middleware-location-constraint@3.575.0': - resolution: {integrity: sha512-MtQsLsEjSSSfm0OlQqg9PEzS1nxJDdApGoeCYLTbCzIp6hChdLZCCsDXwGg9S++24rjQsUglMhXh4WGXQ9FDnw==} + '@aws-sdk/middleware-location-constraint@3.577.0': + resolution: {integrity: sha512-DKPTD2D2s+t2QUo/IXYtVa/6Un8GZ+phSTBkyBNx2kfZz4Kwavhl/JJzSqTV3GfCXkVdFu7CrjoX7BZ6qWeTUA==} engines: {node: '>=16.0.0'} - '@aws-sdk/middleware-logger@3.575.0': - resolution: {integrity: sha512-7DEKx9Z11Maaye7FfhYtC8rjbM/PcFcMO2N4QEAfypcgWCj+w4gseE2OGdfAH9OFDoFc6YvLp53v16vbPjzQSg==} + '@aws-sdk/middleware-logger@3.577.0': + resolution: {integrity: sha512-aPFGpGjTZcJYk+24bg7jT4XdIp42mFXSuPt49lw5KygefLyJM/sB0bKKqPYYivW0rcuZ9brQ58eZUNthrzYAvg==} engines: {node: '>=16.0.0'} - '@aws-sdk/middleware-recursion-detection@3.575.0': - resolution: {integrity: sha512-ri89ldRFos6KZDGaknWPS2XPO9qr+gZ7+mPaoU8YkSM1W4uKqtnUSONyc+O3CFGJrqReuGHhRq0l2Sld0bjwOw==} + '@aws-sdk/middleware-recursion-detection@3.577.0': + resolution: {integrity: sha512-pn3ZVEd2iobKJlR3H+bDilHjgRnNrQ6HMmK9ZzZw89Ckn3Dcbv48xOv4RJvu0aU8SDLl/SNCxppKjeLDTPGBNA==} engines: {node: '>=16.0.0'} - '@aws-sdk/middleware-sdk-s3@3.575.0': - resolution: {integrity: sha512-8cBG8/tap4F6+UigTpKu8D2bvsLgqRTmn1K86qo3LqRX0Wc5X8TVjdKA2PmG0onOOr7rqTLcP9Q02LCh3usU6Q==} + '@aws-sdk/middleware-sdk-s3@3.577.0': + resolution: {integrity: sha512-/t8Shvy6lGIRdTEKG6hA8xy+oon/CDF5H8Ksms/cd/uvIy/MYbNjOJ/Arwk8H5W6LB4DP/1O+tOzOpGx1MCufA==} engines: {node: '>=16.0.0'} - '@aws-sdk/middleware-signing@3.575.0': - resolution: {integrity: sha512-frpGG7i3YngWwrYIeDq8/nbat3Gfl803qasaS112rmlPU0ezmYS1SPxpXjpIKxUUYofbzaFtRBAOHU1u7GnWew==} + '@aws-sdk/middleware-signing@3.577.0': + resolution: {integrity: sha512-QS/dh3+NqZbXtY0j/DZ867ogP413pG5cFGqBy9OeOhDMsolcwLrQbi0S0c621dc1QNq+er9ffaMhZ/aPkyXXIg==} engines: {node: '>=16.0.0'} - '@aws-sdk/middleware-ssec@3.575.0': - resolution: {integrity: sha512-rEFt2w3DdlmPsHRvVXOW6rNDIPE7UaEZ5a4LAkn78XilQYuQdhm5wtw5Ao0pJpDSVYNCZDVZaAvdHKQ1dnfwCA==} + '@aws-sdk/middleware-ssec@3.577.0': + resolution: {integrity: sha512-i2BPJR+rp8xmRVIGc0h1kDRFcM2J9GnClqqpc+NLSjmYadlcg4mPklisz9HzwFVcRPJ5XcGf3U4BYs5G8+iTyg==} engines: {node: '>=16.0.0'} - '@aws-sdk/middleware-user-agent@3.575.0': - resolution: {integrity: sha512-fWlr4RfrUNS2R3PgP+WsoMYORAgv/47Lp0J0fb3dXO1YvdczNWddRbFSUX2MQxM/y9XFfQPLpLgzluhoL3Cjeg==} + '@aws-sdk/middleware-user-agent@3.577.0': + resolution: {integrity: sha512-P55HAXgwmiHHpFx5JEPvOnAbfhN7v6sWv9PBQs+z2tC7QiBcPS0cdJR6PfV7J1n4VPK52/OnrK3l9VxdQ7Ms0g==} engines: {node: '>=16.0.0'} - '@aws-sdk/region-config-resolver@3.575.0': - resolution: {integrity: sha512-sBJKwTWKCWu9y8FzXIijYGwkKr3tDkPXM7BylToe6W+tGkp4OirV4iXrWA9zReNwTTepoxHufofqjGK9BtcI8g==} + '@aws-sdk/region-config-resolver@3.577.0': + resolution: {integrity: sha512-4ChCFACNwzqx/xjg3zgFcW8Ali6R9C95cFECKWT/7CUM1D0MGvkclSH2cLarmHCmJgU6onKkJroFtWp0kHhgyg==} engines: {node: '>=16.0.0'} - '@aws-sdk/signature-v4-multi-region@3.575.0': - resolution: {integrity: sha512-QMwuLuNwnEQ51RCZX8H/lXnOJgBcJJOCgClB9usW/XujNJVq8GnpZ5E7TsQLN88G6fifmcjQWonLKummuh/zVA==} + '@aws-sdk/signature-v4-multi-region@3.577.0': + resolution: {integrity: sha512-mMykGRFBYmlDcMhdbhNM0z1JFUaYYZ8r9WV7Dd0T2PWELv2brSAjDAOBHdJLHObDMYRnM6H0/Y974qTl3icEcQ==} engines: {node: '>=16.0.0'} - '@aws-sdk/token-providers@3.575.0': - resolution: {integrity: sha512-EPNDPQoQkjKqn4D2t70qVzbfdtlaAy9KBdG58qD1yNWVxq8Rh/lXdwmB+aE2PSahtyfVikZdCRoZiFzxDh5IUA==} + '@aws-sdk/token-providers@3.577.0': + resolution: {integrity: sha512-0CkIZpcC3DNQJQ1hDjm2bdSy/Xjs7Ny5YvSsacasGOkNfk+FdkiQy6N67bZX3Zbc9KIx+Nz4bu3iDeNSNplnnQ==} engines: {node: '>=16.0.0'} peerDependencies: - '@aws-sdk/client-sso-oidc': 3.575.0 + '@aws-sdk/client-sso-oidc': ^3.577.0 - '@aws-sdk/types@3.575.0': - resolution: {integrity: sha512-XrnolQGs0wXxdgNudirR14OgNOarH7WUif38+2Pd4onZH+L7XoILem0EgA1tRpgFpw2pFHlZCNaAHDNSBEal7g==} + '@aws-sdk/types@3.577.0': + resolution: {integrity: sha512-FT2JZES3wBKN/alfmhlo+3ZOq/XJ0C7QOZcDNrpKjB0kqYoKjhVKZ/Hx6ArR0czkKfHzBBEs6y40ebIHx2nSmA==} engines: {node: '>=16.0.0'} '@aws-sdk/util-arn-parser@3.568.0': resolution: {integrity: sha512-XUKJWWo+KOB7fbnPP0+g/o5Ulku/X53t7i/h+sPHr5xxYTJJ9CYnbToo95mzxe7xWvkLrsNtJ8L+MnNn9INs2w==} engines: {node: '>=16.0.0'} - '@aws-sdk/util-endpoints@3.575.0': - resolution: {integrity: sha512-wC5x+V6w3kRlR6X6XVINsAPDYG+Tzs3Wthlw+YLtjuPODUNZIQAqsABHahxnekFyAvse+1929Hwo+CaL+BHZGA==} + '@aws-sdk/util-endpoints@3.577.0': + resolution: {integrity: sha512-FjuUz1Kdy4Zly2q/c58tpdqHd6z7iOdU/caYzoc8jwgAHBDBbIJNQLCU9hXJnPV2M8pWxQDyIZsoVwtmvErPzw==} engines: {node: '>=16.0.0'} '@aws-sdk/util-locate-window@3.568.0': resolution: {integrity: sha512-3nh4TINkXYr+H41QaPelCceEB2FXP3fxp93YZXB/kqJvX0U9j0N0Uk45gvsjmEPzG8XxkPEeLIfT2I1M7A6Lig==} engines: {node: '>=16.0.0'} - '@aws-sdk/util-user-agent-browser@3.575.0': - resolution: {integrity: sha512-iADonXyaXgwvC4T0qRuDWCdKInz82GX2cyezq/oqVlL8bPY7HD8jwZZruuJdq5tkaJi1EhbO4+f1ksZqOiZKvQ==} + '@aws-sdk/util-user-agent-browser@3.577.0': + resolution: {integrity: sha512-zEAzHgR6HWpZOH7xFgeJLc6/CzMcx4nxeQolZxVZoB5pPaJd3CjyRhZN0xXeZB0XIRCWmb4yJBgyiugXLNMkLA==} - '@aws-sdk/util-user-agent-node@3.575.0': - resolution: {integrity: sha512-kwzvBfA0LoILDOFS6BV8uOkksBHrYulP6kNXegB5eZnDSNia5DbBsXqxQ/HknNF5a429SWQw2aaQJEgQvZB1VA==} + '@aws-sdk/util-user-agent-node@3.577.0': + resolution: {integrity: sha512-XqvtFjbSMtycZTWVwDe8DRWovuoMbA54nhUoZwVU6rW9OSD6NZWGR512BUGHFaWzW0Wg8++Dj10FrKTG2XtqfA==} engines: {node: '>=16.0.0'} peerDependencies: aws-crt: '>=1.0.0' @@ -1211,165 +1245,198 @@ packages: aws-crt: optional: true - '@aws-sdk/util-utf8-browser@3.259.0': - resolution: {integrity: sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==} - - '@aws-sdk/xml-builder@3.575.0': - resolution: {integrity: sha512-cWgAwmbFYNCFzPwxL705+lWps0F3ZvOckufd2KKoEZUmtpVw9/txUXNrPySUXSmRTSRhoatIMABNfStWR043bQ==} + '@aws-sdk/xml-builder@3.598.0': + resolution: {integrity: sha512-ZIa2RK7CHFTZ4gwK77WRtsZ6vF7xwRXxJ8KQIxK2duhoTVcn0xYxpFLdW9WZZZvdP9GIF3Loqvf8DRdeU5Jc7Q==} engines: {node: '>=16.0.0'} + '@babel/code-frame@7.23.5': + resolution: {integrity: sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==} + engines: {node: '>=6.9.0'} + '@babel/code-frame@7.24.2': resolution: {integrity: sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==} engines: {node: '>=6.9.0'} - '@babel/compat-data@7.24.4': - resolution: {integrity: sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==} + '@babel/code-frame@7.24.7': + resolution: {integrity: sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==} engines: {node: '>=6.9.0'} - '@babel/core@7.24.5': - resolution: {integrity: sha512-tVQRucExLQ02Boi4vdPp49svNGcfL2GhdTCT9aldhXgCJVAI21EtRfBettiuLUwce/7r6bFdgs6JFkcdTiFttA==} + '@babel/compat-data@7.25.4': + resolution: {integrity: sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ==} engines: {node: '>=6.9.0'} - '@babel/generator@7.24.5': - resolution: {integrity: sha512-x32i4hEXvr+iI0NEoEfDKzlemF8AmtOP8CcrRaEcpzysWuoEb1KknpcvMsHKPONoKZiDuItklgWhB18xEhr9PA==} + '@babel/core@7.25.2': + resolution: {integrity: sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==} engines: {node: '>=6.9.0'} - '@babel/helper-annotate-as-pure@7.22.5': - resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==} + '@babel/generator@7.25.6': + resolution: {integrity: sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw==} engines: {node: '>=6.9.0'} - '@babel/helper-builder-binary-assignment-operator-visitor@7.22.15': - resolution: {integrity: sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==} + '@babel/helper-annotate-as-pure@7.24.7': + resolution: {integrity: sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==} engines: {node: '>=6.9.0'} - '@babel/helper-compilation-targets@7.23.6': - resolution: {integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==} + '@babel/helper-builder-binary-assignment-operator-visitor@7.24.7': + resolution: {integrity: sha512-xZeCVVdwb4MsDBkkyZ64tReWYrLRHlMN72vP7Bdm3OUOuyFZExhsHUUnuWnm2/XOlAJzR0LfPpB56WXZn0X/lA==} engines: {node: '>=6.9.0'} - '@babel/helper-create-class-features-plugin@7.24.5': - resolution: {integrity: sha512-uRc4Cv8UQWnE4NXlYTIIdM7wfFkOqlFztcC/gVXDKohKoVB3OyonfelUBaJzSwpBntZ2KYGF/9S7asCHsXwW6g==} + '@babel/helper-compilation-targets@7.25.2': + resolution: {integrity: sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-create-class-features-plugin@7.23.10': + resolution: {integrity: sha512-2XpP2XhkXzgxecPNEEK8Vz8Asj9aRxt08oKOqtiZoqV2UGZ5T+EkyP9sXQ9nwMxBIG34a7jmasVqoMop7VdPUw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-create-regexp-features-plugin@7.22.15': - resolution: {integrity: sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==} + '@babel/helper-create-regexp-features-plugin@7.24.7': + resolution: {integrity: sha512-03TCmXy2FtXJEZfbXDTSqq1fRJArk7lX9DOFC/47VthYcxyIOx+eXQmdo6DOQvrbpIix+KfXwvuXdFDZHxt+rA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-define-polyfill-provider@0.6.2': - resolution: {integrity: sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==} + '@babel/helper-define-polyfill-provider@0.5.0': + resolution: {integrity: sha512-NovQquuQLAQ5HuyjCz7WQP9MjRj7dx++yspwiyUiGl9ZyadHRSql1HZh5ogRd8W8w6YM6EQ/NTB8rgjLt5W65Q==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - '@babel/helper-environment-visitor@7.22.20': - resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} + '@babel/helper-environment-visitor@7.24.7': + resolution: {integrity: sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-function-name@7.24.7': + resolution: {integrity: sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==} engines: {node: '>=6.9.0'} - '@babel/helper-function-name@7.23.0': - resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} + '@babel/helper-hoist-variables@7.24.7': + resolution: {integrity: sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==} engines: {node: '>=6.9.0'} - '@babel/helper-hoist-variables@7.22.5': - resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} + '@babel/helper-member-expression-to-functions@7.23.0': + resolution: {integrity: sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==} engines: {node: '>=6.9.0'} - '@babel/helper-member-expression-to-functions@7.24.5': - resolution: {integrity: sha512-4owRteeihKWKamtqg4JmWSsEZU445xpFRXPEwp44HbgbxdWlUV1b4Agg4lkA806Lil5XM/e+FJyS0vj5T6vmcA==} + '@babel/helper-module-imports@7.22.15': + resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} engines: {node: '>=6.9.0'} - '@babel/helper-module-imports@7.24.3': - resolution: {integrity: sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==} + '@babel/helper-module-imports@7.24.7': + resolution: {integrity: sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==} engines: {node: '>=6.9.0'} - '@babel/helper-module-transforms@7.24.5': - resolution: {integrity: sha512-9GxeY8c2d2mdQUP1Dye0ks3VDyIMS98kt/llQ2nUId8IsWqTF0l1LkSX0/uP7l7MCDrzXS009Hyhe2gzTiGW8A==} + '@babel/helper-module-transforms@7.25.2': + resolution: {integrity: sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-optimise-call-expression@7.22.5': - resolution: {integrity: sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==} + '@babel/helper-optimise-call-expression@7.24.7': + resolution: {integrity: sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A==} engines: {node: '>=6.9.0'} - '@babel/helper-plugin-utils@7.24.5': - resolution: {integrity: sha512-xjNLDopRzW2o6ba0gKbkZq5YWEBaK3PCyTOY1K2P/O07LGMhMqlMXPxwN4S5/RhWuCobT8z0jrlKGlYmeR1OhQ==} + '@babel/helper-plugin-utils@7.24.8': + resolution: {integrity: sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==} engines: {node: '>=6.9.0'} - '@babel/helper-remap-async-to-generator@7.22.20': - resolution: {integrity: sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==} + '@babel/helper-remap-async-to-generator@7.24.7': + resolution: {integrity: sha512-9pKLcTlZ92hNZMQfGCHImUpDOlAgkkpqalWEeftW5FBya75k8Li2ilerxkM/uBEj01iBZXcCIB/bwvDYgWyibA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-replace-supers@7.24.1': - resolution: {integrity: sha512-QCR1UqC9BzG5vZl8BMicmZ28RuUBnHhAMddD8yHFHDRH9lLTZ9uUPehX8ctVPT8l0TKblJidqcgUUKGVrePleQ==} + '@babel/helper-replace-supers@7.22.20': + resolution: {integrity: sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-simple-access@7.24.5': - resolution: {integrity: sha512-uH3Hmf5q5n7n8mz7arjUlDOCbttY/DW4DYhE6FUsjKJ/oYC1kQQUvwEQWxRwUpX9qQKRXeqLwWxrqilMrf32sQ==} + '@babel/helper-simple-access@7.24.7': + resolution: {integrity: sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==} engines: {node: '>=6.9.0'} - '@babel/helper-skip-transparent-expression-wrappers@7.22.5': - resolution: {integrity: sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==} + '@babel/helper-skip-transparent-expression-wrappers@7.24.7': + resolution: {integrity: sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ==} engines: {node: '>=6.9.0'} - '@babel/helper-split-export-declaration@7.24.5': - resolution: {integrity: sha512-5CHncttXohrHk8GWOFCcCl4oRD9fKosWlIRgWm4ql9VYioKm52Mk2xsmoohvm7f3JoiLSM5ZgJuRaf5QZZYd3Q==} + '@babel/helper-split-export-declaration@7.24.7': + resolution: {integrity: sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==} + 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-string-parser@7.24.8': + resolution: {integrity: sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==} + 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-identifier@7.24.7': + resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.24.7': + resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==} engines: {node: '>=6.9.0'} - '@babel/helper-string-parser@7.24.1': - resolution: {integrity: sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==} + '@babel/helper-validator-option@7.24.8': + resolution: {integrity: sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.24.5': - resolution: {integrity: sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA==} + '@babel/helper-wrap-function@7.22.20': + resolution: {integrity: sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-option@7.23.5': - resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==} + '@babel/helpers@7.25.6': + resolution: {integrity: sha512-Xg0tn4HcfTijTwfDwYlvVCl43V6h4KyVVX2aEm4qdO/PC6L2YvzLHFdmxhoeSA3eslcE6+ZVXHgWwopXYLNq4Q==} engines: {node: '>=6.9.0'} - '@babel/helper-wrap-function@7.24.5': - resolution: {integrity: sha512-/xxzuNvgRl4/HLNKvnFwdhdgN3cpLxgLROeLDl83Yx0AJ1SGvq1ak0OszTOjDfiB8Vx03eJbeDWh9r+jCCWttw==} + '@babel/highlight@7.23.4': + resolution: {integrity: sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==} engines: {node: '>=6.9.0'} - '@babel/helpers@7.24.5': - resolution: {integrity: sha512-CiQmBMMpMQHwM5m01YnrM6imUG1ebgYJ+fAIW4FZe6m4qHTPaRHti+R8cggAwkdz4oXhtO4/K9JWlh+8hIfR2Q==} + '@babel/highlight@7.24.7': + resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==} engines: {node: '>=6.9.0'} - '@babel/highlight@7.24.5': - resolution: {integrity: sha512-8lLmua6AVh/8SLJRRVD6V8p73Hir9w5mJrhE+IPpILG31KKlI9iz5zmBYKcWPS59qSfgP9RaSBQSHHE81WKuEw==} + '@babel/highlight@7.24.7': + resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==} engines: {node: '>=6.9.0'} + '@babel/parser@7.23.9': + resolution: {integrity: sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==} + engines: {node: '>=6.0.0'} + hasBin: true + '@babel/parser@7.24.5': resolution: {integrity: sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg==} engines: {node: '>=6.0.0'} hasBin: true - '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.24.5': - resolution: {integrity: sha512-LdXRi1wEMTrHVR4Zc9F8OewC3vdm5h4QB6L71zy6StmYeqGi1b3ttIO8UC+BfZKcH9jdr4aI249rBkm+3+YvHw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 + '@babel/parser@7.25.6': + resolution: {integrity: sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==} + engines: {node: '>=6.0.0'} + hasBin: true - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.24.1': - resolution: {integrity: sha512-y4HqEnkelJIOQGd+3g1bTeKsA5c6qM7eOn7VggGVbBc0y8MLSKHacwcIE2PplNlQSj0PqS9rrXL/nkPVK+kUNg==} + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.23.3': + resolution: {integrity: sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.24.1': - resolution: {integrity: sha512-Hj791Ii4ci8HqnaKHAlLNs+zaLXb0EzSDhiAWp5VNlyvCNymYfacs64pxTxbH1znW/NcArSmwpmG9IKE/TUVVQ==} + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.23.3': + resolution: {integrity: sha512-WwlxbfMNdVEpQjZmK5mhm7oSwD3dS6eU+Iwsi4Knl9wAletWem7kaRsGOG+8UEbRyqxY4SS5zvtfXwX+jMxUwQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.13.0 - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.24.1': - resolution: {integrity: sha512-m9m/fXsXLiHfwdgydIFnpk+7jlVbnvlK5B2EKiPdLUb6WX654ZaaEWJUjk8TftRbZpK0XibovlLWX4KIZhV6jw==} + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.23.7': + resolution: {integrity: sha512-LlRT7HgaifEpQA1ZgLVOIJZZFVPWN5iReq/7/JixwBtwcoeVGDBD53ZV28rrsLYOZs1Y/EHhA8N/Z6aazHR8cw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 @@ -1388,16 +1455,9 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-proposal-export-default-from@7.24.1': - resolution: {integrity: sha512-+0hrgGGV3xyYIjOrD/bUZk/iUwOIGuoANfRfVg1cPhYBxF+TIXSEcc42DqzBICmWsnAQ+SfKedY0bj8QD+LuMg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-proposal-logical-assignment-operators@7.20.7': - resolution: {integrity: sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==} + '@babel/plugin-proposal-export-default-from@7.23.3': + resolution: {integrity: sha512-Q23MpLZfSGZL1kU7fWqV262q65svLSCIP5kZ/JCW/rKTCm/FrLjpvEd2kfUYMVeHh4QhV/xzyoRAHWrAZJrE3Q==} engines: {node: '>=6.9.0'} - deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-logical-assignment-operators instead. peerDependencies: '@babel/core': ^7.0.0-0 @@ -1463,8 +1523,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-export-default-from@7.24.1': - resolution: {integrity: sha512-cNXSxv9eTkGUtd0PsNMK8Yx5xeScxfpWOUAxE+ZPAXXEcAMOC3fk7LRdXq5fvpra2pLx2p1YtkAhpUbB2SwaRA==} + '@babel/plugin-syntax-export-default-from@7.23.3': + resolution: {integrity: sha512-KeENO5ck1IeZ/l2lFZNy+mpobV3D2Zy5C1YFnWm+YuY5mQiAWc4yAp13dqgguwsBsFVLh4LPCEqCa5qW13N+hw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -1474,20 +1534,20 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-flow@7.24.1': - resolution: {integrity: sha512-sxi2kLTI5DeW5vDtMUsk4mTPwvlUDbjOnoWayhynCwrw4QXRld4QEYwqzY8JmQXaJUtgUuCIurtSRH5sn4c7mA==} + '@babel/plugin-syntax-flow@7.23.3': + resolution: {integrity: sha512-YZiAIpkJAwQXBJLIQbRFayR5c+gJ35Vcz3bg954k7cd73zqjvhacJuL9RbrzPz8qPmZdgqP6EUKwy0PCNhaaPA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-import-assertions@7.24.1': - resolution: {integrity: sha512-IuwnI5XnuF189t91XbxmXeCDz3qs6iDRO7GJ++wcfgeXNs/8FmIlKcpDSXNVyuLQxlwvskmI3Ct73wUODkJBlQ==} + '@babel/plugin-syntax-import-assertions@7.23.3': + resolution: {integrity: sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-import-attributes@7.24.1': - resolution: {integrity: sha512-zhQTMH0X2nVLnb04tz+s7AMuasX8U0FnpE+nHTOhSOINjWMnopoZTxtIKsd45n4GQ/HIZLyfIpoul8e2m0DnRA==} + '@babel/plugin-syntax-import-attributes@7.23.3': + resolution: {integrity: sha512-pawnE0P9g10xgoP7yKr6CK63K2FMsTE+FZidZO/1PwRdzmAPVs+HS1mAURUsgaoxammTJvULUdIkEK0gOcU2tA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -1502,8 +1562,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-jsx@7.24.1': - resolution: {integrity: sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA==} + '@babel/plugin-syntax-jsx@7.24.7': + resolution: {integrity: sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -1550,8 +1610,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-typescript@7.24.1': - resolution: {integrity: sha512-Yhnmvy5HZEnHUty6i++gcfH1/l68AHnItFHnaCv6hn9dNh0hQvvQJsxpi4BMBFN5DLeHBuucT/0DgzXif/OyRw==} + '@babel/plugin-syntax-typescript@7.23.3': + resolution: {integrity: sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -1562,344 +1622,344 @@ packages: peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-transform-arrow-functions@7.24.1': - resolution: {integrity: sha512-ngT/3NkRhsaep9ck9uj2Xhv9+xB1zShY3tM3g6om4xxCELwCDN4g4Aq5dRn48+0hasAql7s2hdBOysCfNpr4fw==} + '@babel/plugin-transform-arrow-functions@7.23.3': + resolution: {integrity: sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-async-generator-functions@7.24.3': - resolution: {integrity: sha512-Qe26CMYVjpQxJ8zxM1340JFNjZaF+ISWpr1Kt/jGo+ZTUzKkfw/pphEWbRCb+lmSM6k/TOgfYLvmbHkUQ0asIg==} + '@babel/plugin-transform-async-generator-functions@7.23.9': + resolution: {integrity: sha512-8Q3veQEDGe14dTYuwagbRtwxQDnytyg1JFu4/HwEMETeofocrB0U0ejBJIXoeG/t2oXZ8kzCyI0ZZfbT80VFNQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-async-to-generator@7.24.1': - resolution: {integrity: sha512-AawPptitRXp1y0n4ilKcGbRYWfbbzFWz2NqNu7dacYDtFtz0CMjG64b3LQsb3KIgnf4/obcUL78hfaOS7iCUfw==} + '@babel/plugin-transform-async-to-generator@7.23.3': + resolution: {integrity: sha512-A7LFsKi4U4fomjqXJlZg/u0ft/n8/7n7lpffUP/ZULx/DtV9SGlNKZolHH6PE8Xl1ngCc0M11OaeZptXVkfKSw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-block-scoped-functions@7.24.1': - resolution: {integrity: sha512-TWWC18OShZutrv9C6mye1xwtam+uNi2bnTOCBUd5sZxyHOiWbU6ztSROofIMrK84uweEZC219POICK/sTYwfgg==} + '@babel/plugin-transform-block-scoped-functions@7.23.3': + resolution: {integrity: sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-block-scoping@7.24.5': - resolution: {integrity: sha512-sMfBc3OxghjC95BkYrYocHL3NaOplrcaunblzwXhGmlPwpmfsxr4vK+mBBt49r+S240vahmv+kUxkeKgs+haCw==} + '@babel/plugin-transform-block-scoping@7.23.4': + resolution: {integrity: sha512-0QqbP6B6HOh7/8iNR4CQU2Th/bbRtBp4KS9vcaZd1fZ0wSh5Fyssg0UCIHwxh+ka+pNDREbVLQnHCMHKZfPwfw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-class-properties@7.24.1': - resolution: {integrity: sha512-OMLCXi0NqvJfORTaPQBwqLXHhb93wkBKZ4aNwMl6WtehO7ar+cmp+89iPEQPqxAnxsOKTaMcs3POz3rKayJ72g==} + '@babel/plugin-transform-class-properties@7.23.3': + resolution: {integrity: sha512-uM+AN8yCIjDPccsKGlw271xjJtGii+xQIF/uMPS8H15L12jZTsLfF4o5vNO7d/oUguOyfdikHGc/yi9ge4SGIg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-class-static-block@7.24.4': - resolution: {integrity: sha512-B8q7Pz870Hz/q9UgP8InNpY01CSLDSCyqX7zcRuv3FcPl87A2G17lASroHWaCtbdIcbYzOZ7kWmXFKbijMSmFg==} + '@babel/plugin-transform-class-static-block@7.23.4': + resolution: {integrity: sha512-nsWu/1M+ggti1SOALj3hfx5FXzAY06fwPJsUZD4/A5e1bWi46VUIWtD+kOX6/IdhXGsXBWllLFDSnqSCdUNydQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.12.0 - '@babel/plugin-transform-classes@7.24.5': - resolution: {integrity: sha512-gWkLP25DFj2dwe9Ck8uwMOpko4YsqyfZJrOmqqcegeDYEbp7rmn4U6UQZNj08UF6MaX39XenSpKRCvpDRBtZ7Q==} + '@babel/plugin-transform-classes@7.23.8': + resolution: {integrity: sha512-yAYslGsY1bX6Knmg46RjiCiNSwJKv2IUC8qOdYKqMMr0491SXFhcHqOdRDeCRohOOIzwN/90C6mQ9qAKgrP7dg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-computed-properties@7.24.1': - resolution: {integrity: sha512-5pJGVIUfJpOS+pAqBQd+QMaTD2vCL/HcePooON6pDpHgRp4gNRmzyHTPIkXntwKsq3ayUFVfJaIKPw2pOkOcTw==} + '@babel/plugin-transform-computed-properties@7.23.3': + resolution: {integrity: sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-destructuring@7.24.5': - resolution: {integrity: sha512-SZuuLyfxvsm+Ah57I/i1HVjveBENYK9ue8MJ7qkc7ndoNjqquJiElzA7f5yaAXjyW2hKojosOTAQQRX50bPSVg==} + '@babel/plugin-transform-destructuring@7.23.3': + resolution: {integrity: sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-dotall-regex@7.24.1': - resolution: {integrity: sha512-p7uUxgSoZwZ2lPNMzUkqCts3xlp8n+o05ikjy7gbtFJSt9gdU88jAmtfmOxHM14noQXBxfgzf2yRWECiNVhTCw==} + '@babel/plugin-transform-dotall-regex@7.23.3': + resolution: {integrity: sha512-vgnFYDHAKzFaTVp+mneDsIEbnJ2Np/9ng9iviHw3P/KVcgONxpNULEW/51Z/BaFojG2GI2GwwXck5uV1+1NOYQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-duplicate-keys@7.24.1': - resolution: {integrity: sha512-msyzuUnvsjsaSaocV6L7ErfNsa5nDWL1XKNnDePLgmz+WdU4w/J8+AxBMrWfi9m4IxfL5sZQKUPQKDQeeAT6lA==} + '@babel/plugin-transform-duplicate-keys@7.23.3': + resolution: {integrity: sha512-RrqQ+BQmU3Oyav3J+7/myfvRCq7Tbz+kKLLshUmMwNlDHExbGL7ARhajvoBJEvc+fCguPPu887N+3RRXBVKZUA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-dynamic-import@7.24.1': - resolution: {integrity: sha512-av2gdSTyXcJVdI+8aFZsCAtR29xJt0S5tas+Ef8NvBNmD1a+N/3ecMLeMBgfcK+xzsjdLDT6oHt+DFPyeqUbDA==} + '@babel/plugin-transform-dynamic-import@7.23.4': + resolution: {integrity: sha512-V6jIbLhdJK86MaLh4Jpghi8ho5fGzt3imHOBu/x0jlBaPYqDoWz4RDXjmMOfnh+JWNaQleEAByZLV0QzBT4YQQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-exponentiation-operator@7.24.1': - resolution: {integrity: sha512-U1yX13dVBSwS23DEAqU+Z/PkwE9/m7QQy8Y9/+Tdb8UWYaGNDYwTLi19wqIAiROr8sXVum9A/rtiH5H0boUcTw==} + '@babel/plugin-transform-exponentiation-operator@7.23.3': + resolution: {integrity: sha512-5fhCsl1odX96u7ILKHBj4/Y8vipoqwsJMh4csSA8qFfxrZDEA4Ssku2DyNvMJSmZNOEBT750LfFPbtrnTP90BQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-export-namespace-from@7.24.1': - resolution: {integrity: sha512-Ft38m/KFOyzKw2UaJFkWG9QnHPG/Q/2SkOrRk4pNBPg5IPZ+dOxcmkK5IyuBcxiNPyyYowPGUReyBvrvZs7IlQ==} + '@babel/plugin-transform-export-namespace-from@7.23.4': + resolution: {integrity: sha512-GzuSBcKkx62dGzZI1WVgTWvkkz84FZO5TC5T8dl/Tht/rAla6Dg/Mz9Yhypg+ezVACf/rgDuQt3kbWEv7LdUDQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-flow-strip-types@7.24.1': - resolution: {integrity: sha512-iIYPIWt3dUmUKKE10s3W+jsQ3icFkw0JyRVyY1B7G4yK/nngAOHLVx8xlhA6b/Jzl/Y0nis8gjqhqKtRDQqHWQ==} + '@babel/plugin-transform-flow-strip-types@7.23.3': + resolution: {integrity: sha512-26/pQTf9nQSNVJCrLB1IkHUKyPxR+lMrH2QDPG89+Znu9rAMbtrybdbWeE9bb7gzjmE5iXHEY+e0HUwM6Co93Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-for-of@7.24.1': - resolution: {integrity: sha512-OxBdcnF04bpdQdR3i4giHZNZQn7cm8RQKcSwA17wAAqEELo1ZOwp5FFgeptWUQXFyT9kwHo10aqqauYkRZPCAg==} + '@babel/plugin-transform-for-of@7.23.6': + resolution: {integrity: sha512-aYH4ytZ0qSuBbpfhuofbg/e96oQ7U2w1Aw/UQmKT+1l39uEhUPoFS3fHevDc1G0OvewyDudfMKY1OulczHzWIw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-function-name@7.24.1': - resolution: {integrity: sha512-BXmDZpPlh7jwicKArQASrj8n22/w6iymRnvHYYd2zO30DbE277JO20/7yXJT3QxDPtiQiOxQBbZH4TpivNXIxA==} + '@babel/plugin-transform-function-name@7.23.3': + resolution: {integrity: sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-json-strings@7.24.1': - resolution: {integrity: sha512-U7RMFmRvoasscrIFy5xA4gIp8iWnWubnKkKuUGJjsuOH7GfbMkB+XZzeslx2kLdEGdOJDamEmCqOks6e8nv8DQ==} + '@babel/plugin-transform-json-strings@7.23.4': + resolution: {integrity: sha512-81nTOqM1dMwZ/aRXQ59zVubN9wHGqk6UtqRK+/q+ciXmRy8fSolhGVvG09HHRGo4l6fr/c4ZhXUQH0uFW7PZbg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-literals@7.24.1': - resolution: {integrity: sha512-zn9pwz8U7nCqOYIiBaOxoQOtYmMODXTJnkxG4AtX8fPmnCRYWBOHD0qcpwS9e2VDSp1zNJYpdnFMIKb8jmwu6g==} + '@babel/plugin-transform-literals@7.23.3': + resolution: {integrity: sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-logical-assignment-operators@7.24.1': - resolution: {integrity: sha512-OhN6J4Bpz+hIBqItTeWJujDOfNP+unqv/NJgyhlpSqgBTPm37KkMmZV6SYcOj+pnDbdcl1qRGV/ZiIjX9Iy34w==} + '@babel/plugin-transform-logical-assignment-operators@7.23.4': + resolution: {integrity: sha512-Mc/ALf1rmZTP4JKKEhUwiORU+vcfarFVLfcFiolKUo6sewoxSEgl36ak5t+4WamRsNr6nzjZXQjM35WsU+9vbg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-member-expression-literals@7.24.1': - resolution: {integrity: sha512-4ojai0KysTWXzHseJKa1XPNXKRbuUrhkOPY4rEGeR+7ChlJVKxFa3H3Bz+7tWaGKgJAXUWKOGmltN+u9B3+CVg==} + '@babel/plugin-transform-member-expression-literals@7.23.3': + resolution: {integrity: sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-modules-amd@7.24.1': - resolution: {integrity: sha512-lAxNHi4HVtjnHd5Rxg3D5t99Xm6H7b04hUS7EHIXcUl2EV4yl1gWdqZrNzXnSrHveL9qMdbODlLF55mvgjAfaQ==} + '@babel/plugin-transform-modules-amd@7.23.3': + resolution: {integrity: sha512-vJYQGxeKM4t8hYCKVBlZX/gtIY2I7mRGFNcm85sgXGMTBcoV3QdVtdpbcWEbzbfUIUZKwvgFT82mRvaQIebZzw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-modules-commonjs@7.24.1': - resolution: {integrity: sha512-szog8fFTUxBfw0b98gEWPaEqF42ZUD/T3bkynW/wtgx2p/XCP55WEsb+VosKceRSd6njipdZvNogqdtI4Q0chw==} + '@babel/plugin-transform-modules-commonjs@7.23.3': + resolution: {integrity: sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-modules-systemjs@7.24.1': - resolution: {integrity: sha512-mqQ3Zh9vFO1Tpmlt8QPnbwGHzNz3lpNEMxQb1kAemn/erstyqw1r9KeOlOfo3y6xAnFEcOv2tSyrXfmMk+/YZA==} + '@babel/plugin-transform-modules-systemjs@7.23.9': + resolution: {integrity: sha512-KDlPRM6sLo4o1FkiSlXoAa8edLXFsKKIda779fbLrvmeuc3itnjCtaO6RrtoaANsIJANj+Vk1zqbZIMhkCAHVw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-modules-umd@7.24.1': - resolution: {integrity: sha512-tuA3lpPj+5ITfcCluy6nWonSL7RvaG0AOTeAuvXqEKS34lnLzXpDb0dcP6K8jD0zWZFNDVly90AGFJPnm4fOYg==} + '@babel/plugin-transform-modules-umd@7.23.3': + resolution: {integrity: sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-named-capturing-groups-regex@7.22.5': - resolution: {integrity: sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==} + '@babel/plugin-transform-named-capturing-groups-regex@7.24.7': + resolution: {integrity: sha512-/jr7h/EWeJtk1U/uz2jlsCioHkZk1JJZVcc8oQsJ1dUlaJD83f4/6Zeh2aHt9BIFokHIsSeDfhUmju0+1GPd6g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-transform-new-target@7.24.1': - resolution: {integrity: sha512-/rurytBM34hYy0HKZQyA0nHbQgQNFm4Q/BOc9Hflxi2X3twRof7NaE5W46j4kQitm7SvACVRXsa6N/tSZxvPug==} + '@babel/plugin-transform-new-target@7.23.3': + resolution: {integrity: sha512-YJ3xKqtJMAT5/TIZnpAR3I+K+WaDowYbN3xyxI8zxx/Gsypwf9B9h0VB+1Nh6ACAAPRS5NSRje0uVv5i79HYGQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-nullish-coalescing-operator@7.24.1': - resolution: {integrity: sha512-iQ+caew8wRrhCikO5DrUYx0mrmdhkaELgFa+7baMcVuhxIkN7oxt06CZ51D65ugIb1UWRQ8oQe+HXAVM6qHFjw==} + '@babel/plugin-transform-nullish-coalescing-operator@7.23.4': + resolution: {integrity: sha512-jHE9EVVqHKAQx+VePv5LLGHjmHSJR76vawFPTdlxR/LVJPfOEGxREQwQfjuZEOPTwG92X3LINSh3M40Rv4zpVA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-numeric-separator@7.24.1': - resolution: {integrity: sha512-7GAsGlK4cNL2OExJH1DzmDeKnRv/LXq0eLUSvudrehVA5Rgg4bIrqEUW29FbKMBRT0ztSqisv7kjP+XIC4ZMNw==} + '@babel/plugin-transform-numeric-separator@7.23.4': + resolution: {integrity: sha512-mps6auzgwjRrwKEZA05cOwuDc9FAzoyFS4ZsG/8F43bTLf/TgkJg7QXOrPO1JO599iA3qgK9MXdMGOEC8O1h6Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-object-rest-spread@7.24.5': - resolution: {integrity: sha512-7EauQHszLGM3ay7a161tTQH7fj+3vVM/gThlz5HpFtnygTxjrlvoeq7MPVA1Vy9Q555OB8SnAOsMkLShNkkrHA==} + '@babel/plugin-transform-object-rest-spread@7.23.4': + resolution: {integrity: sha512-9x9K1YyeQVw0iOXJlIzwm8ltobIIv7j2iLyP2jIhEbqPRQ7ScNgwQufU2I0Gq11VjyG4gI4yMXt2VFags+1N3g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-object-super@7.24.1': - resolution: {integrity: sha512-oKJqR3TeI5hSLRxudMjFQ9re9fBVUU0GICqM3J1mi8MqlhVr6hC/ZN4ttAyMuQR6EZZIY6h/exe5swqGNNIkWQ==} + '@babel/plugin-transform-object-super@7.23.3': + resolution: {integrity: sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-optional-catch-binding@7.24.1': - resolution: {integrity: sha512-oBTH7oURV4Y+3EUrf6cWn1OHio3qG/PVwO5J03iSJmBg6m2EhKjkAu/xuaXaYwWW9miYtvbWv4LNf0AmR43LUA==} + '@babel/plugin-transform-optional-catch-binding@7.23.4': + resolution: {integrity: sha512-XIq8t0rJPHf6Wvmbn9nFxU6ao4c7WhghTR5WyV8SrJfUFzyxhCm4nhC+iAp3HFhbAKLfYpgzhJ6t4XCtVwqO5A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-optional-chaining@7.24.5': - resolution: {integrity: sha512-xWCkmwKT+ihmA6l7SSTpk8e4qQl/274iNbSKRRS8mpqFR32ksy36+a+LWY8OXCCEefF8WFlnOHVsaDI2231wBg==} + '@babel/plugin-transform-optional-chaining@7.23.4': + resolution: {integrity: sha512-ZU8y5zWOfjM5vZ+asjgAPwDaBjJzgufjES89Rs4Lpq63O300R/kOz30WCLo6BxxX6QVEilwSlpClnG5cZaikTA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-parameters@7.24.5': - resolution: {integrity: sha512-9Co00MqZ2aoky+4j2jhofErthm6QVLKbpQrvz20c3CH9KQCLHyNB+t2ya4/UrRpQGR+Wrwjg9foopoeSdnHOkA==} + '@babel/plugin-transform-parameters@7.23.3': + resolution: {integrity: sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-private-methods@7.24.1': - resolution: {integrity: sha512-tGvisebwBO5em4PaYNqt4fkw56K2VALsAbAakY0FjTYqJp7gfdrgr7YX76Or8/cpik0W6+tj3rZ0uHU9Oil4tw==} + '@babel/plugin-transform-private-methods@7.23.3': + resolution: {integrity: sha512-UzqRcRtWsDMTLrRWFvUBDwmw06tCQH9Rl1uAjfh6ijMSmGYQ+fpdB+cnqRC8EMh5tuuxSv0/TejGL+7vyj+50g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-private-property-in-object@7.24.5': - resolution: {integrity: sha512-JM4MHZqnWR04jPMujQDTBVRnqxpLLpx2tkn7iPn+Hmsc0Gnb79yvRWOkvqFOx3Z7P7VxiRIR22c4eGSNj87OBQ==} + '@babel/plugin-transform-private-property-in-object@7.23.4': + resolution: {integrity: sha512-9G3K1YqTq3F4Vt88Djx1UZ79PDyj+yKRnUy7cZGSMe+a7jkwD259uKKuUzQlPkGam7R+8RJwh5z4xO27fA1o2A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-property-literals@7.24.1': - resolution: {integrity: sha512-LetvD7CrHmEx0G442gOomRr66d7q8HzzGGr4PMHGr+5YIm6++Yke+jxj246rpvsbyhJwCLxcTn6zW1P1BSenqA==} + '@babel/plugin-transform-property-literals@7.23.3': + resolution: {integrity: sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-display-name@7.24.1': - resolution: {integrity: sha512-mvoQg2f9p2qlpDQRBC7M3c3XTr0k7cp/0+kFKKO/7Gtu0LSw16eKB+Fabe2bDT/UpsyasTBBkAnbdsLrkD5XMw==} + '@babel/plugin-transform-react-display-name@7.23.3': + resolution: {integrity: sha512-GnvhtVfA2OAtzdX58FJxU19rhoGeQzyVndw3GgtdECQvQFXPEZIOVULHVZGAYmOgmqjXpVpfocAbSjh99V/Fqw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-jsx-self@7.24.5': - resolution: {integrity: sha512-RtCJoUO2oYrYwFPtR1/jkoBEcFuI1ae9a9IMxeyAVa3a1Ap4AnxmyIKG2b2FaJKqkidw/0cxRbWN+HOs6ZWd1w==} + '@babel/plugin-transform-react-jsx-self@7.23.3': + resolution: {integrity: sha512-qXRvbeKDSfwnlJnanVRp0SfuWE5DQhwQr5xtLBzp56Wabyo+4CMosF6Kfp+eOD/4FYpql64XVJ2W0pVLlJZxOQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-jsx-source@7.24.1': - resolution: {integrity: sha512-1v202n7aUq4uXAieRTKcwPzNyphlCuqHHDcdSNc+vdhoTEZcFMh+L5yZuCmGaIO7bs1nJUNfHB89TZyoL48xNA==} + '@babel/plugin-transform-react-jsx-source@7.23.3': + resolution: {integrity: sha512-91RS0MDnAWDNvGC6Wio5XYkyWI39FMFO+JK9+4AlgaTH+yWwVTsw7/sn6LK0lH7c5F+TFkpv/3LfCJ1Ydwof/g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-jsx@7.23.4': - resolution: {integrity: sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA==} + '@babel/plugin-transform-react-jsx@7.25.2': + resolution: {integrity: sha512-KQsqEAVBpU82NM/B/N9j9WOdphom1SZH3R+2V7INrQUH+V9EBFwZsEJl8eBIVeQE62FxJCc70jzEZwqU7RcVqA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-regenerator@7.24.1': - resolution: {integrity: sha512-sJwZBCzIBE4t+5Q4IGLaaun5ExVMRY0lYwos/jNecjMrVCygCdph3IKv0tkP5Fc87e/1+bebAmEAGBfnRD+cnw==} + '@babel/plugin-transform-regenerator@7.23.3': + resolution: {integrity: sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-reserved-words@7.24.1': - resolution: {integrity: sha512-JAclqStUfIwKN15HrsQADFgeZt+wexNQ0uLhuqvqAUFoqPMjEcFCYZBhq0LUdz6dZK/mD+rErhW71fbx8RYElg==} + '@babel/plugin-transform-reserved-words@7.23.3': + resolution: {integrity: sha512-QnNTazY54YqgGxwIexMZva9gqbPa15t/x9VS+0fsEFWplwVpXYZivtgl43Z1vMpc1bdPP2PP8siFeVcnFvA3Cg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-runtime@7.24.3': - resolution: {integrity: sha512-J0BuRPNlNqlMTRJ72eVptpt9VcInbxO6iP3jaxr+1NPhC0UkKL+6oeX6VXMEYdADnuqmMmsBspt4d5w8Y/TCbQ==} + '@babel/plugin-transform-runtime@7.23.9': + resolution: {integrity: sha512-A7clW3a0aSjm3ONU9o2HAILSegJCYlEZmOhmBRReVtIpY/Z/p7yIZ+wR41Z+UipwdGuqwtID/V/dOdZXjwi9gQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-shorthand-properties@7.24.1': - resolution: {integrity: sha512-LyjVB1nsJ6gTTUKRjRWx9C1s9hE7dLfP/knKdrfeH9UPtAGjYGgxIbFfx7xyLIEWs7Xe1Gnf8EWiUqfjLhInZA==} + '@babel/plugin-transform-shorthand-properties@7.23.3': + resolution: {integrity: sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-spread@7.24.1': - resolution: {integrity: sha512-KjmcIM+fxgY+KxPVbjelJC6hrH1CgtPmTvdXAfn3/a9CnWGSTY7nH4zm5+cjmWJybdcPSsD0++QssDsjcpe47g==} + '@babel/plugin-transform-spread@7.23.3': + resolution: {integrity: sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-sticky-regex@7.24.1': - resolution: {integrity: sha512-9v0f1bRXgPVcPrngOQvLXeGNNVLc8UjMVfebo9ka0WF3/7+aVUHmaJVT3sa0XCzEFioPfPHZiOcYG9qOsH63cw==} + '@babel/plugin-transform-sticky-regex@7.23.3': + resolution: {integrity: sha512-HZOyN9g+rtvnOU3Yh7kSxXrKbzgrm5X4GncPY1QOquu7epga5MxKHVpYu2hvQnry/H+JjckSYRb93iNfsioAGg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-template-literals@7.24.1': - resolution: {integrity: sha512-WRkhROsNzriarqECASCNu/nojeXCDTE/F2HmRgOzi7NGvyfYGq1NEjKBK3ckLfRgGc6/lPAqP0vDOSw3YtG34g==} + '@babel/plugin-transform-template-literals@7.23.3': + resolution: {integrity: sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-typeof-symbol@7.24.5': - resolution: {integrity: sha512-UTGnhYVZtTAjdwOTzT+sCyXmTn8AhaxOS/MjG9REclZ6ULHWF9KoCZur0HSGU7hk8PdBFKKbYe6+gqdXWz84Jg==} + '@babel/plugin-transform-typeof-symbol@7.23.3': + resolution: {integrity: sha512-4t15ViVnaFdrPC74be1gXBSMzXk3B4Us9lP7uLRQHTFpV5Dvt33pn+2MyyNxmN3VTTm3oTrZVMUmuw3oBnQ2oQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-typescript@7.24.5': - resolution: {integrity: sha512-E0VWu/hk83BIFUWnsKZ4D81KXjN5L3MobvevOHErASk9IPwKHOkTgvqzvNo1yP/ePJWqqK2SpUR5z+KQbl6NVw==} + '@babel/plugin-transform-typescript@7.23.6': + resolution: {integrity: sha512-6cBG5mBvUu4VUD04OHKnYzbuHNP8huDsD3EDqqpIpsswTDoqHCjLoHb6+QgsV1WsT2nipRqCPgxD3LXnEO7XfA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-unicode-escapes@7.24.1': - resolution: {integrity: sha512-RlkVIcWT4TLI96zM660S877E7beKlQw7Ig+wqkKBiWfj0zH5Q4h50q6er4wzZKRNSYpfo6ILJ+hrJAGSX2qcNw==} + '@babel/plugin-transform-unicode-escapes@7.23.3': + resolution: {integrity: sha512-OMCUx/bU6ChE3r4+ZdylEqAjaQgHAgipgW8nsCfu5pGqDcFytVd91AwRvUJSBZDz0exPGgnjoqhgRYLRjFZc9Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-unicode-property-regex@7.24.1': - resolution: {integrity: sha512-Ss4VvlfYV5huWApFsF8/Sq0oXnGO+jB+rijFEFugTd3cwSObUSnUi88djgR5528Csl0uKlrI331kRqe56Ov2Ng==} + '@babel/plugin-transform-unicode-property-regex@7.23.3': + resolution: {integrity: sha512-KcLIm+pDZkWZQAFJ9pdfmh89EwVfmNovFBcXko8szpBeF8z68kWIPeKlmSOkT9BXJxs2C0uk+5LxoxIv62MROA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-unicode-regex@7.24.1': - resolution: {integrity: sha512-2A/94wgZgxfTsiLaQ2E36XAOdcZmGAaEEgVmxQWwZXWkGhvoHbaqXcKnU8zny4ycpu3vNqg0L/PcCiYtHtA13g==} + '@babel/plugin-transform-unicode-regex@7.23.3': + resolution: {integrity: sha512-wMHpNA4x2cIA32b/ci3AfwNgheiva2W0WUKWTK7vBHBhDKfPsc5cFGNWm69WBqpwd86u1qwZ9PWevKqm1A3yAw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-unicode-sets-regex@7.24.1': - resolution: {integrity: sha512-fqj4WuzzS+ukpgerpAoOnMfQXwUHFxXUZUE84oL2Kao2N8uSlvcpnAidKASgsNgzZHBsHWvcm8s9FPWUhAb8fA==} + '@babel/plugin-transform-unicode-sets-regex@7.23.3': + resolution: {integrity: sha512-W7lliA/v9bNR83Qc3q1ip9CQMZ09CcHDbHfbLRDNuAhn1Mvkr1ZNF7hPmztMQvtTGVLJ9m8IZqWsTkXOml8dbw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/preset-env@7.24.5': - resolution: {integrity: sha512-UGK2ifKtcC8i5AI4cH+sbLLuLc2ktYSFJgBAXorKAsHUZmrQ1q6aQ6i3BvU24wWs2AAKqQB6kq3N9V9Gw1HiMQ==} + '@babel/preset-env@7.23.9': + resolution: {integrity: sha512-3kBGTNBBk9DQiPoXYS0g0BYlwTQYUTifqgKTjxUwEUkduRT2QOa0FPGBJ+NROQhGyYO5BuTJwGvBnqKDykac6A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/preset-flow@7.24.1': - resolution: {integrity: sha512-sWCV2G9pcqZf+JHyv/RyqEIpFypxdCSxWIxQjpdaQxenNog7cN1pr76hg8u0Fz8Qgg0H4ETkGcJnXL8d4j0PPA==} + '@babel/preset-flow@7.23.3': + resolution: {integrity: sha512-7yn6hl8RIv+KNk6iIrGZ+D06VhVY35wLVf23Cz/mMu1zOr7u4MMP4j0nZ9tLf8+4ZFpnib8cFYgB/oYg9hfswA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -1909,14 +1969,14 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 - '@babel/preset-typescript@7.24.1': - resolution: {integrity: sha512-1DBaMmRDpuYQBPWD8Pf/WEwCrtgRHxsZnP4mIy9G/X+hFfbI47Q2G4t1Paakld84+qsk2fSsUPMKg71jkoOOaQ==} + '@babel/preset-typescript@7.23.3': + resolution: {integrity: sha512-17oIGVlqz6CchO9RFYn5U6ZpWRZIngayYCtrPRSgANSwC2V1Jb+iP74nVxzzXJte8b8BYxrL1yY96xfhTBrNNQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/register@7.23.7': - resolution: {integrity: sha512-EjJeB6+kvpk+Y5DAkEAmbOBEFkh9OASx0huoEkqYTFxAZHzOAX2Oh5uwAUuL2rUddqfM0SA+KPXV2TbzoZ2kvQ==} + '@babel/register@7.24.6': + resolution: {integrity: sha512-WSuFCc2wCqMeXkz/i3yfAAsxwWflEgbVkZzivgAmXl/MxrXeoYFZOOPllbC8R8WTF7u61wSRQtDVZ1879cdu6w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -1924,20 +1984,24 @@ packages: '@babel/regjsgen@0.8.0': resolution: {integrity: sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==} - '@babel/runtime@7.24.5': - resolution: {integrity: sha512-Nms86NXrsaeU9vbBJKni6gXiEXZ4CVpYVzEjDH9Sb8vmZ3UljyA1GSOJl/6LGPO8EHLuSF9H+IxNXHPX8QHJ4g==} + '@babel/runtime@7.23.9': + resolution: {integrity: sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw==} + engines: {node: '>=6.9.0'} + + '@babel/template@7.25.0': + resolution: {integrity: sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==} engines: {node: '>=6.9.0'} - '@babel/template@7.24.0': - resolution: {integrity: sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==} + '@babel/traverse@7.25.6': + resolution: {integrity: sha512-9Vrcx5ZW6UwK5tvqsj0nGpp/XzqthkT0dqIc9g1AdtygFToNtTF67XzYS//dm+SAK9cp3B9R4ZO/46p63SCjlQ==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.24.5': - resolution: {integrity: sha512-7aaBLeDQ4zYcUFDUD41lJc1fG8+5IU9DaNSJAgal866FGvmD5EbWQgnEC6kO1gGLsX0esNkfnJSndbTXA3r7UA==} + '@babel/types@7.23.9': + resolution: {integrity: sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q==} engines: {node: '>=6.9.0'} - '@babel/types@7.24.5': - resolution: {integrity: sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ==} + '@babel/types@7.25.6': + resolution: {integrity: sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==} engines: {node: '>=6.9.0'} '@bcoe/v8-coverage@0.2.3': @@ -1949,8 +2013,67 @@ packages: '@chainsafe/netmask@2.0.0': resolution: {integrity: sha512-I3Z+6SWUoaljh3TBzCnCxjlUyN8tA+NAk5L6m9IxvCf1BENQTePzPMis97CoN/iMW1St3WN+AWCCRp+TTBRiDg==} - '@chromatic-com/storybook@1.3.4': - resolution: {integrity: sha512-ZfQDc5Zg5YSC9cWdBc9QpMF0vgvknwKTB9xBE0NhCJWjGxG9mz9yLzQTzzliYulPtWgcQ+8cE+apDljYK+fWdQ==} + '@changesets/apply-release-plan@7.0.5': + resolution: {integrity: sha512-1cWCk+ZshEkSVEZrm2fSj1Gz8sYvxgUL4Q78+1ZZqeqfuevPTPk033/yUZ3df8BKMohkqqHfzj0HOOrG0KtXTw==} + + '@changesets/assemble-release-plan@6.0.4': + resolution: {integrity: sha512-nqICnvmrwWj4w2x0fOhVj2QEGdlUuwVAwESrUo5HLzWMI1rE5SWfsr9ln+rDqWB6RQ2ZyaMZHUcU7/IRaUJS+Q==} + + '@changesets/changelog-git@0.2.0': + resolution: {integrity: sha512-bHOx97iFI4OClIT35Lok3sJAwM31VbUM++gnMBV16fdbtBhgYu4dxsphBF/0AZZsyAHMrnM0yFcj5gZM1py6uQ==} + + '@changesets/cli@2.27.8': + resolution: {integrity: sha512-gZNyh+LdSsI82wBSHLQ3QN5J30P4uHKJ4fXgoGwQxfXwYFTJzDdvIJasZn8rYQtmKhyQuiBj4SSnLuKlxKWq4w==} + hasBin: true + + '@changesets/config@3.0.3': + resolution: {integrity: sha512-vqgQZMyIcuIpw9nqFIpTSNyc/wgm/Lu1zKN5vECy74u95Qx/Wa9g27HdgO4NkVAaq+BGA8wUc/qvbvVNs93n6A==} + + '@changesets/errors@0.2.0': + resolution: {integrity: sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==} + + '@changesets/get-dependents-graph@2.1.2': + resolution: {integrity: sha512-sgcHRkiBY9i4zWYBwlVyAjEM9sAzs4wYVwJUdnbDLnVG3QwAaia1Mk5P8M7kraTOZN+vBET7n8KyB0YXCbFRLQ==} + + '@changesets/get-release-plan@4.0.4': + resolution: {integrity: sha512-SicG/S67JmPTrdcc9Vpu0wSQt7IiuN0dc8iR5VScnnTVPfIaLvKmEGRvIaF0kcn8u5ZqLbormZNTO77bCEvyWw==} + + '@changesets/get-version-range-type@0.4.0': + resolution: {integrity: sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==} + + '@changesets/git@3.0.1': + resolution: {integrity: sha512-pdgHcYBLCPcLd82aRcuO0kxCDbw/yISlOtkmwmE8Odo1L6hSiZrBOsRl84eYG7DRCab/iHnOkWqExqc4wxk2LQ==} + + '@changesets/logger@0.1.1': + resolution: {integrity: sha512-OQtR36ZlnuTxKqoW4Sv6x5YIhOmClRd5pWsjZsddYxpWs517R0HkyiefQPIytCVh4ZcC5x9XaG8KTdd5iRQUfg==} + + '@changesets/parse@0.4.0': + resolution: {integrity: sha512-TS/9KG2CdGXS27S+QxbZXgr8uPsP4yNJYb4BC2/NeFUj80Rni3TeD2qwWmabymxmrLo7JEsytXH1FbpKTbvivw==} + + '@changesets/pre@2.0.1': + resolution: {integrity: sha512-vvBJ/If4jKM4tPz9JdY2kGOgWmCowUYOi5Ycv8dyLnEE8FgpYYUo1mgJZxcdtGGP3aG8rAQulGLyyXGSLkIMTQ==} + + '@changesets/read@0.6.1': + resolution: {integrity: sha512-jYMbyXQk3nwP25nRzQQGa1nKLY0KfoOV7VLgwucI0bUO8t8ZLCr6LZmgjXsiKuRDc+5A6doKPr9w2d+FEJ55zQ==} + + '@changesets/should-skip-package@0.1.1': + resolution: {integrity: sha512-H9LjLbF6mMHLtJIc/eHR9Na+MifJ3VxtgP/Y+XLn4BF7tDTEN1HNYtH6QMcjP1uxp9sjaFYmW8xqloaCi/ckTg==} + + '@changesets/types@4.1.0': + resolution: {integrity: sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==} + + '@changesets/types@6.0.0': + resolution: {integrity: sha512-b1UkfNulgKoWfqyHtzKS5fOZYSJO+77adgL7DLRDr+/7jhChN+QcHnbjiQVOz/U+Ts3PGNySq7diAItzDgugfQ==} + + '@changesets/write@0.3.2': + resolution: {integrity: sha512-kDxDrPNpUgsjDbWBvUo27PzKX4gqeKOlhibaOXDJA6kuBisGqNHv/HwGJrAu8U/dSf8ZEFIeHIPtvSlZI1kULw==} + + '@chromatic-com/storybook@1.3.3': + resolution: {integrity: sha512-1y9r691T5vVGDZ0HY3YrCXUnvtrT2YrhDuvDZSvYSNUVpM/Imz6i1dnNMKb3eoI1qRsH55mI4zCt+Iq94NLedQ==} + engines: {node: '>=16.0.0', yarn: '>=1.22.18'} + + '@chromatic-com/storybook@1.9.0': + resolution: {integrity: sha512-vYQ+TcfktEE3GHnLZXHCzXF/sN9dw+KivH8a5cmPyd9YtQs7fZtHrEgsIjWpYycXiweKMo1Lm1RZsjxk8DH3rA==} engines: {node: '>=16.0.0', yarn: '>=1.22.18'} '@coinbase/wallet-sdk@3.9.1': @@ -1959,8 +2082,8 @@ packages: '@coinbase/wallet-sdk@3.9.3': resolution: {integrity: sha512-N/A2DRIf0Y3PHc1XAMvbBUu4zisna6qAdqABMZwBMNEfWrXpAwx16pZGkYCLGE+Rvv1edbcB2LYDRnACNcmCiw==} - '@coinbase/wallet-sdk@4.0.2': - resolution: {integrity: sha512-WMUeFbtS0rn8zavjAmNhFWq1r3TV7E5KuSij1Sar0/XuOC+nhj96uqSlIApAHdhuScoKZBq39VYsAQCHzOC6/w==} + '@coinbase/wallet-sdk@4.0.4': + resolution: {integrity: sha512-74c040CRnGhfRjr3ArnkAgud86erIqdkPHNt5HR1k9u97uTIZCJww9eGYT67Qf7gHPpGS/xW8Be1D4dvRm63FA==} '@colors/colors@1.5.0': resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} @@ -1976,8 +2099,8 @@ packages: peerDependencies: postcss-selector-parser: ^6.0.13 - '@csstools/selector-specificity@3.0.3': - resolution: {integrity: sha512-KEPNw4+WW5AVEIyzC80rTbWEUatTW2lXpN8+8ILC8PiPeWPjwUzrPZDIOZ2wwqDmeqOYTdSGyL3+vE5GC3FB3Q==} + '@csstools/selector-specificity@3.0.2': + resolution: {integrity: sha512-RpHaZ1h9LE7aALeQXmXrJkRG84ZxIsctEN2biEUmFyKpzFM3zZ35eUMcIzZFsw/2olQE6v69+esEqU2f1MKycg==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss-selector-parser: ^6.0.13 @@ -1986,27 +2109,84 @@ packages: resolution: {integrity: sha512-WyOx8cJQ+FQus4Mm4uPIZA64gbk3Wxh0so5Lcii0aJifqwoVOlfFtorjLE0Hen4OYyHZMXDWqMmaQemBhgxFRQ==} engines: {node: '>=14'} - '@discoveryjs/json-ext@0.5.7': - resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==} - engines: {node: '>=10.0.0'} - '@emmetio/abbreviation@2.3.3': resolution: {integrity: sha512-mgv58UrU3rh4YgbE/TzgLQwJ3pFsHHhCLqY20aJq+9comytTXUDNGG/SMtSeMJdkpxgXSXunBGLD8Boka3JyVA==} '@emmetio/css-abbreviation@2.1.8': resolution: {integrity: sha512-s9yjhJ6saOO/uk1V74eifykk2CBYi01STTK3WlXWGOepyKa23ymJ053+DNQjpFcy1ingpaO7AxCcwLvHFY9tuw==} + '@emmetio/css-parser@0.4.0': + resolution: {integrity: sha512-z7wkxRSZgrQHXVzObGkXG+Vmj3uRlpM11oCZ9pbaz0nFejvCDmAiNDpY75+wgXOcffKpj4rzGtwGaZxfJKsJxw==} + + '@emmetio/html-matcher@1.3.0': + resolution: {integrity: sha512-NTbsvppE5eVyBMuyGfVu2CRrLvo7J4YHb6t9sBFLyY03WYhXET37qA4zOYUjBWFCRHO7pS1B9khERtY0f5JXPQ==} + '@emmetio/scanner@1.0.4': resolution: {integrity: sha512-IqRuJtQff7YHHBk4G8YZ45uB9BaAGcwQeVzgj/zj8/UdOhtQpEIupUhSk8dys6spFIWVZVeK20CzGEnqR5SbqA==} + '@emmetio/stream-reader-utils@0.1.0': + resolution: {integrity: sha512-ZsZ2I9Vzso3Ho/pjZFsmmZ++FWeEd/txqybHTm4OgaZzdS8V9V/YYWQwg5TC38Z7uLWUV1vavpLLbjJtKubR1A==} + + '@emmetio/stream-reader@2.2.0': + resolution: {integrity: sha512-fXVXEyFA5Yv3M3n8sUGT7+fvecGrZP4k6FnWWMSZVQf69kAq0LLpaBQLGcPR30m3zMmKYhECP4k/ZkzvhEW5kw==} + '@emnapi/runtime@1.1.1': resolution: {integrity: sha512-3bfqkzuR1KLx57nZfjr2NLnFOobvyS0aTszaEGCGqmYMVDRaGvgIZbjGSV/MHSSmLgQ/b9JFHQ5xm5WRZYd+XQ==} + '@emotion/babel-plugin@11.11.0': + resolution: {integrity: sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==} + + '@emotion/cache@11.11.0': + resolution: {integrity: sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==} + + '@emotion/hash@0.9.1': + resolution: {integrity: sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==} + + '@emotion/is-prop-valid@1.2.1': + resolution: {integrity: sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw==} + + '@emotion/memoize@0.8.1': + resolution: {integrity: sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==} + + '@emotion/react@11.11.3': + resolution: {integrity: sha512-Cnn0kuq4DoONOMcnoVsTOR8E+AdnKFf//6kUWc4LCdnxj31pZWn7rIULd6Y7/Js1PiPHzn7SKCM9vB/jBni8eA==} + peerDependencies: + '@types/react': '*' + react: '>=16.8.0' + peerDependenciesMeta: + '@types/react': + optional: true + + '@emotion/serialize@1.1.3': + resolution: {integrity: sha512-iD4D6QVZFDhcbH0RAG1uVu1CwVLMWUkCvAqqlewO/rxf8+87yIBAlt4+AxMiiKPLs5hFc0owNk/sLLAOROw3cA==} + + '@emotion/sheet@1.2.2': + resolution: {integrity: sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==} + + '@emotion/styled@11.11.0': + resolution: {integrity: sha512-hM5Nnvu9P3midq5aaXj4I+lnSfNi7Pmd4EWk1fOZ3pxookaQTNew6bp4JaCBYM4HVFZF9g7UjJmsUmC2JlxOng==} + peerDependencies: + '@emotion/react': ^11.0.0-rc.0 + '@types/react': '*' + react: '>=16.8.0' + peerDependenciesMeta: + '@types/react': + optional: true + + '@emotion/unitless@0.8.1': + resolution: {integrity: sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==} + '@emotion/use-insertion-effect-with-fallbacks@1.0.1': resolution: {integrity: sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==} peerDependencies: react: '>=16.8.0' + '@emotion/utils@1.2.1': + resolution: {integrity: sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==} + + '@emotion/weak-memoize@0.3.1': + resolution: {integrity: sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==} + '@esbuild/aix-ppc64@0.19.12': resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==} engines: {node: '>=12'} @@ -2019,8 +2199,14 @@ packages: cpu: [ppc64] os: [aix] - '@esbuild/aix-ppc64@0.21.2': - resolution: {integrity: sha512-/c7hocx0pm14bHQlqUVKmxwdT/e5/KkyoY1W8F9lk/8CkE037STDDz8PXUP/LE6faj2HqchvDs9GcShxFhI78Q==} + '@esbuild/aix-ppc64@0.21.3': + resolution: {integrity: sha512-yTgnwQpFVYfvvo4SvRFB0SwrW8YjOxEoT7wfMT7Ol5v7v5LDNvSGo67aExmxOb87nQNeWPVvaGBNfQ7BXcrZ9w==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + + '@esbuild/aix-ppc64@0.21.5': + resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} engines: {node: '>=12'} cpu: [ppc64] os: [aix] @@ -2043,8 +2229,14 @@ packages: cpu: [arm64] os: [android] - '@esbuild/android-arm64@0.21.2': - resolution: {integrity: sha512-SGZKngoTWVUriO5bDjI4WDGsNx2VKZoXcds+ita/kVYB+8IkSCKDRDaK+5yu0b5S0eq6B3S7fpiEvpsa2ammlQ==} + '@esbuild/android-arm64@0.21.3': + resolution: {integrity: sha512-c+ty9necz3zB1Y+d/N+mC6KVVkGUUOcm4ZmT5i/Fk5arOaY3i6CA3P5wo/7+XzV8cb4GrI/Zjp8NuOQ9Lfsosw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm64@0.21.5': + resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} engines: {node: '>=12'} cpu: [arm64] os: [android] @@ -2067,8 +2259,14 @@ packages: cpu: [arm] os: [android] - '@esbuild/android-arm@0.21.2': - resolution: {integrity: sha512-G1ve3b4FeyJeyCjB4MX1CiWyTaIJwT9wAYE+8+IRA53YoN/reC/Bf2GDRXAzDTnh69Fpl+1uIKg76DiB3U6vwQ==} + '@esbuild/android-arm@0.21.3': + resolution: {integrity: sha512-bviJOLMgurLJtF1/mAoJLxDZDL6oU5/ztMHnJQRejbJrSc9FFu0QoUoFhvi6qSKJEw9y5oGyvr9fuDtzJ30rNQ==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-arm@0.21.5': + resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} engines: {node: '>=12'} cpu: [arm] os: [android] @@ -2091,8 +2289,14 @@ packages: cpu: [x64] os: [android] - '@esbuild/android-x64@0.21.2': - resolution: {integrity: sha512-1wzzNoj2QtNkAYwIcWJ66UTRA80+RTQ/kuPMtEuP0X6dp5Ar23Dn566q3aV61h4EYrrgGlOgl/HdcqN/2S/2vg==} + '@esbuild/android-x64@0.21.3': + resolution: {integrity: sha512-JReHfYCRK3FVX4Ra+y5EBH1b9e16TV2OxrPAvzMsGeES0X2Ndm9ImQRI4Ket757vhc5XBOuGperw63upesclRw==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/android-x64@0.21.5': + resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} engines: {node: '>=12'} cpu: [x64] os: [android] @@ -2115,8 +2319,14 @@ packages: cpu: [arm64] os: [darwin] - '@esbuild/darwin-arm64@0.21.2': - resolution: {integrity: sha512-ZyMkPWc5eTROcLOA10lEqdDSTc6ds6nuh3DeHgKip/XJrYjZDfnkCVSty8svWdy+SC1f77ULtVeIqymTzaB6/Q==} + '@esbuild/darwin-arm64@0.21.3': + resolution: {integrity: sha512-U3fuQ0xNiAkXOmQ6w5dKpEvXQRSpHOnbw7gEfHCRXPeTKW9sBzVck6C5Yneb8LfJm0l6le4NQfkNPnWMSlTFUQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-arm64@0.21.5': + resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} engines: {node: '>=12'} cpu: [arm64] os: [darwin] @@ -2139,8 +2349,14 @@ packages: cpu: [x64] os: [darwin] - '@esbuild/darwin-x64@0.21.2': - resolution: {integrity: sha512-K4ZdVq1zP9v51h/cKVna7im7G0zGTKKB6bP2yJiSmHjjOykbd8DdhrSi8V978sF69rkwrn8zCyL2t6I3ei6j9A==} + '@esbuild/darwin-x64@0.21.3': + resolution: {integrity: sha512-3m1CEB7F07s19wmaMNI2KANLcnaqryJxO1fXHUV5j1rWn+wMxdUYoPyO2TnAbfRZdi7ADRwJClmOwgT13qlP3Q==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/darwin-x64@0.21.5': + resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} engines: {node: '>=12'} cpu: [x64] os: [darwin] @@ -2163,8 +2379,14 @@ packages: cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-arm64@0.21.2': - resolution: {integrity: sha512-4kbOGdpA61CXqadD+Gb/Pw3YXamQGiz9mal/h93rFVSjr5cgMnmJd/gbfPRm+3BMifvnaOfS1gNWaIDxkE2A3A==} + '@esbuild/freebsd-arm64@0.21.3': + resolution: {integrity: sha512-fsNAAl5pU6wmKHq91cHWQT0Fz0vtyE1JauMzKotrwqIKAswwP5cpHUCxZNSTuA/JlqtScq20/5KZ+TxQdovU/g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-arm64@0.21.5': + resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] @@ -2187,8 +2409,14 @@ packages: cpu: [x64] os: [freebsd] - '@esbuild/freebsd-x64@0.21.2': - resolution: {integrity: sha512-ShS+R09nuHzDBfPeMUliKZX27Wrmr8UFp93aFf/S8p+++x5BZ+D344CLKXxmY6qzgTL3mILSImPCNJOzD6+RRg==} + '@esbuild/freebsd-x64@0.21.3': + resolution: {integrity: sha512-tci+UJ4zP5EGF4rp8XlZIdq1q1a/1h9XuronfxTMCNBslpCtmk97Q/5qqy1Mu4zIc0yswN/yP/BLX+NTUC1bXA==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.21.5': + resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} engines: {node: '>=12'} cpu: [x64] os: [freebsd] @@ -2211,8 +2439,14 @@ packages: cpu: [arm64] os: [linux] - '@esbuild/linux-arm64@0.21.2': - resolution: {integrity: sha512-Hdu8BL+AmO+eCDvvT6kz/fPQhvuHL8YK4ExKZfANWsNe1kFGOHw7VJvS/FKSLFqheXmB3rTF3xFQIgUWPYsGnA==} + '@esbuild/linux-arm64@0.21.3': + resolution: {integrity: sha512-vvG6R5g5ieB4eCJBQevyDMb31LMHthLpXTc2IGkFnPWS/GzIFDnaYFp558O+XybTmYrVjxnryru7QRleJvmZ6Q==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm64@0.21.5': + resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} engines: {node: '>=12'} cpu: [arm64] os: [linux] @@ -2235,8 +2469,14 @@ packages: cpu: [arm] os: [linux] - '@esbuild/linux-arm@0.21.2': - resolution: {integrity: sha512-nnGXjOAv+7cM3LYRx4tJsYdgy8dGDGkAzF06oIDGppWbUkUKN9SmgQA8H0KukpU0Pjrj9XmgbWqMVSX/U7eeTA==} + '@esbuild/linux-arm@0.21.3': + resolution: {integrity: sha512-f6kz2QpSuyHHg01cDawj0vkyMwuIvN62UAguQfnNVzbge2uWLhA7TCXOn83DT0ZvyJmBI943MItgTovUob36SQ==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-arm@0.21.5': + resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} engines: {node: '>=12'} cpu: [arm] os: [linux] @@ -2259,8 +2499,14 @@ packages: cpu: [ia32] os: [linux] - '@esbuild/linux-ia32@0.21.2': - resolution: {integrity: sha512-m73BOCW2V9lcj7RtEMi+gBfHC6n3+VHpwQXP5offtQMPLDkpVolYn1YGXxOZ9hp4h3UPRKuezL7WkBsw+3EB3Q==} + '@esbuild/linux-ia32@0.21.3': + resolution: {integrity: sha512-HjCWhH7K96Na+66TacDLJmOI9R8iDWDDiqe17C7znGvvE4sW1ECt9ly0AJ3dJH62jHyVqW9xpxZEU1jKdt+29A==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-ia32@0.21.5': + resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} engines: {node: '>=12'} cpu: [ia32] os: [linux] @@ -2283,8 +2529,14 @@ packages: cpu: [loong64] os: [linux] - '@esbuild/linux-loong64@0.21.2': - resolution: {integrity: sha512-84eYHwwWHq3myIY/6ikALMcnwkf6Qo7NIq++xH0x+cJuUNpdwh8mlpUtRY+JiGUc60yu7ElWBbVHGWTABTclGw==} + '@esbuild/linux-loong64@0.21.3': + resolution: {integrity: sha512-BGpimEccmHBZRcAhdlRIxMp7x9PyJxUtj7apL2IuoG9VxvU/l/v1z015nFs7Si7tXUwEsvjc1rOJdZCn4QTU+Q==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-loong64@0.21.5': + resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} engines: {node: '>=12'} cpu: [loong64] os: [linux] @@ -2307,8 +2559,14 @@ packages: cpu: [mips64el] os: [linux] - '@esbuild/linux-mips64el@0.21.2': - resolution: {integrity: sha512-9siSZngT0/ZKG+AH+/agwKF29LdCxw4ODi/PiE0F52B2rtLozlDP92umf8G2GPoVV611LN4pZ+nSTckebOscUA==} + '@esbuild/linux-mips64el@0.21.3': + resolution: {integrity: sha512-5rMOWkp7FQGtAH3QJddP4w3s47iT20hwftqdm7b+loe95o8JU8ro3qZbhgMRy0VuFU0DizymF1pBKkn3YHWtsw==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-mips64el@0.21.5': + resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} engines: {node: '>=12'} cpu: [mips64el] os: [linux] @@ -2331,8 +2589,14 @@ packages: cpu: [ppc64] os: [linux] - '@esbuild/linux-ppc64@0.21.2': - resolution: {integrity: sha512-y0T4aV2CA+ic04ULya1A/8M2RDpDSK2ckgTj6jzHKFJvCq0jQg8afQQIn4EM0G8u2neyOiNHgSF9YKPfuqKOVw==} + '@esbuild/linux-ppc64@0.21.3': + resolution: {integrity: sha512-h0zj1ldel89V5sjPLo5H1SyMzp4VrgN1tPkN29TmjvO1/r0MuMRwJxL8QY05SmfsZRs6TF0c/IDH3u7XYYmbAg==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-ppc64@0.21.5': + resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} engines: {node: '>=12'} cpu: [ppc64] os: [linux] @@ -2355,8 +2619,14 @@ packages: cpu: [riscv64] os: [linux] - '@esbuild/linux-riscv64@0.21.2': - resolution: {integrity: sha512-x5ssCdXmZC86L2Li1qQPF/VaC4VP20u/Zm8jlAu9IiVOVi79YsSz6cpPDYZl1rfKSHYCJW9XBfFCo66S5gVPSA==} + '@esbuild/linux-riscv64@0.21.3': + resolution: {integrity: sha512-dkAKcTsTJ+CRX6bnO17qDJbLoW37npd5gSNtSzjYQr0svghLJYGYB0NF1SNcU1vDcjXLYS5pO4qOW4YbFama4A==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-riscv64@0.21.5': + resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} engines: {node: '>=12'} cpu: [riscv64] os: [linux] @@ -2379,8 +2649,14 @@ packages: cpu: [s390x] os: [linux] - '@esbuild/linux-s390x@0.21.2': - resolution: {integrity: sha512-NP7fTpGSFWdXyvp8iAFU04uFh9ARoplFVM/m+8lTRpaYG+2ytHPZWyscSsMM6cvObSIK2KoPHXiZD4l99WaxbQ==} + '@esbuild/linux-s390x@0.21.3': + resolution: {integrity: sha512-vnD1YUkovEdnZWEuMmy2X2JmzsHQqPpZElXx6dxENcIwTu+Cu5ERax6+Ke1QsE814Zf3c6rxCfwQdCTQ7tPuXA==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-s390x@0.21.5': + resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} engines: {node: '>=12'} cpu: [s390x] os: [linux] @@ -2403,8 +2679,14 @@ packages: cpu: [x64] os: [linux] - '@esbuild/linux-x64@0.21.2': - resolution: {integrity: sha512-giZ/uOxWDKda44ZuyfKbykeXznfuVNkTgXOUOPJIjbayJV6FRpQ4zxUy9JMBPLaK9IJcdWtaoeQrYBMh3Rr4vQ==} + '@esbuild/linux-x64@0.21.3': + resolution: {integrity: sha512-IOXOIm9WaK7plL2gMhsWJd+l2bfrhfilv0uPTptoRoSb2p09RghhQQp9YY6ZJhk/kqmeRt6siRdMSLLwzuT0KQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/linux-x64@0.21.5': + resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} engines: {node: '>=12'} cpu: [x64] os: [linux] @@ -2427,8 +2709,14 @@ packages: cpu: [x64] os: [netbsd] - '@esbuild/netbsd-x64@0.21.2': - resolution: {integrity: sha512-IeFMfGFSQfIj1d4XU+6lkbFzMR+mFELUUVYrZ+jvWzG4NGvs6o53ReEHLHpYkjRbdEjJy2W3lTekTxrFHW7YJg==} + '@esbuild/netbsd-x64@0.21.3': + resolution: {integrity: sha512-uTgCwsvQ5+vCQnqM//EfDSuomo2LhdWhFPS8VL8xKf+PKTCrcT/2kPPoWMTs22aB63MLdGMJiE3f1PHvCDmUOw==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.21.5': + resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] @@ -2451,8 +2739,14 @@ packages: cpu: [x64] os: [openbsd] - '@esbuild/openbsd-x64@0.21.2': - resolution: {integrity: sha512-48QhWD6WxcebNNaE4FCwgvQVUnAycuTd+BdvA/oZu+/MmbpU8pY2dMEYlYzj5uNHWIG5jvdDmFXu0naQeOWUoA==} + '@esbuild/openbsd-x64@0.21.3': + resolution: {integrity: sha512-vNAkR17Ub2MgEud2Wag/OE4HTSI6zlb291UYzHez/psiKarp0J8PKGDnAhMBcHFoOHMXHfExzmjMojJNbAStrQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.21.5': + resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] @@ -2475,8 +2769,14 @@ packages: cpu: [x64] os: [sunos] - '@esbuild/sunos-x64@0.21.2': - resolution: {integrity: sha512-90r3nTBLgdIgD4FCVV9+cR6Hq2Dzs319icVsln+NTmTVwffWcCqXGml8rAoocHuJ85kZK36DCteii96ba/PX8g==} + '@esbuild/sunos-x64@0.21.3': + resolution: {integrity: sha512-W8H9jlGiSBomkgmouaRoTXo49j4w4Kfbl6I1bIdO/vT0+0u4f20ko3ELzV3hPI6XV6JNBVX+8BC+ajHkvffIJA==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/sunos-x64@0.21.5': + resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} engines: {node: '>=12'} cpu: [x64] os: [sunos] @@ -2499,8 +2799,14 @@ packages: cpu: [arm64] os: [win32] - '@esbuild/win32-arm64@0.21.2': - resolution: {integrity: sha512-sNndlsBT8OeE/MZDSGpRDJlWuhjuUz/dn80nH0EP4ZzDUYvMDVa7G87DVpweBrn4xdJYyXS/y4CQNrf7R2ODXg==} + '@esbuild/win32-arm64@0.21.3': + resolution: {integrity: sha512-EjEomwyLSCg8Ag3LDILIqYCZAq/y3diJ04PnqGRgq8/4O3VNlXyMd54j/saShaN4h5o5mivOjAzmU6C3X4v0xw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-arm64@0.21.5': + resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} engines: {node: '>=12'} cpu: [arm64] os: [win32] @@ -2523,8 +2829,14 @@ packages: cpu: [ia32] os: [win32] - '@esbuild/win32-ia32@0.21.2': - resolution: {integrity: sha512-Ti2QChGNFzWhUNNVuU4w21YkYTErsNh3h+CzvlEhzgRbwsJ7TrWQqRzW3bllLKKvTppuF3DJ3XP1GEg11AfrEQ==} + '@esbuild/win32-ia32@0.21.3': + resolution: {integrity: sha512-WGiE/GgbsEwR33++5rzjiYsKyHywE8QSZPF7Rfx9EBfK3Qn3xyR6IjyCr5Uk38Kg8fG4/2phN7sXp4NPWd3fcw==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-ia32@0.21.5': + resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} engines: {node: '>=12'} cpu: [ia32] os: [win32] @@ -2547,8 +2859,14 @@ packages: cpu: [x64] os: [win32] - '@esbuild/win32-x64@0.21.2': - resolution: {integrity: sha512-VEfTCZicoZnZ6sGkjFPGRFFJuL2fZn2bLhsekZl1CJslflp2cJS/VoKs1jMk+3pDfsGW6CfQVUckP707HwbXeQ==} + '@esbuild/win32-x64@0.21.3': + resolution: {integrity: sha512-xRxC0jaJWDLYvcUvjQmHCJSfMrgmUuvsoXgDeU/wTorQ1ngDdUBuFtgY3W1Pc5sprGAvZBtWdJX7RPg/iZZUqA==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@esbuild/win32-x64@0.21.5': + resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} engines: {node: '>=12'} cpu: [x64] os: [win32] @@ -2559,8 +2877,8 @@ packages: peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - '@eslint-community/regexpp@4.10.0': - resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} + '@eslint-community/regexpp@4.11.0': + resolution: {integrity: sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} '@eslint/eslintrc@1.4.1': @@ -2571,10 +2889,17 @@ packages: resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - '@eslint/js@8.57.0': - resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} + '@eslint/js@8.55.0': + resolution: {integrity: sha512-qQfo2mxH5yVom1kacMtZZJFVdW+E70mqHMJvVg6WTLo+VBuQJ4TojZlfWBjK0ve5BdEeNAVxOsl/nvNMpJOaJA==} + 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} + '@ethereumjs/common@2.6.5': + resolution: {integrity: sha512-lRyVQOeCDaIVtgfbowla32pzeDv2Obr8oR8Put5RdUBNRGr1VGPGQNGP6elWIpgK3YdpzqTOh4GyUGOureVeeA==} + '@ethereumjs/common@3.2.0': resolution: {integrity: sha512-pksvzI0VyLgmuEF2FA/JR/4/y6hcPq8OUail3/AvycBaW1d5VSauOZzqGvJ3RTmR4MU35lWE8KseKOsEhrFRBA==} @@ -2583,6 +2908,9 @@ packages: engines: {node: '>=14'} hasBin: true + '@ethereumjs/tx@3.5.2': + resolution: {integrity: sha512-gQDNJWKrSDGu2w7w0PzVXVBNMzb7wwdDOmOqczmhNjqFxFuIbhVJDwiGEnxFNC2/b8ifcZzY7MLcluizohRzNw==} + '@ethereumjs/tx@4.2.0': resolution: {integrity: sha512-1nc6VO4jtFd172BbSnTnDQVr9IYBFl1y4xPzZdtkrkKIncBCkdbgfdRV+MiTkJYAtTxvV12GRZLqBFT1PNK6Yw==} engines: {node: '>=14'} @@ -2681,36 +3009,33 @@ packages: '@ethersproject/wordlists@5.7.0': resolution: {integrity: sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==} - '@expressive-code/core@0.35.3': - resolution: {integrity: sha512-SYamcarAjufYhbuK/kfvJSvAXLsfnM7DKc78R7Dq4B73R5bKQK2m5zR0l57tXr4yp2C5Z8lu5xZncdwWxcmPdg==} + '@expressive-code/core@0.35.6': + resolution: {integrity: sha512-xGqCkmfkgT7lr/rvmfnYdDSeTdCSp1otAHgoFS6wNEeO7wGDPpxdosVqYiIcQ8CfWUABh/pGqWG90q+MV3824A==} - '@expressive-code/plugin-frames@0.35.3': - resolution: {integrity: sha512-QYytMq6IsaHgTofQ5b6d+CnbxkqLdikSF2hC+IL/ZZwPYHYZoUlmjIwmJZhY4/hHqJGELrtZsyVdlt06RntgmA==} + '@expressive-code/plugin-frames@0.35.6': + resolution: {integrity: sha512-CqjSWjDJ3wabMJZfL9ZAzH5UAGKg7KWsf1TBzr4xvUbZvWoBtLA/TboBML0U1Ls8h/4TRCIvR4VEb8dv5+QG3w==} - '@expressive-code/plugin-shiki@0.35.3': - resolution: {integrity: sha512-aFQBPepv0zhVXqJFAvfQ4vXYv/meJKiqmEEKSxdjAfwXllIV49PDlnGEXmbGYjR4hUQQjbfDgzAbrbfePc3YVQ==} + '@expressive-code/plugin-shiki@0.35.6': + resolution: {integrity: sha512-xm+hzi9BsmhkDUGuyAWIydOAWer7Cs9cj8FM0t4HXaQ+qCubprT6wJZSKUxuvFJIUsIOqk1xXFaJzGJGnWtKMg==} - '@expressive-code/plugin-text-markers@0.35.3': - resolution: {integrity: sha512-gDdnQrfDRXw5Y+PKHJDkpAUdf2pthYOthGcgy3JB8GOTQ3EL1h+755Ct/bGc4MR6jn+dgnQP47uHMWQaccvN6Q==} + '@expressive-code/plugin-text-markers@0.35.6': + resolution: {integrity: sha512-/k9eWVZSCs+uEKHR++22Uu6eIbHWEciVHbIuD8frT8DlqTtHYaaiwHPncO6KFWnGDz5i/gL7oyl6XmOi/E6GVg==} - '@fal-works/esbuild-plugin-global-externals@2.1.2': - resolution: {integrity: sha512-cEee/Z+I12mZcFJshKcCqC8tuX5hG3s+d+9nZ3LabqKF1vKdF41B92pJVCBggjAGORAeOzyyDDKrZwIkLffeOQ==} - - '@fastify/busboy@2.1.1': - resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} + '@fastify/busboy@2.1.0': + resolution: {integrity: sha512-+KpH+QxZU7O4675t3mnkQKcZZg56u+K/Ct2K+N2AZYNVK8kyeo/bI18tI8aPm3tvNNRyTWfj6s5tnGNlcbQRsA==} engines: {node: '>=14'} - '@formatjs/ecma402-abstract@1.18.2': - resolution: {integrity: sha512-+QoPW4csYALsQIl8GbN14igZzDbuwzcpWrku9nyMXlaqAlwRBgl5V+p0vWMGFqHOw37czNXaP/lEk4wbLgcmtA==} + '@formatjs/ecma402-abstract@2.0.0': + resolution: {integrity: sha512-rRqXOqdFmk7RYvj4khklyqzcfQl9vEL/usogncBHRZfZBDOwMGuSRNFl02fu5KGHXdbinju+YXyuR+Nk8xlr/g==} '@formatjs/fast-memoize@2.2.0': resolution: {integrity: sha512-hnk/nY8FyrL5YxwP9e4r9dqeM6cAbo8PeU9UjyXojZMNvVad2Z06FAVHyR3Ecw6fza+0GH7vdJgiKIVXTMbSBA==} - '@formatjs/icu-messageformat-parser@2.7.6': - resolution: {integrity: sha512-etVau26po9+eewJKYoiBKP6743I1br0/Ie00Pb/S/PtmYfmjTcOn2YCh2yNkSZI12h6Rg+BOgQYborXk46BvkA==} + '@formatjs/icu-messageformat-parser@2.7.8': + resolution: {integrity: sha512-nBZJYmhpcSX0WeJ5SDYUkZ42AgR3xiyhNCsQweFx3cz/ULJjym8bHAzWKvG5e2+1XO98dBYC0fWeeAECAVSwLA==} - '@formatjs/icu-skeleton-parser@1.8.0': - resolution: {integrity: sha512-QWLAYvM0n8hv7Nq5BEs4LKIjevpVpbGLAJgOaYzg9wABEoX1j0JO1q2/jVkO6CVlq0dbsxZCngS5aXbysYueqA==} + '@formatjs/icu-skeleton-parser@1.8.2': + resolution: {integrity: sha512-k4ERKgw7aKGWJZgTarIcNEmvyTVD9FYh0mTrrBMHZ1b8hUu6iOJ4SzsZlo3UNAvHYa+PnvntIwRPt1/vy4nA9Q==} '@formatjs/intl-localematcher@0.5.4': resolution: {integrity: sha512-zTwEpWOzZ2CiKcB93BLngUX59hQkuZjT2+SAQEscSm52peDW/getsawMcWF1rGRpMCX6D7nSJA3CzJ8gn13N/g==} @@ -2721,13 +3046,20 @@ packages: '@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'} + deprecated: Use @eslint/config-array instead + '@humanwhocodes/config-array@0.11.14': resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} engines: {node: '>=10.10.0'} + deprecated: Use @eslint/config-array instead '@humanwhocodes/config-array@0.9.5': resolution: {integrity: sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==} engines: {node: '>=10.10.0'} + deprecated: Use @eslint/config-array instead '@humanwhocodes/module-importer@1.0.1': resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} @@ -2739,18 +3071,24 @@ packages: '@humanwhocodes/object-schema@1.2.1': resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} + deprecated: Use @eslint/object-schema instead + + '@humanwhocodes/object-schema@2.0.1': + resolution: {integrity: sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==} + deprecated: Use @eslint/object-schema instead - '@humanwhocodes/object-schema@2.0.3': - resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} + '@humanwhocodes/object-schema@2.0.2': + resolution: {integrity: sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==} + deprecated: Use @eslint/object-schema instead - '@img/sharp-darwin-arm64@0.33.3': - resolution: {integrity: sha512-FaNiGX1MrOuJ3hxuNzWgsT/mg5OHG/Izh59WW2mk1UwYHUwtfbhk5QNKYZgxf0pLOhx9ctGiGa2OykD71vOnSw==} + '@img/sharp-darwin-arm64@0.33.4': + resolution: {integrity: sha512-p0suNqXufJs9t3RqLBO6vvrgr5OhgbWp76s5gTRvdmxmuv9E1rcaqGUsl3l4mKVmXPkTkTErXediAui4x+8PSA==} engines: {glibc: '>=2.26', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} cpu: [arm64] os: [darwin] - '@img/sharp-darwin-x64@0.33.3': - resolution: {integrity: sha512-2QeSl7QDK9ru//YBT4sQkoq7L0EAJZA3rtV+v9p8xTKl4U1bUqTIaCnoC7Ctx2kCjQgwFXDasOtPTCT8eCTXvw==} + '@img/sharp-darwin-x64@0.33.4': + resolution: {integrity: sha512-0l7yRObwtTi82Z6ebVI2PnHT8EB2NxBgpK2MiKJZJ7cz32R4lxd001ecMhzzsZig3Yv9oclvqqdV93jo9hy+Dw==} engines: {glibc: '>=2.26', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} cpu: [x64] os: [darwin] @@ -2803,69 +3141,72 @@ packages: cpu: [x64] os: [linux] - '@img/sharp-linux-arm64@0.33.3': - resolution: {integrity: sha512-Zf+sF1jHZJKA6Gor9hoYG2ljr4wo9cY4twaxgFDvlG0Xz9V7sinsPp8pFd1XtlhTzYo0IhDbl3rK7P6MzHpnYA==} + '@img/sharp-linux-arm64@0.33.4': + resolution: {integrity: sha512-2800clwVg1ZQtxwSoTlHvtm9ObgAax7V6MTAB/hDT945Tfyy3hVkmiHpeLPCKYqYR1Gcmv1uDZ3a4OFwkdBL7Q==} engines: {glibc: '>=2.26', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} cpu: [arm64] os: [linux] - '@img/sharp-linux-arm@0.33.3': - resolution: {integrity: sha512-Q7Ee3fFSC9P7vUSqVEF0zccJsZ8GiiCJYGWDdhEjdlOeS9/jdkyJ6sUSPj+bL8VuOYFSbofrW0t/86ceVhx32w==} + '@img/sharp-linux-arm@0.33.4': + resolution: {integrity: sha512-RUgBD1c0+gCYZGCCe6mMdTiOFS0Zc/XrN0fYd6hISIKcDUbAW5NtSQW9g/powkrXYm6Vzwd6y+fqmExDuCdHNQ==} engines: {glibc: '>=2.28', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} cpu: [arm] os: [linux] - '@img/sharp-linux-s390x@0.33.3': - resolution: {integrity: sha512-vFk441DKRFepjhTEH20oBlFrHcLjPfI8B0pMIxGm3+yilKyYeHEVvrZhYFdqIseSclIqbQ3SnZMwEMWonY5XFA==} - engines: {glibc: '>=2.28', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + '@img/sharp-linux-s390x@0.33.4': + resolution: {integrity: sha512-h3RAL3siQoyzSoH36tUeS0PDmb5wINKGYzcLB5C6DIiAn2F3udeFAum+gj8IbA/82+8RGCTn7XW8WTFnqag4tQ==} + engines: {glibc: '>=2.31', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} cpu: [s390x] os: [linux] - '@img/sharp-linux-x64@0.33.3': - resolution: {integrity: sha512-Q4I++herIJxJi+qmbySd072oDPRkCg/SClLEIDh5IL9h1zjhqjv82H0Seupd+q2m0yOfD+/fJnjSoDFtKiHu2g==} + '@img/sharp-linux-x64@0.33.4': + resolution: {integrity: sha512-GoR++s0XW9DGVi8SUGQ/U4AeIzLdNjHka6jidVwapQ/JebGVQIpi52OdyxCNVRE++n1FCLzjDovJNozif7w/Aw==} engines: {glibc: '>=2.26', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} cpu: [x64] os: [linux] - '@img/sharp-linuxmusl-arm64@0.33.3': - resolution: {integrity: sha512-qnDccehRDXadhM9PM5hLvcPRYqyFCBN31kq+ErBSZtZlsAc1U4Z85xf/RXv1qolkdu+ibw64fUDaRdktxTNP9A==} + '@img/sharp-linuxmusl-arm64@0.33.4': + resolution: {integrity: sha512-nhr1yC3BlVrKDTl6cO12gTpXMl4ITBUZieehFvMntlCXFzH2bvKG76tBL2Y/OqhupZt81pR7R+Q5YhJxW0rGgQ==} engines: {musl: '>=1.2.2', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} cpu: [arm64] os: [linux] - '@img/sharp-linuxmusl-x64@0.33.3': - resolution: {integrity: sha512-Jhchim8kHWIU/GZ+9poHMWRcefeaxFIs9EBqf9KtcC14Ojk6qua7ghKiPs0sbeLbLj/2IGBtDcxHyjCdYWkk2w==} + '@img/sharp-linuxmusl-x64@0.33.4': + resolution: {integrity: sha512-uCPTku0zwqDmZEOi4ILyGdmW76tH7dm8kKlOIV1XC5cLyJ71ENAAqarOHQh0RLfpIpbV5KOpXzdU6XkJtS0daw==} engines: {musl: '>=1.2.2', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} cpu: [x64] os: [linux] - '@img/sharp-wasm32@0.33.3': - resolution: {integrity: sha512-68zivsdJ0koE96stdUfM+gmyaK/NcoSZK5dV5CAjES0FUXS9lchYt8LAB5rTbM7nlWtxaU/2GON0HVN6/ZYJAQ==} + '@img/sharp-wasm32@0.33.4': + resolution: {integrity: sha512-Bmmauh4sXUsUqkleQahpdNXKvo+wa1V9KhT2pDA4VJGKwnKMJXiSTGphn0gnJrlooda0QxCtXc6RX1XAU6hMnQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} cpu: [wasm32] - '@img/sharp-win32-ia32@0.33.3': - resolution: {integrity: sha512-CyimAduT2whQD8ER4Ux7exKrtfoaUiVr7HG0zZvO0XTFn2idUWljjxv58GxNTkFb8/J9Ub9AqITGkJD6ZginxQ==} + '@img/sharp-win32-ia32@0.33.4': + resolution: {integrity: sha512-99SJ91XzUhYHbx7uhK3+9Lf7+LjwMGQZMDlO/E/YVJ7Nc3lyDFZPGhjwiYdctoH2BOzW9+TnfqcaMKt0jHLdqw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} cpu: [ia32] os: [win32] - '@img/sharp-win32-x64@0.33.3': - resolution: {integrity: sha512-viT4fUIDKnli3IfOephGnolMzhz5VaTvDRkYqtZxOMIoMQ4MrAziO7pT1nVnOt2FAm7qW5aa+CCc13aEY6Le0g==} + '@img/sharp-win32-x64@0.33.4': + resolution: {integrity: sha512-3QLocdTRVIrFNye5YocZl+KKpYKP+fksi1QhmOArgx7GyhIbQp/WrJRu176jm8IxromS7RIkzMiMINVdBtC8Aw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} cpu: [x64] os: [win32] + '@ioredis/commands@1.2.0': + resolution: {integrity: sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==} + '@ipld/dag-cbor@9.2.0': resolution: {integrity: sha512-N14oMy0q4gM6OuZkIpisKe0JBSjf1Jb39VI+7jMLiWX9124u1Z3Fdj/Tag1NA0cVxxqWDh0CqsjcVfOKtelPDA==} engines: {node: '>=16.0.0', npm: '>=7.0.0'} - '@ipld/dag-json@10.2.0': - resolution: {integrity: sha512-O9YLUrl3d3WbVz7v1WkajFkyfOLEe2Fep+wor4fgVe0ywxzrivrj437NiPcVyB+2EDdFn/Q7tCHFf8YVhDf8ZA==} + '@ipld/dag-json@10.2.2': + resolution: {integrity: sha512-NnU8HdHKwAoGyrW3S09NMa8aZw0tImLRyR64hoafpLpDpAbA9g1+fb24JsdlugbL4sXUQVwDVA+qK4Ud8V83lA==} engines: {node: '>=16.0.0', npm: '>=7.0.0'} - '@ipld/dag-pb@4.1.0': - resolution: {integrity: sha512-LJU451Drqs5zjFm7jI4Hs3kHlilOqkjcSfPiQgVsZnWaYb2C7YdfhnclrVn/X+ucKejlU9BL3+gXFCZUXkMuCg==} + '@ipld/dag-pb@4.1.2': + resolution: {integrity: sha512-BSztO4l3C+ya9HjCaQot26Y4AVsqIKtnn6+23ubc1usucnf6yoTBme18oCCdM6gKBMxuPqju5ye3lh9WEJsdeQ==} engines: {node: '>=16.0.0', npm: '>=7.0.0'} '@isaacs/cliui@8.0.2': @@ -2908,8 +3249,9 @@ packages: resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - '@johnsoncodehk/vscode-html-languageservice@5.2.0-34a5462': - resolution: {integrity: sha512-etqLfpSJ5zaw76KUNF603be6d6QsiQPmaHr9FKEp4zhLZJzWCCMH6Icak7MtLUFLZLMpL761mZNImi/joBo1ZA==} + '@jridgewell/gen-mapping@0.3.3': + resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} + engines: {node: '>=6.0.0'} '@jridgewell/gen-mapping@0.3.5': resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} @@ -2919,16 +3261,23 @@ packages: resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} + '@jridgewell/set-array@1.1.2': + resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} + engines: {node: '>=6.0.0'} + '@jridgewell/set-array@1.2.1': resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} engines: {node: '>=6.0.0'} - '@jridgewell/source-map@0.3.6': - resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==} + '@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/sourcemap-codec@1.5.0': + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} @@ -2961,8 +3310,8 @@ packages: resolution: {integrity: sha512-+c74EVUBTfw2sx1GE/z/IjsYO6dhur+ukF0knAppeZsRQ1Kgg6K5R3eECtT28fC6dBWLjFpAvW/7QGfiDAL4RA==} engines: {node: '>=16.0.0', npm: '>=7.0.0'} - '@libp2p/interface@1.3.1': - resolution: {integrity: sha512-KJoYP6biAgIHUU3pxaixaaYCvIHZshzXetxfoNigadAZ3hCGuwpdFhk7IABEaI3RgadOOYUwW3MXPbL+cxnXVQ==} + '@libp2p/interface@1.3.0': + resolution: {integrity: sha512-K72Km0Co1Z+pXpggWuoAvUUbvwZYvjCcywrHj2Ym3jt2anTE3hzL4rlZrrkzA0YhNTRFRiZ04dnu6WMXT5/4+A==} '@libp2p/interfaces@3.3.2': resolution: {integrity: sha512-p/M7plbrxLzuQchvNwww1Was7ZeGE2NaOFulMaZBYIihU8z3fhaV+a033OqnC/0NTX/yhfdNOG7znhYq3XoR/g==} @@ -2985,6 +3334,12 @@ packages: '@lit/reactive-element@2.0.4': resolution: {integrity: sha512-GFn91inaUa2oHLak8awSIigYz0cU0Payr1rcFsrkf5OJ5eSPxElyZfKh0f2p9FsTiZWXQdWGJeXZICEfXXYSXQ==} + '@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==} + '@mdx-js/mdx@3.0.1': resolution: {integrity: sha512-eIQ4QTrOWyL3LWEe/bu6Taqzq2HQvHcyTMaOrI95P2/LmJE7AsfPfgJGuFLPVqBUE1BC1rik3VIhU+s9u72arA==} @@ -2998,14 +3353,30 @@ packages: resolution: {integrity: sha512-whiUMPlAOrVGmX8aKYVPvlKyG4CpQXiNNyt74vE1xb5sPvmx5oA7B/kOi/JdBvhGQq97U1/AVdXEdk2zkP8qyA==} engines: {node: '>=14.0.0'} - '@metamask/json-rpc-engine@7.3.3': - resolution: {integrity: sha512-dwZPq8wx9yV3IX2caLi9q9xZBw2XeIoYqdyihDDDpuHVCEiqadJLwqM3zy+uwf6F1QYQ65A8aOMQg1Uw7LMLNg==} + '@metamask/eth-sig-util@4.0.1': + resolution: {integrity: sha512-tghyZKLHZjcdlDqCA3gNZmLeR0XvOE9U1qoQO9ohyAZT6Pya+H9vkBPcsyXytmYLNgVoin7CKCmweo/R43V+tQ==} + engines: {node: '>=12.0.0'} + + '@metamask/json-rpc-engine@7.3.2': + resolution: {integrity: sha512-dVjBPlni4CoiBpESVqrxh6k4OR14w6GRXKSSXHFuITjuhALE42gNCkXTpL4cjNeOBUgTba3eGe5EI8cyc2QLRg==} + engines: {node: '>=16.0.0'} + + '@metamask/json-rpc-engine@8.0.2': + resolution: {integrity: sha512-IoQPmql8q7ABLruW7i4EYVHWUbF74yrp63bRuXV5Zf9BQwcn5H9Ww1eLtROYvI1bUXwOiHZ6qT5CWTrDc/t/AA==} engines: {node: '>=16.0.0'} '@metamask/json-rpc-middleware-stream@6.0.2': resolution: {integrity: sha512-jtyx3PRfc1kqoLpYveIVQNwsxYKefc64/LCl9h9Da1m3nUKEvypbYuXSIwi237qvOjKmNHQKsDOZg6f4uBf62Q==} engines: {node: '>=16.0.0'} + '@metamask/json-rpc-middleware-stream@7.0.2': + resolution: {integrity: sha512-yUdzsJK04Ev98Ck4D7lmRNQ8FPioXYhEUZOMS01LXW8qTvPGiRVXmVltj2p4wrLkh0vW7u6nv0mNl5xzC5Qmfg==} + engines: {node: '>=16.0.0'} + + '@metamask/object-multiplex@1.3.0': + resolution: {integrity: sha512-czcQeVYdSNtabd+NcYQnrM69MciiJyd1qvKH8WM2Id3C0ZiUUX5Xa/MK+/VUk633DBhVOwdNzAKIQ33lGyA+eQ==} + engines: {node: '>=12.0.0'} + '@metamask/object-multiplex@2.0.0': resolution: {integrity: sha512-+ItrieVZie3j2LfYE0QkdW3dsEMfMEp419IGx1zyeLqjRZ14iQUPRO0H6CGgfAAoC0x6k2PfCAGRwJUA9BMrqA==} engines: {node: ^16.20 || ^18.16 || >=20} @@ -3013,10 +3384,22 @@ packages: '@metamask/onboarding@1.0.1': resolution: {integrity: sha512-FqHhAsCI+Vacx2qa5mAFcWNSrTcVGMNjzxVgaX8ECSny/BJ9/vgXP9V7WF/8vb9DltPeQkxr+Fnfmm6GHfmdTQ==} + '@metamask/post-message-stream@6.2.0': + resolution: {integrity: sha512-WunZ0bruClF862mvbKQGETn5SM0XKGmocPMQR1Ew6sYix9/FDzeoZnoI8RkXk01E+70FCdxhTE/r8kk5SFOuTw==} + engines: {node: '>=14.0.0'} + + '@metamask/providers@10.2.1': + resolution: {integrity: sha512-p2TXw2a1Nb8czntDGfeIYQnk4LLVbd5vlcb3GY//lylYlKdSqp+uUTegCvxiFblRDOT68jsY8Ib1VEEzVUOolA==} + engines: {node: '>=14.0.0'} + '@metamask/providers@15.0.0': resolution: {integrity: sha512-FXvL1NQNl6I7fMOJTfQYcBlBZ33vSlm6w80cMpmn8sJh0Lb7wcBpe02UwBsNlARnI+Qsr26XeDs6WHUHQh8CuA==} engines: {node: ^18.18 || >=20} + '@metamask/providers@16.1.0': + resolution: {integrity: sha512-znVCvux30+3SaUwcUGaSf+pUckzT5ukPRpcBmy+muBLC0yaWnBcvDqGfcsw6CBIenUdFrVoAFa8B6jsuCY/a+g==} + engines: {node: ^18.18 || >=20} + '@metamask/rpc-errors@6.2.1': resolution: {integrity: sha512-VTgWkjWLzb0nupkFl1duQi9Mk8TGT9rsdnQg6DeRrYEFxtFOh0IF8nAwxM/4GWqDl6uIB06lqUBgUrAVWl62Bw==} engines: {node: '>=16.0.0'} @@ -3028,8 +3411,11 @@ packages: resolution: {integrity: sha512-ihb3B0T/wJm1eUuArYP4lCTSEoZsClHhuWyfo/kMX3m/odpqNcPfsz5O2A3NT7dXCAgWPGDQGPqygCpgeniKMw==} engines: {node: '>=12.0.0'} - '@metamask/sdk-communication-layer@0.18.5': - resolution: {integrity: sha512-WMf9oJa3rAimjCXMAaaRVFPD0Q6dfZR0r9037KCpD5g9SlVh+TeMISfdQCEKAyhXP3d4CGxmp/Kib8C3mn2YLw==} + '@metamask/sdk-communication-layer@0.14.3': + resolution: {integrity: sha512-yjSbj8y7fFbQXv2HBzUX6D9C8BimkCYP6BDV7hdw53W8b/GlYCtXVxUFajQ9tuO1xPTRjR/xt/dkdr2aCi6WGw==} + + '@metamask/sdk-communication-layer@0.20.2': + resolution: {integrity: sha512-TN+whYbCClFSkx52Ild1RcjoRyz8YZgwNvZeooIcZIvCfBM6U9W5273KGiY7WLc/oO4KKmFk17d7vMO4gNvhhw==} peerDependencies: cross-fetch: ^3.1.5 eciesjs: ^0.3.16 @@ -3037,17 +3423,20 @@ packages: readable-stream: ^3.6.2 socket.io-client: ^4.5.1 - '@metamask/sdk-communication-layer@0.20.2': - resolution: {integrity: sha512-TN+whYbCClFSkx52Ild1RcjoRyz8YZgwNvZeooIcZIvCfBM6U9W5273KGiY7WLc/oO4KKmFk17d7vMO4gNvhhw==} + '@metamask/sdk-communication-layer@0.28.2': + resolution: {integrity: sha512-kGx6qgP482DecPILnIS38bgxIjNransR3/Jh5Lfg9BXJLaXpq/MEGrjHGnJHAqCyfRymnd5cgexHtXJvQtRWQA==} peerDependencies: - cross-fetch: ^3.1.5 + cross-fetch: ^4.0.0 eciesjs: ^0.3.16 eventemitter2: ^6.4.7 readable-stream: ^3.6.2 socket.io-client: ^4.5.1 - '@metamask/sdk-install-modal-web@0.18.5': - resolution: {integrity: sha512-Wygc0dgr1PwIA/Sg9WW9QWAsQr4G2GV6iveXt2xw8VKW/9cRORWqYukH1NZLr71hBKzi9AKYBU54Tk5Dfg41zg==} + '@metamask/sdk-install-modal-web@0.14.1': + resolution: {integrity: sha512-emT8HKbnfVwGhPxyUfMja6DWzvtJvDEBQxqCVx93H0HsyrrOzOC43iGCAosslw6o5h7gOfRKLqWmK8V7jQAS2Q==} + + '@metamask/sdk-install-modal-web@0.20.2': + resolution: {integrity: sha512-0QiaZhV15AGdN1zU2jfTI32eC3YkwEpzDfR9+oiZ9bd2G72c6lYBhTsmDGUd01aP6A+bqJR5PjI8Wh2AWtoLeA==} peerDependencies: i18next: 22.5.1 react: ^18.2.0 @@ -3062,13 +3451,12 @@ packages: react-native: optional: true - '@metamask/sdk-install-modal-web@0.20.2': - resolution: {integrity: sha512-0QiaZhV15AGdN1zU2jfTI32eC3YkwEpzDfR9+oiZ9bd2G72c6lYBhTsmDGUd01aP6A+bqJR5PjI8Wh2AWtoLeA==} + '@metamask/sdk-install-modal-web@0.28.1': + resolution: {integrity: sha512-mHkIjWTpYQMPDMtLEEtTVXhae4pEjy7jDBfV7497L0U3VCPQrBl/giZBwA6AgKEX1emYcM2d1WRHWR9N4YhyJA==} peerDependencies: - i18next: 22.5.1 + i18next: 23.11.5 react: ^18.2.0 react-dom: ^18.2.0 - react-i18next: ^13.2.2 react-native: '*' peerDependenciesMeta: react: @@ -3078,20 +3466,14 @@ packages: react-native: optional: true - '@metamask/sdk@0.18.6': - resolution: {integrity: sha512-ZT8e4BrcWrm44apLb412WR0fDsgeaS8UlI1c0wKRUPu1w/UntpXuUVO+EaY8WDlnOPAiAsjyqWKey64/DfvbXQ==} + '@metamask/sdk@0.14.3': + resolution: {integrity: sha512-BYLs//nY2wioVSih78gOQI6sLIYY3vWkwVqXGYUgkBV+bi49bv+9S0m+hZ2cwiRaxfMYtKs0KvhAQ8weiYwDrg==} peerDependencies: - '@react-native-async-storage/async-storage': ^1.19.6 react: ^18.2.0 - react-dom: ^18.2.0 react-native: '*' peerDependenciesMeta: - '@react-native-async-storage/async-storage': - optional: true react: optional: true - react-dom: - optional: true react-native: optional: true @@ -3106,73 +3488,84 @@ packages: react-dom: optional: true + '@metamask/sdk@0.28.2': + resolution: {integrity: sha512-pylk1uJAZYyO3HcNW/TNfII3+T+Yx6qrFYaC/HmuSIuRJeXsdZuExSbNQ236iQocIy3L7JjI+GQKbv3TbN+HQQ==} + peerDependencies: + react: ^18.2.0 + react-dom: ^18.2.0 + peerDependenciesMeta: + react: + optional: true + react-dom: + optional: true + '@metamask/utils@5.0.2': resolution: {integrity: sha512-yfmE79bRQtnMzarnKfX7AEJBwFTxvTyw3nBQlu/5rmGXrjAeAMltoGxO62TFurxrQAFMNa/fEjIHNvungZp0+g==} engines: {node: '>=14.0.0'} - '@metamask/utils@8.4.0': - resolution: {integrity: sha512-dbIc3C7alOe0agCuBHM1h71UaEaEqOk2W8rAtEn8QGz4haH2Qq7MoK6i7v2guzvkJVVh79c+QCzIqphC3KvrJg==} + '@metamask/utils@8.3.0': + resolution: {integrity: sha512-WFVcMPEkKKRCJ8DDkZUTVbLlpwgRn98F4VM/WzN89HM8PmHMnCyk/oG0AmK/seOxtik7uC7Bbi2YBC5Z5XB2zw==} engines: {node: '>=16.0.0'} - '@moralisweb3/api-utils@2.26.1': - resolution: {integrity: sha512-xG2rEvv7MEGiLwz6YkHeWnRToP9xiwtzdesgpYcbOMfEhO0dOF5NMhey9F4NS3l4p+ei8liLQAmFRUehyojbWg==} + '@moralisweb3/api-utils@2.26.2': + resolution: {integrity: sha512-2HQdwRzil5AyIZID+YFk3XX6QMkdOVClMgrDtsEvZgKLUa5OXSYasSUymfSf6q8FsKJGkHK9kuqoS2dZM4aBvA==} - '@moralisweb3/aptos-api@2.26.1': - resolution: {integrity: sha512-LClXb88MtC8kAkuWgJ5PlvjBnY9wCd3fBMa+FbOvIlKgMDHjNizDzFCVAX/f6lF884/XBzpxq0QyoFcvYx0RFQ==} + '@moralisweb3/aptos-api@2.26.2': + resolution: {integrity: sha512-3VXT4Q9SGE58UnX6UTrU6BExeBxkvDKfVjVd8AR6KlMcK5C6EaON3dlSfdyAqKAHv5rySXnXxZyG7EHURIzW2g==} - '@moralisweb3/auth@2.26.1': - resolution: {integrity: sha512-PUIm67hPOI0ThyUJ851Bq0i1Y0A7cFSR7wILwM0Ye1W1IOoygAI2Ls7Zyy9HK9aRUV3J1Sqek49azjNfmXQ0QA==} + '@moralisweb3/auth@2.26.2': + resolution: {integrity: sha512-29qr2jA+jsFup42vghZilmozuwV9/PCW88Or4v9k/XczFX80563ESpjJMXjgSZL3J7XspMt6YzpdqztDpvmyjA==} - '@moralisweb3/common-aptos-utils@2.26.1': - resolution: {integrity: sha512-02c4zgksBzlM9zZgeDLvPQ/+yDjVAWRnkbXP2Hnow19PSIqUJb/RkHclqm3+623tH4JJwgbqei3wrQZigNQAWg==} + '@moralisweb3/common-aptos-utils@2.26.2': + resolution: {integrity: sha512-+8m/953/0zmio1cHREQAvVouoirPMFWr//gy34jYMKJevwkYcDG0IhzHQ7cXEHCMNRPUYtV3OD7JodL6zMRLeQ==} - '@moralisweb3/common-auth-utils@2.26.1': - resolution: {integrity: sha512-g2FrjZKqjxitd4aDbJjdIwLXDYYa8a3sMRL31jynyblIfz2OTXJ5YZj86n8aENY+1t8BOcLwixzsRHRDiHnbog==} + '@moralisweb3/common-auth-utils@2.26.2': + resolution: {integrity: sha512-Cz526qRzMBBb5ZH/2o+J6p+bXVEL4gh5VaqDVRXODdCu81VhT+xdm2f2lNGZ4lhaFXoxYXAmUD446KM7hP+ZUw==} - '@moralisweb3/common-core@2.26.1': - resolution: {integrity: sha512-HbsSjBZuicoKyJxlWNl0YV6YolGQ0bWT2jbPwMGvLrtbeeRTT3rE2IrIh9nSe7z9pWVvXfU3t+4oXkisY+8dJg==} + '@moralisweb3/common-core@2.26.2': + resolution: {integrity: sha512-gvisSn6kpvZGjzC5HwYeYlnlQk9wM3PMRUamtH5H1iCouQz6M8WhbZ3a9O8ldcjX8SLnxdz8w0Z479xTFIVoqQ==} - '@moralisweb3/common-evm-utils@2.26.1': - resolution: {integrity: sha512-Gr4qJmGhr5ixSeysg4CjZBZexeTzHqPYPE1YuaGAmD4dmW2OMpN2mRwXYnJmKNtML45XfTy4bCfeoTER7xBCWA==} + '@moralisweb3/common-evm-utils@2.26.2': + resolution: {integrity: sha512-ZqzCPPTvurXtNi+DuyP6JsAzbxp4KkrsaMQzAvBPGEkIjIGxswDt47NVn6vzKLWqYk/C+IK5t/hBVBla9BfAnw==} - '@moralisweb3/common-sol-utils@2.26.1': - resolution: {integrity: sha512-68VaTLpTvWljzaWsb7bHd7IOPHraT5pqfQG/rs5pOZQ846/nWe8bWzCT619aKAiS54WEhkg3lgqE58mISiTmCw==} + '@moralisweb3/common-sol-utils@2.26.2': + resolution: {integrity: sha512-r8oxkTQfduIUNZ+/scjed6cphv8c4IPtdgarUrzz/cS2y/VcaXjDweLQsyFfMIOk4Fa0DTXaabzd8to5XNz2FQ==} - '@moralisweb3/common-streams-utils@2.26.1': - resolution: {integrity: sha512-dhUrGoeBW1xfokQNRhr7AfejEBA/jOwIp3uyaw19M1eQcw0v+ekhgWvglSEDp0Fp3AouZFUAgkX1pOz/BziuCw==} + '@moralisweb3/common-streams-utils@2.26.2': + resolution: {integrity: sha512-bhNgr0G3daG3n0qaB4lQ0/qA63kG2Ich3Zju3dLH8p9KdLeMvFAQIZzlx1aT0Ij7laaoqfnv2Pb0GQ1DTkvimQ==} - '@moralisweb3/evm-api@2.26.1': - resolution: {integrity: sha512-1A92tQsM/K9wMVpciziPmy8s258en+KN9CIIBNj+6AqXS+yjvd6Fbh//0ZGpKmsBu862ULfb8EnrmeYQBoSEbw==} + '@moralisweb3/evm-api@2.26.2': + resolution: {integrity: sha512-ageSyclGqHh/X6Wr1X1OHiCTBJcvhF1af4DvTe8xF1xnLqYtPk/TY3o2DmW//0bR6lQdebySbc+UEufld5uUpg==} - '@moralisweb3/sol-api@2.26.1': - resolution: {integrity: sha512-Wvpg8soLyb5DRR2R/v3ociFVI4I4EH1SsCU7Ah53tfmX/gDl5qs9FFdOMR/gYhS0vZXFN0f2jW+6I9ml1A9bDw==} + '@moralisweb3/sol-api@2.26.2': + resolution: {integrity: sha512-3fLnMGeuD/4EV6g7Qw6xtkyRh7RXxcIz1eTNZsph1NHQtXMTi9oQgSitTwmWcAHNzKQBXn4zoz5fx2yrIBWPIw==} '@moralisweb3/streams-typings@1.0.7': resolution: {integrity: sha512-ShbVqil0KLOTyTjO6z9JewPcVVE3S6kzkQFnW2flGBRsGdKucpkUdOx1HijOLoaikz/9gH92n+lzTvRFIj0AoA==} - '@moralisweb3/streams@2.26.1': - resolution: {integrity: sha512-YyF3w8jKYw06ihKSi7LsG2L7FmOXDZarufQdYFhFFlNflprJG+ENorAp8NX9CfSoPzbLkF5NTDug22lehNqWTA==} + '@moralisweb3/streams@2.26.2': + resolution: {integrity: sha512-PZ8aVE7S/n5MeOTLTxYff28UfNd3qv2AmE31saRPdGMnUTj7UgSiwqGQNt3ZYS0Gh1RjzvshELn9dRll8VrzYg==} - '@motionone/animation@10.17.0': - resolution: {integrity: sha512-ANfIN9+iq1kGgsZxs+Nz96uiNcPLGTXwfNo2Xz/fcJXniPYpaz/Uyrfa+7I5BPLxCP82sh7quVDudf1GABqHbg==} + '@motionone/animation@10.16.3': + resolution: {integrity: sha512-QUGWpLbMFLhyqKlngjZhjtxM8IqiJQjLK0DF+XOF6od9nhSvlaeEpOY/UMCRVcZn/9Tr2rZO22EkuCIjYdI74g==} - '@motionone/dom@10.17.0': - resolution: {integrity: sha512-cMm33swRlCX/qOPHWGbIlCl0K9Uwi6X5RiL8Ma6OrlJ/TP7Q+Np5GE4xcZkFptysFjMTi4zcZzpnNQGQ5D6M0Q==} + '@motionone/dom@10.16.4': + resolution: {integrity: sha512-HPHlVo/030qpRj9R8fgY50KTN4Ko30moWRTA3L3imrsRBmob93cTYmodln49HYFbQm01lFF7X523OkKY0DX6UA==} - '@motionone/easing@10.17.0': - resolution: {integrity: sha512-Bxe2wSuLu/qxqW4rBFS5m9tMLOw+QBh8v5A7Z5k4Ul4sTj5jAOfZG5R0bn5ywmk+Fs92Ij1feZ5pmC4TeXA8Tg==} + '@motionone/easing@10.16.3': + resolution: {integrity: sha512-HWTMZbTmZojzwEuKT/xCdvoMPXjYSyQvuVM6jmM0yoGU6BWzsmYMeB4bn38UFf618fJCNtP9XeC/zxtKWfbr0w==} - '@motionone/generators@10.17.0': - resolution: {integrity: sha512-T6Uo5bDHrZWhIfxG/2Aut7qyWQyJIWehk6OB4qNvr/jwA/SRmixwbd7SOrxZi1z5rH3LIeFFBKK1xHnSbGPZSQ==} + '@motionone/generators@10.16.4': + resolution: {integrity: sha512-geFZ3w0Rm0ZXXpctWsSf3REGywmLLujEjxPYpBR0j+ymYwof0xbV6S5kGqqsDKgyWKVWpUInqQYvQfL6fRbXeg==} '@motionone/svelte@10.16.4': resolution: {integrity: sha512-zRVqk20lD1xqe+yEDZhMYgftsuHc25+9JSo+r0a0OWUJFocjSV9D/+UGhX4xgJsuwB9acPzXLr20w40VnY2PQA==} - '@motionone/types@10.17.0': - resolution: {integrity: sha512-EgeeqOZVdRUTEHq95Z3t8Rsirc7chN5xFAPMYFobx8TPubkEfRSm5xihmMUkbaR2ErKJTUw3347QDPTHIW12IA==} + '@motionone/types@10.16.3': + resolution: {integrity: sha512-W4jkEGFifDq73DlaZs3HUfamV2t1wM35zN/zX7Q79LfZ2sc6C0R1baUHZmqc/K5F3vSw3PavgQ6HyHLd/MXcWg==} - '@motionone/utils@10.17.0': - resolution: {integrity: sha512-bGwrki4896apMWIj9yp5rAS2m0xyhxblg6gTB/leWDPt+pb410W8lYWsxyurX+DH+gO1zsQsfx2su/c1/LtTpg==} + '@motionone/utils@10.16.3': + resolution: {integrity: sha512-WNWDksJIxQkaI9p9Z9z0+K27xdqISGNFy1SsWVGaiedTHq0iaT6iZujby8fT/ZnZxj1EOaxJtSfUPCFNU5CRoA==} '@motionone/vue@10.16.4': resolution: {integrity: sha512-z10PF9JV6SbjFq+/rYabM+8CVlMokgl8RFGvieSGNTmrkQanfHn+15XBrhG3BgUfvmTeSeyShfOHpG0i9zEdcg==} @@ -3188,17 +3581,20 @@ packages: resolution: {integrity: sha512-doST0+aB7/3dGK9+U5y3mtF3jq85KGbke1QiH0KE1F5mGQ9y56mFebTeu2D9FNOm+OT6UHb8Ss8vbSnpGjeLNw==} engines: {node: '>=16.0.0', npm: '>=7.0.0'} - '@multiformats/multiaddr@12.2.1': - resolution: {integrity: sha512-UwjoArBbv64FlaetV4DDwh+PUMfzXUBltxQwdh+uTYnGFzVa8ZfJsn1vt1RJlJ6+Xtrm3RMekF/B+K338i2L5Q==} - - '@ndelangen/get-tarball@3.0.9': - resolution: {integrity: sha512-9JKTEik4vq+yGosHYhZ1tiH/3WpUS0Nh0kej4Agndhox8pAdWhEx5knFVRcb/ya9knCRCs1rPxNrSXTDdfVqpA==} + '@multiformats/multiaddr@12.3.0': + resolution: {integrity: sha512-JQ8Gc/jgucqqvEaDTFN/AvxlYDHEE7lgEWLMYW7hKZkWggER+GvG/tVxUgUxIP8M0vFpvEHKKHE0lKzyMsgi8Q==} '@noble/curves@1.2.0': resolution: {integrity: sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==} - '@noble/curves@1.3.0': - resolution: {integrity: sha512-t01iSXPuN+Eqzb4eBX0S5oubSqXbK/xXa1Ne18Hj8f9pStxztHCE2gfboSp/dZRLSqfuLpRK2nDXDK+W9puocA==} + '@noble/curves@1.4.0': + resolution: {integrity: sha512-p+4cb332SFCrReJkCYe8Xzm0OWi4Jji5jVdIZRL/PmacmDkFNw6MrrV+gGpiPxLHbV+zKFRywUWbaseT+tZRXg==} + + '@noble/curves@1.4.2': + resolution: {integrity: sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==} + + '@noble/curves@1.4.0': + resolution: {integrity: sha512-p+4cb332SFCrReJkCYe8Xzm0OWi4Jji5jVdIZRL/PmacmDkFNw6MrrV+gGpiPxLHbV+zKFRywUWbaseT+tZRXg==} '@noble/hashes@1.2.0': resolution: {integrity: sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ==} @@ -3207,14 +3603,14 @@ packages: resolution: {integrity: sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==} engines: {node: '>= 16'} - '@noble/hashes@1.3.3': - resolution: {integrity: sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA==} - engines: {node: '>= 16'} - '@noble/hashes@1.4.0': resolution: {integrity: sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==} engines: {node: '>= 16'} + '@noble/hashes@1.5.0': + resolution: {integrity: sha512-1j6kQFb7QRru7eKN3ZDvRcP13rugwdxZqCjbiAVZfIJwgj2A65UmT4TgARXGlXgnRkORLTDTrO19ZErt7+QXgA==} + engines: {node: ^14.21.3 || >=16} + '@noble/secp256k1@1.7.1': resolution: {integrity: sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==} @@ -3230,6 +3626,96 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} + '@nomicfoundation/edr-darwin-arm64@0.6.3': + resolution: {integrity: sha512-hqtI7tYDqKG5PDmZ//Z65EH5cgH8VL/SAAu50rpHP7WAVfJWkOCcYbecywwF6nhHdonJbRTDGAeG1/+VOy6zew==} + engines: {node: '>= 18'} + + '@nomicfoundation/edr-darwin-x64@0.6.3': + resolution: {integrity: sha512-4fGi79/lyOlRUORhCYsYb3sWqRHuHT7qqzyZfZuNOn8llaxmT1k36xNmvpyg37R8SzjnhT/DzoukSJrs23Ip9Q==} + engines: {node: '>= 18'} + + '@nomicfoundation/edr-linux-arm64-gnu@0.6.3': + resolution: {integrity: sha512-yFFTvGFMhfAvQ1Z2itUh1jpoUA+mVROyVELcaxjIq8fyg602lQmbS+NXkhQ+oaeDgJ+06mSENrHBg4fcfRf9cw==} + engines: {node: '>= 18'} + + '@nomicfoundation/edr-linux-arm64-musl@0.6.3': + resolution: {integrity: sha512-pOKmd0Fa3a6BHg5qbjbl/jMRELVi9oazbfiuU7Bvgn/dpTK+ID3jwT0SXiuC2zxjmPByWgXL6G9XRf5BPAM2rQ==} + engines: {node: '>= 18'} + + '@nomicfoundation/edr-linux-x64-gnu@0.6.3': + resolution: {integrity: sha512-3AUferhkLIXtLV63w5GjpHttzdxZ36i656XMy+pkBZbbiqnzIVeKWg6DJv1A94fQY16gB4gqj9CLq4CWvbNN6w==} + engines: {node: '>= 18'} + + '@nomicfoundation/edr-linux-x64-musl@0.6.3': + resolution: {integrity: sha512-fr6bD872WIBXe9YnTDi0CzYepMcYRgSnkVqn0yK4wRnIvKrloWhxXNVY45GVIl51aNZguBnvoA4WEt6HIazs3A==} + engines: {node: '>= 18'} + + '@nomicfoundation/edr-win32-x64-msvc@0.6.3': + resolution: {integrity: sha512-sn34MvN1ajw2Oq1+Drpxej78Z0HfIzI4p4WlolupAV9dOZKzp2JAIQeLVfZpjIFbF3zuyxLPP4dUBrQoFPEqhA==} + engines: {node: '>= 18'} + + '@nomicfoundation/edr@0.6.3': + resolution: {integrity: sha512-hThe5ORR75WFYTXKL0K2AyLDxkTMrG+VQ1yL9BhQYsuh3OIH+3yNDxMz2LjfvrpOrMmJ4kk5NKdFewpqDojjXQ==} + engines: {node: '>= 18'} + + '@nomicfoundation/ethereumjs-common@4.0.4': + resolution: {integrity: sha512-9Rgb658lcWsjiicr5GzNCjI1llow/7r0k50dLL95OJ+6iZJcVbi15r3Y0xh2cIO+zgX0WIHcbzIu6FeQf9KPrg==} + + '@nomicfoundation/ethereumjs-rlp@5.0.4': + resolution: {integrity: sha512-8H1S3s8F6QueOc/X92SdrA4RDenpiAEqMg5vJH99kcQaCy/a3Q6fgseo75mgWlbanGJXSlAPtnCeG9jvfTYXlw==} + engines: {node: '>=18'} + hasBin: true + + '@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/solidity-analyzer-darwin-arm64@0.1.2': + resolution: {integrity: sha512-JaqcWPDZENCvm++lFFGjrDd8mxtf+CtLd2MiXvMNTBD33dContTZ9TWETwNFwg7JTJT5Q9HEecH7FA+HTSsIUw==} + engines: {node: '>= 12'} + + '@nomicfoundation/solidity-analyzer-darwin-x64@0.1.2': + resolution: {integrity: sha512-fZNmVztrSXC03e9RONBT+CiksSeYcxI1wlzqyr0L7hsQlK1fzV+f04g2JtQ1c/Fe74ZwdV6aQBdd6Uwl1052sw==} + engines: {node: '>= 12'} + + '@nomicfoundation/solidity-analyzer-linux-arm64-gnu@0.1.2': + resolution: {integrity: sha512-3d54oc+9ZVBuB6nbp8wHylk4xh0N0Gc+bk+/uJae+rUgbOBwQSfuGIbAZt1wBXs5REkSmynEGcqx6DutoK0tPA==} + engines: {node: '>= 12'} + + '@nomicfoundation/solidity-analyzer-linux-arm64-musl@0.1.2': + resolution: {integrity: sha512-iDJfR2qf55vgsg7BtJa7iPiFAsYf2d0Tv/0B+vhtnI16+wfQeTbP7teookbGvAo0eJo7aLLm0xfS/GTkvHIucA==} + engines: {node: '>= 12'} + + '@nomicfoundation/solidity-analyzer-linux-x64-gnu@0.1.2': + resolution: {integrity: sha512-9dlHMAt5/2cpWyuJ9fQNOUXFB/vgSFORg1jpjX1Mh9hJ/MfZXlDdHQ+DpFCs32Zk5pxRBb07yGvSHk9/fezL+g==} + engines: {node: '>= 12'} + + '@nomicfoundation/solidity-analyzer-linux-x64-musl@0.1.2': + resolution: {integrity: sha512-GzzVeeJob3lfrSlDKQw2bRJ8rBf6mEYaWY+gW0JnTDHINA0s2gPR4km5RLIj1xeZZOYz4zRw+AEeYgLRqB2NXg==} + engines: {node: '>= 12'} + + '@nomicfoundation/solidity-analyzer-win32-x64-msvc@0.1.2': + resolution: {integrity: sha512-Fdjli4DCcFHb4Zgsz0uEJXZ2K7VEO+w5KVv7HmT7WO10iODdU9csC2az4jrhEsRtiR9Gfd74FlG0NYlw1BMdyA==} + engines: {node: '>= 12'} + + '@nomicfoundation/solidity-analyzer@0.1.2': + resolution: {integrity: sha512-q4n32/FNKIhQ3zQGGw5CvPF6GTvDCpYwIf7bEY/dZTZbgfDsHyjJwURxUJf3VQuuJj+fDIFl4+KkBVbw4Ef6jA==} + engines: {node: '>= 12'} + '@openzeppelin/contracts-upgradeable@4.9.6': resolution: {integrity: sha512-m4iHazOsOCv1DgM7eD7GupTJ+NFVujRZt1wzddDPSVGpWdKq1SKkla5htKG7+IS4d2XOCtzkUNwRZ7Vq5aEUMA==} @@ -3244,9 +3730,57 @@ packages: '@openzeppelin/contracts@5.0.2': resolution: {integrity: sha512-ytPc6eLGcHHnapAZ9S+5qsdomhjo6QBHTDRRBFfTxXIpsicMhVPouPgmUPebZZZGX7vt9USA+Z+0M0dSVtSUEA==} + '@openzeppelin/defender-as-code@3.0.1': + resolution: {integrity: sha512-AeGMBk81Bak6B4u3pXjO1aOrIbJqrE6gZJqTJiBRGzKRGWxqQycriojZ3/lns/DcrNElA2BBHD0ONESrpMbZAg==} + + '@openzeppelin/defender-sdk-account-client@1.14.4': + resolution: {integrity: sha512-SxV4oTofO/xf1IcNJ5Dcc6XdXrxmu2jNPIeOx6GhdwVmO2LDVgi/9pAwXNlW1ihZ4wkJf/BSz3JsRJCgrwkadQ==} + + '@openzeppelin/defender-sdk-action-client@1.14.4': + resolution: {integrity: sha512-YoRW3ZST1YCGkBIPtzJNPR0ajK9H0cxhT+evbRX9hgiUNJTgTDJeKGX+qOKOMjKOPXikiYUc2TpmKwP1I2tP5A==} + hasBin: true + + '@openzeppelin/defender-sdk-base-client@1.14.4': + resolution: {integrity: sha512-tOePVQLKpqfGQ1GMzHvSBNd2psPYd86LDNpvdl5gjD0Y2kW/zNh5qBXy29RraGtk/qc8zs9hzS5pAOh0vhGkGQ==} + + '@openzeppelin/defender-sdk-deploy-client@1.14.4': + resolution: {integrity: sha512-+diSoz1zid37LMsY2RDxI+uAsYx9Eryg8Vz+yfvuyd56fXrzjQEln7BBtYQw+2zp9yvyAByOL5XSQdrQga9OBQ==} + + '@openzeppelin/defender-sdk-key-value-store-client@1.14.4': + resolution: {integrity: sha512-8InEiGeUpahKuWTgFWUyS5DS9HkXeHWMW+yxolGwxCy+OIGEPfxg/oMBXC2UzGn3BfIvWic/CLspFzuWIlarEQ==} + + '@openzeppelin/defender-sdk-monitor-client@1.14.4': + resolution: {integrity: sha512-PSesKNicY37LiHD2EVsyZXQrHRZsPYaVhUuMdqfNoJZexPZfnhv7c2A481tt+hTwAccJguQF69NLqylpdgtpFQ==} + + '@openzeppelin/defender-sdk-network-client@1.14.4': + resolution: {integrity: sha512-OS0H5b0vgYacJcwkvUFJUaRuyUaXhIRl916W5xLvGia5H6i/qn3dP8MZ7oLcPwKc8jB+ucRytO4H/AHsea0aVA==} + + '@openzeppelin/defender-sdk-notification-channel-client@1.14.4': + resolution: {integrity: sha512-xCMUe4pseRA+tQMrd6PDoZ4aToDi0LPrVAlBXFDFxCZ6/TzcsVA/PgfM4Hy6R+9vF+S5gMFGuJkCpDtlcYfo5A==} + + '@openzeppelin/defender-sdk-proposal-client@1.14.4': + resolution: {integrity: sha512-xVI5A6wJb/XfqVAEkSsINrgGkNznw0eZL7CnzX1OUnZ4irrlaD4HpG/CkFgVWLx8tRIMFlUtb3as3KMc/sO8eg==} + + '@openzeppelin/defender-sdk-relay-client@1.14.4': + resolution: {integrity: sha512-L+vPUeeg36muOy1Oh8wqNEJ8qXXQrFytYZerPS9N/Vf7TQBZoKUkuVq69dw7+XYq/ouqbppvAvUtV9SnyDkYpQ==} + + '@openzeppelin/defender-sdk-relay-signer-client@1.14.4': + resolution: {integrity: sha512-zjVhor/LEHYG6Gf+GEFTrwsuGZjVbzqTqQew4X622FY38P13PpcEIdXDgbokqdlX8zpECcggD2kmTTDgVWRqjA==} + peerDependencies: + web3: ^1.10.0 + web3-core: ^1.10.4 + web3-core-helpers: ^1.10.0 + web3-utils: ^1.10.0 + + '@openzeppelin/defender-sdk@1.14.4': + resolution: {integrity: sha512-QFXvqeLzfFxyRq5bw+7h2pq65pztNKBUy0vtizdSeQMA6MZ5wqDyTu/8bziYdQH+BmKzMqYBgErJAmic2XCzZQ==} + '@openzeppelin/merkle-tree@1.0.6': resolution: {integrity: sha512-cGWOb2WBWbJhqvupzxjnKAwGLxxAEYPg51sk76yZ5nVe5D03mw7Vx5yo8llaIEqYhP5O39M8QlrNWclgLfKVrA==} + '@oslojs/encoding@0.4.1': + resolution: {integrity: sha512-hkjo6MuIK/kQR5CrGNdAPZhS01ZCXuWDRJ187zh6qqF2+yMHZpD9fAYpX8q2bOO6Ryhl3XpCT6kUX76N8hhm4Q==} + '@pagefind/darwin-arm64@1.1.0': resolution: {integrity: sha512-SLsXNLtSilGZjvqis8sX42fBWsWAVkcDh1oerxwqbac84HbiwxpxOC2jm8hRwcR0Z55HPZPWO77XeRix/8GwTg==} cpu: [arm64] @@ -3275,98 +3809,98 @@ packages: cpu: [x64] os: [win32] - '@parcel/watcher-android-arm64@2.4.1': - resolution: {integrity: sha512-LOi/WTbbh3aTn2RYddrO8pnapixAziFl6SMxHM69r3tvdSm94JtCenaKgk1GRg5FJ5wpMCpHeW+7yqPlvZv7kg==} + '@parcel/watcher-android-arm64@2.4.0': + resolution: {integrity: sha512-+fPtO/GsbYX1LJnCYCaDVT3EOBjvSFdQN9Mrzh9zWAOOfvidPWyScTrHIZHHfJBvlHzNA0Gy0U3NXFA/M7PHUA==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [android] - '@parcel/watcher-darwin-arm64@2.4.1': - resolution: {integrity: sha512-ln41eihm5YXIY043vBrrHfn94SIBlqOWmoROhsMVTSXGh0QahKGy77tfEywQ7v3NywyxBBkGIfrWRHm0hsKtzA==} + '@parcel/watcher-darwin-arm64@2.4.0': + resolution: {integrity: sha512-T/At5pansFuQ8VJLRx0C6C87cgfqIYhW2N/kBfLCUvDhCah0EnLLwaD/6MW3ux+rpgkpQAnMELOCTKlbwncwiA==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [darwin] - '@parcel/watcher-darwin-x64@2.4.1': - resolution: {integrity: sha512-yrw81BRLjjtHyDu7J61oPuSoeYWR3lDElcPGJyOvIXmor6DEo7/G2u1o7I38cwlcoBHQFULqF6nesIX3tsEXMg==} + '@parcel/watcher-darwin-x64@2.4.0': + resolution: {integrity: sha512-vZMv9jl+szz5YLsSqEGCMSllBl1gU1snfbRL5ysJU03MEa6gkVy9OMcvXV1j4g0++jHEcvzhs3Z3LpeEbVmY6Q==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [darwin] - '@parcel/watcher-freebsd-x64@2.4.1': - resolution: {integrity: sha512-TJa3Pex/gX3CWIx/Co8k+ykNdDCLx+TuZj3f3h7eOjgpdKM+Mnix37RYsYU4LHhiYJz3DK5nFCCra81p6g050w==} + '@parcel/watcher-freebsd-x64@2.4.0': + resolution: {integrity: sha512-dHTRMIplPDT1M0+BkXjtMN+qLtqq24sLDUhmU+UxxLP2TEY2k8GIoqIJiVrGWGomdWsy5IO27aDV1vWyQ6gfHA==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [freebsd] - '@parcel/watcher-linux-arm-glibc@2.4.1': - resolution: {integrity: sha512-4rVYDlsMEYfa537BRXxJ5UF4ddNwnr2/1O4MHM5PjI9cvV2qymvhwZSFgXqbS8YoTk5i/JR0L0JDs69BUn45YA==} + '@parcel/watcher-linux-arm-glibc@2.4.0': + resolution: {integrity: sha512-9NQXD+qk46RwATNC3/UB7HWurscY18CnAPMTFcI9Y8CTbtm63/eex1SNt+BHFinEQuLBjaZwR2Lp+n7pmEJPpQ==} engines: {node: '>= 10.0.0'} cpu: [arm] os: [linux] - '@parcel/watcher-linux-arm64-glibc@2.4.1': - resolution: {integrity: sha512-BJ7mH985OADVLpbrzCLgrJ3TOpiZggE9FMblfO65PlOCdG++xJpKUJ0Aol74ZUIYfb8WsRlUdgrZxKkz3zXWYA==} + '@parcel/watcher-linux-arm64-glibc@2.4.0': + resolution: {integrity: sha512-QuJTAQdsd7PFW9jNGaV9Pw+ZMWV9wKThEzzlY3Lhnnwy7iW23qtQFPql8iEaSFMCVI5StNNmONUopk+MFKpiKg==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [linux] - '@parcel/watcher-linux-arm64-musl@2.4.1': - resolution: {integrity: sha512-p4Xb7JGq3MLgAfYhslU2SjoV9G0kI0Xry0kuxeG/41UfpjHGOhv7UoUDAz/jb1u2elbhazy4rRBL8PegPJFBhA==} + '@parcel/watcher-linux-arm64-musl@2.4.0': + resolution: {integrity: sha512-oyN+uA9xcTDo/45bwsd6TFHa7Lc7hKujyMlvwrCLvSckvWogndCEoVYFNfZ6JJ2KNL/6fFiGPcbjp8jJmEh5Ng==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [linux] - '@parcel/watcher-linux-x64-glibc@2.4.1': - resolution: {integrity: sha512-s9O3fByZ/2pyYDPoLM6zt92yu6P4E39a03zvO0qCHOTjxmt3GHRMLuRZEWhWLASTMSrrnVNWdVI/+pUElJBBBg==} + '@parcel/watcher-linux-x64-glibc@2.4.0': + resolution: {integrity: sha512-KphV8awJmxU3q52JQvJot0QMu07CIyEjV+2Tb2ZtbucEgqyRcxOBDMsqp1JNq5nuDXtcCC0uHQICeiEz38dPBQ==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [linux] - '@parcel/watcher-linux-x64-musl@2.4.1': - resolution: {integrity: sha512-L2nZTYR1myLNST0O632g0Dx9LyMNHrn6TOt76sYxWLdff3cB22/GZX2UPtJnaqQPdCRoszoY5rcOj4oMTtp5fQ==} + '@parcel/watcher-linux-x64-musl@2.4.0': + resolution: {integrity: sha512-7jzcOonpXNWcSijPpKD5IbC6xC7yTibjJw9jviVzZostYLGxbz8LDJLUnLzLzhASPlPGgpeKLtFUMjAAzM+gSA==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [linux] - '@parcel/watcher-wasm@2.4.1': - resolution: {integrity: sha512-/ZR0RxqxU/xxDGzbzosMjh4W6NdYFMqq2nvo2b8SLi7rsl/4jkL8S5stIikorNkdR50oVDvqb/3JT05WM+CRRA==} + '@parcel/watcher-wasm@2.4.0': + resolution: {integrity: sha512-MNgQ4WCbBybqQ97KwR/hqJGYTg3+s8qHpgIyFWB2qJOBvoJWbXuJGmm4ZkPLq2bMaANqCZqrXwmKYagZTkMKZA==} engines: {node: '>= 10.0.0'} bundledDependencies: - napi-wasm - '@parcel/watcher-win32-arm64@2.4.1': - resolution: {integrity: sha512-Uq2BPp5GWhrq/lcuItCHoqxjULU1QYEcyjSO5jqqOK8RNFDBQnenMMx4gAl3v8GiWa59E9+uDM7yZ6LxwUIfRg==} + '@parcel/watcher-win32-arm64@2.4.0': + resolution: {integrity: sha512-NOej2lqlq8bQNYhUMnOD0nwvNql8ToQF+1Zhi9ULZoG+XTtJ9hNnCFfyICxoZLXor4bBPTOnzs/aVVoefYnjIg==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [win32] - '@parcel/watcher-win32-ia32@2.4.1': - resolution: {integrity: sha512-maNRit5QQV2kgHFSYwftmPBxiuK5u4DXjbXx7q6eKjq5dsLXZ4FJiVvlcw35QXzk0KrUecJmuVFbj4uV9oYrcw==} + '@parcel/watcher-win32-ia32@2.4.0': + resolution: {integrity: sha512-IO/nM+K2YD/iwjWAfHFMBPz4Zqn6qBDqZxY4j2n9s+4+OuTSRM/y/irksnuqcspom5DjkSeF9d0YbO+qpys+JA==} engines: {node: '>= 10.0.0'} cpu: [ia32] os: [win32] - '@parcel/watcher-win32-x64@2.4.1': - resolution: {integrity: sha512-+DvS92F9ezicfswqrvIRM2njcYJbd5mb9CUgtrHCHmvn7pPPa+nMDRu1o1bYYz/l5IB2NVGNJWiH7h1E58IF2A==} + '@parcel/watcher-win32-x64@2.4.0': + resolution: {integrity: sha512-pAUyUVjfFjWaf/pShmJpJmNxZhbMvJASUpdes9jL6bTEJ+gDxPRSpXTIemNyNsb9AtbiGXs9XduP1reThmd+dA==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [win32] - '@parcel/watcher@2.4.1': - resolution: {integrity: sha512-HNjmfLQEVRZmHRET336f20H/8kOozUGwk7yajvsonjNxbj2wBTK1WsQuHkD5yYh9RxFGL2EyDHryOihOwUoKDA==} + '@parcel/watcher@2.4.0': + resolution: {integrity: sha512-XJLGVL0DEclX5pcWa2N9SX1jCGTDd8l972biNooLFtjneuGqodupPQh6XseXIBBeVIMaaJ7bTcs3qGvXwsp4vg==} engines: {node: '>= 10.0.0'} '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} - '@pkgr/core@0.1.1': - resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} + '@pkgr/utils@2.4.2': + resolution: {integrity: sha512-POgTXhjrTfbTV63DiFXav4lBHiICLKKwDeaKn9Nphwj7WH6m0hMMCaJkMyRWjgtPFyRKRVoMXXjczsTQRDEhYw==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - '@playwright/test@1.44.0': - resolution: {integrity: sha512-rNX5lbNidamSUorBhB4XZ9SQTjAqfe5M+p37Z8ic0jPFBMo5iCtQz1kRWkEMg+rYOKSlVycpQmpqjSFq7LXOfg==} + '@playwright/test@1.43.1': + resolution: {integrity: sha512-HgtQzFgNEEo4TE22K/X7sYTYNqEMMTZmFS8kTq6m8hXj+m1D8TgwgIbumHddJa9h4yl4GkKb8/bgAl2+g7eDgA==} engines: {node: '>=16'} hasBin: true @@ -3382,8 +3916,8 @@ packages: resolution: {integrity: sha512-UA91GwWPhFExt3IizW6bOeY/pQ0BkuNwKjk9iQW9KqxluGCrg4VenZ0/L+2Y0+ZOtme72EVvg6v0zo3AMQRCeA==} engines: {node: '>=12'} - '@polka/url@1.0.0-next.25': - resolution: {integrity: sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ==} + '@polka/url@1.0.0-next.24': + resolution: {integrity: sha512-2LuNTFBIO0m7kKIQvvPHN6UE63VjpmL9rnEEaOOaiSPbZK+zUOYIzBAWcED+3XYzhYsd/0mD57VdxAEqqV52CQ==} '@protobufjs/aspromise@1.1.2': resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} @@ -3415,265 +3949,103 @@ packages: '@protobufjs/utf8@1.1.0': resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} - '@radix-ui/primitive@1.0.1': - resolution: {integrity: sha512-yQ8oGX2GVsEYMWGxcovu1uGWPCxV5BFfeeYxqPmuAzUyLT9qmaMXSAhXpb0WrspIeqYzdJpkh2vHModJPgRIaw==} - - '@radix-ui/react-compose-refs@1.0.1': - resolution: {integrity: sha512-fDSBgd44FKHa1FRMU59qBMPFcl2PZE+2nmqunj+BWFyYYjnhIDWL2ItDs3rrbJDQOtzt5nIebLCQc4QRfz6LJw==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-context@1.0.1': - resolution: {integrity: sha512-ebbrdFoYTcuZ0v4wG5tedGnp9tzcV8awzsxYph7gXUyvnNLuTIcCk1q17JEbnVhXAKG9oX3KtchwiMIAYp9NLg==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-dialog@1.0.5': - resolution: {integrity: sha512-GjWJX/AUpB703eEBanuBnIWdIXg6NvJFCXcNlSZk4xdszCdhrJgBoUd1cGk67vFO+WdA2pfI/plOpqz/5GUP6Q==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-dismissable-layer@1.0.5': - resolution: {integrity: sha512-aJeDjQhywg9LBu2t/At58hCvr7pEm0o2Ke1x33B+MhjNmmZ17sy4KImo0KPLgsnc/zN7GPdce8Cnn0SWvwZO7g==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-focus-guards@1.0.1': - resolution: {integrity: sha512-Rect2dWbQ8waGzhMavsIbmSVCgYxkXLxxR3ZvCX79JOglzdEy4JXMb98lq4hPxUbLr77nP0UOGf4rcMU+s1pUA==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-focus-scope@1.0.4': - resolution: {integrity: sha512-sL04Mgvf+FmyvZeYfNu1EPAaaxD+aw7cYeIB9L9Fvq8+urhltTRaEo5ysKOpHuKPclsZcSUMKlN05x4u+CINpA==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-id@1.0.1': - resolution: {integrity: sha512-tI7sT/kqYp8p96yGWY1OAnLHrqDgzHefRBKQ2YAkBS5ja7QLcZ9Z/uY7bEjPUatf8RomoXM8/1sMj1IJaE5UzQ==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-portal@1.0.4': - resolution: {integrity: sha512-Qki+C/EuGUVCQTOTD5vzJzJuMUlewbzuKyUy+/iHM2uwGiru9gZeBJtHAPKAEkB5KWGi9mP/CHKcY0wt1aW45Q==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-presence@1.0.1': - resolution: {integrity: sha512-UXLW4UAbIY5ZjcvzjfRFo5gxva8QirC9hF7wRE4U5gz+TP0DbRk+//qyuAQ1McDxBt1xNMBTaciFGvEmJvAZCg==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-primitive@1.0.3': - resolution: {integrity: sha512-yi58uVyoAcK/Nq1inRY56ZSjKypBNKTa/1mcL8qdl6oJeEaDbOldlzrGn7P6Q3Id5d+SYNGc5AJgc4vGhjs5+g==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-slot@1.0.2': - resolution: {integrity: sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-use-callback-ref@1.0.1': - resolution: {integrity: sha512-D94LjX4Sp0xJFVaoQOd3OO9k7tpBYNOXdVhkltUbGv2Qb9OXdrg/CpsjlZv7ia14Sylv398LswWBVVu5nqKzAQ==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-use-controllable-state@1.0.1': - resolution: {integrity: sha512-Svl5GY5FQeN758fWKrjM6Qb7asvXeiZltlT4U2gVfl8Gx5UAv2sMR0LWo8yhsIZh2oQ0eFdZ59aoOOMV7b47VA==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-use-escape-keydown@1.0.3': - resolution: {integrity: sha512-vyL82j40hcFicA+M4Ex7hVkB9vHgSse1ZWomAqV2Je3RleKGO5iM8KMOEtfoSB0PnIelMd2lATjTGMYqN5ylTg==} + '@react-native-async-storage/async-storage@1.22.0': + resolution: {integrity: sha512-b5KD010iiZnot86RbAaHpLuHwmPW2qA3SSN/OSZhd1kBoINEQEVBuv+uFtcaTxAhX27bT0wd13GOb2IOSDUXSA==} peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-use-layout-effect@1.0.1': - resolution: {integrity: sha512-v/5RegiJWYdoCvMnITBkNNx6bCj20fiaJnWtRkU18yITptraXjffz5Qbn05uOiQnOvi+dbkznkoaMltz1GnszQ==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true + react-native: ^0.0.0-0 || >=0.60 <1.0 - '@react-native-community/cli-clean@13.6.6': - resolution: {integrity: sha512-cBwJTwl0NyeA4nyMxbhkWZhxtILYkbU3TW3k8AXLg+iGphe0zikYMGB3T+haTvTc6alTyEFwPbimk9bGIqkjAQ==} + '@react-native-community/cli-clean@12.3.2': + resolution: {integrity: sha512-90k2hCX0ddSFPT7EN7h5SZj0XZPXP0+y/++v262hssoey3nhurwF57NGWN0XAR0o9BSW7+mBfeInfabzDraO6A==} - '@react-native-community/cli-config@13.6.6': - resolution: {integrity: sha512-mbG425zCKr8JZhv/j11382arezwS/70juWMsn8j2lmrGTrP1cUdW0MF15CCIFtJsqyK3Qs+FTmqttRpq81QfSg==} + '@react-native-community/cli-config@12.3.2': + resolution: {integrity: sha512-UUCzDjQgvAVL/57rL7eOuFUhd+d+6qfM7V8uOegQFeFEmSmvUUDLYoXpBa5vAK9JgQtSqMBJ1Shmwao+/oElxQ==} - '@react-native-community/cli-debugger-ui@13.6.6': - resolution: {integrity: sha512-Vv9u6eS4vKSDAvdhA0OiQHoA7y39fiPIgJ6biT32tN4avHDtxlc6TWZGiqv7g98SBvDWvoVAmdPLcRf3kU+c8g==} + '@react-native-community/cli-debugger-ui@12.3.2': + resolution: {integrity: sha512-nSWQUL+51J682DlfcC1bjkUbQbGvHCC25jpqTwHIjmmVjYCX1uHuhPSqQKgPNdvtfOkrkACxczd7kVMmetxY2Q==} - '@react-native-community/cli-doctor@13.6.6': - resolution: {integrity: sha512-TWZb5g6EmQe2Ua2TEWNmyaEayvlWH4GmdD9ZC+p8EpKFpB1NpDGMK6sXbpb42TDvwZg5s4TDRplK0PBEA/SVDg==} + '@react-native-community/cli-doctor@12.3.2': + resolution: {integrity: sha512-GrAabdY4qtBX49knHFvEAdLtCjkmndjTeqhYO6BhsbAeKOtspcLT/0WRgdLIaKODRa61ADNB3K5Zm4dU0QrZOg==} - '@react-native-community/cli-hermes@13.6.6': - resolution: {integrity: sha512-La5Ie+NGaRl3klei6WxKoOxmCUSGGxpOk6vU5pEGf0/O7ky+Ay0io+zXYUZqlNMi/cGpO7ZUijakBYOB/uyuFg==} + '@react-native-community/cli-hermes@12.3.2': + resolution: {integrity: sha512-SL6F9O8ghp4ESBFH2YAPLtIN39jdnvGBKnK4FGKpDCjtB3DnUmDsGFlH46S+GGt5M6VzfG2eeKEOKf3pZ6jUzA==} - '@react-native-community/cli-platform-android@13.6.6': - resolution: {integrity: sha512-/tMwkBeNxh84syiSwNlYtmUz/Ppc+HfKtdopL/5RB+fd3SV1/5/NPNjMlyLNgFKnpxvKCInQ7dnl6jGHJjeHjg==} + '@react-native-community/cli-platform-android@12.3.2': + resolution: {integrity: sha512-MZ5nO8yi/N+Fj2i9BJcJ9C/ez+9/Ir7lQt49DWRo9YDmzye66mYLr/P2l/qxsixllbbDi7BXrlLpxaEhMrDopg==} - '@react-native-community/cli-platform-apple@13.6.6': - resolution: {integrity: sha512-bOmSSwoqNNT3AmCRZXEMYKz1Jf1l2F86Nhs7qBcXdY/sGiJ+Flng564LOqvdAlVLTbkgz47KjNKCS2pP4Jg0Mg==} + '@react-native-community/cli-platform-ios@12.3.2': + resolution: {integrity: sha512-OcWEAbkev1IL6SUiQnM6DQdsvfsKZhRZtoBNSj9MfdmwotVZSOEZJ+IjZ1FR9ChvMWayO9ns/o8LgoQxr1ZXeg==} - '@react-native-community/cli-platform-ios@13.6.6': - resolution: {integrity: sha512-vjDnRwhlSN5ryqKTas6/DPkxuouuyFBAqAROH4FR1cspTbn6v78JTZKDmtQy9JMMo7N5vZj1kASU5vbFep9IOQ==} + '@react-native-community/cli-plugin-metro@12.3.2': + resolution: {integrity: sha512-FpFBwu+d2E7KRhYPTkKvQsWb2/JKsJv+t1tcqgQkn+oByhp+qGyXBobFB8/R3yYvRRDCSDhS+atWTJzk9TjM8g==} - '@react-native-community/cli-server-api@13.6.6': - resolution: {integrity: sha512-ZtCXxoFlM7oDv3iZ3wsrT3SamhtUJuIkX2WePLPlN5bcbq7zimbPm2lHyicNJtpcGQ5ymsgpUWPCNZsWQhXBqQ==} + '@react-native-community/cli-server-api@12.3.2': + resolution: {integrity: sha512-iwa7EO9XFA/OjI5pPLLpI/6mFVqv8L73kNck3CNOJIUCCveGXBKK0VMyOkXaf/BYnihgQrXh+x5cxbDbggr7+Q==} - '@react-native-community/cli-tools@13.6.6': - resolution: {integrity: sha512-ptOnn4AJczY5njvbdK91k4hcYazDnGtEPrqIwEI+k/CTBHNdb27Rsm2OZ7ye6f7otLBqF8gj/hK6QzJs8CEMgw==} + '@react-native-community/cli-tools@12.3.2': + resolution: {integrity: sha512-nDH7vuEicHI2TI0jac/DjT3fr977iWXRdgVAqPZFFczlbs7A8GQvEdGnZ1G8dqRUmg+kptw0e4hwczAOG89JzQ==} - '@react-native-community/cli-types@13.6.6': - resolution: {integrity: sha512-733iaYzlmvNK7XYbnWlMjdE+2k0hlTBJW071af/xb6Bs+hbJqBP9c03FZuYH2hFFwDDntwj05bkri/P7VgSxug==} + '@react-native-community/cli-types@12.3.2': + resolution: {integrity: sha512-9D0UEFqLW8JmS16mjHJxUJWX8E+zJddrHILSH8AJHZ0NNHv4u2DXKdb0wFLMobFxGNxPT+VSOjc60fGvXzWHog==} - '@react-native-community/cli@13.6.6': - resolution: {integrity: sha512-IqclB7VQ84ye8Fcs89HOpOscY4284VZg2pojHNl8H0Lzd4DadXJWQoxC7zWm8v2f8eyeX2kdhxp2ETD5tceIgA==} + '@react-native-community/cli@12.3.2': + resolution: {integrity: sha512-WgoUWwLDcf/G1Su2COUUVs3RzAwnV/vUTdISSpAUGgSc57mPabaAoUctKTnfYEhCnE3j02k3VtaVPwCAFRO3TQ==} engines: {node: '>=18'} hasBin: true - '@react-native/assets-registry@0.74.83': - resolution: {integrity: sha512-2vkLMVnp+YTZYTNSDIBZojSsjz8sl5PscP3j4GcV6idD8V978SZfwFlk8K0ti0BzRs11mzL0Pj17km597S/eTQ==} + '@react-native/assets-registry@0.73.1': + resolution: {integrity: sha512-2FgAbU7uKM5SbbW9QptPPZx8N9Ke2L7bsHb+EhAanZjFZunA9PaYtyjUQ1s7HD+zDVqOQIvjkpXSv7Kejd2tqg==} engines: {node: '>=18'} - '@react-native/babel-plugin-codegen@0.74.83': - resolution: {integrity: sha512-+S0st3t4Ro00bi9gjT1jnK8qTFOU+CwmziA7U9odKyWrCoRJrgmrvogq/Dr1YXlpFxexiGIupGut1VHxr+fxJA==} + '@react-native/babel-plugin-codegen@0.73.4': + resolution: {integrity: sha512-XzRd8MJGo4Zc5KsphDHBYJzS1ryOHg8I2gOZDAUCGcwLFhdyGu1zBNDJYH2GFyDrInn9TzAbRIf3d4O+eltXQQ==} engines: {node: '>=18'} - '@react-native/babel-preset@0.74.83': - resolution: {integrity: sha512-KJuu3XyVh3qgyUer+rEqh9a/JoUxsDOzkJNfRpDyXiAyjDRoVch60X/Xa/NcEQ93iCVHAWs0yQ+XGNGIBCYE6g==} + '@react-native/babel-preset@0.73.21': + resolution: {integrity: sha512-WlFttNnySKQMeujN09fRmrdWqh46QyJluM5jdtDNrkl/2Hx6N4XeDUGhABvConeK95OidVO7sFFf7sNebVXogA==} engines: {node: '>=18'} peerDependencies: '@babel/core': '*' - '@react-native/codegen@0.74.83': - resolution: {integrity: sha512-GgvgHS3Aa2J8/mp1uC/zU8HuTh8ZT5jz7a4mVMWPw7+rGyv70Ba8uOVBq6UH2Q08o617IATYc+0HfyzAfm4n0w==} + '@react-native/codegen@0.73.3': + resolution: {integrity: sha512-sxslCAAb8kM06vGy9Jyh4TtvjhcP36k/rvj2QE2Jdhdm61KvfafCATSIsOfc0QvnduWFcpXUPvAVyYwuv7PYDg==} engines: {node: '>=18'} peerDependencies: '@babel/preset-env': ^7.1.6 - '@react-native/community-cli-plugin@0.74.83': - resolution: {integrity: sha512-7GAFjFOg1mFSj8bnFNQS4u8u7+QtrEeflUIDVZGEfBZQ3wMNI5ycBzbBGycsZYiq00Xvoc6eKFC7kvIaqeJpUQ==} + '@react-native/community-cli-plugin@0.73.16': + resolution: {integrity: sha512-eNH3v3qJJF6f0n/Dck90qfC9gVOR4coAXMTdYECO33GfgjTi+73vf/SBqlXw9HICH/RNZYGPM3wca4FRF7TYeQ==} engines: {node: '>=18'} - '@react-native/debugger-frontend@0.74.83': - resolution: {integrity: sha512-RGQlVUegBRxAUF9c1ss1ssaHZh6CO+7awgtI9sDeU0PzDZY/40ImoPD5m0o0SI6nXoVzbPtcMGzU+VO590pRfA==} + '@react-native/debugger-frontend@0.73.3': + resolution: {integrity: sha512-RgEKnWuoo54dh7gQhV7kvzKhXZEhpF9LlMdZolyhGxHsBqZ2gXdibfDlfcARFFifPIiaZ3lXuOVVa4ei+uPgTw==} engines: {node: '>=18'} - '@react-native/dev-middleware@0.74.83': - resolution: {integrity: sha512-UH8iriqnf7N4Hpi20D7M2FdvSANwTVStwFCSD7VMU9agJX88Yk0D1T6Meh2RMhUu4kY2bv8sTkNRm7LmxvZqgA==} + '@react-native/dev-middleware@0.73.7': + resolution: {integrity: sha512-BZXpn+qKp/dNdr4+TkZxXDttfx8YobDh8MFHsMk9usouLm22pKgFIPkGBV0X8Do4LBkFNPGtrnsKkWk/yuUXKg==} engines: {node: '>=18'} - '@react-native/gradle-plugin@0.74.83': - resolution: {integrity: sha512-Pw2BWVyOHoBuJVKxGVYF6/GSZRf6+v1Ygc+ULGz5t20N8qzRWPa2fRZWqoxsN7TkNLPsECYY8gooOl7okOcPAQ==} + '@react-native/gradle-plugin@0.73.4': + resolution: {integrity: sha512-PMDnbsZa+tD55Ug+W8CfqXiGoGneSSyrBZCMb5JfiB3AFST3Uj5e6lw8SgI/B6SKZF7lG0BhZ6YHZsRZ5MlXmg==} engines: {node: '>=18'} - '@react-native/js-polyfills@0.74.83': - resolution: {integrity: sha512-/t74n8r6wFhw4JEoOj3bN71N1NDLqaawB75uKAsSjeCwIR9AfCxlzZG0etsXtOexkY9KMeZIQ7YwRPqUdNXuqw==} + '@react-native/js-polyfills@0.73.1': + resolution: {integrity: sha512-ewMwGcumrilnF87H4jjrnvGZEaPFCAC4ebraEK+CurDDmwST/bIicI4hrOAv+0Z0F7DEK4O4H7r8q9vH7IbN4g==} engines: {node: '>=18'} - '@react-native/metro-babel-transformer@0.74.83': - resolution: {integrity: sha512-hGdx5N8diu8y+GW/ED39vTZa9Jx1di2ZZ0aapbhH4egN1agIAusj5jXTccfNBwwWF93aJ5oVbRzfteZgjbutKg==} + '@react-native/metro-babel-transformer@0.73.15': + resolution: {integrity: sha512-LlkSGaXCz+xdxc9819plmpsl4P4gZndoFtpjN3GMBIu6f7TBV0GVbyJAU4GE8fuAWPVSVL5ArOcdkWKSbI1klw==} engines: {node: '>=18'} peerDependencies: '@babel/core': '*' - '@react-native/normalize-colors@0.74.83': - resolution: {integrity: sha512-jhCY95gRDE44qYawWVvhTjTplW1g+JtKTKM3f8xYT1dJtJ8QWv+gqEtKcfmOHfDkSDaMKG0AGBaDTSK8GXLH8Q==} + '@react-native/normalize-colors@0.73.2': + resolution: {integrity: sha512-bRBcb2T+I88aG74LMVHaKms2p/T8aQd8+BZ7LuuzXlRfog1bMWWn/C5i0HVuvW4RPtXQYgIlGiXVDy9Ir1So/w==} - '@react-native/virtualized-lists@0.74.83': - resolution: {integrity: sha512-rmaLeE34rj7py4FxTod7iMTC7BAsm+HrGA8WxYmEJeyTV7WSaxAkosKoYBz8038mOiwnG9VwA/7FrB6bEQvn1A==} + '@react-native/virtualized-lists@0.73.4': + resolution: {integrity: sha512-HpmLg1FrEiDtrtAbXiwCgXFYyloK/dOIPIuWW3fsqukwJEWAiTzm1nXGJ7xPU5XTHiWZ4sKup5Ebaj8z7iyWog==} engines: {node: '>=18'} peerDependencies: - '@types/react': ^18.2.6 - react: '*' react-native: '*' - peerDependenciesMeta: - '@types/react': - optional: true '@readme/better-ajv-errors@1.6.0': resolution: {integrity: sha512-9gO9rld84Jgu13kcbKRU+WHseNhaVt76wYMeRDGsUGYxwJtI3RmEJ9LY9dZCYQGI8eUZLuxb5qDja0nqklpFjQ==} @@ -3690,102 +4062,261 @@ packages: peerDependencies: openapi-types: '>=7' - '@rnx-kit/chromium-edge-launcher@1.0.0': - resolution: {integrity: sha512-lzD84av1ZQhYUS+jsGqJiCMaJO2dn9u+RTT9n9q6D3SaKVwWqv+7AoRKqBu19bkwyE+iFRl1ymr40QS90jVFYg==} - engines: {node: '>=14.15'} + '@rollup/pluginutils@5.1.0': + resolution: {integrity: sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/rollup-android-arm-eabi@4.12.0': + resolution: {integrity: sha512-+ac02NL/2TCKRrJu2wffk1kZ+RyqxVUlbjSagNgPm94frxtr+XDL12E5Ll1enWskLrtrZ2r8L3wED1orIibV/w==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm-eabi@4.18.0': + resolution: {integrity: sha512-Tya6xypR10giZV1XzxmH5wr25VcZSncG0pZIjfePT0OVBvqNEurzValetGNarVrGiq66EBVAFn15iYX4w6FKgQ==} + cpu: [arm] + os: [android] - '@rollup/rollup-android-arm-eabi@4.17.2': - resolution: {integrity: sha512-NM0jFxY8bB8QLkoKxIQeObCaDlJKewVlIEkuyYKm5An1tdVZ966w2+MPQ2l8LBZLjR+SgyV+nRkTIunzOYBMLQ==} + '@rollup/rollup-android-arm-eabi@4.21.3': + resolution: {integrity: sha512-MmKSfaB9GX+zXl6E8z4koOr/xU63AMVleLEa64v7R0QF/ZloMs5vcD1sHgM64GXXS1csaJutG+ddtzcueI/BLg==} cpu: [arm] os: [android] + '@rollup/rollup-android-arm64@4.12.0': + resolution: {integrity: sha512-OBqcX2BMe6nvjQ0Nyp7cC90cnumt8PXmO7Dp3gfAju/6YwG0Tj74z1vKrfRz7qAv23nBcYM8BCbhrsWqO7PzQQ==} + cpu: [arm64] + os: [android] + '@rollup/rollup-android-arm64@4.17.2': resolution: {integrity: sha512-yeX/Usk7daNIVwkq2uGoq2BYJKZY1JfyLTaHO/jaiSwi/lsf8fTFoQW/n6IdAsx5tx+iotu2zCJwz8MxI6D/Bw==} cpu: [arm64] os: [android] + '@rollup/rollup-android-arm64@4.21.3': + resolution: {integrity: sha512-zrt8ecH07PE3sB4jPOggweBjJMzI1JG5xI2DIsUbkA+7K+Gkjys6eV7i9pOenNSDJH3eOr/jLb/PzqtmdwDq5g==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.12.0': + resolution: {integrity: sha512-X64tZd8dRE/QTrBIEs63kaOBG0b5GVEd3ccoLtyf6IdXtHdh8h+I56C2yC3PtC9Ucnv0CpNFJLqKFVgCYe0lOQ==} + cpu: [arm64] + os: [darwin] + '@rollup/rollup-darwin-arm64@4.17.2': resolution: {integrity: sha512-kcMLpE6uCwls023+kknm71ug7MZOrtXo+y5p/tsg6jltpDtgQY1Eq5sGfHcQfb+lfuKwhBmEURDga9N0ol4YPw==} cpu: [arm64] os: [darwin] + '@rollup/rollup-darwin-arm64@4.21.3': + resolution: {integrity: sha512-P0UxIOrKNBFTQaXTxOH4RxuEBVCgEA5UTNV6Yz7z9QHnUJ7eLX9reOd/NYMO3+XZO2cco19mXTxDMXxit4R/eQ==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.12.0': + resolution: {integrity: sha512-cc71KUZoVbUJmGP2cOuiZ9HSOP14AzBAThn3OU+9LcA1+IUqswJyR1cAJj3Mg55HbjZP6OLAIscbQsQLrpgTOg==} + cpu: [x64] + os: [darwin] + '@rollup/rollup-darwin-x64@4.17.2': resolution: {integrity: sha512-AtKwD0VEx0zWkL0ZjixEkp5tbNLzX+FCqGG1SvOu993HnSz4qDI6S4kGzubrEJAljpVkhRSlg5bzpV//E6ysTQ==} cpu: [x64] os: [darwin] + '@rollup/rollup-darwin-x64@4.21.3': + resolution: {integrity: sha512-L1M0vKGO5ASKntqtsFEjTq/fD91vAqnzeaF6sfNAy55aD+Hi2pBI5DKwCO+UNDQHWsDViJLqshxOahXyLSh3EA==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-linux-arm-gnueabihf@4.12.0': + resolution: {integrity: sha512-a6w/Y3hyyO6GlpKL2xJ4IOh/7d+APaqLYdMf86xnczU3nurFTaVN9s9jOXQg97BE4nYm/7Ga51rjec5nfRdrvA==} + cpu: [arm] + os: [linux] + '@rollup/rollup-linux-arm-gnueabihf@4.17.2': resolution: {integrity: sha512-3reX2fUHqN7sffBNqmEyMQVj/CKhIHZd4y631duy0hZqI8Qoqf6lTtmAKvJFYa6bhU95B1D0WgzHkmTg33In0A==} cpu: [arm] os: [linux] + '@rollup/rollup-linux-arm-gnueabihf@4.21.3': + resolution: {integrity: sha512-btVgIsCjuYFKUjopPoWiDqmoUXQDiW2A4C3Mtmp5vACm7/GnyuprqIDPNczeyR5W8rTXEbkmrJux7cJmD99D2g==} + cpu: [arm] + os: [linux] + '@rollup/rollup-linux-arm-musleabihf@4.17.2': resolution: {integrity: sha512-uSqpsp91mheRgw96xtyAGP9FW5ChctTFEoXP0r5FAzj/3ZRv3Uxjtc7taRQSaQM/q85KEKjKsZuiZM3GyUivRg==} cpu: [arm] os: [linux] + '@rollup/rollup-linux-arm-musleabihf@4.21.3': + resolution: {integrity: sha512-zmjbSphplZlau6ZTkxd3+NMtE4UKVy7U4aVFMmHcgO5CUbw17ZP6QCgyxhzGaU/wFFdTfiojjbLG3/0p9HhAqA==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.12.0': + resolution: {integrity: sha512-0fZBq27b+D7Ar5CQMofVN8sggOVhEtzFUwOwPppQt0k+VR+7UHMZZY4y+64WJ06XOhBTKXtQB/Sv0NwQMXyNAA==} + cpu: [arm64] + os: [linux] + '@rollup/rollup-linux-arm64-gnu@4.17.2': resolution: {integrity: sha512-EMMPHkiCRtE8Wdk3Qhtciq6BndLtstqZIroHiiGzB3C5LDJmIZcSzVtLRbwuXuUft1Cnv+9fxuDtDxz3k3EW2A==} cpu: [arm64] os: [linux] + '@rollup/rollup-linux-arm64-gnu@4.21.3': + resolution: {integrity: sha512-nSZfcZtAnQPRZmUkUQwZq2OjQciR6tEoJaZVFvLHsj0MF6QhNMg0fQ6mUOsiCUpTqxTx0/O6gX0V/nYc7LrgPw==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.12.0': + resolution: {integrity: sha512-eTvzUS3hhhlgeAv6bfigekzWZjaEX9xP9HhxB0Dvrdbkk5w/b+1Sxct2ZuDxNJKzsRStSq1EaEkVSEe7A7ipgQ==} + cpu: [arm64] + os: [linux] + '@rollup/rollup-linux-arm64-musl@4.17.2': resolution: {integrity: sha512-NMPylUUZ1i0z/xJUIx6VUhISZDRT+uTWpBcjdv0/zkp7b/bQDF+NfnfdzuTiB1G6HTodgoFa93hp0O1xl+/UbA==} cpu: [arm64] os: [linux] + '@rollup/rollup-linux-arm64-musl@4.21.3': + resolution: {integrity: sha512-MnvSPGO8KJXIMGlQDYfvYS3IosFN2rKsvxRpPO2l2cum+Z3exiExLwVU+GExL96pn8IP+GdH8Tz70EpBhO0sIQ==} + cpu: [arm64] + os: [linux] + '@rollup/rollup-linux-powerpc64le-gnu@4.17.2': resolution: {integrity: sha512-T19My13y8uYXPw/L/k0JYaX1fJKFT/PWdXiHr8mTbXWxjVF1t+8Xl31DgBBvEKclw+1b00Chg0hxE2O7bTG7GQ==} cpu: [ppc64] os: [linux] + '@rollup/rollup-linux-powerpc64le-gnu@4.21.3': + resolution: {integrity: sha512-+W+p/9QNDr2vE2AXU0qIy0qQE75E8RTwTwgqS2G5CRQ11vzq0tbnfBd6brWhS9bCRjAjepJe2fvvkvS3dno+iw==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.12.0': + resolution: {integrity: sha512-ix+qAB9qmrCRiaO71VFfY8rkiAZJL8zQRXveS27HS+pKdjwUfEhqo2+YF2oI+H/22Xsiski+qqwIBxVewLK7sw==} + cpu: [riscv64] + os: [linux] + '@rollup/rollup-linux-riscv64-gnu@4.17.2': resolution: {integrity: sha512-BOaNfthf3X3fOWAB+IJ9kxTgPmMqPPH5f5k2DcCsRrBIbWnaJCgX2ll77dV1TdSy9SaXTR5iDXRL8n7AnoP5cg==} cpu: [riscv64] os: [linux] + '@rollup/rollup-linux-riscv64-gnu@4.21.3': + resolution: {integrity: sha512-yXH6K6KfqGXaxHrtr+Uoy+JpNlUlI46BKVyonGiaD74ravdnF9BUNC+vV+SIuB96hUMGShhKV693rF9QDfO6nQ==} + cpu: [riscv64] + os: [linux] + '@rollup/rollup-linux-s390x-gnu@4.17.2': resolution: {integrity: sha512-W0UP/x7bnn3xN2eYMql2T/+wpASLE5SjObXILTMPUBDB/Fg/FxC+gX4nvCfPBCbNhz51C+HcqQp2qQ4u25ok6g==} cpu: [s390x] os: [linux] + '@rollup/rollup-linux-s390x-gnu@4.21.3': + resolution: {integrity: sha512-R8cwY9wcnApN/KDYWTH4gV/ypvy9yZUHlbJvfaiXSB48JO3KpwSpjOGqO4jnGkLDSk1hgjYkTbTt6Q7uvPf8eg==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.12.0': + resolution: {integrity: sha512-TenQhZVOtw/3qKOPa7d+QgkeM6xY0LtwzR8OplmyL5LrgTWIXpTQg2Q2ycBf8jm+SFW2Wt/DTn1gf7nFp3ssVA==} + cpu: [x64] + os: [linux] + '@rollup/rollup-linux-x64-gnu@4.17.2': resolution: {integrity: sha512-Hy7pLwByUOuyaFC6mAr7m+oMC+V7qyifzs/nW2OJfC8H4hbCzOX07Ov0VFk/zP3kBsELWNFi7rJtgbKYsav9QQ==} cpu: [x64] os: [linux] + '@rollup/rollup-linux-x64-gnu@4.21.3': + resolution: {integrity: sha512-kZPbX/NOPh0vhS5sI+dR8L1bU2cSO9FgxwM8r7wHzGydzfSjLRCFAT87GR5U9scj2rhzN3JPYVC7NoBbl4FZ0g==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.12.0': + resolution: {integrity: sha512-LfFdRhNnW0zdMvdCb5FNuWlls2WbbSridJvxOvYWgSBOYZtgBfW9UGNJG//rwMqTX1xQE9BAodvMH9tAusKDUw==} + cpu: [x64] + os: [linux] + '@rollup/rollup-linux-x64-musl@4.17.2': resolution: {integrity: sha512-h1+yTWeYbRdAyJ/jMiVw0l6fOOm/0D1vNLui9iPuqgRGnXA0u21gAqOyB5iHjlM9MMfNOm9RHCQ7zLIzT0x11Q==} cpu: [x64] os: [linux] + '@rollup/rollup-linux-x64-musl@4.21.3': + resolution: {integrity: sha512-S0Yq+xA1VEH66uiMNhijsWAafffydd2X5b77eLHfRmfLsRSpbiAWiRHV6DEpz6aOToPsgid7TI9rGd6zB1rhbg==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-win32-arm64-msvc@4.12.0': + resolution: {integrity: sha512-JPDxovheWNp6d7AHCgsUlkuCKvtu3RB55iNEkaQcf0ttsDU/JZF+iQnYcQJSk/7PtT4mjjVG8N1kpwnI9SLYaw==} + cpu: [arm64] + os: [win32] + '@rollup/rollup-win32-arm64-msvc@4.17.2': resolution: {integrity: sha512-tmdtXMfKAjy5+IQsVtDiCfqbynAQE/TQRpWdVataHmhMb9DCoJxp9vLcCBjEQWMiUYxO1QprH/HbY9ragCEFLA==} cpu: [arm64] os: [win32] + '@rollup/rollup-win32-arm64-msvc@4.21.3': + resolution: {integrity: sha512-9isNzeL34yquCPyerog+IMCNxKR8XYmGd0tHSV+OVx0TmE0aJOo9uw4fZfUuk2qxobP5sug6vNdZR6u7Mw7Q+Q==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.12.0': + resolution: {integrity: sha512-fjtuvMWRGJn1oZacG8IPnzIV6GF2/XG+h71FKn76OYFqySXInJtseAqdprVTDTyqPxQOG9Exak5/E9Z3+EJ8ZA==} + cpu: [ia32] + os: [win32] + '@rollup/rollup-win32-ia32-msvc@4.17.2': resolution: {integrity: sha512-7II/QCSTAHuE5vdZaQEwJq2ZACkBpQDOmQsE6D6XUbnBHW8IAhm4eTufL6msLJorzrHDFv3CF8oCA/hSIRuZeQ==} cpu: [ia32] os: [win32] + '@rollup/rollup-win32-ia32-msvc@4.21.3': + resolution: {integrity: sha512-nMIdKnfZfzn1Vsk+RuOvl43ONTZXoAPUUxgcU0tXooqg4YrAqzfKzVenqqk2g5efWh46/D28cKFrOzDSW28gTA==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.12.0': + resolution: {integrity: sha512-ZYmr5mS2wd4Dew/JjT0Fqi2NPB/ZhZ2VvPp7SmvPZb4Y1CG/LRcS6tcRo2cYU7zLK5A7cdbhWnnWmUjoI4qapg==} + cpu: [x64] + os: [win32] + '@rollup/rollup-win32-x64-msvc@4.17.2': resolution: {integrity: sha512-TGGO7v7qOq4CYmSBVEYpI1Y5xDuCEnbVC5Vth8mOsW0gDSzxNrVERPc790IGHsrT2dQSimgMr9Ub3Y1Jci5/8w==} cpu: [x64] os: [win32] - '@safe-global/safe-apps-provider@0.18.1': + '@rollup/rollup-win32-x64-msvc@4.21.3': + resolution: {integrity: sha512-fOvu7PCQjAj4eWDEuD8Xz5gpzFqXzGlxHZozHP4b9Jxv9APtdxL6STqztDzMLuRXEc4UpXGGhx029Xgm91QBeA==} + cpu: [x64] + os: [win32] + + '@safe-global/safe-apps-provider@0.18.1': resolution: {integrity: sha512-V4a05A3EgJcriqtDoJklDz1BOinWhC6P0hjUSxshA4KOZM7rGPCTto/usXs09zr1vvL28evl/NldSTv97j2bmg==} + '@safe-global/safe-apps-provider@0.18.3': + resolution: {integrity: sha512-f/0cNv3S4v7p8rowAjj0hDCg8Q8P/wBjp5twkNWeBdvd0RDr7BuRBPPk74LCqmjQ82P+1ltLlkmVFSmxTIT7XQ==} + '@safe-global/safe-apps-sdk@8.1.0': resolution: {integrity: sha512-XJbEPuaVc7b9n23MqlF6c+ToYIS3f7P2Sel8f3cSBQ9WORE4xrSuvhMpK9fDSFqJ7by/brc+rmJR/5HViRr0/w==} - '@safe-global/safe-gateway-typescript-sdk@3.21.1': - resolution: {integrity: sha512-7nakIjcRSs6781LkizYpIfXh1DYlkUDqyALciqz/BjFU/S97sVjZdL4cuKsG9NEarytE+f6p0Qbq2Bo1aocVUA==} + '@safe-global/safe-apps-sdk@9.1.0': + resolution: {integrity: sha512-N5p/ulfnnA2Pi2M3YeWjULeWbjo7ei22JwU/IXnhoHzKq3pYCN6ynL9mJBOlvDVv892EgLPCWCOwQk/uBT2v0Q==} + + '@safe-global/safe-gateway-typescript-sdk@3.15.0': + resolution: {integrity: sha512-zAzhPgUwzdp89ZrZwCAOImUyAQMQE0LQKcK4vLO5eMbfAcNOxz5g4eVdBRBRa+kVXxjyW5wii58ZlGaYUVBa7g==} engines: {node: '>=16'} - '@scure/base@1.1.6': - resolution: {integrity: sha512-ok9AWwhcgYuGG3Zfhyqg+zwl+Wn5uE+dwC0NV/2qQkx4dABbb/bx96vWu8NSj+BNjjSjno+JRYRjle1jV08k3g==} + '@scure/base@1.1.5': + resolution: {integrity: sha512-Brj9FiG2W1MRQSTB212YVPRrcbjkv48FoZi/u4l/zds/ieRrqsh7aUf6CLwkAq61oKXr/ZlTzlY66gLIj3TFTQ==} + + '@scure/base@1.1.8': + resolution: {integrity: sha512-6CyAclxj3Nb0XT7GHK6K4zK6k2xJm6E4Ft0Ohjt4WgegiFUHEtFb2CGzmPmGBwoIhrLsqNLYfLr04Y1GePrzZg==} '@scure/bip32@1.1.5': resolution: {integrity: sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw==} @@ -3793,8 +4324,11 @@ packages: '@scure/bip32@1.3.2': resolution: {integrity: sha512-N1ZhksgwD3OBlwTv3R6KFEcPojl/W4ElJOeCZdi+vuI5QmTFwLq3OFf2zd2ROpKvxFdgZ6hUpb0dx9bVNEwYCA==} - '@scure/bip32@1.3.3': - resolution: {integrity: sha512-LJaN3HwRbfQK0X1xFSi0Q9amqOgzQnnDngIt+ZlsBC3Bm7/nE7K0kwshZHyaru79yIVRv/e1mQAjZyuZG6jOFQ==} + '@scure/bip32@1.4.0': + resolution: {integrity: sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg==} + + '@scure/bip32@1.4.0': + resolution: {integrity: sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg==} '@scure/bip39@1.1.1': resolution: {integrity: sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg==} @@ -3802,11 +4336,57 @@ packages: '@scure/bip39@1.2.1': resolution: {integrity: sha512-Z3/Fsz1yr904dduJD0NpiyRHhRYHdcnyh73FZWiV+/qhWi83wNJ3NWolYqCEN+ZWsUz2TWwajJggcRE9r1zUYg==} - '@scure/bip39@1.2.2': - resolution: {integrity: sha512-HYf9TUXG80beW+hGAt3TRM8wU6pQoYur9iNypTROm42dorCGmLnFe3eWjz3gOq6G62H2WRh0FCzAR1PI+29zIA==} + '@scure/bip39@1.3.0': + resolution: {integrity: sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ==} + + '@scure/bip39@1.4.0': + resolution: {integrity: sha512-BEEm6p8IueV/ZTfQLp/0vhw4NPnT9oWf5+28nvmeUICjP99f4vr2d+qc7AVGDDtwRep6ifR43Yed9ERVmiITzw==} + + '@sentry/core@5.30.0': + resolution: {integrity: sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg==} + engines: {node: '>=6'} + + '@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/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/utils@5.30.0': + resolution: {integrity: sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww==} + engines: {node: '>=6'} + + '@shikijs/core@1.17.6': + resolution: {integrity: sha512-9ztslig6/YmCg/XwESAXbKjAjOhaq6HVced9NY6qcbDz1X5g/S90Wco2vMjBNX/6V71ASkzri76JewSGPa7kiQ==} - '@shikijs/core@1.5.1': - resolution: {integrity: sha512-xjV63pRUBvxA1LsxOUhRKLPh0uUjwBLzAKLdEuYSLIylo71sYuwDcttqNP01Ib1TZlLfO840CXHPlgUUsYFjzg==} + '@shikijs/core@1.5.2': + resolution: {integrity: sha512-wSAOgaz48GmhILFElMCeQypSZmj6Ru6DttOOtl3KNkdJ17ApQuGNCfzpk4cClasVrnIu45++2DBwG4LNMQAfaA==} + + '@shikijs/engine-javascript@1.17.6': + resolution: {integrity: sha512-5EEZj8tVcierNxm4V0UMS2PVoflb0UJPalWWV8l9rRg+oOfnr5VivqBJbkyq5grltVPvByIXvVbY8GSM/356jQ==} + + '@shikijs/engine-oniguruma@1.17.6': + resolution: {integrity: sha512-NLfWDMXFYe0nDHFbEoyZdz89aIIey3bTfF3zLYSUNTXks5s4uinZVmuPOFf1HfTeGqIn8uErJSBc3VnpJO7Alw==} + + '@shikijs/types@1.17.6': + resolution: {integrity: sha512-ndTFa2TJi2w51ddKQDn3Jy8f6K4E5Q2x3dA3Hmsd3+YmxDQ10UWHjcw7VbVbKzv3VcUvYPLy+z9neqytSzUMUg==} + + '@shikijs/vscode-textmate@9.2.2': + resolution: {integrity: sha512-TMp15K+GGYrWlZM8+Lnj9EaHEFmOen0WJBrfa17hF7taDOYthuPPV0GWzfd/9iMij0akS/8Yw2ikquH7uVi/fg==} '@sideway/address@4.1.5': resolution: {integrity: sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==} @@ -3820,22 +4400,22 @@ packages: '@sinclair/typebox@0.27.8': resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + '@sindresorhus/is@4.6.0': + resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} + engines: {node: '>=10'} + '@sindresorhus/is@5.6.0': resolution: {integrity: sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==} engines: {node: '>=14.16'} - '@sindresorhus/merge-streams@2.3.0': - resolution: {integrity: sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==} - engines: {node: '>=18'} - '@sinonjs/commons@3.0.1': resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} '@sinonjs/fake-timers@10.3.0': resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} - '@smithy/abort-controller@3.0.0': - resolution: {integrity: sha512-p6GlFGBt9K4MYLu72YuJ523NVR4A8oHlC5M2JO6OmQqN8kAc/uh1JqLE+FizTokrSJGg0CSvC+BrsmGzKtsZKA==} + '@smithy/abort-controller@3.1.1': + resolution: {integrity: sha512-MBJBiidoe+0cTFhyxT8g+9g7CeVccLM0IOKKUMCNQ1CNMJ/eIfoo0RTfVrXOONEI1UCN1W+zkiHSbzUNE9dZtQ==} engines: {node: '>=16.0.0'} '@smithy/chunked-blob-reader-native@3.0.0': @@ -3844,127 +4424,131 @@ packages: '@smithy/chunked-blob-reader@3.0.0': resolution: {integrity: sha512-sbnURCwjF0gSToGlsBiAmd1lRCmSn72nu9axfJu5lIx6RUEgHu6GwTMbqCdhQSi0Pumcm5vFxsi9XWXb2mTaoA==} - '@smithy/config-resolver@3.0.0': - resolution: {integrity: sha512-2GzOfADwYLQugYkKQhIyZyQlM05K+tMKvRnc6eFfZcpJGRfKoMUMYdPlBKmqHwQFXQKBrGV6cxL9oymWgDzvFw==} + '@smithy/config-resolver@3.0.4': + resolution: {integrity: sha512-VwiOk7TwXoE7NlNguV/aPq1hFH72tqkHCw8eWXbr2xHspRyyv9DLpLXhq+Ieje+NwoqXrY0xyQjPXdOE6cGcHA==} engines: {node: '>=16.0.0'} - '@smithy/core@2.0.0': - resolution: {integrity: sha512-y1VuiOpU8nL0KlL0pvYpOddKGK+8xpD4Jvg9NN42Bl6gHWAr46LpAzWi4I78WxcFIMN1vw1+RUVOlcqR/vfs5g==} + '@smithy/core@2.0.1': + resolution: {integrity: sha512-rcMkjvwxH/bER+oZUPR0yTA0ELD6m3A+d92+CFkdF6HJFCBB1bXo7P5pm21L66XwTN01B6bUhSCQ7cymWRD8zg==} engines: {node: '>=16.0.0'} - '@smithy/credential-provider-imds@3.0.0': - resolution: {integrity: sha512-lfmBiFQcA3FsDAPxNfY0L7CawcWtbyWsBOHo34nF095728JLkBX4Y9q/VPPE2r7fqMVK+drmDigqE2/SSQeVRA==} + '@smithy/credential-provider-imds@3.1.3': + resolution: {integrity: sha512-U1Yrv6hx/mRK6k8AncuI6jLUx9rn0VVSd9NPEX6pyYFBfkSkChOc/n4zUb8alHUVg83TbI4OdZVo1X0Zfj3ijA==} engines: {node: '>=16.0.0'} - '@smithy/eventstream-codec@3.0.0': - resolution: {integrity: sha512-PUtyEA0Oik50SaEFCZ0WPVtF9tz/teze2fDptW6WRXl+RrEenH8UbEjudOz8iakiMl3lE3lCVqYf2Y+znL8QFQ==} + '@smithy/eventstream-codec@3.1.2': + resolution: {integrity: sha512-0mBcu49JWt4MXhrhRAlxASNy0IjDRFU+aWNDRal9OtUJvJNiwDuyKMUONSOjLjSCeGwZaE0wOErdqULer8r7yw==} - '@smithy/eventstream-serde-browser@3.0.0': - resolution: {integrity: sha512-NB7AFiPN4NxP/YCAnrvYR18z2/ZsiHiF7VtG30gshO9GbFrIb1rC8ep4NGpJSWrz6P64uhPXeo4M0UsCLnZKqw==} + '@smithy/eventstream-serde-browser@3.0.4': + resolution: {integrity: sha512-Eo4anLZX6ltGJTZ5yJMc80gZPYYwBn44g0h7oFq6et+TYr5dUsTpIcDbz2evsOKIZhZ7zBoFWHtBXQ4QQeb5xA==} engines: {node: '>=16.0.0'} - '@smithy/eventstream-serde-config-resolver@3.0.0': - resolution: {integrity: sha512-RUQG3vQ3LX7peqqHAbmayhgrF5aTilPnazinaSGF1P0+tgM3vvIRWPHmlLIz2qFqB9LqFIxditxc8O2Z6psrRw==} + '@smithy/eventstream-serde-config-resolver@3.0.3': + resolution: {integrity: sha512-NVTYjOuYpGfrN/VbRQgn31x73KDLfCXCsFdad8DiIc3IcdxL+dYA9zEQPyOP7Fy2QL8CPy2WE4WCUD+ZsLNfaQ==} engines: {node: '>=16.0.0'} - '@smithy/eventstream-serde-node@3.0.0': - resolution: {integrity: sha512-baRPdMBDMBExZXIUAoPGm/hntixjt/VFpU6+VmCyiYJYzRHRxoaI1MN+5XE+hIS8AJ2GCHLMFEIOLzq9xx1EgQ==} + '@smithy/eventstream-serde-node@3.0.4': + resolution: {integrity: sha512-mjlG0OzGAYuUpdUpflfb9zyLrBGgmQmrobNT8b42ZTsGv/J03+t24uhhtVEKG/b2jFtPIHF74Bq+VUtbzEKOKg==} engines: {node: '>=16.0.0'} - '@smithy/eventstream-serde-universal@3.0.0': - resolution: {integrity: sha512-HNFfShmotWGeAoW4ujP8meV9BZavcpmerDbPIjkJbxKbN8RsUcpRQ/2OyIxWNxXNH2GWCAxuSB7ynmIGJlQ3Dw==} + '@smithy/eventstream-serde-universal@3.0.4': + resolution: {integrity: sha512-Od9dv8zh3PgOD7Vj4T3HSuox16n0VG8jJIM2gvKASL6aCtcS8CfHZDWe1Ik3ZXW6xBouU+45Q5wgoliWDZiJ0A==} engines: {node: '>=16.0.0'} - '@smithy/fetch-http-handler@3.0.0': - resolution: {integrity: sha512-gP1MlOpIB/onIbh4g9eSG3XdI/G31cAvd9Lo11192eL4mxks3xpkPaa+RIcZaX2Vmb8I8HzxBddPSXviY1iq0w==} + '@smithy/fetch-http-handler@3.0.1': + resolution: {integrity: sha512-uaH74i5BDj+rBwoQaXioKpI0SHBJFtOVwzrCpxZxphOW0ki5jhj7dXvDMYM2IJem8TpdFvS2iC08sjOblfFGFg==} - '@smithy/hash-blob-browser@3.0.0': - resolution: {integrity: sha512-/Wbpdg+bwJvW7lxR/zpWAc1/x/YkcqguuF2bAzkJrvXriZu1vm8r+PUdE4syiVwQg7PPR2dXpi3CLBb9qRDaVQ==} + '@smithy/hash-blob-browser@3.1.2': + resolution: {integrity: sha512-hAbfqN2UbISltakCC2TP0kx4LqXBttEv2MqSPE98gVuDFMf05lU+TpC41QtqGP3Ff5A3GwZMPfKnEy0VmEUpmg==} - '@smithy/hash-node@3.0.0': - resolution: {integrity: sha512-84qXstNemP3XS5jcof0el6+bDfjzuvhJPQTEfro3lgtbCtKgzPm3MgiS6ehXVPjeQ5+JS0HqmTz8f/RYfzHVxw==} + '@smithy/hash-node@3.0.3': + resolution: {integrity: sha512-2ctBXpPMG+B3BtWSGNnKELJ7SH9e4TNefJS0cd2eSkOOROeBnnVBnAy9LtJ8tY4vUEoe55N4CNPxzbWvR39iBw==} engines: {node: '>=16.0.0'} - '@smithy/hash-stream-node@3.0.0': - resolution: {integrity: sha512-J0i7de+EgXDEGITD4fxzmMX8CyCNETTIRXlxjMiNUvvu76Xn3GJ31wQR85ynlPk2wI1lqoknAFJaD1fiNDlbIA==} + '@smithy/hash-stream-node@3.1.2': + resolution: {integrity: sha512-PBgDMeEdDzi6JxKwbfBtwQG9eT9cVwsf0dZzLXoJF4sHKHs5HEo/3lJWpn6jibfJwT34I1EBXpBnZE8AxAft6g==} engines: {node: '>=16.0.0'} - '@smithy/invalid-dependency@3.0.0': - resolution: {integrity: sha512-F6wBBaEFgJzj0s4KUlliIGPmqXemwP6EavgvDqYwCH40O5Xr2iMHvS8todmGVZtuJCorBkXsYLyTu4PuizVq5g==} + '@smithy/invalid-dependency@3.0.3': + resolution: {integrity: sha512-ID1eL/zpDULmHJbflb864k72/SNOZCADRc9i7Exq3RUNJw6raWUSlFEQ+3PX3EYs++bTxZB2dE9mEHTQLv61tw==} + + '@smithy/is-array-buffer@2.2.0': + resolution: {integrity: sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==} + engines: {node: '>=14.0.0'} '@smithy/is-array-buffer@3.0.0': resolution: {integrity: sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==} engines: {node: '>=16.0.0'} - '@smithy/md5-js@3.0.0': - resolution: {integrity: sha512-Tm0vrrVzjlD+6RCQTx7D3Ls58S3FUH1ZCtU1MIh/qQmaOo1H9lMN2as6CikcEwgattnA9SURSdoJJ27xMcEfMA==} + '@smithy/md5-js@3.0.3': + resolution: {integrity: sha512-O/SAkGVwpWmelpj/8yDtsaVe6sINHLB1q8YE/+ZQbDxIw3SRLbTZuRaI10K12sVoENdnHqzPp5i3/H+BcZ3m3Q==} - '@smithy/middleware-content-length@3.0.0': - resolution: {integrity: sha512-3C4s4d/iGobgCtk2tnWW6+zSTOBg1PRAm2vtWZLdriwTroFbbWNSr3lcyzHdrQHnEXYCC5K52EbpfodaIUY8sg==} + '@smithy/middleware-content-length@3.0.3': + resolution: {integrity: sha512-Dbz2bzexReYIQDWMr+gZhpwBetNXzbhnEMhYKA6urqmojO14CsXjnsoPYO8UL/xxcawn8ZsuVU61ElkLSltIUQ==} engines: {node: '>=16.0.0'} - '@smithy/middleware-endpoint@3.0.0': - resolution: {integrity: sha512-aXOAWztw/5qAfp0NcA2OWpv6ZI/E+Dh9mByif7i91D/0iyYNUcKvskmXiowKESFkuZ7PIMd3VOR4fTibZDs2OQ==} + '@smithy/middleware-endpoint@3.0.4': + resolution: {integrity: sha512-whUJMEPwl3ANIbXjBXZVdJNgfV2ZU8ayln7xUM47rXL2txuenI7jQ/VFFwCzy5lCmXScjp6zYtptW5Evud8e9g==} engines: {node: '>=16.0.0'} - '@smithy/middleware-retry@3.0.0': - resolution: {integrity: sha512-kFaBiTa50y0iwhrOjX5UISo1SfiXPrE1EsMtZJAVF7Oci3AUpVzaMzRxzQJFGnxioSyCwSmzqiE9x4X3dW+7VQ==} + '@smithy/middleware-retry@3.0.1': + resolution: {integrity: sha512-hBhSEuL841FhJBK/19WpaGk5YWSzFk/P2UaVjANGKRv3eYNO8Y1lANWgqnuPWjOyCEWMPr58vELFDWpxvRKANw==} engines: {node: '>=16.0.0'} - '@smithy/middleware-serde@3.0.0': - resolution: {integrity: sha512-I1vKG1foI+oPgG9r7IMY1S+xBnmAn1ISqployvqkwHoSb8VPsngHDTOgYGYBonuOKndaWRUGJZrKYYLB+Ane6w==} + '@smithy/middleware-serde@3.0.3': + resolution: {integrity: sha512-puUbyJQBcg9eSErFXjKNiGILJGtiqmuuNKEYNYfUD57fUl4i9+mfmThtQhvFXU0hCVG0iEJhvQUipUf+/SsFdA==} engines: {node: '>=16.0.0'} - '@smithy/middleware-stack@3.0.0': - resolution: {integrity: sha512-+H0jmyfAyHRFXm6wunskuNAqtj7yfmwFB6Fp37enytp2q047/Od9xetEaUbluyImOlGnGpaVGaVfjwawSr+i6Q==} + '@smithy/middleware-stack@3.0.3': + resolution: {integrity: sha512-r4klY9nFudB0r9UdSMaGSyjyQK5adUyPnQN/ZM6M75phTxOdnc/AhpvGD1fQUvgmqjQEBGCwpnPbDm8pH5PapA==} engines: {node: '>=16.0.0'} - '@smithy/node-config-provider@3.0.0': - resolution: {integrity: sha512-buqfaSdDh0zo62EPLf8rGDvcpKwGpO5ho4bXS2cdFhlOta7tBkWJt+O5uiaAeICfIOfPclNOndshDNSanX2X9g==} + '@smithy/node-config-provider@3.1.3': + resolution: {integrity: sha512-rxdpAZczzholz6CYZxtqDu/aKTxATD5DAUDVj7HoEulq+pDSQVWzbg0btZDlxeFfa6bb2b5tUvgdX5+k8jUqcg==} engines: {node: '>=16.0.0'} - '@smithy/node-http-handler@3.0.0': - resolution: {integrity: sha512-3trD4r7NOMygwLbUJo4eodyQuypAWr7uvPnebNJ9a70dQhVn+US8j/lCnvoJS6BXfZeF7PkkkI0DemVJw+n+eQ==} + '@smithy/node-http-handler@3.1.1': + resolution: {integrity: sha512-L71NLyPeP450r2J/mfu1jMc//Z1YnqJt2eSNw7uhiItaONnBLDA68J5jgxq8+MBDsYnFwNAIc7dBG1ImiWBiwg==} engines: {node: '>=16.0.0'} - '@smithy/property-provider@3.0.0': - resolution: {integrity: sha512-LmbPgHBswdXCrkWWuUwBm9w72S2iLWyC/5jet9/Y9cGHtzqxi+GVjfCfahkvNV4KXEwgnH8EMpcrD9RUYe0eLQ==} + '@smithy/property-provider@3.1.3': + resolution: {integrity: sha512-zahyOVR9Q4PEoguJ/NrFP4O7SMAfYO1HLhB18M+q+Z4KFd4V2obiMnlVoUFzFLSPeVt1POyNWneHHrZaTMoc/g==} engines: {node: '>=16.0.0'} - '@smithy/protocol-http@4.0.0': - resolution: {integrity: sha512-qOQZOEI2XLWRWBO9AgIYuHuqjZ2csyr8/IlgFDHDNuIgLAMRx2Bl8ck5U5D6Vh9DPdoaVpuzwWMa0xcdL4O/AQ==} + '@smithy/protocol-http@4.0.3': + resolution: {integrity: sha512-x5jmrCWwQlx+Zv4jAtc33ijJ+vqqYN+c/ZkrnpvEe/uDas7AT7A/4Rc2CdfxgWv4WFGmEqODIrrUToPN6DDkGw==} engines: {node: '>=16.0.0'} - '@smithy/querystring-builder@3.0.0': - resolution: {integrity: sha512-bW8Fi0NzyfkE0TmQphDXr1AmBDbK01cA4C1Z7ggwMAU5RDz5AAv/KmoRwzQAS0kxXNf/D2ALTEgwK0U2c4LtRg==} + '@smithy/querystring-builder@3.0.3': + resolution: {integrity: sha512-vyWckeUeesFKzCDaRwWLUA1Xym9McaA6XpFfAK5qI9DKJ4M33ooQGqvM4J+LalH4u/Dq9nFiC8U6Qn1qi0+9zw==} engines: {node: '>=16.0.0'} - '@smithy/querystring-parser@3.0.0': - resolution: {integrity: sha512-UzHwthk0UEccV4dHzPySnBy34AWw3V9lIqUTxmozQ+wPDAO9csCWMfOLe7V9A2agNYy7xE+Pb0S6K/J23JSzfQ==} + '@smithy/querystring-parser@3.0.3': + resolution: {integrity: sha512-zahM1lQv2YjmznnfQsWbYojFe55l0SLG/988brlLv1i8z3dubloLF+75ATRsqPBboUXsW6I9CPGE5rQgLfY0vQ==} engines: {node: '>=16.0.0'} - '@smithy/service-error-classification@3.0.0': - resolution: {integrity: sha512-3BsBtOUt2Gsnc3X23ew+r2M71WwtpHfEDGhHYHSDg6q1t8FrWh15jT25DLajFV1H+PpxAJ6gqe9yYeRUsmSdFA==} + '@smithy/service-error-classification@3.0.3': + resolution: {integrity: sha512-Jn39sSl8cim/VlkLsUhRFq/dKDnRUFlfRkvhOJaUbLBXUsLRLNf9WaxDv/z9BjuQ3A6k/qE8af1lsqcwm7+DaQ==} engines: {node: '>=16.0.0'} - '@smithy/shared-ini-file-loader@3.0.0': - resolution: {integrity: sha512-REVw6XauXk8xE4zo5aGL7Rz4ywA8qNMUn8RtWeTRQsgAlmlvbJ7CEPBcaXU2NDC3AYBgYAXrGyWD8XrN8UGDog==} + '@smithy/shared-ini-file-loader@3.1.3': + resolution: {integrity: sha512-Z8Y3+08vgoDgl4HENqNnnzSISAaGrF2RoKupoC47u2wiMp+Z8P/8mDh1CL8+8ujfi2U5naNvopSBmP/BUj8b5w==} engines: {node: '>=16.0.0'} - '@smithy/signature-v4@3.0.0': - resolution: {integrity: sha512-kXFOkNX+BQHe2qnLxpMEaCRGap9J6tUGLzc3A9jdn+nD4JdMwCKTJ+zFwQ20GkY+mAXGatyTw3HcoUlR39HwmA==} + '@smithy/signature-v4@3.1.2': + resolution: {integrity: sha512-3BcPylEsYtD0esM4Hoyml/+s7WP2LFhcM3J2AGdcL2vx9O60TtfpDOL72gjb4lU8NeRPeKAwR77YNyyGvMbuEA==} engines: {node: '>=16.0.0'} - '@smithy/smithy-client@3.0.0': - resolution: {integrity: sha512-HTLlEOPOoPxyVCoqzwRGJuRh4hyAAo+eveRcEPi7UpIaq2PCAmdFZM76jabUuzlPPR9ge+OQlKzZre+LT1nXzA==} + '@smithy/smithy-client@3.0.1': + resolution: {integrity: sha512-KAiFY4Y4jdHxR+4zerH/VBhaFKM8pbaVmJZ/CWJRwtM/CmwzTfXfvYwf6GoUwiHepdv+lwiOXCuOl6UBDUEINw==} engines: {node: '>=16.0.0'} - '@smithy/types@3.0.0': - resolution: {integrity: sha512-VvWuQk2RKFuOr98gFhjca7fkBS+xLLURT8bUjk5XQoV0ZLm7WPwWPPY3/AwzTLuUBDeoKDCthfe1AsTUWaSEhw==} + '@smithy/types@3.3.0': + resolution: {integrity: sha512-IxvBBCTFDHbVoK7zIxqA1ZOdc4QfM5HM7rGleCuHi7L1wnKv5Pn69xXJQ9hgxH60ZVygH9/JG0jRgtUncE3QUA==} engines: {node: '>=16.0.0'} - '@smithy/url-parser@3.0.0': - resolution: {integrity: sha512-2XLazFgUu+YOGHtWihB3FSLAfCUajVfNBXGGYjOaVKjLAuAxx3pSBY3hBgLzIgB17haf59gOG3imKqTy8mcrjw==} + '@smithy/url-parser@3.0.3': + resolution: {integrity: sha512-pw3VtZtX2rg+s6HMs6/+u9+hu6oY6U7IohGhVNnjbgKy86wcIsSZwgHrFR+t67Uyxvp4Xz3p3kGXXIpTNisq8A==} '@smithy/util-base64@3.0.0': resolution: {integrity: sha512-Kxvoh5Qtt0CDsfajiZOCpJxgtPHXOKwmM+Zy4waD43UoEMA+qPxxa98aE/7ZhdnBFZFXMOiBR5xbcaMhLtznQQ==} @@ -3977,6 +4561,10 @@ packages: resolution: {integrity: sha512-Tj7pZ4bUloNUP6PzwhN7K386tmSmEET9QtQg0TgdNOnxhZvCssHji+oZTUIuzxECRfG8rdm2PMw2WCFs6eIYkA==} engines: {node: '>=16.0.0'} + '@smithy/util-buffer-from@2.2.0': + resolution: {integrity: sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==} + engines: {node: '>=14.0.0'} + '@smithy/util-buffer-from@3.0.0': resolution: {integrity: sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA==} engines: {node: '>=16.0.0'} @@ -3985,48 +4573,52 @@ packages: resolution: {integrity: sha512-pbjk4s0fwq3Di/ANL+rCvJMKM5bzAQdE5S/6RL5NXgMExFAi6UgQMPOm5yPaIWPpr+EOXKXRonJ3FoxKf4mCJQ==} engines: {node: '>=16.0.0'} - '@smithy/util-defaults-mode-browser@3.0.0': - resolution: {integrity: sha512-/ChTQXFZVK/92dLR9RLW2fOG03ghgUYZnRfrs9d9T3L7UxtsGx9QitF7Ppu64A8xcUHqA30kV7TUayFRBd7YQw==} + '@smithy/util-defaults-mode-browser@3.0.1': + resolution: {integrity: sha512-nW5kEzdJn1Bn5TF+gOPHh2rcPli8JU9vSSXLbfg7uPnfR1TMRQqs9zlYRhIb87NeSxIbpdXOI94tvXSy+fvDYg==} engines: {node: '>= 10.0.0'} - '@smithy/util-defaults-mode-node@3.0.0': - resolution: {integrity: sha512-gfABCXswcMgDUcVO+16e4BgTFnouaXNCowp9mVxV8dgaOCpUT9eEWIC+PK3ZoEm26QwlwT7WgfuN1Y22HKX36g==} + '@smithy/util-defaults-mode-node@3.0.1': + resolution: {integrity: sha512-TFk+Qb+elLc/MOhtSp+50fstyfZ6avQbgH2d96xUBpeScu+Al9elxv+UFAjaTHe0HQe5n+wem8ZLpXvU8lwV6Q==} engines: {node: '>= 10.0.0'} - '@smithy/util-endpoints@2.0.0': - resolution: {integrity: sha512-+exaXzEY3DNt2qtA2OtRNSDlVrE4p32j1JSsQkzA5AdP0YtJNjkYbYhJxkFmPYcjI1abuwopOZCwUmv682QkiQ==} + '@smithy/util-endpoints@2.0.4': + resolution: {integrity: sha512-ZAtNf+vXAsgzgRutDDiklU09ZzZiiV/nATyqde4Um4priTmasDH+eLpp3tspL0hS2dEootyFMhu1Y6Y+tzpWBQ==} engines: {node: '>=16.0.0'} '@smithy/util-hex-encoding@3.0.0': resolution: {integrity: sha512-eFndh1WEK5YMUYvy3lPlVmYY/fZcQE1D8oSf41Id2vCeIkKJXPcYDCZD+4+xViI6b1XSd7tE+s5AmXzz5ilabQ==} engines: {node: '>=16.0.0'} - '@smithy/util-middleware@3.0.0': - resolution: {integrity: sha512-q5ITdOnV2pXHSVDnKWrwgSNTDBAMHLptFE07ua/5Ty5WJ11bvr0vk2a7agu7qRhrCFRQlno5u3CneU5EELK+DQ==} + '@smithy/util-middleware@3.0.3': + resolution: {integrity: sha512-l+StyYYK/eO3DlVPbU+4Bi06Jjal+PFLSMmlWM1BEwyLxZ3aKkf1ROnoIakfaA7mC6uw3ny7JBkau4Yc+5zfWw==} engines: {node: '>=16.0.0'} - '@smithy/util-retry@3.0.0': - resolution: {integrity: sha512-nK99bvJiziGv/UOKJlDvFF45F00WgPLKVIGUfAK+mDhzVN2hb/S33uW2Tlhg5PVBoqY7tDVqL0zmu4OxAHgo9g==} + '@smithy/util-retry@3.0.3': + resolution: {integrity: sha512-AFw+hjpbtVApzpNDhbjNG5NA3kyoMs7vx0gsgmlJF4s+yz1Zlepde7J58zpIRIsdjc+emhpAITxA88qLkPF26w==} engines: {node: '>=16.0.0'} - '@smithy/util-stream@3.0.0': - resolution: {integrity: sha512-AYQeeAxBi3yee9SXC0HgrbeIchQeo6EAkpiwwmmCK6Z7uq8GnMGe8AxRZT3O4wyMNRNK2qfjZSvx6+wKfuMajg==} + '@smithy/util-stream@3.0.1': + resolution: {integrity: sha512-7F7VNNhAsfMRA8I986YdOY5fE0/T1/ZjFF6OLsqkvQVNP3vZ/szYDfGCyphb7ioA09r32K/0qbSFfNFU68aSzA==} engines: {node: '>=16.0.0'} '@smithy/util-uri-escape@3.0.0': resolution: {integrity: sha512-LqR7qYLgZTD7nWLBecUi4aqolw8Mhza9ArpNEQ881MJJIU2sE5iHCK6TdyqqzcDLy0OPe10IY4T8ctVdtynubg==} engines: {node: '>=16.0.0'} + '@smithy/util-utf8@2.3.0': + resolution: {integrity: sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==} + engines: {node: '>=14.0.0'} + '@smithy/util-utf8@3.0.0': resolution: {integrity: sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==} engines: {node: '>=16.0.0'} - '@smithy/util-waiter@3.0.0': - resolution: {integrity: sha512-+fEXJxGDLCoqRKVSmo0auGxaqbiCo+8oph+4auefYjaNxjOLKSY2MxVQfRzo65PaZv4fr+5lWg+au7vSuJJ/zw==} + '@smithy/util-waiter@3.1.2': + resolution: {integrity: sha512-4pP0EV3iTsexDx+8PPGAKCQpd/6hsQBaQhqWzU4hqKPHN5epPsxKbvUTIiYIHTxaKt6/kEaqPBpu/ufvfbrRzw==} engines: {node: '>=16.0.0'} - '@socket.io/component-emitter@3.1.2': - resolution: {integrity: sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==} + '@socket.io/component-emitter@3.1.0': + resolution: {integrity: sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==} '@solidity-parser/parser@0.18.0': resolution: {integrity: sha512-yfORGUIPgLck41qyN7nbwJRAx17/jAIXCTanHOJZhB6PJ1iAk/84b/xlsVKFSyNyLXIj0dhppoE0+CRws7wlzA==} @@ -4085,68 +4677,92 @@ packages: '@stablelib/x25519@1.0.3': resolution: {integrity: sha512-KnTbKmUhPhHavzobclVJQG5kuivH+qDLpe84iRqX3CLrKp881cF160JvXJ+hjn1aMyCwYOKeIZefIH/P5cJoRw==} - '@storybook/addon-actions@8.1.1': - resolution: {integrity: sha512-EEBjOMuQOdCSVrwPQEkJFc42I0TWj/bK+8lboV0jXi61ZI3okDPCJ/04vu5iTvX0HjRoYqqwBjyYj0Crf7ihag==} + '@storybook/addon-actions@8.3.0': + resolution: {integrity: sha512-HvAc3fW979JVw8CSKXZMouvgrJ2BNLNWaUB8jNokQb3Us00P6igVKLwg/pBV8GBgDr5Ng4pHYqi/ZH+xzEYFFw==} + peerDependencies: + storybook: ^8.3.0 - '@storybook/addon-backgrounds@8.1.1': - resolution: {integrity: sha512-UFbKI3Ebsllg3DZIlVtYvp1nuLnBp85sKI98KnnYqiHCKWHDWlK7Li0Y1J2ab0w/Fx0grspC8WUgGId6NHrIrA==} + '@storybook/addon-backgrounds@8.3.0': + resolution: {integrity: sha512-qaV/QsXoviAmBYFszI/KN1CaI/LcACGX9RCBB54fMau3JuouIBU/zTl2jY2+BioCBk6oY8KqcnAS1coOZzlNXQ==} + peerDependencies: + storybook: ^8.3.0 - '@storybook/addon-controls@8.1.1': - resolution: {integrity: sha512-KJXW/hjIWM+VLqqUAvdGIkX7hTDs8FtQOuUFSC/FPDqKveUoWz0hd+WaoT9HhNF8gyzFXYACoeb9XkQVVcDATA==} + '@storybook/addon-controls@8.3.0': + resolution: {integrity: sha512-Id4j6Neimkdq0OyfQ3qkHpKLisbN08M8pXHDI/A0VeF91xEGBdc1bJgS/EU+ifa24tr5SRYwlAlcBDAWJbZMfA==} + peerDependencies: + storybook: ^8.3.0 - '@storybook/addon-docs@8.1.1': - resolution: {integrity: sha512-vMU26AYQBstOj73MX3egqJlY/VUjawfWVcTlDJjSa43GzWfp8wrbr1fNXRy2MoLe19UKZ9Kx+m4CfsrGsXHogg==} + '@storybook/addon-docs@8.3.0': + resolution: {integrity: sha512-LrvWBDX5Vi//82Q78QRbTsG+9rJU9JJFAVPk1NnLp2Yn0F4FueVzIw8AabAkZFy0LHPMGV+EHpkPtYz4Czkhgw==} + peerDependencies: + storybook: ^8.3.0 - '@storybook/addon-essentials@8.1.1': - resolution: {integrity: sha512-1MfjgNuhh0iuSVunrDyZFsDNNs3rkssjqfvqt9FM7/l96cbBku8b39vPUW5kYNtA8wgIYCVXIw6c+9zhhJDoDg==} + '@storybook/addon-essentials@8.3.0': + resolution: {integrity: sha512-y+hlMnIoD+h/diY7BvIeySPCz/ZtJPPZfS/COQuPRXfPWCr37p9XLEz3E+m2spniAbgGv9KpvdqQd0kWcwwfiA==} + peerDependencies: + storybook: ^8.3.0 - '@storybook/addon-highlight@8.1.1': - resolution: {integrity: sha512-i27OsZmxBJWV0Yf7aRbke19Yin9F+v0YyAyD2JDulcjdZdsInUd8/qsQQYd3YmTkQ+0S0SnEdeTAJ4qca9KTtA==} + '@storybook/addon-highlight@8.3.0': + resolution: {integrity: sha512-bS1rqzbwGgeTKVLYEyY+6DzpafLtDLnoSF+KzRIiV7/1H30evhwVSzkgX1L2F6+ssS1n9WrRJeglniv9j+5mGQ==} + peerDependencies: + storybook: ^8.3.0 - '@storybook/addon-interactions@8.1.1': - resolution: {integrity: sha512-cF26lkVWxR7vZv6BW+P4JcJILIKykfn749VfdYyOoYegbJcOt5t2Soto2zdaqg7ZoVBeZherYyjebiXiwOPrng==} + '@storybook/addon-interactions@8.3.0': + resolution: {integrity: sha512-nAVUFpt2kTaPMY7RxfZwiYipngxf76dfx1E/QP9n/333+/pe88UwXbUkmLKpyC8EWqZXDI0oSV5XDDzoI5x3dA==} + peerDependencies: + storybook: ^8.3.0 - '@storybook/addon-links@8.1.1': - resolution: {integrity: sha512-pY6iDCzb10gaAxhzwfkB+iKJzuDYeZBG2gftt1vIoPSXr/VtkU7HLOb9PNige0ioO3szxV0bqTxFdonzMXCOTA==} + '@storybook/addon-links@8.3.0': + resolution: {integrity: sha512-nUnoMPPuxM8yJ7LCrppsUrn3gwqt4E0si9fqIIb5IkB56vz48RxCO9MtO1qjwhWosfMdN6boHaOl1Qc6IxV3Lg==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta + storybook: ^8.3.0 peerDependenciesMeta: react: optional: true - '@storybook/addon-measure@8.1.1': - resolution: {integrity: sha512-aI4cFECK/NmwJTj3Xu6MGrMm4Rf0e+FGB5+BoY+tUi3LTX0spAu/8VgwuoDGB6ntvbZyzPfr6mG2qND9KU+sMQ==} + '@storybook/addon-measure@8.3.0': + resolution: {integrity: sha512-0TZ2ihzX0mRr1rNrFDieDsIKASZ2qUg3eHDkskLKOhxwoUHqsLzXlvS/scKZ+zb8pgjrvsBAsjyPstlrK+z0Zg==} + peerDependencies: + storybook: ^8.3.0 - '@storybook/addon-outline@8.1.1': - resolution: {integrity: sha512-l/LfxtDdwQ+8FduxsRWEEYhxJ7CetdHcCXh+T8bPaP2tzPqv+jh/F8KqZf3LZcC8HITlp/eyd3VYumWC+OKYFw==} + '@storybook/addon-outline@8.3.0': + resolution: {integrity: sha512-xTvBGgX6RIkKjQiAi9LvPGbGuBa6tsJS2jCmjwiei3SX3I56E6Bf3KASsFH2x8j9khMVsgQcfA3QDIhjwatdgw==} + peerDependencies: + storybook: ^8.3.0 - '@storybook/addon-themes@8.1.1': - resolution: {integrity: sha512-aOaPdkxJdYkT0xKxHN+cM7FWpSSgkUjhUNC/n32KYMpNKgZbp0UaP2VJbdHTIhh4Pzu4DSJL9zrVAQdhFHc6Kg==} + '@storybook/addon-themes@8.3.0': + resolution: {integrity: sha512-kAvpsQBrIMe7u8zU5+WoYKPhSo/MzgYXHARjYKhJYpsFatCv/npg/hLOiBlKWV5FzEqjQx9dAZiehXDF3JsCZw==} + peerDependencies: + storybook: ^8.3.0 - '@storybook/addon-toolbars@8.1.1': - resolution: {integrity: sha512-KY6fffSr2mE91CZAp1xtVM2Bcxo/dpA+R8RRt/9kei+6NucaIqpeqa1YTooTD8bUttq1yb/34kMSRgX/W3Qbfg==} + '@storybook/addon-toolbars@8.3.0': + resolution: {integrity: sha512-/3/jnd70tnvh3x1EL8axE4TR9EHwC+bBch1uIc3vH/lmyZBqSBVA50clz23FvjhykjcaKQogcugCuU1w5TJlBA==} + peerDependencies: + storybook: ^8.3.0 - '@storybook/addon-viewport@8.1.1': - resolution: {integrity: sha512-AqUYM7mozrIDa/MNHEd2h7jbfKncofx/OUVI8hrbj7VX46OQ5XbvBqgKpPK15c1ejPfx1hiVz9ZYGxA6HXXrjw==} + '@storybook/addon-viewport@8.3.0': + resolution: {integrity: sha512-6h/0mKipUG6w2o5IOzyhvC/2ifJlSNIA60hLkJ291g42+ilzkydpby9TBN7FcnrVL3Bv+oLgkDLBWVCqma/fyw==} + peerDependencies: + storybook: ^8.3.0 - '@storybook/blocks@8.1.1': - resolution: {integrity: sha512-D+jUlkA2dxYPSY97+yM5sbLXPABKlsZAhmDy6gw05UoSpfBu1MnKd18Qj4fTbyqLYIJGH9z/whGd3tTcuZn8KQ==} + '@storybook/blocks@8.3.0': + resolution: {integrity: sha512-V7D5lv5R+GJya9cCZOCjmOVjhvP5J3KIaclQuuGGJda/ZD/SpwHcFOGSpo6sNR2UKHXXvb61oM8gRQQWDvqPlg==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta + storybook: ^8.3.0 peerDependenciesMeta: react: optional: true react-dom: optional: true - '@storybook/builder-manager@8.1.1': - resolution: {integrity: sha512-WKpeDCtsmsesQYYYcXlCP17U1wdMGv6LnRY9BetKYbUPSHJo4eUBH8NmfW/ZjogczaUDw9sml6Sq5jIT35+Yuw==} - - '@storybook/builder-vite@8.1.1': - resolution: {integrity: sha512-+BSmXuZ9j95oKCvHcKztzjZNzBVeXYMoRO2TuflLnknMUA0v9ySp1PhiQxHM4DgAW6t9db1akzc9HoTA5sjTWg==} + '@storybook/builder-vite@8.3.0': + resolution: {integrity: sha512-9qo3zcZkEpy69E7cx9OHHexBe9+25vH0p+4sWZSjl2sjqjhaxLN5eXnODQbDsOKZNRVrLVTGmKxfFJzAJFnY0w==} peerDependencies: '@preact/preset-vite': '*' + storybook: ^8.3.0 typescript: '>= 4.3.x' vite: ^4.0.0 || ^5.0.0 vite-plugin-glimmerx: '*' @@ -4158,171 +4774,131 @@ packages: vite-plugin-glimmerx: optional: true - '@storybook/channels@8.1.1': - resolution: {integrity: sha512-vG7y97QB++TRkuxYLNKaWJmgr9QBUHyjQgNCWvHIeSYW5zxum9sm6VSR2j1r2G3XUGFSxDwenYBTQuwZJLhWNQ==} - - '@storybook/cli@8.1.1': - resolution: {integrity: sha512-ajLLIQnHjXpzUhYJ51b0eL/3uNuOjkbcx/B8HbgSbArBy7QvB9sX44wPJZYjL3GASYaZAppWixS2r36O/3yu+w==} - hasBin: true - - '@storybook/client-logger@8.1.1': - resolution: {integrity: sha512-9AWPgIN3K0eLusChJUqB5Ft+9P2pW5/s4vOMoj3TCvu8lrdq8AH8ctvxk7x2Kw2wEwQ/g9DyE6C/rDQUARbxew==} - - '@storybook/codemod@8.1.1': - resolution: {integrity: sha512-KfNf0XtMb2Hq1+v+2d660u2VhmmG5IMhPfdSClHh8Mer90CEGKvZpZQLn/Ph1REvzKfCW+MzEgn/JrEcJs8fHg==} - - '@storybook/components@8.1.1': - resolution: {integrity: sha512-0JxYXMb9nlTBAJJXRdn3IjlgXx07gylnTOqa7t3UgOiVDEVPs+1x9LtHU408igcZ5gtcrZepg46O9gz0sdgSfQ==} + '@storybook/components@8.3.0': + resolution: {integrity: sha512-SO/iTkmWp3aYCIy8DEhRMoOn6K7lcKTPNC/YjTvOFFzwq/CLq86WNqz6aX+wV5n6MvWTs7evSwMoz7lp4Lc4sw==} peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - - '@storybook/core-common@8.1.1': - resolution: {integrity: sha512-cjECiKD8+fdlhf3UGrjgrPMBeBwB/gbF5ZVLpa1EYFsr23BHGnZADpmyCb71fl+aUSiGuZ106AS6RQt20w7fXw==} - peerDependencies: - prettier: ^2 || ^3 - peerDependenciesMeta: - prettier: - optional: true - - '@storybook/core-events@8.1.1': - resolution: {integrity: sha512-WpeiBV6RWTZ6t8SI1YdQh8NlbvQtZs9WRr4CPfpzHAly+oxFy6PtPz0h5TMKsU5/kt/L9yL7tE9ZzPYzvFWH/A==} + storybook: ^8.3.0 - '@storybook/core-server@8.1.1': - resolution: {integrity: sha512-/r70ORN9PdrLTLOeZfZkYhR/UBe6dj5DhcQ21zJhKU/0b10nuLJh4SGVD93Hah2wAYEN7YoJzX1bZMo6zRkTRQ==} + '@storybook/core@8.3.0': + resolution: {integrity: sha512-UeErpD0xRIP2nFA2TjPYxtEyv24O6VRfq2XXU5ki2QPYnxOxAPBbrMHCADjgBwNS4S2NUWTaVBYxybISVbrj+w==} - '@storybook/csf-plugin@8.1.1': - resolution: {integrity: sha512-aZ2F3PY601MuW8xWf7/f928/anhZyaXYnysa8ViHooBEnJS1FBJfCsDDSM54FTDRyyOQF6AZtHeY53snd+e9ng==} - - '@storybook/csf-tools@8.1.1': - resolution: {integrity: sha512-BaS1bFx8Rj9Nj7gxsJrifu9lFoli7CD4DxBGEeagVOvCcBX95RI0I9JLhr81LdMl5DwPP1xBGZjCVNsC7eIR4w==} + '@storybook/csf-plugin@8.3.0': + resolution: {integrity: sha512-sCmeN/OVYj95TKkMqJqxbaztIbdv5jCrtrXuNg4oJaGzNucmMNAbmv2jK2tCNE6Uz2X9IMRcseFX/h9TgjyJ9A==} + peerDependencies: + storybook: ^8.3.0 '@storybook/csf@0.0.1': resolution: {integrity: sha512-USTLkZze5gkel8MYCujSRBVIrUQ3YPBrLOx7GNk/0wttvVtlzWXAq9eLbQ4p/NicGxP+3T7KPEMVV//g+yubpw==} - '@storybook/csf@0.1.7': - resolution: {integrity: sha512-53JeLZBibjQxi0Ep+/AJTfxlofJlxy1jXcSKENlnKxHjWEYyHQCumMP5yTFjf7vhNnMjEpV3zx6t23ssFiGRyw==} - - '@storybook/docs-mdx@3.1.0-next.0': - resolution: {integrity: sha512-t4syFIeSyufieNovZbLruPt2DmRKpbwL4fERCZ1MifWDRIORCKLc4NCEHy+IqvIqd71/SJV2k4B51nF7vlJfmQ==} - - '@storybook/docs-tools@8.1.1': - resolution: {integrity: sha512-BPq9e6bl4uRru0GSLHS56eg0SV5LEMJSzrMIzeSrTf9xoZdBeLM05oblo2oebEGZUE97uduhKoaUeUJtsuMIxw==} + '@storybook/csf@0.1.11': + resolution: {integrity: sha512-dHYFQH3mA+EtnCkHXzicbLgsvzYjcDJ1JWsogbItZogkPHgSJM/Wr71uMkcvw8v9mmCyP4NpXJuu6bPoVsOnzg==} '@storybook/global@5.0.0': resolution: {integrity: sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ==} - '@storybook/icons@1.2.9': - resolution: {integrity: sha512-cOmylsz25SYXaJL/gvTk/dl3pyk7yBFRfeXTsHvTA3dfhoU/LWSq0NKL9nM7WBasJyn6XPSGnLS4RtKXLw5EUg==} + '@storybook/icons@1.2.10': + resolution: {integrity: sha512-310apKdDcjbbX2VSLWPwhEwAgjxTzVagrwucVZIdGPErwiAppX8KvBuWZgPo+rQLVrtH8S+pw1dbUwjcE6d7og==} engines: {node: '>=14.0.0'} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - '@storybook/instrumenter@8.1.1': - resolution: {integrity: sha512-8OJCEt0/KXCxT0B8uIQgR3aEmlW8iW5CK1qZxZUEvMDUb7agpKdthLfiN8+M3maq59PmOhq9h43iUTRZxKFVpw==} - - '@storybook/manager-api@8.1.1': - resolution: {integrity: sha512-IDPFxFFArO3l7P8vPjBxDBc6V255FJLx9W+eCOMdJJRZcovxrCkYOB0wRd+fw/IDtGt1zgPBfA6WD/JQAa1hlw==} - - '@storybook/manager@8.1.1': - resolution: {integrity: sha512-b3Oa9QsCbkTpH0LCKkMYDXtFYb1QpDc45EIFIm5Ib2tlilPQkx+a7jNpJG1/SKnYBwAO7iYjxN8iW9MwMLoCig==} - - '@storybook/node-logger@8.1.1': - resolution: {integrity: sha512-l+B8eu3yBZfrHvCR/FVqGyObgA0KSLp+06NkWDMn0p7qu0tCTROquopKdn2gXKitZp8wGwhgJV56OvW5C12XQA==} + '@storybook/instrumenter@8.3.0': + resolution: {integrity: sha512-oJmX8jbNKbPBlNMItRvEoaVAJWX1u6jsqXdIcNRCXo3PDdVnunVYz8vVkG8mbL8Cp/cKlsuQk7YBZA4IM5mRgg==} + peerDependencies: + storybook: ^8.3.0 - '@storybook/preview-api@8.1.1': - resolution: {integrity: sha512-5EcByqtJgj7a7ZWICMLif8mK3cRmdIMbdSPEDf4X6aTQ8LZOg6updLrkb/Eh6qfeYv46TK/MP8BXa89wfOxWGQ==} + '@storybook/manager-api@8.3.0': + resolution: {integrity: sha512-5WBLEFHpe4H+9vZZLjNh7msIkyl9MPt4/C2nI+MXKZyU55xBBgiAy4fcD9aj02PcbhyR4JhLqbqmdeBe5Xafeg==} + peerDependencies: + storybook: ^8.3.0 - '@storybook/preview@8.1.1': - resolution: {integrity: sha512-P8iBi9v/62AhTztbCYjVxH6idNO0h9uO583GHwi3uq2Io7F1gUSgwG/HYZ7PnclOsMnmG0FJvAwrvdRc6sWSNw==} + '@storybook/preview-api@8.3.0': + resolution: {integrity: sha512-pHq/T7oWBfzc9TCIPYyJQUXuiUiFfmdrcYvuZE1kf46i7wXh9Q2/Kd3BUJWSCpBXUMoYfAxg9YysGljMII8LWA==} + peerDependencies: + storybook: ^8.3.0 - '@storybook/react-dom-shim@8.1.1': - resolution: {integrity: sha512-X2WPGOxKZhReokqyBbYxhsCHe0qzyM2V8Vs4tQIua/HpNJ/4jqFoXmJvMnUtzwnNry4Gpuhn3nVPtD4QRZsP1w==} + '@storybook/react-dom-shim@8.3.0': + resolution: {integrity: sha512-87X4cvgwFT1ll5SzXgQq6iGbkVCgxLBpBm58akF/hzpeRkwfJDncGi/A5hElOJrBg63IkznmSJE7tf9RkrboqQ==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta + storybook: ^8.3.0 - '@storybook/router@8.1.1': - resolution: {integrity: sha512-9/9ZONtBZI7VxkFpwVYIq6d42yBLci7wkXOVJO5gugi+iVDM02eYQvrbKTTVnY0fCXXwwwVbpTyoHk25bqbRNg==} - - '@storybook/svelte-vite@8.1.1': - resolution: {integrity: sha512-CYgL28vzX6ssv5lCWaThzj8HfqUIQ9vSYeLxKU5kqPY6AZYOKshB07O9UM5GIKCQ7h9sVJIxCry7qligbsmOFA==} + '@storybook/svelte-vite@8.3.0': + resolution: {integrity: sha512-L8y9vAvjrbO7A4P+xL/CdAKsGe6nZ25wTx+rNin/8FUaKqbyWvItUMObYFPp0GHw2zFcdXkD4frpbufQp6kRLg==} engines: {node: '>=18.0.0'} peerDependencies: '@sveltejs/vite-plugin-svelte': ^2.0.0 || ^3.0.0 + storybook: ^8.3.0 svelte: ^4.0.0 || ^5.0.0-next.65 vite: ^4.0.0 || ^5.0.0 - '@storybook/svelte@8.1.1': - resolution: {integrity: sha512-dsPmt1rd6wMk3fXrQ49BaCWsSvwJ0ItT0tAOUJC4RRDwGDStCew2FLeloyPjsJv5xX+PI+KI/K944y1cjHPvEw==} + '@storybook/svelte@8.3.0': + resolution: {integrity: sha512-SFvyZ6Jf/RyC2iPySjDqvaXlD31SB51I+zNfIXgXq6JoHMe4TzVTE8FnvIODrY50Pq/y2f3btVqL1HQ9nYRnWA==} engines: {node: '>=18.0.0'} peerDependencies: + storybook: ^8.3.0 svelte: ^4.0.0 || ^5.0.0-next.65 - '@storybook/sveltekit@8.1.1': - resolution: {integrity: sha512-sPcktyEtYNavNbSPVdXz36cwn7Hm6+PPJ0a1WrlyPUr8AHRuO2/ZqAKm+PSp1wczxmm+hHaqNN/AMCFeSJHQTA==} + '@storybook/sveltekit@8.3.0': + resolution: {integrity: sha512-KhUel8y2ebzvWA/2xV3r+JSWw/zM2N8k/5k/GElZEOo0jI0vgP6dKaGEgXjqqX4uy+sGwpk+3/UC6JR5e5gdGA==} engines: {node: '>=18.0.0'} peerDependencies: + storybook: ^8.3.0 svelte: ^4.0.0 || ^5.0.0-next.65 vite: ^4.0.0 || ^5.0.0 - '@storybook/telemetry@8.1.1': - resolution: {integrity: sha512-yyrAc5t4UUb2OW6zpHM7/aI3ePiPcgMTyJqqn5X5+S9OHy0yHI7NHi7ZslTg6D5yXV6g3OTfa3Yq3pXkOBV3uw==} - - '@storybook/test@8.1.1': - resolution: {integrity: sha512-JIFgfTINM8TJvfyy/aH1WfIgkGVZIesntDYTcY40ukE6ZPaM98YFrSD5E4D3b0vPFEIU0QJ2xVbOGIAVX/6hBw==} - - '@storybook/theming@8.1.1': - resolution: {integrity: sha512-opjTCpvNDlDyTWnU58YLoFFhNrY88mxWRkHEE0Qt0hhRnS8EkU/+aam/1gTr204peDWZ+Ap3BBHFq28nQ5kfDQ==} + '@storybook/test@8.3.0': + resolution: {integrity: sha512-d8y8ST8YY/pSjTxBcWitKM7YbbupN8D0obVlciZRt6WW3o8WUz6iwMuzuJuiUVwtxiRtdKL9jygC5M+aaCpFYQ==} peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - peerDependenciesMeta: - react: - optional: true - react-dom: - optional: true + storybook: ^8.3.0 - '@storybook/types@8.1.1': - resolution: {integrity: sha512-QSQ63aKr2IXrGjX2/Fg1oiGWk+2Nuf+TplaHRC2NKBMgvyn+M0BHUgMTDHQVrFaH4bpl2PkE0r0tzOKP4JI43A==} + '@storybook/theming@8.3.0': + resolution: {integrity: sha512-lJCarAzswZvUgBt/o1LMJp+07Io5G2VI1+Fw+bgn+92kRD8otCFwuMZIy0u7cEjHiEGqGnpzThlIki6vFjEXeA==} + peerDependencies: + storybook: ^8.3.0 - '@sveltejs/adapter-auto@3.2.0': - resolution: {integrity: sha512-She5nKT47kwHE18v9NMe6pbJcvULr82u0V3yZ0ej3n1laWKGgkgdEABE9/ak5iDPs93LqsBkuIo51kkwCLBjJA==} + '@sveltejs/adapter-auto@3.2.2': + resolution: {integrity: sha512-Mso5xPCA8zgcKrv+QioVlqMZkyUQ5MjDJiEPuG/Z7cV/5tmwV7LmcVWk5tZ+H0NCOV1x12AsoSpt/CwFwuVXMA==} peerDependencies: '@sveltejs/kit': ^2.0.0 - '@sveltejs/kit@2.5.7': - resolution: {integrity: sha512-6uedTzrb7nQrw6HALxnPrPaXdIN2jJJTzTIl96Z3P5NiG+OAfpdPbrWrvkJ3GN4CfWqrmU4dJqwMMRMTD/C7ow==} + '@sveltejs/kit@2.5.27': + resolution: {integrity: sha512-CcbRTzl+65oWljAASL6UlxM4x3NWwd0fjq5fQOfP243vs50myFQ8lil0fr3Im6HeeQqYUCtnv8HjO8REWVPjTw==} engines: {node: '>=18.13'} hasBin: true peerDependencies: - '@sveltejs/vite-plugin-svelte': ^3.0.0 + '@sveltejs/vite-plugin-svelte': ^3.0.0 || ^4.0.0-next.1 svelte: ^4.0.0 || ^5.0.0-next.0 vite: ^5.0.3 - '@sveltejs/package@2.3.1': - resolution: {integrity: sha512-JvR2J4ost1oCn1CSdqenYRwGX/1RX+7LN+VZ71aPnz3JAlIFaEKQd1pBxlb+OSQTfeugJO0W39gB9voAbBO5ow==} + '@sveltejs/package@2.3.5': + resolution: {integrity: sha512-fxWSG+pJHxWwcKltG+JoQ+P1CPO7NHVuZD1Gchi/1mNN6C60yD/voHeeXlqr0HHGkvIrpAjRIHLjsavI77Qsiw==} engines: {node: ^16.14 || >=18} hasBin: true peerDependencies: svelte: ^3.44.0 || ^4.0.0 || ^5.0.0-next.1 - '@sveltejs/vite-plugin-svelte-inspector@2.1.0': - resolution: {integrity: sha512-9QX28IymvBlSCqsCll5t0kQVxipsfhFFL+L2t3nTWfXnddYwxBuAEtTtlaVQpRz9c37BhJjltSeY4AJSC03SSg==} + '@sveltejs/vite-plugin-svelte-inspector@2.0.0': + resolution: {integrity: sha512-gjr9ZFg1BSlIpfZ4PRewigrvYmHWbDrq2uvvPB1AmTWKuM+dI1JXQSUu2pIrYLb/QncyiIGkFDFKTwJ0XqQZZg==} engines: {node: ^18.0.0 || >=20} peerDependencies: '@sveltejs/vite-plugin-svelte': ^3.0.0 svelte: ^4.0.0 || ^5.0.0-next.0 vite: ^5.0.0 - '@sveltejs/vite-plugin-svelte@3.1.0': - resolution: {integrity: sha512-sY6ncCvg+O3njnzbZexcVtUqOBE3iYmQPJ9y+yXSkOwG576QI/xJrBnQSRXFLGwJNBa0T78JEKg5cIR0WOAuUw==} + '@sveltejs/vite-plugin-svelte@3.1.1': + resolution: {integrity: sha512-rimpFEAboBBHIlzISibg94iP09k/KYdHgVhJlcsTfn7KMBhc70jFX/GRWkRdFCc2fdnk+4+Bdfej23cMDnJS6A==} engines: {node: ^18.0.0 || >=20} peerDependencies: svelte: ^4.0.0 || ^5.0.0-next.0 vite: ^5.0.0 + '@szmarczak/http-timer@4.0.6': + resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} + engines: {node: '>=10'} + '@szmarczak/http-timer@5.0.1': resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==} engines: {node: '>=14.16'} @@ -4332,30 +4908,13 @@ packages: peerDependencies: postcss: ^8.2.15 - '@testing-library/dom@9.3.4': - resolution: {integrity: sha512-FlS4ZWlp97iiNWig0Muq8p+3rVDjRiYE+YKGbAqXOu9nwJFFOdL00kFpz42M+4huzYi86vAK1sOOfyOG45muIQ==} - engines: {node: '>=14'} + '@testing-library/dom@10.4.0': + resolution: {integrity: sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==} + engines: {node: '>=18'} - '@testing-library/jest-dom@6.4.5': - resolution: {integrity: sha512-AguB9yvTXmCnySBP1lWjfNNUwpbElsaQ567lt2VdGqAdHtpieLgjmcVyv1q7PMIvLbgpDdkWV5Ydv3FEejyp2A==} + '@testing-library/jest-dom@6.5.0': + resolution: {integrity: sha512-xGGHpBXYSHUUr6XsKBfs85TWlYKpTc37cSBBVrXcib2MkHLboWlkClhWF37JKlDb9KEq3dHs+f2xR7XJEWGBxA==} engines: {node: '>=14', npm: '>=6', yarn: '>=1'} - peerDependencies: - '@jest/globals': '>= 28' - '@types/bun': latest - '@types/jest': '>= 28' - jest: '>= 28' - vitest: '>= 0.32' - peerDependenciesMeta: - '@jest/globals': - optional: true - '@types/bun': - optional: true - '@types/jest': - optional: true - jest: - optional: true - vitest: - optional: true '@testing-library/user-event@14.5.2': resolution: {integrity: sha512-YAh82Wh4TIrxYLmfGcixwD18oIjyC1pFQC2Y01F2lzV2HTMiYrI0nze0FD0ocB//CKS/7jIUgae+adPqxK5yCQ==} @@ -4366,8 +4925,8 @@ packages: '@ts-morph/common@0.20.0': resolution: {integrity: sha512-7uKjByfbPpwuzkstL3L5MQyuXPSKdoNG93Fmi2JoDcTf3pEP731JdRFAduRVkOs8oqxPsXKA+ScrWkdQ8t/I+Q==} - '@tsconfig/node10@1.0.11': - resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} + '@tsconfig/node10@1.0.9': + resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} '@tsconfig/node12@1.0.11': resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} @@ -4393,8 +4952,11 @@ packages: '@types/babel__template@7.4.4': resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} - '@types/babel__traverse@7.20.5': - resolution: {integrity: sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==} + '@types/babel__traverse@7.20.6': + resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==} + + '@types/bn.js@4.11.6': + resolution: {integrity: sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==} '@types/bn.js@5.1.5': resolution: {integrity: sha512-V46N0zwKRF5Q00AZ6hWtN0T8gGmDUaUzLWQvHFo5yThtVwK/VCenFY3wXVbOvNfajEpsTfQM4IN9k/d6gUVX3A==} @@ -4402,39 +4964,27 @@ packages: '@types/body-parser@1.19.5': resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} + '@types/cacheable-request@6.0.3': + resolution: {integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==} + + '@types/chrome@0.0.136': + resolution: {integrity: sha512-XDEiRhLkMd+SB7Iw3ZUIj/fov3wLd4HyTdLltVszkgl1dBfc3Rb7oPMVZ2Mz2TLqnF7Ow+StbR8E7r9lqpb4DA==} + '@types/connect@3.4.38': resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} '@types/cookie@0.6.0': resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==} - '@types/cross-spawn@6.0.6': - resolution: {integrity: sha512-fXRhhUkG4H3TQk5dBhQ7m/JDdSNHKwR2BBia62lhwEIq9xGiQKLxd6LymNhn47SjXhsUEPmxi+PKw2OkW4LLjA==} - '@types/debug@4.1.12': resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} - '@types/detect-port@1.3.5': - resolution: {integrity: sha512-Rf3/lB9WkDfIL9eEKaSYKc+1L/rNVYBjThk22JTqQw0YozXarX8YljFAz+HCoC6h4B4KwCMsBPZHaFezwT4BNA==} - - '@types/diff@5.2.1': - resolution: {integrity: sha512-uxpcuwWJGhe2AR1g8hD9F5OYGCqjqWnBUQFD8gMZsDbv8oPHzxJF6iMO6n8Tk0AdzlxoaaoQhOYlIg/PukVU8g==} - '@types/dns-packet@5.6.5': resolution: {integrity: sha512-qXOC7XLOEe43ehtWJCMnQXvgcIpv6rPmQ1jXT98Ad8A3TB1Ue50jsCbSSSyuazScEuZ/Q026vHbrOTVkmwA+7Q==} - '@types/doctrine@0.0.3': - resolution: {integrity: sha512-w5jZ0ee+HaPOaX25X2/2oGR/7rgAQSYII7X7pp0m9KgBfMP7uKfMfTvcpl5Dj+eDBbpxKGiqE+flqDr6XTd2RA==} - '@types/dom-screen-wake-lock@1.0.3': resolution: {integrity: sha512-3Iten7X3Zgwvk6kh6/NRdwN7WbZ760YgFCsF5AxDifltUQzW1RaW+WRmcVtgwFzLjaNu64H+0MPJ13yRa8g3Dw==} - '@types/ejs@3.1.5': - resolution: {integrity: sha512-nv+GSx77ZtXiJzwKdsASqi+YQ5Z7vwHsTP0JY2SiQgjGckkBRKZnk8nIM+7oUZ1VCtuTz0+By4qVR7fqzp/Dfg==} - - '@types/emscripten@1.39.12': - resolution: {integrity: sha512-AQImDBgudQfMqUBfrjZYilRxoHDzTBp+ejh+g1fY67eSMalwIKtBXofjpyI0JBgNpHGzxeGAR2QDya0wxW9zbA==} - '@types/eslint@8.56.10': resolution: {integrity: sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==} @@ -4444,15 +4994,24 @@ packages: '@types/estree@1.0.5': resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} - '@types/express-serve-static-core@4.19.0': - resolution: {integrity: sha512-bGyep3JqPCRry1wq+O5n7oiBgGWmeIJXPjXXCo8EK0u8duZGSYar7cGqd3ML2JUsLGeB7fmc06KYo9fLGWqPvQ==} + '@types/express-serve-static-core@4.19.5': + resolution: {integrity: sha512-y6W03tvrACO72aijJ5uF02FRq5cgDR9lUxddQ8vyF+GvmjJQqbzDcJngEjURc+ZsG31VI3hODNZJ2URj86pzmg==} '@types/express@4.17.21': resolution: {integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==} + '@types/filesystem@0.0.35': + resolution: {integrity: sha512-1eKvCaIBdrD2mmMgy5dwh564rVvfEhZTWVQQGRNn0Nt4ZEnJ0C8oSUCzvMKRA4lGde5oEVo+q2MrTTbV/GHDCQ==} + + '@types/filewriter@0.0.33': + resolution: {integrity: sha512-xFU8ZXTw4gd358lb2jw25nxY9QAgqn2+bKKjKOYfNCzN4DKCFetK7sPtrlpg66Ywe3vWY9FNxprZawAh9wfJ3g==} + '@types/find-cache-dir@3.2.1': resolution: {integrity: sha512-frsJrz2t/CeGifcu/6uRo4b+SzAwT4NYCVPu1GN8IB9XTzrpPkGuV0tmh9mN+/L0PklAlsC3u5Fxt0ju00LXIw==} + '@types/har-format@1.2.15': + resolution: {integrity: sha512-RpQH4rXLuvTXKR0zqHq3go0RVXYv/YVqv4TnPH95VbwUxZdQlK1EtcMvQvMpDngHbt13Csh9Z4qT9AbkiQH5BA==} + '@types/hast@3.0.4': resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} @@ -4480,8 +5039,14 @@ packages: '@types/json5@0.0.29': resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - '@types/lodash@4.17.4': - resolution: {integrity: sha512-wYCP26ZLxaT3R39kiN2+HcJ4kTd3U1waI/cY7ivWYqFP6pW3ZNpvi6Wd6PHZx7T/t8z0vlkXMg3QYLa7DZ/IJQ==} + '@types/keyv@3.1.4': + resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} + + '@types/lodash@4.17.7': + resolution: {integrity: sha512-8wTvZawATi/lsmNu10/j2hk1KEP0IvjubqPE3cu1Xz7xfXXt5oCq3SNUz4fMIP4XGF9Ky+Ue2tBA3hcS7LSBlA==} + + '@types/lru-cache@5.1.1': + resolution: {integrity: sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw==} '@types/mdast@4.0.4': resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} @@ -4498,47 +5063,50 @@ packages: '@types/ms@0.7.34': resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} - '@types/nlcst@1.0.4': - resolution: {integrity: sha512-ABoYdNQ/kBSsLvZAekMhIPMQ3YUZvavStpKYs7BjLLuKVmIMA0LUgZ7b54zzuWJRbHF80v1cNf4r90Vd6eMQDg==} + '@types/nlcst@2.0.3': + resolution: {integrity: sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA==} - '@types/node-forge@1.3.11': - resolution: {integrity: sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==} + '@types/node@12.20.55': + resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} '@types/node@17.0.45': resolution: {integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==} - '@types/node@18.19.33': - resolution: {integrity: sha512-NR9+KrpSajr2qBVp/Yt5TU/rp+b5Mayi3+OlMlcg2cVCfRmcG5PWZ7S4+MG9PZ5gWBoc9Pd0BKSRViuBCRPu0A==} + '@types/node@18.15.13': + resolution: {integrity: sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q==} - '@types/node@20.12.11': - resolution: {integrity: sha512-vDg9PZ/zi+Nqp6boSOT7plNuthRugEKixDv5sFTIpkE89MmNtEArAShI4mxuX2+UrLEe9pxC1vm2cjm9YlWbJw==} + '@types/node@18.19.31': + resolution: {integrity: sha512-ArgCD39YpyyrtFKIqMDvjz79jto5fcI/SVUs2HwB+f0dAzq68yqOdyaSivLiLugSziTpNXLQrVb7RZFmdZzbhA==} - '@types/normalize-package-data@2.4.4': - resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} + '@types/node@20.12.7': + resolution: {integrity: sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==} '@types/object-hash@3.0.6': resolution: {integrity: sha512-fOBV8C1FIu2ELinoILQ+ApxcUKz4ngq+IWUYrxSGjXzzjUALijilampwkMgEtJ+h2njAW3pi853QpzNVCHB73w==} + '@types/parse-json@4.0.2': + resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} + '@types/pbkdf2@3.1.2': resolution: {integrity: sha512-uRwJqmiXmh9++aSu1VNEn3iIxWOhd8AHXNSdlaLfdAAdSTY9jYVeGWnzejM3dvrkbqE3/hyQkQQ29IFATEGlew==} - '@types/pretty-hrtime@1.0.3': - resolution: {integrity: sha512-nj39q0wAIdhwn7DGUyT9irmsKK1tV0bd5WFEhgpqNTMFZ8cE+jieuTphCW0tfdm47S2zVT5mr09B28b1chmQMA==} - '@types/prop-types@15.7.12': resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==} '@types/pug@2.0.10': resolution: {integrity: sha512-Sk/uYFOBAB7mb74XcpizmH0KOR2Pv3D2Hmrh1Dmy5BmK3MpdSa5kqZcg6EKBdklU0bFXX9gCfzvpnyUehrPIuA==} - '@types/qs@6.9.15': - resolution: {integrity: sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==} + '@types/qs@6.9.16': + resolution: {integrity: sha512-7i+zxXdPD0T4cKDuxCUXJ4wHcsJLwENa6Z3dCu8cfCK743OGy5Nu1RmAGqDPsoTDINVEcdXKRvR/zre+P2Ku1A==} '@types/range-parser@1.2.7': resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} - '@types/react@18.3.2': - resolution: {integrity: sha512-Btgg89dAnqD4vV7R3hlwOxgqobUQKgx3MmrQRi0yYbs/P0ym8XozIAlkqVilPqHQwXs4e9Tf63rrCgl58BcO4w==} + '@types/react@18.3.5': + resolution: {integrity: sha512-WeqMfGJLGuLCqHGYRGHxnKrXcTitc6L/nBUWfWPcTarG3t9PsquqUMuVeXZeca+mglY4Vo5GZjCi0A3Or2lnxA==} + + '@types/responselike@1.0.3': + resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} '@types/sax@1.2.7': resolution: {integrity: sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==} @@ -4546,8 +5114,8 @@ packages: '@types/secp256k1@4.0.6': resolution: {integrity: sha512-hHxJU6PAEUn0TP4S/ZOzuTUvJWuZ6eIKeNKb5RBpODvSl6hp1Wrw4s7ATY50rklRCScUDpHzVA/DQdSjJ3UoYQ==} - '@types/semver@7.5.8': - resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} + '@types/semver@7.5.7': + resolution: {integrity: sha512-/wdoPq1QqkSj9/QOeKkFquEuPzQbHTWAMPH/PaUMB+JuR31lXhlWXRZ52IpfDYVlDOUBvX09uBrPwxGT1hjNBg==} '@types/send@0.17.4': resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} @@ -4567,6 +5135,9 @@ packages: '@types/unist@3.0.2': resolution: {integrity: sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==} + '@types/uuid@10.0.0': + resolution: {integrity: sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==} + '@types/uuid@9.0.8': resolution: {integrity: sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==} @@ -4579,8 +5150,19 @@ packages: '@types/yargs@17.0.32': resolution: {integrity: sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==} - '@typescript-eslint/eslint-plugin@7.8.0': - resolution: {integrity: sha512-gFTT+ezJmkwutUPmB0skOj3GZJtlEGnlssems4AjkVweUPGj7jRwwqg0Hhg7++kPGJqKtTYx+R05Ftww372aIg==} + '@typescript-eslint/eslint-plugin@7.4.0': + resolution: {integrity: sha512-yHMQ/oFaM7HZdVrVm/M2WHaNPgyuJH4WelkSVEWSSsir34kxW2kDJCxlXRhhGWEsMN0WAW/vLpKfKVcm8k+MPw==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + '@typescript-eslint/parser': ^7.0.0 + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/eslint-plugin@7.9.0': + resolution: {integrity: sha512-6e+X0X3sFe/G/54aC3jt0txuMTURqLyekmEHViqyA2VnxhLMpvA6nqmcjIy+Cr9tLDHPssA74BP5Mx9HQIxBEA==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: '@typescript-eslint/parser': ^7.0.0 @@ -4590,8 +5172,18 @@ packages: typescript: optional: true - '@typescript-eslint/parser@7.8.0': - resolution: {integrity: sha512-KgKQly1pv0l4ltcftP59uQZCi4HUYswCLbTqVZEJu7uLX8CTLyswqMLqLN+2QFz4jCptqWVV4SB7vdxcH2+0kQ==} + '@typescript-eslint/parser@7.7.0': + resolution: {integrity: sha512-fNcDm3wSwVM8QYL4HKVBggdIPAy9Q41vcvC/GtDobw3c4ndVT3K6cqudUmjHPw8EAp4ufax0o58/xvWaP2FmTg==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/parser@7.9.0': + resolution: {integrity: sha512-qHMJfkL5qvgQB2aLvhUSXxbK7OLnDkwPzFalg458pxQgfxKDfT1ZDbHQM/I6mDIf/svlMkj21kzKuQ2ixJlatQ==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 @@ -4604,12 +5196,30 @@ packages: resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - '@typescript-eslint/scope-manager@7.8.0': - resolution: {integrity: sha512-viEmZ1LmwsGcnr85gIq+FCYI7nO90DVbE37/ll51hjv9aG+YZMb4WDE2fyWpUR4O/UrhGRpYXK/XajcGTk2B8g==} + '@typescript-eslint/scope-manager@7.4.0': + resolution: {integrity: sha512-68VqENG5HK27ypafqLVs8qO+RkNc7TezCduYrx8YJpXq2QGZ30vmNZGJJJC48+MVn4G2dCV8m5ZTVnzRexTVtw==} + engines: {node: ^18.18.0 || >=20.0.0} + + '@typescript-eslint/scope-manager@7.7.0': + resolution: {integrity: sha512-/8INDn0YLInbe9Wt7dK4cXLDYp0fNHP5xKLHvZl3mOT5X17rK/YShXaiNmorl+/U4VKCVIjJnx4Ri5b0y+HClw==} engines: {node: ^18.18.0 || >=20.0.0} - '@typescript-eslint/type-utils@7.8.0': - resolution: {integrity: sha512-H70R3AefQDQpz9mGv13Uhi121FNMh+WEaRqcXTX09YEDky21km4dV1ZXJIp8QjXc4ZaVkXVdohvWDzbnbHDS+A==} + '@typescript-eslint/scope-manager@7.9.0': + resolution: {integrity: sha512-ZwPK4DeCDxr3GJltRz5iZejPFAAr4Wk3+2WIBaj1L5PYK5RgxExu/Y68FFVclN0y6GGwH8q+KgKRCvaTmFBbgQ==} + engines: {node: ^18.18.0 || >=20.0.0} + + '@typescript-eslint/type-utils@7.4.0': + resolution: {integrity: sha512-247ETeHgr9WTRMqHbbQdzwzhuyaJ8dPTuyuUEMANqzMRB1rj/9qFIuIXK7l0FX9i9FXbHeBQl/4uz6mYuCE7Aw==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/type-utils@7.9.0': + resolution: {integrity: sha512-6Qy8dfut0PFrFRAZsGzuLoM4hre4gjzWJB6sUvdunCYZsYemTkzZNwF1rnGea326PHPT3zn5Lmg32M/xfJfByA==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 @@ -4622,8 +5232,16 @@ packages: resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - '@typescript-eslint/types@7.8.0': - resolution: {integrity: sha512-wf0peJ+ZGlcH+2ZS23aJbOv+ztjeeP8uQ9GgwMJGVLx/Nj9CJt17GWgWWoSmoRVKAX2X+7fzEnAjxdvK2gqCLw==} + '@typescript-eslint/types@7.4.0': + resolution: {integrity: sha512-mjQopsbffzJskos5B4HmbsadSJQWaRK0UxqQ7GuNA9Ga4bEKeiO6b2DnB6cM6bpc8lemaPseh0H9B/wyg+J7rw==} + engines: {node: ^18.18.0 || >=20.0.0} + + '@typescript-eslint/types@7.7.0': + resolution: {integrity: sha512-G01YPZ1Bd2hn+KPpIbrAhEWOn5lQBrjxkzHkWvP6NucMXFtfXoevK82hzQdpfuQYuhkvFDeQYbzXCjR1z9Z03w==} + engines: {node: ^18.18.0 || >=20.0.0} + + '@typescript-eslint/types@7.9.0': + resolution: {integrity: sha512-oZQD9HEWQanl9UfsbGVcZ2cGaR0YT5476xfWE0oE5kQa2sNK2frxOlkeacLOTh9po4AlUT5rtkGyYM5kew0z5w==} engines: {node: ^18.18.0 || >=20.0.0} '@typescript-eslint/typescript-estree@5.62.0': @@ -4635,8 +5253,26 @@ packages: typescript: optional: true - '@typescript-eslint/typescript-estree@7.8.0': - resolution: {integrity: sha512-5pfUCOwK5yjPaJQNy44prjCwtr981dO8Qo9J9PwYXZ0MosgAbfEMB008dJ5sNo3+/BN6ytBPuSvXUg9SAqB0dg==} + '@typescript-eslint/typescript-estree@7.4.0': + resolution: {integrity: sha512-A99j5AYoME/UBQ1ucEbbMEmGkN7SE0BvZFreSnTd1luq7yulcHdyGamZKizU7canpGDWGJ+Q6ZA9SyQobipePg==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/typescript-estree@7.7.0': + resolution: {integrity: sha512-8p71HQPE6CbxIBy2kWHqM1KGrC07pk6RJn40n0DSc6bMOBBREZxSDJ+BmRzc8B5OdaMh1ty3mkuWRg4sCFiDQQ==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/typescript-estree@7.9.0': + resolution: {integrity: sha512-zBCMCkrb2YjpKV3LA0ZJubtKCDxLttxfdGmwZvTqqWevUPN0FZvSI26FalGFFUZU/9YQK/A4xcQF9o/VVaCKAg==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: typescript: '*' @@ -4650,8 +5286,14 @@ packages: peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - '@typescript-eslint/utils@7.8.0': - resolution: {integrity: sha512-L0yFqOCflVqXxiZyXrDr80lnahQfSOfc9ELAAZ75sqicqp2i36kEZZGuUymHNFoYOqxRT05up760b4iGsl02nQ==} + '@typescript-eslint/utils@7.4.0': + resolution: {integrity: sha512-NQt9QLM4Tt8qrlBVY9lkMYzfYtNz8/6qwZg8pI3cMGlPnj6mOpRxxAm7BMJN9K0AiY+1BwJ5lVC650YJqYOuNg==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + + '@typescript-eslint/utils@7.9.0': + resolution: {integrity: sha512-5KVRQCzZajmT4Ep+NEgjXCvjuypVvYHUW7RHlXzNPuak2oWpVoD1jf5xCP0dPAuNIchjC7uQyvbdaSTFaLqSdA==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 @@ -4660,74 +5302,109 @@ packages: resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - '@typescript-eslint/visitor-keys@7.8.0': - resolution: {integrity: sha512-q4/gibTNBQNA0lGyYQCmWRS5D15n8rXh4QjK3KV+MBPlTYHpfBUT3D3PaPR/HeNiI9W6R7FvlkcGhNyAoP+caA==} + '@typescript-eslint/visitor-keys@7.4.0': + resolution: {integrity: sha512-0zkC7YM0iX5Y41homUUeW1CHtZR01K3ybjM1l6QczoMuay0XKtrb93kv95AxUGwdjGr64nNqnOCwmEl616N8CA==} + engines: {node: ^18.18.0 || >=20.0.0} + + '@typescript-eslint/visitor-keys@7.7.0': + resolution: {integrity: sha512-h0WHOj8MhdhY8YWkzIF30R379y0NqyOHExI9N9KCzvmu05EgG4FumeYa3ccfKUSphyWkWQE1ybVrgz/Pbam6YA==} + engines: {node: ^18.18.0 || >=20.0.0} + + '@typescript-eslint/visitor-keys@7.9.0': + resolution: {integrity: sha512-iESPx2TNLDNGQLyjKhUvIKprlP49XNEK+MvIf9nIO7ZZaZdbnfWKHnXAgufpxqfA0YryH8XToi4+CjBgVnFTSQ==} engines: {node: ^18.18.0 || >=20.0.0} '@ungap/structured-clone@1.2.0': resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} - '@vitest/coverage-v8@1.6.0': - resolution: {integrity: sha512-KvapcbMY/8GYIG0rlwwOKCVNRc0OL20rrhFkg/CHNzncV03TE2XWvO5w9uZYoxNiMEBacAJt3unSOiZ7svePew==} + '@vitest/coverage-v8@1.4.0': + resolution: {integrity: sha512-4hDGyH1SvKpgZnIByr9LhGgCEuF9DKM34IBLCC/fVfy24Z3+PZ+Ii9hsVBsHvY1umM1aGPEjceRkzxCfcQ10wg==} peerDependencies: - vitest: 1.6.0 + vitest: 1.4.0 - '@vitest/expect@1.3.1': - resolution: {integrity: sha512-xofQFwIzfdmLLlHa6ag0dPV8YsnKOCP1KdAeVVh34vSjN2dcUiXYCD9htu/9eM7t8Xln4v03U9HLxLpPlsXdZw==} + '@vitest/expect@1.5.0': + resolution: {integrity: sha512-0pzuCI6KYi2SIC3LQezmxujU9RK/vwC1U9R0rLuGlNGcOuDWxqWKu6nUdFsX9tH1WU0SXtAxToOsEjeUn1s3hA==} '@vitest/expect@1.6.0': resolution: {integrity: sha512-ixEvFVQjycy/oNgHjqsL6AZCDduC+tflRluaHIzKIsdbzkLn2U/iBnVeJwB6HsIjQBdfMR8Z0tRxKUsvFJEeWQ==} + '@vitest/expect@2.0.5': + resolution: {integrity: sha512-yHZtwuP7JZivj65Gxoi8upUN2OzHTi3zVfjwdpu2WrvCZPLwsJ2Ey5ILIPccoW23dd/zQBlJ4/dhi7DWNyXCpA==} + + '@vitest/pretty-format@2.0.5': + resolution: {integrity: sha512-h8k+1oWHfwTkyTkb9egzwNMfJAEx4veaPSnMeKbVSjp4euqGSbQlm5+6VHwTr7u4FJslVVsUG5nopCaAYdOmSQ==} + + '@vitest/pretty-format@2.1.1': + resolution: {integrity: sha512-SjxPFOtuINDUW8/UkElJYQSFtnWX7tMksSGW0vfjxMneFqxVr8YJ979QpMbDW7g+BIiq88RAGDjf7en6rvLPPQ==} + + '@vitest/runner@1.5.0': + resolution: {integrity: sha512-7HWwdxXP5yDoe7DTpbif9l6ZmDwCzcSIK38kTSIt6CFEpMjX4EpCgT6wUmS0xTXqMI6E/ONmfgRKmaujpabjZQ==} + '@vitest/runner@1.6.0': resolution: {integrity: sha512-P4xgwPjwesuBiHisAVz/LSSZtDjOTPYZVmNAnpHHSR6ONrf8eCJOFRvUwdHn30F5M1fxhqtl7QZQUk2dprIXAg==} + '@vitest/snapshot@1.5.0': + resolution: {integrity: sha512-qpv3fSEuNrhAO3FpH6YYRdaECnnRjg9VxbhdtPwPRnzSfHVXnNzzrpX4cJxqiwgRMo7uRMWDFBlsBq4Cr+rO3A==} + '@vitest/snapshot@1.6.0': resolution: {integrity: sha512-+Hx43f8Chus+DCmygqqfetcAZrDJwvTj0ymqjQq4CvmpKFSTVteEOBzCusu1x2tt4OJcvBflyHUE0DZSLgEMtQ==} - '@vitest/spy@1.3.1': - resolution: {integrity: sha512-xAcW+S099ylC9VLU7eZfdT9myV67Nor9w9zhf0mGCYJSO+zM2839tOeROTdikOi/8Qeusffvxb/MyBSOja1Uig==} + '@vitest/spy@1.5.0': + resolution: {integrity: sha512-vu6vi6ew5N5MMHJjD5PoakMRKYdmIrNJmyfkhRpQt5d9Ewhw9nZ5Aqynbi3N61bvk9UvZ5UysMT6ayIrZ8GA9w==} '@vitest/spy@1.6.0': resolution: {integrity: sha512-leUTap6B/cqi/bQkXUu6bQV5TZPx7pmMBKBQiI0rJA8c3pB56ZsaTbREnF7CJfmvAS4V2cXIBAh/3rVwrrCYgw==} - '@vitest/utils@1.3.1': - resolution: {integrity: sha512-d3Waie/299qqRyHTm2DjADeTaNdNSVsnwHPWrs20JMpjh6eiVq7ggggweO8rc4arhf6rRkWuHKwvxGvejUXZZQ==} + '@vitest/spy@2.0.5': + resolution: {integrity: sha512-c/jdthAhvJdpfVuaexSrnawxZz6pywlTPe84LUB2m/4t3rl2fTo9NFGBG4oWgaD+FTgDDV8hJ/nibT7IfH3JfA==} + + '@vitest/utils@1.5.0': + resolution: {integrity: sha512-BDU0GNL8MWkRkSRdNFvCUCAVOeHaUlVJ9Tx0TYBZyXaaOTmGtUFObzchCivIBrIwKzvZA7A9sCejVhXM2aY98A==} '@vitest/utils@1.6.0': resolution: {integrity: sha512-21cPiuGMoMZwiOHa2i4LXkMkMkCGzA+MVFV70jRwHo95dL4x/ts5GZhML1QWuy7yfp3WzK3lRvZi3JnXTYqrBw==} - '@volar/kit@2.2.2': - resolution: {integrity: sha512-mIPWV7sjuJPNL+TLnpQwFD6hW+D5tF4Axg+nv0wHjdxrik+ilWT5DnBomMftoekUF4+SxUqxMjU8kd7caOuT5Q==} + '@vitest/utils@2.0.5': + resolution: {integrity: sha512-d8HKbqIcya+GR67mkZbrzhS5kKhtp8dQLcmRZLGTscGVg7yImT82cIrhtn2L8+VujWcy6KZweApgNmPsTAO/UQ==} + + '@vitest/utils@2.1.1': + resolution: {integrity: sha512-Y6Q9TsI+qJ2CC0ZKj6VBb+T8UPz593N113nnUykqwANqhgf3QkZeHFlusgKLTqrnVHbj/XDKZcDHol+dxVT+rQ==} + + '@volar/kit@2.4.5': + resolution: {integrity: sha512-ZzyErW5UiDfiIuJ/lpqc2Kx5PHDGDZ/bPlPJYpRcxlrn8Z8aDhRlsLHkNKcNiH65TmNahk2kbLaiejiqu6BD3A==} peerDependencies: typescript: '*' - '@volar/language-core@2.2.2': - resolution: {integrity: sha512-GuvEL4JdxbnLVhPLICncCGT+tVW4cIz9GxXNeDofNnJ4iNTKhr5suGVsA1GLOne9PbraSjn8PlLt+pvLxuRVeQ==} + '@volar/language-core@2.4.5': + resolution: {integrity: sha512-F4tA0DCO5Q1F5mScHmca0umsi2ufKULAnMOVBfMsZdT4myhVl4WdKRwCaKcfOkIEuyrAVvtq1ESBdZ+rSyLVww==} - '@volar/language-server@2.2.2': - resolution: {integrity: sha512-9KwlCDNeFCoxTIhYOJNtpQA7M0JP0DHvvwXrqN8qNNEMJT1Oe0cic0C2tUCa/poCgkiXDbUxRldwamyuTZ6ZQg==} + '@volar/language-server@2.4.5': + resolution: {integrity: sha512-l5PswE0JzCtstTlwBUpikeSa3lNUBJhTuWtj9KclZTGi2Uex4RcqGOhTiDsUUtvdv/hEuYCxGq1EdJJPlQsD/g==} - '@volar/language-service@2.2.2': - resolution: {integrity: sha512-uxooJqRhtESXaPAGs+YFJGAtZQuRO1KLG4LPPGrHHO1ZTkx0TfQPym6WNnBfVCcBXwnSlyFVv+IbAndR5oKz1w==} + '@volar/language-service@2.4.5': + resolution: {integrity: sha512-xiFlL0aViGg6JhwAXyohPrdlID13uom8WQg6DWYaV8ob8RRy+zoLlBUI8SpQctwlWEO9poyrYK01revijAwkcw==} - '@volar/snapshot-document@2.2.2': - resolution: {integrity: sha512-JKj3aRpfoJZ84EeFN62PFw3jwKo2WTQnaemhWu/S4QNlw7q+IoDI1jNcgxZwblfBl0X5YGlRI1zYbwr8WidBTA==} + '@volar/source-map@2.4.5': + resolution: {integrity: sha512-varwD7RaKE2J/Z+Zu6j3mNNJbNT394qIxXwdvz/4ao/vxOfyClZpSDtLKkwWmecinkOVos5+PWkWraelfMLfpw==} - '@volar/source-map@2.2.2': - resolution: {integrity: sha512-vUwvZuSW6iN4JI9QRinh9EjFasx1TUtnaWMKwgWx08xz1PyYuNkLlWlrZXBZ5GGBhML0u230M/7X+AHY2h9yKg==} - - '@volar/typescript@2.2.2': - resolution: {integrity: sha512-WcwOREz7+uOrpjUrKhOMaOKKmyPdtqF95HWX7SE0d9hhBB1KkfahxhaAex5U9Bn43LfINHlycLoYCNEtfeKm0g==} + '@volar/typescript@2.4.5': + resolution: {integrity: sha512-mcT1mHvLljAEtHviVcBuOyAwwMKz1ibXTi5uYtP/pf4XxoAzpdkQ+Br2IC0NPCvLCbjPZmbf3I0udndkfB1CDg==} '@vscode/emmet-helper@2.9.3': resolution: {integrity: sha512-rB39LHWWPQYYlYfpv9qCoZOVioPCftKXXqrsyqN1mTWZM6dTnONT63Db+03vgrBbHzJN45IrgS/AGxw9iiqfEw==} - '@vscode/l10n@0.0.16': - resolution: {integrity: sha512-JT5CvrIYYCrmB+dCana8sUqJEcGB1ZDXNLMQ2+42bW995WmNoenijWMUdZfwmuQUTQcEVVIa2OecZzTYWUW9Cg==} - '@vscode/l10n@0.0.18': resolution: {integrity: sha512-KYSIHVmslkaCDyw013pphY+d7x1qV8IZupYfeIfzNA+nsaWHbn5uPuQRvdRFsa9zFzGeudPuoGoZ1Op4jrJXIQ==} + '@wagmi/cli@2.1.15': + resolution: {integrity: sha512-mtTxbuCDRRSd/2tPAklM+4vFOq5E/0zS5OfLE3Ax2KcUWciOnjLJ0m6BAQ6HzqY9YfWo8DXa7UqxzUBkvPYltg==} + hasBin: true + peerDependencies: + typescript: '>=5.0.4' + peerDependenciesMeta: + typescript: + optional: true + '@wagmi/cli@2.1.4': resolution: {integrity: sha512-vamvEo/GeBjFxb5oZCvby4YZDOrK/RqD+tcWb5X0pqmJDyWbN2Mkv9DYTtVB+OtfVUzFKciN/8Vhw8luMtOJbw==} hasBin: true @@ -4737,37 +5414,50 @@ packages: typescript: optional: true - '@wagmi/cli@2.1.8': - resolution: {integrity: sha512-607a+1ZjeIThHpENuIUJkeFjyRroai4H5TcW8jBJPfKqkWTFRah1Co7h9eOfIZzLd9FyWK+YOHH1PL+Jea8Alg==} - hasBin: true + '@wagmi/connectors@4.1.18': + resolution: {integrity: sha512-K/iLH/Z8jwvgPAYESU/uCQtQBvcIR1Jrqk+t2uCDSxew/tYtkOo2yOjtaPuOb+xJ5OrMGg+0tVHhGChYXry9Ow==} + peerDependencies: + '@wagmi/core': 2.6.9 + typescript: '>=5.0.4' + viem: 2.x + peerDependenciesMeta: + typescript: + optional: true + + '@wagmi/connectors@4.3.10': + resolution: {integrity: sha512-IZcsocBfDq6pe8sxkDgP2k9YNqv8udl2eSr2hx2JCESA44ixx5zRjoGNMAkKxlzM6uXjXLJKp/g1KYlpmoHkDg==} peerDependencies: + '@wagmi/core': 2.9.8 typescript: '>=5.0.4' + viem: 2.x peerDependenciesMeta: typescript: optional: true - '@wagmi/connectors@4.3.5': - resolution: {integrity: sha512-6olw6H4Zlp9H6WQeKJv0pJHUYbq2ckXc/57qOKhruvksuXde94gY34nUDZUNRKRTiYlXiUVtwJK7OP0/on7bGw==} + '@wagmi/connectors@5.1.10': + resolution: {integrity: sha512-ybgKV09PIhgUgQ4atXTs2KOy4Hevd6f972SXfx6HTgsnFXlzxzN6o0aWjhavZOYjvx5tjuL3+8Mgqo0R7uP5Cg==} peerDependencies: - '@wagmi/core': 2.9.3 + '@wagmi/core': 2.13.5 typescript: '>=5.0.4' viem: 2.x peerDependenciesMeta: typescript: optional: true - '@wagmi/connectors@5.0.6': - resolution: {integrity: sha512-eyn2pw9QBKfvNOVZis72GqZw4neo7Ktut7Jt4NSiR/umncWJKpKrni3exLHAJw2+mDTDWtUTHs9YL56ov2tWLw==} + '@wagmi/core@2.10.2': + resolution: {integrity: sha512-SfQ1F7Azjlx4cKGfmg9+GEUGbukCxraoLYZyCUgTLpKw2OY+4sHsPRwHQENQt/YRWKMyG3/byEYRna2Kv1anpw==} peerDependencies: - '@wagmi/core': 2.10.4 + '@tanstack/query-core': '>=5.0.0' typescript: '>=5.0.4' viem: 2.x peerDependenciesMeta: + '@tanstack/query-core': + optional: true typescript: optional: true - '@wagmi/core@2.10.4': - resolution: {integrity: sha512-X/PW4zckkSQ/y4LwkQ5cwLKv551I6kVorH3VsTQghxYt0Vj9K5/XhCCRQg5Q200u6fiUCJ+2WjpmhZu3XYNU9w==} + '@wagmi/core@2.13.5': + resolution: {integrity: sha512-lvX/hApJTSA/H2kOklokjIYiUpnT8CpBH80GeOiKxU0CGK1wNHTu20GRTCy0GF1t7jkNwPSG3m0SmnXmgYMmHw==} peerDependencies: '@tanstack/query-core': '>=5.0.0' typescript: '>=5.0.4' @@ -4778,8 +5468,8 @@ packages: typescript: optional: true - '@wagmi/core@2.9.3': - resolution: {integrity: sha512-Mbhbmyz0wLbAOkjNoUoSJ0nI43sHz6/NyxTuzQ+g4ZMz9dAlMq5qNNqecfyaeXfOvSKuahlWu/frTIz8+jMgsw==} + '@wagmi/core@2.8.0': + resolution: {integrity: sha512-u0CWfbpdv2T3jE1yZQPwxvLlUVMymMoy73g6UE4XYNilF+EjdYu43EjWNvvB9lJcfSyYk6/VdKNHxJ2G+iBxYw==} peerDependencies: '@tanstack/query-core': '>=5.0.0' typescript: '>=5.0.4' @@ -4790,15 +5480,34 @@ packages: typescript: optional: true + '@walletconnect/core@2.11.2': + resolution: {integrity: sha512-bB4SiXX8hX3/hyBfVPC5gwZCXCl+OPj+/EDVM71iAO3TDsh78KPbrVAbDnnsbHzZVHlsMohtXX3j5XVsheN3+g==} + + '@walletconnect/core@2.12.2': + resolution: {integrity: sha512-7Adv/b3pp9F42BkvReaaM4KS8NEvlkS7AMtwO3uF/o6aRMKtcfTJq9/jgWdKJh4RP8pPRTRFjCw6XQ/RZtT4aQ==} + '@walletconnect/core@2.13.0': resolution: {integrity: sha512-blDuZxQenjeXcVJvHxPznTNl6c/2DO4VNrFnus+qHmO6OtT5lZRowdMtlCaCNb1q0OxzgrmBDcTOCbFcCpio/g==} + '@walletconnect/core@2.16.1': + resolution: {integrity: sha512-UlsnEMT5wwFvmxEjX8s4oju7R3zadxNbZgsFeHEsjh7uknY2zgmUe1Lfc5XU6zyPb1Jx7Nqpdx1KN485ee8ogw==} + engines: {node: '>=18'} + '@walletconnect/environment@1.0.1': resolution: {integrity: sha512-T426LLZtHj8e8rYnKfzsw1aG6+M0BT1ZxayMdv/p8yM0MU+eJDISqNY3/bccxRr4LrF9csq02Rhqt08Ibl0VRg==} + '@walletconnect/ethereum-provider@2.11.2': + resolution: {integrity: sha512-BUDqee0Uy2rCZVkW5Ao3q6Ado/3fePYnFdryVF+YL6bPhj+xQZ5OfKodl+uvs7Rwq++O5wTX2RqOTzpW7+v+Mg==} + + '@walletconnect/ethereum-provider@2.12.2': + resolution: {integrity: sha512-vBl2zCnNm2iPaomJdr5YT16cT7aa8cH2WFs6879XPngU5i7HXS3bU6TamhyhKKl13sdIfifmCkCC+RWn5GdPMw==} + '@walletconnect/ethereum-provider@2.13.0': resolution: {integrity: sha512-dnpW8mmLpWl1AZUYGYZpaAfGw1HFkL0WSlhk5xekx3IJJKn4pLacX2QeIOo0iNkzNQxZfux1AK4Grl1DvtzZEA==} + '@walletconnect/ethereum-provider@2.16.1': + resolution: {integrity: sha512-oD7DNCssUX3plS5gGUZ9JQ63muQB/vxO68X6RzD2wd8gBsYtSPw4BqYFc7KTO6dUizD6gfPirw32yW2pTvy92w==} + '@walletconnect/events@1.0.1': resolution: {integrity: sha512-NPTqaoi0oPBVNuLv7qPaJazmGHs5JGyO8eEAk5VGKmJzDR7AHzD4k6ilox5kxk1iwiOnFopBOOMLs86Oa76HpQ==} @@ -4808,9 +5517,15 @@ packages: '@walletconnect/heartbeat@1.2.2': resolution: {integrity: sha512-uASiRmC5MwhuRuf05vq4AT48Pq8RMi876zV8rr8cV969uTOzWdB/k+Lj5yI2PBtB1bGQisGen7MM1GcZlQTBXw==} + '@walletconnect/jsonrpc-http-connection@1.0.7': + resolution: {integrity: sha512-qlfh8fCfu8LOM9JRR9KE0s0wxP6ZG9/Jom8M0qsoIQeKF3Ni0FyV4V1qy/cc7nfI46SLQLSl4tgWSfLiE1swyQ==} + '@walletconnect/jsonrpc-http-connection@1.0.8': resolution: {integrity: sha512-+B7cRuaxijLeFDJUq5hAzNyef3e3tBDIxyaCNmFtjwnod5AGis3RToNqzFU33vpVcxFhofkpE7Cx+5MYejbMGw==} + '@walletconnect/jsonrpc-provider@1.0.13': + resolution: {integrity: sha512-K73EpThqHnSR26gOyNEL+acEex3P7VWZe6KE12ZwKzAt2H4e5gldZHbjsu2QR9cLeJ8AXuO7kEMOIcRv1QEc7g==} + '@walletconnect/jsonrpc-provider@1.0.14': resolution: {integrity: sha512-rtsNY1XqHvWj0EtITNeuf8PHMvlCLiS3EjQL+WOkxEOA4KPxsohFnBDeyPYiNm4ZvkQdLnece36opYidmtbmow==} @@ -4849,56 +5564,101 @@ packages: '@walletconnect/relay-api@1.0.10': resolution: {integrity: sha512-tqrdd4zU9VBNqUaXXQASaexklv6A54yEyQQEXYOCr+Jz8Ket0dmPBDyg19LVSNUN2cipAghQc45/KVmfFJ0cYw==} + '@walletconnect/relay-api@1.0.11': + resolution: {integrity: sha512-tLPErkze/HmC9aCmdZOhtVmYZq1wKfWTJtygQHoWtgg722Jd4homo54Cs4ak2RUFUZIGO2RsOpIcWipaua5D5Q==} + + '@walletconnect/relay-api@1.0.9': + resolution: {integrity: sha512-Q3+rylJOqRkO1D9Su0DPE3mmznbAalYapJ9qmzDgK28mYF9alcP3UwG/og5V7l7CFOqzCLi7B8BvcBUrpDj0Rg==} + '@walletconnect/relay-auth@1.0.4': resolution: {integrity: sha512-kKJcS6+WxYq5kshpPaxGHdwf5y98ZwbfuS4EE/NkQzqrDFm5Cj+dP8LofzWvjrrLkZq7Afy7WrQMXdLy8Sx7HQ==} '@walletconnect/safe-json@1.0.2': resolution: {integrity: sha512-Ogb7I27kZ3LPC3ibn8ldyUr5544t3/STow9+lzz7Sfo808YD7SBWk7SAsdBFlYgP2zDRy2hS3sKRcuSRM0OTmA==} + '@walletconnect/sign-client@2.11.2': + resolution: {integrity: sha512-MfBcuSz2GmMH+P7MrCP46mVE5qhP0ZyWA0FyIH6/WuxQ6G+MgKsGfaITqakpRPsykWOJq8tXMs3XvUPDU413OQ==} + + '@walletconnect/sign-client@2.12.2': + resolution: {integrity: sha512-cM0ualXj6nVvLqS4BDNRk+ZWR+lubcsz/IHreH+3wYrQ2sV+C0fN6ctrd7MMGZss0C0qacWCx0pm62ZBuoKvqA==} + '@walletconnect/sign-client@2.13.0': resolution: {integrity: sha512-En7KSvNUlQFx20IsYGsFgkNJ2lpvDvRsSFOT5PTdGskwCkUfOpB33SQJ6nCrN19gyoKPNvWg80Cy6MJI0TjNYA==} + '@walletconnect/sign-client@2.16.1': + resolution: {integrity: sha512-s2Tx2n2duxt+sHtuWXrN9yZVaHaYqcEcjwlTD+55/vs5NUPlISf+fFmZLwSeX1kUlrSBrAuxPUcqQuRTKcjLOA==} + '@walletconnect/time@1.0.2': resolution: {integrity: sha512-uzdd9woDcJ1AaBZRhqy5rNC9laqWGErfc4dxA9a87mPdKOgWMD85mcFo9dIYIts/Jwocfwn07EC6EzclKubk/g==} + '@walletconnect/types@2.11.2': + resolution: {integrity: sha512-p632MFB+lJbip2cvtXPBQslpUdiw1sDtQ5y855bOlAGquay+6fZ4h1DcDePeKQDQM3P77ax2a9aNPZxV6y/h1Q==} + '@walletconnect/types@2.12.0': resolution: {integrity: sha512-uhB3waGmujQVJcPgJvGOpB8RalgYSBT+HpmVbfl4Qe0xJyqpRUo4bPjQa0UYkrHaW20xIw94OuP4+FMLYdeemg==} + '@walletconnect/types@2.12.2': + resolution: {integrity: sha512-9CmwTlPbrFTzayTL9q7xM7s3KTJkS6kYFtH2m1/fHFgALs6pIUjf1qAx1TF2E4tv7SEzLAIzU4NqgYUt2vWXTg==} + '@walletconnect/types@2.13.0': resolution: {integrity: sha512-MWaVT0FkZwzYbD3tvk8F+2qpPlz1LUSWHuqbINUtMXnSzJtXN49Y99fR7FuBhNFtDalfuWsEK17GrNA+KnAsPQ==} + '@walletconnect/types@2.16.1': + resolution: {integrity: sha512-9P4RG4VoDEF+yBF/n2TF12gsvT/aTaeZTVDb/AOayafqiPnmrQZMKmNCJJjq1sfdsDcHXFcZWMGsuCeSJCmrXA==} + + '@walletconnect/universal-provider@2.11.2': + resolution: {integrity: sha512-cNtIn5AVoDxKAJ4PmB8m5adnf5mYQMUamEUPKMVvOPscfGtIMQEh9peKsh2AN5xcRVDbgluC01Id545evFyymw==} + + '@walletconnect/universal-provider@2.12.2': + resolution: {integrity: sha512-0k5ZgSkABopQLVhkiwl2gRGG7dAP4SWiI915pIlyN5sRvWV+qX1ALhWAmRcdv0TXWlKHDcDgPJw/q2sCSAHuMQ==} + '@walletconnect/universal-provider@2.13.0': resolution: {integrity: sha512-B5QvO8pnk5Bqn4aIt0OukGEQn2Auk9VbHfhQb9cGwgmSCd1GlprX/Qblu4gyT5+TjHMb1Gz5UssUaZWTWbDhBg==} + '@walletconnect/universal-provider@2.16.1': + resolution: {integrity: sha512-q/tyWUVNenizuClEiaekx9FZj/STU1F3wpDK4PUIh3xh+OmUI5fw2dY3MaNDjyb5AyrS0M8BuQDeuoSuOR/Q7w==} + + '@walletconnect/utils@2.11.2': + resolution: {integrity: sha512-LyfdmrnZY6dWqlF4eDrx5jpUwsB2bEPjoqR5Z6rXPiHJKUOdJt7az+mNOn5KTSOlRpd1DmozrBrWr+G9fFLYVw==} + '@walletconnect/utils@2.12.0': resolution: {integrity: sha512-GIpfHUe1Bjp1Tjda0SkJEizKOT2biuv7VPFnKsOLT1T+8QxEP9NruC+K2UUEvijS1Qr/LKH9P5004RYNgrch+w==} + '@walletconnect/utils@2.12.2': + resolution: {integrity: sha512-zf50HeS3SfoLv1N9GPl2IXTZ9TsXfet4usVAsZmX9P6/Xzq7d/7QakjVQCHH/Wk1O9XkcsfeoZoUhRxoMJ5uJw==} + '@walletconnect/utils@2.13.0': resolution: {integrity: sha512-q1eDCsRHj5iLe7fF8RroGoPZpdo2CYMZzQSrw1iqL+2+GOeqapxxuJ1vaJkmDUkwgklfB22ufqG6KQnz78sD4w==} + '@walletconnect/utils@2.16.1': + resolution: {integrity: sha512-aoQirVoDoiiEtYeYDtNtQxFzwO/oCrz9zqeEEXYJaAwXlGVTS34KFe7W3/Rxd/pldTYKFOZsku2EzpISfH8Wsw==} + '@walletconnect/window-getters@1.0.1': resolution: {integrity: sha512-vHp+HqzGxORPAN8gY03qnbTMnhqIwjeRJNOMOAzePRg4xVEEE2WvYsI9G2NMjOknA8hnuYbU3/hwLcKbjhc8+Q==} '@walletconnect/window-metadata@1.0.1': resolution: {integrity: sha512-9koTqyGrM2cqFRW517BPY/iEtUDx2r1+Pwwu5m7sJ7ka79wi3EyqhqcICk/yDmv6jAS1rjKgTKXlEhanYjijcA==} - '@web3modal/common@4.1.11': - resolution: {integrity: sha512-zcoaixcI3dLC/D0QlhpT8MNCd717O1/3r1AemC5/9Wbk2F+YKXkzJZHmWlXoTvlTw9DH07rJzs9YTPxFyn855w==} + '@web3modal/common@4.2.3': + resolution: {integrity: sha512-n0lvhoRjViqxmkgpy+iEM6E3HBylUgdxUDJU4hUxGmmrbGZGEP7USBRnQOEgXLqLCtWvxKjUAO33JBV/De+Osw==} - '@web3modal/common@4.2.2': - resolution: {integrity: sha512-FDTSfI8geY2x0or7h9fjNCKJ+9sxzXx1wjTa6iMqLNQB2Kkot8pz+IfHE9tdyHY5946WQ4YtowecmoKTjECzFw==} + '@web3modal/common@4.2.3': + resolution: {integrity: sha512-n0lvhoRjViqxmkgpy+iEM6E3HBylUgdxUDJU4hUxGmmrbGZGEP7USBRnQOEgXLqLCtWvxKjUAO33JBV/De+Osw==} - '@web3modal/core@4.1.11': - resolution: {integrity: sha512-e475IIWywEtgH1CCB2Pl1C/wgPu0NzAvtTMOPSGNoHsw1ID2n6j/o4CURQb2HJjOoYQjTKKVkzXa44vFh2p9xw==} + '@web3modal/common@5.1.8': + resolution: {integrity: sha512-W3tvTQ5FPauFjDSRIx3H6SurzzDHPeN3q7cMaxuOZb3Scf76vMkz9Af970Q44Jmlz1PGDKZzhEsmOzw6LJF+CA==} - '@web3modal/core@4.2.2': - resolution: {integrity: sha512-O78tam38fQxELAnUL+eUAabkG1RZGBM680cqsG7OpRz2pUwtL4+2DTvsbNj071/wXm9VX7PNY2CyGErPSBvstQ==} + '@web3modal/polyfills@4.2.3': + resolution: {integrity: sha512-RiGxh2hMLSD1s2aTjoejNK/UL377CJhGf5tzmdF1m5xsYHpil+Dnulpio8Yojnm27cOqQD+QiaYUKnHOxErLjQ==} + + '@web3modal/core@4.2.3': + resolution: {integrity: sha512-UykKZTELBpb6ey+IV6fkHWsLkjrIdILmRYzhlznyTPbm9qX5pOR9tH0Z3QGUo7YPFmUqMRH1tC9Irsr3SgIbbw==} '@web3modal/polyfills@4.1.11': resolution: {integrity: sha512-+aMmjGrLCKLo4gVAdWgFdOX2ZjExciSLw/YlZ01wLO8Yj3bZbCZ7sjBc9xndHOVMK0QyUzBtpCOpYMJzi+59jg==} - '@web3modal/polyfills@4.2.2': - resolution: {integrity: sha512-fNqK/ybaiQwkcg38LMnBgpz+ZHIK/8xGxZ+f7ny21jFX4ttByT8T8xLwfubUoZRfNDPo320+cji7DcMQyvaCEw==} + '@web3modal/polyfills@4.2.3': + resolution: {integrity: sha512-RiGxh2hMLSD1s2aTjoejNK/UL377CJhGf5tzmdF1m5xsYHpil+Dnulpio8Yojnm27cOqQD+QiaYUKnHOxErLjQ==} '@web3modal/scaffold-react@4.1.11': resolution: {integrity: sha512-vouJHj77ZNKvR/Uyb3Hfc2UFSA4ZrrHmA0vbioCbgIh+V1rYT5XcAZDEu4AAo1qJ5NBRU1pkClVwAmQuWGY43w==} @@ -4911,8 +5671,8 @@ packages: react-dom: optional: true - '@web3modal/scaffold-react@4.2.2': - resolution: {integrity: sha512-OEJvKWz7+W8VThB7an4D/Pta31thkvBQi/1kYG541sEA3xdjiR8dB0fpFgf+ImT1bcPs6XCTM3yPKqXsrN5PaA==} + '@web3modal/scaffold-react@4.2.3': + resolution: {integrity: sha512-WRA244mO3qa9wnJtRa+mfXHkfW92VEkEt+HagLQuUcSRTQJH0Q95UF+EXZZ/r1mKbqdqIbpguewuF0dRtL/YrQ==} peerDependencies: react: '>=17' react-dom: '>=17' @@ -4925,8 +5685,8 @@ packages: '@web3modal/scaffold-utils@4.1.11': resolution: {integrity: sha512-nsS9yK5tp1N/VfecLLPc8H/dGJCzn0jElWjRS92VfGPhOSiEh5PIrPyCl9o6wUZsp4fH1YUsoSY2EFpPsuCWgw==} - '@web3modal/scaffold-utils@4.2.2': - resolution: {integrity: sha512-gK8tzFv0KW0VEz9DB7QnMQGt5BsW3n8EzNX3YrWOk3x8jSmq087VyGFaoQCKxXNyrHWzbehvjpppLxqtsMUk3A==} + '@web3modal/scaffold-utils@4.2.3': + resolution: {integrity: sha512-z6t0ggYg1/8hpaKHUm77z2VyacjIZEZTI8IHSQYmHuRFGu5oDPJeAr1thr475JXdoGLYr08hwquZyed/ZINAvw==} '@web3modal/scaffold-vue@4.1.11': resolution: {integrity: sha512-PmIfD2TlKkZZa6V0sqwDtZ7t62BEk5JjCHd380QaZwGTbPEwS99leTWLKBTaxAPShK2p7+aj2Txss63wIXLRFg==} @@ -4936,31 +5696,31 @@ packages: vue: optional: true - '@web3modal/scaffold-vue@4.2.2': - resolution: {integrity: sha512-oaxOyaG5enjodIp/FNyodIPiFa3yiB4ptQrRfNX5opv6z2HUKDiu4jM3BRLwys2ncgLSflhDGfx3QQZZqNR8Hg==} + '@web3modal/scaffold-vue@4.2.3': + resolution: {integrity: sha512-0mlx/t0A7srcuFcxP3xuUt2ACFUUcAhyRIsNImtQHPq7QHx7i5zvabQ38iplDsWS0TA7j83hW5gxHycppa5PXg==} peerDependencies: vue: '>=3' peerDependenciesMeta: vue: optional: true - '@web3modal/scaffold@4.1.11': - resolution: {integrity: sha512-n8bP3cJNQxV8OD3s8bSj8QDbZvjn8a1Ui81jo2a3rIxOUAlD/cKRM8ivmNxiUdBMae8GP5CLiWtkIptmSLw40Q==} + '@web3modal/siwe@4.2.3': + resolution: {integrity: sha512-uPma0U/OxAy3LwnF7pCYYX8tn+ONBYNcssuVZxEGsusJD1kF4ueS8lK7eyQogyK5nXqOGdNESOjY1NImNNjMVw==} - '@web3modal/scaffold@4.2.2': - resolution: {integrity: sha512-lpomW3Ypk+eaDNdwmUD0MFDNGiS4WEO8euN9q/pvuJkhnm5jzpr3sYiub4pU+WgZmZIJLRWUuiSeKdUDJSrlRg==} + '@web3modal/scaffold@4.2.3': + resolution: {integrity: sha512-8K+IV+luDUvppKgmlgdA+RbQGT2STdRrgHVHFRsAqsORFoLiIYvlrpQlxvV7J5Xc1bgKEn3KvEXC+BH2NMqF4w==} '@web3modal/siwe@4.1.11': resolution: {integrity: sha512-gndcNA351mkAR0wUsO4dLS9CbpcFo+AQ2CUXF0Jx83DwaBStCVsX3yllfnYKh/gpVetF3B48mRUt9TTTJJ79dA==} - '@web3modal/siwe@4.2.2': - resolution: {integrity: sha512-9Pei6E5nG9/FeNuPh8Sj0zic9hc8K1PeMlK3wTTOOskOtlW4zCbdJ3GnsaDIwqrJDI8z5aG96JoRbC1rwInGtQ==} + '@web3modal/siwe@4.2.3': + resolution: {integrity: sha512-uPma0U/OxAy3LwnF7pCYYX8tn+ONBYNcssuVZxEGsusJD1kF4ueS8lK7eyQogyK5nXqOGdNESOjY1NImNNjMVw==} '@web3modal/ui@4.1.11': resolution: {integrity: sha512-lentHZvUpNjVasvNI8/jrVPIAV1M5zJKZ4Q4AeYwUJdEtlRon1uq10MRylmvlZAjWb98U130uJy245Fz87Th/w==} - '@web3modal/ui@4.2.2': - resolution: {integrity: sha512-SlEGUSI5jq9cbo5w49KflQnAt0bDl5pWOg6Ax+d+6EOOjLrWl5giUAk+PX9qwV6YVVviBzUlzgofuTt2Z1ZXhw==} + '@web3modal/ui@4.2.3': + resolution: {integrity: sha512-QPPgE0hii1gpAldTdnrP63D/ryI78Ohz99zRBp8vi81lawot7rbdUbryMoX13hMPCW9vW7JYyvX+jJN7uO3QwA==} '@web3modal/wagmi@4.1.11': resolution: {integrity: sha512-VoXV9idD0yV7jx0F2Xk722VXqQNCDKqDc+LR8WsuOU64TiTLJx9UDQpNcoigbC3bYCi/4Cpw41iSGgs7utbgyQ==} @@ -4979,8 +5739,8 @@ packages: vue: optional: true - '@web3modal/wagmi@4.2.2': - resolution: {integrity: sha512-jjlLu+LAMap3vsgE37Ma7wydQgbjtHJSO+dR+yrXO8PzBFoXoZuppl5elj74NQtdiyCtzeiNe+81zCy+S+wLYQ==} + '@web3modal/wagmi@4.2.3': + resolution: {integrity: sha512-oisBCMrOYn8TBgNaSPrumvMmTGox6+3Ii92zxQJalW5U/K9iBTxoejHT033Ss7mFEFybilcfXBAvGNFXfQmtkA==} peerDependencies: '@wagmi/connectors': '>=4' '@wagmi/core': '>=2.0.0' @@ -4999,55 +5759,41 @@ packages: '@web3modal/wallet@4.1.11': resolution: {integrity: sha512-6eJSpNcrBxufJFEQu9+ZOMUZxPqa8438RvfYKCU9nLXwoBtweo6ecpQw2yhXDlrfG+uJZhFabtPxROabn2M8Kg==} - '@web3modal/wallet@4.2.2': - resolution: {integrity: sha512-ZkEWeXzbGWUGLFP+uPtdkG4OdiGgdVL9lLCWWVZlq7NZpZdTSc8+kmgdH71qvfNbt+yr7do1KVsQQcQfF6jXhw==} + '@web3modal/wallet@4.2.3': + resolution: {integrity: sha512-V+VpwmhQl9qeJMpzNkjpAaxercAsrr1O9oGRjrjD+c0q72NfdcbTalWSbjSQmqabI1M6N06Hw94FkAQuEfVGsg==} '@webgpu/types@0.1.21': resolution: {integrity: sha512-pUrWq3V5PiSGFLeLxoGqReTZmiiXwY3jRkIG5sLLKjyqNxrwm/04b4nw7LSmGWJcKk59XOM/YRTUwOzo4MMlow==} - '@yarnpkg/esbuild-plugin-pnp@3.0.0-rc.15': - resolution: {integrity: sha512-kYzDJO5CA9sy+on/s2aIW0411AklfCi8Ck/4QDivOqsMKpStZA2SsR+X27VTggGwpStWaLrjJcDcdDMowtG8MA==} - engines: {node: '>=14.15.0'} - peerDependencies: - esbuild: '>=0.10.0' - - '@yarnpkg/fslib@2.10.3': - resolution: {integrity: sha512-41H+Ga78xT9sHvWLlFOZLIhtU6mTGZ20pZ29EiZa97vnxdohJD2AF42rCoAoWfqUz486xY6fhjMH+DYEM9r14A==} - engines: {node: '>=12 <14 || 14.2 - 14.9 || >14.10.0'} - - '@yarnpkg/libzip@2.3.0': - resolution: {integrity: sha512-6xm38yGVIa6mKm/DUCF2zFFJhERh/QWp1ufm4cNUvxsONBmfPg8uZ9pZBdOmF6qFGr/HlT6ABBkCSx/dlEtvWg==} - engines: {node: '>=12 <14 || 14.2 - 14.9 || >14.10.0'} - '@zerodevx/svelte-toast@0.9.5': resolution: {integrity: sha512-JLeB/oRdJfT+dz9A5bgd3Z7TuQnBQbeUtXrGIrNWMGqWbabpepBF2KxtWVhL2qtxpRqhae2f6NAOzH7xs4jUSw==} peerDependencies: svelte: ^3.57.0 || ^4.0.0 - abitype@0.9.10: - resolution: {integrity: sha512-FIS7U4n7qwAT58KibwYig5iFG4K61rbhAqaQh/UWj8v1Y8mjX3F8TC9gd8cz9yT1TYel9f8nS5NO5kZp2RW0jQ==} + abitype@0.9.8: + resolution: {integrity: sha512-puLifILdm+8sjyss4S+fsUN09obiT1g2YW6CtcQF+QDzxR0euzgEB29MZujC6zMk2a6SVmtttq1fc6+YFA7WYQ==} peerDependencies: typescript: '>=5.0.4' - zod: ^3 >=3.22.0 + zod: ^3 >=3.19.1 peerDependenciesMeta: typescript: optional: true zod: optional: true - abitype@0.9.8: - resolution: {integrity: sha512-puLifILdm+8sjyss4S+fsUN09obiT1g2YW6CtcQF+QDzxR0euzgEB29MZujC6zMk2a6SVmtttq1fc6+YFA7WYQ==} + abitype@1.0.5: + resolution: {integrity: sha512-YzDhti7cjlfaBhHutMaboYB21Ha3rXR9QTkNJFzYC4kC8YclaiwPBBBJY8ejFdu2wnJeZCVZSMlQJ7fi8S6hsw==} peerDependencies: typescript: '>=5.0.4' - zod: ^3 >=3.19.1 + zod: ^3 >=3.22.0 peerDependenciesMeta: typescript: optional: true zod: optional: true - abitype@1.0.0: - resolution: {integrity: sha512-NMeMah//6bJ56H5XRj8QCV4AwuW6hB6zqz2LnhhLdcWVQOsXki6/Pn3APeqxCma62nXIcmZWdu1DlHWS74umVQ==} + abitype@1.0.5: + resolution: {integrity: sha512-YzDhti7cjlfaBhHutMaboYB21Ha3rXR9QTkNJFzYC4kC8YclaiwPBBBJY8ejFdu2wnJeZCVZSMlQJ7fi8S6hsw==} peerDependencies: typescript: '>=5.0.4' zod: ^3 >=3.22.0 @@ -5057,8 +5803,8 @@ packages: zod: optional: true - abitype@1.0.2: - resolution: {integrity: sha512-aFt4k2H+eiAKy/zxtnORa9iIb10BMBeWL18l8v4+QuwYEBXPxxjSB1bFZCzQmKPoj8m7j68K705l3uY+E2gAjg==} + abitype@1.0.6: + resolution: {integrity: sha512-MMSqYh4+C/aVqI2RQaWqbvI4Kxo5cQV40WQ4QFtDnNzCkqChm8MuENhElmynZlO0qUy/ObkEUaXtKqYnx1Kp3A==} peerDependencies: typescript: '>=5.0.4' zod: ^3 >=3.22.0 @@ -5072,6 +5818,9 @@ packages: resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} engines: {node: '>=6.5'} + abortcontroller-polyfill@1.7.5: + resolution: {integrity: sha512-JMJ5soJWP18htbbxJjG7bG6yuI6pRhgJ0scHHTfkUjf6wjP912xZWvM+A4sJK3gqd9E8fcPbDnOefbA9Th/FIQ==} + accepts@1.3.8: resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} engines: {node: '>= 0.6'} @@ -5081,29 +5830,37 @@ packages: peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - acorn-walk@8.3.2: - resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==} + acorn-walk@8.3.3: + resolution: {integrity: sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==} engines: {node: '>=0.4.0'} - acorn@8.11.3: - resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} + acorn@8.12.0: + resolution: {integrity: sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw==} engines: {node: '>=0.4.0'} hasBin: true - address@1.2.2: - resolution: {integrity: sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==} - engines: {node: '>= 10.0.0'} + acorn@8.12.1: + resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==} + 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@7.1.1: - resolution: {integrity: sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==} - engines: {node: '>= 14'} + aes-js@4.0.0-beta.5: + resolution: {integrity: sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==} - aggregate-error@3.1.0: - resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} - engines: {node: '>=8'} + 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'} ajv-draft-04@1.0.0: resolution: {integrity: sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==} @@ -5116,8 +5873,11 @@ packages: ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - ajv@8.13.0: - resolution: {integrity: sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==} + ajv@8.12.0: + resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} + + amazon-cognito-identity-js@6.3.12: + resolution: {integrity: sha512-s7NKDZgx336cp+oDeUtB2ZzT8jWJp/v2LWuYl+LQtMEODe22RF1IJ4nRiDATp+rp1pTffCZcm44Quw4jx2bqNg==} anser@1.4.10: resolution: {integrity: sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww==} @@ -5129,6 +5889,10 @@ packages: 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-fragments@0.2.1: resolution: {integrity: sha512-DykbNHxuXQwUDRv5ibc2b0x7uw7wmwOGLBUd5RmaQ5z8Lhx19vwvKV+FAsM5rEA6dEcHxX+/Ad5s9eF2k2bB+w==} @@ -5160,8 +5924,8 @@ packages: resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} engines: {node: '>=12'} - antlr4@4.13.1-patch-1: - resolution: {integrity: sha512-OjFLWWLzDMV9rdFhpvroCWR4ooktNg9/nvVYSA5z28wuVpU36QUNuioR1XLnQtcjVlf8npjyz593PxnU/f/Cow==} + antlr4@4.13.1: + resolution: {integrity: sha512-kiXTspaRYvnIArgE97z5YVVf/cDVQABr3abFRR6mE7yesLMkgu4ujuyV/sgxafQ8wgve0DJQUJ38Z8tkgA2izA==} engines: {node: '>=16'} any-promise@1.3.0: @@ -5174,9 +5938,6 @@ packages: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} - app-root-dir@1.0.2: - resolution: {integrity: sha512-jlpIfsOoNoafl92Sz//64uQHGSyMrD2vYG5d8o2a4qGvyNCvXur7bzIsWtAC/6flI2RYAp3kv8rsfBtaLm7w0g==} - appdirsjs@1.2.7: resolution: {integrity: sha512-Quji6+8kLBC3NnBeo14nPDq0+2jUs5s3/xEye+udFHumHhRk4M7aAMXp/PBJqkKYGuuyR9M/6Dq7d2AViiGmhw==} @@ -5192,25 +5953,17 @@ packages: argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - aria-hidden@1.2.4: - resolution: {integrity: sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==} - engines: {node: '>=10'} - - aria-query@5.1.3: - resolution: {integrity: sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==} - aria-query@5.3.0: resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} - array-buffer-byte-length@1.0.1: - resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} - engines: {node: '>= 0.4'} + array-buffer-byte-length@1.0.0: + resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==} array-flatten@1.1.1: resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} - array-includes@3.1.8: - resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} + array-includes@3.1.7: + resolution: {integrity: sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==} engines: {node: '>= 0.4'} array-iterate@2.0.1: @@ -5220,8 +5973,8 @@ packages: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} - array.prototype.findlastindex@1.2.5: - resolution: {integrity: sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==} + array.prototype.findlastindex@1.2.3: + resolution: {integrity: sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==} engines: {node: '>= 0.4'} array.prototype.flat@1.3.2: @@ -5232,19 +5985,27 @@ packages: resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} engines: {node: '>= 0.4'} - arraybuffer.prototype.slice@1.0.3: - resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} + arraybuffer.prototype.slice@1.0.2: + resolution: {integrity: sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==} engines: {node: '>= 0.4'} asap@2.0.6: resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} - assert@2.1.0: - resolution: {integrity: sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==} + asn1@0.2.6: + resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==} + + 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==} + assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} + ast-parents@0.0.1: resolution: {integrity: sha512-XHusKxKz3zoYk1ic8Un640joHbFMhbqneyoZfoKnEGtf2ey9Uh/IdpcQplODdO/kENaMIWsD0nJm4+wX3UNLHA==} @@ -5268,19 +6029,19 @@ packages: resolution: {integrity: sha512-ISvCdHdlTDlH5IpxQJIex7BWBywFWgjJSVdwst+/iQCoEYnyOaQ95+X1JGshuBjGp6nxKUy1jMgE3zPqN7fQdg==} hasBin: true - astro-expressive-code@0.35.3: - resolution: {integrity: sha512-f1L1m3J3EzZHDEox6TXmuKo5fTSbaNxE/HU0S0UQmvlCowtOKnU/LOsoDwsbQSYGKz+fdLRPsCjFMiKqEoyfcw==} + astro-expressive-code@0.35.6: + resolution: {integrity: sha512-1U4KrvFuodaCV3z4I1bIR16SdhQlPkolGsYTtiANxPZUVv/KitGSCTjzksrkPonn1XuwVqvnwmUUVzTLWngnBA==} peerDependencies: astro: ^4.0.0-beta || ^3.3.0 - astro-og-canvas@0.5.0: - resolution: {integrity: sha512-nrwZpFL9d6tVJRKV5OLZa3xSSh+Cbaaoay/R9jAgHCrJ79WNyN2rgRT/+wtP1O/bCQ+wVP3GC3mBQN7vogImvg==} + astro-og-canvas@0.5.1: + resolution: {integrity: sha512-Xm37vqyMu3kNRU5tm7nheJf2n8+gweuaDX4efMxPSKEggSF8UznvgreOomzAPqDbcs8LM2fQsyOcMbJFtb3aZg==} engines: {node: '>=18.14.1'} peerDependencies: astro: ^3.0.0 || ^4.0.0 - astro@4.8.3: - resolution: {integrity: sha512-pgIKopkmAUXY3EJHdG7zQpudtBzYAsd94A1R7jmLpH2LFZvzHEkAdHnunmSVmgikJCNqtEo3bUCHgLnCPQaN1g==} + astro@4.15.6: + resolution: {integrity: sha512-SWcUNwm8CiVRaIbh4w5byh62BNihpsovlCd4ElvC7cL/53D24HcI7AaGFsPrromCamQklwQmIan/QS7x/3lLuQ==} engines: {node: ^18.17.1 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0'} hasBin: true @@ -5290,8 +6051,14 @@ packages: async-mutex@0.2.6: resolution: {integrity: sha512-Hs4R+4SPgamu6rSGW8C7cV9gaWUKEHykfzCCvIRuaVv636Ju10ZdeUbvb4TBEW0INuq2DHZqXbK4Nd3yG4RaRw==} - async@3.2.5: - resolution: {integrity: sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==} + async-retry@1.3.3: + resolution: {integrity: sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==} + + async@2.6.4: + resolution: {integrity: sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==} + + async@3.2.3: + resolution: {integrity: sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g==} asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} @@ -5300,6 +6067,13 @@ packages: resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} engines: {node: '>=8.0.0'} + autoprefixer@10.4.18: + resolution: {integrity: sha512-1DKbDfsr6KUElM6wg+0zRNkB/Q7WcKYAaK+pzXn+Xqmszm/5Xa9coeNdtP88Vi+dPzZnMjhge8GIV49ZQkDa+g==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + autoprefixer@10.4.19: resolution: {integrity: sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==} engines: {node: ^10 || ^12 || >=14} @@ -5307,33 +6081,53 @@ packages: peerDependencies: postcss: ^8.1.0 - available-typed-arrays@1.0.7: - resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + available-typed-arrays@1.0.5: + resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} engines: {node: '>= 0.4'} - axios@1.6.8: - resolution: {integrity: sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==} + aws-sign2@0.7.0: + resolution: {integrity: sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==} + + aws4@1.13.2: + resolution: {integrity: sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==} + + axios-proxy-builder@0.1.2: + resolution: {integrity: sha512-6uBVsBZzkB3tCC8iyx59mCjQckhB8+GQrI9Cop8eC7ybIsvs/KtnNgEBfRMSEa7GqK2VBGUzgjNYMdPIfotyPA==} + + axios@1.6.7: + resolution: {integrity: sha512-/hDJGff6/c7u0hDkvkGxR/oy6CbCs8ziCsC7SqmhjfozqiJGc8Z11wrv9z9lYfY4K8l+H9TpjcMDX0xOZmx+RA==} + + axios@1.7.7: + resolution: {integrity: sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==} axobject-query@4.0.0: resolution: {integrity: sha512-+60uv1hiVFhHZeO+Lz0RYzsVHy5Wr1ayX0mwda9KPDVLNJgZ1T9Ny7VmFbLDzxsH0D87I86vgj3gFrjTJUYznw==} + axobject-query@4.1.0: + resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} + engines: {node: '>= 0.4'} + babel-core@7.0.0-bridge.0: resolution: {integrity: sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg==} peerDependencies: '@babel/core': ^7.0.0-0 - babel-plugin-polyfill-corejs2@0.4.11: - resolution: {integrity: sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==} + babel-plugin-macros@3.1.0: + resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} + engines: {node: '>=10', npm: '>=6'} + + babel-plugin-polyfill-corejs2@0.4.8: + resolution: {integrity: sha512-OtIuQfafSzpo/LhnJaykc0R/MMnuLSSVjVYy9mHArIZ9qTCSZ6TpWCuEKZYVoN//t8HqBNScHrOtCrIK5IaGLg==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - babel-plugin-polyfill-corejs3@0.10.4: - resolution: {integrity: sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg==} + babel-plugin-polyfill-corejs3@0.9.0: + resolution: {integrity: sha512-7nZPG1uzK2Ymhy/NbaOWTg3uibM2BmGASS4vHS4szRZAIR8R6GwA/xAujpdrXU5iyklrimWnLWU+BLF9suPTqg==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - babel-plugin-polyfill-regenerator@0.6.2: - resolution: {integrity: sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==} + babel-plugin-polyfill-regenerator@0.5.5: + resolution: {integrity: sha512-OJGYZlhLqBh2DDHeqAxWB1XIvr49CxiJ2gIt61/PU55CQK4Z58OzMqjDe1zwQdQk+rBYsRc+1rJmdajM3gimHg==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 @@ -5364,12 +6158,15 @@ packages: bcp-47@2.1.0: resolution: {integrity: sha512-9IIS3UPrvIa1Ej+lVDdDwO7zLehjqsaByECw0bu2RRGP73jALm6FYbzI5gWbgHLvNdkvfXB5YrSbocZdOS0c0w==} + bcrypt-pbkdf@1.0.2: + resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==} + bech32@1.1.4: resolution: {integrity: sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==} - better-opn@3.0.2: - resolution: {integrity: sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ==} - engines: {node: '>=12.0.0'} + better-path-resolve@1.0.0: + resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} + engines: {node: '>=4'} big-integer@1.6.52: resolution: {integrity: sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==} @@ -5378,8 +6175,8 @@ packages: bignumber.js@9.1.2: resolution: {integrity: sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==} - binary-extensions@2.3.0: - resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + binary-extensions@2.2.0: + resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} engines: {node: '>=8'} bl@4.1.0: @@ -5391,8 +6188,11 @@ packages: blakejs@1.2.1: resolution: {integrity: sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==} - blob-to-it@2.0.6: - resolution: {integrity: sha512-xveo/z3QNilIJgCZAjzvx2uWWVHE4JzOy7eMp45zkuBsmwZMgjfhn2h/+BsZPaByVFa3u1W/OBUleNiqgMtVpQ==} + blob-to-it@2.0.7: + resolution: {integrity: sha512-mFAR/GKDDqFOkSBB7shXfsUZwU5DgK453++I8/SImNacfJsdKlx/oHTO0T4ZYHz8A2dnSONE+CX8L29VlWGKiQ==} + + bluebird@3.7.2: + resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} bn.js@4.11.6: resolution: {integrity: sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==} @@ -5403,8 +6203,8 @@ packages: bn.js@5.2.1: resolution: {integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==} - body-parser@1.20.2: - resolution: {integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==} + body-parser@1.20.3: + resolution: {integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} boolbase@1.0.0: @@ -5413,6 +6213,10 @@ packages: bowser@2.11.0: resolution: {integrity: sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==} + boxen@5.1.2: + resolution: {integrity: sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==} + engines: {node: '>=10'} + boxen@7.1.1: resolution: {integrity: sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==} engines: {node: '>=14.16'} @@ -5427,8 +6231,12 @@ packages: brace-expansion@2.0.1: resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} - braces@3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} brorand@1.1.0: @@ -5440,20 +6248,25 @@ packages: browser-readablestream-to-it@1.0.3: resolution: {integrity: sha512-+12sHB+Br8HIh6VAMVEG5r3UXCyESIgDW7kzk3BjIXa43DVqVwL7GC5TW3jeh+72dtcH99pPVpw0X8i0jt+/kw==} - browser-readablestream-to-it@2.0.7: - resolution: {integrity: sha512-g1Aznml3HmqTLSXylZhGwdfnAa67+vlNAYhT9ROJZkAxY7yYmWusND10olvCMPe4sVhZyVwn5tPkRzOg85kBEg==} + browser-readablestream-to-it@2.0.6: + resolution: {integrity: sha512-csJm66U/gTC6VHjeaOaziK6Y6ENdrzlNLdXnsdnvGX+3hGvedkxTyiMk2WbgKR8F15ACxDLJhDuE/cmovLPBQQ==} + + browser-stdout@1.3.1: + resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} browserify-aes@1.2.0: resolution: {integrity: sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==} - browserify-zlib@0.1.4: - resolution: {integrity: sha512-19OEpq7vWgsH6WkvkBJQDFvJS1uPcbFOQ4v9CU839dO+ZZXUZO6XpE6hNCqvlIIj+4fZvRiJ6DsAQ382GwiyTQ==} - browserslist@4.23.0: resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true + browserslist@4.23.3: + resolution: {integrity: sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + bs58@4.0.1: resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==} @@ -5466,8 +6279,9 @@ packages: bser@2.1.1: resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} - buffer-crc32@0.2.13: - resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} + buffer-crc32@1.0.0: + resolution: {integrity: sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==} + engines: {node: '>=8.0.0'} buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} @@ -5475,9 +6289,15 @@ packages: buffer-reverse@1.0.1: resolution: {integrity: sha512-M87YIUBsZ6N924W57vDwT/aOu8hw7ZgdByz6ijksLjmHJELBASmYTTlNHRgjE+pTsT9oJXGaDSgqqwfdHotDUg==} + buffer-to-arraybuffer@0.0.5: + resolution: {integrity: sha512-3dthu5CYiVB1DEJp61FtApNnNndTckcqe4pFcLdvHtrpG+kcyekCJKg4MRiDcFW7A6AODnXB9U4dwQiCW5kzJQ==} + buffer-xor@1.0.3: resolution: {integrity: sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==} + buffer@4.9.2: + resolution: {integrity: sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==} + buffer@5.6.0: resolution: {integrity: sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==} @@ -5495,11 +6315,15 @@ packages: resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} engines: {node: '>=6'} - builtins@5.1.0: - resolution: {integrity: sha512-SW9lzGTLvWTP1AY8xeAMZimqDrIaSdLQUcVr9DMef51niJ022Ri87SwRRKYm4A6iHfkPaiVUu/Duw2Wc4J7kKg==} + builtins@5.0.1: + resolution: {integrity: sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==} - bundle-require@4.1.0: - resolution: {integrity: sha512-FeArRFM+ziGkRViKRnSTbHZc35dgmR9yNog05Kn0+ItI59pOAISGvnnIwW1WgFZQW59IxD9QpJnUPkdIPfZuXg==} + bundle-name@3.0.0: + resolution: {integrity: sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==} + engines: {node: '>=12'} + + bundle-require@4.0.2: + resolution: {integrity: sha512-jwzPOChofl67PSTW2SGubV9HBQAhhR2i6nskiOThauo9dzwDUgOWQScFVaJkjEfYX+UXiD+LEx8EblQMc2wIag==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} peerDependencies: esbuild: '>=0.17' @@ -5516,6 +6340,14 @@ packages: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} + cacheable-lookup@5.0.4: + resolution: {integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==} + engines: {node: '>=10.6.0'} + + cacheable-lookup@6.1.0: + resolution: {integrity: sha512-KJ/Dmo1lDDhmW2XDPMo+9oiy/CeqosPguPCrgcVzKyZrL6pM1gU2GmPY/xo6OQPTUaA/c0kwHuywB4E6nmT9ww==} + engines: {node: '>=10.6.0'} + cacheable-lookup@7.0.0: resolution: {integrity: sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==} engines: {node: '>=14.16'} @@ -5524,6 +6356,10 @@ packages: resolution: {integrity: sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==} engines: {node: '>=14.16'} + cacheable-request@7.0.4: + resolution: {integrity: sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==} + engines: {node: '>=8'} + call-bind@1.0.7: resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} engines: {node: '>= 0.4'} @@ -5547,9 +6383,6 @@ packages: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} - camel-case@4.1.2: - resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} - camelcase-css@2.0.1: resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} engines: {node: '>= 6'} @@ -5566,8 +6399,14 @@ packages: resolution: {integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==} engines: {node: '>=14.16'} - caniuse-lite@1.0.30001617: - resolution: {integrity: sha512-mLyjzNI9I+Pix8zwcrpxEbGlfqOkF9kM3ptzmKNw5tizSyYwMe+nGLTqMK9cO+0E+Bh6TsBxNAaHWEM8xwSsmA==} + caniuse-lite@1.0.30001593: + resolution: {integrity: sha512-UWM1zlo3cZfkpBysd7AS+z+v007q9G1+fLTUU42rQnY6t2axoogPW/xol6T7juU5EUoOhML4WgBIdG+9yYqAjQ==} + + caniuse-lite@1.0.30001614: + resolution: {integrity: sha512-jmZQ1VpmlRwHgdP1/uiKzgiAuGOfLEJsYFP4+GBou/QQ4U6IOJCB4NP1c+1p9RGLpwObcT94jA5/uO+F1vBbog==} + + caniuse-lite@1.0.30001660: + resolution: {integrity: sha512-GacvNTTuATm26qC74pt+ad1fW15mlQ/zuTzzY1ZoIzECTP8HURDfF43kNxPgf7H1jmelCBQTTbBNxdSXOA7Bqg==} canvaskit-wasm@0.39.1: resolution: {integrity: sha512-Gy3lCmhUdKq+8bvDrs9t8+qf7RvcjuQn+we7vTVVyqgOVO1UVfHpsnBxkTZw+R4ApEJ3D5fKySl9TU11hmjl/A==} @@ -5575,6 +6414,9 @@ packages: capital-case@1.0.4: resolution: {integrity: sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==} + caseless@0.12.0: + resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} + cborg@4.2.0: resolution: {integrity: sha512-q6cFW5m3KxfP/9xGI3yGLaC1l5DP6DWM9IvjiJojnIwohL5CQDl02EXViPV852mOfQo+7PJGPN01MI87vFGzyA==} hasBin: true @@ -5586,6 +6428,10 @@ packages: resolution: {integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==} engines: {node: '>=4'} + chai@5.1.1: + resolution: {integrity: sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA==} + engines: {node: '>=12'} + chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} engines: {node: '>=4'} @@ -5602,8 +6448,11 @@ packages: resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - change-case@4.1.2: - resolution: {integrity: sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==} + change-case@5.4.4: + resolution: {integrity: sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==} + + change-case@5.4.4: + resolution: {integrity: sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==} character-entities-html4@2.1.0: resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} @@ -5617,22 +6466,41 @@ packages: character-reference-invalid@2.0.1: resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} + chardet@0.7.0: + resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} + check-error@1.0.3: resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} + check-error@2.1.1: + resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} + engines: {node: '>= 16'} + chokidar@3.6.0: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} + chokidar@4.0.0: + resolution: {integrity: sha512-mxIojEAQcuEvT/lyXq+jf/3cO/KoA6z4CeNDGGevTybECPOMFCnQy3OPahluUkbqgPNGw5Bi78UC7Po6Lhy+NA==} + engines: {node: '>= 14.16.0'} + chownr@1.1.4: resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} - chownr@2.0.0: - resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} - engines: {node: '>=10'} + chromatic@11.10.2: + resolution: {integrity: sha512-EbVlhmOLGdx9QRX3RMOTF3UzoyC1aaXNRjlzm1mc++2OI5+6C5Bzwt2ZUYJ3Jnf/pJa23q0y5Y3QEDcfRVqIbg==} + hasBin: true + peerDependencies: + '@chromatic-com/cypress': ^0.*.* || ^1.0.0 + '@chromatic-com/playwright': ^0.*.* || ^1.0.0 + peerDependenciesMeta: + '@chromatic-com/cypress': + optional: true + '@chromatic-com/playwright': + optional: true - chromatic@11.3.2: - resolution: {integrity: sha512-0PuHl49VvBMoDHEfmNjC/bim9YYNhWF3axTZlFuatC0avwr2Xw4GDqJDG9fArEWN8oM8VtYHkE9D7qc87dmz2w==} + chromatic@11.3.0: + resolution: {integrity: sha512-q1ZtJDJrjLGnz60ivpC16gmd7KFzcaA4eTb7gcytCqbaKqlHhCFr1xQmcUDsm14CK7JsqdkFU6S+JQdOd2ZNJg==} hasBin: true peerDependencies: '@chromatic-com/cypress': ^0.*.* || ^1.0.0 @@ -5648,6 +6516,9 @@ packages: engines: {node: '>=12.13.0'} hasBin: true + chromium-edge-launcher@1.0.0: + resolution: {integrity: sha512-pgtgjNKZ7i5U++1g1PWv75umkHvhVTDOQIZ+sjeUX9483S7Y6MUvO0lrd7ShGlQlFHMN4SwKTCq/X8hWrbv2KA==} + ci-info@2.0.0: resolution: {integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==} @@ -5659,22 +6530,34 @@ packages: resolution: {integrity: sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg==} engines: {node: '>=8'} + cids@0.7.5: + resolution: {integrity: sha512-zT7mPeghoWAu+ppn8+BS1tQ5qGmbMfB4AregnQjA/qHY3GC1m1ptI9GkWNlgeu38r7CuRdXB47uY2XgAYt6QVA==} + engines: {node: '>=4.0.0', npm: '>=3.0.0'} + deprecated: This module has been superseded by the multiformats module + cipher-base@1.0.4: resolution: {integrity: sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==} citty@0.1.6: resolution: {integrity: sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==} + class-is@1.1.0: + resolution: {integrity: sha512-rhjH9AG1fvabIDoGRVH587413LPjTZgmDF9fOFCbFJQV4yuocX1mHxxvXI4g3cGwbVY9wAYIoKlg1N79frJKQw==} + 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-boxes@3.0.0: resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==} engines: {node: '>=10'} - cli-color@2.0.4: - resolution: {integrity: sha512-zlnpg0jNcibNrO7GG9IeHH7maWFeCz+Ja1wx/7tZNU5ASSSSZ+/qZciM0/LHCYxSdqv5h2sdbQ/PXYdOuetXvA==} + cli-color@2.0.3: + resolution: {integrity: sha512-OkoZnxyC4ERN3zLzZaY9Emb7f/MhBOIpePv0Ycok0fJYT+Ouo00UBEIwsVsr0yoow++n5YWlSUgST9GKhNHiRQ==} engines: {node: '>=0.10'} cli-cursor@3.1.0: @@ -5685,14 +6568,14 @@ packages: resolution: {integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + cli-cursor@5.0.0: + resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==} + engines: {node: '>=18'} + cli-spinners@2.9.2: resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} engines: {node: '>=6'} - cli-table3@0.6.5: - resolution: {integrity: sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==} - engines: {node: 10.* || >= 12.*} - clipboardy@4.0.0: resolution: {integrity: sha512-5mOlNS0mhX0707P2I0aZ2V/cmHUEO/fL7VFLqszkhUsxt7RwnmrInf/eEQKlf5GzvYeHIjT+Ov1HRfNmymlG0w==} engines: {node: '>=18'} @@ -5700,6 +6583,9 @@ packages: 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'} @@ -5708,6 +6594,9 @@ packages: resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} engines: {node: '>=6'} + clone-response@1.0.3: + resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==} + clone@1.0.4: resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} engines: {node: '>=0.8'} @@ -5720,6 +6609,10 @@ packages: resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} engines: {node: '>=6'} + cluster-key-slot@1.1.2: + resolution: {integrity: sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==} + engines: {node: '>=0.10.0'} + code-block-writer@12.0.0: resolution: {integrity: sha512-q4dMFMlXtKR3XNBHyMHt/3pwYNA69EDk00lloMOaaUMKPUXBw6lpXtbu3MMVG6/uOihGnRDOlkyqsONEUj60+w==} @@ -5756,6 +6649,10 @@ packages: colorette@1.4.0: resolution: {integrity: sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==} + colors@1.0.3: + resolution: {integrity: sha512-pFGrxThWcWQ2MsAz6RtgeWe4NK2kUE1WfsrvvlctdII745EW9I0yflqhe7++M5LEc7bV2c/9/5zc8sFcpL0Drw==} + engines: {node: '>=0.1.90'} + combined-stream@1.0.8: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} @@ -5777,10 +6674,6 @@ packages: resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} engines: {node: '>= 6'} - commander@6.2.1: - resolution: {integrity: sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==} - engines: {node: '>= 6'} - commander@8.3.0: resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} engines: {node: '>= 12'} @@ -5806,9 +6699,6 @@ packages: concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - confbox@0.1.7: - resolution: {integrity: sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA==} - config-chain@1.1.13: resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} @@ -5820,43 +6710,61 @@ packages: resolution: {integrity: sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==} engines: {node: ^14.18.0 || >=16.10.0} - constant-case@3.0.4: - resolution: {integrity: sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==} - content-disposition@0.5.4: resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} engines: {node: '>= 0.6'} + content-hash@2.5.2: + resolution: {integrity: sha512-FvIQKy0S1JaWV10sMsA7TRx8bpU+pqPkhbsfvOJAdjRXvYxEckAwQWGwtRjiaJfh+E0DvcWUGqcdjwMGFjsSdw==} + content-type@1.0.5: resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} engines: {node: '>= 0.6'} - convert-csv-to-json@2.46.0: - resolution: {integrity: sha512-Q7PjRjhECa5nBUEGbsKXvB8YaygVUesF/sYnaoCPTWoiwJEDCbLd2CcFDE1y80Q347IaTQukCQSCP2fR5IW+5g==} + convert-csv-to-json@2.48.0: + resolution: {integrity: sha512-XkmztvCyY1qbUA1dlait7fmazAS0vDhYOzhMu90NPMvqBVY0/2GmAW1XzTzlKPpW5K/4ZaTKEO2Jb7e4saIQxg==} + + convert-source-map@1.9.0: + resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - cookie-es@1.1.0: - resolution: {integrity: sha512-L2rLOcK0wzWSfSDA33YR+PUHDG10a8px7rUHKWbGLP4YfbsMed2KFUw5fczvDPbT98DDe3LEzviswl810apTEw==} + cookie-es@1.0.0: + resolution: {integrity: sha512-mWYvfOLrfEc996hlKcdABeIiPHUPC6DM2QYZdGGOvhOTbA3tjm2eBwqlJpoFdjC89NI4Qt6h0Pu06Mp+1Pj5OQ==} cookie-signature@1.0.6: resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} + cookie@0.4.2: + resolution: {integrity: sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==} + engines: {node: '>= 0.6'} + cookie@0.6.0: resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} engines: {node: '>= 0.6'} - core-js-compat@3.37.0: - resolution: {integrity: sha512-vYq4L+T8aS5UuFg4UwDhc7YNRWVeVZwltad9C/jV3R2LgVOpS9BDr7l/WL6BN0dbV3k1XejPTHqqEzJgsa0frA==} + core-js-compat@3.36.0: + resolution: {integrity: sha512-iV9Pd/PsgjNWBXeq8XRtWVSgz2tKAfhfvBs7qxYty+RlRd+OCksaWmOnc4JKrTc1cToXL1N0s3l/vwlxPtdElw==} + + core-util-is@1.0.2: + resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==} core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + cors@2.8.5: + resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} + engines: {node: '>= 0.10'} + cosmiconfig@5.2.1: resolution: {integrity: sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==} engines: {node: '>=4'} + cosmiconfig@7.1.0: + resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} + engines: {node: '>=10'} + cosmiconfig@8.3.6: resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} engines: {node: '>=14'} @@ -5886,17 +6794,15 @@ packages: cross-fetch@4.0.0: resolution: {integrity: sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==} + cross-spawn@5.1.0: + resolution: {integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==} + cross-spawn@7.0.3: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} engines: {node: '>= 8'} - crossws@0.2.4: - resolution: {integrity: sha512-DAxroI2uSOgUKLz00NX6A8U/8EE3SZHmIND+10jkVSaypvyt57J5JEOxAQOL6lQxyzi/wZbTIwssU1uy69h5Vg==} - peerDependencies: - uWebSockets.js: '*' - peerDependenciesMeta: - uWebSockets.js: - optional: true + crossws@0.1.1: + resolution: {integrity: sha512-c9c/o7bS3OjsdpSkvexpka0JNlesBF2JU9B2V1yNsYGwRbAafxhJQ7VI9b48D5bpONz/oxbPGMzBojy9sXoQIQ==} crypto-js@3.3.0: resolution: {integrity: sha512-DIT51nX0dCfKltpRiXV+/TVZq+Qq2NgF4644+K7Ttnla7zEzqc+kjJyiB96BHNyUTBxyjzRcZYpUdZa+QAqi6Q==} @@ -5904,10 +6810,6 @@ packages: crypto-js@4.2.0: resolution: {integrity: sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==} - crypto-random-string@2.0.0: - resolution: {integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==} - engines: {node: '>=8'} - css-selector-parser@3.0.5: resolution: {integrity: sha512-3itoDFbKUNx1eKmVpYMFyqKX04Ww9osZ+dLgrk6GEv6KMVeXUhUnp4I5X+evw+u3ZxVU6RFXSSRxlTeMh8bA+g==} @@ -5937,33 +6839,32 @@ packages: resolution: {integrity: sha512-pHJg+jbuFsCjz9iclQBqyL3B2HLCBF71BwVNujUYEvCeQMvV97R59MNK3R2+jgJ3a1fcZgI9B3vYgz8lzr/BFQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - d@1.0.2: - resolution: {integrity: sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==} - engines: {node: '>=0.12'} + cycle@1.0.3: + resolution: {integrity: sha512-TVF6svNzeQCOpjCqsy0/CSy8VgObG3wXusJ73xW2GbG5rGx7lC8zxDSURicsXI2UsGdi2L0QNRCi745/wUDvsA==} + engines: {node: '>=0.4.0'} + + d@1.0.1: + resolution: {integrity: sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==} dag-jose@4.0.0: resolution: {integrity: sha512-tw595L3UYoOUT9dSJPbBEG/qpRpw24kRZxa5SLRnlnr+g5L7O8oEs1d3W5TiVA1oJZbthVsf0Vi3zFN66qcEBA==} + daisyui@4.10.1: + resolution: {integrity: sha512-Ds0Z0Fv+Xf6ZEqV4Q5JIOeKfg83xxnww0Lzid0V94vPtlQ0yYmucEa33zSctsX2VEgBALtmk5zVEqd59pnUbuQ==} + engines: {node: '>=16.9.0'} + daisyui@4.11.1: resolution: {integrity: sha512-obT9CUbQdW6eoHwSeT5VwaRrWlwrM4OT5qlfdJ0oQlSIEYhwnEl2+L2fwu5PioLbitwuMdYC2X8I1cyy8Pf6LQ==} engines: {node: '>=16.9.0'} + 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'} - data-view-buffer@1.0.1: - resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} - engines: {node: '>= 0.4'} - - data-view-byte-length@1.0.1: - resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} - engines: {node: '>= 0.4'} - - data-view-byte-offset@1.0.0: - resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} - engines: {node: '>= 0.4'} - date-fns@2.30.0: resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} engines: {node: '>=0.11'} @@ -5971,9 +6872,6 @@ packages: dayjs@1.11.10: resolution: {integrity: sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==} - dayjs@1.11.11: - resolution: {integrity: sha512-okzr3f11N6WuqYtZSvm+F776mB41wRZMhKP+hc34YdW+KmtYYK9iqvHSwo2k9FEH3fhGXvOPV6yz2IcSrfRUDg==} - debug@2.6.9: resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} peerDependencies: @@ -5990,8 +6888,17 @@ packages: supports-color: optional: true - debug@4.3.4: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + debug@4.3.5: + resolution: {integrity: sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.3.7: + resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' @@ -6003,6 +6910,10 @@ packages: 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==} @@ -6013,6 +6924,10 @@ packages: resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} engines: {node: '>=0.10'} + decompress-response@3.3.0: + resolution: {integrity: sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==} + engines: {node: '>=4'} + decompress-response@6.0.0: resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} engines: {node: '>=10'} @@ -6023,13 +6938,13 @@ packages: dedent@0.7.0: resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==} - deep-eql@4.1.3: - resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} + deep-eql@4.1.4: + resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} engines: {node: '>=6'} - deep-equal@2.2.3: - resolution: {integrity: sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==} - engines: {node: '>= 0.4'} + deep-eql@5.0.2: + resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} + engines: {node: '>=6'} deep-extend@0.6.0: resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} @@ -6046,6 +6961,10 @@ packages: resolution: {integrity: sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==} engines: {node: '>=12'} + default-browser@4.0.0: + resolution: {integrity: sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==} + engines: {node: '>=14.16'} + defaults@1.0.4: resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} @@ -6061,6 +6980,10 @@ packages: resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} engines: {node: '>=8'} + define-lazy-prop@3.0.0: + resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} + engines: {node: '>=12'} + define-properties@1.2.1: resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} engines: {node: '>= 0.4'} @@ -6068,10 +6991,6 @@ packages: defu@6.1.4: resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} - del@6.1.1: - resolution: {integrity: sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==} - engines: {node: '>=10'} - delayed-stream@1.0.0: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} @@ -6079,10 +6998,18 @@ packages: denodeify@1.2.1: resolution: {integrity: sha512-KNTihKNmQENUZeKu5fzfpzRqR5S2VMp4gl9RFHiWzj9DfvYQPMJ6XHKNaQxaGCXwPk6y9yme3aUoaiAe+KX+vg==} + denque@2.1.0: + resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==} + engines: {node: '>=0.10'} + depd@2.0.0: resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} engines: {node: '>= 0.8'} + deprecated-react-native-prop-types@5.0.0: + resolution: {integrity: sha512-cIK8KYiiGVOFsKdPMmm1L3tA/Gl+JopXL6F5+C7x39MyPsQYnP57Im/D6bNUzcborD7fcMwiwZqcBdBXXZucYQ==} + engines: {node: '>=18'} + dequal@2.0.3: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} @@ -6110,18 +7037,6 @@ packages: resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} engines: {node: '>=8'} - detect-node-es@1.1.0: - resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} - - detect-package-manager@2.0.1: - resolution: {integrity: sha512-j/lJHyoLlWi6G1LDdLgvUtz60Zo5GEj+sVYtTVXnYLDPuzgC3llMxonXym9zIwhhUII8vjdw0LXxavpLqTbl1A==} - engines: {node: '>=12'} - - detect-port@1.6.1: - resolution: {integrity: sha512-CmnVc+Hek2egPx1PeTFVta2W78xy2K/9Rkf6cC4T59S50tVnzKj+tnx5mmx5lwvCkujZ4uRrpRSuV+IVs3f90Q==} - engines: {node: '>= 4.0.0'} - hasBin: true - deterministic-object-hash@2.0.2: resolution: {integrity: sha512-KxektNH63SrbfUyDiwXqRb1rLwKt33AmMv+5Nhsw1kqZ13SJBRTgZHtGbE+hH3a1mVW1cz+4pqSWVPAtLVXTzQ==} engines: {node: '>=18'} @@ -6185,6 +7100,9 @@ packages: dom-serializer@1.4.1: resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==} + dom-walk@0.1.2: + resolution: {integrity: sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==} + domelementtype@2.3.0: resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} @@ -6199,9 +7117,6 @@ packages: domutils@2.8.0: resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} - dot-case@3.0.4: - resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} - dotenv-expand@10.0.0: resolution: {integrity: sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A==} engines: {node: '>=12'} @@ -6212,44 +7127,51 @@ packages: ds-test@https://codeload.github.com/dapphub/ds-test/tar.gz/e282159d5170298eb2455a6c05280ab5a73a4ef0: resolution: {tarball: https://codeload.github.com/dapphub/ds-test/tar.gz/e282159d5170298eb2455a6c05280ab5a73a4ef0} + name: ds-test version: 1.0.0 dset@3.1.3: resolution: {integrity: sha512-20TuZZHCEZ2O71q9/+8BwKwZ0QtD9D8ObhrihJPr+vLLYlSuAU3/zL4cSlgbfeoGHTjCSJBa7NGcrF9/Bx/WJQ==} engines: {node: '>=4'} - duplexify@3.7.1: - resolution: {integrity: sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==} - - duplexify@4.1.3: - resolution: {integrity: sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==} + 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==} + eciesjs@0.3.18: resolution: {integrity: sha512-RQhegEtLSyIiGJmFTZfvCTHER/fymipXFVx6OwSRYD6hOuy+6Kjpk0dGvIfP9kxn/smBpxQy71uxpGO406ITCw==} ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - ejs@3.1.10: - resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} - engines: {node: '>=0.10.0'} - hasBin: true + eigenlayer-contracts@https://codeload.github.com/Layr-labs/eigenlayer-contracts/tar.gz/30040aa273edeefe83333fa9183a0a26a84cebf0: + resolution: {tarball: https://codeload.github.com/Layr-labs/eigenlayer-contracts/tar.gz/30040aa273edeefe83333fa9183a0a26a84cebf0} + version: 1.0.0 + + eigenlayer-middleware@https://codeload.github.com/layr-Labs/eigenlayer-middleware/tar.gz/7d49b5181b09198ed275783453aa082bb3766990: + resolution: {tarball: https://codeload.github.com/layr-Labs/eigenlayer-middleware/tar.gz/7d49b5181b09198ed275783453aa082bb3766990} + version: 0.0.0 electron-fetch@1.9.1: resolution: {integrity: sha512-M9qw6oUILGVrcENMSRRefE1MbHPIz0h79EKIeJWK9v563aT9Qkh8aEHPO1H5vi970wPirNY+jO9OpFoLiMsMGA==} engines: {node: '>=6'} - electron-to-chromium@1.4.761: - resolution: {integrity: sha512-PIbxpiJGx6Bb8dQaonNc6CGTRlVntdLg/2nMa1YhnrwYOORY9a3ZgGN0UQYE6lAcj/lkyduJN7BPt/JiY+jAQQ==} + electron-to-chromium@1.4.676: + resolution: {integrity: sha512-uHt4FB8SeYdhcOsj2ix/C39S7sPSNFJpzShjxGOm1KdF4MHyGqGi389+T5cErsodsijojXilYaHIKKqJfqh7uQ==} + + electron-to-chromium@1.5.23: + resolution: {integrity: sha512-mBhODedOXg4v5QWwl21DjM5amzjmI1zw9EPrPK/5Wx7C8jt33bpZNrC7OhHUG3pxRtbLpr3W2dXT+Ph1SsfRZA==} elliptic@6.5.4: resolution: {integrity: sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==} - elliptic@6.5.5: - resolution: {integrity: sha512-7EjbcmUm17NQFu4Pmgmq2olYMj8nwMnpcddByChSUjArp8F5DQWcIcpriwO4ZToLNAJig0yiyjswfyGNje/ixw==} + elliptic@6.5.7: + resolution: {integrity: sha512-ESVCtTwiA+XhY3wyh24QqRGBoP3rEdDUl3EDUUo9tft074fi19IrdpH7hLCMMP3CIj7jb3W96rn8lt/BqIlt5Q==} emmet@2.4.7: resolution: {integrity: sha512-O5O5QNqtdlnQM2bmKHtJgyChcrFMgQuulI+WdiOw2NArzprUqqxUW6bgYtKvzKgrsYpuLWalOkdhNP+1jluhCA==} @@ -6270,14 +7192,18 @@ packages: resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} engines: {node: '>= 0.8'} + encodeurl@2.0.0: + resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} + engines: {node: '>= 0.8'} + encoding@0.1.13: resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} end-of-stream@1.4.4: resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} - engine.io-client@6.5.3: - resolution: {integrity: sha512-9Z0qLB0NIisTRt1DZ/8U2k12RJn8yls/nXMZLn+/N8hANT3TcYjKFKcwbw5zFQiN4NTde3TSY9zb79e1ij6j9Q==} + engine.io-client@6.5.4: + resolution: {integrity: sha512-GeZeeRjpD2qf49cZQ0Wvh/8NJNfeXkXXcoGh+F77oEAgo9gUHwT1fCRxSNU+YEEaysOJTnsFHmM5oAcPy4ntvQ==} engine.io-parser@5.2.2: resolution: {integrity: sha512-RcyUFKA93/CXH20l4SoVvzZfrSDMOTUS3bWVpTt2FuFP+XYrL8i8oonHP7WInRyVHXh0n/ORtoeiE1os+8qkSw==} @@ -6294,8 +7220,12 @@ packages: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} - envinfo@7.13.0: - resolution: {integrity: sha512-cvcaMr7KqXVh4nyzGTVqTum+gAiL265x5jUWQIDLq//zOGbW+gSW/C+OWLleY/rs9Qole6AZLMXPbtIFQbqu+Q==} + env-paths@2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} + + envinfo@7.11.1: + resolution: {integrity: sha512-8PiZgZNIB4q/Lw4AhOvAfB/ityHAd2bli3lESSWmWSzSsl5dKpy5N1d1Rfkd2teq/g9xN90lc6o98DOjMeYHpg==} engines: {node: '>=4'} hasBin: true @@ -6312,8 +7242,8 @@ packages: resolution: {integrity: sha512-rcOwbfvP1WTViVoUjcfZicVzjhjTuhSMntHh6mW3IrEiyE6mJyXvsToJUJGlGlw/2xU9P5whlWNGlIDVeCiT4A==} engines: {node: '>= 0.8'} - es-abstract@1.23.3: - resolution: {integrity: sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==} + es-abstract@1.22.3: + resolution: {integrity: sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==} engines: {node: '>= 0.4'} es-define-property@1.0.0: @@ -6324,18 +7254,14 @@ packages: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} - es-get-iterator@1.1.3: - resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==} - - es-module-lexer@1.5.2: - resolution: {integrity: sha512-l60ETUTmLqbVbVHv1J4/qj+M8nq7AwMzEcg3kmJDt9dCNrTk+yHcYFf/Kw75pMDwd9mPcIGCG5LcS20SxYRzFA==} + es-module-lexer@1.5.3: + resolution: {integrity: sha512-i1gCgmR9dCl6Vil6UKPI/trA69s08g/syhiDK9TG0Nf1RJjjFI+AzoWW7sPufzkgYAn861skuCwJa0pIIHYxvg==} - es-object-atoms@1.0.0: - resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} - engines: {node: '>= 0.4'} + es-module-lexer@1.5.4: + resolution: {integrity: sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==} - es-set-tostringtag@2.0.3: - resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} + es-set-tostringtag@2.0.2: + resolution: {integrity: sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==} engines: {node: '>= 0.4'} es-shim-unscopables@1.0.2: @@ -6345,6 +7271,10 @@ packages: resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} engines: {node: '>= 0.4'} + es5-ext@0.10.62: + resolution: {integrity: sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==} + engines: {node: '>=0.10'} + es5-ext@0.10.64: resolution: {integrity: sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==} engines: {node: '>=0.10'} @@ -6355,18 +7285,17 @@ packages: es6-promise@3.3.1: resolution: {integrity: sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==} - es6-symbol@3.1.4: - resolution: {integrity: sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==} - engines: {node: '>=0.12'} + es6-promise@4.2.8: + resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} + + es6-symbol@3.1.3: + resolution: {integrity: sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==} es6-weak-map@2.0.3: resolution: {integrity: sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==} - esbuild-plugin-alias@0.2.1: - resolution: {integrity: sha512-jyfL/pwPqaFXyKnj8lP8iLk6Z0m099uXR45aSN8Av1XD4vhvQutxxPzgA2bTcAwQpa1zCXDcWOlhFgyP3GKqhQ==} - - esbuild-register@3.5.0: - resolution: {integrity: sha512-+4G/XmakeBAsvJuDugJvtyF1x+XJT4FMocynNpxrvEBViirpfUn2PgNpCHedfWhF4WokNsO/OvMKrmJOIJsI5A==} + esbuild-register@3.6.0: + resolution: {integrity: sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg==} peerDependencies: esbuild: '>=0.12 <1' @@ -6385,8 +7314,13 @@ packages: engines: {node: '>=12'} hasBin: true - esbuild@0.21.2: - resolution: {integrity: sha512-LmHPAa5h4tSxz+g/D8IHY6wCjtIiFx8I7/Q0Aq+NmvtoYvyMnJU0KQJcqB6QH30X9x/W4CemgUtPgQDZFca5SA==} + esbuild@0.21.3: + resolution: {integrity: sha512-Kgq0/ZsAPzKrbOjCQcjoSmPoWhlcVnGAUo7jvaLHoxW1Drto0KGkR1xBNg2Cp43b9ImvxmPEJZ9xkfcnqPsfBw==} + engines: {node: '>=12'} + hasBin: true + + esbuild@0.21.5: + resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} engines: {node: '>=12'} hasBin: true @@ -6413,6 +7347,12 @@ packages: resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} engines: {node: '>=12'} + eslint-compat-utils@0.1.2: + resolution: {integrity: sha512-Jia4JDldWnFNIru1Ehx1H5s9/yxiRHY/TimCuUc0jNexew3cF1gI6CYZil1ociakfWO3rRqFjl1mskBblB3RYg==} + engines: {node: '>=12'} + peerDependencies: + eslint: '>=6.0.0' + eslint-compat-utils@0.5.0: resolution: {integrity: sha512-dc6Y8tzEcSYZMHa+CMPLi/hyo1FzNeonbhJL7Ol0ccuKQkwopJcJBA9YL/xmMTLU1eKigXo9vj9nALElWYSowg==} engines: {node: '>=12'} @@ -6437,8 +7377,8 @@ packages: eslint-import-resolver-node@0.3.9: resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} - eslint-module-utils@2.8.1: - resolution: {integrity: sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==} + eslint-module-utils@2.8.0: + resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} engines: {node: '>=4'} peerDependencies: '@typescript-eslint/parser': '*' @@ -6458,8 +7398,8 @@ packages: eslint-import-resolver-webpack: optional: true - eslint-plugin-es-x@7.6.0: - resolution: {integrity: sha512-I0AmeNgevgaTR7y2lrVCJmGYF0rjoznpDvqV/kIkZSZbZ8Rw3eu4cGlvBBULScfkSOCzqKbff5LR4CNrV7mZHA==} + eslint-plugin-es-x@7.5.0: + resolution: {integrity: sha512-ODswlDSO0HJDzXU0XvgZ3lF3lS3XAZEossh15Q2UHjwrJggWeBoKqqEsLTZLXl+dh5eOAozG0zRcYtuE35oTuQ==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: eslint: '>=8' @@ -6470,8 +7410,8 @@ packages: peerDependencies: eslint: '>=4.19.1' - eslint-plugin-import@2.29.1: - resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==} + eslint-plugin-import@2.29.0: + resolution: {integrity: sha512-QPOO5NO6Odv5lpoTkddtutccQjysJuFxoPS7fAHO+9m9udNHvTCPSAMW9zGAYj8lAIdr40I8yPCdUYrncXtrwg==} engines: {node: '>=4'} peerDependencies: '@typescript-eslint/parser': '*' @@ -6506,14 +7446,14 @@ packages: eslint-config-prettier: optional: true - eslint-plugin-promise@6.1.1: - resolution: {integrity: sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==} + eslint-plugin-promise@6.4.0: + resolution: {integrity: sha512-/KWWRaD3fGkVCZsdR0RU53PSthFmoHVhZl+y9+6DqeDLSikLdlUVpVEAmI6iCRR5QyOjBYBqHZV/bdv4DJ4Gtw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: - eslint: ^7.0.0 || ^8.0.0 + eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 - eslint-plugin-simple-import-sort@12.1.0: - resolution: {integrity: sha512-Y2fqAfC11TcG/WP3TrI1Gi3p3nc8XJyEOJYHyEPEGI/UAgNx6akxxlX74p7SbAQdLcgASKhj8M0GKvH3vq/+ig==} + eslint-plugin-simple-import-sort@12.0.0: + resolution: {integrity: sha512-8o0dVEdAkYap0Cn5kNeklaKcT1nUsa3LITWEuFk3nJifOoD+5JQGoyDUW2W/iPWwBsNBJpyJS9y4je/BgxLcyQ==} peerDependencies: eslint: '>=5.0.0' @@ -6523,12 +7463,12 @@ packages: peerDependencies: eslint: '>=6' - eslint-plugin-svelte@2.38.0: - resolution: {integrity: sha512-IwwxhHzitx3dr0/xo0z4jjDlb2AAHBPKt+juMyKKGTLlKi1rZfA4qixMwnveU20/JTHyipM6keX4Vr7LZFYc9g==} + eslint-plugin-svelte@2.41.0: + resolution: {integrity: sha512-gjU9Q/psxbWG1VNwYbEb0Q6U4W5PBGaDpYmO2zlQ+zlAMVS3Qt0luAK0ACi/tMSwRK6JENiySvMyJbO0YWmXSg==} engines: {node: ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0-0 || ^9.0.0-0 - svelte: ^3.37.0 || ^4.0.0 || ^5.0.0-next.112 + svelte: ^3.37.0 || ^4.0.0 || ^5.0.0-next.155 peerDependenciesMeta: svelte: optional: true @@ -6568,8 +7508,13 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} hasBin: true - eslint@8.57.0: - resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} + eslint@8.55.0: + resolution: {integrity: sha512-iyUUAM0PCKj5QpwGfmCAG9XXbZCWsqP/eWAWrG/W0umvjuLRBECwSFdt+rCntju0xEH7teIABPwXpahftIaTdA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + + eslint@8.56.0: + resolution: {integrity: sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} hasBin: true @@ -6642,10 +7587,19 @@ packages: resolution: {integrity: sha512-8YdplnuE1IK4xfqpf4iU7oBxnOYAc35934o083G8ao+8WM8QQtt/mVlAY6yIAdY1eMeLqg4Z//PZjJGmWGPMRg==} engines: {node: '>=14.0.0'} + eth-ens-namehash@2.0.8: + resolution: {integrity: sha512-VWEI1+KJfz4Km//dadyvBBoBeSQ0MHTXPvr8UIXiLW6IanxvAV+DmlZAijZwAyggqGUfwQBeHf7tc9wzc1piSw==} + eth-json-rpc-filters@6.0.1: resolution: {integrity: sha512-ITJTvqoCw6OVMLs7pI8f4gG92n/St6x80ACtHodeS+IXmO0w+t1T5OOzfSt7KLSMLRkVUoexV7tztLgDxg+iig==} engines: {node: '>=14.0.0'} + eth-lib@0.1.29: + resolution: {integrity: sha512-bfttrr3/7gG4E02HoWTDUcDDslN003OlOoBxk9virpAZQ1ja/jDgwkWB8QfJF7ojuEowrqy+lzp9VcJG7/k5bQ==} + + eth-lib@0.2.8: + resolution: {integrity: sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==} + eth-query@2.1.2: resolution: {integrity: sha512-srES0ZcvwkR/wd5OQBRA1bIJMww1skfGS0s8wlwK3/oNP4+wnds60krvu5R1QbpRQjMmpG5OMIWro5s7gvDPsA==} @@ -6656,8 +7610,8 @@ packages: resolution: {integrity: sha512-3Vwr2CikFLezh/zLAPBV6C51jC0fFnf6vjhkoIWsDms/W5MLgAZNhh9nZUxPmg899K8cVFbklrYQBxcD4JmfrA==} engines: {node: '>= 4.3.0', npm: '>= 3.7.0'} - ethereum-bloom-filters@1.1.0: - resolution: {integrity: sha512-J1gDRkLpuGNvWYzWslBQR9cDV4nd4kfvVTE/Wy4Kkm4yb3EYRSlyi0eB/inTsSTTVyA0+HyzHgbr95Fn/Z1fSw==} + ethereum-bloom-filters@1.0.10: + resolution: {integrity: sha512-rxJ5OFN3RwjQxDcFP2Z5+Q9ho4eIdEmSc2ht0fCu8Se9nbXjZ7/031uXoUYJ87KHCOdVeiUuwSnoS7hmYAGVHA==} ethereum-cryptography@0.1.3: resolution: {integrity: sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==} @@ -6665,8 +7619,15 @@ packages: ethereum-cryptography@1.2.0: resolution: {integrity: sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw==} - ethereum-cryptography@2.1.3: - resolution: {integrity: sha512-BlwbIL7/P45W8FGW2r7LGuvoEZ+7PWsniMvQ4p5s2xCyw9tmaDlpfsN9HjAucbF+t/qpVHwZUisgfK24TCW8aA==} + ethereum-cryptography@2.2.1: + resolution: {integrity: sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg==} + + ethereumjs-abi@0.6.8: + resolution: {integrity: sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA==} + deprecated: This library has been deprecated and usage is discouraged. + + ethereumjs-util@6.2.1: + resolution: {integrity: sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==} ethereumjs-util@7.1.5: resolution: {integrity: sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==} @@ -6675,10 +7636,18 @@ packages: ethers@5.7.2: resolution: {integrity: sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==} + ethers@6.13.2: + resolution: {integrity: sha512-9VkriTTed+/27BGuY1s0hf441kqwHJ1wtN2edksEtiRvXx+soxRX3iSXTfFqq2+YwrOqbDoTHjIhQnjJRlzKmg==} + engines: {node: '>=14.0.0'} + 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-emitter@0.3.5: resolution: {integrity: sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==} @@ -6689,6 +7658,9 @@ packages: eventemitter2@6.4.9: resolution: {integrity: sha512-JEPTiaOt9f04oa6NOkc4aH+nVp5I3wEjpHbIPqfgCdD5v5bUzy7xQqwcVO2aDQgOWhI28da57HksMrzK9HlRxg==} + eventemitter3@4.0.4: + resolution: {integrity: sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==} + eventemitter3@5.0.1: resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} @@ -6703,6 +7675,10 @@ packages: resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} engines: {node: '>=10'} + execa@7.2.0: + resolution: {integrity: sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==} + engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0} + execa@8.0.1: resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} engines: {node: '>=16.17'} @@ -6711,12 +7687,12 @@ packages: resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - express@4.19.2: - resolution: {integrity: sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==} + express@4.21.0: + resolution: {integrity: sha512-VqcNGcj/Id5ZT1LZ/cfihi3ttTn+NJmkli2eZADigjq29qTlWi/hAQ43t/VLPq8+UX06FCEx3ByOYet6ZFblng==} engines: {node: '>= 0.10.0'} - expressive-code@0.35.3: - resolution: {integrity: sha512-XjWWUCxS4uQjPoRM98R7SNWWIYlFEaOeHm1piWv+c7coHCekuWno81thsc3g/UJ+DajNtOEsIQIAAcsBQZ8LMg==} + expressive-code@0.35.6: + resolution: {integrity: sha512-+mx+TPTbMqgo0mL92Xh9QgjW0kSQIsEivMgEcOnaqKqL7qCw8Vkqc5Rg/di7ZYw4aMUSr74VTc+w8GQWu05j1g==} ext@1.7.0: resolution: {integrity: sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==} @@ -6728,10 +7704,35 @@ packages: extend@3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + extendable-error@0.1.7: + resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} + + extension-port-stream@2.1.1: + resolution: {integrity: sha512-qknp5o5rj2J9CRKfVB8KJr+uXQlrojNZzdESUPhKYLXf97TPcGf6qWWKmpsNNtUyOdzFhab1ON0jzouNxHHvow==} + engines: {node: '>=12.0.0'} + extension-port-stream@3.0.0: resolution: {integrity: sha512-an2S5quJMiy5bnZKEf6AkfH/7r8CzHvhchU40gxN+OM6HPhe7Z9T1FUychcf2M9PpPOO0Hf7BAEfJkw2TDIBDw==} engines: {node: '>=12.0.0'} + 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} + + eyes@0.1.8: + resolution: {integrity: sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==} + engines: {node: '> 0.1.90'} + + fast-base64-decode@1.0.0: + resolution: {integrity: sha512-qwaScUgUGBYeDNRnbc/KyllVU88Jk1pRHPStuF/lO7B0/RTRLj7U0lkdTAutlBblY08rwZDff6tNU9cjv6j//Q==} + + fast-deep-equal@2.0.1: + resolution: {integrity: sha512-bCK/2Z4zLidyB4ReuIsvALH6w31YfAQDmXMqMx6FyfHqvBxtjC0eRumeSu4Bs3XtXwpyIywtSTrVT99BxY1f9w==} + fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -6751,8 +7752,8 @@ packages: fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - fast-redact@3.5.0: - resolution: {integrity: sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==} + fast-redact@3.3.0: + resolution: {integrity: sha512-6T5V1QK1u4oF+ATxs1lWUmlEk6P2T9HqJG3e2DnHOdVgZy2rFJBoEnrIedcTXlkAHU/zKC+7KETJ+KGGKwxgMQ==} engines: {node: '>=6'} fast-safe-stringify@2.1.1: @@ -6762,8 +7763,8 @@ packages: resolution: {integrity: sha512-B9/wizE4WngqQftFPmdaMYlXoJlJOYxGQOanC77fq9k8+Z0v5dDSVh+3glErdIROP//s/jgb7ZuxKfB8nVyo0g==} hasBin: true - fast-xml-parser@4.3.6: - resolution: {integrity: sha512-M2SovcRxD4+vC493Uc2GZVcZaj66CCJhWurC4viynVSTvrpErCShNcDz1lAho6n9REQKvL/ll4A4/fw6Y9z8nw==} + fast-xml-parser@4.3.4: + resolution: {integrity: sha512-utnwm92SyozgA3hhH2I8qldf2lBqm6qHOICawRNRFu1qMe3+oqr+GcXjGqTmXTMGE5T4eC03kr/rlh5C1IRdZA==} hasBin: true fastparse@1.1.2: @@ -6775,25 +7776,28 @@ packages: fb-watchman@2.0.2: resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} - fetch-retry@5.0.6: - resolution: {integrity: sha512-3yurQZ2hD9VISAhJJP9bpYFNQrHHBXE2JxxjY5aLEcDi46RmAzJE2OC9FAde0yis5ElW0jTTzs0zfg/Cca4XqQ==} + fdir@6.3.0: + resolution: {integrity: sha512-QOnuT+BOtivR77wYvCWHfGt9s4Pz1VIMbD463vegT5MLqNXy8rYFT/lPVEqf/bhYeT6qmqrNHhsX+rWwe3rOCQ==} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true file-entry-cache@6.0.1: resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} engines: {node: ^10.12.0 || >=12.0.0} - file-system-cache@2.3.0: - resolution: {integrity: sha512-l4DMNdsIPsVnKrgEXbJwDJsA5mB8rGwHYERMgqQx/xAUtChPJMre1bXBzDEqqVbWv9AIbFezXMxeEkZDSrXUOQ==} - - filelist@1.0.4: - resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} - filesize@10.1.1: resolution: {integrity: sha512-L0cdwZrKlwZQkMSFnCflJ6J2Y+5egO/p3vgRSDQGxQt++QbUZe5gMbRO6kg6gzwQDPvq2Fk9AmoxUNfZ5gdqaQ==} engines: {node: '>= 10.4.0'} - fill-range@7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} filter-obj@1.1.0: @@ -6804,8 +7808,8 @@ packages: resolution: {integrity: sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==} engines: {node: '>= 0.8'} - finalhandler@1.2.0: - resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} + finalhandler@1.3.1: + resolution: {integrity: sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==} engines: {node: '>= 0.8'} find-cache-dir@2.1.0: @@ -6816,6 +7820,17 @@ packages: resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==} engines: {node: '>=8'} + find-root@1.1.0: + resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} + + find-up-simple@1.0.0: + resolution: {integrity: sha512-q7Us7kcjj2VMePAa02hDAF6d+MzsdsAWEwYyOpwUtlerRBkOEPBCRZrAV4XfcSN8fHAgaD0hP7miwoay6DCprw==} + engines: {node: '>=18'} + + find-up@2.1.0: + resolution: {integrity: sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==} + engines: {node: '>=4'} + find-up@3.0.0: resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} engines: {node: '>=6'} @@ -6843,8 +7858,12 @@ packages: resolution: {integrity: sha512-FmTtBsHskrU6FJ2VxCnsDb84wu9zhmO3cUX2kGFb5tuwhfXxGciiT0oRY+cck35QmG+NmGh5eLz6lLCpWTqwpA==} hasBin: true - flatted@3.3.1: - resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} + flat@5.0.2: + resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} + hasBin: true + + flatted@3.2.9: + resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==} flattie@1.1.1: resolution: {integrity: sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ==} @@ -6853,12 +7872,21 @@ packages: flow-enums-runtime@0.0.6: resolution: {integrity: sha512-3PYnM29RFXwvAN6Pc/scUfkI7RwhQ/xqyLUyPNlXUp9S40zI8nup9tUSrTLSVnWGBN38FNiGWbwZOB6uR4OGdw==} - flow-parser@0.235.1: - resolution: {integrity: sha512-s04193L4JE+ntEcQXbD6jxRRlyj9QXcgEl2W6xSjH4l9x4b0eHoCHfbYHjqf9LdZFUiM5LhgpiqsvLj/AyOyYQ==} + flow-parser@0.206.0: + resolution: {integrity: sha512-HVzoK3r6Vsg+lKvlIZzaWNBVai+FXTX1wdYhz/wVlH13tb/gOdLXmlTqy6odmTBhT5UoWUbq0k8263Qhr9d88w==} engines: {node: '>=0.4.0'} - follow-redirects@1.15.6: - resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==} + follow-redirects@1.15.5: + resolution: {integrity: sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + follow-redirects@1.15.9: + resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} engines: {node: '>=4.0'} peerDependencies: debug: '*' @@ -6869,22 +7897,33 @@ packages: for-each@0.3.3: resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} - foreground-child@3.1.1: - resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} + foreground-child@3.2.1: + resolution: {integrity: sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==} engines: {node: '>=14'} + forever-agent@0.6.1: + resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==} + forge-std@https://codeload.github.com/foundry-rs/forge-std/tar.gz/36c303b7ffdd842d06b1ec2744c9b9b5fb3083f3: resolution: {tarball: https://codeload.github.com/foundry-rs/forge-std/tar.gz/36c303b7ffdd842d06b1ec2744c9b9b5fb3083f3} + name: forge-std version: 1.7.5 - forge-std@https://codeload.github.com/foundry-rs/forge-std/tar.gz/52715a217dc51d0de15877878ab8213f6cbbbab5: - resolution: {tarball: https://codeload.github.com/foundry-rs/forge-std/tar.gz/52715a217dc51d0de15877878ab8213f6cbbbab5} - version: 1.8.2 + forge-std@https://codeload.github.com/foundry-rs/forge-std/tar.gz/8f24d6b04c92975e0795b5868aa0d783251cdeaa: + resolution: {tarball: https://codeload.github.com/foundry-rs/forge-std/tar.gz/8f24d6b04c92975e0795b5868aa0d783251cdeaa} + version: 1.9.3 + + form-data-encoder@1.7.1: + resolution: {integrity: sha512-EFRDrsMm/kyqbTQocNvRXMLjc7Es2Vk+IQFx/YW7hkUH1eBl4J1fqiP34l74Yt0pFLCNpc06fkbVk00008mzjg==} form-data-encoder@2.1.4: resolution: {integrity: sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==} engines: {node: '>= 14.17'} + form-data@2.3.3: + resolution: {integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==} + engines: {node: '>= 0.12'} + form-data@4.0.0: resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} engines: {node: '>= 6'} @@ -6893,6 +7932,9 @@ packages: resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} engines: {node: '>= 0.6'} + fp-ts@1.19.3: + resolution: {integrity: sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg==} + fraction.js@4.3.7: resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} @@ -6900,24 +7942,23 @@ packages: resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} engines: {node: '>= 0.6'} - fs-constants@1.0.0: - resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} - - fs-extra@11.1.1: - resolution: {integrity: sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==} - engines: {node: '>=14.14'} - fs-extra@11.2.0: resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==} engines: {node: '>=14.14'} + fs-extra@4.0.3: + resolution: {integrity: sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==} + + 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-minipass@1.2.7: + resolution: {integrity: sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==} fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} @@ -6971,17 +8012,13 @@ packages: get-iterator@1.0.2: resolution: {integrity: sha512-v+dm9bNVfOYsY1OrhaCrmyOcYoSeVvbt+hHZ0Au+T+p1y+0Uyj9aMaGIeUTT6xdpRbWzDeYKvfOslPhggQMcsg==} - get-nonce@1.0.1: - resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} - engines: {node: '>=6'} - - get-npm-tarball-url@2.1.0: - resolution: {integrity: sha512-ro+DiMu5DXgRBabqXupW38h7WPZ9+Ad8UjwhvsmmN8w1sU7ab0nzAXvVZ4kqYg57OrqomRtJvepX5/xvFKNtjA==} - engines: {node: '>=12.17'} - get-port-please@3.1.2: resolution: {integrity: sha512-Gxc29eLs1fbn6LQ4jSU4vXjlwyZhF5HsGuMAa7gqBP4Rw4yxxltyDUuF5MBclFzDTXO+ACchGQoeela4DSfzdQ==} + get-stream@5.2.0: + resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} + engines: {node: '>=8'} + get-stream@6.0.1: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} @@ -6990,16 +8027,15 @@ packages: resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} engines: {node: '>=16'} - get-symbol-description@1.0.2: - resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} + get-symbol-description@1.0.0: + resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} engines: {node: '>= 0.4'} - get-tsconfig@4.7.4: - resolution: {integrity: sha512-ofbkKj+0pjXjhejr007J/fLf+sW+8H7K5GCm+msC8q3IpvgjobpyPqSRFemNyIMxklC0zeJpi7VDFna19FacvQ==} + get-tsconfig@4.7.2: + resolution: {integrity: sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==} - giget@1.2.3: - resolution: {integrity: sha512-8EHPljDvs7qKykr6uw8b+lqLiUc/vUg+KVTI0uND4s63TdsZM2Xus3mflvF0DDG9SiM4RlCkFGL+7aAjRmV7KA==} - hasBin: true + getpass@0.1.7: + resolution: {integrity: sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==} github-slugger@2.0.0: resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} @@ -7012,31 +8048,46 @@ packages: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} - glob-to-regexp@0.4.1: - resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} - - glob@10.3.12: - resolution: {integrity: sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==} + glob@10.3.10: + resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} engines: {node: '>=16 || 14 >=14.17'} hasBin: true + glob@11.0.0: + resolution: {integrity: sha512-9UiX/Bl6J2yaBbxKoEBRm4Cipxgok8kQYcOPEhScPwebu2I0HoQOuYdIO6S3hLuWoZgpDpwQZMzTFxgpkyT76g==} + engines: {node: 20 || >=22} + hasBin: true + + glob@7.2.0: + resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==} + deprecated: Glob versions prior to v9 are no longer supported + glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported glob@8.1.0: resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} engines: {node: '>=12'} + deprecated: Glob versions prior to v9 are no longer supported + + global@4.4.0: + resolution: {integrity: sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==} globals@11.12.0: resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} engines: {node: '>=4'} + globals@13.23.0: + resolution: {integrity: sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==} + engines: {node: '>=8'} + globals@13.24.0: resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} engines: {node: '>=8'} - globalthis@1.0.4: - resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} + globalthis@1.0.3: + resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} engines: {node: '>= 0.4'} globalyzer@0.1.0: @@ -7050,16 +8101,20 @@ packages: resolution: {integrity: sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - globby@14.0.1: - resolution: {integrity: sha512-jOMLD2Z7MAhyG8aJpNOpmziMOP4rPLcc95oQPKXBazW82z+CEgPFBQvEpRUa1KeIMUJo4Wsm+q6uzO/Q/4BksQ==} - engines: {node: '>=18'} - globrex@0.1.2: resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} gopd@1.0.1: resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + got@11.8.6: + resolution: {integrity: sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==} + engines: {node: '>=10.19.0'} + + got@12.1.0: + resolution: {integrity: sha512-hBv2ty9QN2RdbJJMK3hesmSkFTjVIHyIDDbssCKnSmq62edGgImJWD10Eb1k77TiV1bxloxqcFAVK8+9pkhOig==} + engines: {node: '>=14.16'} + got@12.6.1: resolution: {integrity: sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==} engines: {node: '>=14.16'} @@ -7080,18 +8135,35 @@ packages: resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==} engines: {node: '>=6.0'} - gunzip-maybe@1.4.2: - resolution: {integrity: sha512-4haO1M4mLO91PW57BMsDFf75UmwoRX0GkdD+Faw+Lr+r/OZrOCS0pIBwOL1xCKQqnQzbNFGgK2V2CpBUPeFNTw==} - hasBin: true - - h3@1.11.1: - resolution: {integrity: sha512-AbaH6IDnZN6nmbnJOH72y3c5Wwh9P97soSVdGSBbcDACRdkC0FEWf25pzx4f/NuOCK6quHmW18yF2Wx+G4Zi1A==} + h3@1.10.2: + resolution: {integrity: sha512-r1iNNcFGL4G9pL3lgYxwX0O2ZmqdKqhILAJsnlw5icn5I1QHnADM4TgVdYRtHUqy+NntVpHIEFwnw/XCbebICg==} handlebars@4.7.8: resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} engines: {node: '>=0.4.7'} hasBin: true + 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 + + hardhat@2.22.13: + resolution: {integrity: sha512-psVJX4FSXDpSXwsU8OcKTJN04pQEj9cFBMX5OPko+OFwbIoiOpvRmafa954/UaA1934npTj8sV3gaTSdx9bPbA==} + 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==} @@ -7114,8 +8186,8 @@ packages: resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} engines: {node: '>= 0.4'} - has-tostringtag@1.0.2: - resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + has-tostringtag@1.0.0: + resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} engines: {node: '>= 0.4'} hash-base@3.1.0: @@ -7128,10 +8200,13 @@ packages: hashlru@2.3.0: resolution: {integrity: sha512-0cMsjjIC8I+D3M44pOQdsy0OHXGLVz6Z0beRuufhKa0KfaD2wGwAev6jILzXsd3/vpnNQJmWyZtIILqM1N+n5A==} - hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + hasown@2.0.1: + resolution: {integrity: sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==} engines: {node: '>= 0.4'} + hast-util-embedded@3.0.0: + resolution: {integrity: sha512-naH8sld4Pe2ep03qqULEtvYr7EjrLK2QHY8KJR6RJkTUjPGObe1vnx585uzem2hGra+s1q08DZZpfgDVYRbaXA==} + hast-util-from-html@2.0.1: resolution: {integrity: sha512-RXQBLMl9kjKVNkJTIO6bZyb2n+cUH8LFaSSzo82jiLT6Tfc+Pt7VQCS+/h3YwG4jaNE2TA2sdJisGWR+aJrp0g==} @@ -7144,12 +8219,18 @@ packages: hast-util-heading-rank@3.0.0: resolution: {integrity: sha512-EJKb8oMUXVHcWZTDepnr+WNbfnXKFNf9duMesmr4S8SXTJBJ9M4Yok08pu9vxdJwdlGRhVumk9mEhkEvKGifwA==} + hast-util-is-body-ok-link@3.0.0: + resolution: {integrity: sha512-VFHY5bo2nY8HiV6nir2ynmEB1XkxzuUffhEGeVx7orbu/B1KaGyeGgMZldvMVx5xWrDlLLG/kQ6YkJAMkBEx0w==} + hast-util-is-element@3.0.0: resolution: {integrity: sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==} hast-util-parse-selector@4.0.0: resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==} + hast-util-phrasing@3.0.1: + resolution: {integrity: sha512-6h60VfI3uBQUxHqTyMymMZnEbNl1XmEGtOxxKYL7stY2o601COo62AWAYBQR9lZbYXYSBoxag8UpPRXK+9fqSQ==} + hast-util-raw@9.0.3: resolution: {integrity: sha512-ICWvVOF2fq4+7CMmtCPD5CM4QKjPbHpPotE6+8tDooV0ZuyJVUzHsrNX+O5NaRbieTf0F7FfeBOMAwi6Td0+yQ==} @@ -7162,6 +8243,9 @@ packages: hast-util-to-html@9.0.1: resolution: {integrity: sha512-hZOofyZANbyWo+9RP75xIDV/gq+OUKx+T46IlwERnKmfpwp81XBFbT9mi26ws+SJchA4RVUQwIBJpqEOBhMzEQ==} + hast-util-to-html@9.0.2: + resolution: {integrity: sha512-RP5wNpj5nm1Z8cloDv4Sl4RS8jH5HYa0v93YB6Wb4poEzgMo/dAAL0KcT4974dCjcNG5pkLqTImeFHHCwwfY3g==} + hast-util-to-jsx-runtime@2.3.0: resolution: {integrity: sha512-H/y0+IWPdsLLS738P8tDnrQ8Z+dj12zQQ6WC11TIM21C8WFVoIxcqWXf2H3hiTVZjF1AWqoimGwrTWecWrnmRQ==} @@ -7183,21 +8267,25 @@ packages: hastscript@9.0.0: resolution: {integrity: sha512-jzaLBGavEDKHrc5EfFImKN7nZKKBdSLIdGvCwDZ9TfzbF2ffXiov8CKE445L2Z1Ek2t/m4SKQ2j6Ipv7NyUolw==} + he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + header-case@2.0.4: resolution: {integrity: sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==} + hermes-estree@0.15.0: + resolution: {integrity: sha512-lLYvAd+6BnOqWdnNbP/Q8xfl8LOGw4wVjfrNd9Gt8eoFzhNBRVD95n4l2ksfMVOoxuVyegs85g83KS9QOsxbVQ==} + hermes-estree@0.19.1: resolution: {integrity: sha512-daLGV3Q2MKk8w4evNMKwS8zBE/rcpA800nu1Q5kM08IKijoSnPe9Uo1iIxzPKRkn95IxxsgBMPeYHt3VG4ej2g==} - hermes-estree@0.20.1: - resolution: {integrity: sha512-SQpZK4BzR48kuOg0v4pb3EAGNclzIlqMj3Opu/mu7bbAoFw6oig6cEt/RAi0zTFW/iW6Iz9X9ggGuZTAZ/yZHg==} + hermes-parser@0.15.0: + resolution: {integrity: sha512-Q1uks5rjZlE9RjMMjSUCkGrEIPI5pKJILeCtK1VmTj7U4pf3wVPoo+cxfu+s4cBAPy2JzikIIdCZgBoR6x7U1Q==} hermes-parser@0.19.1: resolution: {integrity: sha512-Vp+bXzxYJWrpEuJ/vXxUsLnt0+y4q9zyi4zUlkLqD8FKv4LjIfOvP69R/9Lty3dCyKh0E2BU7Eypqr63/rKT/A==} - hermes-parser@0.20.1: - resolution: {integrity: sha512-BL5P83cwCogI8D7rrDCgsFY0tdYUtmFP9XaXtl2IQjC+2Xo+4okjfXintlTxcIwl4qeGddEl28Z11kbVIw0aNA==} - hermes-profile-transformer@0.0.6: resolution: {integrity: sha512-cnN7bQUm65UWOy6cbGcCcZ3rpwW8Q/j4OP5aWRhEry4Z2t2aR1cjrbp0BS+KiBN0smvP1caBgAuxutvyvJILzQ==} engines: {node: '>=8'} @@ -7208,8 +8296,8 @@ packages: hmac-drbg@1.0.1: resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==} - hosted-git-info@2.8.9: - resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} + hoist-non-react-statics@3.3.2: + resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} html-encoding-sniffer@4.0.0: resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==} @@ -7227,6 +8315,9 @@ packages: html-void-elements@3.0.0: resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} + html-whitespace-sensitive-tag-names@3.0.0: + resolution: {integrity: sha512-KlClZ3/Qy5UgvpvVvDomGhnQhNWH5INE8GwvSIQ9CWt1K0zbbXrl7eN5bWaafOZgtmO3jMPwUqmrmEwinhPq1w==} + htmlparser2-svelte@4.1.0: resolution: {integrity: sha512-+4f4RBFz7Rj2Hp0ZbFbXC+Kzbd6S9PgjiuFtdT76VMNgKogrEZy0pG2UrPycPbrZzVEIM5lAT3lAdkSTCHLPjg==} @@ -7237,6 +8328,9 @@ packages: resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} engines: {node: '>= 0.8'} + http-https@1.0.0: + resolution: {integrity: sha512-o0PWwVCSp3O0wS6FvNr6xfBCHgt0m1tvPLFOCc2iFDKTRAXhB7m8klDf7ErowFH8POa6dVdGatKU5I1YYwzUyg==} + http-proxy-agent@7.0.2: resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} engines: {node: '>= 14'} @@ -7245,18 +8339,37 @@ packages: resolution: {integrity: sha512-S9wWkJ/VSY9/k4qcjG318bqJNruzE4HySUhFYknwmu6LBP97KLLfwNf+n4V1BHurvFNkSKLFnK/RsuUnRTf9Vw==} engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + http-signature@1.2.0: + resolution: {integrity: sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==} + engines: {node: '>=0.8', npm: '>=1.3.7'} + + http2-wrapper@1.0.3: + resolution: {integrity: sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==} + engines: {node: '>=10.19.0'} + http2-wrapper@2.2.1: resolution: {integrity: sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==} engines: {node: '>=10.19.0'} + https-proxy-agent@5.0.1: + resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} + engines: {node: '>= 6'} + https-proxy-agent@7.0.4: resolution: {integrity: sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==} 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@4.3.1: + resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==} + engines: {node: '>=14.18.0'} + human-signals@5.0.0: resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} engines: {node: '>=16.17.0'} @@ -7264,9 +8377,15 @@ packages: i18next-browser-languagedetector@7.1.0: resolution: {integrity: sha512-cr2k7u1XJJ4HTOjM9GyOMtbOA47RtUoWRAtt52z43r3AoMs2StYKyjS3URPhzHaf+mn10hY9dZWamga5WPQjhA==} + i18next-browser-languagedetector@7.2.0: + resolution: {integrity: sha512-U00DbDtFIYD3wkWsr2aVGfXGAj2TgnELzOX9qv8bT0aJtvPV9CRO77h+vgmHFBMe7LAxdwvT/7VkCWGya6L3tA==} + i18next@22.5.1: resolution: {integrity: sha512-8TGPgM3pAD+VRsMtUMNknRz3kzqwp/gPALrWMsDnmC1mKqJwpWyooQRLMcbTwq8z8YwSmuj+ZYvc+xCuEpkssA==} + i18next@23.11.5: + resolution: {integrity: sha512-41pvpVbW9rhZPk5xjCX2TPJi2861LEig/YRhUkY+1FQ2IQPS0bKUDYnEqY8XPPbB48h1uIwLnP9iiEfuSl20CA==} + iconv-lite@0.4.24: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} @@ -7278,6 +8397,10 @@ packages: idb-keyval@6.2.1: resolution: {integrity: sha512-8Sb3veuYCyrZL+VBt9LJfZjLUPWVvqn8tG28VqYNFCo43KHcKuq+b4EiXGeuaLAQWL2YmyDgMp2aSpH9JHsEQg==} + 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==} @@ -7289,6 +8412,10 @@ packages: resolution: {integrity: sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==} engines: {node: '>= 4'} + ignore@5.3.0: + resolution: {integrity: sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==} + engines: {node: '>= 4'} + ignore@5.3.1: resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} engines: {node: '>= 4'} @@ -7298,6 +8425,12 @@ packages: engines: {node: '>=16.x'} hasBin: true + immediate@3.0.6: + resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} + + immutable@4.3.7: + resolution: {integrity: sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==} + import-fresh@2.0.0: resolution: {integrity: sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg==} engines: {node: '>=4'} @@ -7306,6 +8439,9 @@ packages: resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} engines: {node: '>=6'} + import-meta-resolve@4.0.0: + resolution: {integrity: sha512-okYUR7ZQPH+efeuMJGlq4f8ubUgO50kByRPyt/Cy1Io4PSRsPjxME+YlVaCOx+NIToW7hCsZNFJyTPFFKepRSA==} + import-meta-resolve@4.1.0: resolution: {integrity: sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==} @@ -7319,6 +8455,7 @@ packages: inflight@1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} @@ -7346,18 +8483,25 @@ packages: interface-store@5.1.8: resolution: {integrity: sha512-7na81Uxkl0vqk0CBPO5PvyTkdaJBaezwUJGsMOz7riPOq0rJt+7W31iaopaMICWea/iykUsvNlPx/Tc+MxC3/w==} - internal-slot@1.0.7: - resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} + internal-slot@1.0.6: + resolution: {integrity: sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==} engines: {node: '>= 0.4'} - intl-messageformat@10.5.12: - resolution: {integrity: sha512-izl0uxhy/melhw8gP2r8pGiVieviZmM4v5Oqx3c1/R7g9cwER2smmGfSjcIsp8Y3Q53bfciL/gkxacJRx/dUvg==} + intl-messageformat@10.5.11: + resolution: {integrity: sha512-eYq5fkFBVxc7GIFDzpFQkDOZgNayNTQn4Oufe8jw6YY6OHVw70/4pA3FyCsQ0Gb2DnvEJEMmN2tOaXUGByM+kg==} invariant@2.2.4: resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} - ip@2.0.1: - resolution: {integrity: sha512-lJUL9imLTNi1ZfXT+DU6rBBdbiKGBuay9B6xGSPVjUeQwaH1RIGqef8RZkUtHioLmSNpPR5M4HVKJGm1j8FWVQ==} + io-ts@1.10.4: + resolution: {integrity: sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g==} + + ioredis@5.3.2: + resolution: {integrity: sha512-1DKMMzlIHM02eBBVOFQ1+AolGjs6+xEcM4PDL7NqOS6szq7H9jSaEkIUH6/a5Hl241LzW6JLSiAbNvTQjUupUA==} + engines: {node: '>=12.22.0'} + + ip@1.1.9: + resolution: {integrity: sha512-cyRxvOEpNHNtchU3Ln9KC/auJgup87llfQpQ+t5ghoC/UhL16SWzbueiCsdTnWmqAWl7LadfuwhlqmtOaqMHdQ==} ipaddr.js@1.9.1: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} @@ -7386,8 +8530,8 @@ packages: resolution: {integrity: sha512-zIaiEGX18QATxgaS0/EOQNoo33W0islREABAcxXE8n7y2MGAlB+hdsxXn4J0hGZge8IqVQhW8sWIb+oJz2yEvg==} engines: {node: '>=16.0.0', npm: '>=7.0.0'} - iron-webcrypto@1.1.1: - resolution: {integrity: sha512-5xGwQUWHQSy039rFr+5q/zOmj7GP0Ypzvo34Ep+61bPIhaLduEDp/PvLGlU3awD2mzWUR0weN2vJ1mILydFPEg==} + iron-webcrypto@1.0.0: + resolution: {integrity: sha512-anOK1Mktt8U1Xi7fCM3RELTuYbnFikQY5VtrDj7kPgpejV7d43tWKhzgioO0zpkazLEL/j/iayRqnJhrGfqUsg==} is-absolute-url@4.0.1: resolution: {integrity: sha512-/51/TKE88Lmm7Gc4/8btclNXWS+g50wXhYJq8HWIBAGUBnoAdRu1aXeh364t/O7wXDAcTJDP8PNuNKWUDWie+A==} @@ -7403,9 +8547,8 @@ packages: resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} engines: {node: '>= 0.4'} - is-array-buffer@3.0.4: - resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} - engines: {node: '>= 0.4'} + is-array-buffer@3.0.2: + resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} @@ -7436,11 +8579,8 @@ packages: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} engines: {node: '>= 0.4'} - is-core-module@2.13.1: - resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} - - is-data-view@1.0.1: - resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} + is-core-module@2.14.0: + resolution: {integrity: sha512-a5dFJih5ZLYlRtDc0dZWP7RiKr6xIKzmn/oAYCDvdLThadVgyJwlaoQPmRtMSpz+rk0OGAgIu+TcM9HUF0fk1A==} engines: {node: '>= 0.4'} is-date-object@1.0.5: @@ -7450,9 +8590,6 @@ packages: is-decimal@2.0.1: resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} - is-deflate@1.0.0: - resolution: {integrity: sha512-YDoFpuZWu1VRXlsnlYMzKyVRITXj7Ej/V9gXQ2/pAe7X1J7M/RNOqaIYi6qUn+B7nGyB9pDXrv02dsB58d2ZAQ==} - is-directory@0.3.1: resolution: {integrity: sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw==} engines: {node: '>=0.10.0'} @@ -7486,6 +8623,9 @@ packages: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} + is-function@1.0.2: + resolution: {integrity: sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==} + is-generator-function@1.0.10: resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} engines: {node: '>= 0.4'} @@ -7494,10 +8634,6 @@ packages: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} - is-gzip@1.0.0: - resolution: {integrity: sha512-rcfALRIb1YewtnksfRIHGcIY93QnK8BIQ/2c9yDYcG/Y6+vRoJuTWBmmSEbyLLYtXm7q35pHOHbZFQBaLrhlWQ==} - 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'} @@ -7518,16 +8654,8 @@ packages: resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==} engines: {node: '>=12'} - is-map@2.0.3: - resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} - engines: {node: '>= 0.4'} - - is-nan@1.3.2: - resolution: {integrity: sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==} - engines: {node: '>= 0.4'} - - is-negative-zero@2.0.3: - resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} + is-negative-zero@2.0.2: + resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} engines: {node: '>= 0.4'} is-number-object@1.0.7: @@ -7538,10 +8666,6 @@ packages: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} - is-path-cwd@2.2.0: - resolution: {integrity: sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==} - engines: {node: '>=6'} - is-path-inside@3.0.3: resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} engines: {node: '>=8'} @@ -7571,13 +8695,8 @@ packages: resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} engines: {node: '>= 0.4'} - is-set@2.0.3: - resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} - engines: {node: '>= 0.4'} - - is-shared-array-buffer@1.0.3: - resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} - engines: {node: '>= 0.4'} + 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==} @@ -7591,14 +8710,21 @@ packages: 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.13: - resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} + 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'} @@ -7611,16 +8737,12 @@ packages: resolution: {integrity: sha512-FRdAyx5lusK1iHG0TWpVtk9+1i+GjrzRffhDg4ovQ7mcidMQ6mj+MhKPmvh7Xwyv5gIS06ns49CA7Sqg7lC22Q==} engines: {node: '>=18'} - is-weakmap@2.0.2: - resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} - engines: {node: '>= 0.4'} - is-weakref@1.0.2: resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} - is-weakset@2.0.3: - resolution: {integrity: sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==} - engines: {node: '>= 0.4'} + is-windows@1.0.2: + resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} + engines: {node: '>=0.10.0'} is-wsl@1.1.0: resolution: {integrity: sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==} @@ -7672,6 +8794,9 @@ packages: peerDependencies: ws: '*' + isstream@0.1.2: + resolution: {integrity: sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==} + istanbul-lib-coverage@3.2.2: resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} engines: {node: '>=8'} @@ -7680,8 +8805,8 @@ packages: resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} engines: {node: '>=10'} - istanbul-lib-source-maps@5.0.4: - resolution: {integrity: sha512-wHOoEsNJTVltaJp8eVkm8w+GVkVNHT2YDYo53YdzQEL2gWm1hBX5cGFR9hQJtuGLebidVX7et3+dmDZrmclduw==} + istanbul-lib-source-maps@5.0.5: + resolution: {integrity: sha512-gKf4eJ8bHmSX/ljiOCpnd8vtmHTwG71uugm0kXYd5aqFCl6z8cj8k7QduXSwU6QOst6LCdSXTlaoc8W4554crQ==} engines: {node: '>=10'} istanbul-reports@3.1.7: @@ -7728,14 +8853,13 @@ packages: it-to-stream@1.0.0: resolution: {integrity: sha512-pLULMZMAB/+vbdvbZtebC0nWBTbG581lk6w8P7DfIIIKUfa8FbY7Oi0FxZcFPbxvISs7A9E+cMpLDBc1XhpAOA==} - jackspeak@2.3.6: - resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} + jackspeak@3.4.0: + resolution: {integrity: sha512-JVYhQnN59LVPFCEcVa2C3CrEKYacvjRfqIQl+h8oi91aLYQVWRYbxjPcv1bUiUy/kLmQaANrYfNMCO3kuEDHfw==} engines: {node: '>=14'} - jake@10.9.1: - resolution: {integrity: sha512-61btcOHNnLnsOdtLgA5efqQWjnSi/vow5HbI7HMdKKWqvrKR1bLK3BPlJn9gcSaP2ewuamUSMB5XEy76KUIS2w==} - engines: {node: '>=10'} - hasBin: true + jackspeak@4.0.1: + resolution: {integrity: sha512-cub8rahkh0Q/bw1+GxP7aeSe29hHHn2V4m29nnDlvCdlgU+3UGxkZp7Z53jLUdpX3jdTO0nJZUDl3xvbWc2Xog==} + engines: {node: 20 || >=22} jest-diff@29.7.0: resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} @@ -7773,12 +8897,18 @@ packages: resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jiti@1.21.0: - resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==} + jiti@1.21.6: + resolution: {integrity: sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==} hasBin: true - joi@17.13.1: - resolution: {integrity: sha512-vaBlIKCyo4FCUtCm7Eu4QZd/q02bWcxfUO6YSXAZOWF6gzcLBeba8kwotUdYJjDLW8Cz8RywsSOqiNJZW0mNvg==} + joi@17.12.1: + resolution: {integrity: sha512-vtxmq+Lsc5SlfqotnfVjlViWfOL9nt/avKNbKYizwf6gsCfq9NYY/ceYRMFD8XDdrjJ9abJyScWmhmIiy+XRtQ==} + + js-cookie@2.2.1: + resolution: {integrity: sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==} + + js-sha3@0.5.7: + resolution: {integrity: sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g==} js-sha3@0.8.0: resolution: {integrity: sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==} @@ -7786,8 +8916,8 @@ packages: js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - js-tokens@9.0.0: - resolution: {integrity: sha512-WriZw1luRMlmV3LGJaR6QOJjWwgLUTf89OwT2lUOyjX2dJGBwgmIkbcz+7WFZjrZM635JOIR517++e/67CP9dQ==} + js-tokens@8.0.3: + resolution: {integrity: sha512-UfJMcSJc+SEXEl9lH/VLHSZbThQyLpw1vLO1Lb+j4RWDvG3N2f7yj3PVQA3cmkTBNldJ9eFnM+xEXxHIXrYiJw==} js-yaml@3.14.1: resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} @@ -7797,6 +8927,9 @@ packages: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true + jsbn@0.1.1: + resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==} + jsc-android@250231.0.0: resolution: {integrity: sha512-rS46PvsjYmdmuz1OAWXY/1kCYG7pnf1TBqeTiOJr1iDz7s5DLxxC9n/ZMknLDxzYzNVfI7R95MH10emSSG1Wuw==} @@ -7809,15 +8942,6 @@ packages: peerDependencies: '@babel/preset-env': ^7.1.6 - jscodeshift@0.15.2: - resolution: {integrity: sha512-FquR7Okgmc4Sd0aEDwqho3rEiKR3BdvuG9jfdHjLJ6JQoWSMpavug3AoIfnfWhxFlf+5pzQh8qjqz0DWFrNQzA==} - hasBin: true - peerDependencies: - '@babel/preset-env': ^7.1.6 - peerDependenciesMeta: - '@babel/preset-env': - optional: true - jsdom@24.0.0: resolution: {integrity: sha512-UDS2NayCvmXSXVP6mpTj+73JnNQadZlr9N68189xib2tx5Mls7swlTNao26IoHv46BZJFvXygyRtyXd1feAk1A==} engines: {node: '>=18'} @@ -7849,6 +8973,10 @@ packages: resolution: {integrity: sha512-NEdLrtrq1jUZyfjkr9OCz9EzCNhnRyWtt1PAnvnhwy6e8XETS0Dtc+ZNCO2gvuAoKsIn2+vCSowXTYE4CkgnAQ==} engines: {node: '>=10.0.0'} + json-rpc-middleware-stream@4.2.3: + resolution: {integrity: sha512-4iFb0yffm5vo3eFKDbQgke9o17XBcLQ2c3sONrXSbcOLzP8LTojqo8hRGVgtJShhm5q4ZDSNq039fAx9o65E1w==} + engines: {node: '>=14.0.0'} + json-rpc-random-id@1.0.1: resolution: {integrity: sha512-RJ9YYNCkhVDBuP4zN5BBtYAzEl03yq/jIIsyif0JY9qyJuQQZNeDK7anAPKKlyEtLSj2s8h6hNh2F8zO5q7ScA==} @@ -7858,9 +8986,19 @@ packages: json-schema-traverse@1.0.0: resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + json-schema@0.4.0: + resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} + json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + json-stream-stringify@3.1.6: + resolution: {integrity: sha512-x7fpwxOkbhFCaJDJ8vb1fBY3DdSa4AlITaz+HHILQJzdPMnHEFjxPwVUi1ALIbcIxDE0PNe/0i7frnY8QnBQog==} + engines: {node: '>=7.10.1'} + + json-stringify-safe@5.0.1: + resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + json-to-ast@2.1.0: resolution: {integrity: sha512-W9Lq347r8tA1DfMvAGn9QNcgYm4Wm7Yc+k8e6vezpMnRT+NHbtlxgNBXRVjXe9YM6eTn6+p/MKOlV/aABJcSnQ==} engines: {node: '>= 4'} @@ -7877,6 +9015,9 @@ packages: jsonc-parser@2.3.1: resolution: {integrity: sha512-H8jvkz1O50L3dMZCsLqiuB2tA7muqbSg1AtGEkN0leAqGjsUzDJir3Zwr02BhqdcITPg3ei3mZ+HjMocAknhhg==} + jsonc-parser@3.2.0: + resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} + jsonfile@4.0.0: resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} @@ -7887,6 +9028,16 @@ packages: resolution: {integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==} engines: {node: '>=0.10.0'} + jsprim@1.4.2: + resolution: {integrity: sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==} + engines: {node: '>=0.6.0'} + + jszip@3.10.1: + resolution: {integrity: sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==} + + keccak256@1.0.6: + resolution: {integrity: sha512-8GLiM01PkdJVGUhR1e6M/AvWnSqYS0HaERI+K/QtStGDGlSTx2B1zTqZk4Zlqu5TxHJNTxWAdP9Y+WI50OApUw==} + keccak@3.0.4: resolution: {integrity: sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q==} engines: {node: '>=10.0.0'} @@ -7909,59 +9060,55 @@ packages: resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} engines: {node: '>=6'} - known-css-properties@0.30.0: - resolution: {integrity: sha512-VSWXYUnsPu9+WYKkfmJyLKtIvaRJi1kXUqVmBACORXZQxT5oZDsoZ2vQP+bQFDnWtpI/4eq3MLoRMjI2fnLzTQ==} + known-css-properties@0.34.0: + resolution: {integrity: sha512-tBECoUqNFbyAY4RrbqsBQqDFpGXAEbdD5QKr8kACx3+rnArmuuR22nKQWKazvp07N9yjTyDZaw/20UIH8tL9DQ==} latest-version@7.0.0: resolution: {integrity: sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==} engines: {node: '>=14.16'} - lazy-universal-dotenv@4.0.0: - resolution: {integrity: sha512-aXpZJRnTkpK6gQ/z4nk+ZBLd/Qdp118cvPruLSIQzQNRhKwEcdXCOzXuF55VDqIiuAaY3UGZ10DJtvZzDcvsxg==} - engines: {node: '>=14.0.0'} - lefthook-darwin-arm64@1.6.10: resolution: {integrity: sha512-Hh11OkoKG7FEOByS1dcgNV7ETq45VmwBbw0VPTiBznyfOG4k+pi0fIdc1qbmbxvYqNE0r420QR/Q3bimaa4Kxg==} cpu: [arm64] os: [darwin] - lefthook-darwin-x64@1.6.10: - resolution: {integrity: sha512-FiOB0t5OBcQ8OnG/LSdfUYj736SJdlLjWuOZ4wTlJ7EUrHditieap6VNAxwMmFVyQN0X2ZwKWytwY35y+Hflhw==} + lefthook-darwin-x64@1.6.18: + resolution: {integrity: sha512-qwKa+PaNIYjZ2PVrRRLq+HjNjQsjEItXN21byvSD89r7EYCULsIC8aW4H6aniOP2A6X1DIZ+djpg+3hNJ/94NA==} cpu: [x64] os: [darwin] - lefthook-freebsd-arm64@1.6.10: - resolution: {integrity: sha512-IxGgS3RrNwk3Kr83o5SQhGxqppQi7fu2t//nsp6ocgnJeStrTtXZJOrel2VohzrFxpzQdJVXBGgUGLXtY8t8qw==} + lefthook-freebsd-arm64@1.6.18: + resolution: {integrity: sha512-UIOzQ+okwB7Ah9p8sNqomOiU6cPfmJnyW3HDPutRsdoHRD8udIap9d+ja4Kg4m/PkoYtkcLO78omANqAgA5wxQ==} cpu: [arm64] os: [freebsd] - lefthook-freebsd-x64@1.6.10: - resolution: {integrity: sha512-sFSe+dGLa4iBblWAhAGTP9moarcbFtFAH6aaCeyqSX51O6p9VPdGjqNtcE8aGbGAk4lO6v1ScRjk5ogMSinJwQ==} + lefthook-freebsd-x64@1.6.18: + resolution: {integrity: sha512-UQANUgyNpaAh0+2/PjPFiJ7yd6aF15yyJxKZCXyna5cQF7VU8pSHu5tiDDquNpjToXOg+6TmiIAJKyfrrwTF3w==} cpu: [x64] os: [freebsd] - lefthook-linux-arm64@1.6.10: - resolution: {integrity: sha512-fXnKiNdRIW+FRvc1keVrvWX5EqIhVFfPjcy+PbsKdxiWRXgjtidi6LPmQ8eosH0DC9PxZ0mpdCMf40FHEZLbQA==} + lefthook-linux-arm64@1.6.18: + resolution: {integrity: sha512-4erletIa2HKUgY17/1ROvndAj6xn/9wkqO2GhBT3C0vFwIv6ycy5wpFzXOwKRZpFYv7UacN7iXhAZSK+vSOZZg==} cpu: [arm64] os: [linux] - lefthook-linux-x64@1.6.10: - resolution: {integrity: sha512-bm6l2GOFnmYreZxmHb47QeOiFAItttOOxvCEX1okIRD7JbUC+lGC9evW5GJv/ltjZBoTDYEtQAUa+BpHTGuY2A==} + lefthook-linux-x64@1.6.18: + resolution: {integrity: sha512-l5SRqYMYygw9RjZncEg8uh29wShYN8kiYr53sp74DkntrlCttqWhLILBUlIr3fxH5s0ZyrmqUEjtMBryMk7b/g==} cpu: [x64] os: [linux] - lefthook-windows-arm64@1.6.10: - resolution: {integrity: sha512-pFxT8KbOMzGxj6cz4glHYwQSNC7XCuy9RDqIO0AxPlpATsCpapkF4ngDxBT1iFv2VhdeweMa7RXUDsMAGQA4Qw==} + lefthook-windows-arm64@1.6.18: + resolution: {integrity: sha512-jeNBRoya3+mOEsKyT4wXf29Kng1nkJD7Uv/dqGBszoGMktGVNUFdIjWoxx6HSfhUssucs5pKRZpXSMgK/KCP+Q==} cpu: [arm64] os: [win32] - lefthook-windows-x64@1.6.10: - resolution: {integrity: sha512-fcDnUSTv95AdLvm0NIrn3jBWXuRq8SlbDDjkkB5OHLiSmjz4eOr6wyD7xceDp33zZgZmWFzHebJngxxcIaUuHw==} + lefthook-windows-x64@1.6.18: + resolution: {integrity: sha512-iEG8PbFOwMqlpAgCiqzANTxutERjwlwMx6WF6HDGEYwFJSCJsvi06TehDxaPIFbhmLLYYlbVrfSBlttWGoN0dg==} cpu: [x64] os: [win32] - lefthook@1.6.10: - resolution: {integrity: sha512-HeVjsDCrHLe9htQHbLuQJu2YdLK6Tl5bh36fOpmXqckEXTI0BDR0Y5JYc7G5Inj4YXQsc51a9dUDZMeniSnSag==} + lefthook@1.6.18: + resolution: {integrity: sha512-Ftr/NkU1P1EsEyphsCqCX7lesGZA+QDXyUx4dS1RlSKB72xKtGW9VPjbGLK2kSQkONG5M+XYfbJkGA/r9NLTYQ==} hasBin: true leven@3.1.0: @@ -7972,6 +9119,9 @@ packages: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} + lie@3.3.0: + resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} + lighthouse-logger@1.4.2: resolution: {integrity: sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g==} @@ -7979,28 +9129,28 @@ packages: resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} engines: {node: '>=10'} - lilconfig@3.1.1: - resolution: {integrity: sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==} + lilconfig@3.1.2: + resolution: {integrity: sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==} engines: {node: '>=14'} lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - listhen@1.7.2: - resolution: {integrity: sha512-7/HamOm5YD9Wb7CFgAZkKgVPA96WwhcTQoqtm2VTZGVbVVn3IWKRBTgrU7cchA3Q8k9iCsG8Osoi9GX4JsGM9g==} + listhen@1.6.0: + resolution: {integrity: sha512-z0RcEXVX5oTpY1bO02SKoTU/kmZSrFSngNNzHRM6KICR17PTq7ANush6AE6ztGJwJD4RLpBrVHd9GnV51J7s3w==} hasBin: true lit-element@3.3.3: resolution: {integrity: sha512-XbeRxmTHubXENkV4h8RIPyr8lXc+Ff28rkcQzw3G6up2xg5E8Zu1IgOWIwBLEQsu3cOVFqdYwiVi0hv0SlpqUA==} - lit-element@4.0.5: - resolution: {integrity: sha512-iTWskWZEtn9SyEf4aBG6rKT8GABZMrTWop1+jopsEOgEcugcXJGKuX5bEbkq9qfzY+XB4MAgCaSPwnNpdsNQ3Q==} + lit-element@4.0.4: + resolution: {integrity: sha512-98CvgulX6eCPs6TyAIQoJZBCQPo80rgXR+dVBs61cstJXqtI+USQZAbA4gFHh6L/mxBx9MrgPLHLsUgDUHAcCQ==} lit-html@2.8.0: resolution: {integrity: sha512-o9t+MQM3P4y7M7yNzqAyjp7z+mQGa4NS4CxiyLqFPyFWyc4O+nodLrkrxSaCTrla6M5YOLaT3RpbbqjszB5g3Q==} - lit-html@3.1.3: - resolution: {integrity: sha512-FwIbqDD8O/8lM4vUZ4KvQZjPPNx7V1VhT7vmRB8RBAO0AU6wuTVdoXiu2CivVjEGdugvcbPNBLtPE1y0ifplHA==} + lit-html@3.1.2: + resolution: {integrity: sha512-3OBZSUrPnAHoKJ9AMjRL/m01YJxQMf+TMHanNtTHG68ubjnZxK0RFl102DPzsw4mWnHibfZIBJm3LWCZ/LmMvg==} lit@2.8.0: resolution: {integrity: sha512-4Sc3OFX9QHOJaHbmTMk28SYgVxLN3ePDjg7hofEft2zWlehFL3LiAuapWc4U/kYwMYJSh2hTCPZ6/LIC7ii0MA==} @@ -8023,6 +9173,10 @@ packages: locate-character@3.0.0: resolution: {integrity: sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==} + locate-path@2.0.0: + resolution: {integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==} + engines: {node: '>=4'} + locate-path@3.0.0: resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} engines: {node: '>=6'} @@ -8042,12 +9196,21 @@ packages: lodash.debounce@4.0.8: resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + lodash.defaults@4.2.0: + resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==} + + lodash.isarguments@3.1.0: + resolution: {integrity: sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==} + lodash.isequal@4.5.0: resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + lodash.startcase@4.4.0: + resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} + lodash.throttle@4.1.1: resolution: {integrity: sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==} @@ -8089,23 +9252,44 @@ packages: loupe@2.3.7: resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} + loupe@3.1.1: + resolution: {integrity: sha512-edNu/8D5MKVfGVFRhFf8aAxiTM6Wumfz5XsaatSxlD3w4R1d/WEKUTydCdPGbl9K7QG/Ca3GnDV2sIKIpXRQcw==} + lower-case@2.0.2: resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} + lowercase-keys@2.0.0: + resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} + engines: {node: '>=8'} + lowercase-keys@3.0.0: resolution: {integrity: sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - lru-cache@10.2.2: - resolution: {integrity: sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==} + lru-cache@10.2.0: + resolution: {integrity: sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==} engines: {node: 14 || >=16.14} + lru-cache@11.0.1: + resolution: {integrity: sha512-CgeuL5uom6j/ZVrg7G/+1IXqRY8JXX4Hghfy5YE0EhoYQWvndP1kufu58cmZLNIDKnRhZrXfdS9urVWx98AipQ==} + engines: {node: 20 || >=22} + + 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-queue@0.1.0: resolution: {integrity: sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==} + lru_map@0.3.3: + resolution: {integrity: sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==} + lz-string@1.5.0: resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} hasBin: true @@ -8113,8 +9297,22 @@ packages: magic-string@0.30.10: resolution: {integrity: sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==} - magicast@0.3.4: - resolution: {integrity: sha512-TyDF/Pn36bBji9rWKHlZe+PZb6Mx5V8IHCSxk7X4aljM4e/vyDvZZYwHewdVaqiA0nb3ghfHU/6AUpDxWoER2Q==} + magic-string@0.30.11: + resolution: {integrity: sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==} + + magic-string@0.30.7: + resolution: {integrity: sha512-8vBuFF/I/+OSLRmdf2wwFCJCz+nSn0m6DPvGH1fS/KiQoSaR+sETbov0eIk9KhEKy8CYqIkIAnbohxT/4H0kuA==} + engines: {node: '>=12'} + + magic-string@0.30.9: + resolution: {integrity: sha512-S1+hd+dIrC8EZqKyT9DstTH/0Z+f76kmmvZnkfQVmOpDEF9iVgdYif3Q/pIWHmCoo59bQVGW0kVL3e2nl+9+Sw==} + engines: {node: '>=12'} + + magicast@0.3.3: + resolution: {integrity: sha512-ZbrP1Qxnpoes8sz47AM0z08U+jW6TyRgZzcWy3Ma3vDhJttwMwAFDMMQFobwdBxByBD46JYmxRzeF7w2+wJEuw==} + + magicast@0.3.5: + resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==} make-dir@2.1.0: resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} @@ -8144,8 +9342,8 @@ packages: markdown-table@3.0.3: resolution: {integrity: sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==} - markdown-to-jsx@7.3.2: - resolution: {integrity: sha512-B+28F5ucp83aQm+OxNrPkS8z0tMKaeHiy0lHJs3LqCyDQFtWuenaIrkaVTgAm1pf1AU85LXltva86hlaT17i8Q==} + markdown-to-jsx@7.5.0: + resolution: {integrity: sha512-RrBNcMHiFPcz/iqIj0n3wclzHXjwS7mzjBNWecKKVhNTIxQepIix6Il/wZCn2Cg5Y1ow2Qi84+eJrryFRWBEWw==} engines: {node: '>= 10'} peerDependencies: react: '>= 0.14.0' @@ -8165,8 +9363,8 @@ packages: mdast-util-find-and-replace@3.0.1: resolution: {integrity: sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA==} - mdast-util-from-markdown@2.0.0: - resolution: {integrity: sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA==} + mdast-util-from-markdown@2.0.1: + resolution: {integrity: sha512-aJEUyzZ6TzlsX2s5B4Of7lN7EQtAxvtradMMglCQDyaTFgse6CmtmdJ15ElnVRlCg1vpNyVtbem0PWzlNieZsA==} mdast-util-gfm-autolink-literal@2.0.0: resolution: {integrity: sha512-FyzMsduZZHSc3i0Px3PQcBT4WJY/X/RCtEJKuybiC6sjPqLv7h1yqAkmILZtuxMSsUyaLUWNp71+vQH2zqp5cg==} @@ -8201,8 +9399,8 @@ packages: mdast-util-phrasing@4.1.0: resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} - mdast-util-to-hast@13.1.0: - resolution: {integrity: sha512-/e2l/6+OdGp/FB+ctrJ9Avz71AN/GRH3oi/3KAx/kMnoUsD6q0woXlDT8lLEeViVKE7oZxE7RXzvO3T8kF2/sA==} + mdast-util-to-hast@13.2.0: + resolution: {integrity: sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==} mdast-util-to-markdown@2.1.0: resolution: {integrity: sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==} @@ -8220,8 +9418,9 @@ packages: memoize-one@5.2.1: resolution: {integrity: sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==} - memoizee@0.4.15: - resolution: {integrity: sha512-UBWmJpLZd5STPm7PMUlOw/TSy972M+z8gcyQ5veOnSDRREz/0bmpyTfKt3/51DhEBqCZQn1udM/5flcSPYhkdQ==} + memoizee@0.4.17: + resolution: {integrity: sha512-DGqD7Hjpi/1or4F/aYAspXKNm5Yili0QDAFAY4QYvpqpgiY6+1jOfqpmByzjxbWd/T9mChbCArXAbDAsTm5oXA==} + engines: {node: '>=0.12'} memoizerific@1.11.3: resolution: {integrity: sha512-/EuHYwAPdLtXwAwSZkh/Gutery6pD2KYd44oQLhAvQp/50mpyduZh8Q7PYHXTCJ+wuXxt7oij2LXyIJOOYFPog==} @@ -8230,8 +9429,8 @@ packages: resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==} engines: {node: '>= 0.10.0'} - merge-descriptors@1.0.1: - resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} + merge-descriptors@1.0.3: + resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==} merge-options@3.0.4: resolution: {integrity: sha512-2Sug1+knBjkaMsMgf1ctR1Ujx+Ayku4EdJN4Z+C2+JzoeF7A3OZ9KM2GY0CpQS51NR61LTurMJrRKPhSs3ZRTQ==} @@ -8244,69 +9443,69 @@ packages: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} - merkletreejs@0.3.11: - resolution: {integrity: sha512-LJKTl4iVNTndhL+3Uz/tfkjD0klIWsHlUzgtuNnNrsf7bAlXR30m+xYB7lHr5Z/l6e/yAIsr26Dabx6Buo4VGQ==} + merkletreejs@0.4.0: + resolution: {integrity: sha512-a48Ta5kWiVNBgeEbZVMm6FB1hBlp6vEuou/XnZdlkmd2zq6NZR6Sh2j+kR1B0iOZIXrTMcigBYzZ39MLdYhm1g==} engines: {node: '>= 7.6.0'} methods@1.1.2: resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} engines: {node: '>= 0.6'} - metro-babel-transformer@0.80.9: - resolution: {integrity: sha512-d76BSm64KZam1nifRZlNJmtwIgAeZhZG3fi3K+EmPOlrR8rDtBxQHDSN3fSGeNB9CirdTyabTMQCkCup6BXFSQ==} + metro-babel-transformer@0.80.6: + resolution: {integrity: sha512-ssuoVC4OzqaOt3LpwfUbDfBlFGRu9v1Yf2JJnKPz0ROYHNjSBws4aUesqQQ/Ea8DbiH7TK4j4cJmm+XjdHmgqA==} engines: {node: '>=18'} - metro-cache-key@0.80.9: - resolution: {integrity: sha512-hRcYGhEiWIdM87hU0fBlcGr+tHDEAT+7LYNCW89p5JhErFt/QaAkVx4fb5bW3YtXGv5BTV7AspWPERoIb99CXg==} + metro-cache-key@0.80.6: + resolution: {integrity: sha512-DFmjQacC8m/S3HpELklLMWkPGP/fZPX3BSgjd0xQvwIvWyFwk8Nn/lfp/uWdEVDtDSIr64/anXU5uWohGwlWXw==} engines: {node: '>=18'} - metro-cache@0.80.9: - resolution: {integrity: sha512-ujEdSI43QwI+Dj2xuNax8LMo8UgKuXJEdxJkzGPU6iIx42nYa1byQ+aADv/iPh5sh5a//h5FopraW5voXSgm2w==} + metro-cache@0.80.6: + resolution: {integrity: sha512-NP81pHSPkzs+iNlpVkJqijrpcd6lfuDAunYH9/Rn8oLNz0yLfkl8lt+xOdUU4IkFt3oVcTBEFCnzAzv4B8YhyA==} engines: {node: '>=18'} - metro-config@0.80.9: - resolution: {integrity: sha512-28wW7CqS3eJrunRGnsibWldqgwRP9ywBEf7kg+uzUHkSFJNKPM1K3UNSngHmH0EZjomizqQA2Zi6/y6VdZMolg==} + metro-config@0.80.6: + resolution: {integrity: sha512-vHYYvJpRTWYbmvqlR7i04xQpZCHJ6yfZ/xIcPdz2ssbdJGGJbiT1Aar9wr8RAhsccSxdJgfE5B1DB8Mo+DnhIg==} engines: {node: '>=18'} - metro-core@0.80.9: - resolution: {integrity: sha512-tbltWQn+XTdULkGdzHIxlxk4SdnKxttvQQV3wpqqFbHDteR4gwCyTR2RyYJvxgU7HELfHtrVbqgqAdlPByUSbg==} + metro-core@0.80.6: + resolution: {integrity: sha512-fn4rryTUAwzFJWj7VIPDH4CcW/q7MV4oGobqR6NsuxZoIGYrVpK7pBasumu5YbCqifuErMs5s23BhmrDNeZURw==} engines: {node: '>=18'} - metro-file-map@0.80.9: - resolution: {integrity: sha512-sBUjVtQMHagItJH/wGU9sn3k2u0nrCl0CdR4SFMO1tksXLKbkigyQx4cbpcyPVOAmGTVuy3jyvBlELaGCAhplQ==} + metro-file-map@0.80.6: + resolution: {integrity: sha512-S3CUqvpXpc+q3q+hCEWvFKhVqgq0VmXdZQDF6u7ue86E2elq1XLnfLOt9JSpwyhpMQRyysjSCnd/Yh6GZMNHoQ==} engines: {node: '>=18'} - metro-minify-terser@0.80.9: - resolution: {integrity: sha512-FEeCeFbkvvPuhjixZ1FYrXtO0araTpV6UbcnGgDUpH7s7eR5FG/PiJz3TsuuPP/HwCK19cZtQydcA2QrCw446A==} + metro-minify-terser@0.80.6: + resolution: {integrity: sha512-83eZaH2+B+jP92KuodPqXknzwmiboKAuZY4doRfTEEXAG57pNVNN6cqSRJlwDnmaTBKRffxoncBXbYqHQgulgg==} engines: {node: '>=18'} - metro-resolver@0.80.9: - resolution: {integrity: sha512-wAPIjkN59BQN6gocVsAvvpZ1+LQkkqUaswlT++cJafE/e54GoVkMNCmrR4BsgQHr9DknZ5Um/nKueeN7kaEz9w==} + metro-resolver@0.80.6: + resolution: {integrity: sha512-R7trfglG4zY4X9XyM9cvuffAhQ9W1reWoahr1jdEWa6rOI8PyM0qXjcsb8l+fsOQhdSiVlkKcYAmkyrs1S/zrA==} engines: {node: '>=18'} - metro-runtime@0.80.9: - resolution: {integrity: sha512-8PTVIgrVcyU+X/rVCy/9yxNlvXsBCk5JwwkbAm/Dm+Abo6NBGtNjWF0M1Xo/NWCb4phamNWcD7cHdR91HhbJvg==} + metro-runtime@0.80.6: + resolution: {integrity: sha512-21GQVd0pp2nACoK0C2PL8mBsEhIFUFFntYrWRlYNHtPQoqDzddrPEIgkyaABGXGued+dZoBlFQl+LASlmmfkvw==} engines: {node: '>=18'} - metro-source-map@0.80.9: - resolution: {integrity: sha512-RMn+XS4VTJIwMPOUSj61xlxgBvPeY4G6s5uIn6kt6HB6A/k9ekhr65UkkDD7WzHYs3a9o869qU8tvOZvqeQzgw==} + metro-source-map@0.80.6: + resolution: {integrity: sha512-lqDuSLctWy9Qccu4Zl0YB1PzItpsqcKGb1nK0aDY+lzJ26X65OCib2VzHlj+xj7e4PiIKOfsvDCczCBz4cnxdg==} engines: {node: '>=18'} - metro-symbolicate@0.80.9: - resolution: {integrity: sha512-Ykae12rdqSs98hg41RKEToojuIW85wNdmSe/eHUgMkzbvCFNVgcC0w3dKZEhSsqQOXapXRlLtHkaHLil0UD/EA==} + metro-symbolicate@0.80.6: + resolution: {integrity: sha512-SGwKeBi+lK7NmM5+EcW6DyRRa9HmGSvH0LJtlT4XoRMbpxzsLYs0qUEA+olD96pOIP+ta7I8S30nQr2ttqgO8A==} engines: {node: '>=18'} hasBin: true - metro-transform-plugins@0.80.9: - resolution: {integrity: sha512-UlDk/uc8UdfLNJhPbF3tvwajyuuygBcyp+yBuS/q0z3QSuN/EbLllY3rK8OTD9n4h00qZ/qgxGv/lMFJkwP4vg==} + metro-transform-plugins@0.80.6: + resolution: {integrity: sha512-e04tdTC5Fy1vOQrTTXb5biao0t7nR/h+b1IaBTlM5UaHaAJZr658uVOoZhkRxKjbhF2mIwJ/8DdorD2CA15BCg==} engines: {node: '>=18'} - metro-transform-worker@0.80.9: - resolution: {integrity: sha512-c/IrzMUVnI0hSVVit4TXzt3A1GiUltGVlzCmLJWxNrBGHGrJhvgePj38+GXl1Xf4Fd4vx6qLUkKMQ3ux73bFLQ==} + metro-transform-worker@0.80.6: + resolution: {integrity: sha512-jV+VgCLiCj5jQadW/h09qJaqDreL6XcBRY52STCoz2xWn6WWLLMB5nXzQtvFNPmnIOps+Xu8+d5hiPcBNOhYmA==} engines: {node: '>=18'} - metro@0.80.9: - resolution: {integrity: sha512-Bc57Xf3GO2Xe4UWQsBj/oW6YfLPABEu8jfDVDiNmJvoQW4CO34oDPuYKe4KlXzXhcuNsqOtSxpbjCRRVjhhREg==} + metro@0.80.6: + resolution: {integrity: sha512-f6Nhnht9TxVRP6zdBq9J2jNdeDBxRmJFnjxhQS1GeCpokBvI6fTXq+wHTLz5jZA+75fwbkPSzBxBJzQa6xi0AQ==} engines: {node: '>=18'} hasBin: true @@ -8421,8 +9620,12 @@ packages: micromark@4.0.0: resolution: {integrity: sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==} - micromatch@4.0.5: - resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + micromatch@4.0.7: + resolution: {integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==} + engines: {node: '>=8.6'} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} mime-db@1.52.0: @@ -8456,6 +9659,14 @@ packages: resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} engines: {node: '>=12'} + mimic-function@5.0.1: + resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} + engines: {node: '>=18'} + + mimic-response@1.0.1: + resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} + engines: {node: '>=4'} + mimic-response@3.1.0: resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} engines: {node: '>=10'} @@ -8464,6 +9675,9 @@ packages: resolution: {integrity: sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + min-document@2.19.0: + resolution: {integrity: sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==} + min-indent@1.0.1: resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} engines: {node: '>=4'} @@ -8478,9 +9692,17 @@ packages: minimalistic-crypto-utils@1.0.1: resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==} + minimatch@10.0.1: + resolution: {integrity: sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==} + engines: {node: 20 || >=22} + 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@5.1.6: resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} engines: {node: '>=10'} @@ -8489,6 +9711,10 @@ packages: 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'} + minimatch@9.0.4: resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==} engines: {node: '>=16 || 14 >=14.17'} @@ -8496,21 +9722,19 @@ packages: minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - minipass@3.3.6: - resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} - engines: {node: '>=8'} + minipass@2.9.0: + resolution: {integrity: sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==} - minipass@5.0.0: - resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} - engines: {node: '>=8'} + minipass@7.0.4: + resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} + engines: {node: '>=16 || 14 >=14.17'} - minipass@7.1.0: - resolution: {integrity: sha512-oGZRv2OT1lO2UF1zUcwdTb3wqUwI0kBGTgt/T7OdSj6M6N5m3o5uPf0AIW6lVxGGoiWUR7e2AwTE+xiwK8WQig==} + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} engines: {node: '>=16 || 14 >=14.17'} - minizlib@2.1.2: - resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} - engines: {node: '>= 8'} + minizlib@1.3.3: + resolution: {integrity: sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==} mipd@0.0.5: resolution: {integrity: sha512-gbKA784D2WKb5H/GtqEv+Ofd1S9Zj+Z/PGDIl1u1QAbswkxD28BQ5bSXQxkeBzPBABg1iDSbiwGG1XqlOxRspA==} @@ -8520,8 +9744,18 @@ packages: typescript: optional: true - mkdirp-classic@0.5.3: - resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + mipd@0.0.7: + resolution: {integrity: sha512-aAPZPNDQ3uMTdKbuO2YmAw2TxLHO0moa4YKAyETM/DTj5FloZo+a+8tU+iv4GmW+sOxKLSRwcSFuczk+Cpt6fg==} + peerDependencies: + typescript: '>=5.0.4' + peerDependenciesMeta: + typescript: + optional: true + + mkdirp-promise@5.0.1: + resolution: {integrity: sha512-Hepn5kb1lJPtVW84RFT40YG1OddBNTOVUZR2bzQUHc+Z03en8/3uX0+060JDhcEzyO08HmipsN9DcnFMxhIL9w==} + engines: {node: '>=4'} + deprecated: This package is broken and no longer maintained. 'mkdirp' itself supports promises now, please switch to that. mkdirp@0.5.6: resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} @@ -8537,11 +9771,22 @@ packages: engines: {node: '>=10'} hasBin: true - mlly@1.7.0: - resolution: {integrity: sha512-U9SDaXGEREBYQgfejV97coK0UL1r+qnF2SyO9A3qcI8MzKnsIFKHNVEkrDyNncQTKQQumsasmeq84eNMdBfsNQ==} + mlly@1.5.0: + resolution: {integrity: sha512-NPVQvAY1xr1QoVeG0cy8yUYC7FQcOx6evl/RjT1wL5FvzPnzOysoqB/jmx/DhssT2dYa8nxECLAaFI/+gVLhDQ==} + + mnemonist@0.38.5: + resolution: {integrity: sha512-bZTFT5rrPKtPJxj8KSV0WkPyNxl72vQepqqVUAW2ARUpUSF2qXMB6jZj7hW5/k7C1rtpzqbD/IIbJwLXUjCHeg==} + + mocha@10.7.3: + resolution: {integrity: sha512-uQWxAu44wwiACGqjbPYmjo7Lg8sFrS3dQe7PP2FQI+woptP4vZXSMcfMyFL/e1yFEeEpV4RtyTpZROOKmxis+A==} + engines: {node: '>= 14.0.0'} + hasBin: true + + mock-fs@4.14.0: + resolution: {integrity: sha512-qYvlv/exQ4+svI3UOvPUpLDF0OMX5euvUH0Ny4N5QyRyhNdgAgUrVH3iUINSzEPLvx0kbo/Bp28GJKIqvE7URw==} - moralis@2.26.1: - resolution: {integrity: sha512-6aY1D/ZJwpys3H1tKhxbuRvnHXTOK07uqPrBQS2OPbCyxYjW33NFJPJXiLRXsmpDjFM+xq6vYRKrQSy5Zf4yog==} + moralis@2.26.2: + resolution: {integrity: sha512-9CfzUuPvTZrwyjQQ+rtpvnIXKR6G793iWDXCBUpZomAUHk/3KcR80KwuBZBAvH9uIfl7MGqkp3C0uk5vX2714Q==} motion@10.16.2: resolution: {integrity: sha512-p+PurYqfUdcJZvtnmAqu5fJgV2kR0uLFQuBKtLeFVTrYEVllI99tiOTSefVNYuip9ELTEkepIIDftNdze76NAQ==} @@ -8566,6 +9811,22 @@ packages: muggle-string@0.4.1: resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==} + multibase@0.6.1: + resolution: {integrity: sha512-pFfAwyTjbbQgNc3G7D48JkJxWtoJoBMaR4xQUOuB8RnCgRqaYmWNFeJTTvrJ2w51bjLq2zTby6Rqj9TQ9elSUw==} + deprecated: This module has been superseded by the multiformats module + + multibase@0.7.0: + resolution: {integrity: sha512-TW8q03O0f6PNFTQDvh3xxH03c8CjGaaYrjkl9UQPG6rz53TQzzxJVCIWVjzcbN/Q5Y53Zd0IBQBMVktVgNx4Fg==} + deprecated: This module has been superseded by the multiformats module + + multicodec@0.5.7: + resolution: {integrity: sha512-PscoRxm3f+88fAtELwUnZxGDkduE2HD9Q6GHUOywQLjOGT/HAdhjLDYNZ1e7VR0s0TP0EwZ16LNUTFpoBGivOA==} + deprecated: This module has been superseded by the multiformats module + + multicodec@1.0.4: + resolution: {integrity: sha512-NDd7FeS3QamVtbgfvu5h7fd1IlbaC4EQ0/pgU4zqE2vdHCmBGsUa0TiM8/TdSeG6BMPC92OOCf8F1ocE/Wkrrg==} + deprecated: This module has been superseded by the multiformats module + multiformats@11.0.2: resolution: {integrity: sha512-b5mYMkOkARIuVZCpvijFj9a6m5wMVLC7cf/jIPd5D/ARDOfLC5+IFkbgDXQgcU2goIsTD/O9NY4DI/Mt4OGvlg==} engines: {node: '>=16.0.0', npm: '>=7.0.0'} @@ -8574,19 +9835,29 @@ packages: resolution: {integrity: sha512-eajQ/ZH7qXZQR2AgtfpmSMizQzmyYVmCql7pdhldPuYQi4atACekbJaQplk6dWyIi10jCaFnd6pqvcEFXjbaJw==} engines: {node: '>=16.0.0', npm: '>=7.0.0'} - multiformats@13.1.0: - resolution: {integrity: sha512-HzdtdBwxsIkzpeXzhQ5mAhhuxcHbjEHH+JQoxt7hG/2HGFjjwyolLo7hbaexcnhoEuV4e0TNJ8kkpMjiEYY4VQ==} + multiformats@13.1.3: + resolution: {integrity: sha512-CZPi9lFZCM/+7oRolWYsvalsyWQGFo+GpdaTmjxXXomC+nP/W1Rnxb9sUgjvmNmRZ5bOPqRAl4nuK+Ydw/4tGw==} multiformats@9.9.0: resolution: {integrity: sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==} + multihashes@0.4.21: + resolution: {integrity: sha512-uVSvmeCWf36pU2nB4/1kzYZjsXD9vofZKpgudqkceYY5g2aZZXJ5r9lxuzoRLl1OAp28XljXsEJ/X/85ZsKmKw==} + murky@https://codeload.github.com/dmfxyz/murky/tar.gz/5feccd1253d7da820f7cccccdedf64471025455d: resolution: {tarball: https://codeload.github.com/dmfxyz/murky/tar.gz/5feccd1253d7da820f7cccccdedf64471025455d} + name: murky version: 0.0.0 + mute-stream@0.0.8: + resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} + mz@2.7.0: resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + nano-json-stream-parser@0.1.2: + resolution: {integrity: sha512-9MqxMH/BSJC7dnLsEMPyfN5Dvoo49IsPFYMcHw3Bcfc2kN0lpHRBSzlMSVx4HGyJ7s9B31CyBTVehWJoQ8Ctew==} + nanoid@3.3.7: resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} @@ -8617,11 +9888,18 @@ packages: neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + neotraverse@0.6.18: + resolution: {integrity: sha512-Z4SmBUweYa09+o6pG+eASabEpP6QkQ70yHj351pQoEXIs8uHbaU2DWVmzBANKgflPa47A50PtB2+NgRpQvr7vA==} + engines: {node: '>= 10'} + next-tick@1.1.0: resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==} - nlcst-to-string@3.1.1: - resolution: {integrity: sha512-63mVyqaqt0cmn2VcI2aH6kxe1rLAmSROqHMA0i4qqg1tidkfExgpb0FGMikMCn86mw5dFtBtEANfmSSK7TjNHw==} + nlcst-to-string@4.0.0: + resolution: {integrity: sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA==} + + nlcst-to-string@4.0.0: + resolution: {integrity: sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA==} no-case@3.0.4: resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} @@ -8647,8 +9925,8 @@ packages: resolution: {integrity: sha512-tmPX422rYgofd4epzrNoOXiE8XFZYOcCq1vD7MAXCDO+O+zndlA2ztdKKMa+EeuBG5tHETpr4ml4RGgpqDCCAg==} engines: {node: '>= 0.10.5'} - node-fetch-native@1.6.4: - resolution: {integrity: sha512-IhOigYzAKHd244OC0JIMIUrjzctirCmPkaIfhDeGcEETWof5zKYUW7e7MYvChGWh/4CJeXEgsRyGzuF334rOOQ==} + node-fetch-native@1.6.2: + resolution: {integrity: sha512-69mtXOFZ6hSkYiXAVB5SqaRvrbITC/NPyqv7yuu/qw0nmgPyYbIMYYNIDhNtwPrzk0ptrimrLz/hhjvm4w5Z+w==} node-fetch@2.7.0: resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} @@ -8663,8 +9941,8 @@ packages: resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} engines: {node: '>= 6.13.0'} - node-gyp-build@4.8.1: - resolution: {integrity: sha512-OSs33Z9yWr148JZcbZd5WiAXhh/n9z8TxQcdMhIOlpN9AhWpLfvVFO73+m77bBABQMaY9XSvIa+qk0jlI7Gcaw==} + node-gyp-build@4.8.0: + resolution: {integrity: sha512-u6fs2AEUljNho3EYTJNBfImO5QTo/J/1Etd+NVdCj7qWKUSN/bSLkZwhDv7I+w/MSC6qJ4cknepkAYykDdK8og==} hasBin: true node-int64@0.4.0: @@ -8673,13 +9951,13 @@ packages: node-releases@2.0.14: resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} + node-releases@2.0.18: + resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==} + node-stream-zip@1.15.0: resolution: {integrity: sha512-LN4fydt9TqhZhThkZIVQnF9cwjU3qmUH9h78Mx/K7d3VvfRqqwthLwJEUOEL0QPZ0XQmNN7be5Ggit5+4dq3Bw==} engines: {node: '>=0.12.0'} - 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'} @@ -8688,8 +9966,12 @@ packages: resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} engines: {node: '>=0.10.0'} - normalize-url@8.0.1: - resolution: {integrity: sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w==} + normalize-url@6.1.0: + resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} + engines: {node: '>=10'} + + normalize-url@8.0.0: + resolution: {integrity: sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==} engines: {node: '>=14.16'} not@0.1.0: @@ -8712,8 +9994,8 @@ packages: resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} engines: {node: '>=8'} - npm-run-path@5.3.0: - resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} + npm-run-path@5.2.0: + resolution: {integrity: sha512-W4/tgAXFqFA0iL7fk0+uQ3g7wkL8xJmx3XdK0VGb4cHW//eZTtKGvFBBoRKVTpY7n6ze4NL9ly7rgXcHufqXKg==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} nth-check@2.1.1: @@ -8726,16 +10008,14 @@ packages: resolution: {integrity: sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig==} engines: {node: '>=6.5.0', npm: '>=3'} - nwsapi@2.2.9: - resolution: {integrity: sha512-2f3F0SEEer8bBu0dsNCFF50N0cTThV1nWFYcEYFZttdW0lDAoybv9cQoK7X7/68Z89S7FoRrVjP1LPX4XRf9vg==} + nwsapi@2.2.7: + resolution: {integrity: sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==} - nypm@0.3.8: - resolution: {integrity: sha512-IGWlC6So2xv6V4cIDmoV0SwwWx7zLG086gyqkyumteH2fIgCAM4nDVFB2iDRszDvmdSVW9xb1N+2KjQ6C7d4og==} - engines: {node: ^14.16.0 || >=16.10.0} - hasBin: true + oauth-sign@0.9.0: + resolution: {integrity: sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==} - ob1@0.80.9: - resolution: {integrity: sha512-v9yOxowkZbxWhKOaaTyLjIm1aLy4ebMNcSn4NYJKOAI/Qv+SkfEfszpLr2GIxsccmb2Y2HA9qtsqiIJ80ucpVA==} + ob1@0.80.6: + resolution: {integrity: sha512-nlLGZPMQ/kbmkdIb5yvVzep1jKUII2x6ehNsHpgy71jpnJMW7V+KsB3AjYI2Ajb7UqMAMNjlssg6FUodrEMYzg==} engines: {node: '>=18'} obj-multiplex@1.0.0: @@ -8749,11 +10029,8 @@ packages: resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} engines: {node: '>= 6'} - object-inspect@1.13.1: - resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} - - object-is@1.1.6: - resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==} + object-inspect@1.13.2: + resolution: {integrity: sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==} engines: {node: '>= 0.4'} object-keys@1.1.1: @@ -8764,20 +10041,25 @@ packages: resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} engines: {node: '>= 0.4'} - object.fromentries@2.0.8: - resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} + object.fromentries@2.0.7: + resolution: {integrity: sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==} engines: {node: '>= 0.4'} - object.groupby@1.0.3: - resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} - engines: {node: '>= 0.4'} + object.groupby@1.0.1: + resolution: {integrity: sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==} - object.values@1.2.0: - resolution: {integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==} + object.values@1.1.7: + resolution: {integrity: sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==} engines: {node: '>= 0.4'} - ofetch@1.3.4: - resolution: {integrity: sha512-KLIET85ik3vhEfS+3fDlc/BAZiAp+43QEC/yCo5zkNoY2YaKvNkOaFr/6wCFgFH1kuYQM5pMNi0Tg8koiIemtw==} + obliterator@2.0.4: + resolution: {integrity: sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ==} + + oboe@2.1.5: + resolution: {integrity: sha512-zRFWiF+FoicxEs3jNI/WYUrVEgA7DeET/InK0XQuudGHRg8iIob3cNPrJTKaz4004uaA9Pbe+Dwa8iluhjLZWA==} + + ofetch@1.3.3: + resolution: {integrity: sha512-s1ZCMmQWXy4b5K/TW9i/DtiN8Ku+xCiHcjQ6/J/nDdssirrQNOoB165Zu8EqLMA2lln1JUth9a0aW9Ap2ctrUg==} ohash@1.1.3: resolution: {integrity: sha512-zuHHiGTYTA1sYJ/wZN+t5HKZaH23i4yI1HMwbuXm24Nid7Dv0KcuRlKoNKS9UNfAVSBlnGLcuQrnOKWOZoEGaw==} @@ -8808,6 +10090,13 @@ packages: resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} engines: {node: '>=12'} + onetime@7.0.0: + resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} + engines: {node: '>=18'} + + oniguruma-to-js@0.4.3: + resolution: {integrity: sha512-X0jWUcAlxORhOqqBREgPMgnshB7ZGYszBNspP+tS9hPD3l13CdaXcHbgImoHUHlrvGx/7AvFEkTRhAGYh+jzjQ==} + open@6.4.0: resolution: {integrity: sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==} engines: {node: '>=8'} @@ -8820,11 +10109,20 @@ packages: resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} engines: {node: '>=12'} + open@9.1.0: + resolution: {integrity: sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==} + engines: {node: '>=14.16'} + openapi-types@12.1.3: resolution: {integrity: sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==} - optionator@0.9.4: - resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + optimism@https://codeload.github.com/ethereum-optimism/optimism/tar.gz/ab3a54febb36398539fd3b849c222b7e70169dc8: + resolution: {tarball: https://codeload.github.com/ethereum-optimism/optimism/tar.gz/ab3a54febb36398539fd3b849c222b7e70169dc8} + version: 1.0.0 + engines: {node: '>=16', pnpm: '>=9'} + + optionator@0.9.3: + resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} engines: {node: '>= 0.8.0'} ora@5.4.1: @@ -8835,14 +10133,21 @@ packages: resolution: {integrity: sha512-ERAyNnZOfqM+Ao3RAvIXkYh5joP220yf59gVe2X/cI6SiCxIdi4c9HZKZD8R6q/RDXEje1THBju6iExiSsgJaQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - ora@8.0.1: - resolution: {integrity: sha512-ANIvzobt1rls2BDny5fWZ3ZVKyD6nscLvfFRpQgfWsythlcsVUC9kL0zq6j2Z5z9wwp1kd7wpsD/T9qNPVLCaQ==} + ora@8.1.0: + resolution: {integrity: sha512-GQEkNkH/GHOhPFXcqZs3IDahXEQcQxsSjEkK4KvEEST4t7eNzoMjxTzef+EZ+JluDEV+Raoi3WQ2CflnRdSVnQ==} engines: {node: '>=18'} 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-cancelable@2.1.1: + resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==} + engines: {node: '>=8'} + p-cancelable@3.0.0: resolution: {integrity: sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==} engines: {node: '>=12.20'} @@ -8858,6 +10163,14 @@ packages: p-fifo@1.0.0: resolution: {integrity: sha512-IjoCxXW48tqdtDFz6fqo5q1UfFVjjVZe8TC1QRflvNUJtNfCUhxOUw6MOVZhDPjqhSzc26xKdugsO17gmzd5+A==} + 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'} @@ -8874,6 +10187,14 @@ packages: resolution: {integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==} engines: {node: '>=18'} + p-limit@6.1.0: + resolution: {integrity: sha512-H0jc0q1vOzlEk0TqAKXKZxdl7kX3OFUzCnNVUnq5Pc3DGo0kpeaMuPqxQn235HibwBEb0/pm9dgKTjXy66fBkg==} + engines: {node: '>=18'} + + p-locate@2.0.0: + resolution: {integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==} + engines: {node: '>=4'} + p-locate@3.0.0: resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} engines: {node: '>=6'} @@ -8890,6 +10211,10 @@ packages: resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + p-map@2.1.0: + resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} + engines: {node: '>=6'} + p-map@4.0.0: resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} engines: {node: '>=10'} @@ -8906,27 +10231,35 @@ packages: resolution: {integrity: sha512-UbD77BuZ9Bc9aABo74gfXhNvzC9Tx7SxtHSh1fxvx3jTLLYvmVhiQZZrJzqqU0jKbN32kb5VOKiLEQI/3bIjgQ==} engines: {node: '>=14.16'} + 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'} p256-verifier#v0.1.0@https://codeload.github.com/taikoxyz/p256-verifier/tar.gz/6ef45b117642786b08a37b4c37c6a6ce151166da: resolution: {tarball: https://codeload.github.com/taikoxyz/p256-verifier/tar.gz/6ef45b117642786b08a37b4c37c6a6ce151166da} + name: p256-verifier#v0.1.0 version: 0.0.0 + package-json-from-dist@1.0.0: + resolution: {integrity: sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==} + package-json@8.1.1: resolution: {integrity: sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA==} engines: {node: '>=14.16'} + package-manager-detector@0.2.0: + resolution: {integrity: sha512-E385OSk9qDcXhcM9LNSe4sdhx8a9mAPrZ4sMLW+tmxl5ZuGtPUcdFu+MPP2jbgiWAZ6Pfe5soGFMd+0Db5Vrog==} + pagefind@1.1.0: resolution: {integrity: sha512-1nmj0/vfYcMxNEQj0YDRp6bTVv9hI7HLdPhK/vBBYlrnwjATndQvHyicj5Y7pUHrpCFZpFnLVQXIF829tpFmaw==} hasBin: true - pako@0.2.9: - resolution: {integrity: sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==} - - param-case@3.0.4: - resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} + pako@1.0.11: + resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} @@ -8938,6 +10271,9 @@ packages: parse-entities@4.0.1: resolution: {integrity: sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==} + parse-headers@2.0.5: + resolution: {integrity: sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA==} + parse-json@4.0.0: resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} engines: {node: '>=4'} @@ -8946,8 +10282,11 @@ packages: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} - parse-latin@5.0.1: - resolution: {integrity: sha512-b/K8ExXaWC9t34kKeDV8kGXBkXZ1HCSAZRYE7HR14eA1GlXX5L8iWhs8USJNhQU9q5ci413jCKF0gOyovvyRBg==} + parse-latin@7.0.0: + resolution: {integrity: sha512-mhHgobPPua5kZ98EF4HWiH167JWBfl4pvAIXXdbaVohtK7a6YBOy56kvhCqduqyo/f3yrHFWmqmiMg/BkBkYYQ==} + + parse-latin@7.0.0: + resolution: {integrity: sha512-mhHgobPPua5kZ98EF4HWiH167JWBfl4pvAIXXdbaVohtK7a6YBOy56kvhCqduqyo/f3yrHFWmqmiMg/BkBkYYQ==} parse5@7.1.2: resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} @@ -8962,9 +10301,6 @@ packages: path-browserify@1.0.1: resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} - path-case@3.0.4: - resolution: {integrity: sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==} - path-exists@3.0.0: resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} engines: {node: '>=4'} @@ -8992,12 +10328,16 @@ packages: path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - path-scurry@1.10.2: - resolution: {integrity: sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==} + 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-scurry@2.0.0: + resolution: {integrity: sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==} + engines: {node: 20 || >=22} + + path-to-regexp@0.1.10: + resolution: {integrity: sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==} path-to-regexp@6.2.2: resolution: {integrity: sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw==} @@ -9006,33 +10346,40 @@ packages: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} - path-type@5.0.0: - resolution: {integrity: sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==} - engines: {node: '>=12'} - pathe@1.1.2: resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} pathval@1.1.1: resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + pathval@2.0.0: + resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} + engines: {node: '>= 14.16'} + pbkdf2@3.1.2: resolution: {integrity: sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==} engines: {node: '>=0.12'} - peek-stream@1.1.3: - resolution: {integrity: sha512-FhJ+YbOSBb9/rIl2ZeE/QHEsWn7PqNYt8ARAY3kIgNGOk13g9FGyIY6JIl/xB/3TFRVoTv5as0l11weORrTekA==} + performance-now@2.1.0: + resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} periscopic@3.1.0: resolution: {integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==} - picocolors@1.0.0: - resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + picocolors@1.0.1: + resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} + + picocolors@1.1.0: + resolution: {integrity: sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==} picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} + picomatch@3.0.1: + resolution: {integrity: sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag==} + engines: {node: '>=10'} + pify@2.3.0: resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} engines: {node: '>=0.10.0'} @@ -9071,20 +10418,16 @@ packages: resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} engines: {node: '>=8'} - pkg-dir@5.0.0: - resolution: {integrity: sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==} - engines: {node: '>=10'} - - pkg-types@1.1.0: - resolution: {integrity: sha512-/RpmvKdxKf8uILTtoOhAgf30wYbP2Qw+L9p3Rvshx1JZVX+XQNZQFjlbmGHEGIm4CkVPlSn+NXmIM8+9oWQaSA==} + pkg-types@1.0.3: + resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==} - playwright-core@1.44.0: - resolution: {integrity: sha512-ZTbkNpFfYcGWohvTTl+xewITm7EOuqIqex0c7dNZ+aXsbrLj0qI8XlGKfPpipjm0Wny/4Lt4CJsWJk1stVS5qQ==} + playwright-core@1.43.1: + resolution: {integrity: sha512-EI36Mto2Vrx6VF7rm708qSnesVQKbxEWvPrfA1IPY6HgczBplDx7ENtx+K2n4kJ41sLLkuGfmb0ZLSSXlDhqPg==} engines: {node: '>=16'} hasBin: true - playwright@1.44.0: - resolution: {integrity: sha512-F9b3GUCLQ3Nffrfb6dunPOkE5Mh68tR7zN32L4jCk4FjQamgesGay7/dAAe1WaMEGV04DkdJfcJzjoCKygUaRQ==} + playwright@1.43.1: + resolution: {integrity: sha512-V7SoH0ai2kNt1Md9E3Gwas5B9m8KR2GVvwZnAI6Pg0m3sh7UvgiYhRrhsziCmqMJNouPckiOhk8T+9bSAK0VIA==} engines: {node: '>=16'} hasBin: true @@ -9100,14 +10443,10 @@ packages: resolution: {integrity: sha512-OBatVyC/N7SCW/FaDHrSd+vn0o5cS855TOmYi4OkdWUMSJCET/xip//ch8xGUvtr3i44X9LVyWwQlRMTN3pwSA==} engines: {node: '>=10'} - pony-cause@2.1.11: - resolution: {integrity: sha512-M7LhCsdNbNgiLYiP4WjsfLUuFmCfnjdF6jKe2R9NKl4WFN+HZPGHJZ9lnLP7f9ZnKe3U9nuWD0szirmj+migUg==} + pony-cause@2.1.10: + resolution: {integrity: sha512-3IKLNXclQgkU++2fSi93sQ6BznFuxSLB11HdvZQ6JW/spahf/P1pAHBQEahr20rs0htZW0UDkM1HmA+nZkXKsw==} engines: {node: '>=12.0.0'} - possible-typed-array-names@1.0.0: - resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} - engines: {node: '>= 0.4'} - postcss-import@15.1.0: resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} engines: {node: '>=14.0.0'} @@ -9162,8 +10501,8 @@ packages: peerDependencies: postcss: ^8.2.14 - postcss-nesting@12.1.2: - resolution: {integrity: sha512-FUmTHGDNundodutB4PUBxt/EPuhgtpk8FJGRsBhOuy+6FnkR2A8RZWIsyyy6XmhvX2DZQQWIkvu+HB4IbJm+Ew==} + postcss-nesting@12.1.0: + resolution: {integrity: sha512-QOYnosaZ+mlP6plQrAxFw09UUp2Sgtxj1BVHN+rSVbtV0Yx48zRt9/9F/ZOoxOKBBEsaJk2MYhhVRjeRRw5yuw==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 @@ -9180,6 +10519,10 @@ packages: peerDependencies: postcss: ^8.4.29 + postcss-selector-parser@6.0.15: + resolution: {integrity: sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==} + engines: {node: '>=4'} + postcss-selector-parser@6.0.16: resolution: {integrity: sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==} engines: {node: '>=4'} @@ -9187,16 +10530,20 @@ packages: postcss-value-parser@4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - postcss@8.4.38: - resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} + postcss@8.4.39: + resolution: {integrity: sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw==} engines: {node: ^10 || ^12 || >=14} - preact@10.21.0: - resolution: {integrity: sha512-aQAIxtzWEwH8ou+OovWVSVNlFImL7xUCwJX3YMqA3U8iKCNC34999fFOnWjYNsylgfPgMexpbk7WYOLtKr/mxg==} + postcss@8.4.47: + resolution: {integrity: sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==} + engines: {node: ^10 || ^12 || >=14} - preferred-pm@3.1.3: - resolution: {integrity: sha512-MkXsENfftWSRpzCzImcp4FRsCc3y1opwB73CfCNWyzMqArju2CrlMHlqB7VexKiPEOjGMbttv1r9fSCn5S610w==} - engines: {node: '>=10'} + preact@10.19.5: + resolution: {integrity: sha512-OPELkDmSVbKjbFqF9tgvOowiiQ9TmsJljIzXRyNE8nGiis94pwv1siF78rQkAP1Q1738Ce6pellRg/Ns/CtHqQ==} + + preferred-pm@4.0.0: + resolution: {integrity: sha512-gYBeFTZLu055D8Vv3cSPox/0iTPtkzxpLroSYYA7WXgRi31WCJ51Uyl8ZiPeUUjyvs2MBzK+S8v9JVUgHU/Sqw==} + engines: {node: '>=18.12'} prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} @@ -9206,19 +10553,30 @@ packages: resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} engines: {node: '>=6.0.0'} + prettier-plugin-svelte@3.2.2: + resolution: {integrity: sha512-ZzzE/wMuf48/1+Lf2Ffko0uDa6pyCfgHV6+uAhtg2U0AAXGrhCSW88vEJNAkAxW5qyrFY1y1zZ4J8TgHrjW++Q==} + peerDependencies: + prettier: ^3.0.0 + svelte: ^3.2.0 || ^4.0.0-next.0 || ^5.0.0-next.0 + prettier-plugin-svelte@3.2.3: resolution: {integrity: sha512-wJq8RunyFlWco6U0WJV5wNCM7zpBFakS76UBSbmzMGpncpK98NZABaE+s7n8/APDCEVNHXC5Mpq+MLebQtsRlg==} peerDependencies: prettier: ^3.0.0 svelte: ^3.2.0 || ^4.0.0-next.0 || ^5.0.0-next.0 + prettier@2.8.7: + resolution: {integrity: sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw==} + engines: {node: '>=10.13.0'} + hasBin: true + prettier@2.8.8: resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} engines: {node: '>=10.13.0'} hasBin: true - prettier@3.2.5: - resolution: {integrity: sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==} + prettier@3.3.2: + resolution: {integrity: sha512-rAVeHYMcv8ATV5d508CFdn+8/pHPpXeIid1DdrPwXnaAdH7cqjVbpJaT5eq4yRAFU/lsbwYwSF/n5iNrdJHPQA==} engines: {node: '>=14'} hasBin: true @@ -9234,14 +10592,13 @@ packages: resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - pretty-hrtime@1.0.3: - resolution: {integrity: sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==} - engines: {node: '>= 0.8'} - prismjs@1.29.0: resolution: {integrity: sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==} engines: {node: '>=6'} + process-nextick-args@1.0.7: + resolution: {integrity: sha512-yN0WQmuCX63LP/TMvAg31nvT6m4vDqJEiiv2CAZqWOGNWutc9DfDk1NPYYmKUFmaVM2UwDowH4u5AHWYP/jxKw==} + process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} @@ -9263,18 +10620,25 @@ packages: promise@8.3.0: resolution: {integrity: sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==} + prompt@1.3.0: + resolution: {integrity: sha512-ZkaRWtaLBZl7KKAKndKYUL8WqNT+cQHKRZnT4RYYms48jQkFw3rrBL+/N5K/KtdEveHkxs982MX2BkDKub2ZMg==} + engines: {node: '>= 6.0.0'} + prompts@2.4.2: resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} engines: {node: '>= 6'} + prop-types@15.8.1: + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + property-information@6.5.0: resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==} proto-list@1.2.4: resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} - protobufjs@7.2.6: - resolution: {integrity: sha512-dgJaEDDL6x8ASUZ1YqWciTRrdOuYNzoOf27oHNfdyvKqHr5i0FV7FSLU+aIeFjyFgVxrpTOtQUi0BLLBymZaBw==} + protobufjs@7.3.2: + resolution: {integrity: sha512-RXyHaACeqXeqAKGLDl68rQKbmObRsTIn4TYVUUug1KfS47YWCo5MacGITEryugIgZqORCvJWEk4l449POg5Txg==} engines: {node: '>=12.0.0'} proxy-addr@2.0.7: @@ -9287,6 +10651,9 @@ packages: proxy-from-env@1.1.0: resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + pseudomap@1.0.2: + resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} + psl@1.9.0: resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} @@ -9295,14 +10662,12 @@ packages: engines: {node: '>=16'} hasBin: true - pump@2.0.1: - resolution: {integrity: sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==} - pump@3.0.0: resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} - pumpify@1.5.1: - resolution: {integrity: sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==} + 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==} @@ -9323,23 +10688,22 @@ packages: engines: {node: '>=10.13.0'} hasBin: true - qs@6.11.0: - resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} + qs@6.13.0: + resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} engines: {node: '>=0.6'} - qs@6.12.1: - resolution: {integrity: sha512-zWmv4RSuB9r2mYQw3zxQuHWeU+42aKi1wWig/j4ele4ygELZ7PEO6MM7rim9oAQH2A5MWfsAVf/jPvTPgCbvUQ==} + qs@6.5.3: + resolution: {integrity: sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==} engines: {node: '>=0.6'} + query-string@5.1.1: + resolution: {integrity: sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==} + engines: {node: '>=0.10.0'} + query-string@7.1.3: resolution: {integrity: sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg==} engines: {node: '>=6'} - 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. - querystringify@2.2.0: resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} @@ -9356,11 +10720,8 @@ packages: resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} engines: {node: '>=10'} - radix3@1.1.2: - resolution: {integrity: sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==} - - ramda@0.29.0: - resolution: {integrity: sha512-BBea6L67bYLtdbOqfp8f58fPMqEwx0doL+pAi8TZyp2YWz8R9G8z9x75CZI8W+ftqhFHCpEX2cRnUUXK130iKA==} + radix3@1.1.0: + resolution: {integrity: sha512-pNsHDxbGORSvuSScqNJ+3Km6QAVqk8CfsCBIEoDgpqLrkD2f3QM4I7d1ozJJ172OmIcoUcerZaNWqtLkRXTV3A==} randombytes@2.1.0: resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} @@ -9389,13 +10750,13 @@ packages: peerDependencies: react: ^16.3.0 || ^17.0.1 || ^18.0.0 - react-devtools-core@5.2.0: - resolution: {integrity: sha512-vZK+/gvxxsieAoAyYaiRIVFxlajb7KXhgBDV7OsoMzaAE+IqGpoxusBjIgq5ibqA2IloKu0p9n7tE68z1xs18A==} + react-devtools-core@4.28.5: + resolution: {integrity: sha512-cq/o30z9W2Wb4rzBefjv5fBalHU0rJGZCHAkf/RHSBWSSYwh8PlQTqqOJmgIIbBtpj27T6FIPXeomIjZtCNVqA==} - react-dom@18.3.1: - resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} + react-dom@18.2.0: + resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} peerDependencies: - react: ^18.3.1 + react: ^18.2.0 react-i18next@13.5.0: resolution: {integrity: sha512-CFJ5NDGJ2MUyBohEHxljOq/39NQ972rh1ajnadG9BjTk+UXbHLq4z5DKEbEQBDoIhUmmbuS/fIMJKo6VOax1HA==} @@ -9410,11 +10771,14 @@ packages: react-native: optional: true + react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + react-is@17.0.2: resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} - react-is@18.3.1: - resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} + react-is@18.2.0: + resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} react-native-fetch-api@3.0.0: resolution: {integrity: sha512-g2rtqPjdroaboDKTsJCTlcmtw54E25OjyaunUP0anOZn4Fuo2IKs8BVfe02zVggA/UysbmfSnRJIqtNkAgggNA==} @@ -9425,70 +10789,39 @@ packages: react: '*' react-native: '*' - react-native@0.74.1: - resolution: {integrity: sha512-0H2XpmghwOtfPpM2LKqHIN7gxy+7G/r1hwJHKLV6uoyXGC/gCojRtoo5NqyKrWpFC8cqyT6wTYCLuG7CxEKilg==} + react-native@0.73.4: + resolution: {integrity: sha512-VtS+Yr6OOTIuJGDECIYWzNU8QpJjASQYvMtfa/Hvm/2/h5GdB6W9H9TOmh13x07Lj4AOhNMx3XSsz6TdrO4jIg==} engines: {node: '>=18'} hasBin: true peerDependencies: - '@types/react': ^18.2.6 react: 18.2.0 - peerDependenciesMeta: - '@types/react': - optional: true - react-refresh@0.14.2: - resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} + react-refresh@0.14.0: + resolution: {integrity: sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==} engines: {node: '>=0.10.0'} - react-remove-scroll-bar@2.3.6: - resolution: {integrity: sha512-DtSYaao4mBmX+HDo5YWYdBWQwYIQQshUV/dVxFxK+KM26Wjwp1gZ6rv6OC3oujI6Bfu6Xyg3TwK533AQutsn/g==} - engines: {node: '>=10'} - peerDependencies: - '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - - react-remove-scroll@2.5.5: - resolution: {integrity: sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw==} - engines: {node: '>=10'} - peerDependencies: - '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - react-shallow-renderer@16.15.0: resolution: {integrity: sha512-oScf2FqQ9LFVQgA73vr86xl2NaOIX73rh+YFqcOp68CWj56tSfgtGKrEbyhCj0rSijyG9M1CYprTh39fBi5hzA==} peerDependencies: react: ^16.0.0 || ^17.0.0 || ^18.0.0 - react-style-singleton@2.2.1: - resolution: {integrity: sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==} - engines: {node: '>=10'} - peerDependencies: - '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - - react@18.3.1: - resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} + react@18.2.0: + resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} engines: {node: '>=0.10.0'} read-cache@1.0.0: resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} - read-pkg-up@7.0.1: - resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} - engines: {node: '>=8'} + read-yaml-file@1.1.0: + resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} + engines: {node: '>=6'} - read-pkg@5.2.0: - resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} - engines: {node: '>=8'} + read@1.0.7: + resolution: {integrity: sha512-rSOKNYUmaxy0om1BNjMN4ezNT6VKK+2xF4GBhc81mkH7L60i6dp8qPYrkndNLT3QPphoII3maL9PVC9XmhHwVQ==} + engines: {node: '>=0.8'} + + readable-stream@2.3.3: + resolution: {integrity: sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==} readable-stream@2.3.8: resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} @@ -9501,6 +10834,10 @@ packages: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} + readdirp@4.0.1: + resolution: {integrity: sha512-GkMg9uOTpIWWKbSsgwb5fA4EavTR+SG/PMPoAY8hkhHfEEY0/vqljY+XHqtDf2cr2IJtoNRDbrrEpZUiZCkYRw==} + engines: {node: '>= 14.16.0'} + readline@1.3.0: resolution: {integrity: sha512-k2d6ACCkiNYz222Fs/iNze30rRJ1iIicW7JuX/7/cozvih6YCkFZH+J6mAFDVgv0dRBaAyr4jDqC95R2y4IADg==} @@ -9512,8 +10849,8 @@ packages: resolution: {integrity: sha512-hjMmLaUXAm1hIuTqOdeYObMslq/q+Xff6QE3Y2P+uoHAg2nmVlLBps2hzh1UJDdMtDTMXOFewK6ky51JQIeECg==} engines: {node: '>= 4'} - recast@0.23.7: - resolution: {integrity: sha512-MpQlLZVpqbbxYcqEjwpRWo88sGvjOYoXptySz710RuddNMHx+wPkoNX6YyLZJlXAh5VZr1qmPrTwcTuFMh0Lag==} + recast@0.23.9: + resolution: {integrity: sha512-Hx/BGIbwj+Des3+xy5uAtAbdCyqK9y9wbBcDFDYanLS9JnMqf7OeF87HQwUimE87OEc72mr6tkKUKMBBL+hF9Q==} engines: {node: '>= 4'} receptacle@1.3.2: @@ -9523,6 +10860,14 @@ packages: resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} engines: {node: '>=8'} + redis-errors@1.2.0: + resolution: {integrity: sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==} + engines: {node: '>=4'} + + redis-parser@3.0.0: + resolution: {integrity: sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==} + engines: {node: '>=4'} + regenerate-unicode-properties@10.1.1: resolution: {integrity: sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==} engines: {node: '>=4'} @@ -9539,8 +10884,11 @@ packages: regenerator-transform@0.15.2: resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==} - regexp.prototype.flags@1.5.2: - resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} + regex@4.3.2: + resolution: {integrity: sha512-kK/AA3A9K6q2js89+VMymcboLOlF5lZRCYJv3gzszXFHBr6kO6qLGzbm+UIugBEV8SMMKCTR59txoY6ctRHYVw==} + + regexp.prototype.flags@1.5.1: + resolution: {integrity: sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==} engines: {node: '>= 0.4'} regexpp@3.2.0: @@ -9563,12 +10911,18 @@ packages: resolution: {integrity: sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==} hasBin: true - rehype-expressive-code@0.35.3: - resolution: {integrity: sha512-kj43Rg+WzYUs8RRr6XyBr60pnrIZEgbmn9yJoV6qka1UDpcx7r8icn6Q2uSAgaLtlEUy+HCPgQJraOZrA53LOQ==} + rehype-expressive-code@0.35.6: + resolution: {integrity: sha512-pPdE+pRcRw01kxMOwHQjuRxgwlblZt5+wAc3w2aPGgmcnn57wYjn07iKO7zaznDxYVxMYVvYlnL+R3vWFQS4Gw==} rehype-external-links@3.0.0: resolution: {integrity: sha512-yp+e5N9V3C6bwBeAC4n796kc86M4gJCdlVhiMTxIrJG5UHDMh+PJANf9heqORJbt1nrCbDwIlAZKjANIaVBbvw==} + rehype-format@5.0.0: + resolution: {integrity: sha512-kM4II8krCHmUhxrlvzFSptvaWh280Fr7UGNJU5DCMuvmAwGCNmGfi9CvFAQK6JDjsNoRMWQStglK3zKJH685Wg==} + + rehype-minify-whitespace@6.0.0: + resolution: {integrity: sha512-i9It4YHR0Sf3GsnlR5jFUKXRr9oayvEk9GKQUkwZv6hs70OH9q3OCZrq9PpLvIGKt3W+JxBOxCidNVpH/6rWdA==} + rehype-parse@9.0.0: resolution: {integrity: sha512-WG7nfvmWWkCR++KEkZevZb/uw41E8TsH4DsY9UxsTbIXCVGbAs4S+r8FrQ+OtH5EEQAs+5UxKC42VinkmpA1Yw==} @@ -9599,16 +10953,28 @@ packages: remark-rehype@11.1.0: resolution: {integrity: sha512-z3tJrAs2kIs1AqIIy6pzHmAHlF1hWQ+OdY4/hv+Wxe35EhyLKcajL33iUEn3ScxtFox9nUvRufR/Zre8Q08H/g==} - remark-smartypants@2.1.0: - resolution: {integrity: sha512-qoF6Vz3BjU2tP6OfZqHOvCU0ACmu/6jhGaINSQRI9mM7wCxNQTKB3JUAN4SVoN2ybElEDTxBIABRep7e569iJw==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + remark-smartypants@3.0.2: + resolution: {integrity: sha512-ILTWeOriIluwEvPjv67v7Blgrcx+LZOkAUVtKI3putuhlZm84FnqDORNXPPm+HY3NdZOMhyDwZ1E+eZB/Df5dA==} + engines: {node: '>=16.0.0'} + + remark-smartypants@3.0.1: + resolution: {integrity: sha512-qyshfCl2eLO0i0558e79ZJsfojC5wjnYLByjt0FmjJQN6aYwcRxpoj784LZJSoWCdnA2ubh5rLNGb8Uur/wDng==} + engines: {node: '>=16.0.0'} remark-stringify@11.0.0: resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} + request-light@0.5.8: + resolution: {integrity: sha512-3Zjgh+8b5fhRJBQZoy+zbVKpAQGLyka0MPgW3zruTF4dFFJ8Fqcfu9YsAvi/rvdcaTeWG3MkbZv4WKxAn/84Lg==} + request-light@0.7.0: resolution: {integrity: sha512-lMbBMrDoxgsyO+yB3sDcrDuX85yYt7sS8BfQd11jtbW/z5ZWgLZRcEGLsLoYw7I0WSUGQBs8CC8ScIxkTX1+6Q==} + 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'} @@ -9645,10 +11011,16 @@ packages: 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.8: resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} hasBin: true + responselike@2.0.1: + resolution: {integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==} + responselike@3.0.0: resolution: {integrity: sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==} engines: {node: '>=14.16'} @@ -9661,40 +11033,66 @@ packages: resolution: {integrity: sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - retext-latin@3.1.0: - resolution: {integrity: sha512-5MrD1tuebzO8ppsja5eEu+ZbBeUNCjoEarn70tkXOS7Bdsdf6tNahsv2bY0Z8VooFF6cw7/6S+d3yI/TMlMVVQ==} + restore-cursor@5.1.0: + resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} + engines: {node: '>=18'} + + retext-latin@4.0.0: + resolution: {integrity: sha512-hv9woG7Fy0M9IlRQloq/N6atV82NxLGveq+3H2WOi79dtIYWN8OaxogDm77f8YnVXJL2VD3bbqowu5E3EMhBYA==} - retext-smartypants@5.2.0: - resolution: {integrity: sha512-Do8oM+SsjrbzT2UNIKgheP0hgUQTDDQYyZaIY3kfq0pdFzoPk+ZClYJ+OERNXveog4xf1pZL4PfRxNoVL7a/jw==} + retext-smartypants@6.1.1: + resolution: {integrity: sha512-onsHf34i/GzgElJgtT1K2V+31yEhWs7NJboKNxXJcmVMMPxLpgxZ9iADoMdydd6j/bHic5F/aNq0CGqElEtu2g==} - retext-stringify@3.1.0: - resolution: {integrity: sha512-767TLOaoXFXyOnjx/EggXlb37ZD2u4P1n0GJqVdpipqACsQP+20W+BNpMYrlJkq7hxffnFk+jc6mAK9qrbuB8w==} + retext-stringify@4.0.0: + resolution: {integrity: sha512-rtfN/0o8kL1e+78+uxPTqu1Klt0yPzKuQ2BfWwwfgIUSayyzxpM1PJzkKt4V8803uB9qSy32MvI7Xep9khTpiA==} - retext@8.1.0: - resolution: {integrity: sha512-N9/Kq7YTn6ZpzfiGW45WfEGJqFf1IM1q8OsRa1CGzIebCJBNCANDRmOrholiDRGKo/We7ofKR4SEvcGAWEMD3Q==} + retext@9.0.0: + resolution: {integrity: sha512-sbMDcpHCNjvlheSgMfEcVrZko3cDzdbe1x/e7G66dFp0Ff7Mldvi2uv6JkJQzdRcvLYE8CA8Oe8siQx8ZOgTcA==} + + retext@9.0.0: + resolution: {integrity: sha512-sbMDcpHCNjvlheSgMfEcVrZko3cDzdbe1x/e7G66dFp0Ff7Mldvi2uv6JkJQzdRcvLYE8CA8Oe8siQx8ZOgTcA==} retimer@3.0.0: resolution: {integrity: sha512-WKE0j11Pa0ZJI5YIk0nflGI7SQsfl2ljihVy7ogh7DeQSeYAUi0ubZ/yEueGtDfUPk6GH5LRw1hBdLq4IwUBWA==} + retry@0.13.1: + resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} + engines: {node: '>= 4'} + reusify@1.0.4: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - rimraf@2.6.3: + revalidator@0.1.8: + resolution: {integrity: sha512-xcBILK2pA9oh4SiinPEZfhP8HfrB/ha+a2fTMyl7Om2WjlDVrOQy99N2MXXlUHqGJz4qEu2duXxHJjDWuK/0xg==} + engines: {node: '>= 0.4.0'} + + rimraf@2.6.3: resolution: {integrity: sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==} + deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true rimraf@2.7.1: resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} + deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true rimraf@3.0.2: resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + + rimraf@5.0.10: + resolution: {integrity: sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==} hasBin: true ripemd160@2.0.2: resolution: {integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==} + risc0-ethereum#v1.1.2@https://codeload.github.com/risc0/risc0-ethereum/tar.gz/b8a14213d92fff07dacda993804e7edb7946ca58: + resolution: {tarball: https://codeload.github.com/risc0/risc0-ethereum/tar.gz/b8a14213d92fff07dacda993804e7edb7946ca58} + version: 0.0.0 + rlp@2.2.7: resolution: {integrity: sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==} hasBin: true @@ -9714,14 +11112,28 @@ packages: engines: {node: '>=14.18.0', npm: '>=8.0.0'} hasBin: true + rollup@4.12.0: + resolution: {integrity: sha512-wz66wn4t1OHIJw3+XU7mJJQV/2NAfw5OAk6G6Hoo3zcvz/XOfQ52Vgi+AN4Uxoxi0KBBwk2g8zPrTDA4btSB/Q==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + rollup@4.17.2: resolution: {integrity: sha512-/9ClTJPByC0U4zNLowV1tMBe8yMEAxewtR3cUNX5BoEpGH3dQEWpJLr6CLp0fPdYRF/fzVOgvDb1zXuakwF5kQ==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true + rollup@4.21.3: + resolution: {integrity: sha512-7sqRtBNnEbcBtMeRVc6VRsJMmpI+JU1z9VTvW8D4gXIYQFz0aLcsE6rRkyghZkLfEgUZgVvOG7A5CVz/VW5GIA==} + 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-applescript@5.0.0: + resolution: {integrity: sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==} + engines: {node: '>=12'} + run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} @@ -9729,8 +11141,8 @@ packages: resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} engines: {node: '>=6'} - safe-array-concat@1.1.2: - resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} + safe-array-concat@1.0.1: + resolution: {integrity: sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==} engines: {node: '>=0.4'} safe-buffer@5.1.2: @@ -9739,9 +11151,8 @@ packages: safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - safe-regex-test@1.0.3: - resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} - engines: {node: '>= 0.4'} + 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==} @@ -9753,15 +11164,15 @@ packages: sander@0.5.1: resolution: {integrity: sha512-3lVqBir7WuKDHGrKRDn/1Ye3kwpXaDOMsiRP1wd6wpZW56gJhsbp5RqQpA6JG/P+pkXizygnr1dKR8vzWaVsfA==} - sax@1.3.0: - resolution: {integrity: sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==} + sax@1.4.1: + resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==} saxes@6.0.0: resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} engines: {node: '>=v12.22.7'} - scheduler@0.23.2: - resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} + scheduler@0.23.0: + resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} scheduler@0.24.0-canary-efb381bbf-20230505: resolution: {integrity: sha512-ABvovCDe/k9IluqSh4/ISoq8tIJnW8euVAWYt5j/bg6dRnqwQwiGO1F/V4AyK96NGF/FB04FhOUDuWj8IKfABA==} @@ -9781,10 +11192,6 @@ packages: resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==} engines: {node: '>=4'} - selfsigned@2.4.1: - resolution: {integrity: sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==} - engines: {node: '>=10'} - semver@5.7.2: resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} hasBin: true @@ -9793,8 +11200,8 @@ packages: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true - semver@7.6.1: - resolution: {integrity: sha512-f/vbBsu+fOiYt+lmwZV0rVwJScl46HppnOA1ZvIuBWKOTlllpyJ3bfVax76/OrhCH38dyxoDIA8K7uB963IYgA==} + semver@7.6.0: + resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==} engines: {node: '>=10'} hasBin: true @@ -9803,33 +11210,47 @@ packages: engines: {node: '>=10'} hasBin: true - send@0.18.0: - resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} - engines: {node: '>= 0.8.0'} + semver@7.6.3: + resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} + engines: {node: '>=10'} + hasBin: true - sentence-case@3.0.4: - resolution: {integrity: sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==} + send@0.19.0: + resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==} + engines: {node: '>= 0.8.0'} serialize-error@2.1.0: resolution: {integrity: sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw==} engines: {node: '>=0.10.0'} - serve-static@1.15.0: - resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} + serialize-javascript@6.0.2: + resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} + + serve-static@1.16.2: + resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==} engines: {node: '>= 0.8.0'} + serverless@4.4.3: + resolution: {integrity: sha512-Re/PCfW/vkWnY+IhelN7HUpt3r5l+6m4IrKE6SOKGawhODGYGqdGBZSkMNyNkvHdeq158zDNohcsM+Be7K9sBg==} + engines: {node: '>=18.0.0'} + hasBin: true + + servify@0.1.12: + resolution: {integrity: sha512-/xE6GvsKKqyo1BAY+KxOWXcLpPsUUyji7Qg3bVD7hh1eRze5bR1uYiuDA/k3Gof1s9BTzQZEJK8sNcNGFIzeWw==} + engines: {node: '>=6'} + set-blocking@2.0.0: resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} set-cookie-parser@2.6.0: resolution: {integrity: sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==} - set-function-length@1.2.2: - resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + set-function-length@1.2.1: + resolution: {integrity: sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==} engines: {node: '>= 0.4'} - set-function-name@2.0.2: - resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + set-function-name@2.0.1: + resolution: {integrity: sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==} engines: {node: '>= 0.4'} setimmediate@1.0.5: @@ -9846,14 +11267,22 @@ packages: resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} engines: {node: '>=8'} - sharp@0.33.3: - resolution: {integrity: sha512-vHUeXJU1UvlO/BNwTpT0x/r53WkLUVxrmb5JTgW92fdFCFk0ispLMAeu/jPO2vjkXM1fYUi3K7/qcLF47pwM1A==} + sharp@0.33.4: + resolution: {integrity: sha512-7i/dt5kGl7qR4gwPRD2biwD2/SvBn3O04J77XKFgL2OnZtQw+AG9wnuS/csmu80nPRHLYE9E41fyEiG8nhH6/Q==} engines: {libvips: '>=8.15.2', node: ^18.17.0 || ^20.3.0 || >=21.0.0} + 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'} @@ -9861,8 +11290,14 @@ packages: shell-quote@1.8.1: resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} - shiki@1.5.1: - resolution: {integrity: sha512-vx4Ds3M3B9ZEmLeSXqBAB85osBWV8ErZfP69kuFQZozPgHc33m7spLTCUkcjwEjFm3gk3F9IdXMv8kX+v9xDHA==} + shiki@1.17.6: + resolution: {integrity: sha512-RejGugKpDM75vh6YtF9R771acxHRDikC/01kxsUGW+Pnaz3pTY+c8aZB5CnD7p0vuFPs1HaoAIU/4E+NCfS+mQ==} + + shiki@1.5.2: + resolution: {integrity: sha512-fpPbuSaatinmdGijE7VYUD3hxLozR3ZZ+iAx8Iy2X6REmJGyF5hQl94SgmiUNTospq346nXUVZx0035dyGvIVw==} + + side-channel@1.0.4: + resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} side-channel@1.0.6: resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} @@ -9878,6 +11313,12 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} + simple-concat@1.0.1: + resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} + + simple-get@2.8.2: + resolution: {integrity: sha512-Ijd/rV5o+mSBBs4F/x9oDPtTx9Zb6X9brmnXvMW4J7IR15ngi9q5xxqWBKU744jTZiaXtxaPL7uHG6vtN8kUkw==} + simple-swizzle@0.2.2: resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} @@ -9888,8 +11329,8 @@ packages: sisteransi@1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} - sitemap@7.1.1: - resolution: {integrity: sha512-mK3aFtjz4VdJN0igpIJrinf3EO8U8mxOPsTBzSsy06UtjZQJ3YY3o3Xa7zSc5nMqcMrRwlChHZ18Kxg0caiPBg==} + sitemap@7.1.2: + resolution: {integrity: sha512-ARCqzHJ0p4gWt+j7NlU5eDlIO9+Rkr/JhPFZKKQ1l5GCus7rJH4UdrlVAh0xC/gDS/Qir2UMxqYNHtsKr2rpCw==} engines: {node: '>=12.0.0', npm: '>=5.6.0'} hasBin: true @@ -9901,10 +11342,6 @@ packages: resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} engines: {node: '>=12'} - slash@5.1.0: - resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==} - engines: {node: '>=14.16'} - slice-ansi@2.1.0: resolution: {integrity: sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==} engines: {node: '>=6'} @@ -9916,16 +11353,21 @@ packages: snake-case@3.0.4: resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==} - socket.io-client@4.7.5: - resolution: {integrity: sha512-sJ/tqHOCe7Z50JCBCXrsY3I2k03iOiUe+tj1OmKeD2lXPiGH/RUCdTZFoqVyN7l1MnpIzPrGtLcijffmeouNlQ==} + socket.io-client@4.7.4: + resolution: {integrity: sha512-wh+OkeF0rAVCrABWQBaEjLfb7DVPotMbu0cgWgyR0v6eA4EoVnAwcIeIbcdTE3GT/H3kbdLl7OoH2+asoDRIIg==} engines: {node: '>=10.0.0'} socket.io-parser@4.2.4: resolution: {integrity: sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==} engines: {node: '>=10.0.0'} + solady@https://codeload.github.com/Vectorized/solady/tar.gz/a12a2575c899a328c1bafdada632dabbff27cf6b: + resolution: {tarball: https://codeload.github.com/Vectorized/solady/tar.gz/a12a2575c899a328c1bafdada632dabbff27cf6b} + version: 0.0.231 + solady@https://codeload.github.com/Vectorized/solady/tar.gz/de0f336d2033d04e0f77c923d639c7fbffd48b6d: resolution: {tarball: https://codeload.github.com/Vectorized/solady/tar.gz/de0f336d2033d04e0f77c923d639c7fbffd48b6d} + name: solady version: 0.0.167 solc@0.8.24: @@ -9933,29 +11375,47 @@ packages: engines: {node: '>=10.0.0'} hasBin: true + solc@0.8.26: + resolution: {integrity: sha512-yiPQNVf5rBFHwN6SIf3TUUvVAFKcQqmSUFeq+fb6pNRCo0ZCgpYOZDi3BVoezCPIAcKrVYd/qXlBLUP9wVrZ9g==} + engines: {node: '>=10.0.0'} + hasBin: true + solhint@4.5.4: resolution: {integrity: sha512-Cu1XiJXub2q1eCr9kkJ9VPv1sGcmj3V7Zb76B0CoezDOB9bu3DxKIFFH7ggCl9fWpEPD6xBmRLfZrYijkVmujQ==} hasBin: true - solhint@5.0.1: - resolution: {integrity: sha512-QeQLS9HGCnIiibt+xiOa/+MuP7BWz9N7C5+Mj9pLHshdkNhuo3AzCpWmjfWVZBUuwIUO3YyCRVIcYLR3YOKGfg==} + solhint@5.0.3: + resolution: {integrity: sha512-OLCH6qm/mZTCpplTXzXTJGId1zrtNuDYP5c2e6snIv/hdRVxPfBBz/bAlL91bY/Accavkayp2Zp2BaDSrLVXTQ==} hasBin: true + solidity-ast@0.4.59: + resolution: {integrity: sha512-I+CX0wrYUN9jDfYtcgWSe+OAowaXy8/1YQy7NS4ni5IBDmIYBq7ZzaP/7QqouLjzZapmQtvGLqCaYgoUWqBo5g==} + + solidity-docgen@0.6.0-beta.36: + resolution: {integrity: sha512-f/I5G2iJgU1h0XrrjRD0hHMr7C10u276vYvm//rw1TzFcYQ4xTOyAoi9oNAHRU0JU4mY9eTuxdVc2zahdMuhaQ==} + peerDependencies: + hardhat: ^2.8.0 + solidity-stringutils@https://codeload.github.com/Arachnid/solidity-stringutils/tar.gz/4b2fcc43fa0426e19ce88b1f1ec16f5903a2e461: resolution: {tarball: https://codeload.github.com/Arachnid/solidity-stringutils/tar.gz/4b2fcc43fa0426e19ce88b1f1ec16f5903a2e461} + name: solidity-stringutils version: 0.0.0 sonic-boom@2.8.0: resolution: {integrity: sha512-kuonw1YOYYNOve5iHdSahXPOK49GqwA+LZhI6Wz/l0rP57iKyXXIHaRagOBHAPmGwJC6od2Z9zgvZ5loSgMlVg==} - sorcery@0.11.0: - resolution: {integrity: sha512-J69LQ22xrQB1cIFJhPfgtLuI6BpWRiWu1Y3vSsIwK/eAScqJxd/+CJlUuHQRdX2C9NGFamq+KqNywGgaThwfHw==} + sorcery@0.11.1: + resolution: {integrity: sha512-o7npfeJE6wi6J9l0/5LKshFzZ2rMatRiCDwYeDQaOzqdzRJwALhX7mk/A/ecg6wjMu7wdZbmXfD2S/vpOg0bdQ==} hasBin: true source-map-js@1.2.0: resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} engines: {node: '>=0.10.0'} + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + source-map-support@0.5.21: resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} @@ -9971,20 +11431,15 @@ packages: resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} engines: {node: '>= 8'} + sp1-contracts#v3.0.0@https://codeload.github.com/succinctlabs/sp1-contracts/tar.gz/1c4acaeab86789995ae5c6baced66f81e4a57f4d: + resolution: {tarball: https://codeload.github.com/succinctlabs/sp1-contracts/tar.gz/1c4acaeab86789995ae5c6baced66f81e4a57f4d} + version: 0.0.0 + space-separated-tokens@2.0.2: resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} - spdx-correct@3.2.0: - resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} - - spdx-exceptions@2.5.0: - resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} - - spdx-expression-parse@3.0.1: - resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} - - spdx-license-ids@3.0.17: - resolution: {integrity: sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==} + spawndamnit@2.0.0: + resolution: {integrity: sha512-j4JKEcncSjFlqIwU5L/rp2N5SIPsdxaRsIv678+TZxZ0SRDJTm8JrxJMjE/XuiEZNEir3S8l0Fa3Ke339WI4qA==} split-on-first@1.1.0: resolution: {integrity: sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==} @@ -9997,6 +11452,14 @@ packages: sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + sshpk@1.18.0: + resolution: {integrity: sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==} + engines: {node: '>=0.10.0'} + hasBin: true + + stack-trace@0.0.10: + resolution: {integrity: sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==} + stack-utils@2.0.6: resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} engines: {node: '>=10'} @@ -10011,6 +11474,9 @@ packages: resolution: {integrity: sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==} engines: {node: '>=6'} + standard-as-callback@2.1.0: + resolution: {integrity: sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==} + starlight-links-validator@0.8.0: resolution: {integrity: sha512-FYZ5cfV7jSL4wOsWmIkpR+9dH0Z8fxslSQl8IiAv5URfkxLgsaFzjx51FBeSaaS5uVmO5WgfkUjx3N52Jl1/TQ==} engines: {node: '>=18.14.1'} @@ -10018,8 +11484,8 @@ packages: '@astrojs/starlight': '>=0.15.0' astro: '>=4.0.0' - starlight-openapi@0.6.3: - resolution: {integrity: sha512-AHTbCJeGHzzhwVVi7UMgFgNKkvio2bbi9zQVtcI7CrMXVdd4jqL/L+R7MUxtr/DtzWG7PCCRsKPriwYubJ1ZPQ==} + starlight-openapi@0.6.4: + resolution: {integrity: sha512-TIioFhMmSKhKau6g/fx5WgWyPQve7cjP896wQek3sHqCJeLAsTSqUYCb33bBb/4D1/6sUioqlfJd9J3Lc1NQjA==} engines: {node: '>=18.14.1'} peerDependencies: '@astrojs/markdown-remark': '>=4.2.0' @@ -10045,15 +11511,8 @@ packages: resolution: {integrity: sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==} engines: {node: '>=18'} - stop-iteration-iterator@1.0.0: - resolution: {integrity: sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==} - engines: {node: '>= 0.4'} - - store2@2.14.3: - resolution: {integrity: sha512-4QcZ+yx7nzEFiV4BMLnr/pRa5HYzNITX2ri0Zh6sT9EyQHbBHacC6YigllUPU9X3D0f/22QCgfokpKs52YRrUg==} - - storybook@8.1.1: - resolution: {integrity: sha512-tkoz1O2UcPOkfRgl/QkefI/1akyjkBghuX+2S/FaXb9cKUR1St4WBQfFqDUvJr1T9MKdizCBVFQ5HuqYzCiWWQ==} + storybook@8.3.0: + resolution: {integrity: sha512-XKU+nem9OKX/juvJPwka1Q7DTpSbOe0IMp8ZyLQWorhFKpquJdUjryl7Z9GiFZyyTykCqH4ItQ7h8PaOmqVMOw==} hasBin: true stream-browserify@3.0.0: @@ -10062,12 +11521,16 @@ packages: stream-replace-string@2.0.0: resolution: {integrity: sha512-TlnjJ1C0QrmxRNrON00JvaFFlNh5TTG00APw23j74ET7gkQpTASi6/L2fuiav8pzK715HXtUeClpBTw2NPSn6w==} - stream-shift@1.0.3: - resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==} + stream-shift@1.0.1: + resolution: {integrity: sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==} stream-to-it@0.2.4: resolution: {integrity: sha512-4vEbkSs83OahpmBybNJXlJd7d6/RxzkkSdT3I0mnGt79Xd2Kk+e1JqbvAvsQfCeKj3aKb0QIWkyK3/n0j506vQ==} + strict-uri-encode@1.1.0: + resolution: {integrity: sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==} + engines: {node: '>=0.10.0'} + strict-uri-encode@2.0.0: resolution: {integrity: sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==} engines: {node: '>=4'} @@ -10080,20 +11543,22 @@ packages: resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} engines: {node: '>=12'} - string-width@7.1.0: - resolution: {integrity: sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw==} + string-width@7.2.0: + resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} engines: {node: '>=18'} - string.prototype.trim@1.2.9: - resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} + string.prototype.trim@1.2.8: + resolution: {integrity: sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==} engines: {node: '>= 0.4'} - string.prototype.trimend@1.0.8: - resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==} + string.prototype.trimend@1.0.7: + resolution: {integrity: sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==} - string.prototype.trimstart@1.0.8: - resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} - engines: {node: '>= 0.4'} + string.prototype.trimstart@1.0.7: + resolution: {integrity: sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==} + + string_decoder@1.0.3: + resolution: {integrity: sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==} string_decoder@1.1.1: resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} @@ -10148,8 +11613,8 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} - strip-literal@2.1.0: - resolution: {integrity: sha512-Op+UycaUt/8FbN/Z2TWPBLge3jWrP3xj10f3fnYxf052bKuS3EKs1ZQcVGjnEMdsNVAM+plXRdmjrZ/KgG3Skw==} + strip-literal@2.0.0: + resolution: {integrity: sha512-f9vHgsCWBq2ugHAkGMiiYY+AYG0D/cbloKKg0nhaaaSNsujdGIpVXCNsrJpCKr5M0f4aI31mr13UjY6GAuXCKA==} strnum@1.0.5: resolution: {integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==} @@ -10160,6 +11625,9 @@ packages: style-to-object@1.0.6: resolution: {integrity: sha512-khxq+Qm3xEyZfKd/y9L3oIWQimxuc4STrQKtQn8aSDRHb8mFgpukgX1hdzfrMEW6JCjyJ8p89x+IUMVnCBI1PA==} + stylis@4.2.0: + resolution: {integrity: sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==} + sucrase@3.35.0: resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} engines: {node: '>=16 || 14 >=14.17'} @@ -10168,8 +11636,8 @@ packages: sudo-prompt@9.2.1: resolution: {integrity: sha512-Mu7R0g4ig9TUuGSxJavny5Rv0egCEtpZRNMrZaYS1vxkiIxGiGUwoezU3LazIQ+KE04hTrTfNPgxU5gzi7F5Pw==} - superstruct@1.0.4: - resolution: {integrity: sha512-7JpaAoX2NGyoFlI9NBh66BQXGONc+uE+MRS5i2iOBKuS4e+ccgMDjATgZldkah+33DakBxDHiss9kvUcGAO8UQ==} + superstruct@1.0.3: + resolution: {integrity: sha512-8iTn3oSS8nRGn+C2pgXSKPI3jmpm6FExNazNpjvqS6ZUJQCej3PUXEKM8NjHBOs54ExM+LPW/FBRhymrdcCiSg==} engines: {node: '>=14.0.0'} supports-color@5.5.0: @@ -10188,8 +11656,8 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} - svelte-check@3.7.1: - resolution: {integrity: sha512-U4uJoLCzmz2o2U33c7mPDJNhRYX/DNFV11XTUDlFxaKLsO7P+40gvJHMPpoRfa24jqZfST4/G9fGNcUGMO8NAQ==} + svelte-check@3.8.4: + resolution: {integrity: sha512-61aHMkdinWyH8BkkTX9jPLYxYzaAAz/FK/VQqdr2FiCQQ/q04WCwDlpGbHff1GdrMYTmW8chlTFvRWL9k0A8vg==} hasBin: true peerDependencies: svelte: ^3.55.0 || ^4.0.0-next.0 || ^4.0.0 || ^5.0.0-next.0 @@ -10199,11 +11667,11 @@ packages: peerDependencies: svelte: ^3.55.0 || ^4.0.0 - svelte-eslint-parser@0.36.0: - resolution: {integrity: sha512-/6YmUSr0FAVxW8dXNdIMydBnddPMHzaHirAZ7RrT21XYdgGGZMh0LQG6CZsvAFS4r2Y4ItUuCQc8TQ3urB30mQ==} + svelte-eslint-parser@0.35.0: + resolution: {integrity: sha512-CtbPseajW0gjwEvHiuzYJkPDjAcHz2FaHt540j6RVYrZgnE6xWkzUBodQ4I3nV+G5AS0Svt8K6aIA/CIU9xT2Q==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: - svelte: ^3.37.0 || ^4.0.0 || ^5.0.0-next.115 + svelte: ^3.37.0 || ^4.0.0 || ^5.0.0-next.112 peerDependenciesMeta: svelte: optional: true @@ -10221,9 +11689,9 @@ packages: peerDependencies: svelte: ^3 || ^4 - svelte-preprocess@5.1.4: - resolution: {integrity: sha512-IvnbQ6D6Ao3Gg6ftiM5tdbR6aAETwjhHV+UKGf5bHGYR69RQvF1ho0JKPcbUON4vy4R7zom13jPjgdOWCQ5hDA==} - engines: {node: '>= 16.0.0'} + svelte-preprocess@5.1.3: + resolution: {integrity: sha512-xxAkmxGHT+J/GourS5mVJeOXZzne1FR5ljeOUAMXUkfEhkLEllRreXpbl3dIYJlcJRfL1LO1uIAPpBpBfiqGPw==} + engines: {node: '>= 16.0.0', pnpm: ^8.0.0} peerDependencies: '@babel/core': ^7.10.2 coffeescript: ^2.5.1 @@ -10263,53 +11731,53 @@ packages: peerDependencies: svelte: ^3 || ^4 - svelte2tsx@0.7.8: - resolution: {integrity: sha512-ABK3RDFcy59AqAiU1N5Kxu1RnKrb1GDMrQjLgNgJfE8Q+coCKpjCAPtUVKQM2HnmuqeNWcT3NqfXbE+ZmN5Pow==} + svelte2tsx@0.7.19: + resolution: {integrity: sha512-PME/9mILn9wOihtk2dxu9tmf2+B9X6oWuqYPJRKSjqU4wq3Pc6+fOuYV7T3H+QF5afmA1oDobfXC6dzmK9NAVw==} peerDependencies: svelte: ^3.55 || ^4.0.0-next.0 || ^4.0 || ^5.0.0-next.0 typescript: ^4.9.4 || ^5.0.0 - svelte@4.2.16: - resolution: {integrity: sha512-mQwHpqHD2PmFcCyHaZ7XiTqposaLvJ75WpYcyY5/ce3qxbYtwQpZ+M7ZKP+2CG5U6kfnBZBpPLyofhlE6ROrnQ==} + svelte@4.2.13: + resolution: {integrity: sha512-jtVt2KXLbQnsWN93Zd7EVboNh8Tqexes4rZfXNP7nYRjd9+JjubTD8BXloUmU1OUYpc6pdd1aKBhCV+b2ZKoMg==} + engines: {node: '>=16'} + + svelte@4.2.17: + resolution: {integrity: sha512-N7m1YnoXtRf5wya5Gyx3TWuTddI4nAyayyIWFojiWV5IayDYNV5i2mRp/7qNGol4DtxEYxljmrbgp1HM6hUbmQ==} engines: {node: '>=16'} sveltedoc-parser@4.2.1: resolution: {integrity: sha512-sWJRa4qOfRdSORSVw9GhfDEwsbsYsegnDzBevUCF6k/Eis/QqCu9lJ6I0+d/E2wOWCjOhlcJ3+jl/Iur+5mmCw==} engines: {node: '>=10.0.0'} + swarm-js@0.1.42: + resolution: {integrity: sha512-BV7c/dVlA3R6ya1lMlSSNPLYrntt0LUq4YMgy3iwpCIc6rZnS5W2wUoctarZ5pXlpKtxDDf9hNziEkcfrxdhqQ==} + symbol-tree@3.2.4: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} - synckit@0.8.8: - resolution: {integrity: sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ==} + synckit@0.8.6: + resolution: {integrity: sha512-laHF2savN6sMeHCjLRkheIU4wo3Zg9Ln5YOjOo7sZ5dVQW8yF5pPE5SIw1dsPhq3TRp1jisKRCdPhfs/1WMqDA==} engines: {node: ^14.18.0 || >=16.0.0} system-architecture@0.1.0: resolution: {integrity: sha512-ulAk51I9UVUyJgxlv9M6lFot2WP3e7t8Kz9+IS6D4rVba1tR9kON+Ey69f+1R4Q8cd45Lod6a4IcJIxnzGc/zA==} engines: {node: '>=18'} - table@6.8.2: - resolution: {integrity: sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA==} + table@6.8.1: + resolution: {integrity: sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==} engines: {node: '>=10.0.0'} tailwindcss-image-rendering@1.0.2: resolution: {integrity: sha512-WC3hJd2RbHBYIqtJxwpQ5z94wUNyBrJn1eFz3J/jR7OGrQB8WYbJGvJQ9scNNVzoHEYGoNdZbUI90l9YgpBCwg==} - tailwindcss@3.4.3: - resolution: {integrity: sha512-U7sxQk/n397Bmx4JHbJx/iSOOv5G+II3f1kpLpY2QeUv5DcPdcTsYLlusZfq1NthHS1c1cZoyFmmkex1rzke0A==} + tailwindcss@3.4.4: + resolution: {integrity: sha512-ZoyXOdJjISB7/BcLTR6SEsLgKtDStYyYZVLsUtWChO4Ps20CBad7lfJKVDiejocV4ME1hLmyY0WJE3hSDcmQ2A==} engines: {node: '>=14.0.0'} hasBin: true - tar-fs@2.1.1: - resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} - - tar-stream@2.2.0: - resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} - engines: {node: '>=6'} - - tar@6.2.1: - resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} - engines: {node: '>=10'} + tar@4.4.19: + resolution: {integrity: sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA==} + engines: {node: '>=4.5'} telejson@7.2.0: resolution: {integrity: sha512-1QTEcJkJEhc8OnStBx/ILRu5J2p0GjvWsBx56bmZRqnrkdBMUe+nX92jxV+p3dB4CP6PZCdJMQJwCggkNBMzkQ==} @@ -10318,16 +11786,20 @@ packages: resolution: {integrity: sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==} engines: {node: '>=8'} + temp-dir@3.0.0: + resolution: {integrity: sha512-nHc6S/bwIilKHNRgK/3jlhDoIHcp45YgyiwcAk46Tr0LfEqGBVpmiAyuiuxeVE44m3mXnEeVhaipLOEWmH+Njw==} + engines: {node: '>=14.16'} + temp@0.8.4: resolution: {integrity: sha512-s0ZZzd0BzYv5tLSptZooSjK8oj6C+c19p7Vqta9+6NPOf7r+fxq0cJe6/oN4LTC79sy5NY8ucOJNgwsKCSbfqg==} engines: {node: '>=6.0.0'} - tempy@1.0.1: - resolution: {integrity: sha512-biM9brNqxSc04Ee71hzFbryD11nX7VPhQQY32AdDmjFvodsRFz/3ufeoTZ6uYkRFfGo188tENcASNs3vTdsM0w==} - engines: {node: '>=10'} + term-size@2.2.1: + resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} + engines: {node: '>=8'} - terser@5.31.0: - resolution: {integrity: sha512-Q1JFAoUKE5IMfI4Z/lkE/E6+SwgzO+x4tq4v1AyBLRj8VSYvRO6A/rQrPg1yud4g0En9EKI1TvFRF2tQFcoUkg==} + terser@5.27.2: + resolution: {integrity: sha512-sHXmLSkImesJ4p5apTeT63DsV4Obe1s37qT8qvwHRmVxKTBH7Rv9Wr26VcAMmLbmk9UliiwK8z+657NyJHHy/w==} engines: {node: '>=10'} hasBin: true @@ -10354,11 +11826,16 @@ packages: through2@2.0.5: resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} + timed-out@4.0.1: + resolution: {integrity: sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA==} + engines: {node: '>=0.10.0'} + timeout-abort-controller@3.0.0: resolution: {integrity: sha512-O3e+2B8BKrQxU2YRyEjC/2yFdb33slI22WRdUaDx6rvysfi9anloNZyR2q0l6LnePo5qH7gSM7uZtvvwZbc2yA==} - timers-ext@0.1.7: - resolution: {integrity: sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==} + timers-ext@0.1.8: + resolution: {integrity: sha512-wFH7+SEAcKfJpfLPkrgMPvvwnEtj8W4IurvEyrKsDleXnKLCDw71w8jltvfLa8Rm4qQxxT4jmDBYbJG/z7qoww==} + engines: {node: '>=0.12'} tiny-glob@0.2.9: resolution: {integrity: sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==} @@ -10366,17 +11843,32 @@ packages: tiny-invariant@1.3.3: resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} - tinybench@2.8.0: - resolution: {integrity: sha512-1/eK7zUnIklz4JUUlL+658n58XO2hHLQfSk1Zf2LKieUjxidN16eKFEoDEfjHc3ohofSSqK3X5yO6VGb6iW8Lw==} + tinybench@2.6.0: + resolution: {integrity: sha512-N8hW3PG/3aOoZAN5V/NSAEDz0ZixDSSt5b/a05iqtpgfLWMSVuCo7w0k2vVvEjdrIoeGqZzweX2WlyioNIHchA==} - tinypool@0.8.4: - resolution: {integrity: sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==} + tinyexec@0.3.0: + resolution: {integrity: sha512-tVGE0mVJPGb0chKhqmsoosjsS+qUnJVGJpZgsHYQcGoPlG3B51R3PouqTgEGH2Dc9jjFyOqOpix6ZHNMXp1FZg==} + + tinypool@0.8.3: + resolution: {integrity: sha512-Ud7uepAklqRH1bvwy22ynrliC7Dljz7Tm8M/0RBUW+YRa4YHhZ6e4PpgE+fu1zr/WqB1kbeuVrdfeuyIBpy4tw==} + engines: {node: '>=14.0.0'} + + tinyrainbow@1.2.0: + resolution: {integrity: sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==} + engines: {node: '>=14.0.0'} + + tinyspy@2.2.0: + resolution: {integrity: sha512-d2eda04AN/cPOR89F7Xv5bK/jrQEhmcLFe6HFldoeO9AJtps+fqEnh486vnT/8y4bw38pSyxDcTCAq+Ks2aJTg==} engines: {node: '>=14.0.0'} - tinyspy@2.2.1: - resolution: {integrity: sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==} + tinyspy@3.0.2: + resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==} engines: {node: '>=14.0.0'} + titleize@3.0.0: + resolution: {integrity: sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==} + engines: {node: '>=12'} + tmp@0.0.33: resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} engines: {node: '>=0.6.0'} @@ -10392,9 +11884,6 @@ packages: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} - tocbot@4.27.20: - resolution: {integrity: sha512-6M78FT20+FA5edtx7KowLvhG3gbZ6GRcEkL/0b2TcPbn6Ba+1ayI3SEVxe25zjkWGs0jd04InImaO81Hd8Hukw==} - toidentifier@1.0.1: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} engines: {node: '>=0.6'} @@ -10403,8 +11892,12 @@ packages: resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} engines: {node: '>=6'} - tough-cookie@4.1.4: - resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==} + 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: @@ -10424,6 +11917,12 @@ packages: trough@2.2.0: resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} + ts-api-utils@1.2.1: + resolution: {integrity: sha512-RIYA36cJn2WiH9Hy77hdF9r7oEwxAtB/TS9/S4Qd90Ap4z5FSiin5zEiTL44OII1Y3IIlEvxwxFUVgrHSZ/UpA==} + engines: {node: '>=16'} + peerDependencies: + typescript: '>=4.2.0' + ts-api-utils@1.3.0: resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} engines: {node: '>=16'} @@ -10434,8 +11933,8 @@ packages: resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} engines: {node: '>=6.10'} - ts-essentials@9.4.2: - resolution: {integrity: sha512-mB/cDhOvD7pg3YCLk2rOtejHjjdSi9in/IBYE13S+8WA5FBSraYf4V/ws55uvs0IvQ/l0wBOlXy5yBNZ9Bl8ZQ==} + ts-essentials@9.4.1: + resolution: {integrity: sha512-oke0rI2EN9pzHsesdmrOrnqv1eQODmJpd/noJjwj2ZPC3Z4N2wbjrOEqnsEgmvlO2+4fBb0a794DCna2elEVIQ==} peerDependencies: typescript: '>=4.1.0' peerDependenciesMeta: @@ -10462,8 +11961,18 @@ packages: '@swc/wasm': optional: true - tsconfck@3.0.3: - resolution: {integrity: sha512-4t0noZX9t6GcPTfBAbIbbIU4pfpCwh0ueq3S4O/5qXI1VwK1outmxhe9dOiEWqMz3MW2LKgDTpqWV+37IWuVbA==} + tsconfck@3.1.1: + resolution: {integrity: sha512-00eoI6WY57SvZEVjm13stEVE90VkEdJAFGgpFLTsZbJyW/LwFQ7uQxJHWpZ2hzSWgCPKc9AnBnNP+0X7o3hAmQ==} + engines: {node: ^18 || >=20} + hasBin: true + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + + tsconfck@3.1.3: + resolution: {integrity: sha512-ulNZP1SVpRDesxeMLON/LtWM8HIgAJEIVpVVhBM6gsmvQ8+Rh+ZG7FWGvHh7Ah3pRABwVJWklWCr/BTZSv0xnQ==} engines: {node: ^18 || >=20} hasBin: true peerDependencies: @@ -10472,24 +11981,46 @@ packages: typescript: optional: true - tsconfig-paths@3.15.0: - resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} + tsconfig-paths@3.14.2: + resolution: {integrity: sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==} tslib@1.14.1: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + tslib@2.4.0: + resolution: {integrity: sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==} + tslib@2.6.2: resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + tsort@0.0.1: + resolution: {integrity: sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw==} + tsutils@3.21.0: resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} engines: {node: '>= 6'} peerDependencies: typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' + tunnel-agent@0.6.0: + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + + tunnel@0.0.6: + resolution: {integrity: sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==} + engines: {node: '>=0.6.11 <=0.7.0 || >=0.7.3'} + tween-functions@1.2.0: resolution: {integrity: sha512-PZBtLYcCLtEcjL14Fzb1gSxPBeL7nWvGhO5ZFPGqziCcr8uvHp0NDmdjBchp6KHL+tExcg0m3NISmKxhU394dA==} + 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'} @@ -10498,26 +12029,18 @@ packages: resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} engines: {node: '>=4'} - type-fest@0.16.0: - resolution: {integrity: sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==} - 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.6.0: - resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} - engines: {node: '>=8'} + type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} 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@2.19.0: resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} engines: {node: '>=12.20'} @@ -10526,41 +12049,51 @@ packages: resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} engines: {node: '>= 0.6'} + type@1.2.0: + resolution: {integrity: sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==} + type@2.7.2: resolution: {integrity: sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==} - typed-array-buffer@1.0.2: - resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} + typed-array-buffer@1.0.0: + resolution: {integrity: sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==} engines: {node: '>= 0.4'} - typed-array-byte-length@1.0.1: - resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} + 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.2: - resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==} + typed-array-byte-offset@1.0.0: + resolution: {integrity: sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==} engines: {node: '>= 0.4'} - typed-array-length@1.0.6: - resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} - 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==} typesafe-path@0.2.2: resolution: {integrity: sha512-OJabfkAg1WLZSqJAJ0Z6Sdt3utnbzr/jh+NAHoyWHJe8CMSy79Gm085094M9nvTPy22KzTVn5Zq5mbapCI/hPA==} - typescript-auto-import-cache@0.3.2: - resolution: {integrity: sha512-+laqe5SFL1vN62FPOOJSUDTZxtgsoOXjneYOXIpx5rQ4UMiN89NAtJLpqLqyebv9fgQ/IMeeTX+mQyRnwvJzvg==} + typescript-auto-import-cache@0.3.3: + resolution: {integrity: sha512-ojEC7+Ci1ij9eE6hp8Jl9VUNnsEKzztktP5gtYNRMrTmfXVwA1PITYYAkpxCvvupdSYa/Re51B6KMcv1CTZEUA==} + + typescript@5.4.3: + resolution: {integrity: sha512-KrPd3PKaCLr78MalgiwJnA25Nm8HAmdwN3mYUYZgG/wizIo9EainNVQI9/yDavtVFRN2h3k8uf3GLHuhDMgEHg==} + engines: {node: '>=14.17'} + hasBin: true - typescript@5.4.5: - resolution: {integrity: sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==} + typescript@5.5.3: + resolution: {integrity: sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==} engines: {node: '>=14.17'} hasBin: true - ufo@1.5.3: - resolution: {integrity: sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==} + ufo@1.4.0: + resolution: {integrity: sha512-Hhy+BhRBleFjpJ2vchUNN40qgkh0366FWJGqVLYBHev0vpHTrXSA0ryT+74UiW6KWsldNurQMKGqCm1M2zBciQ==} - uglify-js@3.17.4: - resolution: {integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==} + uglify-js@3.19.3: + resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==} engines: {node: '>=0.8.0'} hasBin: true @@ -10573,11 +12106,17 @@ packages: uint8arrays@3.1.0: resolution: {integrity: sha512-ei5rfKtoRO8OyOIor2Rz5fhzjThwIHJZ3uyDPnDHTXbP0aMQ1RN/6AI5B5d9dBxJOU+BvOAk7ZQ1xphsX8Lrog==} + uint8arrays@3.1.1: + resolution: {integrity: sha512-+QJa8QRnbdXVpHYjLoTpJIdCTiw9Ir62nocClWuXIq2JIh4Uta0cQsTSpFL678p2CN8B+XSApwcU+pQEqVpKWg==} + uint8arrays@4.0.10: resolution: {integrity: sha512-AnJNUGGDJAgFw/eWu/Xb9zrVKEGlwJJCaeInlf3BkecE/zcTobk5YXYIPNQJO1q5Hh1QZrQQHf0JvcHqz2hqoA==} - uint8arrays@5.0.3: - resolution: {integrity: sha512-6LBuKji28kHjgPJMkQ6GDaBb1lRwIhyOYq6pDGwYMoDPfImE9SkuYENVmR0yu9yGgs2clHUSY9fKDukR+AXfqQ==} + uint8arrays@5.1.0: + resolution: {integrity: sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==} + + ultron@1.1.1: + resolution: {integrity: sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==} unbox-primitive@1.0.2: resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} @@ -10588,8 +12127,8 @@ packages: undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} - undici@5.28.4: - resolution: {integrity: sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==} + undici@5.28.3: + resolution: {integrity: sha512-3ItfzbrhDlINjaP0duwnNsKpDQk3acHI3gVJ1z4fmwMK31k5G9OVIAMLSIaP6w4FaGkaAkN6zaQO9LUvZ1t7VA==} engines: {node: '>=14.0'} unenv@1.9.0: @@ -10598,9 +12137,6 @@ packages: unfetch@4.2.0: resolution: {integrity: sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA==} - unherit@3.0.1: - resolution: {integrity: sha512-akOOQ/Yln8a2sgcLj4U0Jmx0R5jpIg2IUyRrWOzmEbjBtGzBdHtSeFKgoEcoH4KYIG/Pb8GQ/BwtYm0GCq1Sqg==} - unicode-canonical-property-names-ecmascript@2.0.0: resolution: {integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==} engines: {node: '>=4'} @@ -10617,31 +12153,20 @@ packages: resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==} engines: {node: '>=4'} - unicorn-magic@0.1.0: - resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==} - engines: {node: '>=18'} - - unified@10.1.2: - resolution: {integrity: sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==} - - unified@11.0.4: - resolution: {integrity: sha512-apMPnyLjAX+ty4OrNap7yumyVAMlKx5IWU2wlzzUdYJO9A8f1p9m/gywF/GM2ZDFcjQPrx59Mc90KwmxsoklxQ==} - - unique-string@2.0.0: - resolution: {integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==} - engines: {node: '>=8'} + unified@11.0.5: + resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} unist-util-find-after@5.0.0: resolution: {integrity: sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==} - unist-util-is@5.2.1: - resolution: {integrity: sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==} - unist-util-is@6.0.0: resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} - unist-util-modify-children@3.1.1: - resolution: {integrity: sha512-yXi4Lm+TG5VG+qvokP6tpnk+r1EPwyYL04JWDxLvgvPV40jANh7nm3udk65OOWquvbMDe+PL9+LmkxDpTv/7BA==} + unist-util-modify-children@4.0.0: + resolution: {integrity: sha512-+tdN5fGNddvsQdIzUF3Xx82CU9sMM+fA0dLgR9vOmT0oPT2jH+P1nd5lSqfCfXAw+93NhcXNY2qqvTUtE4cQkw==} + + unist-util-modify-children@4.0.0: + resolution: {integrity: sha512-+tdN5fGNddvsQdIzUF3Xx82CU9sMM+fA0dLgR9vOmT0oPT2jH+P1nd5lSqfCfXAw+93NhcXNY2qqvTUtE4cQkw==} unist-util-position-from-estree@2.0.0: resolution: {integrity: sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==} @@ -10652,24 +12177,15 @@ packages: unist-util-remove-position@5.0.0: resolution: {integrity: sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==} - unist-util-stringify-position@3.0.3: - resolution: {integrity: sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==} - unist-util-stringify-position@4.0.0: resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} - unist-util-visit-children@2.0.2: - resolution: {integrity: sha512-+LWpMFqyUwLGpsQxpumsQ9o9DG2VGLFrpz+rpVXYIEdPy57GSy5HioC0g3bg/8WP9oCLlapQtklOzQ8uLS496Q==} - - unist-util-visit-parents@5.1.3: - resolution: {integrity: sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==} + unist-util-visit-children@3.0.0: + resolution: {integrity: sha512-RgmdTfSBOg04sdPcpTSD1jzoNBjt9a80/ZCzp5cI9n1qPzLZWF9YdvWGN2zmTumP1HWhXKdUWexjy/Wy/lJ7tA==} unist-util-visit-parents@6.0.1: resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} - unist-util-visit@4.1.2: - resolution: {integrity: sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==} - unist-util-visit@5.0.0: resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} @@ -10689,26 +12205,30 @@ packages: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} engines: {node: '>= 0.8'} - unplugin@1.10.1: - resolution: {integrity: sha512-d6Mhq8RJeGA8UfKCu54Um4lFA0eSaRa3XxdAJg8tIdxbu1ubW0hBCZUL7yI2uGyYCRndvbK8FLHzqy2XKfeMsg==} + unplugin@1.14.1: + resolution: {integrity: sha512-lBlHbfSFPToDYp9pjXlUEFVxYLaue9f9T1HC+4OHlmj+HnMDdz9oZY+erXfoCe/5V/7gKUSY2jpXPb9S7f0f/w==} engines: {node: '>=14.0.0'} + peerDependencies: + webpack-sources: ^3 + peerDependenciesMeta: + webpack-sources: + optional: true - unstorage@1.10.2: - resolution: {integrity: sha512-cULBcwDqrS8UhlIysUJs2Dk0Mmt8h7B0E6mtR+relW9nZvsf/u4SkAYyNliPiPW7XtFNb5u3IUMkxGxFTTRTgQ==} + unstorage@1.10.1: + resolution: {integrity: sha512-rWQvLRfZNBpF+x8D3/gda5nUCQL2PgXy2jNG4U7/Rc9BGEv9+CAJd0YyGCROUBKs9v49Hg8huw3aih5Bf5TAVw==} peerDependencies: - '@azure/app-configuration': ^1.5.0 + '@azure/app-configuration': ^1.4.1 '@azure/cosmos': ^4.0.0 '@azure/data-tables': ^13.2.2 - '@azure/identity': ^4.0.1 - '@azure/keyvault-secrets': ^4.8.0 - '@azure/storage-blob': ^12.17.0 - '@capacitor/preferences': ^5.0.7 - '@netlify/blobs': ^6.5.0 || ^7.0.0 - '@planetscale/database': ^1.16.0 - '@upstash/redis': ^1.28.4 - '@vercel/kv': ^1.0.1 + '@azure/identity': ^3.3.2 + '@azure/keyvault-secrets': ^4.7.0 + '@azure/storage-blob': ^12.16.0 + '@capacitor/preferences': ^5.0.6 + '@netlify/blobs': ^6.2.0 + '@planetscale/database': ^1.11.0 + '@upstash/redis': ^1.23.4 + '@vercel/kv': ^0.2.3 idb-keyval: ^6.2.1 - ioredis: ^5.3.2 peerDependenciesMeta: '@azure/app-configuration': optional: true @@ -10734,8 +12254,6 @@ packages: optional: true idb-keyval: optional: true - ioredis: - optional: true untildify@4.0.0: resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} @@ -10745,17 +12263,17 @@ packages: resolution: {integrity: sha512-4luGP9LMYszMRZwsvyUd9MrxgEGZdZuZgpVQHEEX0lCYFESasVRvZd0EYpCkOIbJKHMuv0LskpXc/8Un+MJzEQ==} hasBin: true - update-browserslist-db@1.0.15: - resolution: {integrity: sha512-K9HWH62x3/EalU1U6sjSZiylm9C8tgq2mSvshZpqc7QE69RaA2qjhkW2HlNA0tFpEbtyFz7HTqbSdN4MSwUodA==} + update-browserslist-db@1.0.13: + resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' - upper-case-first@2.0.2: - resolution: {integrity: sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==} - - upper-case@2.0.2: - resolution: {integrity: sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==} + update-browserslist-db@1.1.0: + resolution: {integrity: sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' uqr@0.1.2: resolution: {integrity: sha512-MJu7ypHq6QasgF5YRTjqscSzQp/W11zoUk6kvmlH+fmWEs63Y0Eib13hYFwAzagRJcVY8WVnlV+eBDUGMJ5IbA==} @@ -10766,31 +12284,18 @@ packages: url-parse@1.5.10: resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} - use-callback-ref@1.3.2: - resolution: {integrity: sha512-elOQwe6Q8gqZgDA8mrh44qRTQqpIHDcZ3hXTLjBe1i4ph8XpNJnO+aQf3NaG+lriLopI4HMx9VjQLfPQ6vhnoA==} - engines: {node: '>=10'} - peerDependencies: - '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - - use-sidecar@1.1.2: - resolution: {integrity: sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==} - engines: {node: '>=10'} - peerDependencies: - '@types/react': ^16.9.0 || ^17.0.0 || ^18.0.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@types/react': - optional: true + url-set-query@1.0.0: + resolution: {integrity: sha512-3AChu4NiXquPfeckE5R5cGdiHCMWJx1dwCWOmWIL4KHAziJNOFIYJlpGFeKDvwLPHovZRCxK3cYlwzqI9Vp+Gg==} use-sync-external-store@1.2.0: resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 + utf-8-validate@5.0.10: + resolution: {integrity: sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==} + engines: {node: '>=6.14.2'} + utf-8-validate@6.0.3: resolution: {integrity: sha512-uIuGf9TWQ/y+0Lp+KGZCMuJWc3N9BHA+l/UmHd/oUHwJJDeysyTRxNQVkbzsIWfGFbRe3OcgML/i0mvVRPOyDA==} engines: {node: '>=6.14.2'} @@ -10808,6 +12313,11 @@ packages: 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 @@ -10822,8 +12332,9 @@ packages: v8-compile-cache@2.4.0: resolution: {integrity: sha512-ocyWc3bAHBB/guyqJQVI5o4BZkPhznPYUG2ea80Gond/BgNWpap8TOmLSeeQG7bnh2KMISxskdADG59j7zruhw==} - validate-npm-package-license@3.0.4: - resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + v8-to-istanbul@9.2.0: + resolution: {integrity: sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==} + engines: {node: '>=10.12.0'} valtio@1.11.2: resolution: {integrity: sha512-1XfIxnUXzyswPAPXo1P3Pdx2mq/pIqZICkWN60Hby0d9Iqb+MEIpqgYVlbflvHdrp2YR/q3jyKWRPJJ100yxaw==} @@ -10837,6 +12348,9 @@ packages: react: optional: true + varint@5.0.2: + resolution: {integrity: sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow==} + varint@6.0.0: resolution: {integrity: sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==} @@ -10844,21 +12358,22 @@ packages: 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-location@5.0.2: resolution: {integrity: sha512-NXPYyxyBSH7zB5U6+3uDdd6Nybz6o6/od9rk8bp9H8GR3L+cm/fC0uUTbqBmUTnMCUDslAGBOIKNfvvb+gGlDg==} - vfile-message@3.1.4: - resolution: {integrity: sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==} - vfile-message@4.0.2: resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} - vfile@5.3.7: - resolution: {integrity: sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==} - vfile@6.0.1: resolution: {integrity: sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==} + vfile@6.0.3: + resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + viem@1.21.4: resolution: {integrity: sha512-BNVYdSaUjeS2zKQgPs+49e5JKocfo60Ib2yiXOWBT6LuVxY1I/6fFX3waEtpXvL1Xn4qu+BVitVtMh9lyThyhQ==} peerDependencies: @@ -10867,22 +12382,27 @@ packages: typescript: optional: true - viem@2.10.2: - resolution: {integrity: sha512-gcOL+XxA0UWDarli856OEgumaBz4df/qNMpgno4NTSSZtJSC1XixIb3gWjVBei6Vx085ivw/U9ZE8gdniIo7fA==} + viem@2.21.7: + resolution: {integrity: sha512-PFgppakInuHX31wHDx1dzAjhj4t6Po6WrWtutDi33z2vabIT0Wv8qT6tl7DLqfLy2NkTqfN2mdshYLeoI5ZHvQ==} peerDependencies: typescript: '>=5.0.4' peerDependenciesMeta: typescript: optional: true - viem@2.13.1: - resolution: {integrity: sha512-QaSCtPXb9uVaba+vOsyCFX21BDWNbjBOuXIWWlQXLmECtr/mbJ64XUHyFz6KLvUwAsQ+vxUQVwgmXc3jVMxwYw==} + viem@2.9.29: + resolution: {integrity: sha512-LWvDSyB2tftKuSMAyZTXk3pDYj3c0aaOdr2JbDZEsPJw5zVbqg3FpoPHnUkHai8KcZI8aPWRKV31TYV1cBse9A==} peerDependencies: typescript: '>=5.0.4' peerDependenciesMeta: typescript: optional: true + vite-node@1.5.0: + resolution: {integrity: sha512-tV8h6gMj6vPzVCa7l+VGq9lwoJjW8Y79vst8QZZGiuRAfijU+EEWuc0kFpmndQrWhMMhet1jdSF+40KSZUqIIw==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + vite-node@1.6.0: resolution: {integrity: sha512-de6HJgzC+TFzOu0NTC4RAIsyf/DY/ibWDYQUcuEA84EMHhcefTUGkjFHKKEJhQN4A+6I0u++kr3l36ZF2d7XRw==} engines: {node: ^18.0.0 || >=20.0.0} @@ -10924,6 +12444,34 @@ packages: terser: optional: true + vite@5.1.3: + resolution: {integrity: sha512-UfmUD36DKkqhi/F75RrxvPpry+9+tTkrXfMNZD+SboZqBCMsxKtO52XeGzzuh7ioz+Eo/SYDBbdb0Z7vgcDJew==} + 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.2.11: resolution: {integrity: sha512-HndV31LWW05i1BLPMUCE1B9E9GFbOu1MbenhS58FuK6owSO5qHm7GiCotrNY1YE5rMeQSFBGmT5ZaLEjFizgiQ==} engines: {node: ^18.0.0 || >=20.0.0} @@ -10952,6 +12500,37 @@ packages: terser: optional: true + vite@5.4.5: + resolution: {integrity: sha512-pXqR0qtb2bTwLkev4SE3r4abCNioP3GkjvIDLlzziPpXtHgiJIjuKl+1GN6ESOT3wMjG3JTeARopj2SwYaHTOA==} + 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: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + vitefu@0.2.5: resolution: {integrity: sha512-SgHtMLoqaeeGnd2evZ849ZbACbnwQCIwRH57t18FxcXoZop0uQu0uzlIhJBlF/eWVzuce0sHeqPcDo+evVcg8Q==} peerDependencies: @@ -10960,6 +12539,14 @@ packages: vite: optional: true + vitefu@1.0.2: + resolution: {integrity: sha512-0/iAvbXyM3RiPPJ4lyD4w6Mjgtf4ejTK6TPvTNG3H32PLwuT0N/ZjJLiXug7ETE/LWtTeHw9WRv7uX/tIKYyKg==} + peerDependencies: + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 + peerDependenciesMeta: + vite: + optional: true + vitest-fetch-mock@0.2.2: resolution: {integrity: sha512-XmH6QgTSjCWrqXoPREIdbj40T7i1xnGmAsTAgfckoO75W1IEHKR8hcPCQ7SO16RsdW1t85oUm6pcQRLeBgjVYQ==} engines: {node: '>=14.14.0'} @@ -10972,6 +12559,31 @@ packages: typescript: 3.x || 4.x || 5.x vitest: '>=0.31.1' + vitest@1.5.0: + resolution: {integrity: sha512-d8UKgR0m2kjdxDWX6911uwxout6GHS0XaGH1cksSIVVG8kRlE7G7aBw7myKQCvDI5dT4j7ZMa+l706BIORMDLw==} + 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.5.0 + '@vitest/ui': 1.5.0 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@types/node': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + vitest@1.6.0: resolution: {integrity: sha512-H5r/dN06swuFnzNFhq/dnz37bPXnq8xB2xB5JOVk8K09rUtoeNN+LHWkoQ0A/i3hvbUKKcCei9KpbxqHMLhLLA==} engines: {node: ^18.0.0 || >=20.0.0} @@ -11004,34 +12616,34 @@ packages: resolution: {integrity: sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==} engines: {node: '>=0.10.0'} - volar-service-css@0.0.43: - resolution: {integrity: sha512-rg2gTXhswq6Wz8euZgCRS68+7EPH+3R7SeTqYfAAtHKoU0rS1bwdxP1CWHezyxnHrLMiXEypCgJJWcMTay3W7g==} + volar-service-css@0.0.61: + resolution: {integrity: sha512-Ct9L/w+IB1JU8F4jofcNCGoHy6TF83aiapfZq9A0qYYpq+Kk5dH+ONS+rVZSsuhsunq8UvAuF8Gk6B8IFLfniw==} peerDependencies: - '@volar/language-service': ~2.2.0 + '@volar/language-service': ~2.4.0 peerDependenciesMeta: '@volar/language-service': optional: true - volar-service-emmet@0.0.43: - resolution: {integrity: sha512-ODsSOsSScVTNSD1Z+e4EV21RuN3q38ahGnuyxKYHW9Fg0RwfLatHl6wIRfj21XlVVa8twBMsA/Fp43ObuDEBxQ==} + volar-service-emmet@0.0.61: + resolution: {integrity: sha512-iiYqBxjjcekqrRruw4COQHZME6EZYWVbkHjHDbULpml3g8HGJHzpAMkj9tXNCPxf36A+f1oUYjsvZt36qPg4cg==} peerDependencies: - '@volar/language-service': ~2.2.0 + '@volar/language-service': ~2.4.0 peerDependenciesMeta: '@volar/language-service': optional: true - volar-service-html@0.0.43: - resolution: {integrity: sha512-Z/S7SCkHmpoR708WTQLCE3k+hfT16xjMfq9Htv7Y3yJeykah1jZO8oZX3433OPFfbS/ZFbGa2VlAIgDTVRU5Pg==} + volar-service-html@0.0.61: + resolution: {integrity: sha512-yFE+YmmgqIL5HI4ORqP++IYb1QaGcv+xBboI0WkCxJJ/M35HZj7f5rbT3eQ24ECLXFbFCFanckwyWJVz5KmN3Q==} peerDependencies: - '@volar/language-service': ~2.2.0 + '@volar/language-service': ~2.4.0 peerDependenciesMeta: '@volar/language-service': optional: true - volar-service-prettier@0.0.43: - resolution: {integrity: sha512-Beq+iNyG05PlSPTISOFK5Yoj29rXdGb6htvyFk2u0jVFRGX1QD0Pb5ze9OiqfUVwT+3cFZhPrSPndbTR1ft/aA==} + volar-service-prettier@0.0.61: + resolution: {integrity: sha512-F612nql5I0IS8HxXemCGvOR2Uxd4XooIwqYVUvk7WSBxP/+xu1jYvE3QJ7EVpl8Ty3S4SxPXYiYTsG3bi+gzIQ==} peerDependencies: - '@volar/language-service': ~2.2.0 + '@volar/language-service': ~2.4.0 prettier: ^2.2 || ^3.0 peerDependenciesMeta: '@volar/language-service': @@ -11039,31 +12651,53 @@ packages: prettier: optional: true - volar-service-typescript-twoslash-queries@0.0.43: - resolution: {integrity: sha512-FUqgvK2a6YxNO0P+zmY5syVatD8I7+qEA+mj1lotqQxwtY0Gh3UDCCqTVapX1E4VxF/pvNac7eVOBkCUVVZC5w==} + volar-service-typescript-twoslash-queries@0.0.61: + resolution: {integrity: sha512-99FICGrEF0r1E2tV+SvprHPw9Knyg7BdW2fUch0tf59kG+KG+Tj4tL6tUg+cy8f23O/VXlmsWFMIE+bx1dXPnQ==} peerDependencies: - '@volar/language-service': ~2.2.0 + '@volar/language-service': ~2.4.0 peerDependenciesMeta: '@volar/language-service': optional: true - volar-service-typescript@0.0.43: - resolution: {integrity: sha512-oXYZHuM7QYBmgSiheFkoQPyUzzvm9ddaUzfDqc9cOM+fDuMAkUer2bEqnqZXerGjhsjuXNCu4PGlSOJJMxWe3A==} + volar-service-typescript@0.0.61: + resolution: {integrity: sha512-4kRHxVbW7wFBHZWRU6yWxTgiKETBDIJNwmJUAWeP0mHaKpnDGj/astdRFKqGFRYVeEYl45lcUPhdJyrzanjsdQ==} peerDependencies: - '@volar/language-service': ~2.2.0 + '@volar/language-service': ~2.4.0 peerDependenciesMeta: '@volar/language-service': optional: true - vscode-css-languageservice@6.2.14: - resolution: {integrity: sha512-5UPQ9Y1sUTnuMyaMBpO7LrBkqjhEJb5eAwdUlDp+Uez8lry+Tspnk3+3p2qWS4LlNsr4p3v9WkZxUf1ltgFpgw==} + volar-service-yaml@0.0.61: + resolution: {integrity: sha512-L+gbDiLDQQ1rZUbJ3mf3doDsoQUa8OZM/xdpk/unMg1Vz24Zmi2Ign8GrZyBD7bRoIQDwOH9gdktGDKzRPpUNw==} + peerDependencies: + '@volar/language-service': ~2.4.0 + peerDependenciesMeta: + '@volar/language-service': + optional: true - vscode-html-languageservice@5.2.0: - resolution: {integrity: sha512-cdNMhyw57/SQzgUUGSIMQ66jikqEN6nBNyhx5YuOyj9310+eY9zw8Q0cXpiKzDX8aHYFewQEXRnigl06j/TVwQ==} + vscode-css-languageservice@6.3.1: + resolution: {integrity: sha512-1BzTBuJfwMc3A0uX4JBdJgoxp74cjj4q2mDJdp49yD/GuAq4X0k5WtK6fNcMYr+FfJ9nqgR6lpfCSZDkARJ5qQ==} - vscode-jsonrpc@8.2.0: - resolution: {integrity: sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==} - engines: {node: '>=14.0.0'} + vscode-html-languageservice@5.3.0: + resolution: {integrity: sha512-C4Z3KsP5Ih+fjHpiBc5jxmvCl+4iEwvXegIrzu2F5pktbWvQaBT3YkVPk8N+QlSSMk8oCG6PKtZ/Sq2YHb5e8g==} + + vscode-html-languageservice@5.3.1: + resolution: {integrity: sha512-ysUh4hFeW/WOWz/TO9gm08xigiSsV/FOAZ+DolgJfeLftna54YdmZ4A+lIn46RbdO3/Qv5QHTn1ZGqmrXQhZyA==} + + vscode-json-languageservice@4.1.8: + resolution: {integrity: sha512-0vSpg6Xd9hfV+eZAaYN63xVVMOTmJ4GgHxXnkLCh+9RsQBkWKIghzLhW2B9ebfG+LQQg8uLtsQ2aUKjTgE+QOg==} + engines: {npm: '>=7.0.0'} + + vscode-jsonrpc@6.0.0: + resolution: {integrity: sha512-wnJA4BnEjOSyFMvjZdpiOwhSq9uDoK8e/kpRJDTaMYzwlkrhG1fwDIZI94CLsLzlCK5cIbMMtFlJlfR57Lavmg==} + engines: {node: '>=8.0.0 || >=10.0.0'} + + vscode-jsonrpc@8.2.0: + resolution: {integrity: sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==} + engines: {node: '>=14.0.0'} + + vscode-languageserver-protocol@3.16.0: + resolution: {integrity: sha512-sdeUoAawceQdgIfTI+sdcwkiK2KU+2cbEYA0agzM2uqaUy2UpnnGHtWTHVEtS0ES4zHU0eMFRGN+oQgDxlD66A==} vscode-languageserver-protocol@3.17.5: resolution: {integrity: sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==} @@ -11071,9 +12705,19 @@ packages: vscode-languageserver-textdocument@1.0.11: resolution: {integrity: sha512-X+8T3GoiwTVlJbicx/sIAF+yuJAqz8VvwJyoMVhwEMoEKE/fkDmrqUgDMyBECcM2A2frVZIUj5HI/ErRXCfOeA==} + vscode-languageserver-textdocument@1.0.12: + resolution: {integrity: sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==} + + vscode-languageserver-types@3.16.0: + resolution: {integrity: sha512-k8luDIWJWyenLc5ToFQQMaSrqCHiLwyKPHKPQZ5zz21vM+vIVUSvsRpcbiECH4WR88K2XZqc4ScRcZ7nk/jbeA==} + vscode-languageserver-types@3.17.5: resolution: {integrity: sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==} + vscode-languageserver@7.0.0: + resolution: {integrity: sha512-60HTx5ID+fLRcgdHfmz0LDZAXYEV68fzwG0JWwEPBode9NuMYTIxuYXPg4ngO8i8+Ou0lM7y6GzaYWbiDL0drw==} + hasBin: true + vscode-languageserver@9.0.1: resolution: {integrity: sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==} hasBin: true @@ -11094,27 +12738,109 @@ packages: walker@1.0.8: resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} - watchpack@2.4.1: - resolution: {integrity: sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==} - engines: {node: '>=10.13.0'} - wcwidth@1.0.1: resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} web-namespaces@2.0.1: resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} + web3-bzz@1.10.4: + resolution: {integrity: sha512-ZZ/X4sJ0Uh2teU9lAGNS8EjveEppoHNQiKlOXAjedsrdWuaMErBPdLQjXfcrYvN6WM6Su9PMsAxf3FXXZ+HwQw==} + engines: {node: '>=8.0.0'} + + web3-core-helpers@1.10.4: + resolution: {integrity: sha512-r+L5ylA17JlD1vwS8rjhWr0qg7zVoVMDvWhajWA5r5+USdh91jRUYosp19Kd1m2vE034v7Dfqe1xYRoH2zvG0g==} + engines: {node: '>=8.0.0'} + + web3-core-method@1.10.4: + resolution: {integrity: sha512-uZTb7flr+Xl6LaDsyTeE2L1TylokCJwTDrIVfIfnrGmnwLc6bmTWCCrm71sSrQ0hqs6vp/MKbQYIYqUN0J8WyA==} + engines: {node: '>=8.0.0'} + + web3-core-promievent@1.10.4: + resolution: {integrity: sha512-2de5WnJQ72YcIhYwV/jHLc4/cWJnznuoGTJGD29ncFQHAfwW/MItHFSVKPPA5v8AhJe+r6y4Y12EKvZKjQVBvQ==} + engines: {node: '>=8.0.0'} + + web3-core-requestmanager@1.10.4: + resolution: {integrity: sha512-vqP6pKH8RrhT/2MoaU+DY/OsYK9h7HmEBNCdoMj+4ZwujQtw/Mq2JifjwsJ7gits7Q+HWJwx8q6WmQoVZAWugg==} + engines: {node: '>=8.0.0'} + + web3-core-subscriptions@1.10.4: + resolution: {integrity: sha512-o0lSQo/N/f7/L76C0HV63+S54loXiE9fUPfHFcTtpJRQNDBVsSDdWRdePbWwR206XlsBqD5VHApck1//jEafTw==} + engines: {node: '>=8.0.0'} + + web3-core@1.10.4: + resolution: {integrity: sha512-B6elffYm81MYZDTrat7aEhnhdtVE3lDBUZft16Z8awYMZYJDbnykEbJVS+l3mnA7AQTnSDr/1MjWofGDLBJPww==} + engines: {node: '>=8.0.0'} + web3-eth-abi@1.10.4: resolution: {integrity: sha512-cZ0q65eJIkd/jyOlQPDjr8X4fU6CRL1eWgdLwbWEpo++MPU/2P4PFk5ZLAdye9T5Sdp+MomePPJ/gHjLMj2VfQ==} engines: {node: '>=8.0.0'} + web3-eth-accounts@1.10.4: + resolution: {integrity: sha512-ysy5sVTg9snYS7tJjxVoQAH6DTOTkRGR8emEVCWNGLGiB9txj+qDvSeT0izjurS/g7D5xlMAgrEHLK1Vi6I3yg==} + engines: {node: '>=8.0.0'} + + web3-eth-contract@1.10.4: + resolution: {integrity: sha512-Q8PfolOJ4eV9TvnTj1TGdZ4RarpSLmHnUnzVxZ/6/NiTfe4maJz99R0ISgwZkntLhLRtw0C7LRJuklzGYCNN3A==} + engines: {node: '>=8.0.0'} + + web3-eth-ens@1.10.4: + resolution: {integrity: sha512-LLrvxuFeVooRVZ9e5T6OWKVflHPFgrVjJ/jtisRWcmI7KN/b64+D/wJzXqgmp6CNsMQcE7rpmf4CQmJCrTdsgg==} + engines: {node: '>=8.0.0'} + + web3-eth-iban@1.10.4: + resolution: {integrity: sha512-0gE5iNmOkmtBmbKH2aTodeompnNE8jEyvwFJ6s/AF6jkw9ky9Op9cqfzS56AYAbrqEFuClsqB/AoRves7LDELw==} + engines: {node: '>=8.0.0'} + + web3-eth-personal@1.10.4: + resolution: {integrity: sha512-BRa/hs6jU1hKHz+AC/YkM71RP3f0Yci1dPk4paOic53R4ZZG4MgwKRkJhgt3/GPuPliwS46f/i5A7fEGBT4F9w==} + engines: {node: '>=8.0.0'} + + web3-eth@1.10.4: + resolution: {integrity: sha512-Sql2kYKmgt+T/cgvg7b9ce24uLS7xbFrxE4kuuor1zSCGrjhTJ5rRNG8gTJUkAJGKJc7KgnWmgW+cOfMBPUDSA==} + engines: {node: '>=8.0.0'} + + web3-net@1.10.4: + resolution: {integrity: sha512-mKINnhOOnZ4koA+yV2OT5s5ztVjIx7IY9a03w6s+yao/BUn+Luuty0/keNemZxTr1E8Ehvtn28vbOtW7Ids+Ow==} + engines: {node: '>=8.0.0'} + + web3-providers-http@1.10.4: + resolution: {integrity: sha512-m2P5Idc8hdiO0l60O6DSCPw0kw64Zgi0pMjbEFRmxKIck2Py57RQMu4bxvkxJwkF06SlGaEQF8rFZBmuX7aagQ==} + engines: {node: '>=8.0.0'} + + web3-providers-ipc@1.10.4: + resolution: {integrity: sha512-YRF/bpQk9z3WwjT+A6FI/GmWRCASgd+gC0si7f9zbBWLXjwzYAKG73bQBaFRAHex1hl4CVcM5WUMaQXf3Opeuw==} + engines: {node: '>=8.0.0'} + + web3-providers-ws@1.10.4: + resolution: {integrity: sha512-j3FBMifyuFFmUIPVQR4pj+t5ILhAexAui0opgcpu9R5LxQrLRUZxHSnU+YO25UycSOa/NAX8A+qkqZNpcFAlxA==} + engines: {node: '>=8.0.0'} + + web3-shh@1.10.4: + resolution: {integrity: sha512-cOH6iFFM71lCNwSQrC3niqDXagMqrdfFW85hC9PFUrAr3PUrIem8TNstTc3xna2bwZeWG6OBy99xSIhBvyIACw==} + engines: {node: '>=8.0.0'} + web3-utils@1.10.4: resolution: {integrity: sha512-tsu8FiKJLk2PzhDl9fXbGUWTkkVXYhtTA+SmEFkKft+9BgwLxfCRpU96sWv7ICC8zixBNd3JURVoiR3dUXgP8A==} engines: {node: '>=8.0.0'} + web3@1.10.4: + resolution: {integrity: sha512-kgJvQZjkmjOEKimx/tJQsqWfRDPTTcBfYPa9XletxuHLpHcXdx67w8EFn5AW3eVxCutE9dTVHgGa9VYe8vgsEA==} + engines: {node: '>=8.0.0'} + + webauthn-p256@0.0.5: + resolution: {integrity: sha512-drMGNWKdaixZNobeORVIqq7k5DsRC9FnG201K2QjeOoQLmtSDaSsVZdkg6n5jUALJKcAG++zBPJXmv6hy0nWFg==} + + webextension-polyfill-ts@0.25.0: + resolution: {integrity: sha512-ikQhwwHYkpBu00pFaUzIKY26I6L87DeRI+Q6jBT1daZUNuu8dSrg5U9l/ZbqdaQ1M/TTSPKeAa3kolP5liuedw==} + deprecated: This project has moved to @types/webextension-polyfill + webextension-polyfill@0.10.0: resolution: {integrity: sha512-c5s35LgVa5tFaHhrZDnr3FpQpjj1BB+RXhLTYUxGqBVN460HkbM8TBtEqdXWbpTKfzwCcjAZVF7zXCYSKtcp9g==} + webextension-polyfill@0.7.0: + resolution: {integrity: sha512-su48BkMLxqzTTvPSE1eWxKToPS2Tv5DLGxKexLEVpwFd6Po6N8hhSLIvG6acPAg7qERoEaDL+Y5HQJeJeml5Aw==} + webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} @@ -11122,12 +12848,12 @@ packages: resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} engines: {node: '>=12'} - webpack-sources@3.2.3: - resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} - engines: {node: '>=10.13.0'} + webpack-virtual-modules@0.6.2: + resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} - webpack-virtual-modules@0.6.1: - resolution: {integrity: sha512-poXpCylU7ExuvZK8z+On3kX+S8o/2dQ/SVYueKA0D4WEMXROXgY8Ez50/bQEUmvoSMMrWcrJqCHuhAbsiwg7Dg==} + websocket@1.0.35: + resolution: {integrity: sha512-/REy6amwPZl44DDzvRCkaI1q1bIiQB0mEFQLUrhz3z2EK91cp3n72rAjUlrTP0zV22HJIUOVHQGPxhFRjxjt+Q==} + engines: {node: '>=4.0.0'} whatwg-encoding@3.1.1: resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} @@ -11150,10 +12876,6 @@ packages: which-boxed-primitive@1.0.2: resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} - which-collection@1.0.2: - resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} - engines: {node: '>= 0.4'} - which-module@2.0.1: resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} @@ -11161,18 +12883,18 @@ packages: resolution: {integrity: sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA==} engines: {node: '>=4'} - which-pm@2.0.0: - resolution: {integrity: sha512-Lhs9Pmyph0p5n5Z3mVnN0yWcbQYUAD7rbQUiMsQxOJ3T57k7RFe35SUwWMf7dsbDZks1uOmw4AecB/JMDj3v/w==} - engines: {node: '>=8.15'} - - which-pm@2.1.1: - resolution: {integrity: sha512-xzzxNw2wMaoCWXiGE8IJ9wuPMU+EYhFksjHxrRT8kMT5SnocBPRg69YAMtyV4D12fP582RA+k3P8H9J5EMdIxQ==} - engines: {node: '>=8.15'} + which-pm@3.0.0: + resolution: {integrity: sha512-ysVYmw6+ZBhx3+ZkcPwRuJi38ZOTLJJ33PSHaitLxSKUMsh0LkKd0nC69zZCwt5D+AYUcMK2hhw4yWny20vSGg==} + engines: {node: '>=18.12'} - which-typed-array@1.1.15: - resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} + which-typed-array@1.1.13: + resolution: {integrity: sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==} 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'} @@ -11188,17 +12910,24 @@ packages: engines: {node: '>=8'} hasBin: true + widest-line@3.1.0: + resolution: {integrity: sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==} + engines: {node: '>=8'} + widest-line@4.0.1: resolution: {integrity: sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==} engines: {node: '>=12'} - word-wrap@1.2.5: - resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} - engines: {node: '>=0.10.0'} + winston@2.4.7: + resolution: {integrity: sha512-vLB4BqzCKDnnZH9PHGoS2ycawueX4HLqENXQitvFHczhgW2vFpSOn31LZtVr1KU8YTw7DS4tM+cqyovxo8taVg==} + engines: {node: '>= 0.10.0'} wordwrap@1.0.0: resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} + workerpool@6.5.1: + resolution: {integrity: sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==} + wrap-ansi@6.2.0: resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} engines: {node: '>=8'} @@ -11217,6 +12946,17 @@ packages: write-file-atomic@2.4.3: resolution: {integrity: sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==} + ws@3.3.3: + resolution: {integrity: sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + ws@6.2.2: resolution: {integrity: sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==} peerDependencies: @@ -11240,8 +12980,8 @@ packages: utf-8-validate: optional: true - ws@7.5.9: - resolution: {integrity: sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==} + ws@7.5.10: + resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} engines: {node: '>=8.3.0'} peerDependencies: bufferutil: ^4.0.1 @@ -11252,20 +12992,20 @@ packages: utf-8-validate: optional: true - ws@8.11.0: - resolution: {integrity: sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==} + 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 + 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==} + ws@8.16.0: + resolution: {integrity: sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 @@ -11276,8 +13016,8 @@ packages: utf-8-validate: optional: true - ws@8.17.0: - resolution: {integrity: sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow==} + ws@8.17.1: + resolution: {integrity: sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 @@ -11288,10 +13028,27 @@ packages: utf-8-validate: optional: true + xhr-request-promise@0.1.3: + resolution: {integrity: sha512-YUBytBsuwgitWtdRzXDDkWAXzhdGB8bYm0sSzMPZT7Z2MBjMSTHFsyCT1yCRATY+XC69DUrQraRAEgcoCRaIPg==} + + xhr-request@1.1.0: + resolution: {integrity: sha512-Y7qzEaR3FDtL3fP30k9wO/e+FBnBByZeybKOhASsGP30NIkRAAkKD/sCnLvgEfAIEC1rcmK7YG8f4oEnIrrWzA==} + + xhr@2.6.0: + resolution: {integrity: sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA==} + xml-name-validator@5.0.0: resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} engines: {node: '>=18'} + xml2js@0.6.2: + resolution: {integrity: sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==} + engines: {node: '>=4.0.0'} + + xmlbuilder@11.0.1: + resolution: {integrity: sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==} + engines: {node: '>=4.0'} + xmlchars@2.2.0: resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} @@ -11303,6 +13060,9 @@ packages: resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} engines: {node: '>=0.4'} + xxhash-wasm@1.0.2: + resolution: {integrity: sha512-ibF0Or+FivM9lNrg+HGJfVX8WJqgo+kCLDc4vx6xMeTce7Aj+DLttKbxxRR/gNLSAelRc1omAPlJ77N/Jem07A==} + y18n@4.0.3: resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} @@ -11310,18 +13070,37 @@ packages: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} + yaeti@0.0.6: + resolution: {integrity: sha512-MvQa//+KcZCUkBTIC9blM+CU9J2GzuTytsOUwf2lidtvkx/6gnEp1QvJv34t9vdjhFmha/mUiNDbN0D0mJWdug==} + engines: {node: '>=0.10.32'} + + 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-language-server@1.15.0: + resolution: {integrity: sha512-N47AqBDCMQmh6mBLmI6oqxryHRzi33aPFPsJhYy3VTUGCdLHYjGh4FZzpUjRlphaADBBkDmnkM/++KNIOHi5Rw==} + hasBin: true + yaml@1.10.2: resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} engines: {node: '>= 6'} - yaml@2.4.2: - resolution: {integrity: sha512-B3VqDZ+JAg1nZpaEmWtTXUlBneoGx6CPM9b0TENK6aoSu5t73dItudwdgmi6tHlIZZId4dZ9skcAQ2UbcyAeVA==} + yaml@2.2.2: + resolution: {integrity: sha512-CBKFWExMn46Foo4cldiChEzn7S7SRV+wqiluAb6xmueD/fGyRHIhX8m14vVGgeFWjN540nKCNVj6P21eQjgTuA==} + engines: {node: '>= 14'} + + yaml@2.3.4: + resolution: {integrity: sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==} + engines: {node: '>= 14'} + + yaml@2.5.1: + resolution: {integrity: sha512-bLQOjaX/ADgQ20isPJRvF0iRUHIxVhYvr53Of7wGcWlO2jvtUlH5m87DsmulFVxRpNLOnI4tB6p/oh8D7kpn9Q==} engines: {node: '>= 14'} hasBin: true @@ -11329,14 +13108,26 @@ packages: resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} engines: {node: '>=6'} + 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'} @@ -11349,15 +13140,25 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} - yocto-queue@1.0.0: - resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} + yocto-queue@1.1.1: + resolution: {integrity: sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==} engines: {node: '>=12.20'} - zod-to-json-schema@3.23.0: - resolution: {integrity: sha512-az0uJ243PxsRIa2x1WmNE/pnuA05gUq/JB8Lwe1EDCCL/Fz9MgjYQ0fPlyc2Tcv6aF2ZA7WM5TWaRZVEFaAIag==} + yocto-queue@1.1.1: + resolution: {integrity: sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==} + engines: {node: '>=12.20'} + + zod-to-json-schema@3.23.3: + resolution: {integrity: sha512-TYWChTxKQbRJp5ST22o/Irt9KC5nj7CdBKYB/AosCRdj/wxEMvv4NNaj9XVUHDOIp53ZxArGhnw5HMZziPFjog==} peerDependencies: zod: ^3.23.3 + zod-to-ts@1.2.0: + resolution: {integrity: sha512-x30XE43V+InwGpvTySRNz9kB7qFU8DlyEy7BsSTCHPH1R0QasMmHWZDCzYm6bVXtj/9NNJAZF3jW8rzFvH5OFA==} + peerDependencies: + typescript: ^4.9.4 || ^5.0.2 + zod: ^3 + zod@3.22.4: resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} @@ -11384,61 +13185,66 @@ packages: snapshots: - '@adobe/css-tools@4.3.3': {} + '@aashutoshrathi/word-wrap@1.2.6': {} + + '@adobe/css-tools@4.4.0': {} '@adraffy/ens-normalize@1.10.0': {} + '@adraffy/ens-normalize@1.10.1': {} + '@alloc/quick-lru@5.2.0': {} - '@ampproject/remapping@2.3.0': + '@ampproject/remapping@2.2.1': dependencies: - '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/gen-mapping': 0.3.3 '@jridgewell/trace-mapping': 0.3.25 '@apidevtools/openapi-schemas@2.1.0': {} '@apidevtools/swagger-methods@3.0.2': {} - '@astrojs/check@0.6.0(prettier@3.2.5)(typescript@5.4.5)': + '@astrojs/check@0.8.3(prettier@3.2.5)(typescript@5.4.5)': dependencies: - '@astrojs/language-server': 2.9.0(prettier@3.2.5)(typescript@5.4.5) + '@astrojs/language-server': 2.14.2(prettier@3.2.5)(typescript@5.4.5) chokidar: 3.6.0 fast-glob: 3.3.2 kleur: 4.1.5 - typescript: 5.4.5 + typescript: 5.5.3 yargs: 17.7.2 transitivePeerDependencies: - prettier - prettier-plugin-astro - '@astrojs/compiler@2.8.0': {} + '@astrojs/compiler@2.10.3': {} - '@astrojs/internal-helpers@0.4.0': {} + '@astrojs/internal-helpers@0.4.1': {} - '@astrojs/language-server@2.9.0(prettier@3.2.5)(typescript@5.4.5)': + '@astrojs/language-server@2.14.2(prettier@3.2.5)(typescript@5.4.5)': dependencies: - '@astrojs/compiler': 2.8.0 + '@astrojs/compiler': 2.10.3 + '@astrojs/yaml2ts': 0.2.1 '@jridgewell/sourcemap-codec': 1.4.15 - '@volar/kit': 2.2.2(typescript@5.4.5) - '@volar/language-core': 2.2.2 - '@volar/language-server': 2.2.2 - '@volar/language-service': 2.2.2 - '@volar/typescript': 2.2.2 + '@volar/kit': 2.4.5(typescript@5.4.5) + '@volar/language-core': 2.4.5 + '@volar/language-server': 2.4.5 + '@volar/language-service': 2.4.5 + '@volar/typescript': 2.4.5 fast-glob: 3.3.2 - volar-service-css: 0.0.43(@volar/language-service@2.2.2) - volar-service-emmet: 0.0.43(@volar/language-service@2.2.2) - volar-service-html: 0.0.43(@volar/language-service@2.2.2) - volar-service-prettier: 0.0.43(@volar/language-service@2.2.2)(prettier@3.2.5) - volar-service-typescript: 0.0.43(@volar/language-service@2.2.2) - volar-service-typescript-twoslash-queries: 0.0.43(@volar/language-service@2.2.2) + muggle-string: 0.4.1 + volar-service-css: 0.0.61(@volar/language-service@2.4.5) + volar-service-emmet: 0.0.61(@volar/language-service@2.4.5) + volar-service-html: 0.0.61(@volar/language-service@2.4.5) + volar-service-prettier: 0.0.61(@volar/language-service@2.4.5)(prettier@3.2.5) + volar-service-typescript: 0.0.61(@volar/language-service@2.4.5) + volar-service-typescript-twoslash-queries: 0.0.61(@volar/language-service@2.4.5) + volar-service-yaml: 0.0.61(@volar/language-service@2.4.5) vscode-html-languageservice: 5.2.0 vscode-uri: 3.0.8 - optionalDependencies: - prettier: 3.2.5 transitivePeerDependencies: - typescript - '@astrojs/markdown-remark@5.1.0': + '@astrojs/markdown-remark@5.2.0': dependencies: '@astrojs/prism': 3.1.0 github-slugger: 2.0.0 @@ -11451,34 +13257,33 @@ snapshots: remark-gfm: 4.0.0 remark-parse: 11.0.0 remark-rehype: 11.1.0 - remark-smartypants: 2.1.0 - shiki: 1.5.1 - unified: 11.0.4 + remark-smartypants: 3.0.2 + shiki: 1.17.6 + unified: 11.0.5 unist-util-remove-position: 5.0.0 unist-util-visit: 5.0.0 unist-util-visit-parents: 6.0.1 - vfile: 6.0.1 + vfile: 6.0.3 transitivePeerDependencies: - supports-color - '@astrojs/mdx@2.3.1(astro@4.8.3(@types/node@20.12.11)(terser@5.31.0)(typescript@5.4.5))': + '@astrojs/mdx@3.1.6(astro@4.15.6(@types/node@20.12.7)(rollup@4.21.3)(terser@5.27.2)(typescript@5.4.5))': dependencies: - '@astrojs/markdown-remark': 5.1.0 + '@astrojs/markdown-remark': 5.2.0 '@mdx-js/mdx': 3.0.1 - acorn: 8.11.3 - astro: 4.8.3(@types/node@20.12.11)(terser@5.31.0)(typescript@5.4.5) - es-module-lexer: 1.5.2 + acorn: 8.12.1 + astro: 4.15.6(@types/node@20.12.7)(rollup@4.21.3)(terser@5.27.2)(typescript@5.4.5) + es-module-lexer: 1.5.4 estree-util-visit: 2.0.0 - github-slugger: 2.0.0 gray-matter: 4.0.3 - hast-util-to-html: 9.0.1 + hast-util-to-html: 9.0.2 kleur: 4.1.5 rehype-raw: 7.0.0 remark-gfm: 4.0.0 - remark-smartypants: 2.1.0 + remark-smartypants: 3.0.2 source-map: 0.7.4 unist-util-visit: 5.0.0 - vfile: 6.0.1 + vfile: 6.0.3 transitivePeerDependencies: - supports-color @@ -11486,41 +13291,43 @@ snapshots: dependencies: prismjs: 1.29.0 - '@astrojs/sitemap@3.1.4': + '@astrojs/sitemap@3.1.6': dependencies: - sitemap: 7.1.1 + sitemap: 7.1.2 stream-replace-string: 2.0.0 zod: 3.23.8 - '@astrojs/starlight@0.22.2(astro@4.8.3(@types/node@20.12.11)(terser@5.31.0)(typescript@5.4.5))': + '@astrojs/starlight@0.25.5(astro@4.15.6(@types/node@20.12.7)(rollup@4.21.3)(terser@5.27.2)(typescript@5.4.5))': dependencies: - '@astrojs/mdx': 2.3.1(astro@4.8.3(@types/node@20.12.11)(terser@5.31.0)(typescript@5.4.5)) - '@astrojs/sitemap': 3.1.4 + '@astrojs/mdx': 3.1.6(astro@4.15.6(@types/node@20.12.7)(rollup@4.21.3)(terser@5.27.2)(typescript@5.4.5)) + '@astrojs/sitemap': 3.1.6 '@pagefind/default-ui': 1.1.0 '@types/hast': 3.0.4 '@types/mdast': 4.0.4 - astro: 4.8.3(@types/node@20.12.11)(terser@5.31.0)(typescript@5.4.5) - astro-expressive-code: 0.35.3(astro@4.8.3(@types/node@20.12.11)(terser@5.31.0)(typescript@5.4.5)) + astro: 4.15.6(@types/node@20.12.7)(rollup@4.21.3)(terser@5.27.2)(typescript@5.4.5) + astro-expressive-code: 0.35.6(astro@4.15.6(@types/node@20.12.7)(rollup@4.21.3)(terser@5.27.2)(typescript@5.4.5)) bcp-47: 2.1.0 hast-util-from-html: 2.0.1 hast-util-select: 6.0.2 hast-util-to-string: 3.0.0 - hastscript: 8.0.0 + hastscript: 9.0.0 mdast-util-directive: 3.0.0 mdast-util-to-markdown: 2.1.0 + mdast-util-to-string: 4.0.0 pagefind: 1.1.0 rehype: 13.0.1 + rehype-format: 5.0.0 remark-directive: 3.0.0 - unified: 11.0.4 + unified: 11.0.5 unist-util-visit: 5.0.0 - vfile: 6.0.1 + vfile: 6.0.3 transitivePeerDependencies: - supports-color '@astrojs/telemetry@3.1.0': dependencies: ci-info: 4.0.0 - debug: 4.3.4 + debug: 4.3.7(supports-color@8.1.1) dlv: 1.1.3 dset: 3.1.3 is-docker: 3.0.0 @@ -11529,23 +13336,23 @@ snapshots: transitivePeerDependencies: - supports-color - '@aw-web-design/x-default-browser@1.4.126': + '@astrojs/yaml2ts@0.2.1': dependencies: - default-browser-id: 3.0.0 + yaml: 2.5.1 - '@aws-crypto/crc32@3.0.0': + '@aws-crypto/crc32@5.2.0': dependencies: '@aws-crypto/util': 3.0.0 - '@aws-sdk/types': 3.575.0 + '@aws-sdk/types': 3.577.0 tslib: 1.14.1 - '@aws-crypto/crc32c@3.0.0': + '@aws-crypto/crc32c@5.2.0': dependencies: '@aws-crypto/util': 3.0.0 - '@aws-sdk/types': 3.575.0 + '@aws-sdk/types': 3.577.0 tslib: 1.14.1 - '@aws-crypto/ie11-detection@3.0.0': + '@aws-crypto/sha1-browser@5.2.0': dependencies: tslib: 1.14.1 @@ -11554,71 +13361,83 @@ snapshots: '@aws-crypto/ie11-detection': 3.0.0 '@aws-crypto/supports-web-crypto': 3.0.0 '@aws-crypto/util': 3.0.0 - '@aws-sdk/types': 3.575.0 + '@aws-sdk/types': 3.577.0 '@aws-sdk/util-locate-window': 3.568.0 - '@aws-sdk/util-utf8-browser': 3.259.0 - tslib: 1.14.1 + '@smithy/util-utf8': 2.3.0 + tslib: 2.6.3 - '@aws-crypto/sha256-browser@3.0.0': + '@aws-crypto/sha256-browser@5.2.0': dependencies: '@aws-crypto/ie11-detection': 3.0.0 '@aws-crypto/sha256-js': 3.0.0 '@aws-crypto/supports-web-crypto': 3.0.0 '@aws-crypto/util': 3.0.0 - '@aws-sdk/types': 3.575.0 + '@aws-sdk/types': 3.577.0 '@aws-sdk/util-locate-window': 3.568.0 - '@aws-sdk/util-utf8-browser': 3.259.0 + '@smithy/util-utf8': 2.3.0 + tslib: 2.6.3 + + '@aws-crypto/sha256-js@1.2.2': + dependencies: + '@aws-crypto/util': 1.2.2 + '@aws-sdk/types': 3.577.0 tslib: 1.14.1 '@aws-crypto/sha256-js@3.0.0': dependencies: '@aws-crypto/util': 3.0.0 - '@aws-sdk/types': 3.575.0 + '@aws-sdk/types': 3.577.0 tslib: 1.14.1 - '@aws-crypto/supports-web-crypto@3.0.0': + '@aws-crypto/supports-web-crypto@5.2.0': dependencies: + tslib: 2.6.3 + + '@aws-crypto/util@1.2.2': + dependencies: + '@aws-sdk/types': 3.577.0 + '@aws-sdk/util-utf8-browser': 3.259.0 tslib: 1.14.1 '@aws-crypto/util@3.0.0': dependencies: - '@aws-sdk/types': 3.575.0 + '@aws-sdk/types': 3.577.0 '@aws-sdk/util-utf8-browser': 3.259.0 tslib: 1.14.1 - '@aws-sdk/client-s3@3.575.0': + '@aws-sdk/client-s3@3.577.0': dependencies: '@aws-crypto/sha1-browser': 3.0.0 '@aws-crypto/sha256-browser': 3.0.0 '@aws-crypto/sha256-js': 3.0.0 - '@aws-sdk/client-sso-oidc': 3.575.0(@aws-sdk/client-sts@3.575.0) - '@aws-sdk/client-sts': 3.575.0 - '@aws-sdk/core': 3.575.0 - '@aws-sdk/credential-provider-node': 3.575.0(@aws-sdk/client-sso-oidc@3.575.0)(@aws-sdk/client-sts@3.575.0) - '@aws-sdk/middleware-bucket-endpoint': 3.575.0 - '@aws-sdk/middleware-expect-continue': 3.575.0 - '@aws-sdk/middleware-flexible-checksums': 3.575.0 - '@aws-sdk/middleware-host-header': 3.575.0 - '@aws-sdk/middleware-location-constraint': 3.575.0 - '@aws-sdk/middleware-logger': 3.575.0 - '@aws-sdk/middleware-recursion-detection': 3.575.0 - '@aws-sdk/middleware-sdk-s3': 3.575.0 - '@aws-sdk/middleware-signing': 3.575.0 - '@aws-sdk/middleware-ssec': 3.575.0 - '@aws-sdk/middleware-user-agent': 3.575.0 - '@aws-sdk/region-config-resolver': 3.575.0 - '@aws-sdk/signature-v4-multi-region': 3.575.0 - '@aws-sdk/types': 3.575.0 - '@aws-sdk/util-endpoints': 3.575.0 - '@aws-sdk/util-user-agent-browser': 3.575.0 - '@aws-sdk/util-user-agent-node': 3.575.0 + '@aws-sdk/client-sso-oidc': 3.577.0(@aws-sdk/client-sts@3.577.0) + '@aws-sdk/client-sts': 3.577.0 + '@aws-sdk/core': 3.576.0 + '@aws-sdk/credential-provider-node': 3.577.0(@aws-sdk/client-sso-oidc@3.577.0)(@aws-sdk/client-sts@3.577.0) + '@aws-sdk/middleware-bucket-endpoint': 3.577.0 + '@aws-sdk/middleware-expect-continue': 3.577.0 + '@aws-sdk/middleware-flexible-checksums': 3.577.0 + '@aws-sdk/middleware-host-header': 3.577.0 + '@aws-sdk/middleware-location-constraint': 3.577.0 + '@aws-sdk/middleware-logger': 3.577.0 + '@aws-sdk/middleware-recursion-detection': 3.577.0 + '@aws-sdk/middleware-sdk-s3': 3.577.0 + '@aws-sdk/middleware-signing': 3.577.0 + '@aws-sdk/middleware-ssec': 3.577.0 + '@aws-sdk/middleware-user-agent': 3.577.0 + '@aws-sdk/region-config-resolver': 3.577.0 + '@aws-sdk/signature-v4-multi-region': 3.577.0 + '@aws-sdk/types': 3.577.0 + '@aws-sdk/util-endpoints': 3.577.0 + '@aws-sdk/util-user-agent-browser': 3.577.0 + '@aws-sdk/util-user-agent-node': 3.577.0 '@aws-sdk/xml-builder': 3.575.0 '@smithy/config-resolver': 3.0.0 - '@smithy/core': 2.0.0 + '@smithy/core': 2.0.1 '@smithy/eventstream-serde-browser': 3.0.0 '@smithy/eventstream-serde-config-resolver': 3.0.0 '@smithy/eventstream-serde-node': 3.0.0 - '@smithy/fetch-http-handler': 3.0.0 + '@smithy/fetch-http-handler': 3.0.1 '@smithy/hash-blob-browser': 3.0.0 '@smithy/hash-node': 3.0.0 '@smithy/hash-stream-node': 3.0.0 @@ -11626,200 +13445,199 @@ snapshots: '@smithy/md5-js': 3.0.0 '@smithy/middleware-content-length': 3.0.0 '@smithy/middleware-endpoint': 3.0.0 - '@smithy/middleware-retry': 3.0.0 + '@smithy/middleware-retry': 3.0.1 '@smithy/middleware-serde': 3.0.0 '@smithy/middleware-stack': 3.0.0 '@smithy/node-config-provider': 3.0.0 '@smithy/node-http-handler': 3.0.0 '@smithy/protocol-http': 4.0.0 - '@smithy/smithy-client': 3.0.0 + '@smithy/smithy-client': 3.0.1 '@smithy/types': 3.0.0 '@smithy/url-parser': 3.0.0 '@smithy/util-base64': 3.0.0 '@smithy/util-body-length-browser': 3.0.0 '@smithy/util-body-length-node': 3.0.0 - '@smithy/util-defaults-mode-browser': 3.0.0 - '@smithy/util-defaults-mode-node': 3.0.0 + '@smithy/util-defaults-mode-browser': 3.0.1 + '@smithy/util-defaults-mode-node': 3.0.1 '@smithy/util-endpoints': 2.0.0 '@smithy/util-retry': 3.0.0 - '@smithy/util-stream': 3.0.0 + '@smithy/util-stream': 3.0.1 '@smithy/util-utf8': 3.0.0 - '@smithy/util-waiter': 3.0.0 - tslib: 2.6.2 + '@smithy/util-waiter': 3.1.2 + tslib: 2.6.3 transitivePeerDependencies: - aws-crt - '@aws-sdk/client-sso-oidc@3.575.0(@aws-sdk/client-sts@3.575.0)': + '@aws-sdk/client-sso-oidc@3.577.0(@aws-sdk/client-sts@3.577.0)': dependencies: '@aws-crypto/sha256-browser': 3.0.0 '@aws-crypto/sha256-js': 3.0.0 - '@aws-sdk/client-sts': 3.575.0 - '@aws-sdk/core': 3.575.0 - '@aws-sdk/credential-provider-node': 3.575.0(@aws-sdk/client-sso-oidc@3.575.0)(@aws-sdk/client-sts@3.575.0) - '@aws-sdk/middleware-host-header': 3.575.0 - '@aws-sdk/middleware-logger': 3.575.0 - '@aws-sdk/middleware-recursion-detection': 3.575.0 - '@aws-sdk/middleware-user-agent': 3.575.0 - '@aws-sdk/region-config-resolver': 3.575.0 - '@aws-sdk/types': 3.575.0 - '@aws-sdk/util-endpoints': 3.575.0 - '@aws-sdk/util-user-agent-browser': 3.575.0 - '@aws-sdk/util-user-agent-node': 3.575.0 + '@aws-sdk/client-sts': 3.577.0 + '@aws-sdk/core': 3.576.0 + '@aws-sdk/credential-provider-node': 3.577.0(@aws-sdk/client-sso-oidc@3.577.0)(@aws-sdk/client-sts@3.577.0) + '@aws-sdk/middleware-host-header': 3.577.0 + '@aws-sdk/middleware-logger': 3.577.0 + '@aws-sdk/middleware-recursion-detection': 3.577.0 + '@aws-sdk/middleware-user-agent': 3.577.0 + '@aws-sdk/region-config-resolver': 3.577.0 + '@aws-sdk/types': 3.577.0 + '@aws-sdk/util-endpoints': 3.577.0 + '@aws-sdk/util-user-agent-browser': 3.577.0 + '@aws-sdk/util-user-agent-node': 3.577.0 '@smithy/config-resolver': 3.0.0 - '@smithy/core': 2.0.0 - '@smithy/fetch-http-handler': 3.0.0 + '@smithy/core': 2.0.1 + '@smithy/fetch-http-handler': 3.0.1 '@smithy/hash-node': 3.0.0 '@smithy/invalid-dependency': 3.0.0 '@smithy/middleware-content-length': 3.0.0 '@smithy/middleware-endpoint': 3.0.0 - '@smithy/middleware-retry': 3.0.0 + '@smithy/middleware-retry': 3.0.1 '@smithy/middleware-serde': 3.0.0 '@smithy/middleware-stack': 3.0.0 '@smithy/node-config-provider': 3.0.0 '@smithy/node-http-handler': 3.0.0 '@smithy/protocol-http': 4.0.0 - '@smithy/smithy-client': 3.0.0 + '@smithy/smithy-client': 3.0.1 '@smithy/types': 3.0.0 '@smithy/url-parser': 3.0.0 '@smithy/util-base64': 3.0.0 '@smithy/util-body-length-browser': 3.0.0 '@smithy/util-body-length-node': 3.0.0 - '@smithy/util-defaults-mode-browser': 3.0.0 - '@smithy/util-defaults-mode-node': 3.0.0 + '@smithy/util-defaults-mode-browser': 3.0.1 + '@smithy/util-defaults-mode-node': 3.0.1 '@smithy/util-endpoints': 2.0.0 '@smithy/util-middleware': 3.0.0 '@smithy/util-retry': 3.0.0 '@smithy/util-utf8': 3.0.0 - tslib: 2.6.2 + tslib: 2.6.3 transitivePeerDependencies: - - '@aws-sdk/client-sts' - aws-crt - '@aws-sdk/client-sso@3.575.0': + '@aws-sdk/client-sso@3.577.0': dependencies: '@aws-crypto/sha256-browser': 3.0.0 '@aws-crypto/sha256-js': 3.0.0 - '@aws-sdk/core': 3.575.0 - '@aws-sdk/middleware-host-header': 3.575.0 - '@aws-sdk/middleware-logger': 3.575.0 - '@aws-sdk/middleware-recursion-detection': 3.575.0 - '@aws-sdk/middleware-user-agent': 3.575.0 - '@aws-sdk/region-config-resolver': 3.575.0 - '@aws-sdk/types': 3.575.0 - '@aws-sdk/util-endpoints': 3.575.0 - '@aws-sdk/util-user-agent-browser': 3.575.0 - '@aws-sdk/util-user-agent-node': 3.575.0 + '@aws-sdk/core': 3.576.0 + '@aws-sdk/middleware-host-header': 3.577.0 + '@aws-sdk/middleware-logger': 3.577.0 + '@aws-sdk/middleware-recursion-detection': 3.577.0 + '@aws-sdk/middleware-user-agent': 3.577.0 + '@aws-sdk/region-config-resolver': 3.577.0 + '@aws-sdk/types': 3.577.0 + '@aws-sdk/util-endpoints': 3.577.0 + '@aws-sdk/util-user-agent-browser': 3.577.0 + '@aws-sdk/util-user-agent-node': 3.577.0 '@smithy/config-resolver': 3.0.0 - '@smithy/core': 2.0.0 - '@smithy/fetch-http-handler': 3.0.0 + '@smithy/core': 2.0.1 + '@smithy/fetch-http-handler': 3.0.1 '@smithy/hash-node': 3.0.0 '@smithy/invalid-dependency': 3.0.0 '@smithy/middleware-content-length': 3.0.0 '@smithy/middleware-endpoint': 3.0.0 - '@smithy/middleware-retry': 3.0.0 + '@smithy/middleware-retry': 3.0.1 '@smithy/middleware-serde': 3.0.0 '@smithy/middleware-stack': 3.0.0 '@smithy/node-config-provider': 3.0.0 '@smithy/node-http-handler': 3.0.0 '@smithy/protocol-http': 4.0.0 - '@smithy/smithy-client': 3.0.0 + '@smithy/smithy-client': 3.0.1 '@smithy/types': 3.0.0 '@smithy/url-parser': 3.0.0 '@smithy/util-base64': 3.0.0 '@smithy/util-body-length-browser': 3.0.0 '@smithy/util-body-length-node': 3.0.0 - '@smithy/util-defaults-mode-browser': 3.0.0 - '@smithy/util-defaults-mode-node': 3.0.0 + '@smithy/util-defaults-mode-browser': 3.0.1 + '@smithy/util-defaults-mode-node': 3.0.1 '@smithy/util-endpoints': 2.0.0 '@smithy/util-middleware': 3.0.0 '@smithy/util-retry': 3.0.0 '@smithy/util-utf8': 3.0.0 - tslib: 2.6.2 + tslib: 2.6.3 transitivePeerDependencies: - aws-crt - '@aws-sdk/client-sts@3.575.0': + '@aws-sdk/client-sts@3.577.0': dependencies: '@aws-crypto/sha256-browser': 3.0.0 '@aws-crypto/sha256-js': 3.0.0 - '@aws-sdk/client-sso-oidc': 3.575.0(@aws-sdk/client-sts@3.575.0) - '@aws-sdk/core': 3.575.0 - '@aws-sdk/credential-provider-node': 3.575.0(@aws-sdk/client-sso-oidc@3.575.0)(@aws-sdk/client-sts@3.575.0) - '@aws-sdk/middleware-host-header': 3.575.0 - '@aws-sdk/middleware-logger': 3.575.0 - '@aws-sdk/middleware-recursion-detection': 3.575.0 - '@aws-sdk/middleware-user-agent': 3.575.0 - '@aws-sdk/region-config-resolver': 3.575.0 - '@aws-sdk/types': 3.575.0 - '@aws-sdk/util-endpoints': 3.575.0 - '@aws-sdk/util-user-agent-browser': 3.575.0 - '@aws-sdk/util-user-agent-node': 3.575.0 + '@aws-sdk/client-sso-oidc': 3.577.0(@aws-sdk/client-sts@3.577.0) + '@aws-sdk/core': 3.576.0 + '@aws-sdk/credential-provider-node': 3.577.0(@aws-sdk/client-sso-oidc@3.577.0)(@aws-sdk/client-sts@3.577.0) + '@aws-sdk/middleware-host-header': 3.577.0 + '@aws-sdk/middleware-logger': 3.577.0 + '@aws-sdk/middleware-recursion-detection': 3.577.0 + '@aws-sdk/middleware-user-agent': 3.577.0 + '@aws-sdk/region-config-resolver': 3.577.0 + '@aws-sdk/types': 3.577.0 + '@aws-sdk/util-endpoints': 3.577.0 + '@aws-sdk/util-user-agent-browser': 3.577.0 + '@aws-sdk/util-user-agent-node': 3.577.0 '@smithy/config-resolver': 3.0.0 - '@smithy/core': 2.0.0 - '@smithy/fetch-http-handler': 3.0.0 + '@smithy/core': 2.0.1 + '@smithy/fetch-http-handler': 3.0.1 '@smithy/hash-node': 3.0.0 '@smithy/invalid-dependency': 3.0.0 '@smithy/middleware-content-length': 3.0.0 '@smithy/middleware-endpoint': 3.0.0 - '@smithy/middleware-retry': 3.0.0 + '@smithy/middleware-retry': 3.0.1 '@smithy/middleware-serde': 3.0.0 '@smithy/middleware-stack': 3.0.0 '@smithy/node-config-provider': 3.0.0 '@smithy/node-http-handler': 3.0.0 '@smithy/protocol-http': 4.0.0 - '@smithy/smithy-client': 3.0.0 + '@smithy/smithy-client': 3.0.1 '@smithy/types': 3.0.0 '@smithy/url-parser': 3.0.0 '@smithy/util-base64': 3.0.0 '@smithy/util-body-length-browser': 3.0.0 '@smithy/util-body-length-node': 3.0.0 - '@smithy/util-defaults-mode-browser': 3.0.0 - '@smithy/util-defaults-mode-node': 3.0.0 + '@smithy/util-defaults-mode-browser': 3.0.1 + '@smithy/util-defaults-mode-node': 3.0.1 '@smithy/util-endpoints': 2.0.0 '@smithy/util-middleware': 3.0.0 '@smithy/util-retry': 3.0.0 '@smithy/util-utf8': 3.0.0 - tslib: 2.6.2 + tslib: 2.6.3 transitivePeerDependencies: - aws-crt - '@aws-sdk/core@3.575.0': + '@aws-sdk/core@3.576.0': dependencies: - '@smithy/core': 2.0.0 + '@smithy/core': 2.0.1 '@smithy/protocol-http': 4.0.0 '@smithy/signature-v4': 3.0.0 - '@smithy/smithy-client': 3.0.0 + '@smithy/smithy-client': 3.0.1 '@smithy/types': 3.0.0 fast-xml-parser: 4.2.5 - tslib: 2.6.2 + tslib: 2.6.3 - '@aws-sdk/credential-provider-env@3.575.0': + '@aws-sdk/credential-provider-env@3.577.0': dependencies: - '@aws-sdk/types': 3.575.0 + '@aws-sdk/types': 3.577.0 '@smithy/property-provider': 3.0.0 '@smithy/types': 3.0.0 tslib: 2.6.2 - '@aws-sdk/credential-provider-http@3.575.0': + '@aws-sdk/credential-provider-http@3.577.0': dependencies: - '@aws-sdk/types': 3.575.0 - '@smithy/fetch-http-handler': 3.0.0 + '@aws-sdk/types': 3.577.0 + '@smithy/fetch-http-handler': 3.0.1 '@smithy/node-http-handler': 3.0.0 '@smithy/property-provider': 3.0.0 '@smithy/protocol-http': 4.0.0 - '@smithy/smithy-client': 3.0.0 + '@smithy/smithy-client': 3.0.1 '@smithy/types': 3.0.0 - '@smithy/util-stream': 3.0.0 + '@smithy/util-stream': 3.0.1 tslib: 2.6.2 - '@aws-sdk/credential-provider-ini@3.575.0(@aws-sdk/client-sso-oidc@3.575.0)(@aws-sdk/client-sts@3.575.0)': + '@aws-sdk/credential-provider-ini@3.577.0(@aws-sdk/client-sso-oidc@3.577.0)(@aws-sdk/client-sts@3.577.0)': dependencies: - '@aws-sdk/client-sts': 3.575.0 - '@aws-sdk/credential-provider-env': 3.575.0 - '@aws-sdk/credential-provider-process': 3.575.0 - '@aws-sdk/credential-provider-sso': 3.575.0(@aws-sdk/client-sso-oidc@3.575.0) - '@aws-sdk/credential-provider-web-identity': 3.575.0(@aws-sdk/client-sts@3.575.0) - '@aws-sdk/types': 3.575.0 + '@aws-sdk/client-sts': 3.577.0 + '@aws-sdk/credential-provider-env': 3.577.0 + '@aws-sdk/credential-provider-process': 3.577.0 + '@aws-sdk/credential-provider-sso': 3.577.0(@aws-sdk/client-sso-oidc@3.577.0) + '@aws-sdk/credential-provider-web-identity': 3.577.0(@aws-sdk/client-sts@3.577.0) + '@aws-sdk/types': 3.577.0 '@smithy/credential-provider-imds': 3.0.0 '@smithy/property-provider': 3.0.0 '@smithy/shared-ini-file-loader': 3.0.0 @@ -11829,15 +13647,15 @@ snapshots: - '@aws-sdk/client-sso-oidc' - aws-crt - '@aws-sdk/credential-provider-node@3.575.0(@aws-sdk/client-sso-oidc@3.575.0)(@aws-sdk/client-sts@3.575.0)': + '@aws-sdk/credential-provider-node@3.577.0(@aws-sdk/client-sso-oidc@3.577.0)(@aws-sdk/client-sts@3.577.0)': dependencies: - '@aws-sdk/credential-provider-env': 3.575.0 - '@aws-sdk/credential-provider-http': 3.575.0 - '@aws-sdk/credential-provider-ini': 3.575.0(@aws-sdk/client-sso-oidc@3.575.0)(@aws-sdk/client-sts@3.575.0) - '@aws-sdk/credential-provider-process': 3.575.0 - '@aws-sdk/credential-provider-sso': 3.575.0(@aws-sdk/client-sso-oidc@3.575.0) - '@aws-sdk/credential-provider-web-identity': 3.575.0(@aws-sdk/client-sts@3.575.0) - '@aws-sdk/types': 3.575.0 + '@aws-sdk/credential-provider-env': 3.577.0 + '@aws-sdk/credential-provider-http': 3.577.0 + '@aws-sdk/credential-provider-ini': 3.577.0(@aws-sdk/client-sso-oidc@3.577.0)(@aws-sdk/client-sts@3.577.0) + '@aws-sdk/credential-provider-process': 3.577.0 + '@aws-sdk/credential-provider-sso': 3.577.0(@aws-sdk/client-sso-oidc@3.577.0) + '@aws-sdk/credential-provider-web-identity': 3.577.0(@aws-sdk/client-sts@3.577.0) + '@aws-sdk/types': 3.577.0 '@smithy/credential-provider-imds': 3.0.0 '@smithy/property-provider': 3.0.0 '@smithy/shared-ini-file-loader': 3.0.0 @@ -11848,19 +13666,19 @@ snapshots: - '@aws-sdk/client-sts' - aws-crt - '@aws-sdk/credential-provider-process@3.575.0': + '@aws-sdk/credential-provider-process@3.577.0': dependencies: - '@aws-sdk/types': 3.575.0 + '@aws-sdk/types': 3.577.0 '@smithy/property-provider': 3.0.0 '@smithy/shared-ini-file-loader': 3.0.0 '@smithy/types': 3.0.0 tslib: 2.6.2 - '@aws-sdk/credential-provider-sso@3.575.0(@aws-sdk/client-sso-oidc@3.575.0)': + '@aws-sdk/credential-provider-sso@3.577.0(@aws-sdk/client-sso-oidc@3.577.0)': dependencies: - '@aws-sdk/client-sso': 3.575.0 - '@aws-sdk/token-providers': 3.575.0(@aws-sdk/client-sso-oidc@3.575.0) - '@aws-sdk/types': 3.575.0 + '@aws-sdk/client-sso': 3.577.0 + '@aws-sdk/token-providers': 3.577.0(@aws-sdk/client-sso-oidc@3.577.0) + '@aws-sdk/types': 3.577.0 '@smithy/property-provider': 3.0.0 '@smithy/shared-ini-file-loader': 3.0.0 '@smithy/types': 3.0.0 @@ -11869,94 +13687,94 @@ snapshots: - '@aws-sdk/client-sso-oidc' - aws-crt - '@aws-sdk/credential-provider-web-identity@3.575.0(@aws-sdk/client-sts@3.575.0)': + '@aws-sdk/credential-provider-web-identity@3.577.0(@aws-sdk/client-sts@3.577.0)': dependencies: - '@aws-sdk/client-sts': 3.575.0 - '@aws-sdk/types': 3.575.0 + '@aws-sdk/client-sts': 3.577.0 + '@aws-sdk/types': 3.577.0 '@smithy/property-provider': 3.0.0 '@smithy/types': 3.0.0 tslib: 2.6.2 - '@aws-sdk/lib-storage@3.575.0(@aws-sdk/client-s3@3.575.0)': + '@aws-sdk/lib-storage@3.578.0(@aws-sdk/client-s3@3.577.0)': dependencies: - '@aws-sdk/client-s3': 3.575.0 + '@aws-sdk/client-s3': 3.577.0 '@smithy/abort-controller': 3.0.0 '@smithy/middleware-endpoint': 3.0.0 - '@smithy/smithy-client': 3.0.0 + '@smithy/smithy-client': 3.0.1 buffer: 5.6.0 events: 3.3.0 stream-browserify: 3.0.0 - tslib: 2.6.2 + tslib: 2.6.3 - '@aws-sdk/middleware-bucket-endpoint@3.575.0': + '@aws-sdk/middleware-bucket-endpoint@3.577.0': dependencies: - '@aws-sdk/types': 3.575.0 + '@aws-sdk/types': 3.577.0 '@aws-sdk/util-arn-parser': 3.568.0 - '@smithy/node-config-provider': 3.0.0 - '@smithy/protocol-http': 4.0.0 - '@smithy/types': 3.0.0 + '@smithy/node-config-provider': 3.1.3 + '@smithy/protocol-http': 4.0.3 + '@smithy/types': 3.3.0 '@smithy/util-config-provider': 3.0.0 - tslib: 2.6.2 + tslib: 2.6.3 - '@aws-sdk/middleware-expect-continue@3.575.0': + '@aws-sdk/middleware-expect-continue@3.577.0': dependencies: - '@aws-sdk/types': 3.575.0 + '@aws-sdk/types': 3.577.0 '@smithy/protocol-http': 4.0.0 '@smithy/types': 3.0.0 tslib: 2.6.2 - '@aws-sdk/middleware-flexible-checksums@3.575.0': + '@aws-sdk/middleware-flexible-checksums@3.577.0': dependencies: '@aws-crypto/crc32': 3.0.0 '@aws-crypto/crc32c': 3.0.0 - '@aws-sdk/types': 3.575.0 + '@aws-sdk/types': 3.577.0 '@smithy/is-array-buffer': 3.0.0 - '@smithy/protocol-http': 4.0.0 - '@smithy/types': 3.0.0 + '@smithy/protocol-http': 4.0.3 + '@smithy/types': 3.3.0 '@smithy/util-utf8': 3.0.0 - tslib: 2.6.2 + tslib: 2.6.3 - '@aws-sdk/middleware-host-header@3.575.0': + '@aws-sdk/middleware-host-header@3.577.0': dependencies: - '@aws-sdk/types': 3.575.0 + '@aws-sdk/types': 3.577.0 '@smithy/protocol-http': 4.0.0 '@smithy/types': 3.0.0 tslib: 2.6.2 - '@aws-sdk/middleware-location-constraint@3.575.0': + '@aws-sdk/middleware-location-constraint@3.577.0': dependencies: - '@aws-sdk/types': 3.575.0 + '@aws-sdk/types': 3.577.0 '@smithy/types': 3.0.0 tslib: 2.6.2 - '@aws-sdk/middleware-logger@3.575.0': + '@aws-sdk/middleware-logger@3.577.0': dependencies: - '@aws-sdk/types': 3.575.0 + '@aws-sdk/types': 3.577.0 '@smithy/types': 3.0.0 tslib: 2.6.2 - '@aws-sdk/middleware-recursion-detection@3.575.0': + '@aws-sdk/middleware-recursion-detection@3.577.0': dependencies: - '@aws-sdk/types': 3.575.0 + '@aws-sdk/types': 3.577.0 '@smithy/protocol-http': 4.0.0 '@smithy/types': 3.0.0 tslib: 2.6.2 - '@aws-sdk/middleware-sdk-s3@3.575.0': + '@aws-sdk/middleware-sdk-s3@3.577.0': dependencies: - '@aws-sdk/types': 3.575.0 + '@aws-sdk/types': 3.577.0 '@aws-sdk/util-arn-parser': 3.568.0 '@smithy/node-config-provider': 3.0.0 '@smithy/protocol-http': 4.0.0 '@smithy/signature-v4': 3.0.0 - '@smithy/smithy-client': 3.0.0 + '@smithy/smithy-client': 3.0.1 '@smithy/types': 3.0.0 '@smithy/util-config-provider': 3.0.0 - tslib: 2.6.2 + tslib: 2.6.3 - '@aws-sdk/middleware-signing@3.575.0': + '@aws-sdk/middleware-signing@3.577.0': dependencies: - '@aws-sdk/types': 3.575.0 + '@aws-sdk/types': 3.577.0 '@smithy/property-provider': 3.0.0 '@smithy/protocol-http': 4.0.0 '@smithy/signature-v4': 3.0.0 @@ -11964,915 +13782,1045 @@ snapshots: '@smithy/util-middleware': 3.0.0 tslib: 2.6.2 - '@aws-sdk/middleware-ssec@3.575.0': + '@aws-sdk/middleware-ssec@3.577.0': dependencies: - '@aws-sdk/types': 3.575.0 + '@aws-sdk/types': 3.577.0 '@smithy/types': 3.0.0 tslib: 2.6.2 - '@aws-sdk/middleware-user-agent@3.575.0': + '@aws-sdk/middleware-user-agent@3.577.0': dependencies: - '@aws-sdk/types': 3.575.0 - '@aws-sdk/util-endpoints': 3.575.0 + '@aws-sdk/types': 3.577.0 + '@aws-sdk/util-endpoints': 3.577.0 '@smithy/protocol-http': 4.0.0 '@smithy/types': 3.0.0 tslib: 2.6.2 - '@aws-sdk/region-config-resolver@3.575.0': + '@aws-sdk/region-config-resolver@3.577.0': dependencies: - '@aws-sdk/types': 3.575.0 + '@aws-sdk/types': 3.577.0 '@smithy/node-config-provider': 3.0.0 '@smithy/types': 3.0.0 '@smithy/util-config-provider': 3.0.0 - '@smithy/util-middleware': 3.0.0 - tslib: 2.6.2 + '@smithy/util-middleware': 3.0.3 + tslib: 2.6.3 - '@aws-sdk/signature-v4-multi-region@3.575.0': + '@aws-sdk/signature-v4-multi-region@3.577.0': dependencies: - '@aws-sdk/middleware-sdk-s3': 3.575.0 - '@aws-sdk/types': 3.575.0 + '@aws-sdk/middleware-sdk-s3': 3.577.0 + '@aws-sdk/types': 3.577.0 '@smithy/protocol-http': 4.0.0 '@smithy/signature-v4': 3.0.0 '@smithy/types': 3.0.0 tslib: 2.6.2 - '@aws-sdk/token-providers@3.575.0(@aws-sdk/client-sso-oidc@3.575.0)': + '@aws-sdk/token-providers@3.577.0(@aws-sdk/client-sso-oidc@3.577.0)': dependencies: - '@aws-sdk/client-sso-oidc': 3.575.0(@aws-sdk/client-sts@3.575.0) - '@aws-sdk/types': 3.575.0 + '@aws-sdk/client-sso-oidc': 3.577.0(@aws-sdk/client-sts@3.577.0) + '@aws-sdk/types': 3.577.0 '@smithy/property-provider': 3.0.0 '@smithy/shared-ini-file-loader': 3.0.0 '@smithy/types': 3.0.0 tslib: 2.6.2 - '@aws-sdk/types@3.575.0': + '@aws-sdk/types@3.577.0': dependencies: - '@smithy/types': 3.0.0 - tslib: 2.6.2 + '@smithy/types': 3.3.0 + tslib: 2.6.3 '@aws-sdk/util-arn-parser@3.568.0': dependencies: - tslib: 2.6.2 + tslib: 2.6.3 - '@aws-sdk/util-endpoints@3.575.0': + '@aws-sdk/util-endpoints@3.577.0': dependencies: - '@aws-sdk/types': 3.575.0 + '@aws-sdk/types': 3.577.0 '@smithy/types': 3.0.0 '@smithy/util-endpoints': 2.0.0 tslib: 2.6.2 '@aws-sdk/util-locate-window@3.568.0': dependencies: - tslib: 2.6.2 + tslib: 2.6.3 - '@aws-sdk/util-user-agent-browser@3.575.0': + '@aws-sdk/util-user-agent-browser@3.577.0': dependencies: - '@aws-sdk/types': 3.575.0 + '@aws-sdk/types': 3.577.0 '@smithy/types': 3.0.0 bowser: 2.11.0 - tslib: 2.6.2 + tslib: 2.6.3 - '@aws-sdk/util-user-agent-node@3.575.0': + '@aws-sdk/util-user-agent-node@3.577.0': dependencies: - '@aws-sdk/types': 3.575.0 + '@aws-sdk/types': 3.577.0 '@smithy/node-config-provider': 3.0.0 '@smithy/types': 3.0.0 tslib: 2.6.2 - '@aws-sdk/util-utf8-browser@3.259.0': + '@aws-sdk/xml-builder@3.598.0': dependencies: - tslib: 2.6.2 + '@smithy/types': 3.3.0 + tslib: 2.6.3 - '@aws-sdk/xml-builder@3.575.0': + '@babel/code-frame@7.24.7': dependencies: - '@smithy/types': 3.0.0 - tslib: 2.6.2 + '@babel/highlight': 7.24.7 + picocolors: 1.0.1 + + '@babel/code-frame@7.23.5': + dependencies: + '@babel/highlight': 7.23.4 + chalk: 2.4.2 '@babel/code-frame@7.24.2': dependencies: '@babel/highlight': 7.24.5 picocolors: 1.0.0 - '@babel/compat-data@7.24.4': {} + '@babel/code-frame@7.24.7': + dependencies: + '@babel/highlight': 7.24.7 + picocolors: 1.0.0 + + '@babel/compat-data@7.25.4': {} - '@babel/core@7.24.5': + '@babel/core@7.25.2': dependencies: - '@ampproject/remapping': 2.3.0 - '@babel/code-frame': 7.24.2 - '@babel/generator': 7.24.5 - '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-module-transforms': 7.24.5(@babel/core@7.24.5) - '@babel/helpers': 7.24.5 - '@babel/parser': 7.24.5 - '@babel/template': 7.24.0 - '@babel/traverse': 7.24.5 - '@babel/types': 7.24.5 + '@ampproject/remapping': 2.2.1 + '@babel/code-frame': 7.24.7 + '@babel/generator': 7.25.6 + '@babel/helper-compilation-targets': 7.25.2 + '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2) + '@babel/helpers': 7.25.6 + '@babel/parser': 7.25.6 + '@babel/template': 7.25.0 + '@babel/traverse': 7.25.6 + '@babel/types': 7.25.6 convert-source-map: 2.0.0 - debug: 4.3.4 + debug: 4.3.7(supports-color@8.1.1) gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/generator@7.24.5': + '@babel/generator@7.25.6': dependencies: - '@babel/types': 7.24.5 + '@babel/types': 7.25.6 '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 jsesc: 2.5.2 - '@babel/helper-annotate-as-pure@7.22.5': + '@babel/helper-annotate-as-pure@7.24.7': dependencies: - '@babel/types': 7.24.5 + '@babel/types': 7.25.6 - '@babel/helper-builder-binary-assignment-operator-visitor@7.22.15': + '@babel/helper-builder-binary-assignment-operator-visitor@7.24.7': dependencies: - '@babel/types': 7.24.5 + '@babel/types': 7.25.6 - '@babel/helper-compilation-targets@7.23.6': + '@babel/helper-compilation-targets@7.25.2': dependencies: - '@babel/compat-data': 7.24.4 - '@babel/helper-validator-option': 7.23.5 - browserslist: 4.23.0 + '@babel/compat-data': 7.25.4 + '@babel/helper-validator-option': 7.24.8 + browserslist: 4.23.3 lru-cache: 5.1.1 semver: 6.3.1 - '@babel/helper-create-class-features-plugin@7.24.5(@babel/core@7.24.5)': + '@babel/helper-create-class-features-plugin@7.23.10(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-annotate-as-pure': 7.24.7 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-function-name': 7.23.0 - '@babel/helper-member-expression-to-functions': 7.24.5 + '@babel/helper-member-expression-to-functions': 7.23.0 '@babel/helper-optimise-call-expression': 7.22.5 - '@babel/helper-replace-supers': 7.24.1(@babel/core@7.24.5) + '@babel/helper-replace-supers': 7.22.20(@babel/core@7.25.2) '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 '@babel/helper-split-export-declaration': 7.24.5 semver: 6.3.1 + transitivePeerDependencies: + - supports-color - '@babel/helper-create-regexp-features-plugin@7.22.15(@babel/core@7.24.5)': + '@babel/helper-create-regexp-features-plugin@7.22.15(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-annotate-as-pure': 7.24.7 regexpu-core: 5.3.2 semver: 6.3.1 - '@babel/helper-define-polyfill-provider@0.6.2(@babel/core@7.24.5)': + '@babel/helper-define-polyfill-provider@0.5.0(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-plugin-utils': 7.24.5 - debug: 4.3.4 + '@babel/core': 7.25.2 + '@babel/helper-compilation-targets': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + debug: 4.3.7(supports-color@8.1.1) lodash.debounce: 4.0.8 resolve: 1.22.8 transitivePeerDependencies: - supports-color - '@babel/helper-environment-visitor@7.22.20': {} + '@babel/helper-environment-visitor@7.24.7': + dependencies: + '@babel/template': 7.25.0 + '@babel/types': 7.25.6 - '@babel/helper-function-name@7.23.0': + '@babel/helper-function-name@7.24.7': dependencies: - '@babel/template': 7.24.0 - '@babel/types': 7.24.5 + '@babel/types': 7.25.6 - '@babel/helper-hoist-variables@7.22.5': + '@babel/helper-member-expression-to-functions@7.23.0': dependencies: - '@babel/types': 7.24.5 + '@babel/types': 7.25.6 - '@babel/helper-member-expression-to-functions@7.24.5': + '@babel/helper-module-imports@7.22.15': dependencies: - '@babel/types': 7.24.5 + '@babel/types': 7.23.9 - '@babel/helper-module-imports@7.24.3': + '@babel/helper-module-imports@7.24.7': dependencies: - '@babel/types': 7.24.5 + '@babel/traverse': 7.25.6 + '@babel/types': 7.25.6 + transitivePeerDependencies: + - supports-color - '@babel/helper-module-transforms@7.24.5(@babel/core@7.24.5)': + '@babel/helper-module-transforms@7.25.2(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-module-imports': 7.24.3 - '@babel/helper-simple-access': 7.24.5 - '@babel/helper-split-export-declaration': 7.24.5 - '@babel/helper-validator-identifier': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-module-imports': 7.24.7 + '@babel/helper-simple-access': 7.24.7 + '@babel/helper-validator-identifier': 7.24.7 + '@babel/traverse': 7.25.6 + transitivePeerDependencies: + - supports-color '@babel/helper-optimise-call-expression@7.22.5': dependencies: - '@babel/types': 7.24.5 + '@babel/types': 7.25.6 - '@babel/helper-plugin-utils@7.24.5': {} + '@babel/helper-plugin-utils@7.24.8': {} - '@babel/helper-remap-async-to-generator@7.22.20(@babel/core@7.24.5)': + '@babel/helper-remap-async-to-generator@7.22.20(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-annotate-as-pure': 7.24.7 '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-wrap-function': 7.24.5 + '@babel/helper-wrap-function': 7.22.20 - '@babel/helper-replace-supers@7.24.1(@babel/core@7.24.5)': + '@babel/helper-replace-supers@7.22.20(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 + '@babel/core': 7.25.2 '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-member-expression-to-functions': 7.24.5 + '@babel/helper-member-expression-to-functions': 7.23.0 '@babel/helper-optimise-call-expression': 7.22.5 - '@babel/helper-simple-access@7.24.5': + '@babel/helper-simple-access@7.24.7': dependencies: - '@babel/types': 7.24.5 + '@babel/traverse': 7.25.6 + '@babel/types': 7.25.6 + transitivePeerDependencies: + - supports-color '@babel/helper-skip-transparent-expression-wrappers@7.22.5': dependencies: - '@babel/types': 7.24.5 + '@babel/types': 7.25.6 '@babel/helper-split-export-declaration@7.24.5': dependencies: - '@babel/types': 7.24.5 + '@babel/types': 7.25.6 + + '@babel/helper-string-parser@7.23.4': {} + + '@babel/helper-string-parser@7.24.8': {} - '@babel/helper-string-parser@7.24.1': {} + '@babel/helper-validator-identifier@7.22.20': {} '@babel/helper-validator-identifier@7.24.5': {} - '@babel/helper-validator-option@7.23.5': {} + '@babel/helper-validator-identifier@7.24.7': {} - '@babel/helper-wrap-function@7.24.5': + '@babel/helper-validator-option@7.24.8': {} + + '@babel/helper-wrap-function@7.22.20': dependencies: '@babel/helper-function-name': 7.23.0 - '@babel/template': 7.24.0 - '@babel/types': 7.24.5 + '@babel/template': 7.25.0 + '@babel/types': 7.25.6 + + '@babel/helpers@7.25.6': + dependencies: + '@babel/template': 7.25.0 + '@babel/types': 7.25.6 + + '@babel/highlight@7.23.4': + dependencies: + '@babel/helper-validator-identifier': 7.22.20 + chalk: 2.4.2 + js-tokens: 4.0.0 + + '@babel/helper-module-imports@7.24.7': + dependencies: + '@babel/traverse': 7.24.7 + '@babel/types': 7.24.7 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-environment-visitor': 7.24.7 + '@babel/helper-module-imports': 7.24.7 + '@babel/helper-simple-access': 7.24.7 + '@babel/helper-split-export-declaration': 7.24.7 + '@babel/helper-validator-identifier': 7.24.7 + transitivePeerDependencies: + - supports-color + + '@babel/helper-optimise-call-expression@7.24.7': + dependencies: + '@babel/types': 7.24.7 + + '@babel/helper-plugin-utils@7.24.7': {} + + '@babel/helper-remap-async-to-generator@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-annotate-as-pure': 7.24.7 + '@babel/helper-environment-visitor': 7.24.7 + '@babel/helper-wrap-function': 7.24.7 + transitivePeerDependencies: + - supports-color + + '@babel/helper-replace-supers@7.24.7(@babel/core@7.24.7)': + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-environment-visitor': 7.24.7 + '@babel/helper-member-expression-to-functions': 7.24.7 + '@babel/helper-optimise-call-expression': 7.24.7 + transitivePeerDependencies: + - supports-color + + '@babel/helper-simple-access@7.24.7': + dependencies: + '@babel/traverse': 7.24.7 + '@babel/types': 7.24.7 + transitivePeerDependencies: + - supports-color + + '@babel/helper-skip-transparent-expression-wrappers@7.24.7': + dependencies: + '@babel/traverse': 7.24.7 + '@babel/types': 7.24.7 + transitivePeerDependencies: + - supports-color + + '@babel/helper-split-export-declaration@7.24.7': + dependencies: + '@babel/types': 7.24.7 - '@babel/helpers@7.24.5': + '@babel/helper-string-parser@7.24.7': {} + + '@babel/helper-validator-identifier@7.24.7': {} + + '@babel/helper-validator-option@7.24.7': {} + + '@babel/helper-wrap-function@7.24.7': dependencies: - '@babel/template': 7.24.0 - '@babel/traverse': 7.24.5 - '@babel/types': 7.24.5 + '@babel/helper-function-name': 7.24.7 + '@babel/template': 7.24.7 + '@babel/traverse': 7.24.7 + '@babel/types': 7.24.7 transitivePeerDependencies: - supports-color - '@babel/highlight@7.24.5': + '@babel/helpers@7.24.7': + dependencies: + '@babel/template': 7.24.7 + '@babel/types': 7.24.7 + + '@babel/highlight@7.24.7': + dependencies: + '@babel/helper-validator-identifier': 7.24.7 + chalk: 2.4.2 + js-tokens: 4.0.0 + picocolors: 1.0.1 + + '@babel/highlight@7.24.7': dependencies: - '@babel/helper-validator-identifier': 7.24.5 + '@babel/helper-validator-identifier': 7.24.7 chalk: 2.4.2 js-tokens: 4.0.0 picocolors: 1.0.0 + '@babel/parser@7.23.9': + dependencies: + '@babel/types': 7.23.9 + '@babel/parser@7.24.5': dependencies: - '@babel/types': 7.24.5 + '@babel/types': 7.25.6 - '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.24.5(@babel/core@7.24.5)': + '@babel/parser@7.25.6': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/types': 7.25.6 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.23.3(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.23.3(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-transform-optional-chaining': 7.24.5(@babel/core@7.24.5) + '@babel/plugin-transform-optional-chaining': 7.23.4(@babel/core@7.25.2) - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.23.7(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 + '@babel/core': 7.25.2 '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-proposal-async-generator-functions@7.20.7(@babel/core@7.24.5)': + '@babel/plugin-proposal-async-generator-functions@7.20.7(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 + '@babel/core': 7.25.2 '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.24.5) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.5) + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.25.2) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.25.2) - '@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.24.5)': + '@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-create-class-features-plugin': 7.24.5(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-create-class-features-plugin': 7.23.10(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-proposal-export-default-from@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-proposal-export-default-from@7.23.3(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-export-default-from': 7.24.1(@babel/core@7.24.5) + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-export-default-from': 7.23.3(@babel/core@7.25.2) - '@babel/plugin-proposal-logical-assignment-operators@7.20.7(@babel/core@7.24.5)': + '@babel/plugin-proposal-nullish-coalescing-operator@7.18.6(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.5) + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.25.2) - '@babel/plugin-proposal-nullish-coalescing-operator@7.18.6(@babel/core@7.24.5)': + '@babel/plugin-proposal-numeric-separator@7.18.6(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.5) + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.25.2) - '@babel/plugin-proposal-numeric-separator@7.18.6(@babel/core@7.24.5)': + '@babel/plugin-proposal-object-rest-spread@7.20.7(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.5) + '@babel/compat-data': 7.25.4 + '@babel/core': 7.25.2 + '@babel/helper-compilation-targets': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-transform-parameters': 7.23.3(@babel/core@7.25.2) - '@babel/plugin-proposal-object-rest-spread@7.20.7(@babel/core@7.24.5)': + '@babel/plugin-proposal-optional-catch-binding@7.18.6(@babel/core@7.25.2)': dependencies: - '@babel/compat-data': 7.24.4 - '@babel/core': 7.24.5 - '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.5) - '@babel/plugin-transform-parameters': 7.24.5(@babel/core@7.24.5) + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.25.2) - '@babel/plugin-proposal-optional-catch-binding@7.18.6(@babel/core@7.24.5)': + '@babel/plugin-proposal-optional-chaining@7.21.0(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.5) - - '@babel/plugin-proposal-optional-chaining@7.21.0(@babel/core@7.24.5)': - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.5) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.25.2) - '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.24.5)': + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 + '@babel/core': 7.25.2 - '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.24.5)': + '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.24.5)': + '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.24.5)': + '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.24.5)': + '@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-export-default-from@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-syntax-export-default-from@7.23.3(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.24.5)': + '@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-flow@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-syntax-flow@7.23.3(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-import-assertions@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-syntax-import-assertions@7.23.3(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-import-attributes@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-syntax-import-attributes@7.23.3(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.24.5)': + '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.24.5)': + '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-jsx@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-syntax-jsx@7.24.7(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.24.5)': + '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.24.5)': + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.24.5)': + '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.24.5)': + '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.24.5)': + '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.24.5)': + '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.24.5)': + '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.24.5)': + '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-typescript@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-syntax-typescript@7.23.3(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.24.5)': + '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-transform-arrow-functions@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-arrow-functions@7.23.3(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-transform-async-generator-functions@7.24.3(@babel/core@7.24.5)': + '@babel/plugin-transform-async-generator-functions@7.23.9(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 + '@babel/core': 7.25.2 '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.24.5) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.5) + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.25.2) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.25.2) - '@babel/plugin-transform-async-to-generator@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-async-to-generator@7.23.3(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-module-imports': 7.24.3 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.24.5) + '@babel/core': 7.25.2 + '@babel/helper-module-imports': 7.24.7 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.25.2) + transitivePeerDependencies: + - supports-color - '@babel/plugin-transform-block-scoped-functions@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-block-scoped-functions@7.23.3(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-transform-block-scoping@7.24.5(@babel/core@7.24.5)': + '@babel/plugin-transform-block-scoping@7.23.4(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-transform-class-properties@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-class-properties@7.23.3(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-create-class-features-plugin': 7.24.5(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-create-class-features-plugin': 7.23.10(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-transform-class-static-block@7.24.4(@babel/core@7.24.5)': + '@babel/plugin-transform-class-static-block@7.23.4(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-create-class-features-plugin': 7.24.5(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.24.5) + '@babel/core': 7.25.2 + '@babel/helper-create-class-features-plugin': 7.23.10(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.25.2) - '@babel/plugin-transform-classes@7.24.5(@babel/core@7.24.5)': + '@babel/plugin-transform-classes@7.23.8(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-compilation-targets': 7.23.6 + '@babel/core': 7.25.2 + '@babel/helper-annotate-as-pure': 7.24.7 + '@babel/helper-compilation-targets': 7.25.2 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-function-name': 7.23.0 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/helper-replace-supers': 7.24.1(@babel/core@7.24.5) + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-replace-supers': 7.22.20(@babel/core@7.25.2) '@babel/helper-split-export-declaration': 7.24.5 globals: 11.12.0 + transitivePeerDependencies: + - supports-color - '@babel/plugin-transform-computed-properties@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-computed-properties@7.23.3(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/template': 7.24.0 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/template': 7.25.0 - '@babel/plugin-transform-destructuring@7.24.5(@babel/core@7.24.5)': + '@babel/plugin-transform-destructuring@7.23.3(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-transform-dotall-regex@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-dotall-regex@7.23.3(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-transform-duplicate-keys@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-duplicate-keys@7.23.3(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-transform-dynamic-import@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-dynamic-import@7.23.4(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.24.5) + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.25.2) - '@babel/plugin-transform-exponentiation-operator@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-exponentiation-operator@7.23.3(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 + '@babel/core': 7.25.2 '@babel/helper-builder-binary-assignment-operator-visitor': 7.22.15 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-transform-export-namespace-from@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-export-namespace-from@7.23.4(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.24.5) + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.25.2) - '@babel/plugin-transform-flow-strip-types@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-flow-strip-types@7.23.3(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-flow': 7.24.1(@babel/core@7.24.5) + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-flow': 7.23.3(@babel/core@7.25.2) - '@babel/plugin-transform-for-of@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-for-of@7.23.6(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-transform-function-name@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-function-name@7.23.3(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-compilation-targets': 7.23.6 + '@babel/core': 7.25.2 + '@babel/helper-compilation-targets': 7.25.2 '@babel/helper-function-name': 7.23.0 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-transform-json-strings@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-json-strings@7.23.4(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.5) + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.25.2) - '@babel/plugin-transform-literals@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-literals@7.23.3(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-transform-logical-assignment-operators@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-logical-assignment-operators@7.23.4(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.5) + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.25.2) - '@babel/plugin-transform-member-expression-literals@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-member-expression-literals@7.23.3(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-transform-modules-amd@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-modules-amd@7.23.3(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-module-transforms': 7.24.5(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + transitivePeerDependencies: + - supports-color - '@babel/plugin-transform-modules-commonjs@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-modules-commonjs@7.23.3(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-module-transforms': 7.24.5(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 - '@babel/helper-simple-access': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-simple-access': 7.24.7 + transitivePeerDependencies: + - supports-color - '@babel/plugin-transform-modules-systemjs@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-modules-systemjs@7.23.9(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 + '@babel/core': 7.25.2 '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-module-transforms': 7.24.5(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 - '@babel/helper-validator-identifier': 7.24.5 + '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-validator-identifier': 7.24.7 + transitivePeerDependencies: + - supports-color - '@babel/plugin-transform-modules-umd@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-modules-umd@7.23.3(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-module-transforms': 7.24.5(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + transitivePeerDependencies: + - supports-color - '@babel/plugin-transform-named-capturing-groups-regex@7.22.5(@babel/core@7.24.5)': + '@babel/plugin-transform-named-capturing-groups-regex@7.22.5(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-transform-new-target@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-new-target@7.23.3(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-transform-nullish-coalescing-operator@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-nullish-coalescing-operator@7.23.4(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.5) + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.25.2) - '@babel/plugin-transform-numeric-separator@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-numeric-separator@7.23.4(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.5) + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.25.2) - '@babel/plugin-transform-object-rest-spread@7.24.5(@babel/core@7.24.5)': + '@babel/plugin-transform-object-rest-spread@7.23.4(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.5) - '@babel/plugin-transform-parameters': 7.24.5(@babel/core@7.24.5) + '@babel/compat-data': 7.25.4 + '@babel/core': 7.25.2 + '@babel/helper-compilation-targets': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-transform-parameters': 7.23.3(@babel/core@7.25.2) - '@babel/plugin-transform-object-super@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-object-super@7.23.3(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/helper-replace-supers': 7.24.1(@babel/core@7.24.5) + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-replace-supers': 7.22.20(@babel/core@7.25.2) - '@babel/plugin-transform-optional-catch-binding@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-optional-catch-binding@7.23.4(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.5) + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.25.2) - '@babel/plugin-transform-optional-chaining@7.24.5(@babel/core@7.24.5)': + '@babel/plugin-transform-optional-chaining@7.23.4(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.5) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.25.2) - '@babel/plugin-transform-parameters@7.24.5(@babel/core@7.24.5)': + '@babel/plugin-transform-parameters@7.23.3(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-transform-private-methods@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-private-methods@7.23.3(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-create-class-features-plugin': 7.24.5(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-create-class-features-plugin': 7.23.10(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-transform-private-property-in-object@7.24.5(@babel/core@7.24.5)': + '@babel/plugin-transform-private-property-in-object@7.23.4(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-create-class-features-plugin': 7.24.5(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.24.5) + '@babel/core': 7.25.2 + '@babel/helper-annotate-as-pure': 7.24.7 + '@babel/helper-create-class-features-plugin': 7.23.10(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.25.2) - '@babel/plugin-transform-property-literals@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-property-literals@7.23.3(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-transform-react-display-name@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-react-display-name@7.23.3(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-transform-react-jsx-self@7.24.5(@babel/core@7.24.5)': + '@babel/plugin-transform-react-jsx-self@7.23.3(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-transform-react-jsx-source@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-react-jsx-source@7.23.3(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-transform-react-jsx@7.23.4(@babel/core@7.24.5)': + '@babel/plugin-transform-react-jsx@7.25.2(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-module-imports': 7.24.3 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-jsx': 7.24.1(@babel/core@7.24.5) - '@babel/types': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-annotate-as-pure': 7.24.7 + '@babel/helper-module-imports': 7.24.7 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.25.2) + '@babel/types': 7.25.6 + transitivePeerDependencies: + - supports-color - '@babel/plugin-transform-regenerator@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-regenerator@7.23.3(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 regenerator-transform: 0.15.2 - '@babel/plugin-transform-reserved-words@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-reserved-words@7.23.3(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-transform-runtime@7.24.3(@babel/core@7.24.5)': + '@babel/plugin-transform-runtime@7.23.9(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-module-imports': 7.24.3 - '@babel/helper-plugin-utils': 7.24.5 - babel-plugin-polyfill-corejs2: 0.4.11(@babel/core@7.24.5) - babel-plugin-polyfill-corejs3: 0.10.4(@babel/core@7.24.5) - babel-plugin-polyfill-regenerator: 0.6.2(@babel/core@7.24.5) + '@babel/core': 7.25.2 + '@babel/helper-module-imports': 7.24.7 + '@babel/helper-plugin-utils': 7.24.8 + babel-plugin-polyfill-corejs2: 0.4.8(@babel/core@7.25.2) + babel-plugin-polyfill-corejs3: 0.9.0(@babel/core@7.25.2) + babel-plugin-polyfill-regenerator: 0.5.5(@babel/core@7.25.2) semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-shorthand-properties@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-shorthand-properties@7.23.3(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-transform-spread@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-spread@7.23.3(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-transform-sticky-regex@7.24.1(@babel/core@7.24.5)': - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - - '@babel/plugin-transform-template-literals@7.24.1(@babel/core@7.24.5)': - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - - '@babel/plugin-transform-typeof-symbol@7.24.5(@babel/core@7.24.5)': - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - - '@babel/plugin-transform-typescript@7.24.5(@babel/core@7.24.5)': - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-create-class-features-plugin': 7.24.5(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-typescript': 7.24.1(@babel/core@7.24.5) - - '@babel/plugin-transform-unicode-escapes@7.24.1(@babel/core@7.24.5)': - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - - '@babel/plugin-transform-unicode-property-regex@7.24.1(@babel/core@7.24.5)': - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 - - '@babel/plugin-transform-unicode-regex@7.24.1(@babel/core@7.24.5)': - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 - - '@babel/plugin-transform-unicode-sets-regex@7.24.1(@babel/core@7.24.5)': - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 - - '@babel/preset-env@7.24.5(@babel/core@7.24.5)': - dependencies: - '@babel/compat-data': 7.24.4 - '@babel/core': 7.24.5 - '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/helper-validator-option': 7.23.5 - '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.24.5(@babel/core@7.24.5) - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.24.5) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.5) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.24.5) - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.24.5) - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.24.5) - '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.24.5) - '@babel/plugin-syntax-import-assertions': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-syntax-import-attributes': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.24.5) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.5) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.5) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.5) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.5) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.5) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.5) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.5) - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.24.5) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.24.5) - '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.24.5) - '@babel/plugin-transform-arrow-functions': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-async-generator-functions': 7.24.3(@babel/core@7.24.5) - '@babel/plugin-transform-async-to-generator': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-block-scoped-functions': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-block-scoping': 7.24.5(@babel/core@7.24.5) - '@babel/plugin-transform-class-properties': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-class-static-block': 7.24.4(@babel/core@7.24.5) - '@babel/plugin-transform-classes': 7.24.5(@babel/core@7.24.5) - '@babel/plugin-transform-computed-properties': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-destructuring': 7.24.5(@babel/core@7.24.5) - '@babel/plugin-transform-dotall-regex': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-duplicate-keys': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-dynamic-import': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-exponentiation-operator': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-export-namespace-from': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-for-of': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-function-name': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-json-strings': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-literals': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-logical-assignment-operators': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-member-expression-literals': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-modules-amd': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-modules-commonjs': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-modules-systemjs': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-modules-umd': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.24.5) - '@babel/plugin-transform-new-target': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-nullish-coalescing-operator': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-numeric-separator': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-object-rest-spread': 7.24.5(@babel/core@7.24.5) - '@babel/plugin-transform-object-super': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-optional-catch-binding': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-optional-chaining': 7.24.5(@babel/core@7.24.5) - '@babel/plugin-transform-parameters': 7.24.5(@babel/core@7.24.5) - '@babel/plugin-transform-private-methods': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-private-property-in-object': 7.24.5(@babel/core@7.24.5) - '@babel/plugin-transform-property-literals': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-regenerator': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-reserved-words': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-shorthand-properties': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-spread': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-sticky-regex': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-template-literals': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-typeof-symbol': 7.24.5(@babel/core@7.24.5) - '@babel/plugin-transform-unicode-escapes': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-unicode-property-regex': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-unicode-regex': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-unicode-sets-regex': 7.24.1(@babel/core@7.24.5) - '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.24.5) - babel-plugin-polyfill-corejs2: 0.4.11(@babel/core@7.24.5) - babel-plugin-polyfill-corejs3: 0.10.4(@babel/core@7.24.5) - babel-plugin-polyfill-regenerator: 0.6.2(@babel/core@7.24.5) - core-js-compat: 3.37.0 + '@babel/plugin-transform-sticky-regex@7.23.3(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-transform-template-literals@7.23.3(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-transform-typeof-symbol@7.23.3(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-transform-typescript@7.23.6(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-annotate-as-pure': 7.24.7 + '@babel/helper-create-class-features-plugin': 7.23.10(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-typescript': 7.23.3(@babel/core@7.25.2) + + '@babel/plugin-transform-unicode-escapes@7.23.3(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-transform-unicode-property-regex@7.23.3(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-transform-unicode-regex@7.23.3(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-transform-unicode-sets-regex@7.23.3(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/preset-env@7.23.9(@babel/core@7.25.2)': + dependencies: + '@babel/compat-data': 7.25.4 + '@babel/core': 7.25.2 + '@babel/helper-compilation-targets': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-validator-option': 7.24.8 + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.23.3(@babel/core@7.25.2) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.23.3(@babel/core@7.25.2) + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.23.7(@babel/core@7.25.2) + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.25.2) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.25.2) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.25.2) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.25.2) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-import-assertions': 7.23.3(@babel/core@7.25.2) + '@babel/plugin-syntax-import-attributes': 7.23.3(@babel/core@7.25.2) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.25.2) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.25.2) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.25.2) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.25.2) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.25.2) + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.25.2) + '@babel/plugin-transform-arrow-functions': 7.23.3(@babel/core@7.25.2) + '@babel/plugin-transform-async-generator-functions': 7.23.9(@babel/core@7.25.2) + '@babel/plugin-transform-async-to-generator': 7.23.3(@babel/core@7.25.2) + '@babel/plugin-transform-block-scoped-functions': 7.23.3(@babel/core@7.25.2) + '@babel/plugin-transform-block-scoping': 7.23.4(@babel/core@7.25.2) + '@babel/plugin-transform-class-properties': 7.23.3(@babel/core@7.25.2) + '@babel/plugin-transform-class-static-block': 7.23.4(@babel/core@7.25.2) + '@babel/plugin-transform-classes': 7.23.8(@babel/core@7.25.2) + '@babel/plugin-transform-computed-properties': 7.23.3(@babel/core@7.25.2) + '@babel/plugin-transform-destructuring': 7.23.3(@babel/core@7.25.2) + '@babel/plugin-transform-dotall-regex': 7.23.3(@babel/core@7.25.2) + '@babel/plugin-transform-duplicate-keys': 7.23.3(@babel/core@7.25.2) + '@babel/plugin-transform-dynamic-import': 7.23.4(@babel/core@7.25.2) + '@babel/plugin-transform-exponentiation-operator': 7.23.3(@babel/core@7.25.2) + '@babel/plugin-transform-export-namespace-from': 7.23.4(@babel/core@7.25.2) + '@babel/plugin-transform-for-of': 7.23.6(@babel/core@7.25.2) + '@babel/plugin-transform-function-name': 7.23.3(@babel/core@7.25.2) + '@babel/plugin-transform-json-strings': 7.23.4(@babel/core@7.25.2) + '@babel/plugin-transform-literals': 7.23.3(@babel/core@7.25.2) + '@babel/plugin-transform-logical-assignment-operators': 7.23.4(@babel/core@7.25.2) + '@babel/plugin-transform-member-expression-literals': 7.23.3(@babel/core@7.25.2) + '@babel/plugin-transform-modules-amd': 7.23.3(@babel/core@7.25.2) + '@babel/plugin-transform-modules-commonjs': 7.23.3(@babel/core@7.25.2) + '@babel/plugin-transform-modules-systemjs': 7.23.9(@babel/core@7.25.2) + '@babel/plugin-transform-modules-umd': 7.23.3(@babel/core@7.25.2) + '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.25.2) + '@babel/plugin-transform-new-target': 7.23.3(@babel/core@7.25.2) + '@babel/plugin-transform-nullish-coalescing-operator': 7.23.4(@babel/core@7.25.2) + '@babel/plugin-transform-numeric-separator': 7.23.4(@babel/core@7.25.2) + '@babel/plugin-transform-object-rest-spread': 7.23.4(@babel/core@7.25.2) + '@babel/plugin-transform-object-super': 7.23.3(@babel/core@7.25.2) + '@babel/plugin-transform-optional-catch-binding': 7.23.4(@babel/core@7.25.2) + '@babel/plugin-transform-optional-chaining': 7.23.4(@babel/core@7.25.2) + '@babel/plugin-transform-parameters': 7.23.3(@babel/core@7.25.2) + '@babel/plugin-transform-private-methods': 7.23.3(@babel/core@7.25.2) + '@babel/plugin-transform-private-property-in-object': 7.23.4(@babel/core@7.25.2) + '@babel/plugin-transform-property-literals': 7.23.3(@babel/core@7.25.2) + '@babel/plugin-transform-regenerator': 7.23.3(@babel/core@7.25.2) + '@babel/plugin-transform-reserved-words': 7.23.3(@babel/core@7.25.2) + '@babel/plugin-transform-shorthand-properties': 7.23.3(@babel/core@7.25.2) + '@babel/plugin-transform-spread': 7.23.3(@babel/core@7.25.2) + '@babel/plugin-transform-sticky-regex': 7.23.3(@babel/core@7.25.2) + '@babel/plugin-transform-template-literals': 7.23.3(@babel/core@7.25.2) + '@babel/plugin-transform-typeof-symbol': 7.23.3(@babel/core@7.25.2) + '@babel/plugin-transform-unicode-escapes': 7.23.3(@babel/core@7.25.2) + '@babel/plugin-transform-unicode-property-regex': 7.23.3(@babel/core@7.25.2) + '@babel/plugin-transform-unicode-regex': 7.23.3(@babel/core@7.25.2) + '@babel/plugin-transform-unicode-sets-regex': 7.23.3(@babel/core@7.25.2) + '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.25.2) + babel-plugin-polyfill-corejs2: 0.4.8(@babel/core@7.25.2) + babel-plugin-polyfill-corejs3: 0.9.0(@babel/core@7.25.2) + babel-plugin-polyfill-regenerator: 0.5.5(@babel/core@7.25.2) + core-js-compat: 3.36.0 semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/preset-flow@7.24.1(@babel/core@7.24.5)': + '@babel/preset-flow@7.23.3(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/helper-validator-option': 7.23.5 - '@babel/plugin-transform-flow-strip-types': 7.24.1(@babel/core@7.24.5) + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-validator-option': 7.24.8 + '@babel/plugin-transform-flow-strip-types': 7.23.3(@babel/core@7.25.2) - '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.24.5)': + '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/types': 7.24.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/types': 7.25.6 esutils: 2.0.3 - '@babel/preset-typescript@7.24.1(@babel/core@7.24.5)': + '@babel/preset-typescript@7.23.3(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/helper-validator-option': 7.23.5 - '@babel/plugin-syntax-jsx': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-modules-commonjs': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-typescript': 7.24.5(@babel/core@7.24.5) + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-validator-option': 7.24.8 + '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-modules-commonjs': 7.23.3(@babel/core@7.25.2) + '@babel/plugin-transform-typescript': 7.23.6(@babel/core@7.25.2) + transitivePeerDependencies: + - supports-color - '@babel/register@7.23.7(@babel/core@7.24.5)': + '@babel/register@7.23.7(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.5 + '@babel/core': 7.25.2 clone-deep: 4.0.1 find-cache-dir: 2.1.0 make-dir: 2.1.0 @@ -12881,35 +14829,38 @@ snapshots: '@babel/regjsgen@0.8.0': {} - '@babel/runtime@7.24.5': + '@babel/runtime@7.23.9': dependencies: regenerator-runtime: 0.14.1 - '@babel/template@7.24.0': + '@babel/template@7.25.0': dependencies: - '@babel/code-frame': 7.24.2 - '@babel/parser': 7.24.5 - '@babel/types': 7.24.5 + '@babel/code-frame': 7.24.7 + '@babel/parser': 7.25.6 + '@babel/types': 7.25.6 - '@babel/traverse@7.24.5': + '@babel/traverse@7.25.6': dependencies: - '@babel/code-frame': 7.24.2 - '@babel/generator': 7.24.5 - '@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.24.5 - '@babel/parser': 7.24.5 - '@babel/types': 7.24.5 - debug: 4.3.4 + '@babel/code-frame': 7.24.7 + '@babel/generator': 7.25.6 + '@babel/parser': 7.25.6 + '@babel/template': 7.25.0 + '@babel/types': 7.25.6 + debug: 4.3.7(supports-color@8.1.1) globals: 11.12.0 transitivePeerDependencies: - supports-color - '@babel/types@7.24.5': + '@babel/types@7.23.9': + dependencies: + '@babel/helper-string-parser': 7.23.4 + '@babel/helper-validator-identifier': 7.22.20 + to-fast-properties: 2.0.0 + + '@babel/types@7.25.6': dependencies: - '@babel/helper-string-parser': 7.24.1 - '@babel/helper-validator-identifier': 7.24.5 + '@babel/helper-string-parser': 7.24.8 + '@babel/helper-validator-identifier': 7.24.7 to-fast-properties: 2.0.0 '@bcoe/v8-coverage@0.2.3': {} @@ -12920,12 +14871,168 @@ snapshots: dependencies: '@chainsafe/is-ip': 2.0.2 - '@chromatic-com/storybook@1.3.4(react@18.3.1)': + '@changesets/apply-release-plan@7.0.5': + dependencies: + '@changesets/config': 3.0.3 + '@changesets/get-version-range-type': 0.4.0 + '@changesets/git': 3.0.1 + '@changesets/should-skip-package': 0.1.1 + '@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.2 + + '@changesets/assemble-release-plan@6.0.4': + dependencies: + '@changesets/errors': 0.2.0 + '@changesets/get-dependents-graph': 2.1.2 + '@changesets/should-skip-package': 0.1.1 + '@changesets/types': 6.0.0 + '@manypkg/get-packages': 1.1.3 + semver: 7.6.2 + + '@changesets/changelog-git@0.2.0': + dependencies: + '@changesets/types': 6.0.0 + + '@changesets/cli@2.27.8': + dependencies: + '@changesets/apply-release-plan': 7.0.5 + '@changesets/assemble-release-plan': 6.0.4 + '@changesets/changelog-git': 0.2.0 + '@changesets/config': 3.0.3 + '@changesets/errors': 0.2.0 + '@changesets/get-dependents-graph': 2.1.2 + '@changesets/get-release-plan': 4.0.4 + '@changesets/git': 3.0.1 + '@changesets/logger': 0.1.1 + '@changesets/pre': 2.0.1 + '@changesets/read': 0.6.1 + '@changesets/should-skip-package': 0.1.1 + '@changesets/types': 6.0.0 + '@changesets/write': 0.3.2 + '@manypkg/get-packages': 1.1.3 + '@types/semver': 7.5.7 + ansi-colors: 4.1.3 + ci-info: 3.9.0 + enquirer: 2.4.1 + external-editor: 3.1.0 + fs-extra: 7.0.1 + mri: 1.2.0 + outdent: 0.5.0 + p-limit: 2.3.0 + package-manager-detector: 0.2.0 + picocolors: 1.1.0 + resolve-from: 5.0.0 + semver: 7.6.2 + spawndamnit: 2.0.0 + term-size: 2.2.1 + + '@changesets/config@3.0.3': + dependencies: + '@changesets/errors': 0.2.0 + '@changesets/get-dependents-graph': 2.1.2 + '@changesets/logger': 0.1.1 + '@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.1.2': + dependencies: + '@changesets/types': 6.0.0 + '@manypkg/get-packages': 1.1.3 + picocolors: 1.1.0 + semver: 7.6.2 + + '@changesets/get-release-plan@4.0.4': + dependencies: + '@changesets/assemble-release-plan': 6.0.4 + '@changesets/config': 3.0.3 + '@changesets/pre': 2.0.1 + '@changesets/read': 0.6.1 + '@changesets/types': 6.0.0 + '@manypkg/get-packages': 1.1.3 + + '@changesets/get-version-range-type@0.4.0': {} + + '@changesets/git@3.0.1': + dependencies: + '@changesets/errors': 0.2.0 + '@manypkg/get-packages': 1.1.3 + is-subdir: 1.2.0 + micromatch: 4.0.5 + spawndamnit: 2.0.0 + + '@changesets/logger@0.1.1': + dependencies: + picocolors: 1.1.0 + + '@changesets/parse@0.4.0': + dependencies: + '@changesets/types': 6.0.0 + js-yaml: 3.14.1 + + '@changesets/pre@2.0.1': + dependencies: + '@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.1': + dependencies: + '@changesets/git': 3.0.1 + '@changesets/logger': 0.1.1 + '@changesets/parse': 0.4.0 + '@changesets/types': 6.0.0 + fs-extra: 7.0.1 + p-filter: 2.1.0 + picocolors: 1.1.0 + + '@changesets/should-skip-package@0.1.1': + dependencies: + '@changesets/types': 6.0.0 + '@manypkg/get-packages': 1.1.3 + + '@changesets/types@4.1.0': {} + + '@changesets/types@6.0.0': {} + + '@changesets/write@0.3.2': + dependencies: + '@changesets/types': 6.0.0 + fs-extra: 7.0.1 + human-id: 1.0.2 + prettier: 2.8.8 + + '@chromatic-com/storybook@1.3.3(react@18.2.0)': + dependencies: + chromatic: 11.3.0 + filesize: 10.1.1 + jsonfile: 6.1.0 + react-confetti: 6.1.0(react@18.2.0) + strip-ansi: 7.1.0 + transitivePeerDependencies: + - '@chromatic-com/cypress' + - '@chromatic-com/playwright' + - react + + '@chromatic-com/storybook@1.9.0(react@18.2.0)': dependencies: - chromatic: 11.3.2 + chromatic: 11.10.2 filesize: 10.1.1 jsonfile: 6.1.0 - react-confetti: 6.1.0(react@18.3.1) + react-confetti: 6.1.0(react@18.2.0) strip-ansi: 7.1.0 transitivePeerDependencies: - '@chromatic-com/cypress' @@ -12941,7 +15048,7 @@ snapshots: eth-json-rpc-filters: 6.0.1 eventemitter3: 5.0.1 keccak: 3.0.4 - preact: 10.21.0 + preact: 10.19.5 sha.js: 2.4.11 transitivePeerDependencies: - supports-color @@ -12955,39 +15062,36 @@ snapshots: eth-json-rpc-filters: 6.0.1 eventemitter3: 5.0.1 keccak: 3.0.4 - preact: 10.21.0 + preact: 10.19.5 sha.js: 2.4.11 transitivePeerDependencies: - supports-color - '@coinbase/wallet-sdk@4.0.2': + '@coinbase/wallet-sdk@4.0.4': dependencies: buffer: 6.0.3 clsx: 1.2.1 eventemitter3: 5.0.1 keccak: 3.0.4 - preact: 10.21.0 + preact: 10.19.5 sha.js: 2.4.11 - '@colors/colors@1.5.0': - optional: true + '@colors/colors@1.5.0': {} '@cspotcode/source-map-support@0.8.1': dependencies: '@jridgewell/trace-mapping': 0.3.9 - '@csstools/selector-resolve-nested@1.1.0(postcss-selector-parser@6.0.16)': + '@csstools/selector-resolve-nested@1.1.0(postcss-selector-parser@6.0.15)': dependencies: - postcss-selector-parser: 6.0.16 + postcss-selector-parser: 6.0.15 - '@csstools/selector-specificity@3.0.3(postcss-selector-parser@6.0.16)': + '@csstools/selector-specificity@3.0.2(postcss-selector-parser@6.0.15)': dependencies: - postcss-selector-parser: 6.0.16 + postcss-selector-parser: 6.0.15 '@ctrl/tinycolor@4.1.0': {} - '@discoveryjs/json-ext@0.5.7': {} - '@emmetio/abbreviation@2.3.3': dependencies: '@emmetio/scanner': 1.0.4 @@ -12996,16 +15100,102 @@ snapshots: dependencies: '@emmetio/scanner': 1.0.4 + '@emmetio/css-parser@0.4.0': + dependencies: + '@emmetio/stream-reader': 2.2.0 + '@emmetio/stream-reader-utils': 0.1.0 + + '@emmetio/html-matcher@1.3.0': + dependencies: + '@emmetio/scanner': 1.0.4 + '@emmetio/scanner@1.0.4': {} + '@emmetio/stream-reader-utils@0.1.0': {} + + '@emmetio/stream-reader@2.2.0': {} + '@emnapi/runtime@1.1.1': dependencies: - tslib: 2.6.2 + tslib: 2.6.3 optional: true - '@emotion/use-insertion-effect-with-fallbacks@1.0.1(react@18.3.1)': + '@emotion/babel-plugin@11.11.0': dependencies: - react: 18.3.1 + '@babel/helper-module-imports': 7.22.15 + '@babel/runtime': 7.23.9 + '@emotion/hash': 0.9.1 + '@emotion/memoize': 0.8.1 + '@emotion/serialize': 1.1.3 + babel-plugin-macros: 3.1.0 + convert-source-map: 1.9.0 + escape-string-regexp: 4.0.0 + find-root: 1.1.0 + source-map: 0.5.7 + stylis: 4.2.0 + + '@emotion/cache@11.11.0': + dependencies: + '@emotion/memoize': 0.8.1 + '@emotion/sheet': 1.2.2 + '@emotion/utils': 1.2.1 + '@emotion/weak-memoize': 0.3.1 + stylis: 4.2.0 + + '@emotion/hash@0.9.1': {} + + '@emotion/is-prop-valid@1.2.1': + dependencies: + '@emotion/memoize': 0.8.1 + + '@emotion/memoize@0.8.1': {} + + '@emotion/react@11.11.3(@types/react@18.3.5)(react@18.2.0)': + dependencies: + '@babel/runtime': 7.23.9 + '@emotion/babel-plugin': 11.11.0 + '@emotion/cache': 11.11.0 + '@emotion/serialize': 1.1.3 + '@emotion/use-insertion-effect-with-fallbacks': 1.0.1(react@18.2.0) + '@emotion/utils': 1.2.1 + '@emotion/weak-memoize': 0.3.1 + hoist-non-react-statics: 3.3.2 + react: 18.2.0 + optionalDependencies: + '@types/react': 18.3.5 + + '@emotion/serialize@1.1.3': + dependencies: + '@emotion/hash': 0.9.1 + '@emotion/memoize': 0.8.1 + '@emotion/unitless': 0.8.1 + '@emotion/utils': 1.2.1 + csstype: 3.1.3 + + '@emotion/sheet@1.2.2': {} + + '@emotion/styled@11.11.0(@emotion/react@11.11.3(@types/react@18.3.5)(react@18.2.0))(@types/react@18.3.5)(react@18.2.0)': + dependencies: + '@babel/runtime': 7.23.9 + '@emotion/babel-plugin': 11.11.0 + '@emotion/is-prop-valid': 1.2.1 + '@emotion/react': 11.11.3(@types/react@18.3.5)(react@18.2.0) + '@emotion/serialize': 1.1.3 + '@emotion/use-insertion-effect-with-fallbacks': 1.0.1(react@18.2.0) + '@emotion/utils': 1.2.1 + react: 18.2.0 + optionalDependencies: + '@types/react': 18.3.5 + + '@emotion/unitless@0.8.1': {} + + '@emotion/use-insertion-effect-with-fallbacks@1.0.1(react@18.2.0)': + dependencies: + react: 18.2.0 + + '@emotion/utils@1.2.1': {} + + '@emotion/weak-memoize@0.3.1': {} '@esbuild/aix-ppc64@0.19.12': optional: true @@ -13013,7 +15203,10 @@ snapshots: '@esbuild/aix-ppc64@0.20.2': optional: true - '@esbuild/aix-ppc64@0.21.2': + '@esbuild/aix-ppc64@0.21.3': + optional: true + + '@esbuild/aix-ppc64@0.21.5': optional: true '@esbuild/android-arm64@0.18.20': @@ -13025,7 +15218,10 @@ snapshots: '@esbuild/android-arm64@0.20.2': optional: true - '@esbuild/android-arm64@0.21.2': + '@esbuild/android-arm64@0.21.3': + optional: true + + '@esbuild/android-arm64@0.21.5': optional: true '@esbuild/android-arm@0.18.20': @@ -13037,7 +15233,10 @@ snapshots: '@esbuild/android-arm@0.20.2': optional: true - '@esbuild/android-arm@0.21.2': + '@esbuild/android-arm@0.21.3': + optional: true + + '@esbuild/android-arm@0.21.5': optional: true '@esbuild/android-x64@0.18.20': @@ -13049,7 +15248,10 @@ snapshots: '@esbuild/android-x64@0.20.2': optional: true - '@esbuild/android-x64@0.21.2': + '@esbuild/android-x64@0.21.3': + optional: true + + '@esbuild/android-x64@0.21.5': optional: true '@esbuild/darwin-arm64@0.18.20': @@ -13061,7 +15263,10 @@ snapshots: '@esbuild/darwin-arm64@0.20.2': optional: true - '@esbuild/darwin-arm64@0.21.2': + '@esbuild/darwin-arm64@0.21.3': + optional: true + + '@esbuild/darwin-arm64@0.21.5': optional: true '@esbuild/darwin-x64@0.18.20': @@ -13073,7 +15278,10 @@ snapshots: '@esbuild/darwin-x64@0.20.2': optional: true - '@esbuild/darwin-x64@0.21.2': + '@esbuild/darwin-x64@0.21.3': + optional: true + + '@esbuild/darwin-x64@0.21.5': optional: true '@esbuild/freebsd-arm64@0.18.20': @@ -13085,7 +15293,10 @@ snapshots: '@esbuild/freebsd-arm64@0.20.2': optional: true - '@esbuild/freebsd-arm64@0.21.2': + '@esbuild/freebsd-arm64@0.21.3': + optional: true + + '@esbuild/freebsd-arm64@0.21.5': optional: true '@esbuild/freebsd-x64@0.18.20': @@ -13097,7 +15308,10 @@ snapshots: '@esbuild/freebsd-x64@0.20.2': optional: true - '@esbuild/freebsd-x64@0.21.2': + '@esbuild/freebsd-x64@0.21.3': + optional: true + + '@esbuild/freebsd-x64@0.21.5': optional: true '@esbuild/linux-arm64@0.18.20': @@ -13109,7 +15323,10 @@ snapshots: '@esbuild/linux-arm64@0.20.2': optional: true - '@esbuild/linux-arm64@0.21.2': + '@esbuild/linux-arm64@0.21.3': + optional: true + + '@esbuild/linux-arm64@0.21.5': optional: true '@esbuild/linux-arm@0.18.20': @@ -13121,7 +15338,10 @@ snapshots: '@esbuild/linux-arm@0.20.2': optional: true - '@esbuild/linux-arm@0.21.2': + '@esbuild/linux-arm@0.21.3': + optional: true + + '@esbuild/linux-arm@0.21.5': optional: true '@esbuild/linux-ia32@0.18.20': @@ -13133,7 +15353,10 @@ snapshots: '@esbuild/linux-ia32@0.20.2': optional: true - '@esbuild/linux-ia32@0.21.2': + '@esbuild/linux-ia32@0.21.3': + optional: true + + '@esbuild/linux-ia32@0.21.5': optional: true '@esbuild/linux-loong64@0.18.20': @@ -13145,7 +15368,10 @@ snapshots: '@esbuild/linux-loong64@0.20.2': optional: true - '@esbuild/linux-loong64@0.21.2': + '@esbuild/linux-loong64@0.21.3': + optional: true + + '@esbuild/linux-loong64@0.21.5': optional: true '@esbuild/linux-mips64el@0.18.20': @@ -13157,7 +15383,10 @@ snapshots: '@esbuild/linux-mips64el@0.20.2': optional: true - '@esbuild/linux-mips64el@0.21.2': + '@esbuild/linux-mips64el@0.21.3': + optional: true + + '@esbuild/linux-mips64el@0.21.5': optional: true '@esbuild/linux-ppc64@0.18.20': @@ -13169,7 +15398,10 @@ snapshots: '@esbuild/linux-ppc64@0.20.2': optional: true - '@esbuild/linux-ppc64@0.21.2': + '@esbuild/linux-ppc64@0.21.3': + optional: true + + '@esbuild/linux-ppc64@0.21.5': optional: true '@esbuild/linux-riscv64@0.18.20': @@ -13181,7 +15413,10 @@ snapshots: '@esbuild/linux-riscv64@0.20.2': optional: true - '@esbuild/linux-riscv64@0.21.2': + '@esbuild/linux-riscv64@0.21.3': + optional: true + + '@esbuild/linux-riscv64@0.21.5': optional: true '@esbuild/linux-s390x@0.18.20': @@ -13193,7 +15428,10 @@ snapshots: '@esbuild/linux-s390x@0.20.2': optional: true - '@esbuild/linux-s390x@0.21.2': + '@esbuild/linux-s390x@0.21.3': + optional: true + + '@esbuild/linux-s390x@0.21.5': optional: true '@esbuild/linux-x64@0.18.20': @@ -13205,7 +15443,10 @@ snapshots: '@esbuild/linux-x64@0.20.2': optional: true - '@esbuild/linux-x64@0.21.2': + '@esbuild/linux-x64@0.21.3': + optional: true + + '@esbuild/linux-x64@0.21.5': optional: true '@esbuild/netbsd-x64@0.18.20': @@ -13217,7 +15458,10 @@ snapshots: '@esbuild/netbsd-x64@0.20.2': optional: true - '@esbuild/netbsd-x64@0.21.2': + '@esbuild/netbsd-x64@0.21.3': + optional: true + + '@esbuild/netbsd-x64@0.21.5': optional: true '@esbuild/openbsd-x64@0.18.20': @@ -13229,7 +15473,10 @@ snapshots: '@esbuild/openbsd-x64@0.20.2': optional: true - '@esbuild/openbsd-x64@0.21.2': + '@esbuild/openbsd-x64@0.21.3': + optional: true + + '@esbuild/openbsd-x64@0.21.5': optional: true '@esbuild/sunos-x64@0.18.20': @@ -13241,7 +15488,10 @@ snapshots: '@esbuild/sunos-x64@0.20.2': optional: true - '@esbuild/sunos-x64@0.21.2': + '@esbuild/sunos-x64@0.21.3': + optional: true + + '@esbuild/sunos-x64@0.21.5': optional: true '@esbuild/win32-arm64@0.18.20': @@ -13253,7 +15503,10 @@ snapshots: '@esbuild/win32-arm64@0.20.2': optional: true - '@esbuild/win32-arm64@0.21.2': + '@esbuild/win32-arm64@0.21.3': + optional: true + + '@esbuild/win32-arm64@0.21.5': optional: true '@esbuild/win32-ia32@0.18.20': @@ -13265,7 +15518,10 @@ snapshots: '@esbuild/win32-ia32@0.20.2': optional: true - '@esbuild/win32-ia32@0.21.2': + '@esbuild/win32-ia32@0.21.3': + optional: true + + '@esbuild/win32-ia32@0.21.5': optional: true '@esbuild/win32-x64@0.18.20': @@ -13277,20 +15533,28 @@ snapshots: '@esbuild/win32-x64@0.20.2': optional: true - '@esbuild/win32-x64@0.21.2': + '@esbuild/win32-x64@0.21.3': + optional: true + + '@esbuild/win32-x64@0.21.5': optional: true - '@eslint-community/eslint-utils@4.4.0(eslint@8.57.0)': + '@eslint-community/eslint-utils@4.4.0(eslint@8.55.0)': dependencies: - eslint: 8.57.0 + eslint: 8.55.0 eslint-visitor-keys: 3.4.3 - '@eslint-community/regexpp@4.10.0': {} + '@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.11.0': {} '@eslint/eslintrc@1.4.1': dependencies: ajv: 6.12.6 - debug: 4.3.4 + debug: 4.3.7(supports-color@8.1.1) espree: 9.6.1 globals: 13.24.0 ignore: 5.3.1 @@ -13304,7 +15568,7 @@ snapshots: '@eslint/eslintrc@2.1.4': dependencies: ajv: 6.12.6 - debug: 4.3.4 + debug: 4.3.5 espree: 9.6.1 globals: 13.24.0 ignore: 5.3.1 @@ -13315,7 +15579,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@8.57.0': {} + '@eslint/js@8.55.0': {} + + '@eslint/js@8.56.0': {} + + '@ethereumjs/common@2.6.5': + dependencies: + crc-32: 1.2.2 + ethereumjs-util: 7.1.5 '@ethereumjs/common@3.2.0': dependencies: @@ -13324,17 +15595,22 @@ snapshots: '@ethereumjs/rlp@4.0.1': {} + '@ethereumjs/tx@3.5.2': + dependencies: + '@ethereumjs/common': 2.6.5 + ethereumjs-util: 7.1.5 + '@ethereumjs/tx@4.2.0': dependencies: '@ethereumjs/common': 3.2.0 '@ethereumjs/rlp': 4.0.1 '@ethereumjs/util': 8.1.0 - ethereum-cryptography: 2.1.3 + ethereum-cryptography: 2.2.1 '@ethereumjs/util@8.1.0': dependencies: '@ethereumjs/rlp': 4.0.1 - ethereum-cryptography: 2.1.3 + ethereum-cryptography: 2.2.1 micro-ftch: 0.3.1 '@ethersproject/abi@5.7.0': @@ -13474,7 +15750,7 @@ snapshots: dependencies: '@ethersproject/logger': 5.7.0 - '@ethersproject/providers@5.7.2(bufferutil@4.0.8)(utf-8-validate@6.0.3)': + '@ethersproject/providers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10)': dependencies: '@ethersproject/abstract-provider': 5.7.0 '@ethersproject/abstract-signer': 5.7.0 @@ -13495,7 +15771,7 @@ snapshots: '@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@6.0.3) + ws: 7.4.6(bufferutil@4.0.8)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - utf-8-validate @@ -13592,58 +15868,56 @@ snapshots: '@ethersproject/properties': 5.7.0 '@ethersproject/strings': 5.7.0 - '@expressive-code/core@0.35.3': + '@expressive-code/core@0.35.6': dependencies: '@ctrl/tinycolor': 4.1.0 hast-util-select: 6.0.2 hast-util-to-html: 9.0.1 hast-util-to-text: 4.0.2 hastscript: 9.0.0 - postcss: 8.4.38 - postcss-nested: 6.0.1(postcss@8.4.38) + postcss: 8.4.39 + postcss-nested: 6.0.1(postcss@8.4.39) unist-util-visit: 5.0.0 unist-util-visit-parents: 6.0.1 - '@expressive-code/plugin-frames@0.35.3': + '@expressive-code/plugin-frames@0.35.6': dependencies: - '@expressive-code/core': 0.35.3 + '@expressive-code/core': 0.35.6 - '@expressive-code/plugin-shiki@0.35.3': + '@expressive-code/plugin-shiki@0.35.6': dependencies: - '@expressive-code/core': 0.35.3 - shiki: 1.5.1 + '@expressive-code/core': 0.35.6 + shiki: 1.5.2 - '@expressive-code/plugin-text-markers@0.35.3': + '@expressive-code/plugin-text-markers@0.35.6': dependencies: - '@expressive-code/core': 0.35.3 - - '@fal-works/esbuild-plugin-global-externals@2.1.2': {} + '@expressive-code/core': 0.35.6 - '@fastify/busboy@2.1.1': {} + '@fastify/busboy@2.1.0': {} - '@formatjs/ecma402-abstract@1.18.2': + '@formatjs/ecma402-abstract@2.0.0': dependencies: '@formatjs/intl-localematcher': 0.5.4 - tslib: 2.6.2 + tslib: 2.6.3 '@formatjs/fast-memoize@2.2.0': dependencies: - tslib: 2.6.2 + tslib: 2.6.3 - '@formatjs/icu-messageformat-parser@2.7.6': + '@formatjs/icu-messageformat-parser@2.7.8': dependencies: - '@formatjs/ecma402-abstract': 1.18.2 - '@formatjs/icu-skeleton-parser': 1.8.0 - tslib: 2.6.2 + '@formatjs/ecma402-abstract': 2.0.0 + '@formatjs/icu-skeleton-parser': 1.8.2 + tslib: 2.6.3 - '@formatjs/icu-skeleton-parser@1.8.0': + '@formatjs/icu-skeleton-parser@1.8.2': dependencies: - '@formatjs/ecma402-abstract': 1.18.2 - tslib: 2.6.2 + '@formatjs/ecma402-abstract': 2.0.0 + tslib: 2.6.3 '@formatjs/intl-localematcher@0.5.4': dependencies: - tslib: 2.6.2 + tslib: 2.6.3 '@hapi/hoek@9.3.0': {} @@ -13651,9 +15925,17 @@ snapshots: dependencies: '@hapi/hoek': 9.3.0 + '@humanwhocodes/config-array@0.11.13': + dependencies: + '@humanwhocodes/object-schema': 2.0.1 + debug: 4.3.4 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + '@humanwhocodes/config-array@0.11.14': dependencies: - '@humanwhocodes/object-schema': 2.0.3 + '@humanwhocodes/object-schema': 2.0.2 debug: 4.3.4 minimatch: 3.1.2 transitivePeerDependencies: @@ -13662,7 +15944,7 @@ snapshots: '@humanwhocodes/config-array@0.9.5': dependencies: '@humanwhocodes/object-schema': 1.2.1 - debug: 4.3.4 + debug: 4.3.7(supports-color@8.1.1) minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -13673,14 +15955,16 @@ snapshots: '@humanwhocodes/object-schema@1.2.1': {} - '@humanwhocodes/object-schema@2.0.3': {} + '@humanwhocodes/object-schema@2.0.1': {} - '@img/sharp-darwin-arm64@0.33.3': + '@humanwhocodes/object-schema@2.0.2': {} + + '@img/sharp-darwin-arm64@0.33.4': optionalDependencies: '@img/sharp-libvips-darwin-arm64': 1.0.2 optional: true - '@img/sharp-darwin-x64@0.33.3': + '@img/sharp-darwin-x64@0.33.4': optionalDependencies: '@img/sharp-libvips-darwin-x64': 1.0.2 optional: true @@ -13709,60 +15993,62 @@ snapshots: '@img/sharp-libvips-linuxmusl-x64@1.0.2': optional: true - '@img/sharp-linux-arm64@0.33.3': + '@img/sharp-linux-arm64@0.33.4': optionalDependencies: '@img/sharp-libvips-linux-arm64': 1.0.2 optional: true - '@img/sharp-linux-arm@0.33.3': + '@img/sharp-linux-arm@0.33.4': optionalDependencies: '@img/sharp-libvips-linux-arm': 1.0.2 optional: true - '@img/sharp-linux-s390x@0.33.3': + '@img/sharp-linux-s390x@0.33.4': optionalDependencies: '@img/sharp-libvips-linux-s390x': 1.0.2 optional: true - '@img/sharp-linux-x64@0.33.3': + '@img/sharp-linux-x64@0.33.4': optionalDependencies: '@img/sharp-libvips-linux-x64': 1.0.2 optional: true - '@img/sharp-linuxmusl-arm64@0.33.3': + '@img/sharp-linuxmusl-arm64@0.33.4': optionalDependencies: '@img/sharp-libvips-linuxmusl-arm64': 1.0.2 optional: true - '@img/sharp-linuxmusl-x64@0.33.3': + '@img/sharp-linuxmusl-x64@0.33.4': optionalDependencies: '@img/sharp-libvips-linuxmusl-x64': 1.0.2 optional: true - '@img/sharp-wasm32@0.33.3': + '@img/sharp-wasm32@0.33.4': dependencies: - '@emnapi/runtime': 1.1.1 + '@emnapi/runtime': 1.2.0 optional: true - '@img/sharp-win32-ia32@0.33.3': + '@img/sharp-win32-ia32@0.33.4': optional: true - '@img/sharp-win32-x64@0.33.3': + '@img/sharp-win32-x64@0.33.4': optional: true + '@ioredis/commands@1.2.0': {} + '@ipld/dag-cbor@9.2.0': dependencies: - cborg: 4.2.0 - multiformats: 13.1.0 + cborg: 4.2.2 + multiformats: 13.1.3 - '@ipld/dag-json@10.2.0': + '@ipld/dag-json@10.2.2': dependencies: - cborg: 4.2.0 - multiformats: 13.1.0 + cborg: 4.2.2 + multiformats: 13.1.3 - '@ipld/dag-pb@4.1.0': + '@ipld/dag-pb@4.1.2': dependencies: - multiformats: 13.1.0 + multiformats: 13.1.3 '@isaacs/cliui@8.0.2': dependencies: @@ -13785,7 +16071,7 @@ snapshots: dependencies: '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.12.11 + '@types/node': 20.12.7 jest-mock: 29.7.0 '@jest/expect-utils@29.7.0': @@ -13796,7 +16082,7 @@ snapshots: dependencies: '@jest/types': 29.6.3 '@sinonjs/fake-timers': 10.3.0 - '@types/node': 20.12.11 + '@types/node': 20.12.7 jest-message-util: 29.7.0 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -13809,7 +16095,7 @@ snapshots: dependencies: '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 20.12.11 + '@types/node': 20.12.7 '@types/yargs': 15.0.19 chalk: 4.1.2 @@ -13818,16 +16104,15 @@ snapshots: '@jest/schemas': 29.6.3 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 20.12.11 + '@types/node': 20.12.7 '@types/yargs': 17.0.32 chalk: 4.1.2 - '@johnsoncodehk/vscode-html-languageservice@5.2.0-34a5462': + '@jridgewell/gen-mapping@0.3.3': dependencies: - '@vscode/l10n': 0.0.18 - vscode-languageserver-textdocument: 1.0.11 - vscode-languageserver-types: 3.17.5 - vscode-uri: 3.0.8 + '@jridgewell/set-array': 1.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.25 '@jridgewell/gen-mapping@0.3.5': dependencies: @@ -13837,15 +16122,19 @@ snapshots: '@jridgewell/resolve-uri@3.1.2': {} + '@jridgewell/set-array@1.1.2': {} + '@jridgewell/set-array@1.2.1': {} - '@jridgewell/source-map@0.3.6': + '@jridgewell/source-map@0.3.5': dependencies: '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 '@jridgewell/sourcemap-codec@1.4.15': {} + '@jridgewell/sourcemap-codec@1.5.0': {} + '@jridgewell/trace-mapping@0.3.25': dependencies: '@jridgewell/resolve-uri': 3.1.2 @@ -13864,7 +16153,7 @@ snapshots: dependencies: '@libp2p/interface-peer-id': 2.0.2 '@libp2p/interfaces': 3.3.2 - '@multiformats/multiaddr': 12.2.1 + '@multiformats/multiaddr': 12.3.0 it-stream-types: 1.0.5 uint8arraylist: 2.4.8 @@ -13880,7 +16169,7 @@ snapshots: '@libp2p/interface-peer-info@1.0.10': dependencies: '@libp2p/interface-peer-id': 2.0.2 - '@multiformats/multiaddr': 12.2.1 + '@multiformats/multiaddr': 12.3.0 '@libp2p/interface-pubsub@3.0.7': dependencies: @@ -13890,12 +16179,12 @@ snapshots: it-pushable: 3.2.3 uint8arraylist: 2.4.8 - '@libp2p/interface@1.3.1': + '@libp2p/interface@1.3.0': dependencies: - '@multiformats/multiaddr': 12.2.1 + '@multiformats/multiaddr': 12.3.0 it-pushable: 3.2.3 it-stream-types: 2.0.1 - multiformats: 13.1.0 + multiformats: 13.1.3 progress-events: 1.0.0 uint8arraylist: 2.4.8 @@ -13904,8 +16193,8 @@ snapshots: '@libp2p/logger@2.1.1': dependencies: '@libp2p/interface-peer-id': 2.0.2 - '@multiformats/multiaddr': 12.2.1 - debug: 4.3.4 + '@multiformats/multiaddr': 12.3.0 + debug: 4.3.5 interface-datastore: 8.2.11 multiformats: 11.0.2 transitivePeerDependencies: @@ -13928,6 +16217,22 @@ snapshots: dependencies: '@lit-labs/ssr-dom-shim': 1.2.0 + '@manypkg/find-root@1.1.0': + dependencies: + '@babel/runtime': 7.23.9 + '@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.9 + '@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 + '@mdx-js/mdx@3.0.1': dependencies: '@types/estree': 1.0.5 @@ -13948,45 +16253,76 @@ snapshots: remark-parse: 11.0.0 remark-rehype: 11.1.0 source-map: 0.7.4 - unified: 11.0.4 + unified: 11.0.5 unist-util-position-from-estree: 2.0.0 unist-util-stringify-position: 4.0.0 unist-util-visit: 5.0.0 - vfile: 6.0.1 + vfile: 6.0.3 transitivePeerDependencies: - supports-color - '@mdx-js/react@3.0.1(@types/react@18.3.2)(react@18.3.1)': + '@mdx-js/react@3.0.1(@types/react@18.3.5)(react@18.2.0)': dependencies: '@types/mdx': 2.0.13 - '@types/react': 18.3.2 - react: 18.3.1 + '@types/react': 18.3.5 + react: 18.2.0 '@metamask/eth-json-rpc-provider@1.0.1': dependencies: - '@metamask/json-rpc-engine': 7.3.3 + '@metamask/json-rpc-engine': 7.3.2 '@metamask/safe-event-emitter': 3.1.1 '@metamask/utils': 5.0.2 transitivePeerDependencies: - supports-color - '@metamask/json-rpc-engine@7.3.3': + '@metamask/eth-sig-util@4.0.1': + 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 + + '@metamask/json-rpc-engine@7.3.2': + dependencies: + '@metamask/rpc-errors': 6.3.0 + '@metamask/safe-event-emitter': 3.1.1 + '@metamask/utils': 8.3.0 + transitivePeerDependencies: + - supports-color + + '@metamask/json-rpc-engine@8.0.2': dependencies: '@metamask/rpc-errors': 6.2.1 '@metamask/safe-event-emitter': 3.1.1 - '@metamask/utils': 8.4.0 + '@metamask/utils': 8.3.0 transitivePeerDependencies: - supports-color '@metamask/json-rpc-middleware-stream@6.0.2': dependencies: - '@metamask/json-rpc-engine': 7.3.3 + '@metamask/json-rpc-engine': 7.3.2 + '@metamask/safe-event-emitter': 3.1.1 + '@metamask/utils': 8.3.0 + readable-stream: 3.6.2 + transitivePeerDependencies: + - supports-color + + '@metamask/json-rpc-middleware-stream@7.0.2': + dependencies: + '@metamask/json-rpc-engine': 8.0.2 '@metamask/safe-event-emitter': 3.1.1 - '@metamask/utils': 8.4.0 + '@metamask/utils': 8.3.0 readable-stream: 3.6.2 transitivePeerDependencies: - supports-color + '@metamask/object-multiplex@1.3.0': + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + readable-stream: 2.3.8 + '@metamask/object-multiplex@2.0.0': dependencies: once: 1.4.0 @@ -13996,14 +16332,53 @@ snapshots: dependencies: bowser: 2.11.0 + '@metamask/post-message-stream@6.2.0': + dependencies: + '@metamask/utils': 5.0.2 + readable-stream: 2.3.3 + transitivePeerDependencies: + - supports-color + + '@metamask/providers@10.2.1': + dependencies: + '@metamask/object-multiplex': 1.3.0 + '@metamask/safe-event-emitter': 2.0.0 + '@types/chrome': 0.0.136 + detect-browser: 5.3.0 + eth-rpc-errors: 4.0.3 + extension-port-stream: 2.1.1 + fast-deep-equal: 2.0.1 + is-stream: 2.0.1 + json-rpc-engine: 6.1.0 + json-rpc-middleware-stream: 4.2.3 + pump: 3.0.0 + webextension-polyfill-ts: 0.25.0 + '@metamask/providers@15.0.0': dependencies: - '@metamask/json-rpc-engine': 7.3.3 + '@metamask/json-rpc-engine': 7.3.2 '@metamask/json-rpc-middleware-stream': 6.0.2 '@metamask/object-multiplex': 2.0.0 + '@metamask/rpc-errors': 6.3.0 + '@metamask/safe-event-emitter': 3.1.1 + '@metamask/utils': 8.3.0 + detect-browser: 5.3.0 + extension-port-stream: 3.0.0 + fast-deep-equal: 3.1.3 + is-stream: 2.0.1 + readable-stream: 3.6.2 + webextension-polyfill: 0.10.0 + transitivePeerDependencies: + - supports-color + + '@metamask/providers@16.1.0': + dependencies: + '@metamask/json-rpc-engine': 8.0.2 + '@metamask/json-rpc-middleware-stream': 7.0.2 + '@metamask/object-multiplex': 2.0.0 '@metamask/rpc-errors': 6.2.1 '@metamask/safe-event-emitter': 3.1.1 - '@metamask/utils': 8.4.0 + '@metamask/utils': 8.3.0 detect-browser: 5.3.0 extension-port-stream: 3.0.0 fast-deep-equal: 3.1.3 @@ -14013,9 +16388,9 @@ snapshots: transitivePeerDependencies: - supports-color - '@metamask/rpc-errors@6.2.1': + '@metamask/rpc-errors@6.3.0': dependencies: - '@metamask/utils': 8.4.0 + '@metamask/utils': 8.3.0 fast-safe-stringify: 2.1.1 transitivePeerDependencies: - supports-color @@ -14024,62 +16399,127 @@ snapshots: '@metamask/safe-event-emitter@3.1.1': {} - '@metamask/sdk-communication-layer@0.18.5(cross-fetch@4.0.0(encoding@0.1.13))(eciesjs@0.3.18)(eventemitter2@6.4.9)(readable-stream@3.6.2)(socket.io-client@4.7.5(bufferutil@4.0.8)(utf-8-validate@6.0.3))': + '@metamask/sdk-communication-layer@0.14.3(encoding@0.1.13)': dependencies: bufferutil: 4.0.8 - cross-fetch: 4.0.0(encoding@0.1.13) + cross-fetch: 3.1.8(encoding@0.1.13) date-fns: 2.30.0 - debug: 4.3.4 eciesjs: 0.3.18 eventemitter2: 6.4.9 - readable-stream: 3.6.2 - socket.io-client: 4.7.5(bufferutil@4.0.8)(utf-8-validate@6.0.3) + socket.io-client: 4.7.4(bufferutil@4.0.8)(utf-8-validate@6.0.3) utf-8-validate: 6.0.3 uuid: 8.3.2 transitivePeerDependencies: + - encoding - supports-color - '@metamask/sdk-communication-layer@0.20.2(cross-fetch@4.0.0(encoding@0.1.13))(eciesjs@0.3.18)(eventemitter2@6.4.9)(readable-stream@3.6.2)(socket.io-client@4.7.5(bufferutil@4.0.8)(utf-8-validate@6.0.3))': + '@metamask/sdk-communication-layer@0.20.2(cross-fetch@4.0.0(encoding@0.1.13))(eciesjs@0.3.18)(eventemitter2@6.4.9)(readable-stream@3.6.2)(socket.io-client@4.7.4(bufferutil@4.0.8)(utf-8-validate@5.0.10))': dependencies: bufferutil: 4.0.8 - cross-fetch: 4.0.0(encoding@0.1.13) + cross-fetch: 4.0.0 date-fns: 2.30.0 - debug: 4.3.4 + debug: 4.3.7(supports-color@8.1.1) eciesjs: 0.3.18 eventemitter2: 6.4.9 readable-stream: 3.6.2 - socket.io-client: 4.7.5(bufferutil@4.0.8)(utf-8-validate@6.0.3) + socket.io-client: 4.7.4(bufferutil@4.0.8)(utf-8-validate@5.0.10) utf-8-validate: 6.0.3 uuid: 8.3.2 transitivePeerDependencies: - supports-color - '@metamask/sdk-install-modal-web@0.18.5(i18next@22.5.1)(react-dom@18.3.1(react@18.3.1))(react-i18next@13.5.0(i18next@22.5.1)(react-dom@18.3.1(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.3.2)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.3.2)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1)': + '@metamask/sdk-communication-layer@0.28.2(cross-fetch@4.0.0(encoding@0.1.13))(eciesjs@0.3.18)(eventemitter2@6.4.9)(readable-stream@3.6.2)(socket.io-client@4.7.4(bufferutil@4.0.8)(utf-8-validate@5.0.10))': dependencies: - i18next: 22.5.1 + bufferutil: 4.0.8 + cross-fetch: 4.0.0 + date-fns: 2.30.0 + debug: 4.3.7(supports-color@8.1.1) + eciesjs: 0.3.18 + eventemitter2: 6.4.9 + readable-stream: 3.6.2 + socket.io-client: 4.7.4(bufferutil@4.0.8)(utf-8-validate@5.0.10) + utf-8-validate: 5.0.10 + uuid: 8.3.2 + transitivePeerDependencies: + - supports-color + + '@metamask/sdk-install-modal-web@0.14.1(@types/react@18.3.5)(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))': + dependencies: + '@emotion/react': 11.11.3(@types/react@18.3.5)(react@18.2.0) + '@emotion/styled': 11.11.0(@emotion/react@11.11.3(@types/react@18.3.5)(react@18.2.0))(@types/react@18.3.5)(react@18.2.0) + i18next: 22.5.1 qr-code-styling: 1.6.0-rc.1 - react-i18next: 13.5.0(i18next@22.5.1)(react-dom@18.3.1(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.3.2)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1) - optionalDependencies: - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - react-native: 0.74.1(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.3.2)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-i18next: 13.5.0(i18next@22.5.1)(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))(react@18.2.0) + transitivePeerDependencies: + - '@types/react' + - react-native - '@metamask/sdk-install-modal-web@0.20.2(i18next@22.5.1)(react-dom@18.3.1(react@18.3.1))(react-i18next@13.5.0(i18next@22.5.1)(react-dom@18.3.1(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.3.2)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.3.2)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1)': + '@metamask/sdk-install-modal-web@0.20.2(i18next@22.5.1)(react-dom@18.2.0(react@18.2.0))(react-i18next@13.5.0(i18next@22.5.1)(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))(react@18.2.0))(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))(react@18.2.0)': dependencies: i18next: 22.5.1 qr-code-styling: 1.6.0-rc.1 - react-i18next: 13.5.0(i18next@22.5.1)(react-dom@18.3.1(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.3.2)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1) + react-i18next: 13.5.0(i18next@22.5.1)(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))(react@18.2.0) optionalDependencies: - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - react-native: 0.74.1(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.3.2)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-native: 0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10) + + '@metamask/sdk-install-modal-web@0.28.1(i18next@23.11.5)(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))(react@18.2.0)': + dependencies: + i18next: 23.11.5 + qr-code-styling: 1.6.0-rc.1 + optionalDependencies: + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-native: 0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10) + + '@metamask/sdk@0.14.3(@types/react@18.3.5)(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))(react@18.2.0)(rollup@4.21.3)(utf-8-validate@5.0.10)': + dependencies: + '@metamask/onboarding': 1.0.1 + '@metamask/post-message-stream': 6.2.0 + '@metamask/providers': 10.2.1 + '@metamask/sdk-communication-layer': 0.14.3(encoding@0.1.13) + '@metamask/sdk-install-modal-web': 0.14.1(@types/react@18.3.5)(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)) + '@react-native-async-storage/async-storage': 1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)) + '@types/dom-screen-wake-lock': 1.0.3 + bowser: 2.11.0 + cross-fetch: 4.0.0(encoding@0.1.13) + eciesjs: 0.3.18 + eth-rpc-errors: 4.0.3 + eventemitter2: 6.4.9 + extension-port-stream: 2.1.1 + i18next: 22.5.1 + i18next-browser-languagedetector: 7.2.0 + obj-multiplex: 1.0.0 + pump: 3.0.0 + qrcode-terminal-nooctal: 0.12.1 + react-i18next: 13.5.0(i18next@22.5.1)(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))(react@18.2.0) + react-native-webview: 11.26.1(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))(react@18.2.0) + readable-stream: 2.3.8 + rollup-plugin-visualizer: 5.12.0(rollup@4.21.3) + socket.io-client: 4.7.4(bufferutil@4.0.8)(utf-8-validate@5.0.10) + util: 0.12.5 + uuid: 8.3.2 + optionalDependencies: + react: 18.2.0 + react-native: 0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - '@types/react' + - bufferutil + - encoding + - react-dom + - rollup + - supports-color + - utf-8-validate - '@metamask/sdk@0.18.6(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react-i18next@13.5.0(i18next@22.5.1)(react-dom@18.3.1(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.3.2)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.3.2)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1)(rollup@4.17.2)(utf-8-validate@6.0.3)': + '@metamask/sdk@0.20.3(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react-i18next@13.5.0(i18next@22.5.1)(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))(react@18.2.0))(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))(react@18.2.0)(rollup@4.21.3)(utf-8-validate@5.0.10)': dependencies: '@metamask/onboarding': 1.0.1 '@metamask/providers': 15.0.0 - '@metamask/sdk-communication-layer': 0.18.5(cross-fetch@4.0.0(encoding@0.1.13))(eciesjs@0.3.18)(eventemitter2@6.4.9)(readable-stream@3.6.2)(socket.io-client@4.7.5(bufferutil@4.0.8)(utf-8-validate@6.0.3)) - '@metamask/sdk-install-modal-web': 0.18.5(i18next@22.5.1)(react-dom@18.3.1(react@18.3.1))(react-i18next@13.5.0(i18next@22.5.1)(react-dom@18.3.1(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.3.2)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.3.2)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1) + '@metamask/sdk-communication-layer': 0.20.2(cross-fetch@4.0.0(encoding@0.1.13))(eciesjs@0.3.18)(eventemitter2@6.4.9)(readable-stream@3.6.2)(socket.io-client@4.7.4(bufferutil@4.0.8)(utf-8-validate@5.0.10)) + '@metamask/sdk-install-modal-web': 0.20.2(i18next@22.5.1)(react-dom@18.2.0(react@18.2.0))(react-i18next@13.5.0(i18next@22.5.1)(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))(react@18.2.0))(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))(react@18.2.0) '@types/dom-screen-wake-lock': 1.0.3 bowser: 2.11.0 cross-fetch: 4.0.0(encoding@0.1.13) @@ -14092,55 +16532,55 @@ snapshots: obj-multiplex: 1.0.0 pump: 3.0.0 qrcode-terminal-nooctal: 0.12.1 - react-native-webview: 11.26.1(react-native@0.74.1(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.3.2)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1) + react-native-webview: 11.26.1(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))(react@18.2.0) readable-stream: 3.6.2 - rollup-plugin-visualizer: 5.12.0(rollup@4.17.2) - socket.io-client: 4.7.5(bufferutil@4.0.8)(utf-8-validate@6.0.3) + rollup-plugin-visualizer: 5.12.0(rollup@4.21.3) + socket.io-client: 4.7.4(bufferutil@4.0.8)(utf-8-validate@5.0.10) util: 0.12.5 uuid: 8.3.2 optionalDependencies: - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - react-native: 0.74.1(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.3.2)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) transitivePeerDependencies: - bufferutil - encoding - react-i18next + - react-native - rollup - supports-color - utf-8-validate - '@metamask/sdk@0.20.3(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react-i18next@13.5.0(i18next@22.5.1)(react-dom@18.3.1(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.3.2)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.3.2)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1)(rollup@4.17.2)(utf-8-validate@6.0.3)': + '@metamask/sdk@0.28.2(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))(react@18.2.0)(rollup@4.21.3)(utf-8-validate@5.0.10)': dependencies: '@metamask/onboarding': 1.0.1 - '@metamask/providers': 15.0.0 - '@metamask/sdk-communication-layer': 0.20.2(cross-fetch@4.0.0(encoding@0.1.13))(eciesjs@0.3.18)(eventemitter2@6.4.9)(readable-stream@3.6.2)(socket.io-client@4.7.5(bufferutil@4.0.8)(utf-8-validate@6.0.3)) - '@metamask/sdk-install-modal-web': 0.20.2(i18next@22.5.1)(react-dom@18.3.1(react@18.3.1))(react-i18next@13.5.0(i18next@22.5.1)(react-dom@18.3.1(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.3.2)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.3.2)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1) + '@metamask/providers': 16.1.0 + '@metamask/sdk-communication-layer': 0.28.2(cross-fetch@4.0.0(encoding@0.1.13))(eciesjs@0.3.18)(eventemitter2@6.4.9)(readable-stream@3.6.2)(socket.io-client@4.7.4(bufferutil@4.0.8)(utf-8-validate@5.0.10)) + '@metamask/sdk-install-modal-web': 0.28.1(i18next@23.11.5)(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))(react@18.2.0) '@types/dom-screen-wake-lock': 1.0.3 + '@types/uuid': 10.0.0 bowser: 2.11.0 cross-fetch: 4.0.0(encoding@0.1.13) debug: 4.3.4 eciesjs: 0.3.18 eth-rpc-errors: 4.0.3 eventemitter2: 6.4.9 - i18next: 22.5.1 + i18next: 23.11.5 i18next-browser-languagedetector: 7.1.0 obj-multiplex: 1.0.0 pump: 3.0.0 qrcode-terminal-nooctal: 0.12.1 - react-native-webview: 11.26.1(react-native@0.74.1(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.3.2)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1) + react-native-webview: 11.26.1(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))(react@18.2.0) readable-stream: 3.6.2 - rollup-plugin-visualizer: 5.12.0(rollup@4.17.2) - socket.io-client: 4.7.5(bufferutil@4.0.8)(utf-8-validate@6.0.3) + rollup-plugin-visualizer: 5.12.0(rollup@4.21.3) + socket.io-client: 4.7.4(bufferutil@4.0.8)(utf-8-validate@5.0.10) util: 0.12.5 uuid: 8.3.2 optionalDependencies: - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) transitivePeerDependencies: - bufferutil - encoding - - react-i18next - react-native - rollup - supports-color @@ -14150,182 +16590,181 @@ snapshots: dependencies: '@ethereumjs/tx': 4.2.0 '@types/debug': 4.1.12 - debug: 4.3.4 - semver: 7.6.2 - superstruct: 1.0.4 + debug: 4.3.7(supports-color@8.1.1) + semver: 7.6.3 + superstruct: 1.0.3 transitivePeerDependencies: - supports-color - '@metamask/utils@8.4.0': + '@metamask/utils@8.3.0': dependencies: '@ethereumjs/tx': 4.2.0 - '@noble/hashes': 1.4.0 - '@scure/base': 1.1.6 + '@noble/hashes': 1.5.0 + '@scure/base': 1.1.8 '@types/debug': 4.1.12 - debug: 4.3.4 - pony-cause: 2.1.11 - semver: 7.6.2 - superstruct: 1.0.4 - uuid: 9.0.1 + debug: 4.3.7(supports-color@8.1.1) + pony-cause: 2.1.10 + semver: 7.6.3 + superstruct: 1.0.3 transitivePeerDependencies: - supports-color - '@moralisweb3/api-utils@2.26.1(debug@4.3.4)': + '@moralisweb3/api-utils@2.26.2(debug@4.3.4)': dependencies: - '@moralisweb3/common-core': 2.26.1(debug@4.3.4) - '@moralisweb3/common-evm-utils': 2.26.1(debug@4.3.4) - axios: 1.6.8(debug@4.3.4) + '@moralisweb3/common-core': 2.26.2(debug@4.3.4) + '@moralisweb3/common-evm-utils': 2.26.2(debug@4.3.4) + axios: 1.6.7(debug@4.3.4) transitivePeerDependencies: - debug - '@moralisweb3/aptos-api@2.26.1(debug@4.3.4)': + '@moralisweb3/aptos-api@2.26.2(debug@4.3.4)': dependencies: - '@moralisweb3/api-utils': 2.26.1(debug@4.3.4) - '@moralisweb3/common-aptos-utils': 2.26.1(debug@4.3.4) - '@moralisweb3/common-core': 2.26.1(debug@4.3.4) + '@moralisweb3/api-utils': 2.26.2(debug@4.3.4) + '@moralisweb3/common-aptos-utils': 2.26.2(debug@4.3.4) + '@moralisweb3/common-core': 2.26.2(debug@4.3.4) transitivePeerDependencies: - debug - '@moralisweb3/auth@2.26.1(debug@4.3.4)': + '@moralisweb3/auth@2.26.2(debug@4.3.4)': dependencies: - '@moralisweb3/api-utils': 2.26.1(debug@4.3.4) - '@moralisweb3/common-aptos-utils': 2.26.1(debug@4.3.4) - '@moralisweb3/common-auth-utils': 2.26.1(debug@4.3.4) - '@moralisweb3/common-core': 2.26.1(debug@4.3.4) - '@moralisweb3/common-evm-utils': 2.26.1(debug@4.3.4) - '@moralisweb3/common-sol-utils': 2.26.1(debug@4.3.4) + '@moralisweb3/api-utils': 2.26.2(debug@4.3.4) + '@moralisweb3/common-aptos-utils': 2.26.2(debug@4.3.4) + '@moralisweb3/common-auth-utils': 2.26.2(debug@4.3.4) + '@moralisweb3/common-core': 2.26.2(debug@4.3.4) + '@moralisweb3/common-evm-utils': 2.26.2(debug@4.3.4) + '@moralisweb3/common-sol-utils': 2.26.2(debug@4.3.4) transitivePeerDependencies: - debug - '@moralisweb3/common-aptos-utils@2.26.1(debug@4.3.4)': + '@moralisweb3/common-aptos-utils@2.26.2(debug@4.3.4)': dependencies: - '@moralisweb3/common-core': 2.26.1(debug@4.3.4) - '@noble/hashes': 1.4.0 + '@moralisweb3/common-core': 2.26.2(debug@4.3.4) + '@noble/hashes': 1.3.3 transitivePeerDependencies: - debug - '@moralisweb3/common-auth-utils@2.26.1(debug@4.3.4)': + '@moralisweb3/common-auth-utils@2.26.2(debug@4.3.4)': dependencies: '@ethersproject/abi': 5.7.0 - '@moralisweb3/common-aptos-utils': 2.26.1(debug@4.3.4) - '@moralisweb3/common-core': 2.26.1(debug@4.3.4) - '@moralisweb3/common-evm-utils': 2.26.1(debug@4.3.4) - '@moralisweb3/common-sol-utils': 2.26.1(debug@4.3.4) + '@moralisweb3/common-aptos-utils': 2.26.2(debug@4.3.4) + '@moralisweb3/common-core': 2.26.2(debug@4.3.4) + '@moralisweb3/common-evm-utils': 2.26.2(debug@4.3.4) + '@moralisweb3/common-sol-utils': 2.26.2(debug@4.3.4) '@moralisweb3/streams-typings': 1.0.7 transitivePeerDependencies: - debug - '@moralisweb3/common-core@2.26.1(debug@4.3.4)': + '@moralisweb3/common-core@2.26.2(debug@4.3.4)': dependencies: - axios: 1.6.8(debug@4.3.4) + axios: 1.6.7(debug@4.3.4) transitivePeerDependencies: - debug - '@moralisweb3/common-evm-utils@2.26.1(debug@4.3.4)': + '@moralisweb3/common-evm-utils@2.26.2(debug@4.3.4)': dependencies: '@ethersproject/address': 5.7.0 '@ethersproject/bytes': 5.7.0 '@ethersproject/transactions': 5.7.0 - '@moralisweb3/common-core': 2.26.1(debug@4.3.4) + '@moralisweb3/common-core': 2.26.2(debug@4.3.4) transitivePeerDependencies: - debug - '@moralisweb3/common-sol-utils@2.26.1(debug@4.3.4)': + '@moralisweb3/common-sol-utils@2.26.2(debug@4.3.4)': dependencies: - '@moralisweb3/common-core': 2.26.1(debug@4.3.4) + '@moralisweb3/common-core': 2.26.2(debug@4.3.4) bn.js: 5.2.1 bs58: 5.0.0 buffer: 6.0.3 transitivePeerDependencies: - debug - '@moralisweb3/common-streams-utils@2.26.1(debug@4.3.4)': + '@moralisweb3/common-streams-utils@2.26.2(debug@4.3.4)': dependencies: '@ethersproject/abi': 5.7.0 - '@moralisweb3/common-aptos-utils': 2.26.1(debug@4.3.4) - '@moralisweb3/common-core': 2.26.1(debug@4.3.4) - '@moralisweb3/common-evm-utils': 2.26.1(debug@4.3.4) + '@moralisweb3/common-aptos-utils': 2.26.2(debug@4.3.4) + '@moralisweb3/common-core': 2.26.2(debug@4.3.4) + '@moralisweb3/common-evm-utils': 2.26.2(debug@4.3.4) '@moralisweb3/streams-typings': 1.0.7 transitivePeerDependencies: - debug - '@moralisweb3/evm-api@2.26.1(debug@4.3.4)': + '@moralisweb3/evm-api@2.26.2(debug@4.3.4)': dependencies: - '@moralisweb3/api-utils': 2.26.1(debug@4.3.4) - '@moralisweb3/common-core': 2.26.1(debug@4.3.4) - '@moralisweb3/common-evm-utils': 2.26.1(debug@4.3.4) + '@moralisweb3/api-utils': 2.26.2(debug@4.3.4) + '@moralisweb3/common-core': 2.26.2(debug@4.3.4) + '@moralisweb3/common-evm-utils': 2.26.2(debug@4.3.4) transitivePeerDependencies: - debug - '@moralisweb3/sol-api@2.26.1(debug@4.3.4)': + '@moralisweb3/sol-api@2.26.2(debug@4.3.4)': dependencies: - '@moralisweb3/api-utils': 2.26.1(debug@4.3.4) - '@moralisweb3/common-core': 2.26.1(debug@4.3.4) - '@moralisweb3/common-sol-utils': 2.26.1(debug@4.3.4) + '@moralisweb3/api-utils': 2.26.2(debug@4.3.4) + '@moralisweb3/common-core': 2.26.2(debug@4.3.4) + '@moralisweb3/common-sol-utils': 2.26.2(debug@4.3.4) transitivePeerDependencies: - debug '@moralisweb3/streams-typings@1.0.7': {} - '@moralisweb3/streams@2.26.1(debug@4.3.4)': + '@moralisweb3/streams@2.26.2(debug@4.3.4)': dependencies: '@ethersproject/abi': 5.7.0 '@ethersproject/bignumber': 5.7.0 '@ethersproject/sha2': 5.7.0 '@ethersproject/strings': 5.7.0 - '@moralisweb3/api-utils': 2.26.1(debug@4.3.4) - '@moralisweb3/common-core': 2.26.1(debug@4.3.4) - '@moralisweb3/common-evm-utils': 2.26.1(debug@4.3.4) - '@moralisweb3/common-streams-utils': 2.26.1(debug@4.3.4) + '@moralisweb3/api-utils': 2.26.2(debug@4.3.4) + '@moralisweb3/common-core': 2.26.2(debug@4.3.4) + '@moralisweb3/common-evm-utils': 2.26.2(debug@4.3.4) + '@moralisweb3/common-streams-utils': 2.26.2(debug@4.3.4) '@moralisweb3/streams-typings': 1.0.7 ethereumjs-util: 7.1.5 web3-eth-abi: 1.10.4 transitivePeerDependencies: - debug - '@motionone/animation@10.17.0': + '@motionone/animation@10.16.3': dependencies: - '@motionone/easing': 10.17.0 - '@motionone/types': 10.17.0 - '@motionone/utils': 10.17.0 + '@motionone/easing': 10.16.3 + '@motionone/types': 10.16.3 + '@motionone/utils': 10.16.3 tslib: 2.6.2 - '@motionone/dom@10.17.0': + '@motionone/dom@10.16.4': dependencies: - '@motionone/animation': 10.17.0 - '@motionone/generators': 10.17.0 - '@motionone/types': 10.17.0 - '@motionone/utils': 10.17.0 + '@motionone/animation': 10.16.3 + '@motionone/generators': 10.16.4 + '@motionone/types': 10.16.3 + '@motionone/utils': 10.16.3 hey-listen: 1.0.8 - tslib: 2.6.2 + tslib: 2.6.3 - '@motionone/easing@10.17.0': + '@motionone/easing@10.16.3': dependencies: - '@motionone/utils': 10.17.0 + '@motionone/utils': 10.16.3 tslib: 2.6.2 - '@motionone/generators@10.17.0': + '@motionone/generators@10.16.4': dependencies: - '@motionone/types': 10.17.0 - '@motionone/utils': 10.17.0 + '@motionone/types': 10.16.3 + '@motionone/utils': 10.16.3 tslib: 2.6.2 '@motionone/svelte@10.16.4': dependencies: - '@motionone/dom': 10.17.0 + '@motionone/dom': 10.16.4 tslib: 2.6.2 - '@motionone/types@10.17.0': {} + '@motionone/types@10.16.3': {} - '@motionone/utils@10.17.0': + '@motionone/utils@10.16.3': dependencies: - '@motionone/types': 10.17.0 + '@motionone/types': 10.16.3 hey-listen: 1.0.8 - tslib: 2.6.2 + tslib: 2.6.3 '@motionone/vue@10.16.4': dependencies: - '@motionone/dom': 10.17.0 + '@motionone/dom': 10.16.4 tslib: 2.6.2 '@multiformats/dns@1.0.6': @@ -14336,11 +16775,11 @@ snapshots: hashlru: 2.3.0 p-queue: 8.0.1 progress-events: 1.0.0 - uint8arrays: 5.0.3 + uint8arrays: 5.1.0 '@multiformats/multiaddr-to-uri@9.0.8': dependencies: - '@multiformats/multiaddr': 12.2.1 + '@multiformats/multiaddr': 12.3.0 '@multiformats/multiaddr@11.6.1': dependencies: @@ -14353,38 +16792,40 @@ snapshots: transitivePeerDependencies: - supports-color - '@multiformats/multiaddr@12.2.1': + '@multiformats/multiaddr@12.3.0': dependencies: '@chainsafe/is-ip': 2.0.2 '@chainsafe/netmask': 2.0.0 - '@libp2p/interface': 1.3.1 + '@libp2p/interface': 1.3.0 '@multiformats/dns': 1.0.6 - multiformats: 13.1.0 + multiformats: 13.1.3 uint8-varint: 2.0.4 - uint8arrays: 5.0.3 - - '@ndelangen/get-tarball@3.0.9': - dependencies: - gunzip-maybe: 1.4.2 - pump: 3.0.0 - tar-fs: 2.1.1 + uint8arrays: 5.1.0 '@noble/curves@1.2.0': dependencies: '@noble/hashes': 1.3.2 - '@noble/curves@1.3.0': + '@noble/curves@1.4.0': dependencies: - '@noble/hashes': 1.3.3 + '@noble/hashes': 1.4.0 + + '@noble/curves@1.4.2': + dependencies: + '@noble/hashes': 1.4.0 + + '@noble/curves@1.4.0': + dependencies: + '@noble/hashes': 1.4.0 '@noble/hashes@1.2.0': {} '@noble/hashes@1.3.2': {} - '@noble/hashes@1.3.3': {} - '@noble/hashes@1.4.0': {} + '@noble/hashes@1.5.0': {} + '@noble/secp256k1@1.7.1': {} '@nodelib/fs.scandir@2.1.5': @@ -14399,6 +16840,81 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.17.1 + '@nomicfoundation/edr-darwin-arm64@0.6.3': {} + + '@nomicfoundation/edr-darwin-x64@0.6.3': {} + + '@nomicfoundation/edr-linux-arm64-gnu@0.6.3': {} + + '@nomicfoundation/edr-linux-arm64-musl@0.6.3': {} + + '@nomicfoundation/edr-linux-x64-gnu@0.6.3': {} + + '@nomicfoundation/edr-linux-x64-musl@0.6.3': {} + + '@nomicfoundation/edr-win32-x64-msvc@0.6.3': {} + + '@nomicfoundation/edr@0.6.3': + dependencies: + '@nomicfoundation/edr-darwin-arm64': 0.6.3 + '@nomicfoundation/edr-darwin-x64': 0.6.3 + '@nomicfoundation/edr-linux-arm64-gnu': 0.6.3 + '@nomicfoundation/edr-linux-arm64-musl': 0.6.3 + '@nomicfoundation/edr-linux-x64-gnu': 0.6.3 + '@nomicfoundation/edr-linux-x64-musl': 0.6.3 + '@nomicfoundation/edr-win32-x64-msvc': 0.6.3 + + '@nomicfoundation/ethereumjs-common@4.0.4': + dependencies: + '@nomicfoundation/ethereumjs-util': 9.0.4 + transitivePeerDependencies: + - c-kzg + + '@nomicfoundation/ethereumjs-rlp@5.0.4': {} + + '@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/solidity-analyzer-darwin-arm64@0.1.2': + optional: true + + '@nomicfoundation/solidity-analyzer-darwin-x64@0.1.2': + optional: true + + '@nomicfoundation/solidity-analyzer-linux-arm64-gnu@0.1.2': + optional: true + + '@nomicfoundation/solidity-analyzer-linux-arm64-musl@0.1.2': + optional: true + + '@nomicfoundation/solidity-analyzer-linux-x64-gnu@0.1.2': + optional: true + + '@nomicfoundation/solidity-analyzer-linux-x64-musl@0.1.2': + optional: true + + '@nomicfoundation/solidity-analyzer-win32-x64-msvc@0.1.2': + optional: true + + '@nomicfoundation/solidity-analyzer@0.1.2': + optionalDependencies: + '@nomicfoundation/solidity-analyzer-darwin-arm64': 0.1.2 + '@nomicfoundation/solidity-analyzer-darwin-x64': 0.1.2 + '@nomicfoundation/solidity-analyzer-linux-arm64-gnu': 0.1.2 + '@nomicfoundation/solidity-analyzer-linux-arm64-musl': 0.1.2 + '@nomicfoundation/solidity-analyzer-linux-x64-gnu': 0.1.2 + '@nomicfoundation/solidity-analyzer-linux-x64-musl': 0.1.2 + '@nomicfoundation/solidity-analyzer-win32-x64-msvc': 0.1.2 + '@openzeppelin/contracts-upgradeable@4.9.6': {} '@openzeppelin/contracts-upgradeable@5.0.2(@openzeppelin/contracts@5.0.2)': @@ -14409,11 +16925,174 @@ snapshots: '@openzeppelin/contracts@5.0.2': {} + '@openzeppelin/defender-as-code@3.0.1(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)(web3-core-helpers@1.10.4)(web3-core@1.10.4(encoding@0.1.13))(web3-utils@1.10.4)(web3@1.10.4(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))': + dependencies: + '@openzeppelin/defender-sdk': 1.14.4(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)(web3-core-helpers@1.10.4)(web3-core@1.10.4(encoding@0.1.13))(web3-utils@1.10.4)(web3@1.10.4(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)) + keccak256: 1.0.6 + lodash: 4.17.21 + prompt: 1.3.0 + transitivePeerDependencies: + - bufferutil + - debug + - encoding + - utf-8-validate + - web3 + - web3-core + - web3-core-helpers + - web3-utils + + '@openzeppelin/defender-sdk-account-client@1.14.4(encoding@0.1.13)': + dependencies: + '@openzeppelin/defender-sdk-base-client': 1.14.4(encoding@0.1.13) + axios: 1.7.7 + lodash: 4.17.21 + transitivePeerDependencies: + - debug + - encoding + + '@openzeppelin/defender-sdk-action-client@1.14.4(encoding@0.1.13)': + dependencies: + '@openzeppelin/defender-sdk-base-client': 1.14.4(encoding@0.1.13) + axios: 1.7.7 + dotenv: 16.4.5 + glob: 11.0.0 + jszip: 3.10.1 + lodash: 4.17.21 + transitivePeerDependencies: + - debug + - encoding + + '@openzeppelin/defender-sdk-base-client@1.14.4(encoding@0.1.13)': + dependencies: + amazon-cognito-identity-js: 6.3.12(encoding@0.1.13) + async-retry: 1.3.3 + transitivePeerDependencies: + - encoding + + '@openzeppelin/defender-sdk-deploy-client@1.14.4(encoding@0.1.13)': + dependencies: + '@openzeppelin/defender-sdk-base-client': 1.14.4(encoding@0.1.13) + axios: 1.7.7 + lodash: 4.17.21 + transitivePeerDependencies: + - debug + - encoding + + '@openzeppelin/defender-sdk-key-value-store-client@1.14.4(encoding@0.1.13)': + dependencies: + '@openzeppelin/defender-sdk-base-client': 1.14.4(encoding@0.1.13) + axios: 1.7.7 + fs-extra: 11.2.0 + lodash: 4.17.21 + transitivePeerDependencies: + - debug + - encoding + + '@openzeppelin/defender-sdk-monitor-client@1.14.4(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)': + dependencies: + '@openzeppelin/defender-sdk-base-client': 1.14.4(encoding@0.1.13) + axios: 1.7.7 + ethers: 6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) + lodash: 4.17.21 + transitivePeerDependencies: + - bufferutil + - debug + - encoding + - utf-8-validate + + '@openzeppelin/defender-sdk-network-client@1.14.4(encoding@0.1.13)': + dependencies: + '@openzeppelin/defender-sdk-base-client': 1.14.4(encoding@0.1.13) + axios: 1.7.7 + lodash: 4.17.21 + transitivePeerDependencies: + - debug + - encoding + + '@openzeppelin/defender-sdk-notification-channel-client@1.14.4(encoding@0.1.13)': + dependencies: + '@openzeppelin/defender-sdk-base-client': 1.14.4(encoding@0.1.13) + axios: 1.7.7 + lodash: 4.17.21 + transitivePeerDependencies: + - debug + - encoding + + '@openzeppelin/defender-sdk-proposal-client@1.14.4(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)': + dependencies: + '@openzeppelin/defender-sdk-base-client': 1.14.4(encoding@0.1.13) + axios: 1.7.7 + ethers: 6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) + lodash: 4.17.21 + transitivePeerDependencies: + - bufferutil + - debug + - encoding + - utf-8-validate + + '@openzeppelin/defender-sdk-relay-client@1.14.4(encoding@0.1.13)': + dependencies: + '@openzeppelin/defender-sdk-base-client': 1.14.4(encoding@0.1.13) + axios: 1.7.7 + lodash: 4.17.21 + transitivePeerDependencies: + - debug + - encoding + + '@openzeppelin/defender-sdk-relay-signer-client@1.14.4(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)(web3-core-helpers@1.10.4)(web3-core@1.10.4(encoding@0.1.13))(web3-utils@1.10.4)(web3@1.10.4(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))': + 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/providers': 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@ethersproject/strings': 5.7.0 + '@openzeppelin/defender-sdk-base-client': 1.14.4(encoding@0.1.13) + amazon-cognito-identity-js: 6.3.12(encoding@0.1.13) + axios: 1.7.7 + ethers: 6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) + lodash: 4.17.21 + web3: 1.10.4(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) + web3-core: 1.10.4(encoding@0.1.13) + web3-core-helpers: 1.10.4 + web3-utils: 1.10.4 + transitivePeerDependencies: + - bufferutil + - debug + - encoding + - utf-8-validate + + '@openzeppelin/defender-sdk@1.14.4(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)(web3-core-helpers@1.10.4)(web3-core@1.10.4(encoding@0.1.13))(web3-utils@1.10.4)(web3@1.10.4(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))': + dependencies: + '@openzeppelin/defender-sdk-account-client': 1.14.4(encoding@0.1.13) + '@openzeppelin/defender-sdk-action-client': 1.14.4(encoding@0.1.13) + '@openzeppelin/defender-sdk-base-client': 1.14.4(encoding@0.1.13) + '@openzeppelin/defender-sdk-deploy-client': 1.14.4(encoding@0.1.13) + '@openzeppelin/defender-sdk-key-value-store-client': 1.14.4(encoding@0.1.13) + '@openzeppelin/defender-sdk-monitor-client': 1.14.4(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) + '@openzeppelin/defender-sdk-network-client': 1.14.4(encoding@0.1.13) + '@openzeppelin/defender-sdk-notification-channel-client': 1.14.4(encoding@0.1.13) + '@openzeppelin/defender-sdk-proposal-client': 1.14.4(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) + '@openzeppelin/defender-sdk-relay-client': 1.14.4(encoding@0.1.13) + '@openzeppelin/defender-sdk-relay-signer-client': 1.14.4(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)(web3-core-helpers@1.10.4)(web3-core@1.10.4(encoding@0.1.13))(web3-utils@1.10.4)(web3@1.10.4(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)) + transitivePeerDependencies: + - bufferutil + - debug + - encoding + - utf-8-validate + - web3 + - web3-core + - web3-core-helpers + - web3-utils + '@openzeppelin/merkle-tree@1.0.6': dependencies: '@ethersproject/abi': 5.7.0 ethereum-cryptography: 1.2.0 + '@oslojs/encoding@0.4.1': {} + '@pagefind/darwin-arm64@1.1.0': optional: true @@ -14431,75 +17110,82 @@ snapshots: '@pagefind/windows-x64@1.1.0': optional: true - '@parcel/watcher-android-arm64@2.4.1': + '@parcel/watcher-android-arm64@2.4.0': optional: true - '@parcel/watcher-darwin-arm64@2.4.1': + '@parcel/watcher-darwin-arm64@2.4.0': optional: true - '@parcel/watcher-darwin-x64@2.4.1': + '@parcel/watcher-darwin-x64@2.4.0': optional: true - '@parcel/watcher-freebsd-x64@2.4.1': + '@parcel/watcher-freebsd-x64@2.4.0': optional: true - '@parcel/watcher-linux-arm-glibc@2.4.1': + '@parcel/watcher-linux-arm-glibc@2.4.0': optional: true - '@parcel/watcher-linux-arm64-glibc@2.4.1': + '@parcel/watcher-linux-arm64-glibc@2.4.0': optional: true - '@parcel/watcher-linux-arm64-musl@2.4.1': + '@parcel/watcher-linux-arm64-musl@2.4.0': optional: true - '@parcel/watcher-linux-x64-glibc@2.4.1': + '@parcel/watcher-linux-x64-glibc@2.4.0': optional: true - '@parcel/watcher-linux-x64-musl@2.4.1': + '@parcel/watcher-linux-x64-musl@2.4.0': optional: true - '@parcel/watcher-wasm@2.4.1': + '@parcel/watcher-wasm@2.4.0': dependencies: is-glob: 4.0.3 - micromatch: 4.0.5 + micromatch: 4.0.7 - '@parcel/watcher-win32-arm64@2.4.1': + '@parcel/watcher-win32-arm64@2.4.0': optional: true - '@parcel/watcher-win32-ia32@2.4.1': + '@parcel/watcher-win32-ia32@2.4.0': optional: true - '@parcel/watcher-win32-x64@2.4.1': + '@parcel/watcher-win32-x64@2.4.0': optional: true - '@parcel/watcher@2.4.1': + '@parcel/watcher@2.4.0': dependencies: detect-libc: 1.0.3 is-glob: 4.0.3 - micromatch: 4.0.5 + micromatch: 4.0.7 node-addon-api: 7.1.0 optionalDependencies: - '@parcel/watcher-android-arm64': 2.4.1 - '@parcel/watcher-darwin-arm64': 2.4.1 - '@parcel/watcher-darwin-x64': 2.4.1 - '@parcel/watcher-freebsd-x64': 2.4.1 - '@parcel/watcher-linux-arm-glibc': 2.4.1 - '@parcel/watcher-linux-arm64-glibc': 2.4.1 - '@parcel/watcher-linux-arm64-musl': 2.4.1 - '@parcel/watcher-linux-x64-glibc': 2.4.1 - '@parcel/watcher-linux-x64-musl': 2.4.1 - '@parcel/watcher-win32-arm64': 2.4.1 - '@parcel/watcher-win32-ia32': 2.4.1 - '@parcel/watcher-win32-x64': 2.4.1 + '@parcel/watcher-android-arm64': 2.4.0 + '@parcel/watcher-darwin-arm64': 2.4.0 + '@parcel/watcher-darwin-x64': 2.4.0 + '@parcel/watcher-freebsd-x64': 2.4.0 + '@parcel/watcher-linux-arm-glibc': 2.4.0 + '@parcel/watcher-linux-arm64-glibc': 2.4.0 + '@parcel/watcher-linux-arm64-musl': 2.4.0 + '@parcel/watcher-linux-x64-glibc': 2.4.0 + '@parcel/watcher-linux-x64-musl': 2.4.0 + '@parcel/watcher-win32-arm64': 2.4.0 + '@parcel/watcher-win32-ia32': 2.4.0 + '@parcel/watcher-win32-x64': 2.4.0 '@pkgjs/parseargs@0.11.0': optional: true - '@pkgr/core@0.1.1': {} + '@pkgr/utils@2.4.2': + dependencies: + cross-spawn: 7.0.3 + fast-glob: 3.3.2 + is-glob: 4.0.3 + open: 9.1.0 + picocolors: 1.0.0 + tslib: 2.6.2 - '@playwright/test@1.44.0': + '@playwright/test@1.43.1': dependencies: - playwright: 1.44.0 + playwright: 1.43.1 '@pnpm/config.env-replace@1.1.0': {} @@ -14513,7 +17199,7 @@ snapshots: '@pnpm/network.ca-file': 1.0.2 config-chain: 1.1.13 - '@polka/url@1.0.0-next.25': {} + '@polka/url@1.0.0-next.24': {} '@protobufjs/aspromise@1.1.2': {} @@ -14538,283 +17224,139 @@ snapshots: '@protobufjs/utf8@1.1.0': {} - '@radix-ui/primitive@1.0.1': - dependencies: - '@babel/runtime': 7.24.5 - - '@radix-ui/react-compose-refs@1.0.1(@types/react@18.3.2)(react@18.3.1)': + '@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))': dependencies: - '@babel/runtime': 7.24.5 - react: 18.3.1 - optionalDependencies: - '@types/react': 18.3.2 + merge-options: 3.0.4 + react-native: 0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10) - '@radix-ui/react-context@1.0.1(@types/react@18.3.2)(react@18.3.1)': + '@react-native-community/cli-clean@12.3.2(encoding@0.1.13)': dependencies: - '@babel/runtime': 7.24.5 - react: 18.3.1 - optionalDependencies: - '@types/react': 18.3.2 - - '@radix-ui/react-dialog@1.0.5(@types/react@18.3.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@babel/runtime': 7.24.5 - '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.2)(react@18.3.1) - '@radix-ui/react-context': 1.0.1(@types/react@18.3.2)(react@18.3.1) - '@radix-ui/react-dismissable-layer': 1.0.5(@types/react@18.3.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.3.2)(react@18.3.1) - '@radix-ui/react-focus-scope': 1.0.4(@types/react@18.3.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-id': 1.0.1(@types/react@18.3.2)(react@18.3.1) - '@radix-ui/react-portal': 1.0.4(@types/react@18.3.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-presence': 1.0.1(@types/react@18.3.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 1.0.3(@types/react@18.3.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-slot': 1.0.2(@types/react@18.3.2)(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.3.2)(react@18.3.1) - aria-hidden: 1.2.4 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - react-remove-scroll: 2.5.5(@types/react@18.3.2)(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.2 + '@react-native-community/cli-tools': 12.3.2(encoding@0.1.13) + chalk: 4.1.2 + execa: 5.1.1 + transitivePeerDependencies: + - encoding - '@radix-ui/react-dismissable-layer@1.0.5(@types/react@18.3.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@react-native-community/cli-config@12.3.2(encoding@0.1.13)': dependencies: - '@babel/runtime': 7.24.5 - '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.2)(react@18.3.1) - '@radix-ui/react-primitive': 1.0.3(@types/react@18.3.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.2)(react@18.3.1) - '@radix-ui/react-use-escape-keydown': 1.0.3(@types/react@18.3.2)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.2 + '@react-native-community/cli-tools': 12.3.2(encoding@0.1.13) + chalk: 4.1.2 + cosmiconfig: 5.2.1 + deepmerge: 4.3.1 + glob: 7.2.3 + joi: 17.12.1 + transitivePeerDependencies: + - encoding - '@radix-ui/react-focus-guards@1.0.1(@types/react@18.3.2)(react@18.3.1)': + '@react-native-community/cli-debugger-ui@12.3.2': dependencies: - '@babel/runtime': 7.24.5 - react: 18.3.1 - optionalDependencies: - '@types/react': 18.3.2 + serve-static: 1.16.2 + transitivePeerDependencies: + - supports-color - '@radix-ui/react-focus-scope@1.0.4(@types/react@18.3.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@react-native-community/cli-doctor@12.3.2(encoding@0.1.13)': dependencies: - '@babel/runtime': 7.24.5 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.2)(react@18.3.1) - '@radix-ui/react-primitive': 1.0.3(@types/react@18.3.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.2)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.2 + '@react-native-community/cli-config': 12.3.2(encoding@0.1.13) + '@react-native-community/cli-platform-android': 12.3.2(encoding@0.1.13) + '@react-native-community/cli-platform-ios': 12.3.2(encoding@0.1.13) + '@react-native-community/cli-tools': 12.3.2(encoding@0.1.13) + chalk: 4.1.2 + command-exists: 1.2.9 + deepmerge: 4.3.1 + envinfo: 7.11.1 + execa: 5.1.1 + hermes-profile-transformer: 0.0.6 + ip: 1.1.9 + node-stream-zip: 1.15.0 + ora: 5.4.1 + semver: 7.6.3 + strip-ansi: 5.2.0 + wcwidth: 1.0.1 + yaml: 2.5.1 + transitivePeerDependencies: + - encoding - '@radix-ui/react-id@1.0.1(@types/react@18.3.2)(react@18.3.1)': + '@react-native-community/cli-hermes@12.3.2(encoding@0.1.13)': dependencies: - '@babel/runtime': 7.24.5 - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.3.2)(react@18.3.1) - react: 18.3.1 - optionalDependencies: - '@types/react': 18.3.2 - - '@radix-ui/react-portal@1.0.4(@types/react@18.3.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@babel/runtime': 7.24.5 - '@radix-ui/react-primitive': 1.0.3(@types/react@18.3.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.2 - - '@radix-ui/react-presence@1.0.1(@types/react@18.3.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@babel/runtime': 7.24.5 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.2)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.3.2)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.2 - - '@radix-ui/react-primitive@1.0.3(@types/react@18.3.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@babel/runtime': 7.24.5 - '@radix-ui/react-slot': 1.0.2(@types/react@18.3.2)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.2 - - '@radix-ui/react-slot@1.0.2(@types/react@18.3.2)(react@18.3.1)': - dependencies: - '@babel/runtime': 7.24.5 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.2)(react@18.3.1) - react: 18.3.1 - optionalDependencies: - '@types/react': 18.3.2 - - '@radix-ui/react-use-callback-ref@1.0.1(@types/react@18.3.2)(react@18.3.1)': - dependencies: - '@babel/runtime': 7.24.5 - react: 18.3.1 - optionalDependencies: - '@types/react': 18.3.2 - - '@radix-ui/react-use-controllable-state@1.0.1(@types/react@18.3.2)(react@18.3.1)': - dependencies: - '@babel/runtime': 7.24.5 - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.2)(react@18.3.1) - react: 18.3.1 - optionalDependencies: - '@types/react': 18.3.2 - - '@radix-ui/react-use-escape-keydown@1.0.3(@types/react@18.3.2)(react@18.3.1)': - dependencies: - '@babel/runtime': 7.24.5 - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.2)(react@18.3.1) - react: 18.3.1 - optionalDependencies: - '@types/react': 18.3.2 - - '@radix-ui/react-use-layout-effect@1.0.1(@types/react@18.3.2)(react@18.3.1)': - dependencies: - '@babel/runtime': 7.24.5 - react: 18.3.1 - optionalDependencies: - '@types/react': 18.3.2 - - '@react-native-community/cli-clean@13.6.6(encoding@0.1.13)': - dependencies: - '@react-native-community/cli-tools': 13.6.6(encoding@0.1.13) - chalk: 4.1.2 - execa: 5.1.1 - fast-glob: 3.3.2 - transitivePeerDependencies: - - encoding - - '@react-native-community/cli-config@13.6.6(encoding@0.1.13)': - dependencies: - '@react-native-community/cli-tools': 13.6.6(encoding@0.1.13) - chalk: 4.1.2 - cosmiconfig: 5.2.1 - deepmerge: 4.3.1 - fast-glob: 3.3.2 - joi: 17.13.1 - transitivePeerDependencies: - - encoding - - '@react-native-community/cli-debugger-ui@13.6.6': - dependencies: - serve-static: 1.15.0 - transitivePeerDependencies: - - supports-color - - '@react-native-community/cli-doctor@13.6.6(encoding@0.1.13)': - dependencies: - '@react-native-community/cli-config': 13.6.6(encoding@0.1.13) - '@react-native-community/cli-platform-android': 13.6.6(encoding@0.1.13) - '@react-native-community/cli-platform-apple': 13.6.6(encoding@0.1.13) - '@react-native-community/cli-platform-ios': 13.6.6(encoding@0.1.13) - '@react-native-community/cli-tools': 13.6.6(encoding@0.1.13) - chalk: 4.1.2 - command-exists: 1.2.9 - deepmerge: 4.3.1 - envinfo: 7.13.0 - execa: 5.1.1 - hermes-profile-transformer: 0.0.6 - node-stream-zip: 1.15.0 - ora: 5.4.1 - semver: 7.6.2 - strip-ansi: 5.2.0 - wcwidth: 1.0.1 - yaml: 2.4.2 - transitivePeerDependencies: - - encoding - - '@react-native-community/cli-hermes@13.6.6(encoding@0.1.13)': - dependencies: - '@react-native-community/cli-platform-android': 13.6.6(encoding@0.1.13) - '@react-native-community/cli-tools': 13.6.6(encoding@0.1.13) + '@react-native-community/cli-platform-android': 12.3.2(encoding@0.1.13) + '@react-native-community/cli-tools': 12.3.2(encoding@0.1.13) chalk: 4.1.2 hermes-profile-transformer: 0.0.6 + ip: 1.1.9 transitivePeerDependencies: - encoding - '@react-native-community/cli-platform-android@13.6.6(encoding@0.1.13)': + '@react-native-community/cli-platform-android@12.3.2(encoding@0.1.13)': dependencies: - '@react-native-community/cli-tools': 13.6.6(encoding@0.1.13) + '@react-native-community/cli-tools': 12.3.2(encoding@0.1.13) chalk: 4.1.2 execa: 5.1.1 - fast-glob: 3.3.2 - fast-xml-parser: 4.3.6 + fast-xml-parser: 4.3.4 + glob: 7.2.3 logkitty: 0.7.1 transitivePeerDependencies: - encoding - '@react-native-community/cli-platform-apple@13.6.6(encoding@0.1.13)': + '@react-native-community/cli-platform-ios@12.3.2(encoding@0.1.13)': dependencies: - '@react-native-community/cli-tools': 13.6.6(encoding@0.1.13) + '@react-native-community/cli-tools': 12.3.2(encoding@0.1.13) chalk: 4.1.2 execa: 5.1.1 - fast-glob: 3.3.2 - fast-xml-parser: 4.3.6 + fast-xml-parser: 4.3.4 + glob: 7.2.3 ora: 5.4.1 transitivePeerDependencies: - encoding - '@react-native-community/cli-platform-ios@13.6.6(encoding@0.1.13)': - dependencies: - '@react-native-community/cli-platform-apple': 13.6.6(encoding@0.1.13) - transitivePeerDependencies: - - encoding + '@react-native-community/cli-plugin-metro@12.3.2': {} - '@react-native-community/cli-server-api@13.6.6(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.3)': + '@react-native-community/cli-server-api@12.3.2(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)': dependencies: - '@react-native-community/cli-debugger-ui': 13.6.6 - '@react-native-community/cli-tools': 13.6.6(encoding@0.1.13) + '@react-native-community/cli-debugger-ui': 12.3.2 + '@react-native-community/cli-tools': 12.3.2(encoding@0.1.13) compression: 1.7.4 connect: 3.7.0 errorhandler: 1.5.1 nocache: 3.0.4 pretty-format: 26.6.2 - serve-static: 1.15.0 - ws: 6.2.2(bufferutil@4.0.8)(utf-8-validate@6.0.3) + serve-static: 1.16.2 + ws: 7.5.9(bufferutil@4.0.8)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - encoding - supports-color - utf-8-validate - '@react-native-community/cli-tools@13.6.6(encoding@0.1.13)': + '@react-native-community/cli-tools@12.3.2(encoding@0.1.13)': dependencies: appdirsjs: 1.2.7 chalk: 4.1.2 - execa: 5.1.1 find-up: 5.0.0 mime: 2.6.0 - node-fetch: 2.7.0(encoding@0.1.13) + node-fetch: 2.7.0 open: 6.4.0 ora: 5.4.1 - semver: 7.6.2 + semver: 7.6.3 shell-quote: 1.8.1 sudo-prompt: 9.2.1 transitivePeerDependencies: - encoding - '@react-native-community/cli-types@13.6.6': + '@react-native-community/cli-types@12.3.2': dependencies: - joi: 17.13.1 + joi: 17.12.1 - '@react-native-community/cli@13.6.6(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.3)': + '@react-native-community/cli@12.3.2(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)': dependencies: - '@react-native-community/cli-clean': 13.6.6(encoding@0.1.13) - '@react-native-community/cli-config': 13.6.6(encoding@0.1.13) - '@react-native-community/cli-debugger-ui': 13.6.6 - '@react-native-community/cli-doctor': 13.6.6(encoding@0.1.13) - '@react-native-community/cli-hermes': 13.6.6(encoding@0.1.13) - '@react-native-community/cli-server-api': 13.6.6(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.3) - '@react-native-community/cli-tools': 13.6.6(encoding@0.1.13) - '@react-native-community/cli-types': 13.6.6 + '@react-native-community/cli-clean': 12.3.2(encoding@0.1.13) + '@react-native-community/cli-config': 12.3.2(encoding@0.1.13) + '@react-native-community/cli-debugger-ui': 12.3.2 + '@react-native-community/cli-doctor': 12.3.2(encoding@0.1.13) + '@react-native-community/cli-hermes': 12.3.2(encoding@0.1.13) + '@react-native-community/cli-plugin-metro': 12.3.2 + '@react-native-community/cli-server-api': 12.3.2(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) + '@react-native-community/cli-tools': 12.3.2(encoding@0.1.13) + '@react-native-community/cli-types': 12.3.2 chalk: 4.1.2 commander: 9.5.0 deepmerge: 4.3.1 @@ -14823,97 +17365,95 @@ snapshots: fs-extra: 8.1.0 graceful-fs: 4.2.11 prompts: 2.4.2 - semver: 7.6.2 + semver: 7.6.3 transitivePeerDependencies: - bufferutil - encoding - supports-color - utf-8-validate - '@react-native/assets-registry@0.74.83': {} + '@react-native/assets-registry@0.73.1': {} - '@react-native/babel-plugin-codegen@0.74.83(@babel/preset-env@7.24.5(@babel/core@7.24.5))': + '@react-native/babel-plugin-codegen@0.73.4(@babel/preset-env@7.23.9(@babel/core@7.25.2))': dependencies: - '@react-native/codegen': 0.74.83(@babel/preset-env@7.24.5(@babel/core@7.24.5)) + '@react-native/codegen': 0.73.3(@babel/preset-env@7.23.9(@babel/core@7.25.2)) transitivePeerDependencies: - '@babel/preset-env' - supports-color - '@react-native/babel-preset@0.74.83(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))': - dependencies: - '@babel/core': 7.24.5 - '@babel/plugin-proposal-async-generator-functions': 7.20.7(@babel/core@7.24.5) - '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.24.5) - '@babel/plugin-proposal-export-default-from': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-proposal-logical-assignment-operators': 7.20.7(@babel/core@7.24.5) - '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.24.5) - '@babel/plugin-proposal-numeric-separator': 7.18.6(@babel/core@7.24.5) - '@babel/plugin-proposal-object-rest-spread': 7.20.7(@babel/core@7.24.5) - '@babel/plugin-proposal-optional-catch-binding': 7.18.6(@babel/core@7.24.5) - '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.24.5) - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.24.5) - '@babel/plugin-syntax-export-default-from': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-syntax-flow': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.5) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.5) - '@babel/plugin-transform-arrow-functions': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-async-to-generator': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-block-scoping': 7.24.5(@babel/core@7.24.5) - '@babel/plugin-transform-classes': 7.24.5(@babel/core@7.24.5) - '@babel/plugin-transform-computed-properties': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-destructuring': 7.24.5(@babel/core@7.24.5) - '@babel/plugin-transform-flow-strip-types': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-function-name': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-literals': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-modules-commonjs': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.24.5) - '@babel/plugin-transform-parameters': 7.24.5(@babel/core@7.24.5) - '@babel/plugin-transform-private-methods': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-private-property-in-object': 7.24.5(@babel/core@7.24.5) - '@babel/plugin-transform-react-display-name': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-react-jsx': 7.23.4(@babel/core@7.24.5) - '@babel/plugin-transform-react-jsx-self': 7.24.5(@babel/core@7.24.5) - '@babel/plugin-transform-react-jsx-source': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-runtime': 7.24.3(@babel/core@7.24.5) - '@babel/plugin-transform-shorthand-properties': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-spread': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-sticky-regex': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-typescript': 7.24.5(@babel/core@7.24.5) - '@babel/plugin-transform-unicode-regex': 7.24.1(@babel/core@7.24.5) - '@babel/template': 7.24.0 - '@react-native/babel-plugin-codegen': 0.74.83(@babel/preset-env@7.24.5(@babel/core@7.24.5)) - babel-plugin-transform-flow-enums: 0.0.2(@babel/core@7.24.5) - react-refresh: 0.14.2 + '@react-native/babel-preset@0.73.21(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))': + dependencies: + '@babel/core': 7.25.2 + '@babel/plugin-proposal-async-generator-functions': 7.20.7(@babel/core@7.25.2) + '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.25.2) + '@babel/plugin-proposal-export-default-from': 7.23.3(@babel/core@7.25.2) + '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.25.2) + '@babel/plugin-proposal-numeric-separator': 7.18.6(@babel/core@7.25.2) + '@babel/plugin-proposal-object-rest-spread': 7.20.7(@babel/core@7.25.2) + '@babel/plugin-proposal-optional-catch-binding': 7.18.6(@babel/core@7.25.2) + '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.25.2) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-export-default-from': 7.23.3(@babel/core@7.25.2) + '@babel/plugin-syntax-flow': 7.23.3(@babel/core@7.25.2) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-transform-arrow-functions': 7.23.3(@babel/core@7.25.2) + '@babel/plugin-transform-async-to-generator': 7.23.3(@babel/core@7.25.2) + '@babel/plugin-transform-block-scoping': 7.23.4(@babel/core@7.25.2) + '@babel/plugin-transform-classes': 7.23.8(@babel/core@7.25.2) + '@babel/plugin-transform-computed-properties': 7.23.3(@babel/core@7.25.2) + '@babel/plugin-transform-destructuring': 7.23.3(@babel/core@7.25.2) + '@babel/plugin-transform-flow-strip-types': 7.23.3(@babel/core@7.25.2) + '@babel/plugin-transform-function-name': 7.23.3(@babel/core@7.25.2) + '@babel/plugin-transform-literals': 7.23.3(@babel/core@7.25.2) + '@babel/plugin-transform-modules-commonjs': 7.23.3(@babel/core@7.25.2) + '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.25.2) + '@babel/plugin-transform-parameters': 7.23.3(@babel/core@7.25.2) + '@babel/plugin-transform-private-methods': 7.23.3(@babel/core@7.25.2) + '@babel/plugin-transform-private-property-in-object': 7.23.4(@babel/core@7.25.2) + '@babel/plugin-transform-react-display-name': 7.23.3(@babel/core@7.25.2) + '@babel/plugin-transform-react-jsx': 7.25.2(@babel/core@7.25.2) + '@babel/plugin-transform-react-jsx-self': 7.23.3(@babel/core@7.25.2) + '@babel/plugin-transform-react-jsx-source': 7.23.3(@babel/core@7.25.2) + '@babel/plugin-transform-runtime': 7.23.9(@babel/core@7.25.2) + '@babel/plugin-transform-shorthand-properties': 7.23.3(@babel/core@7.25.2) + '@babel/plugin-transform-spread': 7.23.3(@babel/core@7.25.2) + '@babel/plugin-transform-sticky-regex': 7.23.3(@babel/core@7.25.2) + '@babel/plugin-transform-typescript': 7.23.6(@babel/core@7.25.2) + '@babel/plugin-transform-unicode-regex': 7.23.3(@babel/core@7.25.2) + '@babel/template': 7.25.0 + '@react-native/babel-plugin-codegen': 0.73.4(@babel/preset-env@7.23.9(@babel/core@7.25.2)) + babel-plugin-transform-flow-enums: 0.0.2(@babel/core@7.25.2) + react-refresh: 0.14.0 transitivePeerDependencies: - '@babel/preset-env' - supports-color - '@react-native/codegen@0.74.83(@babel/preset-env@7.24.5(@babel/core@7.24.5))': + '@react-native/codegen@0.73.3(@babel/preset-env@7.23.9(@babel/core@7.25.2))': dependencies: - '@babel/parser': 7.24.5 - '@babel/preset-env': 7.24.5(@babel/core@7.24.5) + '@babel/parser': 7.25.6 + '@babel/preset-env': 7.23.9(@babel/core@7.25.2) + flow-parser: 0.206.0 glob: 7.2.3 - hermes-parser: 0.19.1 invariant: 2.2.4 - jscodeshift: 0.14.0(@babel/preset-env@7.24.5(@babel/core@7.24.5)) + jscodeshift: 0.14.0(@babel/preset-env@7.23.9(@babel/core@7.25.2)) mkdirp: 0.5.6 nullthrows: 1.1.1 transitivePeerDependencies: - supports-color - '@react-native/community-cli-plugin@0.74.83(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.3)': + '@react-native/community-cli-plugin@0.73.16(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)': dependencies: - '@react-native-community/cli-server-api': 13.6.6(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.3) - '@react-native-community/cli-tools': 13.6.6(encoding@0.1.13) - '@react-native/dev-middleware': 0.74.83(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.3) - '@react-native/metro-babel-transformer': 0.74.83(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5)) + '@react-native-community/cli-server-api': 12.3.2(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) + '@react-native-community/cli-tools': 12.3.2(encoding@0.1.13) + '@react-native/dev-middleware': 0.73.7(encoding@0.1.13) + '@react-native/metro-babel-transformer': 0.73.15(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2)) chalk: 4.1.2 execa: 5.1.1 - metro: 0.80.9(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.3) - metro-config: 0.80.9(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.3) - metro-core: 0.80.9 + metro: 0.80.6(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) + metro-config: 0.80.6(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) + metro-core: 0.80.6 node-fetch: 2.7.0(encoding@0.1.13) - querystring: 0.2.1 readline: 1.3.0 transitivePeerDependencies: - '@babel/core' @@ -14923,60 +17463,52 @@ snapshots: - supports-color - utf-8-validate - '@react-native/debugger-frontend@0.74.83': {} + '@react-native/debugger-frontend@0.73.3': {} - '@react-native/dev-middleware@0.74.83(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.3)': + '@react-native/dev-middleware@0.73.7(encoding@0.1.13)': dependencies: '@isaacs/ttlcache': 1.4.1 - '@react-native/debugger-frontend': 0.74.83 - '@rnx-kit/chromium-edge-launcher': 1.0.0 + '@react-native/debugger-frontend': 0.73.3 chrome-launcher: 0.15.2 + chromium-edge-launcher: 1.0.0 connect: 3.7.0 debug: 2.6.9 node-fetch: 2.7.0(encoding@0.1.13) - nullthrows: 1.1.1 open: 7.4.2 - selfsigned: 2.4.1 - serve-static: 1.15.0 + serve-static: 1.16.2 temp-dir: 2.0.0 - ws: 6.2.2(bufferutil@4.0.8)(utf-8-validate@6.0.3) transitivePeerDependencies: - - bufferutil - encoding - supports-color - - utf-8-validate - '@react-native/gradle-plugin@0.74.83': {} + '@react-native/gradle-plugin@0.73.4': {} - '@react-native/js-polyfills@0.74.83': {} + '@react-native/js-polyfills@0.73.1': {} - '@react-native/metro-babel-transformer@0.74.83(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))': + '@react-native/metro-babel-transformer@0.73.15(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))': dependencies: - '@babel/core': 7.24.5 - '@react-native/babel-preset': 0.74.83(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5)) - hermes-parser: 0.19.1 + '@babel/core': 7.25.2 + '@react-native/babel-preset': 0.73.21(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2)) + hermes-parser: 0.15.0 nullthrows: 1.1.1 transitivePeerDependencies: - '@babel/preset-env' - supports-color - '@react-native/normalize-colors@0.74.83': {} + '@react-native/normalize-colors@0.73.2': {} - '@react-native/virtualized-lists@0.74.83(@types/react@18.3.2)(react-native@0.74.1(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.3.2)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1)': + '@react-native/virtualized-lists@0.73.4(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))': dependencies: invariant: 2.2.4 nullthrows: 1.1.1 - react: 18.3.1 - react-native: 0.74.1(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.3.2)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3) - optionalDependencies: - '@types/react': 18.3.2 + react-native: 0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10) - '@readme/better-ajv-errors@1.6.0(ajv@8.13.0)': + '@readme/better-ajv-errors@1.6.0(ajv@8.12.0)': dependencies: - '@babel/code-frame': 7.24.2 - '@babel/runtime': 7.24.5 + '@babel/code-frame': 7.23.5 + '@babel/runtime': 7.23.9 '@humanwhocodes/momoa': 2.0.4 - ajv: 8.13.0 + ajv: 8.12.0 chalk: 4.1.2 json-to-ast: 2.1.0 jsonpointer: 5.0.1 @@ -14994,75 +17526,179 @@ snapshots: '@apidevtools/openapi-schemas': 2.1.0 '@apidevtools/swagger-methods': 3.0.2 '@jsdevtools/ono': 7.1.3 - '@readme/better-ajv-errors': 1.6.0(ajv@8.13.0) + '@readme/better-ajv-errors': 1.6.0(ajv@8.12.0) '@readme/json-schema-ref-parser': 1.2.0 - ajv: 8.13.0 - ajv-draft-04: 1.0.0(ajv@8.13.0) + ajv: 8.12.0 + ajv-draft-04: 1.0.0(ajv@8.12.0) call-me-maybe: 1.0.2 openapi-types: 12.1.3 - '@rnx-kit/chromium-edge-launcher@1.0.0': + '@rollup/pluginutils@5.1.0(rollup@4.21.3)': dependencies: - '@types/node': 18.19.33 - escape-string-regexp: 4.0.0 - is-wsl: 2.2.0 - lighthouse-logger: 1.4.2 - mkdirp: 1.0.4 - rimraf: 3.0.2 - transitivePeerDependencies: - - supports-color + '@types/estree': 1.0.5 + estree-walker: 2.0.2 + picomatch: 2.3.1 + optionalDependencies: + rollup: 4.21.3 + + '@rollup/rollup-android-arm-eabi@4.12.0': + optional: true + + '@rollup/rollup-android-arm-eabi@4.18.0': + optional: true - '@rollup/rollup-android-arm-eabi@4.17.2': + '@rollup/rollup-android-arm-eabi@4.21.3': + optional: true + + '@rollup/rollup-android-arm64@4.12.0': optional: true '@rollup/rollup-android-arm64@4.17.2': optional: true + '@rollup/rollup-android-arm64@4.21.3': + optional: true + + '@rollup/rollup-darwin-arm64@4.12.0': + optional: true + '@rollup/rollup-darwin-arm64@4.17.2': optional: true + '@rollup/rollup-darwin-arm64@4.21.3': + optional: true + + '@rollup/rollup-darwin-x64@4.12.0': + optional: true + '@rollup/rollup-darwin-x64@4.17.2': optional: true + '@rollup/rollup-darwin-x64@4.21.3': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.12.0': + optional: true + '@rollup/rollup-linux-arm-gnueabihf@4.17.2': optional: true + '@rollup/rollup-linux-arm-gnueabihf@4.21.3': + optional: true + '@rollup/rollup-linux-arm-musleabihf@4.17.2': optional: true + '@rollup/rollup-linux-arm-musleabihf@4.21.3': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.12.0': + optional: true + '@rollup/rollup-linux-arm64-gnu@4.17.2': optional: true + '@rollup/rollup-linux-arm64-gnu@4.21.3': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.12.0': + optional: true + '@rollup/rollup-linux-arm64-musl@4.17.2': optional: true + '@rollup/rollup-linux-arm64-musl@4.21.3': + optional: true + '@rollup/rollup-linux-powerpc64le-gnu@4.17.2': optional: true + '@rollup/rollup-linux-powerpc64le-gnu@4.21.3': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.12.0': + optional: true + '@rollup/rollup-linux-riscv64-gnu@4.17.2': optional: true + '@rollup/rollup-linux-riscv64-gnu@4.21.3': + optional: true + '@rollup/rollup-linux-s390x-gnu@4.17.2': optional: true + '@rollup/rollup-linux-s390x-gnu@4.21.3': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.12.0': + optional: true + '@rollup/rollup-linux-x64-gnu@4.17.2': optional: true + '@rollup/rollup-linux-x64-gnu@4.21.3': + optional: true + + '@rollup/rollup-linux-x64-musl@4.12.0': + optional: true + '@rollup/rollup-linux-x64-musl@4.17.2': optional: true + '@rollup/rollup-linux-x64-musl@4.21.3': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.12.0': + optional: true + '@rollup/rollup-win32-arm64-msvc@4.17.2': optional: true + '@rollup/rollup-win32-arm64-msvc@4.21.3': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.12.0': + optional: true + '@rollup/rollup-win32-ia32-msvc@4.17.2': optional: true + '@rollup/rollup-win32-ia32-msvc@4.21.3': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.12.0': + optional: true + '@rollup/rollup-win32-x64-msvc@4.17.2': optional: true - '@safe-global/safe-apps-provider@0.18.1(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8)': + '@rollup/rollup-win32-x64-msvc@4.21.3': + optional: true + + '@safe-global/safe-apps-provider@0.18.1(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.22.4)': + dependencies: + '@safe-global/safe-apps-sdk': 8.1.0(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.22.4) + events: 3.3.0 + transitivePeerDependencies: + - bufferutil + - typescript + - utf-8-validate + - zod + + '@safe-global/safe-apps-provider@0.18.1(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.23.8)': + dependencies: + '@safe-global/safe-apps-sdk': 8.1.0(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.23.8) + events: 3.3.0 + transitivePeerDependencies: + - bufferutil + - typescript + - utf-8-validate + - zod + + '@safe-global/safe-apps-provider@0.18.3(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8)': dependencies: - '@safe-global/safe-apps-sdk': 8.1.0(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8) + '@safe-global/safe-apps-sdk': 9.1.0(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8) events: 3.3.0 transitivePeerDependencies: - bufferutil @@ -15070,54 +17706,162 @@ snapshots: - utf-8-validate - zod - '@safe-global/safe-apps-sdk@8.1.0(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8)': + '@safe-global/safe-apps-sdk@8.1.0(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.22.4)': + dependencies: + '@safe-global/safe-gateway-typescript-sdk': 3.15.0 + viem: 1.21.4(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.22.4) + transitivePeerDependencies: + - bufferutil + - typescript + - utf-8-validate + - zod + + '@safe-global/safe-apps-sdk@8.1.0(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.23.8)': + dependencies: + '@safe-global/safe-gateway-typescript-sdk': 3.15.0 + viem: 1.21.4(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.23.8) + transitivePeerDependencies: + - bufferutil + - typescript + - utf-8-validate + - zod + + '@safe-global/safe-apps-sdk@9.1.0(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8)': dependencies: - '@safe-global/safe-gateway-typescript-sdk': 3.21.1 - viem: 1.21.4(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8) + '@safe-global/safe-gateway-typescript-sdk': 3.15.0 + viem: 2.21.7(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8) transitivePeerDependencies: - bufferutil - typescript - utf-8-validate - zod - '@safe-global/safe-gateway-typescript-sdk@3.21.1': {} + '@safe-global/safe-gateway-typescript-sdk@3.15.0': {} - '@scure/base@1.1.6': {} + '@scure/base@1.1.5': {} + + '@scure/base@1.1.8': {} '@scure/bip32@1.1.5': dependencies: '@noble/hashes': 1.2.0 '@noble/secp256k1': 1.7.1 - '@scure/base': 1.1.6 + '@scure/base': 1.1.5 '@scure/bip32@1.3.2': dependencies: '@noble/curves': 1.2.0 - '@noble/hashes': 1.3.2 - '@scure/base': 1.1.6 + '@noble/hashes': 1.3.3 + '@scure/base': 1.1.5 - '@scure/bip32@1.3.3': + '@scure/bip32@1.4.0': dependencies: '@noble/curves': 1.3.0 '@noble/hashes': 1.3.3 - '@scure/base': 1.1.6 + '@scure/base': 1.1.8 + + '@scure/bip32@1.4.0': + dependencies: + '@noble/curves': 1.4.0 + '@noble/hashes': 1.4.0 + '@scure/base': 1.1.8 '@scure/bip39@1.1.1': dependencies: '@noble/hashes': 1.2.0 - '@scure/base': 1.1.6 + '@scure/base': 1.1.5 '@scure/bip39@1.2.1': dependencies: - '@noble/hashes': 1.3.2 - '@scure/base': 1.1.6 + '@noble/hashes': 1.3.3 + '@scure/base': 1.1.5 - '@scure/bip39@1.2.2': + '@scure/bip39@1.3.0': dependencies: '@noble/hashes': 1.3.3 - '@scure/base': 1.1.6 + '@scure/base': 1.1.8 + + '@scure/bip39@1.4.0': + dependencies: + '@noble/hashes': 1.5.0 + '@scure/base': 1.1.8 + + '@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/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.2 + https-proxy-agent: 5.0.1 + lru_map: 0.3.3 + tslib: 1.14.1 + transitivePeerDependencies: + - supports-color + + '@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/utils@5.30.0': + dependencies: + '@sentry/types': 5.30.0 + tslib: 1.14.1 + + '@shikijs/core@1.17.6': + dependencies: + '@shikijs/engine-javascript': 1.17.6 + '@shikijs/engine-oniguruma': 1.17.6 + '@shikijs/types': 1.17.6 + '@shikijs/vscode-textmate': 9.2.2 + '@types/hast': 3.0.4 + hast-util-to-html: 9.0.2 + + '@shikijs/core@1.5.2': {} + + '@shikijs/engine-javascript@1.17.6': + dependencies: + '@shikijs/types': 1.17.6 + oniguruma-to-js: 0.4.3 + + '@shikijs/engine-oniguruma@1.17.6': + dependencies: + '@shikijs/types': 1.17.6 + '@shikijs/vscode-textmate': 9.2.2 + + '@shikijs/types@1.17.6': + dependencies: + '@shikijs/vscode-textmate': 9.2.2 + '@types/hast': 3.0.4 - '@shikijs/core@1.5.1': {} + '@shikijs/vscode-textmate@9.2.2': {} '@sideway/address@4.1.5': dependencies: @@ -15129,9 +17873,9 @@ snapshots: '@sinclair/typebox@0.27.8': {} - '@sindresorhus/is@5.6.0': {} + '@sindresorhus/is@4.6.0': {} - '@sindresorhus/merge-streams@2.3.0': {} + '@sindresorhus/is@5.6.0': {} '@sinonjs/commons@3.0.1': dependencies: @@ -15141,321 +17885,335 @@ snapshots: dependencies: '@sinonjs/commons': 3.0.1 - '@smithy/abort-controller@3.0.0': + '@smithy/abort-controller@3.1.1': dependencies: - '@smithy/types': 3.0.0 - tslib: 2.6.2 + '@smithy/types': 3.3.0 + tslib: 2.6.3 '@smithy/chunked-blob-reader-native@3.0.0': dependencies: '@smithy/util-base64': 3.0.0 - tslib: 2.6.2 + tslib: 2.6.3 '@smithy/chunked-blob-reader@3.0.0': dependencies: - tslib: 2.6.2 + tslib: 2.6.3 - '@smithy/config-resolver@3.0.0': + '@smithy/config-resolver@3.0.4': dependencies: - '@smithy/node-config-provider': 3.0.0 - '@smithy/types': 3.0.0 + '@smithy/node-config-provider': 3.1.3 + '@smithy/types': 3.3.0 '@smithy/util-config-provider': 3.0.0 - '@smithy/util-middleware': 3.0.0 - tslib: 2.6.2 + '@smithy/util-middleware': 3.0.3 + tslib: 2.6.3 - '@smithy/core@2.0.0': + '@smithy/core@2.0.1': dependencies: '@smithy/middleware-endpoint': 3.0.0 - '@smithy/middleware-retry': 3.0.0 + '@smithy/middleware-retry': 3.0.1 '@smithy/middleware-serde': 3.0.0 '@smithy/protocol-http': 4.0.0 - '@smithy/smithy-client': 3.0.0 + '@smithy/smithy-client': 3.0.1 '@smithy/types': 3.0.0 '@smithy/util-middleware': 3.0.0 tslib: 2.6.2 - '@smithy/credential-provider-imds@3.0.0': + '@smithy/credential-provider-imds@3.1.3': dependencies: - '@smithy/node-config-provider': 3.0.0 - '@smithy/property-provider': 3.0.0 - '@smithy/types': 3.0.0 - '@smithy/url-parser': 3.0.0 - tslib: 2.6.2 + '@smithy/node-config-provider': 3.1.3 + '@smithy/property-provider': 3.1.3 + '@smithy/types': 3.3.0 + '@smithy/url-parser': 3.0.3 + tslib: 2.6.3 - '@smithy/eventstream-codec@3.0.0': + '@smithy/eventstream-codec@3.1.2': dependencies: - '@aws-crypto/crc32': 3.0.0 - '@smithy/types': 3.0.0 + '@aws-crypto/crc32': 5.2.0 + '@smithy/types': 3.3.0 '@smithy/util-hex-encoding': 3.0.0 - tslib: 2.6.2 + tslib: 2.6.3 - '@smithy/eventstream-serde-browser@3.0.0': + '@smithy/eventstream-serde-browser@3.0.4': dependencies: - '@smithy/eventstream-serde-universal': 3.0.0 - '@smithy/types': 3.0.0 - tslib: 2.6.2 + '@smithy/eventstream-serde-universal': 3.0.4 + '@smithy/types': 3.3.0 + tslib: 2.6.3 - '@smithy/eventstream-serde-config-resolver@3.0.0': + '@smithy/eventstream-serde-config-resolver@3.0.3': dependencies: - '@smithy/types': 3.0.0 - tslib: 2.6.2 + '@smithy/types': 3.3.0 + tslib: 2.6.3 - '@smithy/eventstream-serde-node@3.0.0': + '@smithy/eventstream-serde-node@3.0.4': dependencies: - '@smithy/eventstream-serde-universal': 3.0.0 - '@smithy/types': 3.0.0 - tslib: 2.6.2 + '@smithy/eventstream-serde-universal': 3.0.4 + '@smithy/types': 3.3.0 + tslib: 2.6.3 - '@smithy/eventstream-serde-universal@3.0.0': + '@smithy/eventstream-serde-universal@3.0.4': dependencies: - '@smithy/eventstream-codec': 3.0.0 - '@smithy/types': 3.0.0 - tslib: 2.6.2 + '@smithy/eventstream-codec': 3.1.2 + '@smithy/types': 3.3.0 + tslib: 2.6.3 - '@smithy/fetch-http-handler@3.0.0': + '@smithy/fetch-http-handler@3.0.1': dependencies: - '@smithy/protocol-http': 4.0.0 - '@smithy/querystring-builder': 3.0.0 - '@smithy/types': 3.0.0 + '@smithy/protocol-http': 4.0.3 + '@smithy/querystring-builder': 3.0.3 + '@smithy/types': 3.3.0 '@smithy/util-base64': 3.0.0 - tslib: 2.6.2 + tslib: 2.6.3 - '@smithy/hash-blob-browser@3.0.0': + '@smithy/hash-blob-browser@3.1.2': dependencies: '@smithy/chunked-blob-reader': 3.0.0 '@smithy/chunked-blob-reader-native': 3.0.0 - '@smithy/types': 3.0.0 - tslib: 2.6.2 + '@smithy/types': 3.3.0 + tslib: 2.6.3 - '@smithy/hash-node@3.0.0': + '@smithy/hash-node@3.0.3': dependencies: - '@smithy/types': 3.0.0 + '@smithy/types': 3.3.0 '@smithy/util-buffer-from': 3.0.0 '@smithy/util-utf8': 3.0.0 - tslib: 2.6.2 + tslib: 2.6.3 - '@smithy/hash-stream-node@3.0.0': + '@smithy/hash-stream-node@3.1.2': dependencies: - '@smithy/types': 3.0.0 + '@smithy/types': 3.3.0 '@smithy/util-utf8': 3.0.0 - tslib: 2.6.2 + tslib: 2.6.3 - '@smithy/invalid-dependency@3.0.0': + '@smithy/invalid-dependency@3.0.3': dependencies: - '@smithy/types': 3.0.0 - tslib: 2.6.2 + '@smithy/types': 3.3.0 + tslib: 2.6.3 + + '@smithy/is-array-buffer@2.2.0': + dependencies: + tslib: 2.6.3 '@smithy/is-array-buffer@3.0.0': dependencies: - tslib: 2.6.2 + tslib: 2.6.3 - '@smithy/md5-js@3.0.0': + '@smithy/md5-js@3.0.3': dependencies: - '@smithy/types': 3.0.0 + '@smithy/types': 3.3.0 '@smithy/util-utf8': 3.0.0 - tslib: 2.6.2 + tslib: 2.6.3 - '@smithy/middleware-content-length@3.0.0': + '@smithy/middleware-content-length@3.0.3': dependencies: - '@smithy/protocol-http': 4.0.0 - '@smithy/types': 3.0.0 - tslib: 2.6.2 + '@smithy/protocol-http': 4.0.3 + '@smithy/types': 3.3.0 + tslib: 2.6.3 - '@smithy/middleware-endpoint@3.0.0': + '@smithy/middleware-endpoint@3.0.4': dependencies: - '@smithy/middleware-serde': 3.0.0 - '@smithy/node-config-provider': 3.0.0 - '@smithy/shared-ini-file-loader': 3.0.0 - '@smithy/types': 3.0.0 - '@smithy/url-parser': 3.0.0 - '@smithy/util-middleware': 3.0.0 - tslib: 2.6.2 + '@smithy/middleware-serde': 3.0.3 + '@smithy/node-config-provider': 3.1.3 + '@smithy/shared-ini-file-loader': 3.1.3 + '@smithy/types': 3.3.0 + '@smithy/url-parser': 3.0.3 + '@smithy/util-middleware': 3.0.3 + tslib: 2.6.3 - '@smithy/middleware-retry@3.0.0': + '@smithy/middleware-retry@3.0.1': dependencies: '@smithy/node-config-provider': 3.0.0 '@smithy/protocol-http': 4.0.0 '@smithy/service-error-classification': 3.0.0 - '@smithy/smithy-client': 3.0.0 + '@smithy/smithy-client': 3.0.1 '@smithy/types': 3.0.0 '@smithy/util-middleware': 3.0.0 '@smithy/util-retry': 3.0.0 tslib: 2.6.2 uuid: 9.0.1 - '@smithy/middleware-serde@3.0.0': + '@smithy/middleware-serde@3.0.3': dependencies: - '@smithy/types': 3.0.0 - tslib: 2.6.2 + '@smithy/types': 3.3.0 + tslib: 2.6.3 - '@smithy/middleware-stack@3.0.0': + '@smithy/middleware-stack@3.0.3': dependencies: - '@smithy/types': 3.0.0 - tslib: 2.6.2 + '@smithy/types': 3.3.0 + tslib: 2.6.3 - '@smithy/node-config-provider@3.0.0': + '@smithy/node-config-provider@3.1.3': dependencies: - '@smithy/property-provider': 3.0.0 - '@smithy/shared-ini-file-loader': 3.0.0 - '@smithy/types': 3.0.0 - tslib: 2.6.2 + '@smithy/property-provider': 3.1.3 + '@smithy/shared-ini-file-loader': 3.1.3 + '@smithy/types': 3.3.0 + tslib: 2.6.3 - '@smithy/node-http-handler@3.0.0': + '@smithy/node-http-handler@3.1.1': dependencies: - '@smithy/abort-controller': 3.0.0 - '@smithy/protocol-http': 4.0.0 - '@smithy/querystring-builder': 3.0.0 - '@smithy/types': 3.0.0 - tslib: 2.6.2 + '@smithy/abort-controller': 3.1.1 + '@smithy/protocol-http': 4.0.3 + '@smithy/querystring-builder': 3.0.3 + '@smithy/types': 3.3.0 + tslib: 2.6.3 - '@smithy/property-provider@3.0.0': + '@smithy/property-provider@3.1.3': dependencies: - '@smithy/types': 3.0.0 - tslib: 2.6.2 + '@smithy/types': 3.3.0 + tslib: 2.6.3 - '@smithy/protocol-http@4.0.0': + '@smithy/protocol-http@4.0.3': dependencies: - '@smithy/types': 3.0.0 - tslib: 2.6.2 + '@smithy/types': 3.3.0 + tslib: 2.6.3 - '@smithy/querystring-builder@3.0.0': + '@smithy/querystring-builder@3.0.3': dependencies: - '@smithy/types': 3.0.0 + '@smithy/types': 3.3.0 '@smithy/util-uri-escape': 3.0.0 - tslib: 2.6.2 + tslib: 2.6.3 - '@smithy/querystring-parser@3.0.0': + '@smithy/querystring-parser@3.0.3': dependencies: - '@smithy/types': 3.0.0 - tslib: 2.6.2 + '@smithy/types': 3.3.0 + tslib: 2.6.3 - '@smithy/service-error-classification@3.0.0': + '@smithy/service-error-classification@3.0.3': dependencies: - '@smithy/types': 3.0.0 + '@smithy/types': 3.3.0 - '@smithy/shared-ini-file-loader@3.0.0': + '@smithy/shared-ini-file-loader@3.1.3': dependencies: - '@smithy/types': 3.0.0 - tslib: 2.6.2 + '@smithy/types': 3.3.0 + tslib: 2.6.3 - '@smithy/signature-v4@3.0.0': + '@smithy/signature-v4@3.1.2': dependencies: '@smithy/is-array-buffer': 3.0.0 - '@smithy/types': 3.0.0 + '@smithy/types': 3.3.0 '@smithy/util-hex-encoding': 3.0.0 - '@smithy/util-middleware': 3.0.0 + '@smithy/util-middleware': 3.0.3 '@smithy/util-uri-escape': 3.0.0 '@smithy/util-utf8': 3.0.0 - tslib: 2.6.2 + tslib: 2.6.3 - '@smithy/smithy-client@3.0.0': + '@smithy/smithy-client@3.0.1': dependencies: '@smithy/middleware-endpoint': 3.0.0 '@smithy/middleware-stack': 3.0.0 '@smithy/protocol-http': 4.0.0 '@smithy/types': 3.0.0 - '@smithy/util-stream': 3.0.0 + '@smithy/util-stream': 3.0.1 tslib: 2.6.2 - '@smithy/types@3.0.0': + '@smithy/types@3.3.0': dependencies: - tslib: 2.6.2 + tslib: 2.6.3 - '@smithy/url-parser@3.0.0': + '@smithy/url-parser@3.0.3': dependencies: - '@smithy/querystring-parser': 3.0.0 - '@smithy/types': 3.0.0 - tslib: 2.6.2 + '@smithy/querystring-parser': 3.0.3 + '@smithy/types': 3.3.0 + tslib: 2.6.3 '@smithy/util-base64@3.0.0': dependencies: '@smithy/util-buffer-from': 3.0.0 '@smithy/util-utf8': 3.0.0 - tslib: 2.6.2 + tslib: 2.6.3 '@smithy/util-body-length-browser@3.0.0': dependencies: - tslib: 2.6.2 + tslib: 2.6.3 '@smithy/util-body-length-node@3.0.0': dependencies: - tslib: 2.6.2 + tslib: 2.6.3 + + '@smithy/util-buffer-from@2.2.0': + dependencies: + '@smithy/is-array-buffer': 2.2.0 + tslib: 2.6.3 '@smithy/util-buffer-from@3.0.0': dependencies: '@smithy/is-array-buffer': 3.0.0 - tslib: 2.6.2 + tslib: 2.6.3 '@smithy/util-config-provider@3.0.0': dependencies: - tslib: 2.6.2 + tslib: 2.6.3 - '@smithy/util-defaults-mode-browser@3.0.0': + '@smithy/util-defaults-mode-browser@3.0.1': dependencies: '@smithy/property-provider': 3.0.0 - '@smithy/smithy-client': 3.0.0 + '@smithy/smithy-client': 3.0.1 '@smithy/types': 3.0.0 bowser: 2.11.0 - tslib: 2.6.2 + tslib: 2.6.3 - '@smithy/util-defaults-mode-node@3.0.0': + '@smithy/util-defaults-mode-node@3.0.1': dependencies: '@smithy/config-resolver': 3.0.0 '@smithy/credential-provider-imds': 3.0.0 '@smithy/node-config-provider': 3.0.0 '@smithy/property-provider': 3.0.0 - '@smithy/smithy-client': 3.0.0 + '@smithy/smithy-client': 3.0.1 '@smithy/types': 3.0.0 tslib: 2.6.2 - '@smithy/util-endpoints@2.0.0': + '@smithy/util-endpoints@2.0.4': dependencies: - '@smithy/node-config-provider': 3.0.0 - '@smithy/types': 3.0.0 - tslib: 2.6.2 + '@smithy/node-config-provider': 3.1.3 + '@smithy/types': 3.3.0 + tslib: 2.6.3 '@smithy/util-hex-encoding@3.0.0': dependencies: - tslib: 2.6.2 + tslib: 2.6.3 - '@smithy/util-middleware@3.0.0': + '@smithy/util-middleware@3.0.3': dependencies: - '@smithy/types': 3.0.0 - tslib: 2.6.2 + '@smithy/types': 3.3.0 + tslib: 2.6.3 - '@smithy/util-retry@3.0.0': + '@smithy/util-retry@3.0.3': dependencies: - '@smithy/service-error-classification': 3.0.0 - '@smithy/types': 3.0.0 - tslib: 2.6.2 + '@smithy/service-error-classification': 3.0.3 + '@smithy/types': 3.3.0 + tslib: 2.6.3 - '@smithy/util-stream@3.0.0': + '@smithy/util-stream@3.0.1': dependencies: - '@smithy/fetch-http-handler': 3.0.0 + '@smithy/fetch-http-handler': 3.0.1 '@smithy/node-http-handler': 3.0.0 '@smithy/types': 3.0.0 '@smithy/util-base64': 3.0.0 '@smithy/util-buffer-from': 3.0.0 '@smithy/util-hex-encoding': 3.0.0 '@smithy/util-utf8': 3.0.0 - tslib: 2.6.2 + tslib: 2.6.3 '@smithy/util-uri-escape@3.0.0': dependencies: - tslib: 2.6.2 + tslib: 2.6.3 + + '@smithy/util-utf8@2.3.0': + dependencies: + '@smithy/util-buffer-from': 2.2.0 + tslib: 2.6.3 '@smithy/util-utf8@3.0.0': dependencies: '@smithy/util-buffer-from': 3.0.0 - tslib: 2.6.2 + tslib: 2.6.3 - '@smithy/util-waiter@3.0.0': + '@smithy/util-waiter@3.1.2': dependencies: - '@smithy/abort-controller': 3.0.0 - '@smithy/types': 3.0.0 - tslib: 2.6.2 + '@smithy/abort-controller': 3.1.1 + '@smithy/types': 3.3.0 + tslib: 2.6.3 - '@socket.io/component-emitter@3.1.2': {} + '@socket.io/component-emitter@3.1.0': {} '@solidity-parser/parser@0.18.0': {} @@ -15539,556 +18297,237 @@ snapshots: '@stablelib/random': 1.0.2 '@stablelib/wipe': 1.0.1 - '@storybook/addon-actions@8.1.1': + '@storybook/addon-actions@8.3.0(storybook@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))': dependencies: - '@storybook/core-events': 8.1.1 '@storybook/global': 5.0.0 '@types/uuid': 9.0.8 dequal: 2.0.3 polished: 4.3.1 + storybook: 8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) uuid: 9.0.1 - '@storybook/addon-backgrounds@8.1.1': + '@storybook/addon-backgrounds@8.3.0(storybook@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))': dependencies: '@storybook/global': 5.0.0 memoizerific: 1.11.3 + storybook: 8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) ts-dedent: 2.2.0 - '@storybook/addon-controls@8.1.1(@types/react@18.3.2)(encoding@0.1.13)(prettier@3.2.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@storybook/addon-controls@8.3.0(storybook@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))': dependencies: - '@storybook/blocks': 8.1.1(@types/react@18.3.2)(encoding@0.1.13)(prettier@3.2.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@storybook/global': 5.0.0 dequal: 2.0.3 lodash: 4.17.21 + storybook: 8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) ts-dedent: 2.2.0 - transitivePeerDependencies: - - '@types/react' - - '@types/react-dom' - - encoding - - prettier - - react - - react-dom - - supports-color - '@storybook/addon-docs@8.1.1(encoding@0.1.13)(prettier@3.2.5)': + '@storybook/addon-docs@8.3.0(storybook@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))': dependencies: - '@babel/core': 7.24.5 - '@mdx-js/react': 3.0.1(@types/react@18.3.2)(react@18.3.1) - '@storybook/blocks': 8.1.1(@types/react@18.3.2)(encoding@0.1.13)(prettier@3.2.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@storybook/client-logger': 8.1.1 - '@storybook/components': 8.1.1(@types/react@18.3.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@storybook/csf-plugin': 8.1.1 - '@storybook/csf-tools': 8.1.1 + '@mdx-js/react': 3.0.1(@types/react@18.3.5)(react@18.2.0) + '@storybook/blocks': 8.3.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3)) + '@storybook/csf-plugin': 8.3.0(storybook@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3)) '@storybook/global': 5.0.0 - '@storybook/node-logger': 8.1.1 - '@storybook/preview-api': 8.1.1 - '@storybook/react-dom-shim': 8.1.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@storybook/theming': 8.1.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@storybook/types': 8.1.1 - '@types/react': 18.3.2 + '@storybook/react-dom-shim': 8.3.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3)) + '@types/react': 18.3.5 fs-extra: 11.2.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) rehype-external-links: 3.0.0 rehype-slug: 6.0.0 + storybook: 8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) ts-dedent: 2.2.0 transitivePeerDependencies: - - '@types/react-dom' - - encoding - - prettier - - supports-color - - '@storybook/addon-essentials@8.1.1(@types/react@18.3.2)(encoding@0.1.13)(prettier@3.2.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@storybook/addon-actions': 8.1.1 - '@storybook/addon-backgrounds': 8.1.1 - '@storybook/addon-controls': 8.1.1(@types/react@18.3.2)(encoding@0.1.13)(prettier@3.2.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@storybook/addon-docs': 8.1.1(encoding@0.1.13)(prettier@3.2.5) - '@storybook/addon-highlight': 8.1.1 - '@storybook/addon-measure': 8.1.1 - '@storybook/addon-outline': 8.1.1 - '@storybook/addon-toolbars': 8.1.1 - '@storybook/addon-viewport': 8.1.1 - '@storybook/core-common': 8.1.1(encoding@0.1.13)(prettier@3.2.5) - '@storybook/manager-api': 8.1.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@storybook/node-logger': 8.1.1 - '@storybook/preview-api': 8.1.1 + - webpack-sources + + '@storybook/addon-essentials@8.3.0(storybook@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))': + dependencies: + '@storybook/addon-actions': 8.3.0(storybook@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3)) + '@storybook/addon-backgrounds': 8.3.0(storybook@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3)) + '@storybook/addon-controls': 8.3.0(storybook@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3)) + '@storybook/addon-docs': 8.3.0(storybook@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3)) + '@storybook/addon-highlight': 8.3.0(storybook@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3)) + '@storybook/addon-measure': 8.3.0(storybook@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3)) + '@storybook/addon-outline': 8.3.0(storybook@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3)) + '@storybook/addon-toolbars': 8.3.0(storybook@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3)) + '@storybook/addon-viewport': 8.3.0(storybook@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3)) + storybook: 8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) ts-dedent: 2.2.0 transitivePeerDependencies: - - '@types/react' - - '@types/react-dom' - - encoding - - prettier - - react - - react-dom - - supports-color + - webpack-sources - '@storybook/addon-highlight@8.1.1': + '@storybook/addon-highlight@8.3.0(storybook@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))': dependencies: '@storybook/global': 5.0.0 + storybook: 8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) - '@storybook/addon-interactions@8.1.1(@types/jest@29.5.12)(vitest@1.6.0(@types/node@20.12.11)(jsdom@24.0.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))(terser@5.31.0))': + '@storybook/addon-interactions@8.3.0(storybook@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))': dependencies: '@storybook/global': 5.0.0 - '@storybook/instrumenter': 8.1.1 - '@storybook/test': 8.1.1(@types/jest@29.5.12)(vitest@1.6.0(@types/node@20.12.11)(jsdom@24.0.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))(terser@5.31.0)) - '@storybook/types': 8.1.1 + '@storybook/instrumenter': 8.3.0(storybook@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3)) + '@storybook/test': 8.3.0(storybook@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3)) polished: 4.3.1 + storybook: 8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) ts-dedent: 2.2.0 - transitivePeerDependencies: - - '@jest/globals' - - '@types/bun' - - '@types/jest' - - jest - - vitest - '@storybook/addon-links@8.1.1(react@18.3.1)': + '@storybook/addon-links@8.3.0(react@18.2.0)(storybook@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))': dependencies: - '@storybook/csf': 0.1.7 + '@storybook/csf': 0.1.11 '@storybook/global': 5.0.0 + storybook: 8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) ts-dedent: 2.2.0 optionalDependencies: - react: 18.3.1 + react: 18.2.0 - '@storybook/addon-measure@8.1.1': + '@storybook/addon-measure@8.3.0(storybook@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))': dependencies: '@storybook/global': 5.0.0 + storybook: 8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) tiny-invariant: 1.3.3 - '@storybook/addon-outline@8.1.1': + '@storybook/addon-outline@8.3.0(storybook@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))': dependencies: '@storybook/global': 5.0.0 + storybook: 8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) ts-dedent: 2.2.0 - '@storybook/addon-themes@8.1.1': + '@storybook/addon-themes@8.3.0(storybook@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))': dependencies: + storybook: 8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) ts-dedent: 2.2.0 - '@storybook/addon-toolbars@8.1.1': {} + '@storybook/addon-toolbars@8.3.0(storybook@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))': + dependencies: + storybook: 8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) - '@storybook/addon-viewport@8.1.1': + '@storybook/addon-viewport@8.3.0(storybook@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))': dependencies: memoizerific: 1.11.3 + storybook: 8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) - '@storybook/blocks@8.1.1(@types/react@18.3.2)(encoding@0.1.13)(prettier@3.2.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@storybook/blocks@8.3.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))': dependencies: - '@storybook/channels': 8.1.1 - '@storybook/client-logger': 8.1.1 - '@storybook/components': 8.1.1(@types/react@18.3.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@storybook/core-events': 8.1.1 - '@storybook/csf': 0.1.7 - '@storybook/docs-tools': 8.1.1(encoding@0.1.13)(prettier@3.2.5) + '@storybook/csf': 0.1.11 '@storybook/global': 5.0.0 - '@storybook/icons': 1.2.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@storybook/manager-api': 8.1.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@storybook/preview-api': 8.1.1 - '@storybook/theming': 8.1.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@storybook/types': 8.1.1 - '@types/lodash': 4.17.4 + '@storybook/icons': 1.2.10(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@types/lodash': 4.17.7 color-convert: 2.0.1 dequal: 2.0.3 lodash: 4.17.21 - markdown-to-jsx: 7.3.2(react@18.3.1) + markdown-to-jsx: 7.5.0(react@18.2.0) memoizerific: 1.11.3 polished: 4.3.1 - react-colorful: 5.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react-colorful: 5.6.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + storybook: 8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) telejson: 7.2.0 - tocbot: 4.27.20 ts-dedent: 2.2.0 util-deprecate: 1.0.2 optionalDependencies: - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - transitivePeerDependencies: - - '@types/react' - - '@types/react-dom' - - encoding - - prettier - - supports-color + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) - '@storybook/builder-manager@8.1.1(encoding@0.1.13)(prettier@3.2.5)': + '@storybook/builder-vite@8.3.0(storybook@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))(typescript@5.4.5)(vite@5.2.11(@types/node@20.12.7)(terser@5.27.2))': dependencies: - '@fal-works/esbuild-plugin-global-externals': 2.1.2 - '@storybook/core-common': 8.1.1(encoding@0.1.13)(prettier@3.2.5) - '@storybook/manager': 8.1.1 - '@storybook/node-logger': 8.1.1 - '@types/ejs': 3.1.5 - '@yarnpkg/esbuild-plugin-pnp': 3.0.0-rc.15(esbuild@0.20.2) - browser-assert: 1.2.1 - ejs: 3.1.10 - esbuild: 0.20.2 - esbuild-plugin-alias: 0.2.1 - express: 4.19.2 - fs-extra: 11.2.0 - process: 0.11.10 - util: 0.12.5 - transitivePeerDependencies: - - encoding - - prettier - - supports-color - - '@storybook/builder-vite@8.1.1(encoding@0.1.13)(prettier@3.2.5)(typescript@5.4.5)(vite@5.2.11(@types/node@20.12.11)(terser@5.31.0))': - dependencies: - '@storybook/channels': 8.1.1 - '@storybook/client-logger': 8.1.1 - '@storybook/core-common': 8.1.1(encoding@0.1.13)(prettier@3.2.5) - '@storybook/core-events': 8.1.1 - '@storybook/csf-plugin': 8.1.1 - '@storybook/node-logger': 8.1.1 - '@storybook/preview': 8.1.1 - '@storybook/preview-api': 8.1.1 - '@storybook/types': 8.1.1 + '@storybook/csf-plugin': 8.3.0(storybook@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3)) '@types/find-cache-dir': 3.2.1 browser-assert: 1.2.1 - es-module-lexer: 1.5.2 - express: 4.19.2 + es-module-lexer: 1.5.3 + express: 4.21.0 find-cache-dir: 3.3.2 fs-extra: 11.2.0 magic-string: 0.30.10 + storybook: 8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) ts-dedent: 2.2.0 - vite: 5.2.11(@types/node@20.12.11)(terser@5.31.0) + vite: 5.2.11(@types/node@20.12.7)(terser@5.27.2) optionalDependencies: typescript: 5.4.5 transitivePeerDependencies: - - encoding - - prettier - - supports-color - - '@storybook/channels@8.1.1': - dependencies: - '@storybook/client-logger': 8.1.1 - '@storybook/core-events': 8.1.1 - '@storybook/global': 5.0.0 - telejson: 7.2.0 - tiny-invariant: 1.3.3 - - '@storybook/cli@8.1.1(@babel/preset-env@7.24.5(@babel/core@7.24.5))(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(utf-8-validate@6.0.3)': - dependencies: - '@babel/core': 7.24.5 - '@babel/types': 7.24.5 - '@ndelangen/get-tarball': 3.0.9 - '@storybook/codemod': 8.1.1 - '@storybook/core-common': 8.1.1(encoding@0.1.13)(prettier@3.2.5) - '@storybook/core-events': 8.1.1 - '@storybook/core-server': 8.1.1(bufferutil@4.0.8)(encoding@0.1.13)(prettier@3.2.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(utf-8-validate@6.0.3) - '@storybook/csf-tools': 8.1.1 - '@storybook/node-logger': 8.1.1 - '@storybook/telemetry': 8.1.1(encoding@0.1.13)(prettier@3.2.5) - '@storybook/types': 8.1.1 - '@types/semver': 7.5.8 - '@yarnpkg/fslib': 2.10.3 - '@yarnpkg/libzip': 2.3.0 - chalk: 4.1.2 - commander: 6.2.1 - cross-spawn: 7.0.3 - detect-indent: 6.1.0 - envinfo: 7.13.0 - execa: 5.1.1 - find-up: 5.0.0 - fs-extra: 11.2.0 - get-npm-tarball-url: 2.1.0 - giget: 1.2.3 - globby: 14.0.1 - jscodeshift: 0.15.2(@babel/preset-env@7.24.5(@babel/core@7.24.5)) - leven: 3.1.0 - ora: 5.4.1 - prettier: 3.2.5 - prompts: 2.4.2 - read-pkg-up: 7.0.1 - semver: 7.6.2 - strip-json-comments: 3.1.1 - tempy: 1.0.1 - tiny-invariant: 1.3.3 - ts-dedent: 2.2.0 - transitivePeerDependencies: - - '@babel/preset-env' - - bufferutil - - encoding - - react - - react-dom - - supports-color - - utf-8-validate - - '@storybook/client-logger@8.1.1': - dependencies: - '@storybook/global': 5.0.0 - - '@storybook/codemod@8.1.1': - dependencies: - '@babel/core': 7.24.5 - '@babel/preset-env': 7.24.5(@babel/core@7.24.5) - '@babel/types': 7.24.5 - '@storybook/csf': 0.1.7 - '@storybook/csf-tools': 8.1.1 - '@storybook/node-logger': 8.1.1 - '@storybook/types': 8.1.1 - '@types/cross-spawn': 6.0.6 - cross-spawn: 7.0.3 - globby: 14.0.1 - jscodeshift: 0.15.2(@babel/preset-env@7.24.5(@babel/core@7.24.5)) - lodash: 4.17.21 - prettier: 3.2.5 - recast: 0.23.7 - tiny-invariant: 1.3.3 - transitivePeerDependencies: - - supports-color - - '@storybook/components@8.1.1(@types/react@18.3.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/react-dialog': 1.0.5(@types/react@18.3.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-slot': 1.0.2(@types/react@18.3.2)(react@18.3.1) - '@storybook/client-logger': 8.1.1 - '@storybook/csf': 0.1.7 - '@storybook/global': 5.0.0 - '@storybook/icons': 1.2.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@storybook/theming': 8.1.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@storybook/types': 8.1.1 - memoizerific: 1.11.3 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - util-deprecate: 1.0.2 - transitivePeerDependencies: - - '@types/react' - - '@types/react-dom' - - '@storybook/core-common@8.1.1(encoding@0.1.13)(prettier@3.2.5)': - dependencies: - '@storybook/core-events': 8.1.1 - '@storybook/csf-tools': 8.1.1 - '@storybook/node-logger': 8.1.1 - '@storybook/types': 8.1.1 - '@yarnpkg/fslib': 2.10.3 - '@yarnpkg/libzip': 2.3.0 - chalk: 4.1.2 - cross-spawn: 7.0.3 - esbuild: 0.20.2 - esbuild-register: 3.5.0(esbuild@0.20.2) - execa: 5.1.1 - file-system-cache: 2.3.0 - find-cache-dir: 3.3.2 - find-up: 5.0.0 - fs-extra: 11.2.0 - glob: 10.3.12 - handlebars: 4.7.8 - lazy-universal-dotenv: 4.0.0 - node-fetch: 2.7.0(encoding@0.1.13) - picomatch: 2.3.1 - pkg-dir: 5.0.0 - prettier-fallback: prettier@3.2.5 - pretty-hrtime: 1.0.3 - resolve-from: 5.0.0 - semver: 7.6.2 - tempy: 1.0.1 - tiny-invariant: 1.3.3 - ts-dedent: 2.2.0 - util: 0.12.5 - optionalDependencies: - prettier: 3.2.5 - transitivePeerDependencies: - - encoding - supports-color + - webpack-sources - '@storybook/core-events@8.1.1': + '@storybook/components@8.3.0(storybook@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))': dependencies: - '@storybook/csf': 0.1.7 - ts-dedent: 2.2.0 + storybook: 8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) - '@storybook/core-server@8.1.1(bufferutil@4.0.8)(encoding@0.1.13)(prettier@3.2.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(utf-8-validate@6.0.3)': + '@storybook/core@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3)': dependencies: - '@aw-web-design/x-default-browser': 1.4.126 - '@babel/core': 7.24.5 - '@babel/parser': 7.24.5 - '@discoveryjs/json-ext': 0.5.7 - '@storybook/builder-manager': 8.1.1(encoding@0.1.13)(prettier@3.2.5) - '@storybook/channels': 8.1.1 - '@storybook/core-common': 8.1.1(encoding@0.1.13)(prettier@3.2.5) - '@storybook/core-events': 8.1.1 - '@storybook/csf': 0.1.7 - '@storybook/csf-tools': 8.1.1 - '@storybook/docs-mdx': 3.1.0-next.0 - '@storybook/global': 5.0.0 - '@storybook/manager': 8.1.1 - '@storybook/manager-api': 8.1.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@storybook/node-logger': 8.1.1 - '@storybook/preview-api': 8.1.1 - '@storybook/telemetry': 8.1.1(encoding@0.1.13)(prettier@3.2.5) - '@storybook/types': 8.1.1 - '@types/detect-port': 1.3.5 - '@types/diff': 5.2.1 - '@types/node': 18.19.33 - '@types/pretty-hrtime': 1.0.3 - '@types/semver': 7.5.8 - better-opn: 3.0.2 - chalk: 4.1.2 - cli-table3: 0.6.5 - compression: 1.7.4 - detect-port: 1.6.1 - diff: 5.2.0 - express: 4.19.2 - fs-extra: 11.2.0 - globby: 14.0.1 - ip: 2.0.1 - lodash: 4.17.21 - open: 8.4.2 - pretty-hrtime: 1.0.3 - prompts: 2.4.2 - read-pkg-up: 7.0.1 + '@storybook/csf': 0.1.11 + '@types/express': 4.17.21 + browser-assert: 1.2.1 + esbuild: 0.21.3 + esbuild-register: 3.6.0(esbuild@0.21.3) + express: 4.21.0 + process: 0.11.10 + recast: 0.23.9 semver: 7.6.2 - telejson: 7.2.0 - tiny-invariant: 1.3.3 - ts-dedent: 2.2.0 util: 0.12.5 - util-deprecate: 1.0.2 - watchpack: 2.4.1 - ws: 8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) + ws: 8.16.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) transitivePeerDependencies: - bufferutil - - encoding - - prettier - - react - - react-dom - supports-color - utf-8-validate - '@storybook/csf-plugin@8.1.1': - dependencies: - '@storybook/csf-tools': 8.1.1 - unplugin: 1.10.1 - transitivePeerDependencies: - - supports-color - - '@storybook/csf-tools@8.1.1': + '@storybook/csf-plugin@8.3.0(storybook@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))': dependencies: - '@babel/generator': 7.24.5 - '@babel/parser': 7.24.5 - '@babel/traverse': 7.24.5 - '@babel/types': 7.24.5 - '@storybook/csf': 0.1.7 - '@storybook/types': 8.1.1 - fs-extra: 11.2.0 - recast: 0.23.7 - ts-dedent: 2.2.0 + storybook: 8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) + unplugin: 1.14.1 transitivePeerDependencies: - - supports-color + - webpack-sources '@storybook/csf@0.0.1': dependencies: lodash: 4.17.21 - '@storybook/csf@0.1.7': + '@storybook/csf@0.1.11': dependencies: type-fest: 2.19.0 - '@storybook/docs-mdx@3.1.0-next.0': {} - - '@storybook/docs-tools@8.1.1(encoding@0.1.13)(prettier@3.2.5)': - dependencies: - '@storybook/core-common': 8.1.1(encoding@0.1.13)(prettier@3.2.5) - '@storybook/core-events': 8.1.1 - '@storybook/preview-api': 8.1.1 - '@storybook/types': 8.1.1 - '@types/doctrine': 0.0.3 - assert: 2.1.0 - doctrine: 3.0.0 - lodash: 4.17.21 - transitivePeerDependencies: - - encoding - - prettier - - supports-color - '@storybook/global@5.0.0': {} - '@storybook/icons@1.2.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@storybook/icons@1.2.10(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) - '@storybook/instrumenter@8.1.1': + '@storybook/instrumenter@8.3.0(storybook@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))': dependencies: - '@storybook/channels': 8.1.1 - '@storybook/client-logger': 8.1.1 - '@storybook/core-events': 8.1.1 '@storybook/global': 5.0.0 - '@storybook/preview-api': 8.1.1 - '@vitest/utils': 1.6.0 + '@vitest/utils': 2.1.1 + storybook: 8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) util: 0.12.5 - '@storybook/manager-api@8.1.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@storybook/channels': 8.1.1 - '@storybook/client-logger': 8.1.1 - '@storybook/core-events': 8.1.1 - '@storybook/csf': 0.1.7 - '@storybook/global': 5.0.0 - '@storybook/icons': 1.2.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@storybook/router': 8.1.1 - '@storybook/theming': 8.1.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@storybook/types': 8.1.1 - dequal: 2.0.3 - lodash: 4.17.21 - memoizerific: 1.11.3 - store2: 2.14.3 - telejson: 7.2.0 - ts-dedent: 2.2.0 - transitivePeerDependencies: - - react - - react-dom - - '@storybook/manager@8.1.1': {} - - '@storybook/node-logger@8.1.1': {} - - '@storybook/preview-api@8.1.1': + '@storybook/manager-api@8.3.0(storybook@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))': dependencies: - '@storybook/channels': 8.1.1 - '@storybook/client-logger': 8.1.1 - '@storybook/core-events': 8.1.1 - '@storybook/csf': 0.1.7 - '@storybook/global': 5.0.0 - '@storybook/types': 8.1.1 - '@types/qs': 6.9.15 - dequal: 2.0.3 - lodash: 4.17.21 - memoizerific: 1.11.3 - qs: 6.12.1 - tiny-invariant: 1.3.3 - ts-dedent: 2.2.0 - util-deprecate: 1.0.2 - - '@storybook/preview@8.1.1': {} + storybook: 8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) - '@storybook/react-dom-shim@8.1.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@storybook/preview-api@8.3.0(storybook@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))': dependencies: - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + storybook: 8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) - '@storybook/router@8.1.1': + '@storybook/react-dom-shim@8.3.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))': dependencies: - '@storybook/client-logger': 8.1.1 - memoizerific: 1.11.3 - qs: 6.12.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + storybook: 8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) - '@storybook/svelte-vite@8.1.1(@babel/core@7.24.5)(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.16)(vite@5.2.11(@types/node@20.12.11)(terser@5.31.0)))(encoding@0.1.13)(postcss-load-config@4.0.2(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.12.11)(typescript@5.4.5)))(postcss@8.4.38)(prettier@3.2.5)(svelte@4.2.16)(typescript@5.4.5)(vite@5.2.11(@types/node@20.12.11)(terser@5.31.0))': + '@storybook/svelte-vite@8.3.0(@babel/core@7.25.2)(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.17)(vite@5.2.11(@types/node@20.12.7)(terser@5.27.2)))(postcss-load-config@4.0.2(postcss@8.4.47)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.5)))(postcss@8.4.47)(storybook@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))(svelte@4.2.17)(typescript@5.4.5)(vite@5.2.11(@types/node@20.12.7)(terser@5.27.2))': dependencies: - '@storybook/builder-vite': 8.1.1(encoding@0.1.13)(prettier@3.2.5)(typescript@5.4.5)(vite@5.2.11(@types/node@20.12.11)(terser@5.31.0)) - '@storybook/node-logger': 8.1.1 - '@storybook/svelte': 8.1.1(encoding@0.1.13)(prettier@3.2.5)(svelte@4.2.16) - '@storybook/types': 8.1.1 - '@sveltejs/vite-plugin-svelte': 3.1.0(svelte@4.2.16)(vite@5.2.11(@types/node@20.12.11)(terser@5.31.0)) + '@storybook/builder-vite': 8.3.0(storybook@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))(typescript@5.4.5)(vite@5.2.11(@types/node@20.12.7)(terser@5.27.2)) + '@storybook/svelte': 8.3.0(storybook@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))(svelte@4.2.17) + '@sveltejs/vite-plugin-svelte': 3.1.0(svelte@4.2.17)(vite@5.2.11(@types/node@20.12.7)(terser@5.27.2)) magic-string: 0.30.10 - svelte: 4.2.16 - svelte-preprocess: 5.1.4(@babel/core@7.24.5)(postcss-load-config@4.0.2(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.12.11)(typescript@5.4.5)))(postcss@8.4.38)(svelte@4.2.16)(typescript@5.4.5) + storybook: 8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) + svelte: 4.2.17 + svelte-preprocess: 5.1.3(@babel/core@7.25.2)(postcss-load-config@4.0.2(postcss@8.4.47)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.5)))(postcss@8.4.47)(svelte@4.2.17)(typescript@5.4.5) sveltedoc-parser: 4.2.1 ts-dedent: 2.2.0 - vite: 5.2.11(@types/node@20.12.11)(terser@5.31.0) + vite: 5.2.11(@types/node@20.12.7)(terser@5.27.2) transitivePeerDependencies: - '@babel/core' - '@preact/preset-vite' - coffeescript - - encoding - less - postcss - postcss-load-config - - prettier - pug - sass - stylus @@ -16096,43 +18535,40 @@ snapshots: - supports-color - typescript - vite-plugin-glimmerx + - webpack-sources - '@storybook/svelte@8.1.1(encoding@0.1.13)(prettier@3.2.5)(svelte@4.2.16)': + '@storybook/svelte@8.3.0(storybook@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))(svelte@4.2.17)': dependencies: - '@storybook/client-logger': 8.1.1 - '@storybook/core-events': 8.1.1 - '@storybook/docs-tools': 8.1.1(encoding@0.1.13)(prettier@3.2.5) + '@storybook/components': 8.3.0(storybook@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3)) '@storybook/global': 5.0.0 - '@storybook/preview-api': 8.1.1 - '@storybook/types': 8.1.1 - svelte: 4.2.16 + '@storybook/manager-api': 8.3.0(storybook@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3)) + '@storybook/preview-api': 8.3.0(storybook@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3)) + '@storybook/theming': 8.3.0(storybook@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3)) + storybook: 8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) + svelte: 4.2.17 sveltedoc-parser: 4.2.1 ts-dedent: 2.2.0 type-fest: 2.19.0 transitivePeerDependencies: - - encoding - - prettier - supports-color - '@storybook/sveltekit@8.1.1(@babel/core@7.24.5)(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.16)(vite@5.2.11(@types/node@20.12.11)(terser@5.31.0)))(encoding@0.1.13)(postcss-load-config@4.0.2(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.12.11)(typescript@5.4.5)))(postcss@8.4.38)(prettier@3.2.5)(svelte@4.2.16)(typescript@5.4.5)(vite@5.2.11(@types/node@20.12.11)(terser@5.31.0))': + '@storybook/sveltekit@8.3.0(@babel/core@7.25.2)(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.17)(vite@5.2.11(@types/node@20.12.7)(terser@5.27.2)))(postcss-load-config@4.0.2(postcss@8.4.47)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.5)))(postcss@8.4.47)(storybook@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))(svelte@4.2.17)(typescript@5.4.5)(vite@5.2.11(@types/node@20.12.7)(terser@5.27.2))': dependencies: - '@storybook/addon-actions': 8.1.1 - '@storybook/builder-vite': 8.1.1(encoding@0.1.13)(prettier@3.2.5)(typescript@5.4.5)(vite@5.2.11(@types/node@20.12.11)(terser@5.31.0)) - '@storybook/svelte': 8.1.1(encoding@0.1.13)(prettier@3.2.5)(svelte@4.2.16) - '@storybook/svelte-vite': 8.1.1(@babel/core@7.24.5)(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.16)(vite@5.2.11(@types/node@20.12.11)(terser@5.31.0)))(encoding@0.1.13)(postcss-load-config@4.0.2(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.12.11)(typescript@5.4.5)))(postcss@8.4.38)(prettier@3.2.5)(svelte@4.2.16)(typescript@5.4.5)(vite@5.2.11(@types/node@20.12.11)(terser@5.31.0)) - '@storybook/types': 8.1.1 - svelte: 4.2.16 - vite: 5.2.11(@types/node@20.12.11)(terser@5.31.0) + '@storybook/addon-actions': 8.3.0(storybook@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3)) + '@storybook/builder-vite': 8.3.0(storybook@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))(typescript@5.4.5)(vite@5.2.11(@types/node@20.12.7)(terser@5.27.2)) + '@storybook/svelte': 8.3.0(storybook@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))(svelte@4.2.17) + '@storybook/svelte-vite': 8.3.0(@babel/core@7.25.2)(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.17)(vite@5.2.11(@types/node@20.12.7)(terser@5.27.2)))(postcss-load-config@4.0.2(postcss@8.4.47)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.5)))(postcss@8.4.47)(storybook@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))(svelte@4.2.17)(typescript@5.4.5)(vite@5.2.11(@types/node@20.12.7)(terser@5.27.2)) + storybook: 8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) + svelte: 4.2.17 + vite: 5.2.11(@types/node@20.12.7)(terser@5.27.2) transitivePeerDependencies: - '@babel/core' - '@preact/preset-vite' - '@sveltejs/vite-plugin-svelte' - coffeescript - - encoding - less - postcss - postcss-load-config - - prettier - pug - sass - stylus @@ -16140,70 +18576,61 @@ snapshots: - supports-color - typescript - vite-plugin-glimmerx + - webpack-sources - '@storybook/telemetry@8.1.1(encoding@0.1.13)(prettier@3.2.5)': + '@storybook/test@8.3.0(storybook@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))': dependencies: - '@storybook/client-logger': 8.1.1 - '@storybook/core-common': 8.1.1(encoding@0.1.13)(prettier@3.2.5) - '@storybook/csf-tools': 8.1.1 - chalk: 4.1.2 - detect-package-manager: 2.0.1 - fetch-retry: 5.0.6 - fs-extra: 11.2.0 - read-pkg-up: 7.0.1 - transitivePeerDependencies: - - encoding - - prettier - - supports-color + '@storybook/csf': 0.1.11 + '@storybook/global': 5.0.0 + '@storybook/instrumenter': 8.3.0(storybook@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3)) + '@testing-library/dom': 10.4.0 + '@testing-library/jest-dom': 6.5.0 + '@testing-library/user-event': 14.5.2(@testing-library/dom@10.4.0) + '@vitest/expect': 2.0.5 + '@vitest/spy': 2.0.5 + storybook: 8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) + util: 0.12.5 - '@storybook/test@8.1.1(@types/jest@29.5.12)(vitest@1.6.0(@types/node@20.12.11)(jsdom@24.0.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))(terser@5.31.0))': + '@storybook/theming@8.3.0(storybook@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))': dependencies: - '@storybook/client-logger': 8.1.1 - '@storybook/core-events': 8.1.1 - '@storybook/instrumenter': 8.1.1 - '@storybook/preview-api': 8.1.1 - '@testing-library/dom': 9.3.4 - '@testing-library/jest-dom': 6.4.5(@types/jest@29.5.12)(vitest@1.6.0(@types/node@20.12.11)(jsdom@24.0.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))(terser@5.31.0)) - '@testing-library/user-event': 14.5.2(@testing-library/dom@9.3.4) - '@vitest/expect': 1.3.1 - '@vitest/spy': 1.6.0 - util: 0.12.5 - transitivePeerDependencies: - - '@jest/globals' - - '@types/bun' - - '@types/jest' - - jest - - vitest + storybook: 8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) - '@storybook/theming@8.1.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@sveltejs/adapter-auto@3.2.0(@sveltejs/kit@2.5.27(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.13)(vite@4.5.3(@types/node@20.12.7)(terser@5.27.2)))(svelte@4.2.13)(vite@4.5.3(@types/node@20.12.7)(terser@5.27.2)))': dependencies: - '@emotion/use-insertion-effect-with-fallbacks': 1.0.1(react@18.3.1) - '@storybook/client-logger': 8.1.1 - '@storybook/global': 5.0.0 - memoizerific: 1.11.3 - optionalDependencies: - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + '@sveltejs/kit': 2.5.27(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.13)(vite@4.5.3(@types/node@20.12.7)(terser@5.27.2)))(svelte@4.2.13)(vite@4.5.3(@types/node@20.12.7)(terser@5.27.2)) + import-meta-resolve: 4.0.0 - '@storybook/types@8.1.1': + '@sveltejs/adapter-auto@3.2.0(@sveltejs/kit@2.5.27(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.13)(vite@5.1.3(@types/node@20.12.7)(terser@5.27.2)))(svelte@4.2.13)(vite@5.1.3(@types/node@20.12.7)(terser@5.27.2)))': dependencies: - '@storybook/channels': 8.1.1 - '@types/express': 4.17.21 - file-system-cache: 2.3.0 + '@sveltejs/kit': 2.5.27(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.13)(vite@5.1.3(@types/node@20.12.7)(terser@5.27.2)))(svelte@4.2.13)(vite@5.1.3(@types/node@20.12.7)(terser@5.27.2)) + import-meta-resolve: 4.0.0 - '@sveltejs/adapter-auto@3.2.0(@sveltejs/kit@2.5.7(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.16)(vite@4.5.3(@types/node@20.12.11)(terser@5.31.0)))(svelte@4.2.16)(vite@4.5.3(@types/node@20.12.11)(terser@5.31.0)))': + '@sveltejs/adapter-auto@3.2.0(@sveltejs/kit@2.5.27(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.17)(vite@5.2.11(@types/node@20.12.7)(terser@5.27.2)))(svelte@4.2.17)(vite@5.2.11(@types/node@20.12.7)(terser@5.27.2)))': dependencies: - '@sveltejs/kit': 2.5.7(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.16)(vite@4.5.3(@types/node@20.12.11)(terser@5.31.0)))(svelte@4.2.16)(vite@4.5.3(@types/node@20.12.11)(terser@5.31.0)) - import-meta-resolve: 4.1.0 + '@sveltejs/kit': 2.5.27(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.17)(vite@5.2.11(@types/node@20.12.7)(terser@5.27.2)))(svelte@4.2.17)(vite@5.2.11(@types/node@20.12.7)(terser@5.27.2)) + import-meta-resolve: 4.0.0 - '@sveltejs/adapter-auto@3.2.0(@sveltejs/kit@2.5.7(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.16)(vite@5.2.11(@types/node@20.12.11)(terser@5.31.0)))(svelte@4.2.16)(vite@5.2.11(@types/node@20.12.11)(terser@5.31.0)))': + '@sveltejs/kit@2.5.27(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.13)(vite@4.5.3(@types/node@20.12.7)(terser@5.27.2)))(svelte@4.2.13)(vite@4.5.3(@types/node@20.12.7)(terser@5.27.2))': dependencies: - '@sveltejs/kit': 2.5.7(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.16)(vite@5.2.11(@types/node@20.12.11)(terser@5.31.0)))(svelte@4.2.16)(vite@5.2.11(@types/node@20.12.11)(terser@5.31.0)) + '@sveltejs/vite-plugin-svelte': 3.1.0(svelte@4.2.13)(vite@4.5.3(@types/node@20.12.7)(terser@5.27.2)) + '@types/cookie': 0.6.0 + cookie: 0.6.0 + devalue: 5.0.0 + esm-env: 1.0.0 import-meta-resolve: 4.1.0 + kleur: 4.1.5 + magic-string: 0.30.10 + mrmime: 2.0.0 + sade: 1.8.1 + set-cookie-parser: 2.6.0 + sirv: 2.0.4 + svelte: 4.2.13 + tiny-glob: 0.2.9 + vite: 4.5.3(@types/node@20.12.7)(terser@5.27.2) - '@sveltejs/kit@2.5.7(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.16)(vite@4.5.3(@types/node@20.12.11)(terser@5.31.0)))(svelte@4.2.16)(vite@4.5.3(@types/node@20.12.11)(terser@5.31.0))': + '@sveltejs/kit@2.5.27(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.13)(vite@5.1.3(@types/node@20.12.7)(terser@5.27.2)))(svelte@4.2.13)(vite@5.1.3(@types/node@20.12.7)(terser@5.27.2))': dependencies: - '@sveltejs/vite-plugin-svelte': 3.1.0(svelte@4.2.16)(vite@4.5.3(@types/node@20.12.11)(terser@5.31.0)) + '@sveltejs/vite-plugin-svelte': 3.1.0(svelte@4.2.13)(vite@5.1.3(@types/node@20.12.7)(terser@5.27.2)) '@types/cookie': 0.6.0 cookie: 0.6.0 devalue: 5.0.0 @@ -16215,13 +18642,13 @@ snapshots: sade: 1.8.1 set-cookie-parser: 2.6.0 sirv: 2.0.4 - svelte: 4.2.16 + svelte: 4.2.13 tiny-glob: 0.2.9 - vite: 4.5.3(@types/node@20.12.11)(terser@5.31.0) + vite: 5.1.3(@types/node@20.12.7)(terser@5.27.2) - '@sveltejs/kit@2.5.7(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.16)(vite@5.2.11(@types/node@20.12.11)(terser@5.31.0)))(svelte@4.2.16)(vite@5.2.11(@types/node@20.12.11)(terser@5.31.0))': + '@sveltejs/kit@2.5.27(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.17)(vite@5.2.11(@types/node@20.12.7)(terser@5.27.2)))(svelte@4.2.17)(vite@5.2.11(@types/node@20.12.7)(terser@5.27.2))': dependencies: - '@sveltejs/vite-plugin-svelte': 3.1.0(svelte@4.2.16)(vite@5.2.11(@types/node@20.12.11)(terser@5.31.0)) + '@sveltejs/vite-plugin-svelte': 3.1.0(svelte@4.2.17)(vite@5.2.11(@types/node@20.12.7)(terser@5.27.2)) '@types/cookie': 0.6.0 cookie: 0.6.0 devalue: 5.0.0 @@ -16233,104 +18660,127 @@ snapshots: sade: 1.8.1 set-cookie-parser: 2.6.0 sirv: 2.0.4 - svelte: 4.2.16 + svelte: 4.2.17 tiny-glob: 0.2.9 - vite: 5.2.11(@types/node@20.12.11)(terser@5.31.0) + vite: 5.2.11(@types/node@20.12.7)(terser@5.27.2) - '@sveltejs/package@2.3.1(svelte@4.2.16)(typescript@5.4.5)': + '@sveltejs/package@2.3.5(svelte@4.2.17)(typescript@5.4.5)': dependencies: - chokidar: 3.6.0 + chokidar: 4.0.0 kleur: 4.1.5 sade: 1.8.1 semver: 7.6.2 - svelte: 4.2.16 - svelte2tsx: 0.7.8(svelte@4.2.16)(typescript@5.4.5) + svelte: 4.2.17 + svelte2tsx: 0.7.19(svelte@4.2.17)(typescript@5.4.5) transitivePeerDependencies: - typescript - '@sveltejs/vite-plugin-svelte-inspector@2.1.0(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.16)(vite@4.5.3(@types/node@20.12.11)(terser@5.31.0)))(svelte@4.2.16)(vite@4.5.3(@types/node@20.12.11)(terser@5.31.0))': + '@sveltejs/vite-plugin-svelte-inspector@2.0.0(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.13)(vite@4.5.3(@types/node@20.12.7)(terser@5.27.2)))(svelte@4.2.13)(vite@4.5.3(@types/node@20.12.7)(terser@5.27.2))': + dependencies: + '@sveltejs/vite-plugin-svelte': 3.1.0(svelte@4.2.13)(vite@4.5.3(@types/node@20.12.7)(terser@5.27.2)) + debug: 4.3.4 + svelte: 4.2.13 + vite: 4.5.3(@types/node@20.12.7)(terser@5.27.2) + transitivePeerDependencies: + - supports-color + + '@sveltejs/vite-plugin-svelte-inspector@2.0.0(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.13)(vite@5.1.3(@types/node@20.12.7)(terser@5.27.2)))(svelte@4.2.13)(vite@5.1.3(@types/node@20.12.7)(terser@5.27.2))': dependencies: - '@sveltejs/vite-plugin-svelte': 3.1.0(svelte@4.2.16)(vite@4.5.3(@types/node@20.12.11)(terser@5.31.0)) + '@sveltejs/vite-plugin-svelte': 3.1.0(svelte@4.2.13)(vite@5.1.3(@types/node@20.12.7)(terser@5.27.2)) debug: 4.3.4 - svelte: 4.2.16 - vite: 4.5.3(@types/node@20.12.11)(terser@5.31.0) + svelte: 4.2.13 + vite: 5.1.3(@types/node@20.12.7)(terser@5.27.2) transitivePeerDependencies: - supports-color - '@sveltejs/vite-plugin-svelte-inspector@2.1.0(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.16)(vite@5.2.11(@types/node@20.12.11)(terser@5.31.0)))(svelte@4.2.16)(vite@5.2.11(@types/node@20.12.11)(terser@5.31.0))': + '@sveltejs/vite-plugin-svelte-inspector@2.0.0(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.17)(vite@5.2.11(@types/node@20.12.7)(terser@5.27.2)))(svelte@4.2.17)(vite@5.2.11(@types/node@20.12.7)(terser@5.27.2))': dependencies: - '@sveltejs/vite-plugin-svelte': 3.1.0(svelte@4.2.16)(vite@5.2.11(@types/node@20.12.11)(terser@5.31.0)) + '@sveltejs/vite-plugin-svelte': 3.1.0(svelte@4.2.17)(vite@5.2.11(@types/node@20.12.7)(terser@5.27.2)) debug: 4.3.4 - svelte: 4.2.16 - vite: 5.2.11(@types/node@20.12.11)(terser@5.31.0) + svelte: 4.2.17 + vite: 5.2.11(@types/node@20.12.7)(terser@5.27.2) transitivePeerDependencies: - supports-color - '@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.16)(vite@4.5.3(@types/node@20.12.11)(terser@5.31.0))': + '@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.13)(vite@4.5.3(@types/node@20.12.7)(terser@5.27.2))': dependencies: - '@sveltejs/vite-plugin-svelte-inspector': 2.1.0(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.16)(vite@4.5.3(@types/node@20.12.11)(terser@5.31.0)))(svelte@4.2.16)(vite@4.5.3(@types/node@20.12.11)(terser@5.31.0)) + '@sveltejs/vite-plugin-svelte-inspector': 2.0.0(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.13)(vite@4.5.3(@types/node@20.12.7)(terser@5.27.2)))(svelte@4.2.13)(vite@4.5.3(@types/node@20.12.7)(terser@5.27.2)) debug: 4.3.4 deepmerge: 4.3.1 kleur: 4.1.5 - magic-string: 0.30.10 - svelte: 4.2.16 - svelte-hmr: 0.16.0(svelte@4.2.16) - vite: 4.5.3(@types/node@20.12.11)(terser@5.31.0) - vitefu: 0.2.5(vite@4.5.3(@types/node@20.12.11)(terser@5.31.0)) + magic-string: 0.30.9 + svelte: 4.2.13 + svelte-hmr: 0.16.0(svelte@4.2.13) + vite: 4.5.3(@types/node@20.12.7)(terser@5.27.2) + vitefu: 0.2.5(vite@4.5.3(@types/node@20.12.7)(terser@5.27.2)) transitivePeerDependencies: - supports-color - '@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.16)(vite@5.2.11(@types/node@20.12.11)(terser@5.31.0))': + '@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.13)(vite@5.1.3(@types/node@20.12.7)(terser@5.27.2))': dependencies: - '@sveltejs/vite-plugin-svelte-inspector': 2.1.0(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.16)(vite@5.2.11(@types/node@20.12.11)(terser@5.31.0)))(svelte@4.2.16)(vite@5.2.11(@types/node@20.12.11)(terser@5.31.0)) + '@sveltejs/vite-plugin-svelte-inspector': 2.0.0(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.13)(vite@5.1.3(@types/node@20.12.7)(terser@5.27.2)))(svelte@4.2.13)(vite@5.1.3(@types/node@20.12.7)(terser@5.27.2)) debug: 4.3.4 deepmerge: 4.3.1 kleur: 4.1.5 - magic-string: 0.30.10 - svelte: 4.2.16 - svelte-hmr: 0.16.0(svelte@4.2.16) - vite: 5.2.11(@types/node@20.12.11)(terser@5.31.0) - vitefu: 0.2.5(vite@5.2.11(@types/node@20.12.11)(terser@5.31.0)) + magic-string: 0.30.9 + svelte: 4.2.13 + svelte-hmr: 0.16.0(svelte@4.2.13) + vite: 5.1.3(@types/node@20.12.7)(terser@5.27.2) + vitefu: 0.2.5(vite@5.1.3(@types/node@20.12.7)(terser@5.27.2)) + transitivePeerDependencies: + - supports-color + + '@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.17)(vite@5.2.11(@types/node@20.12.7)(terser@5.27.2))': + dependencies: + '@sveltejs/vite-plugin-svelte-inspector': 2.0.0(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.17)(vite@5.2.11(@types/node@20.12.7)(terser@5.27.2)))(svelte@4.2.17)(vite@5.2.11(@types/node@20.12.7)(terser@5.27.2)) + debug: 4.3.4 + deepmerge: 4.3.1 + kleur: 4.1.5 + magic-string: 0.30.9 + svelte: 4.2.17 + svelte-hmr: 0.16.0(svelte@4.2.17) + vite: 5.2.11(@types/node@20.12.7)(terser@5.27.2) + vitefu: 0.2.5(vite@5.2.11(@types/node@20.12.7)(terser@5.27.2)) transitivePeerDependencies: - supports-color + '@szmarczak/http-timer@4.0.6': + dependencies: + defer-to-connect: 2.0.1 + '@szmarczak/http-timer@5.0.1': dependencies: defer-to-connect: 2.0.1 - '@tailwindcss/nesting@0.0.0-insiders.565cd3e(postcss@8.4.38)': + '@tailwindcss/nesting@0.0.0-insiders.565cd3e(postcss@8.4.39)': dependencies: - postcss: 8.4.38 - postcss-nested: 5.0.6(postcss@8.4.38) + postcss: 8.4.39 + postcss-nested: 5.0.6(postcss@8.4.39) - '@testing-library/dom@9.3.4': + '@testing-library/dom@10.4.0': dependencies: '@babel/code-frame': 7.24.2 - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.23.9 '@types/aria-query': 5.0.4 - aria-query: 5.1.3 + aria-query: 5.3.0 chalk: 4.1.2 dom-accessibility-api: 0.5.16 lz-string: 1.5.0 pretty-format: 27.5.1 - '@testing-library/jest-dom@6.4.5(@types/jest@29.5.12)(vitest@1.6.0(@types/node@20.12.11)(jsdom@24.0.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))(terser@5.31.0))': + '@testing-library/jest-dom@6.5.0': dependencies: - '@adobe/css-tools': 4.3.3 - '@babel/runtime': 7.24.5 + '@adobe/css-tools': 4.4.0 aria-query: 5.3.0 chalk: 3.0.0 css.escape: 1.5.1 dom-accessibility-api: 0.6.3 lodash: 4.17.21 redent: 3.0.0 - optionalDependencies: - '@types/jest': 29.5.12 - vitest: 1.6.0(@types/node@20.12.11)(jsdom@24.0.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))(terser@5.31.0) - '@testing-library/user-event@14.5.2(@testing-library/dom@9.3.4)': + '@testing-library/user-event@14.5.2(@testing-library/dom@10.4.0)': dependencies: - '@testing-library/dom': 9.3.4 + '@testing-library/dom': 10.4.0 '@ts-morph/common@0.20.0': dependencies: @@ -16339,7 +18789,7 @@ snapshots: mkdirp: 2.1.6 path-browserify: 1.0.1 - '@tsconfig/node10@1.0.11': {} + '@tsconfig/node10@1.0.9': {} '@tsconfig/node12@1.0.11': {} @@ -16356,63 +18806,65 @@ snapshots: '@types/babel__core@7.20.5': dependencies: '@babel/parser': 7.24.5 - '@babel/types': 7.24.5 + '@babel/types': 7.25.6 '@types/babel__generator': 7.6.8 '@types/babel__template': 7.4.4 - '@types/babel__traverse': 7.20.5 + '@types/babel__traverse': 7.20.6 '@types/babel__generator@7.6.8': dependencies: - '@babel/types': 7.24.5 + '@babel/types': 7.25.6 '@types/babel__template@7.4.4': dependencies: '@babel/parser': 7.24.5 - '@babel/types': 7.24.5 + '@babel/types': 7.25.6 + + '@types/babel__traverse@7.20.6': + dependencies: + '@babel/types': 7.25.6 - '@types/babel__traverse@7.20.5': + '@types/bn.js@4.11.6': dependencies: - '@babel/types': 7.24.5 + '@types/node': 20.12.7 '@types/bn.js@5.1.5': dependencies: - '@types/node': 20.12.11 + '@types/node': 20.12.7 '@types/body-parser@1.19.5': dependencies: '@types/connect': 3.4.38 - '@types/node': 20.12.11 + '@types/node': 20.12.7 - '@types/connect@3.4.38': + '@types/cacheable-request@6.0.3': dependencies: - '@types/node': 20.12.11 + '@types/http-cache-semantics': 4.0.4 + '@types/keyv': 3.1.4 + '@types/node': 20.12.7 + '@types/responselike': 1.0.3 - '@types/cookie@0.6.0': {} + '@types/chrome@0.0.136': + dependencies: + '@types/filesystem': 0.0.35 + '@types/har-format': 1.2.15 - '@types/cross-spawn@6.0.6': + '@types/connect@3.4.38': dependencies: - '@types/node': 20.12.11 + '@types/node': 20.12.7 + + '@types/cookie@0.6.0': {} '@types/debug@4.1.12': dependencies: '@types/ms': 0.7.34 - '@types/detect-port@1.3.5': {} - - '@types/diff@5.2.1': {} - '@types/dns-packet@5.6.5': dependencies: - '@types/node': 20.12.11 - - '@types/doctrine@0.0.3': {} + '@types/node': 20.12.7 '@types/dom-screen-wake-lock@1.0.3': {} - '@types/ejs@3.1.5': {} - - '@types/emscripten@1.39.12': {} - '@types/eslint@8.56.10': dependencies: '@types/estree': 1.0.5 @@ -16424,22 +18876,30 @@ snapshots: '@types/estree@1.0.5': {} - '@types/express-serve-static-core@4.19.0': + '@types/express-serve-static-core@4.19.5': dependencies: - '@types/node': 20.12.11 - '@types/qs': 6.9.15 + '@types/node': 20.12.7 + '@types/qs': 6.9.16 '@types/range-parser': 1.2.7 '@types/send': 0.17.4 '@types/express@4.17.21': dependencies: '@types/body-parser': 1.19.5 - '@types/express-serve-static-core': 4.19.0 - '@types/qs': 6.9.15 + '@types/express-serve-static-core': 4.19.5 + '@types/qs': 6.9.16 '@types/serve-static': 1.15.7 + '@types/filesystem@0.0.35': + dependencies: + '@types/filewriter': 0.0.33 + + '@types/filewriter@0.0.33': {} + '@types/find-cache-dir@3.2.1': {} + '@types/har-format@1.2.15': {} + '@types/hast@3.0.4': dependencies: '@types/unist': 3.0.2 @@ -16467,7 +18927,13 @@ snapshots: '@types/json5@0.0.29': {} - '@types/lodash@4.17.4': {} + '@types/keyv@3.1.4': + dependencies: + '@types/node': 20.12.7 + + '@types/lodash@4.17.7': {} + + '@types/lru-cache@5.1.1': {} '@types/mdast@4.0.4': dependencies: @@ -16481,66 +18947,68 @@ snapshots: '@types/ms@0.7.34': {} - '@types/nlcst@1.0.4': + '@types/nlcst@2.0.3': dependencies: - '@types/unist': 2.0.10 + '@types/unist': 3.0.2 - '@types/node-forge@1.3.11': - dependencies: - '@types/node': 20.12.11 + '@types/node@12.20.55': {} '@types/node@17.0.45': {} - '@types/node@18.19.33': + '@types/node@18.15.13': {} + + '@types/node@18.19.31': dependencies: undici-types: 5.26.5 - '@types/node@20.12.11': + '@types/node@20.12.7': dependencies: undici-types: 5.26.5 - '@types/normalize-package-data@2.4.4': {} - '@types/object-hash@3.0.6': {} + '@types/parse-json@4.0.2': {} + '@types/pbkdf2@3.1.2': dependencies: - '@types/node': 20.12.11 - - '@types/pretty-hrtime@1.0.3': {} + '@types/node': 20.12.7 '@types/prop-types@15.7.12': {} '@types/pug@2.0.10': {} - '@types/qs@6.9.15': {} + '@types/qs@6.9.16': {} '@types/range-parser@1.2.7': {} - '@types/react@18.3.2': + '@types/react@18.3.5': dependencies: '@types/prop-types': 15.7.12 csstype: 3.1.3 + '@types/responselike@1.0.3': + dependencies: + '@types/node': 20.12.7 + '@types/sax@1.2.7': dependencies: - '@types/node': 20.12.11 + '@types/node': 20.12.7 '@types/secp256k1@4.0.6': dependencies: - '@types/node': 20.12.11 + '@types/node': 20.12.7 - '@types/semver@7.5.8': {} + '@types/semver@7.5.7': {} '@types/send@0.17.4': dependencies: '@types/mime': 1.3.5 - '@types/node': 20.12.11 + '@types/node': 20.12.7 '@types/serve-static@1.15.7': dependencies: '@types/http-errors': 2.0.4 - '@types/node': 20.12.11 + '@types/node': 20.12.7 '@types/send': 0.17.4 '@types/stack-utils@2.0.3': {} @@ -16551,6 +19019,8 @@ snapshots: '@types/unist@3.0.2': {} + '@types/uuid@10.0.0': {} + '@types/uuid@9.0.8': {} '@types/yargs-parser@21.0.3': {} @@ -16563,34 +19033,129 @@ snapshots: dependencies: '@types/yargs-parser': 21.0.3 - '@typescript-eslint/eslint-plugin@7.8.0(@typescript-eslint/parser@7.8.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5)': + '@typescript-eslint/eslint-plugin@7.4.0(@typescript-eslint/parser@7.7.0(eslint@8.55.0)(typescript@5.4.3))(eslint@8.55.0)(typescript@5.4.3)': dependencies: '@eslint-community/regexpp': 4.10.0 - '@typescript-eslint/parser': 7.8.0(eslint@8.57.0)(typescript@5.4.5) - '@typescript-eslint/scope-manager': 7.8.0 - '@typescript-eslint/type-utils': 7.8.0(eslint@8.57.0)(typescript@5.4.5) - '@typescript-eslint/utils': 7.8.0(eslint@8.57.0)(typescript@5.4.5) - '@typescript-eslint/visitor-keys': 7.8.0 + '@typescript-eslint/parser': 7.7.0(eslint@8.55.0)(typescript@5.4.3) + '@typescript-eslint/scope-manager': 7.4.0 + '@typescript-eslint/type-utils': 7.4.0(eslint@8.55.0)(typescript@5.4.3) + '@typescript-eslint/utils': 7.4.0(eslint@8.55.0)(typescript@5.4.3) + '@typescript-eslint/visitor-keys': 7.4.0 debug: 4.3.4 - eslint: 8.57.0 + eslint: 8.55.0 + graphemer: 1.4.0 + ignore: 5.3.1 + natural-compare: 1.4.0 + semver: 7.6.0 + ts-api-utils: 1.2.1(typescript@5.4.3) + optionalDependencies: + typescript: 5.4.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/eslint-plugin@7.4.0(@typescript-eslint/parser@7.7.0(eslint@8.56.0)(typescript@5.4.3))(eslint@8.56.0)(typescript@5.4.3)': + dependencies: + '@eslint-community/regexpp': 4.10.0 + '@typescript-eslint/parser': 7.7.0(eslint@8.56.0)(typescript@5.4.3) + '@typescript-eslint/scope-manager': 7.4.0 + '@typescript-eslint/type-utils': 7.4.0(eslint@8.56.0)(typescript@5.4.3) + '@typescript-eslint/utils': 7.4.0(eslint@8.56.0)(typescript@5.4.3) + '@typescript-eslint/visitor-keys': 7.4.0 + debug: 4.3.4 + eslint: 8.56.0 + graphemer: 1.4.0 + ignore: 5.3.1 + natural-compare: 1.4.0 + semver: 7.6.0 + ts-api-utils: 1.2.1(typescript@5.4.3) + optionalDependencies: + typescript: 5.4.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/eslint-plugin@7.9.0(@typescript-eslint/parser@7.9.0(eslint@8.56.0)(typescript@5.4.3))(eslint@8.56.0)(typescript@5.4.3)': + dependencies: + '@eslint-community/regexpp': 4.10.0 + '@typescript-eslint/parser': 7.9.0(eslint@8.56.0)(typescript@5.4.3) + '@typescript-eslint/scope-manager': 7.9.0 + '@typescript-eslint/type-utils': 7.9.0(eslint@8.56.0)(typescript@5.4.3) + '@typescript-eslint/utils': 7.9.0(eslint@8.56.0)(typescript@5.4.3) + '@typescript-eslint/visitor-keys': 7.9.0 + eslint: 8.56.0 + graphemer: 1.4.0 + ignore: 5.3.1 + natural-compare: 1.4.0 + ts-api-utils: 1.3.0(typescript@5.4.3) + optionalDependencies: + typescript: 5.4.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/eslint-plugin@7.9.0(@typescript-eslint/parser@7.9.0(eslint@8.56.0)(typescript@5.4.5))(eslint@8.56.0)(typescript@5.4.5)': + dependencies: + '@eslint-community/regexpp': 4.10.0 + '@typescript-eslint/parser': 7.9.0(eslint@8.56.0)(typescript@5.4.5) + '@typescript-eslint/scope-manager': 7.9.0 + '@typescript-eslint/type-utils': 7.9.0(eslint@8.56.0)(typescript@5.4.5) + '@typescript-eslint/utils': 7.9.0(eslint@8.56.0)(typescript@5.4.5) + '@typescript-eslint/visitor-keys': 7.9.0 + eslint: 8.56.0 graphemer: 1.4.0 ignore: 5.3.1 natural-compare: 1.4.0 - semver: 7.6.2 ts-api-utils: 1.3.0(typescript@5.4.5) optionalDependencies: typescript: 5.4.5 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@7.8.0(eslint@8.57.0)(typescript@5.4.5)': + '@typescript-eslint/parser@7.7.0(eslint@8.55.0)(typescript@5.4.3)': + dependencies: + '@typescript-eslint/scope-manager': 7.7.0 + '@typescript-eslint/types': 7.7.0 + '@typescript-eslint/typescript-estree': 7.7.0(typescript@5.4.3) + '@typescript-eslint/visitor-keys': 7.7.0 + debug: 4.3.4 + eslint: 8.55.0 + optionalDependencies: + typescript: 5.4.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@7.7.0(eslint@8.56.0)(typescript@5.4.3)': + dependencies: + '@typescript-eslint/scope-manager': 7.7.0 + '@typescript-eslint/types': 7.7.0 + '@typescript-eslint/typescript-estree': 7.7.0(typescript@5.4.3) + '@typescript-eslint/visitor-keys': 7.7.0 + debug: 4.3.4 + eslint: 8.56.0 + optionalDependencies: + typescript: 5.4.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@7.9.0(eslint@8.56.0)(typescript@5.4.3)': + dependencies: + '@typescript-eslint/scope-manager': 7.9.0 + '@typescript-eslint/types': 7.9.0 + '@typescript-eslint/typescript-estree': 7.9.0(typescript@5.4.3) + '@typescript-eslint/visitor-keys': 7.9.0 + debug: 4.3.4 + eslint: 8.56.0 + optionalDependencies: + typescript: 5.4.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@7.9.0(eslint@8.56.0)(typescript@5.4.5)': dependencies: - '@typescript-eslint/scope-manager': 7.8.0 - '@typescript-eslint/types': 7.8.0 - '@typescript-eslint/typescript-estree': 7.8.0(typescript@5.4.5) - '@typescript-eslint/visitor-keys': 7.8.0 + '@typescript-eslint/scope-manager': 7.9.0 + '@typescript-eslint/types': 7.9.0 + '@typescript-eslint/typescript-estree': 7.9.0(typescript@5.4.5) + '@typescript-eslint/visitor-keys': 7.9.0 debug: 4.3.4 - eslint: 8.57.0 + eslint: 8.56.0 optionalDependencies: typescript: 5.4.5 transitivePeerDependencies: @@ -16601,17 +19166,63 @@ snapshots: '@typescript-eslint/types': 5.62.0 '@typescript-eslint/visitor-keys': 5.62.0 - '@typescript-eslint/scope-manager@7.8.0': + '@typescript-eslint/scope-manager@7.4.0': + dependencies: + '@typescript-eslint/types': 7.4.0 + '@typescript-eslint/visitor-keys': 7.4.0 + + '@typescript-eslint/scope-manager@7.7.0': + dependencies: + '@typescript-eslint/types': 7.7.0 + '@typescript-eslint/visitor-keys': 7.7.0 + + '@typescript-eslint/scope-manager@7.9.0': + dependencies: + '@typescript-eslint/types': 7.9.0 + '@typescript-eslint/visitor-keys': 7.9.0 + + '@typescript-eslint/type-utils@7.4.0(eslint@8.55.0)(typescript@5.4.3)': + dependencies: + '@typescript-eslint/typescript-estree': 7.4.0(typescript@5.4.3) + '@typescript-eslint/utils': 7.4.0(eslint@8.55.0)(typescript@5.4.3) + debug: 4.3.4 + eslint: 8.55.0 + ts-api-utils: 1.2.1(typescript@5.4.3) + optionalDependencies: + typescript: 5.4.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/type-utils@7.4.0(eslint@8.56.0)(typescript@5.4.3)': dependencies: - '@typescript-eslint/types': 7.8.0 - '@typescript-eslint/visitor-keys': 7.8.0 + '@typescript-eslint/typescript-estree': 7.4.0(typescript@5.4.3) + '@typescript-eslint/utils': 7.4.0(eslint@8.56.0)(typescript@5.4.3) + debug: 4.3.4 + eslint: 8.56.0 + ts-api-utils: 1.2.1(typescript@5.4.3) + optionalDependencies: + typescript: 5.4.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/type-utils@7.9.0(eslint@8.56.0)(typescript@5.4.3)': + dependencies: + '@typescript-eslint/typescript-estree': 7.9.0(typescript@5.4.3) + '@typescript-eslint/utils': 7.9.0(eslint@8.56.0)(typescript@5.4.3) + debug: 4.3.4 + eslint: 8.56.0 + ts-api-utils: 1.3.0(typescript@5.4.3) + optionalDependencies: + typescript: 5.4.3 + transitivePeerDependencies: + - supports-color - '@typescript-eslint/type-utils@7.8.0(eslint@8.57.0)(typescript@5.4.5)': + '@typescript-eslint/type-utils@7.9.0(eslint@8.56.0)(typescript@5.4.5)': dependencies: - '@typescript-eslint/typescript-estree': 7.8.0(typescript@5.4.5) - '@typescript-eslint/utils': 7.8.0(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/typescript-estree': 7.9.0(typescript@5.4.5) + '@typescript-eslint/utils': 7.9.0(eslint@8.56.0)(typescript@5.4.5) debug: 4.3.4 - eslint: 8.57.0 + eslint: 8.56.0 ts-api-utils: 1.3.0(typescript@5.4.5) optionalDependencies: typescript: 5.4.5 @@ -16620,101 +19231,225 @@ snapshots: '@typescript-eslint/types@5.62.0': {} - '@typescript-eslint/types@7.8.0': {} + '@typescript-eslint/types@7.4.0': {} + + '@typescript-eslint/types@7.7.0': {} + + '@typescript-eslint/types@7.9.0': {} - '@typescript-eslint/typescript-estree@5.62.0(typescript@5.4.5)': + '@typescript-eslint/typescript-estree@5.62.0(typescript@5.4.3)': dependencies: '@typescript-eslint/types': 5.62.0 '@typescript-eslint/visitor-keys': 5.62.0 - debug: 4.3.4 + debug: 4.3.7(supports-color@8.1.1) globby: 11.1.0 is-glob: 4.0.3 - semver: 7.6.2 + semver: 7.6.3 + tsutils: 3.21.0(typescript@5.4.3) + optionalDependencies: + typescript: 5.4.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/typescript-estree@5.62.0(typescript@5.5.3)': + dependencies: + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/visitor-keys': 5.62.0 + debug: 4.3.7(supports-color@8.1.1) + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.6.3 tsutils: 3.21.0(typescript@5.4.5) optionalDependencies: typescript: 5.4.5 transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@7.8.0(typescript@5.4.5)': + '@typescript-eslint/typescript-estree@7.4.0(typescript@5.4.3)': + dependencies: + '@typescript-eslint/types': 7.4.0 + '@typescript-eslint/visitor-keys': 7.4.0 + debug: 4.3.7(supports-color@8.1.1) + globby: 11.1.0 + is-glob: 4.0.3 + minimatch: 9.0.3 + semver: 7.6.3 + ts-api-utils: 1.3.0(typescript@5.4.3) + optionalDependencies: + typescript: 5.4.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/typescript-estree@7.7.0(typescript@5.4.3)': + dependencies: + '@typescript-eslint/types': 7.7.0 + '@typescript-eslint/visitor-keys': 7.7.0 + debug: 4.3.4 + globby: 11.1.0 + is-glob: 4.0.3 + minimatch: 9.0.4 + semver: 7.6.0 + ts-api-utils: 1.3.0(typescript@5.4.3) + optionalDependencies: + typescript: 5.4.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/typescript-estree@7.9.0(typescript@5.4.3)': dependencies: - '@typescript-eslint/types': 7.8.0 - '@typescript-eslint/visitor-keys': 7.8.0 + '@typescript-eslint/types': 7.9.0 + '@typescript-eslint/visitor-keys': 7.9.0 debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.4 semver: 7.6.2 - ts-api-utils: 1.3.0(typescript@5.4.5) + ts-api-utils: 1.3.0(typescript@5.4.3) optionalDependencies: - typescript: 5.4.5 + typescript: 5.4.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/typescript-estree@7.9.0(typescript@5.4.5)': + dependencies: + '@typescript-eslint/types': 7.9.0 + '@typescript-eslint/visitor-keys': 7.9.0 + debug: 4.3.4 + globby: 11.1.0 + is-glob: 4.0.3 + minimatch: 9.0.5 + semver: 7.6.2 + ts-api-utils: 1.3.0(typescript@5.5.3) + typescript: 5.5.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@5.62.0(eslint@8.56.0)(typescript@5.4.3)': + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0) + '@types/json-schema': 7.0.15 + '@types/semver': 7.5.7 + '@typescript-eslint/scope-manager': 5.62.0 + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.4.3) + eslint: 8.56.0 + eslint-scope: 5.1.1 + semver: 7.6.2 transitivePeerDependencies: - supports-color + - typescript - '@typescript-eslint/utils@5.62.0(eslint@8.57.0)(typescript@5.4.5)': + '@typescript-eslint/utils@5.62.0(eslint@8.56.0)(typescript@5.4.5)': dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0) '@types/json-schema': 7.0.15 - '@types/semver': 7.5.8 + '@types/semver': 7.5.7 '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/types': 5.62.0 '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.4.5) - eslint: 8.57.0 + eslint: 8.56.0 eslint-scope: 5.1.1 semver: 7.6.2 transitivePeerDependencies: - supports-color - typescript - '@typescript-eslint/utils@7.8.0(eslint@8.57.0)(typescript@5.4.5)': + '@typescript-eslint/utils@7.4.0(eslint@8.55.0)(typescript@5.4.3)': + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.55.0) + '@types/json-schema': 7.0.15 + '@types/semver': 7.5.7 + '@typescript-eslint/scope-manager': 7.4.0 + '@typescript-eslint/types': 7.4.0 + '@typescript-eslint/typescript-estree': 7.4.0(typescript@5.4.3) + eslint: 8.55.0 + semver: 7.6.2 + transitivePeerDependencies: + - supports-color + - typescript + + '@typescript-eslint/utils@7.4.0(eslint@8.56.0)(typescript@5.4.3)': dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0) '@types/json-schema': 7.0.15 - '@types/semver': 7.5.8 - '@typescript-eslint/scope-manager': 7.8.0 - '@typescript-eslint/types': 7.8.0 - '@typescript-eslint/typescript-estree': 7.8.0(typescript@5.4.5) - eslint: 8.57.0 + '@types/semver': 7.5.7 + '@typescript-eslint/scope-manager': 7.4.0 + '@typescript-eslint/types': 7.4.0 + '@typescript-eslint/typescript-estree': 7.4.0(typescript@5.4.3) + eslint: 8.56.0 semver: 7.6.2 transitivePeerDependencies: - supports-color - typescript + '@typescript-eslint/utils@7.9.0(eslint@8.56.0)(typescript@5.4.3)': + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0) + '@typescript-eslint/scope-manager': 7.9.0 + '@typescript-eslint/types': 7.9.0 + '@typescript-eslint/typescript-estree': 7.9.0(typescript@5.4.3) + eslint: 8.56.0 + transitivePeerDependencies: + - supports-color + - typescript + + '@typescript-eslint/utils@7.9.0(eslint@8.56.0)(typescript@5.4.5)': + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0) + '@typescript-eslint/scope-manager': 7.9.0 + '@typescript-eslint/types': 7.9.0 + '@typescript-eslint/typescript-estree': 7.9.0(typescript@5.4.5) + eslint: 8.56.0 + transitivePeerDependencies: + - supports-color + - typescript + '@typescript-eslint/visitor-keys@5.62.0': dependencies: '@typescript-eslint/types': 5.62.0 eslint-visitor-keys: 3.4.3 - '@typescript-eslint/visitor-keys@7.8.0': + '@typescript-eslint/visitor-keys@7.4.0': + dependencies: + '@typescript-eslint/types': 7.4.0 + eslint-visitor-keys: 3.4.3 + + '@typescript-eslint/visitor-keys@7.7.0': + dependencies: + '@typescript-eslint/types': 7.7.0 + eslint-visitor-keys: 3.4.3 + + '@typescript-eslint/visitor-keys@7.9.0': dependencies: - '@typescript-eslint/types': 7.8.0 + '@typescript-eslint/types': 7.9.0 eslint-visitor-keys: 3.4.3 '@ungap/structured-clone@1.2.0': {} - '@vitest/coverage-v8@1.6.0(vitest@1.6.0(@types/node@20.12.11)(jsdom@24.0.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))(terser@5.31.0))': + '@vitest/coverage-v8@1.4.0(vitest@1.6.0(@types/node@20.12.7)(jsdom@24.0.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(terser@5.27.2))': dependencies: - '@ampproject/remapping': 2.3.0 + '@ampproject/remapping': 2.2.1 '@bcoe/v8-coverage': 0.2.3 - debug: 4.3.4 + debug: 4.3.5 istanbul-lib-coverage: 3.2.2 istanbul-lib-report: 3.0.1 - istanbul-lib-source-maps: 5.0.4 + istanbul-lib-source-maps: 5.0.5 istanbul-reports: 3.1.7 - magic-string: 0.30.10 - magicast: 0.3.4 + magic-string: 0.30.7 + magicast: 0.3.3 picocolors: 1.0.0 std-env: 3.7.0 - strip-literal: 2.1.0 + strip-literal: 2.0.0 test-exclude: 6.0.0 - vitest: 1.6.0(@types/node@20.12.11)(jsdom@24.0.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))(terser@5.31.0) + v8-to-istanbul: 9.2.0 + vitest: 1.6.0(@types/node@20.12.7)(jsdom@24.0.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(terser@5.27.2) transitivePeerDependencies: - supports-color - '@vitest/expect@1.3.1': + '@vitest/expect@1.5.0': dependencies: - '@vitest/spy': 1.3.1 - '@vitest/utils': 1.3.1 + '@vitest/spy': 1.5.0 + '@vitest/utils': 1.5.0 chai: 4.4.1 '@vitest/expect@1.6.0': @@ -16723,27 +19458,58 @@ snapshots: '@vitest/utils': 1.6.0 chai: 4.4.1 + '@vitest/expect@2.0.5': + dependencies: + '@vitest/spy': 2.0.5 + '@vitest/utils': 2.0.5 + chai: 5.1.1 + tinyrainbow: 1.2.0 + + '@vitest/pretty-format@2.0.5': + dependencies: + tinyrainbow: 1.2.0 + + '@vitest/pretty-format@2.1.1': + dependencies: + tinyrainbow: 1.2.0 + + '@vitest/runner@1.5.0': + dependencies: + '@vitest/utils': 1.5.0 + p-limit: 5.0.0 + pathe: 1.1.2 + '@vitest/runner@1.6.0': dependencies: '@vitest/utils': 1.6.0 p-limit: 5.0.0 pathe: 1.1.2 - '@vitest/snapshot@1.6.0': + '@vitest/snapshot@1.5.0': dependencies: magic-string: 0.30.10 pathe: 1.1.2 pretty-format: 29.7.0 - '@vitest/spy@1.3.1': + '@vitest/snapshot@1.6.0': + dependencies: + magic-string: 0.30.9 + pathe: 1.1.2 + pretty-format: 29.7.0 + + '@vitest/spy@1.5.0': dependencies: - tinyspy: 2.2.1 + tinyspy: 2.2.0 '@vitest/spy@1.6.0': dependencies: - tinyspy: 2.2.1 + tinyspy: 2.2.0 - '@vitest/utils@1.3.1': + '@vitest/spy@2.0.5': + dependencies: + tinyspy: 3.0.2 + + '@vitest/utils@1.5.0': dependencies: diff-sequences: 29.6.3 estree-walker: 3.0.3 @@ -16757,26 +19523,37 @@ snapshots: loupe: 2.3.7 pretty-format: 29.7.0 - '@volar/kit@2.2.2(typescript@5.4.5)': + '@vitest/utils@2.0.5': + dependencies: + '@vitest/pretty-format': 2.0.5 + estree-walker: 3.0.3 + loupe: 3.1.1 + tinyrainbow: 1.2.0 + + '@vitest/utils@2.1.1': + dependencies: + '@vitest/pretty-format': 2.1.1 + loupe: 3.1.1 + tinyrainbow: 1.2.0 + + '@volar/kit@2.4.5(typescript@5.4.5)': dependencies: - '@volar/language-service': 2.2.2 - '@volar/typescript': 2.2.2 + '@volar/language-service': 2.4.5 + '@volar/typescript': 2.4.5 typesafe-path: 0.2.2 - typescript: 5.4.5 + typescript: 5.5.3 vscode-languageserver-textdocument: 1.0.11 vscode-uri: 3.0.8 - '@volar/language-core@2.2.2': + '@volar/language-core@2.4.5': dependencies: - '@volar/source-map': 2.2.2 + '@volar/source-map': 2.4.5 - '@volar/language-server@2.2.2': + '@volar/language-server@2.4.5': dependencies: - '@volar/language-core': 2.2.2 - '@volar/language-service': 2.2.2 - '@volar/snapshot-document': 2.2.2 - '@volar/typescript': 2.2.2 - '@vscode/l10n': 0.0.16 + '@volar/language-core': 2.4.5 + '@volar/language-service': 2.4.5 + '@volar/typescript': 2.4.5 path-browserify: 1.0.1 request-light: 0.7.0 vscode-languageserver: 9.0.1 @@ -16784,26 +19561,20 @@ snapshots: vscode-languageserver-textdocument: 1.0.11 vscode-uri: 3.0.8 - '@volar/language-service@2.2.2': + '@volar/language-service@2.4.5': dependencies: - '@volar/language-core': 2.2.2 + '@volar/language-core': 2.4.5 vscode-languageserver-protocol: 3.17.5 vscode-languageserver-textdocument: 1.0.11 vscode-uri: 3.0.8 - '@volar/snapshot-document@2.2.2': - dependencies: - vscode-languageserver-protocol: 3.17.5 - vscode-languageserver-textdocument: 1.0.11 + '@volar/source-map@2.4.5': {} - '@volar/source-map@2.2.2': + '@volar/typescript@2.4.5': dependencies: - muggle-string: 0.4.1 - - '@volar/typescript@2.2.2': - dependencies: - '@volar/language-core': 2.2.2 + '@volar/language-core': 2.4.5 path-browserify: 1.0.1 + vscode-uri: 3.0.8 '@vscode/emmet-helper@2.9.3': dependencies: @@ -16813,30 +19584,29 @@ snapshots: vscode-languageserver-types: 3.17.5 vscode-uri: 2.1.2 - '@vscode/l10n@0.0.16': {} - '@vscode/l10n@0.0.18': {} - '@wagmi/cli@2.1.4(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)': + '@wagmi/cli@2.1.15(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)': dependencies: - abitype: 0.9.10(typescript@5.4.5)(zod@3.23.8) - bundle-require: 4.1.0(esbuild@0.19.12) + abitype: 1.0.6(typescript@5.4.5)(zod@3.23.8) + bundle-require: 4.0.2(esbuild@0.19.12) cac: 6.7.14 - change-case: 4.1.2 + change-case: 5.4.4 chokidar: 3.6.0 dedent: 0.7.0 dotenv: 16.4.5 dotenv-expand: 10.0.0 esbuild: 0.19.12 execa: 8.0.1 + fdir: 6.3.0(picomatch@3.0.1) find-up: 6.3.0 fs-extra: 11.2.0 - globby: 13.2.2 ora: 6.3.1 pathe: 1.1.2 picocolors: 1.0.0 + picomatch: 3.0.1 prettier: 3.2.5 - viem: 2.13.1(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8) + viem: 2.21.7(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8) zod: 3.23.8 optionalDependencies: typescript: 5.4.5 @@ -16844,45 +19614,81 @@ snapshots: - bufferutil - utf-8-validate - '@wagmi/cli@2.1.8(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)': + '@wagmi/cli@2.1.4(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)': dependencies: - abitype: 1.0.2(typescript@5.4.5)(zod@3.23.8) - bundle-require: 4.1.0(esbuild@0.19.12) + abitype: 0.9.10(typescript@5.4.3)(zod@3.22.4) + bundle-require: 4.0.2(esbuild@0.19.12) cac: 6.7.14 - change-case: 4.1.2 + change-case: 5.4.4 chokidar: 3.6.0 dedent: 0.7.0 dotenv: 16.4.5 dotenv-expand: 10.0.0 esbuild: 0.19.12 execa: 8.0.1 + fdir: 6.1.1(picomatch@3.0.1) find-up: 6.3.0 fs-extra: 11.2.0 - globby: 13.2.2 ora: 6.3.1 pathe: 1.1.2 picocolors: 1.0.0 prettier: 3.2.5 - viem: 2.13.1(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8) - zod: 3.23.8 + viem: 2.9.29(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.22.4) + zod: 3.22.4 optionalDependencies: - typescript: 5.4.5 + typescript: 5.4.3 transitivePeerDependencies: - bufferutil - utf-8-validate - '@wagmi/connectors@4.3.5(@types/react@18.3.2)(@wagmi/core@2.9.3(@types/react@18.3.2)(bufferutil@4.0.8)(react@18.3.1)(typescript@5.4.5)(utf-8-validate@6.0.3)(viem@2.10.2(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8))(zod@3.23.8))(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react-i18next@13.5.0(i18next@22.5.1)(react-dom@18.3.1(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.3.2)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.3.2)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1)(rollup@4.17.2)(typescript@5.4.5)(utf-8-validate@6.0.3)(viem@2.10.2(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8))(zod@3.23.8)': + '@wagmi/connectors@4.1.18(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(@types/react@18.3.5)(@wagmi/core@2.8.0(@types/react@18.3.5)(bufferutil@4.0.8)(react@18.2.0)(typescript@5.4.3)(utf-8-validate@5.0.10)(viem@2.21.7(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.22.4))(zod@3.22.4))(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))(react@18.2.0)(rollup@4.21.3)(typescript@5.4.3)(utf-8-validate@5.0.10)(viem@2.21.7(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.22.4))(zod@3.22.4)': dependencies: '@coinbase/wallet-sdk': 3.9.1 - '@metamask/sdk': 0.18.6(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react-i18next@13.5.0(i18next@22.5.1)(react-dom@18.3.1(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.3.2)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.3.2)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1)(rollup@4.17.2)(utf-8-validate@6.0.3) - '@safe-global/safe-apps-provider': 0.18.1(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8) - '@safe-global/safe-apps-sdk': 8.1.0(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8) - '@wagmi/core': 2.9.3(@types/react@18.3.2)(bufferutil@4.0.8)(react@18.3.1)(typescript@5.4.5)(utf-8-validate@6.0.3)(viem@2.10.2(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8))(zod@3.23.8) - '@walletconnect/ethereum-provider': 2.13.0(@types/react@18.3.2)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3) - '@walletconnect/modal': 2.6.2(@types/react@18.3.2)(react@18.3.1) - viem: 2.10.2(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8) + '@metamask/sdk': 0.14.3(@types/react@18.3.5)(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))(react@18.2.0)(rollup@4.21.3)(utf-8-validate@5.0.10) + '@safe-global/safe-apps-provider': 0.18.1(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.22.4) + '@safe-global/safe-apps-sdk': 8.1.0(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.22.4) + '@wagmi/core': 2.8.0(@types/react@18.3.5)(bufferutil@4.0.8)(react@18.2.0)(typescript@5.4.3)(utf-8-validate@5.0.10)(viem@2.21.7(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.22.4))(zod@3.22.4) + '@walletconnect/ethereum-provider': 2.11.2(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(@types/react@18.3.5)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10) + '@walletconnect/modal': 2.6.2(@types/react@18.3.5)(react@18.2.0) + viem: 2.21.7(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.22.4) optionalDependencies: - typescript: 5.4.5 + typescript: 5.4.3 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@types/react' + - '@upstash/redis' + - '@vercel/kv' + - bufferutil + - encoding + - react + - react-dom + - react-native + - rollup + - supports-color + - utf-8-validate + - zod + + '@wagmi/connectors@4.3.10(vnbhrjghrun7rfuxsawo7otej4)': + dependencies: + '@coinbase/wallet-sdk': 3.9.1 + '@metamask/sdk': 0.20.3(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react-i18next@13.5.0(i18next@22.5.1)(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))(react@18.2.0))(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))(react@18.2.0)(rollup@4.21.3)(utf-8-validate@5.0.10) + '@safe-global/safe-apps-provider': 0.18.1(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.23.8) + '@safe-global/safe-apps-sdk': 8.1.0(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.23.8) + '@wagmi/core': 2.10.2(@types/react@18.3.5)(bufferutil@4.0.8)(react@18.2.0)(typescript@5.4.3)(utf-8-validate@5.0.10)(viem@2.9.29(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.23.8))(zod@3.23.8) + '@walletconnect/ethereum-provider': 2.13.0(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(@types/react@18.3.5)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10) + '@walletconnect/modal': 2.6.2(@types/react@18.3.5)(react@18.2.0) + viem: 2.9.29(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.23.8) + optionalDependencies: + typescript: 5.4.3 transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -16899,28 +19705,26 @@ snapshots: - '@vercel/kv' - bufferutil - encoding - - ioredis - react - react-dom - react-i18next - react-native - rollup - supports-color - - uWebSockets.js - utf-8-validate - zod - '@wagmi/connectors@5.0.6(@types/react@18.3.2)(@wagmi/core@2.10.4(@types/react@18.3.2)(bufferutil@4.0.8)(react@18.3.1)(typescript@5.4.5)(utf-8-validate@6.0.3)(viem@2.13.1(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8))(zod@3.23.8))(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react-i18next@13.5.0(i18next@22.5.1)(react-dom@18.3.1(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.3.2)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.3.2)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1)(rollup@4.17.2)(typescript@5.4.5)(utf-8-validate@6.0.3)(viem@2.13.1(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8))(zod@3.23.8)': + '@wagmi/connectors@5.1.10(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(@types/react@18.3.5)(@wagmi/core@2.13.5(@types/react@18.3.5)(react@18.2.0)(typescript@5.4.5)(viem@2.21.7(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8)))(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))(react@18.2.0)(rollup@4.21.3)(typescript@5.4.5)(utf-8-validate@5.0.10)(viem@2.21.7(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8))(zod@3.23.8)': dependencies: - '@coinbase/wallet-sdk': 4.0.2 - '@metamask/sdk': 0.20.3(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react-i18next@13.5.0(i18next@22.5.1)(react-dom@18.3.1(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.3.2)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.3.2)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1)(rollup@4.17.2)(utf-8-validate@6.0.3) - '@safe-global/safe-apps-provider': 0.18.1(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8) - '@safe-global/safe-apps-sdk': 8.1.0(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8) - '@wagmi/core': 2.10.4(@types/react@18.3.2)(bufferutil@4.0.8)(react@18.3.1)(typescript@5.4.5)(utf-8-validate@6.0.3)(viem@2.13.1(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8))(zod@3.23.8) - '@walletconnect/ethereum-provider': 2.13.0(@types/react@18.3.2)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3) - '@walletconnect/modal': 2.6.2(@types/react@18.3.2)(react@18.3.1) + '@coinbase/wallet-sdk': 4.0.4 + '@metamask/sdk': 0.28.2(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))(react@18.2.0)(rollup@4.21.3)(utf-8-validate@5.0.10) + '@safe-global/safe-apps-provider': 0.18.3(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8) + '@safe-global/safe-apps-sdk': 9.1.0(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8) + '@wagmi/core': 2.13.5(@types/react@18.3.5)(react@18.2.0)(typescript@5.4.5)(viem@2.21.7(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8)) + '@walletconnect/ethereum-provider': 2.16.1(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(@types/react@18.3.5)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10) + '@walletconnect/modal': 2.6.2(@types/react@18.3.5)(react@18.2.0) cbw-sdk: '@coinbase/wallet-sdk@3.9.3' - viem: 2.13.1(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8) + viem: 2.21.7(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8) optionalDependencies: typescript: 5.4.5 transitivePeerDependencies: @@ -16939,25 +19743,22 @@ snapshots: - '@vercel/kv' - bufferutil - encoding - - ioredis - react - react-dom - - react-i18next - react-native - rollup - supports-color - - uWebSockets.js - utf-8-validate - zod - '@wagmi/core@2.10.4(@types/react@18.3.2)(bufferutil@4.0.8)(react@18.3.1)(typescript@5.4.5)(utf-8-validate@6.0.3)(viem@2.13.1(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8))(zod@3.23.8)': + '@wagmi/core@2.10.2(@types/react@18.3.5)(bufferutil@4.0.8)(react@18.2.0)(typescript@5.4.3)(utf-8-validate@5.0.10)(viem@2.9.29(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.23.8))(zod@3.23.8)': dependencies: eventemitter3: 5.0.1 - mipd: 0.0.5(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8) - viem: 2.13.1(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8) - zustand: 4.4.1(@types/react@18.3.2)(react@18.3.1) + mipd: 0.0.5(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.23.8) + viem: 2.9.29(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.23.8) + zustand: 4.4.1(@types/react@18.3.5)(react@18.2.0) optionalDependencies: - typescript: 5.4.5 + typescript: 5.4.3 transitivePeerDependencies: - '@types/react' - bufferutil @@ -16966,14 +19767,27 @@ snapshots: - utf-8-validate - zod - '@wagmi/core@2.9.3(@types/react@18.3.2)(bufferutil@4.0.8)(react@18.3.1)(typescript@5.4.5)(utf-8-validate@6.0.3)(viem@2.10.2(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8))(zod@3.23.8)': + '@wagmi/core@2.13.5(@types/react@18.3.5)(react@18.2.0)(typescript@5.4.5)(viem@2.21.7(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8))': dependencies: eventemitter3: 5.0.1 - mipd: 0.0.5(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8) - viem: 2.10.2(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8) - zustand: 4.4.1(@types/react@18.3.2)(react@18.3.1) + mipd: 0.0.7(typescript@5.4.5) + viem: 2.21.7(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8) + zustand: 4.4.1(@types/react@18.3.5)(react@18.2.0) optionalDependencies: typescript: 5.4.5 + transitivePeerDependencies: + - '@types/react' + - immer + - react + + '@wagmi/core@2.8.0(@types/react@18.3.5)(bufferutil@4.0.8)(react@18.2.0)(typescript@5.4.3)(utf-8-validate@5.0.10)(viem@2.21.7(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.22.4))(zod@3.22.4)': + dependencies: + eventemitter3: 5.0.1 + mipd: 0.0.5(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.22.4) + viem: 2.21.7(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.22.4) + zustand: 4.4.1(@types/react@18.3.5)(react@18.2.0) + optionalDependencies: + typescript: 5.4.3 transitivePeerDependencies: - '@types/react' - bufferutil @@ -16982,25 +19796,41 @@ snapshots: - utf-8-validate - zod - '@walletconnect/core@2.13.0(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.3)': + '@wagmi/core@2.8.0(@types/react@18.3.5)(bufferutil@4.0.8)(react@18.2.0)(typescript@5.4.3)(utf-8-validate@6.0.3)(viem@2.9.29(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@6.0.3)(zod@3.23.8))(zod@3.23.8)': dependencies: - '@walletconnect/heartbeat': 1.2.2 - '@walletconnect/jsonrpc-provider': 1.0.14 - '@walletconnect/jsonrpc-types': 1.0.4 + eventemitter3: 5.0.1 + mipd: 0.0.5(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@6.0.3)(zod@3.23.8) + viem: 2.9.29(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@6.0.3)(zod@3.23.8) + zustand: 4.4.1(@types/react@18.3.5)(react@18.2.0) + optionalDependencies: + typescript: 5.4.3 + transitivePeerDependencies: + - '@types/react' + - bufferutil + - immer + - react + - utf-8-validate + - zod + + '@walletconnect/core@2.11.2(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)': + dependencies: + '@walletconnect/heartbeat': 1.2.1 + '@walletconnect/jsonrpc-provider': 1.0.13 + '@walletconnect/jsonrpc-types': 1.0.3 '@walletconnect/jsonrpc-utils': 1.0.8 - '@walletconnect/jsonrpc-ws-connection': 1.0.14(bufferutil@4.0.8)(utf-8-validate@6.0.3) - '@walletconnect/keyvaluestorage': 1.1.1 + '@walletconnect/jsonrpc-ws-connection': 1.0.14(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@walletconnect/keyvaluestorage': 1.1.1(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))) '@walletconnect/logger': 2.1.2 - '@walletconnect/relay-api': 1.0.10 + '@walletconnect/relay-api': 1.0.9 '@walletconnect/relay-auth': 1.0.4 '@walletconnect/safe-json': 1.0.2 '@walletconnect/time': 1.0.2 - '@walletconnect/types': 2.13.0 - '@walletconnect/utils': 2.13.0 + '@walletconnect/types': 2.11.2(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))) + '@walletconnect/utils': 2.11.2(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))) events: 3.3.0 isomorphic-unfetch: 3.1.0(encoding@0.1.13) lodash.isequal: 4.5.0 - uint8arrays: 3.1.0 + uint8arrays: 3.1.1 transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -17016,26 +19846,65 @@ snapshots: - '@vercel/kv' - bufferutil - encoding - - ioredis - - uWebSockets.js + - supports-color - utf-8-validate - '@walletconnect/environment@1.0.1': + '@walletconnect/core@2.12.2(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)': dependencies: - tslib: 1.14.1 + '@walletconnect/heartbeat': 1.2.1 + '@walletconnect/jsonrpc-provider': 1.0.13 + '@walletconnect/jsonrpc-types': 1.0.3 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/jsonrpc-ws-connection': 1.0.14(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@walletconnect/keyvaluestorage': 1.1.1(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))) + '@walletconnect/logger': 2.1.2 + '@walletconnect/relay-api': 1.0.9 + '@walletconnect/relay-auth': 1.0.4 + '@walletconnect/safe-json': 1.0.2 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.12.2(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))) + '@walletconnect/utils': 2.12.2(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))) + events: 3.3.0 + isomorphic-unfetch: 3.1.0(encoding@0.1.13) + lodash.isequal: 4.5.0 + uint8arrays: 3.1.1 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/kv' + - bufferutil + - encoding + - supports-color + - utf-8-validate - '@walletconnect/ethereum-provider@2.13.0(@types/react@18.3.2)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3)': + '@walletconnect/core@2.13.0(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)': dependencies: - '@walletconnect/jsonrpc-http-connection': 1.0.8(encoding@0.1.13) + '@walletconnect/heartbeat': 1.2.2 '@walletconnect/jsonrpc-provider': 1.0.14 '@walletconnect/jsonrpc-types': 1.0.4 '@walletconnect/jsonrpc-utils': 1.0.8 - '@walletconnect/modal': 2.6.2(@types/react@18.3.2)(react@18.3.1) - '@walletconnect/sign-client': 2.13.0(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.3) - '@walletconnect/types': 2.13.0 - '@walletconnect/universal-provider': 2.13.0(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.3) - '@walletconnect/utils': 2.13.0 + '@walletconnect/jsonrpc-ws-connection': 1.0.14(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@walletconnect/keyvaluestorage': 1.1.1(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))) + '@walletconnect/logger': 2.1.2 + '@walletconnect/relay-api': 1.0.10 + '@walletconnect/relay-auth': 1.0.4 + '@walletconnect/safe-json': 1.0.2 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.13.0(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))) + '@walletconnect/utils': 2.13.0(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))) events: 3.3.0 + isomorphic-unfetch: 3.1.0 + lodash.isequal: 4.5.0 + uint8arrays: 3.1.0 transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -17047,79 +19916,734 @@ snapshots: - '@netlify/blobs' - '@planetscale/database' - '@react-native-async-storage/async-storage' - - '@types/react' - '@upstash/redis' - '@vercel/kv' - bufferutil - encoding - ioredis - - react - uWebSockets.js - utf-8-validate - '@walletconnect/events@1.0.1': - dependencies: - keyvaluestorage-interface: 1.0.0 - tslib: 1.14.1 - - '@walletconnect/heartbeat@1.2.1': - dependencies: - '@walletconnect/events': 1.0.1 - '@walletconnect/time': 1.0.2 - tslib: 1.14.1 - - '@walletconnect/heartbeat@1.2.2': - dependencies: - '@walletconnect/events': 1.0.1 - '@walletconnect/time': 1.0.2 - events: 3.3.0 - - '@walletconnect/jsonrpc-http-connection@1.0.8(encoding@0.1.13)': + '@walletconnect/core@2.13.3': dependencies: + '@walletconnect/heartbeat': 1.2.2 + '@walletconnect/jsonrpc-provider': 1.0.14 + '@walletconnect/jsonrpc-types': 1.0.4 '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/jsonrpc-ws-connection': 1.0.14 + '@walletconnect/keyvaluestorage': 1.1.1 + '@walletconnect/logger': 2.1.2 + '@walletconnect/relay-api': 1.0.10 + '@walletconnect/relay-auth': 1.0.4 '@walletconnect/safe-json': 1.0.2 - cross-fetch: 3.1.8(encoding@0.1.13) + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.13.3 + '@walletconnect/utils': 2.13.3 events: 3.3.0 + isomorphic-unfetch: 3.1.0 + lodash.isequal: 4.5.0 + uint8arrays: 3.1.0 transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/kv' + - bufferutil - encoding + - supports-color + - utf-8-validate - '@walletconnect/jsonrpc-provider@1.0.14': + '@walletconnect/core@2.16.1(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(bufferutil@4.0.8)(utf-8-validate@5.0.10)': dependencies: + '@walletconnect/heartbeat': 1.2.2 + '@walletconnect/jsonrpc-provider': 1.0.14 + '@walletconnect/jsonrpc-types': 1.0.4 '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/jsonrpc-ws-connection': 1.0.14(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@walletconnect/keyvaluestorage': 1.1.1(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))) + '@walletconnect/logger': 2.1.2 + '@walletconnect/relay-api': 1.0.11 + '@walletconnect/relay-auth': 1.0.4 '@walletconnect/safe-json': 1.0.2 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.16.1(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))) + '@walletconnect/utils': 2.16.1(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))) events: 3.3.0 + lodash.isequal: 4.5.0 + uint8arrays: 3.1.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/kv' + - bufferutil + - supports-color + - utf-8-validate - '@walletconnect/jsonrpc-types@1.0.3': + '@walletconnect/environment@1.0.1': dependencies: - keyvaluestorage-interface: 1.0.0 tslib: 1.14.1 - '@walletconnect/jsonrpc-types@1.0.4': + '@walletconnect/ethereum-provider@2.11.2(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(@types/react@18.3.5)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)': dependencies: + '@walletconnect/jsonrpc-http-connection': 1.0.7(encoding@0.1.13) + '@walletconnect/jsonrpc-provider': 1.0.13 + '@walletconnect/jsonrpc-types': 1.0.3 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/modal': 2.6.2(@types/react@18.3.5)(react@18.2.0) + '@walletconnect/sign-client': 2.11.2(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) + '@walletconnect/types': 2.11.2(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))) + '@walletconnect/universal-provider': 2.11.2(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) + '@walletconnect/utils': 2.11.2(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))) events: 3.3.0 - keyvaluestorage-interface: 1.0.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@types/react' + - '@upstash/redis' + - '@vercel/kv' + - bufferutil + - encoding + - react + - supports-color + - utf-8-validate - '@walletconnect/jsonrpc-utils@1.0.8': + '@walletconnect/ethereum-provider@2.12.2(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(@types/react@18.3.5)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)': dependencies: - '@walletconnect/environment': 1.0.1 - '@walletconnect/jsonrpc-types': 1.0.4 - tslib: 1.14.1 + '@walletconnect/jsonrpc-http-connection': 1.0.7(encoding@0.1.13) + '@walletconnect/jsonrpc-provider': 1.0.13 + '@walletconnect/jsonrpc-types': 1.0.3 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/modal': 2.6.2(@types/react@18.3.5)(react@18.2.0) + '@walletconnect/sign-client': 2.12.2(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) + '@walletconnect/types': 2.12.2(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))) + '@walletconnect/universal-provider': 2.12.2(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) + '@walletconnect/utils': 2.12.2(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))) + events: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@types/react' + - '@upstash/redis' + - '@vercel/kv' + - bufferutil + - encoding + - react + - supports-color + - utf-8-validate - '@walletconnect/jsonrpc-ws-connection@1.0.14(bufferutil@4.0.8)(utf-8-validate@6.0.3)': + '@walletconnect/ethereum-provider@2.13.0(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(@types/react@18.3.5)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)': dependencies: + '@walletconnect/jsonrpc-http-connection': 1.0.8(encoding@0.1.13) + '@walletconnect/jsonrpc-provider': 1.0.14 + '@walletconnect/jsonrpc-types': 1.0.4 '@walletconnect/jsonrpc-utils': 1.0.8 - '@walletconnect/safe-json': 1.0.2 + '@walletconnect/modal': 2.6.2(@types/react@18.3.5)(react@18.2.0) + '@walletconnect/sign-client': 2.13.0(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) + '@walletconnect/types': 2.13.0(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))) + '@walletconnect/universal-provider': 2.13.0(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) + '@walletconnect/utils': 2.13.0(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))) events: 3.3.0 - ws: 7.5.9(bufferutil@4.0.8)(utf-8-validate@6.0.3) transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@types/react' + - '@upstash/redis' + - '@vercel/kv' + - bufferutil + - encoding + - react + - supports-color + - utf-8-validate + + '@walletconnect/ethereum-provider@2.16.1(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(@types/react@18.3.5)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)': + dependencies: + '@walletconnect/jsonrpc-http-connection': 1.0.8(encoding@0.1.13) + '@walletconnect/jsonrpc-provider': 1.0.14 + '@walletconnect/jsonrpc-types': 1.0.4 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/modal': 2.6.2(@types/react@18.3.5)(react@18.2.0) + '@walletconnect/sign-client': 2.16.1(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@walletconnect/types': 2.16.1(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))) + '@walletconnect/universal-provider': 2.16.1(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) + '@walletconnect/utils': 2.16.1(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))) + events: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@types/react' + - '@upstash/redis' + - '@vercel/kv' + - bufferutil + - encoding + - react + - supports-color + - utf-8-validate + + '@walletconnect/ethereum-provider@2.13.3(react@18.3.1)': + dependencies: + '@walletconnect/jsonrpc-http-connection': 1.0.8 + '@walletconnect/jsonrpc-provider': 1.0.14 + '@walletconnect/jsonrpc-types': 1.0.4 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/modal': 2.6.2(react@18.3.1) + '@walletconnect/sign-client': 2.13.3 + '@walletconnect/types': 2.13.3 + '@walletconnect/universal-provider': 2.13.3 + '@walletconnect/utils': 2.13.3 + events: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@types/react' + - '@upstash/redis' + - '@vercel/kv' + - bufferutil + - encoding + - ioredis + - react + - uWebSockets.js + - utf-8-validate + + '@walletconnect/events@1.0.1': + dependencies: + keyvaluestorage-interface: 1.0.0 + tslib: 1.14.1 + + '@walletconnect/heartbeat@1.2.1': + dependencies: + '@walletconnect/events': 1.0.1 + '@walletconnect/time': 1.0.2 + tslib: 1.14.1 + + '@walletconnect/heartbeat@1.2.2': + dependencies: + '@walletconnect/events': 1.0.1 + '@walletconnect/time': 1.0.2 + events: 3.3.0 + + '@walletconnect/jsonrpc-http-connection@1.0.7(encoding@0.1.13)': + dependencies: + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/safe-json': 1.0.2 + cross-fetch: 3.1.8(encoding@0.1.13) + tslib: 1.14.1 + transitivePeerDependencies: + - encoding + + '@walletconnect/jsonrpc-http-connection@1.0.8(encoding@0.1.13)': + dependencies: + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/safe-json': 1.0.2 + cross-fetch: 3.1.8 + events: 3.3.0 + transitivePeerDependencies: + - encoding + + '@walletconnect/jsonrpc-provider@1.0.13': + dependencies: + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/safe-json': 1.0.2 + tslib: 1.14.1 + + '@walletconnect/jsonrpc-provider@1.0.14': + dependencies: + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/safe-json': 1.0.2 + events: 3.3.0 + + '@walletconnect/jsonrpc-types@1.0.3': + dependencies: + keyvaluestorage-interface: 1.0.0 + tslib: 1.14.1 + + '@walletconnect/jsonrpc-types@1.0.4': + dependencies: + events: 3.3.0 + keyvaluestorage-interface: 1.0.0 + + '@walletconnect/jsonrpc-utils@1.0.8': + dependencies: + '@walletconnect/environment': 1.0.1 + '@walletconnect/jsonrpc-types': 1.0.3 + tslib: 1.14.1 + + '@walletconnect/jsonrpc-ws-connection@1.0.14(bufferutil@4.0.8)(utf-8-validate@5.0.10)': + dependencies: + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/safe-json': 1.0.2 + events: 3.3.0 + ws: 7.5.9(bufferutil@4.0.8)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@walletconnect/keyvaluestorage@1.1.1(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))': + dependencies: + '@walletconnect/safe-json': 1.0.2 + idb-keyval: 6.2.1 + unstorage: 1.10.1(idb-keyval@6.2.1) + optionalDependencies: + '@react-native-async-storage/async-storage': 1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@netlify/blobs' + - '@planetscale/database' + - '@upstash/redis' + - '@vercel/kv' + - supports-color + + '@walletconnect/logger@2.1.2': + dependencies: + '@walletconnect/safe-json': 1.0.2 + pino: 7.11.0 + + '@walletconnect/modal-core@2.6.2(@types/react@18.3.5)(react@18.2.0)': + dependencies: + valtio: 1.11.2(@types/react@18.3.5)(react@18.2.0) + transitivePeerDependencies: + - '@types/react' + - react + + '@walletconnect/modal-ui@2.6.2(@types/react@18.3.5)(react@18.2.0)': + dependencies: + '@walletconnect/modal-core': 2.6.2(@types/react@18.3.5)(react@18.2.0) + lit: 2.8.0 + motion: 10.16.2 + qrcode: 1.5.3 + transitivePeerDependencies: + - '@types/react' + - react + + '@walletconnect/modal@2.6.2(@types/react@18.3.5)(react@18.2.0)': + dependencies: + '@walletconnect/modal-core': 2.6.2(@types/react@18.3.5)(react@18.2.0) + '@walletconnect/modal-ui': 2.6.2(@types/react@18.3.5)(react@18.2.0) + transitivePeerDependencies: + - '@types/react' + - react + + '@walletconnect/relay-api@1.0.10': + dependencies: + '@walletconnect/jsonrpc-types': 1.0.4 + + '@walletconnect/relay-api@1.0.11': + dependencies: + '@walletconnect/jsonrpc-types': 1.0.4 + + '@walletconnect/relay-api@1.0.9': + dependencies: + '@walletconnect/jsonrpc-types': 1.0.3 + tslib: 1.14.1 + + '@walletconnect/relay-auth@1.0.4': + dependencies: + '@stablelib/ed25519': 1.0.3 + '@stablelib/random': 1.0.2 + '@walletconnect/safe-json': 1.0.2 + '@walletconnect/time': 1.0.2 + tslib: 1.14.1 + uint8arrays: 3.1.1 + + '@walletconnect/safe-json@1.0.2': + dependencies: + tslib: 1.14.1 + + '@walletconnect/sign-client@2.11.2(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)': + dependencies: + '@walletconnect/core': 2.11.2(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) + '@walletconnect/events': 1.0.1 + '@walletconnect/heartbeat': 1.2.1 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/logger': 2.1.2 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.11.2(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))) + '@walletconnect/utils': 2.11.2(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))) + events: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/kv' + - bufferutil + - encoding + - supports-color + - utf-8-validate + + '@walletconnect/sign-client@2.12.2(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)': + dependencies: + '@walletconnect/core': 2.12.2(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) + '@walletconnect/events': 1.0.1 + '@walletconnect/heartbeat': 1.2.1 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/logger': 2.1.2 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.12.2(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))) + '@walletconnect/utils': 2.12.2(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))) + events: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/kv' + - bufferutil + - encoding + - supports-color + - utf-8-validate + + '@walletconnect/sign-client@2.13.0(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)': + dependencies: + '@walletconnect/core': 2.13.0(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) + '@walletconnect/events': 1.0.1 + '@walletconnect/heartbeat': 1.2.2 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/logger': 2.1.2 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.13.0(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))) + '@walletconnect/utils': 2.13.0(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))) + events: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/kv' + - bufferutil + - encoding + - supports-color + - utf-8-validate + + '@walletconnect/sign-client@2.16.1(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(bufferutil@4.0.8)(utf-8-validate@5.0.10)': + dependencies: + '@walletconnect/core': 2.16.1(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@walletconnect/events': 1.0.1 + '@walletconnect/heartbeat': 1.2.2 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/logger': 2.1.2 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.16.1(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))) + '@walletconnect/utils': 2.16.1(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))) + events: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/kv' + - bufferutil + - supports-color + - utf-8-validate + + '@walletconnect/sign-client@2.13.3': + dependencies: + '@walletconnect/core': 2.13.3 + '@walletconnect/events': 1.0.1 + '@walletconnect/heartbeat': 1.2.2 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/logger': 2.1.2 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.13.3 + '@walletconnect/utils': 2.13.3 + events: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/kv' + - bufferutil + - encoding + - ioredis + - uWebSockets.js + - utf-8-validate + + '@walletconnect/time@1.0.2': + dependencies: + tslib: 1.14.1 + + '@walletconnect/types@2.11.2(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))': + dependencies: + '@walletconnect/events': 1.0.1 + '@walletconnect/heartbeat': 1.2.1 + '@walletconnect/jsonrpc-types': 1.0.3 + '@walletconnect/keyvaluestorage': 1.1.1(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))) + '@walletconnect/logger': 2.1.2 + events: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/kv' + - supports-color + + '@walletconnect/types@2.12.0(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))': + dependencies: + '@walletconnect/events': 1.0.1 + '@walletconnect/heartbeat': 1.2.1 + '@walletconnect/jsonrpc-types': 1.0.3 + '@walletconnect/keyvaluestorage': 1.1.1(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))) + '@walletconnect/logger': 2.1.2 + events: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/kv' + - supports-color + + '@walletconnect/types@2.12.2(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))': + dependencies: + '@walletconnect/events': 1.0.1 + '@walletconnect/heartbeat': 1.2.1 + '@walletconnect/jsonrpc-types': 1.0.3 + '@walletconnect/keyvaluestorage': 1.1.1(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))) + '@walletconnect/logger': 2.1.2 + events: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/kv' + - supports-color + + '@walletconnect/types@2.13.0(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))': + dependencies: + '@walletconnect/events': 1.0.1 + '@walletconnect/heartbeat': 1.2.2 + '@walletconnect/jsonrpc-types': 1.0.4 + '@walletconnect/keyvaluestorage': 1.1.1(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))) + '@walletconnect/logger': 2.1.2 + events: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/kv' + - supports-color + + '@walletconnect/types@2.16.1(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))': + dependencies: + '@walletconnect/events': 1.0.1 + '@walletconnect/heartbeat': 1.2.2 + '@walletconnect/jsonrpc-types': 1.0.4 + '@walletconnect/keyvaluestorage': 1.1.1(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))) + '@walletconnect/logger': 2.1.2 + events: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/kv' + - supports-color + + '@walletconnect/universal-provider@2.11.2(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)': + dependencies: + '@walletconnect/jsonrpc-http-connection': 1.0.7(encoding@0.1.13) + '@walletconnect/jsonrpc-provider': 1.0.13 + '@walletconnect/jsonrpc-types': 1.0.3 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/logger': 2.1.2 + '@walletconnect/sign-client': 2.11.2(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) + '@walletconnect/types': 2.11.2(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))) + '@walletconnect/utils': 2.11.2(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))) + events: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/kv' + - bufferutil + - encoding + - supports-color + - utf-8-validate + + '@walletconnect/universal-provider@2.12.2(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)': + dependencies: + '@walletconnect/jsonrpc-http-connection': 1.0.7(encoding@0.1.13) + '@walletconnect/jsonrpc-provider': 1.0.13 + '@walletconnect/jsonrpc-types': 1.0.3 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/logger': 2.1.2 + '@walletconnect/sign-client': 2.12.2(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) + '@walletconnect/types': 2.12.2(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))) + '@walletconnect/utils': 2.12.2(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))) + events: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/kv' - bufferutil + - encoding + - supports-color - utf-8-validate - '@walletconnect/keyvaluestorage@1.1.1': + '@walletconnect/universal-provider@2.13.0(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)': dependencies: - '@walletconnect/safe-json': 1.0.2 - idb-keyval: 6.2.1 - unstorage: 1.10.2(idb-keyval@6.2.1) + '@walletconnect/jsonrpc-http-connection': 1.0.8(encoding@0.1.13) + '@walletconnect/jsonrpc-provider': 1.0.14 + '@walletconnect/jsonrpc-types': 1.0.4 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/logger': 2.1.2 + '@walletconnect/sign-client': 2.13.0(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) + '@walletconnect/types': 2.13.0(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))) + '@walletconnect/utils': 2.13.0(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))) + events: 3.3.0 transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -17130,68 +20654,24 @@ snapshots: - '@capacitor/preferences' - '@netlify/blobs' - '@planetscale/database' + - '@react-native-async-storage/async-storage' - '@upstash/redis' - '@vercel/kv' - - ioredis - - uWebSockets.js - - '@walletconnect/logger@2.1.2': - dependencies: - '@walletconnect/safe-json': 1.0.2 - pino: 7.11.0 - - '@walletconnect/modal-core@2.6.2(@types/react@18.3.2)(react@18.3.1)': - dependencies: - valtio: 1.11.2(@types/react@18.3.2)(react@18.3.1) - transitivePeerDependencies: - - '@types/react' - - react - - '@walletconnect/modal-ui@2.6.2(@types/react@18.3.2)(react@18.3.1)': - dependencies: - '@walletconnect/modal-core': 2.6.2(@types/react@18.3.2)(react@18.3.1) - lit: 2.8.0 - motion: 10.16.2 - qrcode: 1.5.3 - transitivePeerDependencies: - - '@types/react' - - react - - '@walletconnect/modal@2.6.2(@types/react@18.3.2)(react@18.3.1)': - dependencies: - '@walletconnect/modal-core': 2.6.2(@types/react@18.3.2)(react@18.3.1) - '@walletconnect/modal-ui': 2.6.2(@types/react@18.3.2)(react@18.3.1) - transitivePeerDependencies: - - '@types/react' - - react + - bufferutil + - encoding + - supports-color + - utf-8-validate - '@walletconnect/relay-api@1.0.10': + '@walletconnect/universal-provider@2.16.1(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)': dependencies: + '@walletconnect/jsonrpc-http-connection': 1.0.8(encoding@0.1.13) + '@walletconnect/jsonrpc-provider': 1.0.14 '@walletconnect/jsonrpc-types': 1.0.4 - - '@walletconnect/relay-auth@1.0.4': - dependencies: - '@stablelib/ed25519': 1.0.3 - '@stablelib/random': 1.0.2 - '@walletconnect/safe-json': 1.0.2 - '@walletconnect/time': 1.0.2 - tslib: 1.14.1 - uint8arrays: 3.1.0 - - '@walletconnect/safe-json@1.0.2': - dependencies: - tslib: 1.14.1 - - '@walletconnect/sign-client@2.13.0(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.3)': - dependencies: - '@walletconnect/core': 2.13.0(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.3) - '@walletconnect/events': 1.0.1 - '@walletconnect/heartbeat': 1.2.2 '@walletconnect/jsonrpc-utils': 1.0.8 '@walletconnect/logger': 2.1.2 - '@walletconnect/time': 1.0.2 - '@walletconnect/types': 2.13.0 - '@walletconnect/utils': 2.13.0 + '@walletconnect/sign-client': 2.16.1(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@walletconnect/types': 2.16.1(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))) + '@walletconnect/utils': 2.16.1(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))) events: 3.3.0 transitivePeerDependencies: - '@azure/app-configuration' @@ -17208,22 +20688,56 @@ snapshots: - '@vercel/kv' - bufferutil - encoding - - ioredis - - uWebSockets.js + - supports-color - utf-8-validate - '@walletconnect/time@1.0.2': + '@walletconnect/utils@2.11.2(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))': dependencies: - tslib: 1.14.1 + '@stablelib/chacha20poly1305': 1.0.1 + '@stablelib/hkdf': 1.0.1 + '@stablelib/random': 1.0.2 + '@stablelib/sha256': 1.0.1 + '@stablelib/x25519': 1.0.3 + '@walletconnect/relay-api': 1.0.9 + '@walletconnect/safe-json': 1.0.2 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.11.2(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))) + '@walletconnect/window-getters': 1.0.1 + '@walletconnect/window-metadata': 1.0.1 + detect-browser: 5.3.0 + query-string: 7.1.3 + uint8arrays: 3.1.1 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/kv' + - supports-color - '@walletconnect/types@2.12.0': + '@walletconnect/utils@2.12.0(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))': dependencies: - '@walletconnect/events': 1.0.1 - '@walletconnect/heartbeat': 1.2.1 - '@walletconnect/jsonrpc-types': 1.0.3 - '@walletconnect/keyvaluestorage': 1.1.1 - '@walletconnect/logger': 2.1.2 - events: 3.3.0 + '@stablelib/chacha20poly1305': 1.0.1 + '@stablelib/hkdf': 1.0.1 + '@stablelib/random': 1.0.2 + '@stablelib/sha256': 1.0.1 + '@stablelib/x25519': 1.0.3 + '@walletconnect/relay-api': 1.0.10 + '@walletconnect/safe-json': 1.0.2 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.12.0(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))) + '@walletconnect/window-getters': 1.0.1 + '@walletconnect/window-metadata': 1.0.1 + detect-browser: 5.3.0 + query-string: 7.1.3 + uint8arrays: 3.1.1 transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -17237,17 +20751,24 @@ snapshots: - '@react-native-async-storage/async-storage' - '@upstash/redis' - '@vercel/kv' - - ioredis - - uWebSockets.js + - supports-color - '@walletconnect/types@2.13.0': + '@walletconnect/utils@2.12.2(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))': dependencies: - '@walletconnect/events': 1.0.1 - '@walletconnect/heartbeat': 1.2.2 - '@walletconnect/jsonrpc-types': 1.0.4 - '@walletconnect/keyvaluestorage': 1.1.1 - '@walletconnect/logger': 2.1.2 - events: 3.3.0 + '@stablelib/chacha20poly1305': 1.0.1 + '@stablelib/hkdf': 1.0.1 + '@stablelib/random': 1.0.2 + '@stablelib/sha256': 1.0.1 + '@stablelib/x25519': 1.0.3 + '@walletconnect/relay-api': 1.0.9 + '@walletconnect/safe-json': 1.0.2 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.12.2(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))) + '@walletconnect/window-getters': 1.0.1 + '@walletconnect/window-metadata': 1.0.1 + detect-browser: 5.3.0 + query-string: 7.1.3 + uint8arrays: 3.1.1 transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -17261,20 +20782,24 @@ snapshots: - '@react-native-async-storage/async-storage' - '@upstash/redis' - '@vercel/kv' - - ioredis - - uWebSockets.js + - supports-color - '@walletconnect/universal-provider@2.13.0(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.3)': + '@walletconnect/utils@2.13.0(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))': dependencies: - '@walletconnect/jsonrpc-http-connection': 1.0.8(encoding@0.1.13) - '@walletconnect/jsonrpc-provider': 1.0.14 - '@walletconnect/jsonrpc-types': 1.0.4 - '@walletconnect/jsonrpc-utils': 1.0.8 - '@walletconnect/logger': 2.1.2 - '@walletconnect/sign-client': 2.13.0(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.3) - '@walletconnect/types': 2.13.0 - '@walletconnect/utils': 2.13.0 - events: 3.3.0 + '@stablelib/chacha20poly1305': 1.0.1 + '@stablelib/hkdf': 1.0.1 + '@stablelib/random': 1.0.2 + '@stablelib/sha256': 1.0.1 + '@stablelib/x25519': 1.0.3 + '@walletconnect/relay-api': 1.0.10 + '@walletconnect/safe-json': 1.0.2 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.13.0(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))) + '@walletconnect/window-getters': 1.0.1 + '@walletconnect/window-metadata': 1.0.1 + detect-browser: 5.3.0 + query-string: 7.1.3 + uint8arrays: 3.1.0 transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -17288,26 +20813,24 @@ snapshots: - '@react-native-async-storage/async-storage' - '@upstash/redis' - '@vercel/kv' - - bufferutil - - encoding - - ioredis - - uWebSockets.js - - utf-8-validate + - supports-color - '@walletconnect/utils@2.12.0': + '@walletconnect/utils@2.16.1(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))': dependencies: '@stablelib/chacha20poly1305': 1.0.1 '@stablelib/hkdf': 1.0.1 '@stablelib/random': 1.0.2 '@stablelib/sha256': 1.0.1 '@stablelib/x25519': 1.0.3 - '@walletconnect/relay-api': 1.0.10 + '@walletconnect/relay-api': 1.0.11 + '@walletconnect/relay-auth': 1.0.4 '@walletconnect/safe-json': 1.0.2 '@walletconnect/time': 1.0.2 - '@walletconnect/types': 2.12.0 + '@walletconnect/types': 2.16.1(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))) '@walletconnect/window-getters': 1.0.1 '@walletconnect/window-metadata': 1.0.1 detect-browser: 5.3.0 + elliptic: 6.5.7 query-string: 7.1.3 uint8arrays: 3.1.0 transitivePeerDependencies: @@ -17323,10 +20846,9 @@ snapshots: - '@react-native-async-storage/async-storage' - '@upstash/redis' - '@vercel/kv' - - ioredis - - uWebSockets.js + - supports-color - '@walletconnect/utils@2.13.0': + '@walletconnect/utils@2.13.3': dependencies: '@stablelib/chacha20poly1305': 1.0.1 '@stablelib/hkdf': 1.0.1 @@ -17336,7 +20858,7 @@ snapshots: '@walletconnect/relay-api': 1.0.10 '@walletconnect/safe-json': 1.0.2 '@walletconnect/time': 1.0.2 - '@walletconnect/types': 2.13.0 + '@walletconnect/types': 2.13.3 '@walletconnect/window-getters': 1.0.1 '@walletconnect/window-metadata': 1.0.1 detect-browser: 5.3.0 @@ -17367,30 +20889,35 @@ snapshots: '@walletconnect/window-getters': 1.0.1 tslib: 1.14.1 - '@web3modal/common@4.1.11': + '@web3modal/common@4.2.3': + dependencies: + bignumber.js: 9.1.2 + dayjs: 1.11.10 + + '@web3modal/common@4.2.3': dependencies: bignumber.js: 9.1.2 dayjs: 1.11.10 - '@web3modal/common@4.2.2': + '@web3modal/common@5.1.8': dependencies: bignumber.js: 9.1.2 dayjs: 1.11.10 - '@web3modal/core@4.1.11(@types/react@18.3.2)(react@18.3.1)': + '@web3modal/core@4.1.11(@types/react@18.3.5)(react@18.2.0)': dependencies: '@web3modal/common': 4.1.11 '@web3modal/wallet': 4.1.11 - valtio: 1.11.2(@types/react@18.3.2)(react@18.3.1) + valtio: 1.11.2(@types/react@18.3.5)(react@18.2.0) transitivePeerDependencies: - '@types/react' - react - '@web3modal/core@4.2.2(@types/react@18.3.2)(react@18.3.1)': + '@web3modal/core@4.2.3(@types/react@18.3.5)(react@18.2.0)': dependencies: - '@web3modal/common': 4.2.2 - '@web3modal/wallet': 4.2.2 - valtio: 1.11.2(@types/react@18.3.2)(react@18.3.1) + '@web3modal/common': 4.2.3 + '@web3modal/wallet': 4.2.3 + valtio: 1.11.2(@types/react@18.3.5)(react@18.2.0) transitivePeerDependencies: - '@types/react' - react @@ -17399,25 +20926,25 @@ snapshots: dependencies: buffer: 6.0.3 - '@web3modal/polyfills@4.2.2': + '@web3modal/polyfills@4.2.3': dependencies: buffer: 6.0.3 - '@web3modal/scaffold-react@4.1.11(@types/react@18.3.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@web3modal/scaffold-react@4.1.11(@types/react@18.3.5)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - '@web3modal/scaffold': 4.1.11(@types/react@18.3.2)(react@18.3.1) + '@web3modal/scaffold': 4.1.11(@types/react@18.3.5)(react@18.2.0) optionalDependencies: - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) transitivePeerDependencies: - '@types/react' - '@web3modal/scaffold-react@4.2.2(@types/react@18.3.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@web3modal/scaffold-react@4.2.3(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(@types/react@18.3.5)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - '@web3modal/scaffold': 4.2.2(@types/react@18.3.2)(react@18.3.1) + '@web3modal/scaffold': 4.2.3(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(@types/react@18.3.5)(react@18.2.0) optionalDependencies: - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -17432,37 +20959,36 @@ snapshots: - '@types/react' - '@upstash/redis' - '@vercel/kv' - - ioredis - - uWebSockets.js + - supports-color - '@web3modal/scaffold-utils@4.1.11(@types/react@18.3.2)(react@18.3.1)': + '@web3modal/scaffold-utils@4.1.11(@types/react@18.3.5)(react@18.2.0)': dependencies: - '@web3modal/core': 4.1.11(@types/react@18.3.2)(react@18.3.1) + '@web3modal/core': 4.1.11(@types/react@18.3.5)(react@18.2.0) '@web3modal/polyfills': 4.1.11 - valtio: 1.11.2(@types/react@18.3.2)(react@18.3.1) + valtio: 1.11.2(@types/react@18.3.5)(react@18.2.0) transitivePeerDependencies: - '@types/react' - react - '@web3modal/scaffold-utils@4.2.2(@types/react@18.3.2)(react@18.3.1)': + '@web3modal/scaffold-utils@4.2.3(@types/react@18.3.5)(react@18.2.0)': dependencies: - '@web3modal/core': 4.2.2(@types/react@18.3.2)(react@18.3.1) - '@web3modal/polyfills': 4.2.2 - valtio: 1.11.2(@types/react@18.3.2)(react@18.3.1) + '@web3modal/core': 4.2.3(@types/react@18.3.5)(react@18.2.0) + '@web3modal/polyfills': 4.2.3 + valtio: 1.11.2(@types/react@18.3.5)(react@18.2.0) transitivePeerDependencies: - '@types/react' - react - '@web3modal/scaffold-vue@4.1.11(@types/react@18.3.2)(react@18.3.1)': + '@web3modal/scaffold-vue@4.1.11(@types/react@18.3.5)(react@18.2.0)': dependencies: - '@web3modal/scaffold': 4.1.11(@types/react@18.3.2)(react@18.3.1) + '@web3modal/scaffold': 4.1.11(@types/react@18.3.5)(react@18.2.0) transitivePeerDependencies: - '@types/react' - react - '@web3modal/scaffold-vue@4.2.2(@types/react@18.3.2)(react@18.3.1)': + '@web3modal/scaffold-vue@4.2.3(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(@types/react@18.3.5)(react@18.2.0)': dependencies: - '@web3modal/scaffold': 4.2.2(@types/react@18.3.2)(react@18.3.1) + '@web3modal/scaffold': 4.2.3(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(@types/react@18.3.5)(react@18.2.0) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -17477,15 +21003,14 @@ snapshots: - '@types/react' - '@upstash/redis' - '@vercel/kv' - - ioredis - react - - uWebSockets.js + - supports-color - '@web3modal/scaffold@4.1.11(@types/react@18.3.2)(react@18.3.1)': + '@web3modal/scaffold@4.1.11(@types/react@18.3.5)(react@18.2.0)': dependencies: '@web3modal/common': 4.1.11 - '@web3modal/core': 4.1.11(@types/react@18.3.2)(react@18.3.1) - '@web3modal/siwe': 4.1.11(@types/react@18.3.2)(react@18.3.1) + '@web3modal/core': 4.1.11(@types/react@18.3.5)(react@18.2.0) + '@web3modal/siwe': 4.1.11(@types/react@18.3.5)(react@18.2.0) '@web3modal/ui': 4.1.11 '@web3modal/wallet': 4.1.11 lit: 3.1.0 @@ -17493,13 +21018,13 @@ snapshots: - '@types/react' - react - '@web3modal/scaffold@4.2.2(@types/react@18.3.2)(react@18.3.1)': + '@web3modal/scaffold@4.2.3(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(@types/react@18.3.5)(react@18.2.0)': dependencies: - '@web3modal/common': 4.2.2 - '@web3modal/core': 4.2.2(@types/react@18.3.2)(react@18.3.1) - '@web3modal/siwe': 4.2.2(@types/react@18.3.2)(react@18.3.1) - '@web3modal/ui': 4.2.2 - '@web3modal/wallet': 4.2.2 + '@web3modal/common': 4.2.3 + '@web3modal/core': 4.2.3(@types/react@18.3.5)(react@18.2.0) + '@web3modal/siwe': 4.2.3(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(@types/react@18.3.5)(react@18.2.0) + '@web3modal/ui': 4.2.3 + '@web3modal/wallet': 4.2.3 lit: 3.1.0 transitivePeerDependencies: - '@azure/app-configuration' @@ -17515,27 +21040,26 @@ snapshots: - '@types/react' - '@upstash/redis' - '@vercel/kv' - - ioredis - react - - uWebSockets.js + - supports-color - '@web3modal/siwe@4.1.11(@types/react@18.3.2)(react@18.3.1)': + '@web3modal/siwe@4.1.11(@types/react@18.3.5)(react@18.2.0)': dependencies: - '@web3modal/core': 4.1.11(@types/react@18.3.2)(react@18.3.1) - '@web3modal/scaffold-utils': 4.1.11(@types/react@18.3.2)(react@18.3.1) + '@web3modal/core': 4.1.11(@types/react@18.3.5)(react@18.2.0) + '@web3modal/scaffold-utils': 4.1.11(@types/react@18.3.5)(react@18.2.0) lit: 3.1.0 - valtio: 1.11.2(@types/react@18.3.2)(react@18.3.1) + valtio: 1.11.2(@types/react@18.3.5)(react@18.2.0) transitivePeerDependencies: - '@types/react' - react - '@web3modal/siwe@4.2.2(@types/react@18.3.2)(react@18.3.1)': + '@web3modal/siwe@4.2.3(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(@types/react@18.3.5)(react@18.2.0)': dependencies: - '@walletconnect/utils': 2.12.0 - '@web3modal/core': 4.2.2(@types/react@18.3.2)(react@18.3.1) - '@web3modal/scaffold-utils': 4.2.2(@types/react@18.3.2)(react@18.3.1) + '@walletconnect/utils': 2.12.0(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))) + '@web3modal/core': 4.2.3(@types/react@18.3.5)(react@18.2.0) + '@web3modal/scaffold-utils': 4.2.3(@types/react@18.3.5)(react@18.2.0) lit: 3.1.0 - valtio: 1.11.2(@types/react@18.3.2)(react@18.3.1) + valtio: 1.11.2(@types/react@18.3.5)(react@18.2.0) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -17550,52 +21074,100 @@ snapshots: - '@types/react' - '@upstash/redis' - '@vercel/kv' - - ioredis - react - - uWebSockets.js + - supports-color - '@web3modal/ui@4.1.11': + '@web3modal/ui@4.2.3': dependencies: lit: 3.1.0 qrcode: 1.5.3 - '@web3modal/ui@4.2.2': + '@web3modal/ui@4.2.3': dependencies: lit: 3.1.0 qrcode: 1.5.3 - ? '@web3modal/wagmi@4.1.11(@types/react@18.3.2)(@wagmi/connectors@4.3.5(@types/react@18.3.2)(@wagmi/core@2.9.3(@types/react@18.3.2)(bufferutil@4.0.8)(react@18.3.1)(typescript@5.4.5)(utf-8-validate@6.0.3)(viem@2.10.2(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8))(zod@3.23.8))(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react-i18next@13.5.0(i18next@22.5.1)(react-dom@18.3.1(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.3.2)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.3.2)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1)(rollup@4.17.2)(typescript@5.4.5)(utf-8-validate@6.0.3)(viem@2.10.2(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8))(zod@3.23.8))(@wagmi/core@2.9.3(@types/react@18.3.2)(bufferutil@4.0.8)(react@18.3.1)(typescript@5.4.5)(utf-8-validate@6.0.3)(viem@2.10.2(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8))(zod@3.23.8))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(viem@2.10.2(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8))' - : dependencies: - '@wagmi/connectors': 4.3.5(@types/react@18.3.2)(@wagmi/core@2.9.3(@types/react@18.3.2)(bufferutil@4.0.8)(react@18.3.1)(typescript@5.4.5)(utf-8-validate@6.0.3)(viem@2.10.2(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8))(zod@3.23.8))(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react-i18next@13.5.0(i18next@22.5.1)(react-dom@18.3.1(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.3.2)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.3.2)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1)(rollup@4.17.2)(typescript@5.4.5)(utf-8-validate@6.0.3)(viem@2.10.2(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8))(zod@3.23.8) - '@wagmi/core': 2.9.3(@types/react@18.3.2)(bufferutil@4.0.8)(react@18.3.1)(typescript@5.4.5)(utf-8-validate@6.0.3)(viem@2.10.2(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8))(zod@3.23.8) + '@web3modal/wagmi@4.1.11(7bejpi3a2bqeihrssz3xbwxki4)': + dependencies: + '@wagmi/connectors': 4.1.18(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(@types/react@18.3.5)(@wagmi/core@2.8.0(@types/react@18.3.5)(bufferutil@4.0.8)(react@18.2.0)(typescript@5.4.3)(utf-8-validate@5.0.10)(viem@2.21.7(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.22.4))(zod@3.22.4))(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))(react@18.2.0)(rollup@4.21.3)(typescript@5.4.3)(utf-8-validate@5.0.10)(viem@2.21.7(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.22.4))(zod@3.22.4) + '@wagmi/core': 2.8.0(@types/react@18.3.5)(bufferutil@4.0.8)(react@18.2.0)(typescript@5.4.3)(utf-8-validate@5.0.10)(viem@2.21.7(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.22.4))(zod@3.22.4) + '@web3modal/polyfills': 4.1.11 + '@web3modal/scaffold': 4.1.11(@types/react@18.3.5)(react@18.2.0) + '@web3modal/scaffold-react': 4.1.11(@types/react@18.3.5)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@web3modal/scaffold-utils': 4.1.11(@types/react@18.3.5)(react@18.2.0) + '@web3modal/scaffold-vue': 4.1.11(@types/react@18.3.5)(react@18.2.0) + '@web3modal/siwe': 4.1.11(@types/react@18.3.5)(react@18.2.0) + viem: 2.21.7(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.22.4) + optionalDependencies: + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + transitivePeerDependencies: + - '@types/react' + + '@web3modal/wagmi@4.1.11(@types/react@18.3.5)(@wagmi/connectors@4.3.10(vnbhrjghrun7rfuxsawo7otej4))(@wagmi/core@2.10.2(@types/react@18.3.5)(bufferutil@4.0.8)(react@18.2.0)(typescript@5.4.3)(utf-8-validate@5.0.10)(viem@2.9.29(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.23.8))(zod@3.23.8))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(viem@2.9.29(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.23.8))': + dependencies: + '@wagmi/connectors': 4.3.10(vnbhrjghrun7rfuxsawo7otej4) + '@wagmi/core': 2.10.2(@types/react@18.3.5)(bufferutil@4.0.8)(react@18.2.0)(typescript@5.4.3)(utf-8-validate@5.0.10)(viem@2.9.29(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.23.8))(zod@3.23.8) '@web3modal/polyfills': 4.1.11 - '@web3modal/scaffold': 4.1.11(@types/react@18.3.2)(react@18.3.1) - '@web3modal/scaffold-react': 4.1.11(@types/react@18.3.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@web3modal/scaffold-utils': 4.1.11(@types/react@18.3.2)(react@18.3.1) - '@web3modal/scaffold-vue': 4.1.11(@types/react@18.3.2)(react@18.3.1) - '@web3modal/siwe': 4.1.11(@types/react@18.3.2)(react@18.3.1) - viem: 2.10.2(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8) + '@web3modal/scaffold': 4.1.11(@types/react@18.3.5)(react@18.2.0) + '@web3modal/scaffold-react': 4.1.11(@types/react@18.3.5)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@web3modal/scaffold-utils': 4.1.11(@types/react@18.3.5)(react@18.2.0) + '@web3modal/scaffold-vue': 4.1.11(@types/react@18.3.5)(react@18.2.0) + '@web3modal/siwe': 4.1.11(@types/react@18.3.5)(react@18.2.0) + viem: 2.9.29(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.23.8) optionalDependencies: - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) transitivePeerDependencies: - '@types/react' - ? '@web3modal/wagmi@4.2.2(@types/react@18.3.2)(@wagmi/connectors@5.0.6(@types/react@18.3.2)(@wagmi/core@2.10.4(@types/react@18.3.2)(bufferutil@4.0.8)(react@18.3.1)(typescript@5.4.5)(utf-8-validate@6.0.3)(viem@2.13.1(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8))(zod@3.23.8))(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react-i18next@13.5.0(i18next@22.5.1)(react-dom@18.3.1(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.3.2)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.3.2)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1)(rollup@4.17.2)(typescript@5.4.5)(utf-8-validate@6.0.3)(viem@2.13.1(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8))(zod@3.23.8))(@wagmi/core@2.10.4(@types/react@18.3.2)(bufferutil@4.0.8)(react@18.3.1)(typescript@5.4.5)(utf-8-validate@6.0.3)(viem@2.13.1(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8))(zod@3.23.8))(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(utf-8-validate@6.0.3)(viem@2.13.1(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8))' - : dependencies: - '@wagmi/connectors': 5.0.6(@types/react@18.3.2)(@wagmi/core@2.10.4(@types/react@18.3.2)(bufferutil@4.0.8)(react@18.3.1)(typescript@5.4.5)(utf-8-validate@6.0.3)(viem@2.13.1(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8))(zod@3.23.8))(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react-i18next@13.5.0(i18next@22.5.1)(react-dom@18.3.1(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.3.2)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.3.2)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1)(rollup@4.17.2)(typescript@5.4.5)(utf-8-validate@6.0.3)(viem@2.13.1(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8))(zod@3.23.8) - '@wagmi/core': 2.10.4(@types/react@18.3.2)(bufferutil@4.0.8)(react@18.3.1)(typescript@5.4.5)(utf-8-validate@6.0.3)(viem@2.13.1(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8))(zod@3.23.8) - '@walletconnect/ethereum-provider': 2.13.0(@types/react@18.3.2)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3) - '@web3modal/polyfills': 4.2.2 - '@web3modal/scaffold': 4.2.2(@types/react@18.3.2)(react@18.3.1) - '@web3modal/scaffold-react': 4.2.2(@types/react@18.3.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@web3modal/scaffold-utils': 4.2.2(@types/react@18.3.2)(react@18.3.1) - '@web3modal/scaffold-vue': 4.2.2(@types/react@18.3.2)(react@18.3.1) - '@web3modal/siwe': 4.2.2(@types/react@18.3.2)(react@18.3.1) - viem: 2.13.1(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8) + '@web3modal/wagmi@4.2.3(hoyagxhmve75vyxjsj4tjya6zm)': + dependencies: + '@wagmi/connectors': 5.1.10(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(@types/react@18.3.5)(@wagmi/core@2.13.5(@types/react@18.3.5)(react@18.2.0)(typescript@5.4.5)(viem@2.21.7(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8)))(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))(react@18.2.0)(rollup@4.21.3)(typescript@5.4.5)(utf-8-validate@5.0.10)(viem@2.21.7(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8))(zod@3.23.8) + '@wagmi/core': 2.13.5(@types/react@18.3.5)(react@18.2.0)(typescript@5.4.5)(viem@2.21.7(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8)) + '@walletconnect/ethereum-provider': 2.13.0(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(@types/react@18.3.5)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10) + '@web3modal/polyfills': 4.2.3 + '@web3modal/scaffold': 4.2.3(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(@types/react@18.3.5)(react@18.2.0) + '@web3modal/scaffold-react': 4.2.3(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(@types/react@18.3.5)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@web3modal/scaffold-utils': 4.2.3(@types/react@18.3.5)(react@18.2.0) + '@web3modal/scaffold-vue': 4.2.3(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(@types/react@18.3.5)(react@18.2.0) + '@web3modal/siwe': 4.2.3(@react-native-async-storage/async-storage@1.22.0(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)))(@types/react@18.3.5)(react@18.2.0) + viem: 2.21.7(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8) optionalDependencies: + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@types/react' + - '@upstash/redis' + - '@vercel/kv' + - bufferutil + - encoding + - supports-color + - utf-8-validate + + '@web3modal/wagmi@4.2.3(@wagmi/connectors@5.0.21)(@wagmi/core@2.11.6)(react@18.3.1)(viem@2.16.5)': + dependencies: + '@wagmi/connectors': 5.0.21(@wagmi/core@2.11.6)(react-native@0.74.3)(react@18.3.1)(typescript@5.5.3)(viem@2.16.5) + '@wagmi/core': 2.11.6(react@18.3.1)(typescript@5.5.3)(viem@2.16.5) + '@walletconnect/ethereum-provider': 2.13.0(react@18.3.1) + '@web3modal/polyfills': 4.2.3 + '@web3modal/scaffold': 4.2.3(react@18.3.1) + '@web3modal/scaffold-react': 4.2.3(react@18.3.1) + '@web3modal/scaffold-utils': 4.2.3(react@18.3.1) + '@web3modal/scaffold-vue': 4.2.3(react@18.3.1) + '@web3modal/siwe': 4.2.3(react@18.3.1) react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + viem: 2.16.5(typescript@5.5.3)(zod@3.23.8) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -17616,53 +21188,62 @@ snapshots: - uWebSockets.js - utf-8-validate - '@web3modal/wallet@4.1.11': - dependencies: - '@web3modal/polyfills': 4.1.11 - zod: 3.22.4 - - '@web3modal/wallet@4.2.2': + '@web3modal/wallet@4.2.3': dependencies: - '@web3modal/polyfills': 4.2.2 + '@web3modal/polyfills': 4.2.3 zod: 3.22.4 '@webgpu/types@0.1.21': {} - '@yarnpkg/esbuild-plugin-pnp@3.0.0-rc.15(esbuild@0.20.2)': + '@zerodevx/svelte-toast@0.9.5(svelte@4.2.13)': dependencies: - esbuild: 0.20.2 - tslib: 2.6.2 + svelte: 4.2.13 - '@yarnpkg/fslib@2.10.3': + '@zerodevx/svelte-toast@0.9.5(svelte@4.2.17)': dependencies: - '@yarnpkg/libzip': 2.3.0 - tslib: 1.14.1 + svelte: 4.2.17 - '@yarnpkg/libzip@2.3.0': - dependencies: - '@types/emscripten': 1.39.12 - tslib: 1.14.1 + abitype@0.9.10(typescript@5.4.3)(zod@3.22.4): + optionalDependencies: + typescript: 5.4.3 + zod: 3.22.4 - '@zerodevx/svelte-toast@0.9.5(svelte@4.2.16)': - dependencies: - svelte: 4.2.16 + abitype@0.9.8(typescript@5.4.3)(zod@3.22.4): + optionalDependencies: + typescript: 5.4.3 + zod: 3.22.4 - abitype@0.9.10(typescript@5.4.5)(zod@3.23.8): + abitype@0.9.8(typescript@5.4.3)(zod@3.23.8): optionalDependencies: - typescript: 5.4.5 + typescript: 5.4.3 zod: 3.23.8 - abitype@0.9.8(typescript@5.4.5)(zod@3.23.8): + abitype@1.0.0(typescript@5.4.3)(zod@3.22.4): optionalDependencies: - typescript: 5.4.5 + typescript: 5.4.3 + zod: 3.22.4 + + abitype@1.0.0(typescript@5.4.3)(zod@3.23.8): + optionalDependencies: + typescript: 5.4.3 zod: 3.23.8 - abitype@1.0.0(typescript@5.4.5)(zod@3.23.8): + abitype@1.0.2(typescript@5.4.3)(zod@3.23.8): + optionalDependencies: + typescript: 5.4.3 + zod: 3.23.8 + + abitype@1.0.5(typescript@5.4.3)(zod@3.22.4): + optionalDependencies: + typescript: 5.4.3 + zod: 3.22.4 + + abitype@1.0.5(typescript@5.4.5)(zod@3.23.8): optionalDependencies: typescript: 5.4.5 zod: 3.23.8 - abitype@1.0.2(typescript@5.4.5)(zod@3.23.8): + abitype@1.0.6(typescript@5.4.5)(zod@3.23.8): optionalDependencies: typescript: 5.4.5 zod: 3.23.8 @@ -17671,37 +21252,53 @@ snapshots: dependencies: event-target-shim: 5.0.1 + abortcontroller-polyfill@1.7.5: {} + accepts@1.3.8: dependencies: mime-types: 2.1.35 negotiator: 0.6.3 - acorn-jsx@5.3.2(acorn@8.11.3): + acorn-jsx@5.3.2(acorn@8.12.0): dependencies: - acorn: 8.11.3 + acorn: 8.12.0 + + acorn-jsx@5.3.2(acorn@8.12.1): + dependencies: + acorn: 8.12.1 acorn-walk@8.3.2: {} - acorn@8.11.3: {} + acorn@8.12.0: {} - address@1.2.2: {} + acorn@8.12.1: {} + + adm-zip@0.4.16: {} aes-js@3.0.0: {} - agent-base@7.1.1: + aes-js@4.0.0-beta.5: {} + + agent-base@6.0.2: + dependencies: + debug: 4.3.7(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + + agent-base@7.1.0: dependencies: - debug: 4.3.4 + debug: 4.3.7(supports-color@8.1.1) transitivePeerDependencies: - supports-color - aggregate-error@3.1.0: + ajv-draft-04@1.0.0(ajv@8.16.0): dependencies: clean-stack: 2.2.0 indent-string: 4.0.0 - ajv-draft-04@1.0.0(ajv@8.13.0): + ajv-draft-04@1.0.0(ajv@8.12.0): optionalDependencies: - ajv: 8.13.0 + ajv: 8.12.0 ajv@6.12.6: dependencies: @@ -17710,13 +21307,23 @@ snapshots: json-schema-traverse: 0.4.1 uri-js: 4.4.1 - ajv@8.13.0: + ajv@8.12.0: dependencies: fast-deep-equal: 3.1.3 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 uri-js: 4.4.1 + amazon-cognito-identity-js@6.3.12(encoding@0.1.13): + dependencies: + '@aws-crypto/sha256-js': 1.2.2 + buffer: 4.9.2 + fast-base64-decode: 1.0.0 + isomorphic-unfetch: 3.1.0(encoding@0.1.13) + js-cookie: 2.2.1 + transitivePeerDependencies: + - encoding + anser@1.4.10: {} ansi-align@3.0.1: @@ -17725,6 +21332,10 @@ snapshots: ansi-colors@4.1.3: {} + ansi-escapes@4.3.2: + dependencies: + type-fest: 0.21.3 + ansi-fragments@0.2.1: dependencies: colorette: 1.4.0 @@ -17749,7 +21360,7 @@ snapshots: ansi-styles@6.2.1: {} - antlr4@4.13.1-patch-1: {} + antlr4@4.13.1: {} any-promise@1.3.0: {} @@ -17760,8 +21371,6 @@ snapshots: normalize-path: 3.0.0 picomatch: 2.3.1 - app-root-dir@1.0.2: {} - appdirsjs@1.2.7: {} arg@4.1.3: {} @@ -17774,31 +21383,22 @@ snapshots: argparse@2.0.1: {} - aria-hidden@1.2.4: - dependencies: - tslib: 2.6.2 - - aria-query@5.1.3: - dependencies: - deep-equal: 2.2.3 - aria-query@5.3.0: dependencies: dequal: 2.0.3 - array-buffer-byte-length@1.0.1: + array-buffer-byte-length@1.0.0: dependencies: call-bind: 1.0.7 - is-array-buffer: 3.0.4 + is-array-buffer: 3.0.2 array-flatten@1.1.1: {} - array-includes@3.1.8: + array-includes@3.1.7: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.23.3 - es-object-atoms: 1.0.0 + es-abstract: 1.22.3 get-intrinsic: 1.2.4 is-string: 1.0.7 @@ -17806,61 +21406,59 @@ snapshots: array-union@2.1.0: {} - array.prototype.findlastindex@1.2.5: + array.prototype.findlastindex@1.2.3: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.23.3 - es-errors: 1.3.0 - es-object-atoms: 1.0.0 + es-abstract: 1.22.3 es-shim-unscopables: 1.0.2 + get-intrinsic: 1.2.4 array.prototype.flat@1.3.2: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.22.3 es-shim-unscopables: 1.0.2 array.prototype.flatmap@1.3.2: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.22.3 es-shim-unscopables: 1.0.2 - arraybuffer.prototype.slice@1.0.3: + arraybuffer.prototype.slice@1.0.2: dependencies: - array-buffer-byte-length: 1.0.1 + array-buffer-byte-length: 1.0.0 call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.23.3 - es-errors: 1.3.0 + es-abstract: 1.22.3 get-intrinsic: 1.2.4 - is-array-buffer: 3.0.4 - is-shared-array-buffer: 1.0.3 + is-array-buffer: 3.0.2 + is-shared-array-buffer: 1.0.2 asap@2.0.6: {} - assert@2.1.0: + asn1@0.2.6: dependencies: - call-bind: 1.0.7 - is-nan: 1.3.2 - object-is: 1.1.6 - object.assign: 4.1.5 - util: 0.12.5 + safer-buffer: 2.1.2 + + assert-plus@1.0.0: {} assertion-error@1.1.0: {} + assertion-error@2.0.1: {} + ast-parents@0.0.1: {} ast-types@0.15.2: dependencies: - tslib: 2.6.2 + tslib: 2.6.3 ast-types@0.16.1: dependencies: - tslib: 2.6.2 + tslib: 2.6.3 astral-regex@1.0.0: {} @@ -17868,53 +21466,51 @@ snapshots: astring@1.8.6: {} - astro-expressive-code@0.35.3(astro@4.8.3(@types/node@20.12.11)(terser@5.31.0)(typescript@5.4.5)): + astro-expressive-code@0.35.6(astro@4.15.6(@types/node@20.12.7)(rollup@4.21.3)(terser@5.27.2)(typescript@5.4.5)): dependencies: - astro: 4.8.3(@types/node@20.12.11)(terser@5.31.0)(typescript@5.4.5) - rehype-expressive-code: 0.35.3 + astro: 4.15.6(@types/node@20.12.7)(rollup@4.21.3)(terser@5.27.2)(typescript@5.4.5) + rehype-expressive-code: 0.35.6 - astro-og-canvas@0.5.0(astro@4.8.3(@types/node@20.12.11)(terser@5.31.0)(typescript@5.4.5)): + astro-og-canvas@0.5.0(astro@4.15.6(@types/node@20.12.7)(rollup@4.21.3)(terser@5.27.2)(typescript@5.4.5)): dependencies: - astro: 4.8.3(@types/node@20.12.11)(terser@5.31.0)(typescript@5.4.5) + astro: 4.15.6(@types/node@20.12.7)(rollup@4.21.3)(terser@5.27.2)(typescript@5.4.5) canvaskit-wasm: 0.39.1 deterministic-object-hash: 2.0.2 entities: 4.5.0 - astro@4.8.3(@types/node@20.12.11)(terser@5.31.0)(typescript@5.4.5): + astro@4.15.6(@types/node@20.12.7)(rollup@4.21.3)(terser@5.27.2)(typescript@5.4.5): dependencies: - '@astrojs/compiler': 2.8.0 - '@astrojs/internal-helpers': 0.4.0 - '@astrojs/markdown-remark': 5.1.0 + '@astrojs/compiler': 2.10.3 + '@astrojs/internal-helpers': 0.4.1 + '@astrojs/markdown-remark': 5.2.0 '@astrojs/telemetry': 3.1.0 - '@babel/core': 7.24.5 - '@babel/generator': 7.24.5 - '@babel/parser': 7.24.5 - '@babel/plugin-transform-react-jsx': 7.23.4(@babel/core@7.24.5) - '@babel/traverse': 7.24.5 - '@babel/types': 7.24.5 + '@babel/core': 7.25.2 + '@babel/plugin-transform-react-jsx': 7.25.2(@babel/core@7.25.2) + '@babel/types': 7.25.6 + '@oslojs/encoding': 0.4.1 + '@rollup/pluginutils': 5.1.0(rollup@4.21.3) '@types/babel__core': 7.20.5 '@types/cookie': 0.6.0 - acorn: 8.11.3 + acorn: 8.12.1 aria-query: 5.3.0 - axobject-query: 4.0.0 + axobject-query: 4.1.0 boxen: 7.1.1 - chokidar: 3.6.0 ci-info: 4.0.0 clsx: 2.1.1 common-ancestor-path: 1.0.1 cookie: 0.6.0 cssesc: 3.0.0 - debug: 4.3.4 + debug: 4.3.7(supports-color@8.1.1) deterministic-object-hash: 2.0.2 devalue: 5.0.0 diff: 5.2.0 dlv: 1.1.3 dset: 3.1.3 - es-module-lexer: 1.5.2 - esbuild: 0.21.2 + es-module-lexer: 1.5.4 + esbuild: 0.21.5 estree-walker: 3.0.3 - execa: 8.0.1 fast-glob: 3.3.2 + fastq: 1.17.1 flattie: 1.1.1 github-slugger: 2.0.0 gray-matter: 4.0.3 @@ -17922,36 +21518,43 @@ snapshots: http-cache-semantics: 4.1.1 js-yaml: 4.1.0 kleur: 4.1.5 - magic-string: 0.30.10 + magic-string: 0.30.11 + magicast: 0.3.5 + micromatch: 4.0.8 mrmime: 2.0.0 - ora: 8.0.1 - p-limit: 5.0.0 + neotraverse: 0.6.18 + ora: 8.1.0 + p-limit: 6.1.0 p-queue: 8.0.1 path-to-regexp: 6.2.2 - preferred-pm: 3.1.3 + preferred-pm: 4.0.0 prompts: 2.4.2 rehype: 13.0.1 - resolve: 1.22.8 - semver: 7.6.2 - shiki: 1.5.1 - string-width: 7.1.0 + semver: 7.6.3 + shiki: 1.17.6 + string-width: 7.2.0 strip-ansi: 7.1.0 - tsconfck: 3.0.3(typescript@5.4.5) + tinyexec: 0.3.0 + tsconfck: 3.1.3(typescript@5.4.5) unist-util-visit: 5.0.0 - vfile: 6.0.1 - vite: 5.2.11(@types/node@20.12.11)(terser@5.31.0) - vitefu: 0.2.5(vite@5.2.11(@types/node@20.12.11)(terser@5.31.0)) - which-pm: 2.1.1 + vfile: 6.0.3 + vite: 5.4.5(@types/node@20.12.7)(terser@5.27.2) + vitefu: 1.0.2(vite@5.4.5(@types/node@20.12.7)(terser@5.27.2)) + which-pm: 3.0.0 + xxhash-wasm: 1.0.2 yargs-parser: 21.1.1 zod: 3.23.8 - zod-to-json-schema: 3.23.0(zod@3.23.8) + zod-to-json-schema: 3.23.3(zod@3.23.8) + zod-to-ts: 1.2.0(typescript@5.4.5)(zod@3.23.8) optionalDependencies: - sharp: 0.33.3 + sharp: 0.33.4 transitivePeerDependencies: - '@types/node' - less - lightningcss + - rollup - sass + - sass-embedded - stylus - sugarss - supports-color @@ -17962,31 +21565,73 @@ snapshots: async-mutex@0.2.6: dependencies: - tslib: 2.6.2 + tslib: 2.6.3 - async@3.2.5: {} + async-retry@1.3.3: + dependencies: + retry: 0.13.1 + + async@2.6.4: + dependencies: + lodash: 4.17.21 + + async@3.2.3: {} asynckit@0.4.0: {} atomic-sleep@1.0.0: {} + autoprefixer@10.4.18(postcss@8.4.38): + dependencies: + browserslist: 4.23.0 + caniuse-lite: 1.0.30001593 + fraction.js: 4.3.7 + normalize-range: 0.1.2 + picocolors: 1.0.1 + postcss: 8.4.39 + postcss-value-parser: 4.2.0 + autoprefixer@10.4.19(postcss@8.4.38): dependencies: browserslist: 4.23.0 - caniuse-lite: 1.0.30001617 + caniuse-lite: 1.0.30001614 fraction.js: 4.3.7 normalize-range: 0.1.2 picocolors: 1.0.0 postcss: 8.4.38 postcss-value-parser: 4.2.0 - available-typed-arrays@1.0.7: + autoprefixer@10.4.19(postcss@8.4.47): + dependencies: + browserslist: 4.23.0 + caniuse-lite: 1.0.30001614 + fraction.js: 4.3.7 + normalize-range: 0.1.2 + picocolors: 1.0.0 + postcss: 8.4.47 + postcss-value-parser: 4.2.0 + + available-typed-arrays@1.0.5: {} + + aws-sign2@0.7.0: {} + + aws4@1.13.2: {} + + axios-proxy-builder@0.1.2: + dependencies: + tunnel: 0.0.6 + + axios@1.6.7(debug@4.3.4): dependencies: - possible-typed-array-names: 1.0.0 + 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.8(debug@4.3.4): + axios@1.7.7: dependencies: - follow-redirects: 1.15.6(debug@4.3.4) + follow-redirects: 1.15.9(debug@4.3.7) form-data: 4.0.0 proxy-from-env: 1.1.0 transitivePeerDependencies: @@ -17996,37 +21641,45 @@ snapshots: dependencies: dequal: 2.0.3 - babel-core@7.0.0-bridge.0(@babel/core@7.24.5): + axobject-query@4.1.0: {} + + babel-core@7.0.0-bridge.0(@babel/core@7.25.2): dependencies: - '@babel/core': 7.24.5 + '@babel/core': 7.25.2 - babel-plugin-polyfill-corejs2@0.4.11(@babel/core@7.24.5): + babel-plugin-macros@3.1.0: dependencies: - '@babel/compat-data': 7.24.4 - '@babel/core': 7.24.5 - '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.24.5) + '@babel/runtime': 7.23.9 + cosmiconfig: 7.1.0 + resolve: 1.22.8 + + babel-plugin-polyfill-corejs2@0.4.8(@babel/core@7.25.2): + dependencies: + '@babel/compat-data': 7.25.4 + '@babel/core': 7.25.2 + '@babel/helper-define-polyfill-provider': 0.5.0(@babel/core@7.25.2) semver: 6.3.1 transitivePeerDependencies: - supports-color - babel-plugin-polyfill-corejs3@0.10.4(@babel/core@7.24.5): + babel-plugin-polyfill-corejs3@0.9.0(@babel/core@7.25.2): dependencies: - '@babel/core': 7.24.5 - '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.24.5) - core-js-compat: 3.37.0 + '@babel/core': 7.25.2 + '@babel/helper-define-polyfill-provider': 0.5.0(@babel/core@7.25.2) + core-js-compat: 3.36.0 transitivePeerDependencies: - supports-color - babel-plugin-polyfill-regenerator@0.6.2(@babel/core@7.24.5): + babel-plugin-polyfill-regenerator@0.5.5(@babel/core@7.25.2): dependencies: - '@babel/core': 7.24.5 - '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.24.5) + '@babel/core': 7.25.2 + '@babel/helper-define-polyfill-provider': 0.5.0(@babel/core@7.25.2) transitivePeerDependencies: - supports-color - babel-plugin-transform-flow-enums@0.0.2(@babel/core@7.24.5): + babel-plugin-transform-flow-enums@0.0.2(@babel/core@7.25.2): dependencies: - '@babel/plugin-syntax-flow': 7.24.1(@babel/core@7.24.5) + '@babel/plugin-syntax-flow': 7.23.3(@babel/core@7.25.2) transitivePeerDependencies: - '@babel/core' @@ -18052,17 +21705,21 @@ snapshots: is-alphanumerical: 2.0.1 is-decimal: 2.0.1 + bcrypt-pbkdf@1.0.2: + dependencies: + tweetnacl: 0.14.5 + bech32@1.1.4: {} - better-opn@3.0.2: + better-path-resolve@1.0.0: dependencies: - open: 8.4.2 + is-windows: 1.0.2 big-integer@1.6.52: {} bignumber.js@9.1.2: {} - binary-extensions@2.3.0: {} + binary-extensions@2.2.0: {} bl@4.1.0: dependencies: @@ -18078,9 +21735,11 @@ snapshots: blakejs@1.2.1: {} - blob-to-it@2.0.6: + blob-to-it@2.0.7: dependencies: - browser-readablestream-to-it: 2.0.7 + browser-readablestream-to-it: 2.0.6 + + bluebird@3.7.2: {} bn.js@4.11.6: {} @@ -18088,7 +21747,7 @@ snapshots: bn.js@5.2.1: {} - body-parser@1.20.2: + body-parser@1.20.3: dependencies: bytes: 3.1.2 content-type: 1.0.5 @@ -18098,7 +21757,7 @@ snapshots: http-errors: 2.0.0 iconv-lite: 0.4.24 on-finished: 2.4.1 - qs: 6.11.0 + qs: 6.13.0 raw-body: 2.5.2 type-is: 1.6.18 unpipe: 1.0.0 @@ -18109,6 +21768,17 @@ snapshots: bowser@2.11.0: {} + 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 + boxen@7.1.1: dependencies: ansi-align: 3.0.1 @@ -18133,9 +21803,13 @@ snapshots: dependencies: balanced-match: 1.0.2 - braces@3.0.2: + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + braces@3.0.3: dependencies: - fill-range: 7.0.1 + fill-range: 7.1.1 brorand@1.1.0: {} @@ -18143,7 +21817,9 @@ snapshots: browser-readablestream-to-it@1.0.3: {} - browser-readablestream-to-it@2.0.7: {} + browser-readablestream-to-it@2.0.6: {} + + browser-stdout@1.3.1: {} browserify-aes@1.2.0: dependencies: @@ -18154,16 +21830,19 @@ snapshots: inherits: 2.0.4 safe-buffer: 5.2.1 - browserify-zlib@0.1.4: - dependencies: - pako: 0.2.9 - browserslist@4.23.0: dependencies: - caniuse-lite: 1.0.30001617 - electron-to-chromium: 1.4.761 + caniuse-lite: 1.0.30001593 + electron-to-chromium: 1.4.676 node-releases: 2.0.14 - update-browserslist-db: 1.0.15(browserslist@4.23.0) + update-browserslist-db: 1.0.13(browserslist@4.23.0) + + browserslist@4.23.3: + dependencies: + caniuse-lite: 1.0.30001660 + electron-to-chromium: 1.5.23 + node-releases: 2.0.18 + update-browserslist-db: 1.1.0(browserslist@4.23.3) bs58@4.0.1: dependencies: @@ -18183,14 +21862,22 @@ snapshots: dependencies: node-int64: 0.4.0 - buffer-crc32@0.2.13: {} + buffer-crc32@1.0.0: {} buffer-from@1.1.2: {} buffer-reverse@1.0.1: {} + buffer-to-arraybuffer@0.0.5: {} + buffer-xor@1.0.3: {} + buffer@4.9.2: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + isarray: 1.0.0 + buffer@5.6.0: dependencies: base64-js: 1.5.1 @@ -18208,15 +21895,19 @@ snapshots: bufferutil@4.0.8: dependencies: - node-gyp-build: 4.8.1 + node-gyp-build: 4.8.0 builtin-modules@3.3.0: {} - builtins@5.1.0: + builtins@5.0.1: dependencies: - semver: 7.6.2 + semver: 7.6.3 + + bundle-name@3.0.0: + dependencies: + run-applescript: 5.0.0 - bundle-require@4.1.0(esbuild@0.19.12): + bundle-require@4.0.2(esbuild@0.19.12): dependencies: esbuild: 0.19.12 load-tsconfig: 0.2.5 @@ -18227,6 +21918,10 @@ snapshots: cac@6.7.14: {} + cacheable-lookup@5.0.4: {} + + cacheable-lookup@6.1.0: {} + cacheable-lookup@7.0.0: {} cacheable-request@10.2.14: @@ -18236,16 +21931,26 @@ snapshots: http-cache-semantics: 4.1.1 keyv: 4.5.4 mimic-response: 4.0.0 - normalize-url: 8.0.1 + normalize-url: 8.0.0 responselike: 3.0.0 + cacheable-request@7.0.4: + dependencies: + clone-response: 1.0.3 + 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 + call-bind@1.0.7: dependencies: es-define-property: 1.0.0 es-errors: 1.3.0 function-bind: 1.1.2 get-intrinsic: 1.2.4 - set-function-length: 1.2.2 + set-function-length: 1.2.1 call-me-maybe@1.0.2: {} @@ -18261,11 +21966,6 @@ snapshots: callsites@3.1.0: {} - camel-case@4.1.2: - dependencies: - pascal-case: 3.1.2 - tslib: 2.6.2 - camelcase-css@2.0.1: {} camelcase@5.3.1: {} @@ -18274,7 +21974,11 @@ snapshots: camelcase@7.0.1: {} - caniuse-lite@1.0.30001617: {} + caniuse-lite@1.0.30001593: {} + + caniuse-lite@1.0.30001614: {} + + caniuse-lite@1.0.30001660: {} canvaskit-wasm@0.39.1: dependencies: @@ -18286,6 +21990,8 @@ snapshots: tslib: 2.6.2 upper-case-first: 2.0.2 + caseless@0.12.0: {} + cborg@4.2.0: {} ccount@2.0.1: {} @@ -18294,12 +22000,20 @@ snapshots: dependencies: assertion-error: 1.1.0 check-error: 1.0.3 - deep-eql: 4.1.3 + deep-eql: 4.1.4 get-func-name: 2.0.2 loupe: 2.3.7 pathval: 1.1.1 type-detect: 4.0.8 + chai@5.1.1: + dependencies: + assertion-error: 2.0.1 + check-error: 2.1.1 + deep-eql: 5.0.2 + loupe: 3.1.1 + pathval: 2.0.0 + chalk@2.4.2: dependencies: ansi-styles: 3.2.1 @@ -18318,20 +22032,9 @@ snapshots: chalk@5.3.0: {} - change-case@4.1.2: - dependencies: - camel-case: 4.1.2 - capital-case: 1.0.4 - constant-case: 3.0.4 - dot-case: 3.0.4 - header-case: 2.0.4 - no-case: 3.0.4 - param-case: 3.0.4 - pascal-case: 3.1.2 - path-case: 3.0.4 - sentence-case: 3.0.4 - snake-case: 3.0.4 - tslib: 2.6.2 + change-case@5.4.4: {} + + change-case@5.4.4: {} character-entities-html4@2.1.0: {} @@ -18341,14 +22044,18 @@ snapshots: character-reference-invalid@2.0.1: {} + chardet@0.7.0: {} + check-error@1.0.3: dependencies: get-func-name: 2.0.2 + check-error@2.1.1: {} + chokidar@3.6.0: dependencies: anymatch: 3.1.3 - braces: 3.0.2 + braces: 3.0.3 glob-parent: 5.1.2 is-binary-path: 2.1.0 is-glob: 4.0.3 @@ -18357,18 +22064,33 @@ snapshots: optionalDependencies: fsevents: 2.3.3 + chokidar@4.0.0: + dependencies: + readdirp: 4.0.1 + chownr@1.1.4: {} - chownr@2.0.0: {} + chromatic@11.10.2: {} - chromatic@11.3.2: {} + chromatic@11.3.0: {} chrome-launcher@0.15.2: dependencies: - '@types/node': 20.12.11 + '@types/node': 20.12.7 + escape-string-regexp: 4.0.0 + is-wsl: 2.2.0 + lighthouse-logger: 1.4.2 + transitivePeerDependencies: + - supports-color + + chromium-edge-launcher@1.0.0: + dependencies: + '@types/node': 20.12.7 escape-string-regexp: 4.0.0 is-wsl: 2.2.0 lighthouse-logger: 1.4.2 + mkdirp: 1.0.4 + rimraf: 3.0.2 transitivePeerDependencies: - supports-color @@ -18378,6 +22100,14 @@ snapshots: ci-info@4.0.0: {} + cids@0.7.5: + dependencies: + buffer: 5.7.1 + class-is: 1.1.0 + multibase: 0.6.1 + multicodec: 1.0.4 + multihashes: 0.4.21 + cipher-base@1.0.4: dependencies: inherits: 2.0.4 @@ -18387,17 +22117,21 @@ snapshots: dependencies: consola: 3.2.3 + class-is@1.1.0: {} + clean-stack@2.2.0: {} + cli-boxes@2.2.1: {} + cli-boxes@3.0.0: {} - cli-color@2.0.4: + cli-color@2.0.3: dependencies: - d: 1.0.2 - es5-ext: 0.10.64 + d: 1.0.1 + es5-ext: 0.10.62 es6-iterator: 2.0.3 - memoizee: 0.4.15 - timers-ext: 0.1.7 + memoizee: 0.4.17 + timers-ext: 0.1.8 cli-cursor@3.1.0: dependencies: @@ -18407,13 +22141,11 @@ snapshots: dependencies: restore-cursor: 4.0.0 - cli-spinners@2.9.2: {} - - cli-table3@0.6.5: + cli-cursor@5.0.0: dependencies: - string-width: 4.2.3 - optionalDependencies: - '@colors/colors': 1.5.0 + restore-cursor: 5.1.0 + + cli-spinners@2.9.2: {} clipboardy@4.0.0: dependencies: @@ -18427,6 +22159,12 @@ snapshots: 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 @@ -18439,12 +22177,18 @@ snapshots: kind-of: 6.0.3 shallow-clone: 3.0.1 + clone-response@1.0.3: + dependencies: + mimic-response: 1.0.1 + clone@1.0.4: {} clsx@1.2.1: {} clsx@2.1.1: {} + cluster-key-slot@1.1.2: {} + code-block-writer@12.0.0: {} code-error-fragment@0.0.230: {} @@ -18453,7 +22197,7 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.4.15 '@types/estree': 1.0.5 - acorn: 8.11.3 + acorn: 8.12.0 estree-walker: 3.0.3 periscopic: 3.1.0 @@ -18483,6 +22227,8 @@ snapshots: colorette@1.4.0: {} + colors@1.0.3: {} + combined-stream@1.0.8: dependencies: delayed-stream: 1.0.0 @@ -18497,8 +22243,6 @@ snapshots: commander@4.1.1: {} - commander@6.2.1: {} - commander@8.3.0: {} commander@9.5.0: {} @@ -18525,8 +22269,6 @@ snapshots: concat-map@0.0.1: {} - confbox@0.1.7: {} - config-chain@1.1.13: dependencies: ini: 1.3.8 @@ -18543,34 +22285,45 @@ snapshots: consola@3.2.3: {} - constant-case@3.0.4: - dependencies: - no-case: 3.0.4 - tslib: 2.6.2 - upper-case: 2.0.2 - content-disposition@0.5.4: dependencies: safe-buffer: 5.2.1 + content-hash@2.5.2: + dependencies: + cids: 0.7.5 + multicodec: 0.5.7 + multihashes: 0.4.21 + content-type@1.0.5: {} - convert-csv-to-json@2.46.0: {} + convert-csv-to-json@2.48.0: {} + + convert-source-map@1.9.0: {} convert-source-map@2.0.0: {} - cookie-es@1.1.0: {} + cookie-es@1.0.0: {} cookie-signature@1.0.6: {} + cookie@0.4.2: {} + cookie@0.6.0: {} - core-js-compat@3.37.0: + core-js-compat@3.36.0: dependencies: - browserslist: 4.23.0 + browserslist: 4.23.3 + + core-util-is@1.0.2: {} core-util-is@1.0.3: {} + cors@2.8.5: + dependencies: + object-assign: 4.1.1 + vary: 1.1.2 + cosmiconfig@5.2.1: dependencies: import-fresh: 2.0.0 @@ -18578,14 +22331,30 @@ snapshots: js-yaml: 3.14.1 parse-json: 4.0.0 - cosmiconfig@8.3.6(typescript@5.4.5): + cosmiconfig@7.1.0: + dependencies: + '@types/parse-json': 4.0.2 + import-fresh: 3.3.0 + parse-json: 5.2.0 + path-type: 4.0.0 + yaml: 1.10.2 + + cosmiconfig@8.3.6(typescript@5.4.3): dependencies: import-fresh: 3.3.0 js-yaml: 4.1.0 parse-json: 5.2.0 path-type: 4.0.0 optionalDependencies: - typescript: 5.4.5 + typescript: 5.4.3 + + cosmiconfig@8.3.6(typescript@5.4.5): + dependencies: + import-fresh: 3.3.0 + js-yaml: 4.1.0 + parse-json: 5.2.0 + path-type: 4.0.0 + typescript: 5.5.3 crc-32@1.2.2: {} @@ -18608,32 +22377,36 @@ snapshots: create-require@1.1.1: {} - cross-fetch@3.1.8(encoding@0.1.13): + cross-fetch@3.1.8: dependencies: - node-fetch: 2.7.0(encoding@0.1.13) + node-fetch: 2.7.0 transitivePeerDependencies: - encoding - cross-fetch@4.0.0(encoding@0.1.13): + cross-fetch@4.0.0: dependencies: - node-fetch: 2.7.0(encoding@0.1.13) + node-fetch: 2.7.0 transitivePeerDependencies: - encoding + 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 - crossws@0.2.4: {} + crossws@0.1.1: {} crypto-js@3.3.0: {} crypto-js@4.2.0: {} - crypto-random-string@2.0.0: {} - css-selector-parser@3.0.5: {} css-selector-tokenizer@0.8.0: @@ -18658,17 +22431,19 @@ snapshots: culori@3.3.0: {} - d@1.0.2: + cycle@1.0.3: {} + + d@1.0.1: dependencies: es5-ext: 0.10.64 - type: 2.7.2 + type: 1.2.0 dag-jose@4.0.0: dependencies: - '@ipld/dag-cbor': 9.2.0 + '@ipld/dag-cbor': 9.2.1 multiformats: 11.0.2 - daisyui@4.11.1(postcss@8.4.38): + daisyui@4.10.1(postcss@8.4.38): dependencies: css-selector-tokenizer: 0.8.0 culori: 3.3.0 @@ -18677,37 +22452,39 @@ snapshots: transitivePeerDependencies: - postcss - data-urls@5.0.0: + daisyui@4.11.1(postcss@8.4.38): dependencies: - whatwg-mimetype: 4.0.0 - whatwg-url: 14.0.0 + css-selector-tokenizer: 0.8.0 + culori: 3.3.0 + picocolors: 1.0.1 + postcss-js: 4.0.1(postcss@8.4.39) + transitivePeerDependencies: + - postcss - data-view-buffer@1.0.1: + daisyui@4.11.1(postcss@8.4.47): dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-data-view: 1.0.1 + css-selector-tokenizer: 0.8.0 + culori: 3.3.0 + picocolors: 1.0.0 + postcss-js: 4.0.1(postcss@8.4.47) + transitivePeerDependencies: + - postcss - data-view-byte-length@1.0.1: + dashdash@1.14.1: dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-data-view: 1.0.1 + assert-plus: 1.0.0 - data-view-byte-offset@1.0.0: + data-urls@5.0.0: dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-data-view: 1.0.1 + whatwg-mimetype: 4.0.0 + whatwg-url: 14.0.0 date-fns@2.30.0: dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.23.9 dayjs@1.11.10: {} - dayjs@1.11.11: {} - debug@2.6.9: dependencies: ms: 2.0.0 @@ -18716,12 +22493,20 @@ snapshots: dependencies: ms: 2.1.3 - debug@4.3.4: + debug@4.3.5: dependencies: ms: 2.1.2 + debug@4.3.7(supports-color@8.1.1): + dependencies: + ms: 2.1.3 + optionalDependencies: + supports-color: 8.1.1 + decamelize@1.2.0: {} + decamelize@4.0.0: {} + decimal.js@10.4.3: {} decode-named-character-reference@1.0.2: @@ -18730,6 +22515,10 @@ snapshots: decode-uri-component@0.2.2: {} + decompress-response@3.3.0: + dependencies: + mimic-response: 1.0.1 + decompress-response@6.0.0: dependencies: mimic-response: 3.1.0 @@ -18738,30 +22527,11 @@ snapshots: dedent@0.7.0: {} - deep-eql@4.1.3: + deep-eql@4.1.4: dependencies: type-detect: 4.0.8 - deep-equal@2.2.3: - dependencies: - array-buffer-byte-length: 1.0.1 - call-bind: 1.0.7 - es-get-iterator: 1.1.3 - get-intrinsic: 1.2.4 - is-arguments: 1.1.1 - is-array-buffer: 3.0.4 - is-date-object: 1.0.5 - is-regex: 1.1.4 - is-shared-array-buffer: 1.0.3 - isarray: 2.0.5 - object-is: 1.1.6 - object-keys: 1.1.1 - object.assign: 4.1.5 - regexp.prototype.flags: 1.5.2 - side-channel: 1.0.6 - which-boxed-primitive: 1.0.2 - which-collection: 1.0.2 - which-typed-array: 1.1.15 + deep-eql@5.0.2: {} deep-extend@0.6.0: {} @@ -18774,6 +22544,13 @@ snapshots: bplist-parser: 0.2.0 untildify: 4.0.0 + default-browser@4.0.0: + dependencies: + bundle-name: 3.0.0 + default-browser-id: 3.0.0 + execa: 7.2.0 + titleize: 3.0.0 + defaults@1.0.4: dependencies: clone: 1.0.4 @@ -18788,31 +22565,30 @@ snapshots: define-lazy-prop@2.0.0: {} + define-lazy-prop@3.0.0: {} + define-properties@1.2.1: dependencies: define-data-property: 1.1.4 has-property-descriptors: 1.0.2 - object-keys: 1.1.1 - - defu@6.1.4: {} - - del@6.1.1: - dependencies: - globby: 11.1.0 - graceful-fs: 4.2.11 - is-glob: 4.0.3 - is-path-cwd: 2.2.0 - is-path-inside: 3.0.3 - p-map: 4.0.0 - rimraf: 3.0.2 - slash: 3.0.0 + object-keys: 1.1.1 + + defu@6.1.4: {} delayed-stream@1.0.0: {} denodeify@1.2.1: {} + denque@2.1.0: {} + depd@2.0.0: {} + deprecated-react-native-prop-types@5.0.0: + dependencies: + '@react-native/normalize-colors': 0.73.2 + invariant: 2.2.4 + prop-types: 15.8.1 + dequal@2.0.3: {} destr@2.0.3: {} @@ -18827,19 +22603,6 @@ snapshots: detect-libc@2.0.3: {} - detect-node-es@1.1.0: {} - - detect-package-manager@2.0.1: - dependencies: - execa: 5.1.1 - - detect-port@1.6.1: - dependencies: - address: 1.2.2 - debug: 4.3.4 - transitivePeerDependencies: - - supports-color - deterministic-object-hash@2.0.2: dependencies: base-64: 1.0.0 @@ -18871,9 +22634,9 @@ snapshots: dns-over-http-resolver@2.1.3: dependencies: debug: 4.3.4 - native-fetch: 4.0.2(undici@5.28.4) + native-fetch: 4.0.2(undici@5.28.3) receptacle: 1.3.2 - undici: 5.28.4 + undici: 5.28.3 transitivePeerDependencies: - supports-color @@ -18899,6 +22662,8 @@ snapshots: domhandler: 4.3.1 entities: 2.2.0 + dom-walk@0.1.2: {} + domelementtype@2.3.0: {} domhandler@3.3.0: @@ -18915,11 +22680,6 @@ snapshots: domelementtype: 2.3.0 domhandler: 4.3.1 - dot-case@3.0.4: - dependencies: - no-case: 3.0.4 - tslib: 2.6.2 - dotenv-expand@10.0.0: {} dotenv@16.4.5: {} @@ -18928,22 +22688,20 @@ snapshots: dset@3.1.3: {} - duplexify@3.7.1: - dependencies: - end-of-stream: 1.4.4 - inherits: 2.0.4 - readable-stream: 2.3.8 - stream-shift: 1.0.3 - - duplexify@4.1.3: + duplexify@4.1.2: dependencies: end-of-stream: 1.4.4 inherits: 2.0.4 readable-stream: 3.6.2 - stream-shift: 1.0.3 + stream-shift: 1.0.1 eastasianwidth@0.2.0: {} + ecc-jsbn@0.1.2: + dependencies: + jsbn: 0.1.1 + safer-buffer: 2.1.2 + eciesjs@0.3.18: dependencies: '@types/secp256k1': 4.0.6 @@ -18952,15 +22710,21 @@ snapshots: ee-first@1.1.1: {} - ejs@3.1.10: + eigenlayer-contracts@https://codeload.github.com/Layr-labs/eigenlayer-contracts/tar.gz/30040aa273edeefe83333fa9183a0a26a84cebf0(hardhat@2.22.13(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.3))(typescript@5.4.3)(utf-8-validate@5.0.10)): dependencies: - jake: 10.9.1 + solidity-docgen: 0.6.0-beta.36(hardhat@2.22.13(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.3))(typescript@5.4.3)(utf-8-validate@5.0.10)) + transitivePeerDependencies: + - hardhat + + eigenlayer-middleware@https://codeload.github.com/layr-Labs/eigenlayer-middleware/tar.gz/7d49b5181b09198ed275783453aa082bb3766990: {} electron-fetch@1.9.1: dependencies: encoding: 0.1.13 - electron-to-chromium@1.4.761: {} + electron-to-chromium@1.4.676: {} + + electron-to-chromium@1.5.23: {} elliptic@6.5.4: dependencies: @@ -18972,7 +22736,7 @@ snapshots: minimalistic-assert: 1.0.1 minimalistic-crypto-utils: 1.0.1 - elliptic@6.5.5: + elliptic@6.5.7: dependencies: bn.js: 4.12.0 brorand: 1.1.0 @@ -18997,6 +22761,8 @@ snapshots: encodeurl@1.0.2: {} + encodeurl@2.0.0: {} + encoding@0.1.13: dependencies: iconv-lite: 0.6.3 @@ -19005,10 +22771,22 @@ snapshots: dependencies: once: 1.4.0 + engine.io-client@6.5.3(bufferutil@4.0.8)(utf-8-validate@5.0.10): + dependencies: + '@socket.io/component-emitter': 3.1.0 + debug: 4.3.7(supports-color@8.1.1) + engine.io-parser: 5.2.2 + ws: 8.11.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + xmlhttprequest-ssl: 2.0.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + engine.io-client@6.5.3(bufferutil@4.0.8)(utf-8-validate@6.0.3): dependencies: - '@socket.io/component-emitter': 3.1.2 - debug: 4.3.4 + '@socket.io/component-emitter': 3.1.0 + debug: 4.3.7(supports-color@8.1.1) engine.io-parser: 5.2.2 ws: 8.11.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) xmlhttprequest-ssl: 2.0.0 @@ -19028,7 +22806,9 @@ snapshots: entities@4.5.0: {} - envinfo@7.13.0: {} + env-paths@2.2.1: {} + + envinfo@7.11.1: {} err-code@3.0.1: {} @@ -19045,54 +22825,47 @@ snapshots: accepts: 1.3.8 escape-html: 1.0.3 - es-abstract@1.23.3: + es-abstract@1.22.3: dependencies: - array-buffer-byte-length: 1.0.1 - arraybuffer.prototype.slice: 1.0.3 - available-typed-arrays: 1.0.7 + array-buffer-byte-length: 1.0.0 + arraybuffer.prototype.slice: 1.0.2 + available-typed-arrays: 1.0.5 call-bind: 1.0.7 - data-view-buffer: 1.0.1 - data-view-byte-length: 1.0.1 - data-view-byte-offset: 1.0.0 - es-define-property: 1.0.0 - es-errors: 1.3.0 - es-object-atoms: 1.0.0 - es-set-tostringtag: 2.0.3 + es-set-tostringtag: 2.0.2 es-to-primitive: 1.2.1 function.prototype.name: 1.1.6 get-intrinsic: 1.2.4 - get-symbol-description: 1.0.2 - globalthis: 1.0.4 + get-symbol-description: 1.0.0 + globalthis: 1.0.3 gopd: 1.0.1 has-property-descriptors: 1.0.2 has-proto: 1.0.3 has-symbols: 1.0.3 - hasown: 2.0.2 - internal-slot: 1.0.7 - is-array-buffer: 3.0.4 + hasown: 2.0.1 + internal-slot: 1.0.6 + is-array-buffer: 3.0.2 is-callable: 1.2.7 - is-data-view: 1.0.1 - is-negative-zero: 2.0.3 + is-negative-zero: 2.0.2 is-regex: 1.1.4 - is-shared-array-buffer: 1.0.3 + is-shared-array-buffer: 1.0.2 is-string: 1.0.7 - is-typed-array: 1.1.13 + is-typed-array: 1.1.12 is-weakref: 1.0.2 - object-inspect: 1.13.1 + object-inspect: 1.13.2 object-keys: 1.1.1 object.assign: 4.1.5 - regexp.prototype.flags: 1.5.2 - safe-array-concat: 1.1.2 - safe-regex-test: 1.0.3 - string.prototype.trim: 1.2.9 - string.prototype.trimend: 1.0.8 - string.prototype.trimstart: 1.0.8 - typed-array-buffer: 1.0.2 - typed-array-byte-length: 1.0.1 - typed-array-byte-offset: 1.0.2 - typed-array-length: 1.0.6 + 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.15 + which-typed-array: 1.1.13 es-define-property@1.0.0: dependencies: @@ -19100,33 +22873,19 @@ snapshots: es-errors@1.3.0: {} - es-get-iterator@1.1.3: - dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 - has-symbols: 1.0.3 - is-arguments: 1.1.1 - is-map: 2.0.3 - is-set: 2.0.3 - is-string: 1.0.7 - isarray: 2.0.5 - stop-iteration-iterator: 1.0.0 - - es-module-lexer@1.5.2: {} + es-module-lexer@1.5.3: {} - es-object-atoms@1.0.0: - dependencies: - es-errors: 1.3.0 + es-module-lexer@1.5.4: {} - es-set-tostringtag@2.0.3: + es-set-tostringtag@2.0.2: dependencies: get-intrinsic: 1.2.4 - has-tostringtag: 1.0.2 - hasown: 2.0.2 + has-tostringtag: 1.0.0 + hasown: 2.0.1 es-shim-unscopables@1.0.2: dependencies: - hasown: 2.0.2 + hasown: 2.0.1 es-to-primitive@1.2.1: dependencies: @@ -19134,39 +22893,45 @@ snapshots: is-date-object: 1.0.5 is-symbol: 1.0.4 + es5-ext@0.10.62: + dependencies: + es6-iterator: 2.0.3 + es6-symbol: 3.1.3 + next-tick: 1.1.0 + es5-ext@0.10.64: dependencies: es6-iterator: 2.0.3 - es6-symbol: 3.1.4 + es6-symbol: 3.1.3 esniff: 2.0.1 next-tick: 1.1.0 es6-iterator@2.0.3: dependencies: - d: 1.0.2 + d: 1.0.1 es5-ext: 0.10.64 - es6-symbol: 3.1.4 + es6-symbol: 3.1.3 es6-promise@3.3.1: {} - es6-symbol@3.1.4: + es6-promise@4.2.8: {} + + es6-symbol@3.1.3: dependencies: - d: 1.0.2 + d: 1.0.1 ext: 1.7.0 es6-weak-map@2.0.3: dependencies: - d: 1.0.2 - es5-ext: 0.10.64 + d: 1.0.1 + es5-ext: 0.10.62 es6-iterator: 2.0.3 - es6-symbol: 3.1.4 + es6-symbol: 3.1.3 - esbuild-plugin-alias@0.2.1: {} - - esbuild-register@3.5.0(esbuild@0.20.2): + esbuild-register@3.6.0(esbuild@0.21.3): dependencies: - debug: 4.3.4 - esbuild: 0.20.2 + debug: 4.3.7(supports-color@8.1.1) + esbuild: 0.21.3 transitivePeerDependencies: - supports-color @@ -19247,31 +23012,57 @@ snapshots: '@esbuild/win32-ia32': 0.20.2 '@esbuild/win32-x64': 0.20.2 - esbuild@0.21.2: + esbuild@0.21.3: optionalDependencies: - '@esbuild/aix-ppc64': 0.21.2 - '@esbuild/android-arm': 0.21.2 - '@esbuild/android-arm64': 0.21.2 - '@esbuild/android-x64': 0.21.2 - '@esbuild/darwin-arm64': 0.21.2 - '@esbuild/darwin-x64': 0.21.2 - '@esbuild/freebsd-arm64': 0.21.2 - '@esbuild/freebsd-x64': 0.21.2 - '@esbuild/linux-arm': 0.21.2 - '@esbuild/linux-arm64': 0.21.2 - '@esbuild/linux-ia32': 0.21.2 - '@esbuild/linux-loong64': 0.21.2 - '@esbuild/linux-mips64el': 0.21.2 - '@esbuild/linux-ppc64': 0.21.2 - '@esbuild/linux-riscv64': 0.21.2 - '@esbuild/linux-s390x': 0.21.2 - '@esbuild/linux-x64': 0.21.2 - '@esbuild/netbsd-x64': 0.21.2 - '@esbuild/openbsd-x64': 0.21.2 - '@esbuild/sunos-x64': 0.21.2 - '@esbuild/win32-arm64': 0.21.2 - '@esbuild/win32-ia32': 0.21.2 - '@esbuild/win32-x64': 0.21.2 + '@esbuild/aix-ppc64': 0.21.3 + '@esbuild/android-arm': 0.21.3 + '@esbuild/android-arm64': 0.21.3 + '@esbuild/android-x64': 0.21.3 + '@esbuild/darwin-arm64': 0.21.3 + '@esbuild/darwin-x64': 0.21.3 + '@esbuild/freebsd-arm64': 0.21.3 + '@esbuild/freebsd-x64': 0.21.3 + '@esbuild/linux-arm': 0.21.3 + '@esbuild/linux-arm64': 0.21.3 + '@esbuild/linux-ia32': 0.21.3 + '@esbuild/linux-loong64': 0.21.3 + '@esbuild/linux-mips64el': 0.21.3 + '@esbuild/linux-ppc64': 0.21.3 + '@esbuild/linux-riscv64': 0.21.3 + '@esbuild/linux-s390x': 0.21.3 + '@esbuild/linux-x64': 0.21.3 + '@esbuild/netbsd-x64': 0.21.3 + '@esbuild/openbsd-x64': 0.21.3 + '@esbuild/sunos-x64': 0.21.3 + '@esbuild/win32-arm64': 0.21.3 + '@esbuild/win32-ia32': 0.21.3 + '@esbuild/win32-x64': 0.21.3 + + esbuild@0.21.5: + optionalDependencies: + '@esbuild/aix-ppc64': 0.21.5 + '@esbuild/android-arm': 0.21.5 + '@esbuild/android-arm64': 0.21.5 + '@esbuild/android-x64': 0.21.5 + '@esbuild/darwin-arm64': 0.21.5 + '@esbuild/darwin-x64': 0.21.5 + '@esbuild/freebsd-arm64': 0.21.5 + '@esbuild/freebsd-x64': 0.21.5 + '@esbuild/linux-arm': 0.21.5 + '@esbuild/linux-arm64': 0.21.5 + '@esbuild/linux-ia32': 0.21.5 + '@esbuild/linux-loong64': 0.21.5 + '@esbuild/linux-mips64el': 0.21.5 + '@esbuild/linux-ppc64': 0.21.5 + '@esbuild/linux-riscv64': 0.21.5 + '@esbuild/linux-s390x': 0.21.5 + '@esbuild/linux-x64': 0.21.5 + '@esbuild/netbsd-x64': 0.21.5 + '@esbuild/openbsd-x64': 0.21.5 + '@esbuild/sunos-x64': 0.21.5 + '@esbuild/win32-arm64': 0.21.5 + '@esbuild/win32-ia32': 0.21.5 + '@esbuild/win32-x64': 0.21.5 escalade@3.1.2: {} @@ -19285,155 +23076,360 @@ snapshots: escape-string-regexp@5.0.0: {} - eslint-compat-utils@0.5.0(eslint@8.57.0): + eslint-compat-utils@0.1.2(eslint@8.55.0): dependencies: - eslint: 8.57.0 - semver: 7.6.2 + eslint: 8.55.0 + + eslint-compat-utils@0.1.2(eslint@8.56.0): + dependencies: + eslint: 8.56.0 + + eslint-compat-utils@0.5.0(eslint@8.56.0): + dependencies: + eslint: 8.56.0 + semver: 7.6.0 + + eslint-config-prettier@9.1.0(eslint@8.55.0): + dependencies: + eslint: 8.55.0 - eslint-config-prettier@9.1.0(eslint@8.57.0): + eslint-config-prettier@9.1.0(eslint@8.56.0): dependencies: - eslint: 8.57.0 + eslint: 8.56.0 - eslint-config-standard@17.1.0(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.8.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0))(eslint-plugin-n@16.6.2(eslint@8.57.0))(eslint-plugin-promise@6.1.1(eslint@8.57.0))(eslint@8.57.0): + eslint-config-standard@17.1.0(eslint-plugin-import@2.29.0(@typescript-eslint/parser@7.7.0(eslint@8.55.0)(typescript@5.4.3))(eslint@8.55.0))(eslint-plugin-n@16.6.2(eslint@8.55.0))(eslint-plugin-promise@6.1.1(eslint@8.55.0))(eslint@8.55.0): dependencies: - eslint: 8.57.0 - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.8.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0) - eslint-plugin-n: 16.6.2(eslint@8.57.0) - eslint-plugin-promise: 6.1.1(eslint@8.57.0) + eslint: 8.55.0 + eslint-plugin-import: 2.29.0(@typescript-eslint/parser@7.7.0(eslint@8.55.0)(typescript@5.4.3))(eslint@8.55.0) + eslint-plugin-n: 16.6.2(eslint@8.55.0) + eslint-plugin-promise: 6.1.1(eslint@8.55.0) + + eslint-config-standard@17.1.0(eslint-plugin-import@2.29.0(@typescript-eslint/parser@7.7.0(eslint@8.56.0)(typescript@5.4.3))(eslint@8.56.0))(eslint-plugin-n@16.6.2(eslint@8.56.0))(eslint-plugin-promise@6.1.1(eslint@8.56.0))(eslint@8.56.0): + dependencies: + eslint: 8.56.0 + eslint-plugin-import: 2.29.0(@typescript-eslint/parser@7.7.0(eslint@8.56.0)(typescript@5.4.3))(eslint@8.56.0) + eslint-plugin-n: 16.6.2(eslint@8.56.0) + eslint-plugin-promise: 6.1.1(eslint@8.56.0) + + eslint-config-standard@17.1.0(eslint-plugin-import@2.29.0(@typescript-eslint/parser@7.9.0(eslint@8.56.0)(typescript@5.4.5))(eslint@8.56.0))(eslint-plugin-n@16.6.2(eslint@8.56.0))(eslint-plugin-promise@6.1.1(eslint@8.56.0))(eslint@8.56.0): + dependencies: + eslint: 8.56.0 + eslint-plugin-import: 2.29.0(@typescript-eslint/parser@7.9.0(eslint@8.56.0)(typescript@5.4.5))(eslint@8.56.0) + eslint-plugin-n: 16.6.2(eslint@8.56.0) + eslint-plugin-promise: 6.1.1(eslint@8.56.0) eslint-import-resolver-node@0.3.9: dependencies: debug: 3.2.7 - is-core-module: 2.13.1 + is-core-module: 2.14.0 resolve: 1.22.8 transitivePeerDependencies: - supports-color - eslint-module-utils@2.8.1(@typescript-eslint/parser@7.8.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint@8.57.0): + eslint-module-utils@2.8.0(@typescript-eslint/parser@7.7.0(eslint@8.55.0)(typescript@5.4.3))(eslint-import-resolver-node@0.3.9)(eslint@8.55.0): + dependencies: + '@typescript-eslint/parser': 7.15.0(eslint@8.57.0)(typescript@5.5.3) + debug: 3.2.7 + optionalDependencies: + '@typescript-eslint/parser': 7.7.0(eslint@8.55.0)(typescript@5.4.3) + eslint: 8.55.0 + eslint-import-resolver-node: 0.3.9 + transitivePeerDependencies: + - supports-color + + eslint-module-utils@2.8.0(@typescript-eslint/parser@7.7.0(eslint@8.56.0)(typescript@5.4.3))(eslint-import-resolver-node@0.3.9)(eslint@8.56.0): + dependencies: + debug: 3.2.7 + optionalDependencies: + '@typescript-eslint/parser': 7.7.0(eslint@8.56.0)(typescript@5.4.3) + eslint: 8.56.0 + eslint-import-resolver-node: 0.3.9 + transitivePeerDependencies: + - supports-color + + eslint-module-utils@2.8.0(@typescript-eslint/parser@7.9.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': 7.8.0(eslint@8.57.0)(typescript@5.4.5) - eslint: 8.57.0 + '@typescript-eslint/parser': 7.9.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-x@7.6.0(eslint@8.57.0): + eslint-plugin-es-x@7.5.0(eslint@8.55.0): + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.55.0) + '@eslint-community/regexpp': 4.10.0 + eslint: 8.55.0 + eslint-compat-utils: 0.1.2(eslint@8.55.0) + + eslint-plugin-es-x@7.5.0(eslint@8.56.0): dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0) '@eslint-community/regexpp': 4.10.0 - eslint: 8.57.0 - eslint-compat-utils: 0.5.0(eslint@8.57.0) + eslint: 8.56.0 + eslint-compat-utils: 0.1.2(eslint@8.56.0) + + eslint-plugin-es@3.0.1(eslint@8.55.0): + dependencies: + eslint: 8.55.0 + eslint-utils: 2.1.0 + regexpp: 3.2.0 - eslint-plugin-es@3.0.1(eslint@8.57.0): + eslint-plugin-es@3.0.1(eslint@8.56.0): dependencies: - eslint: 8.57.0 + eslint: 8.56.0 eslint-utils: 2.1.0 regexpp: 3.2.0 - eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.8.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0): + eslint-plugin-import@2.29.0(@typescript-eslint/parser@7.7.0(eslint@8.55.0)(typescript@5.4.3))(eslint@8.55.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.55.0 + eslint-import-resolver-node: 0.3.9 + eslint-module-utils: 2.8.0(@typescript-eslint/parser@7.7.0(eslint@8.55.0)(typescript@5.4.3))(eslint-import-resolver-node@0.3.9)(eslint@8.55.0) + hasown: 2.0.1 + 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.14.2 + optionalDependencies: + '@typescript-eslint/parser': 7.7.0(eslint@8.55.0)(typescript@5.4.3) + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + + eslint-plugin-import@2.29.0(@typescript-eslint/parser@7.7.0(eslint@8.56.0)(typescript@5.4.3))(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@7.7.0(eslint@8.56.0)(typescript@5.4.3))(eslint-import-resolver-node@0.3.9)(eslint@8.56.0) + hasown: 2.0.1 + 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.14.2 + optionalDependencies: + '@typescript-eslint/parser': 7.7.0(eslint@8.56.0)(typescript@5.4.3) + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + + eslint-plugin-import@2.29.0(@typescript-eslint/parser@7.9.0(eslint@8.56.0)(typescript@5.4.5))(eslint@8.56.0): dependencies: - array-includes: 3.1.8 - array.prototype.findlastindex: 1.2.5 + 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.57.0 + eslint: 8.56.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.8.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint@8.57.0) - hasown: 2.0.2 + eslint-module-utils: 2.8.0(@typescript-eslint/parser@7.9.0(eslint@8.56.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint@8.56.0) + hasown: 2.0.1 is-core-module: 2.13.1 is-glob: 4.0.3 minimatch: 3.1.2 - object.fromentries: 2.0.8 - object.groupby: 1.0.3 - object.values: 1.2.0 + object.fromentries: 2.0.7 + object.groupby: 1.0.1 + object.values: 1.1.7 semver: 6.3.1 - tsconfig-paths: 3.15.0 + tsconfig-paths: 3.14.2 optionalDependencies: - '@typescript-eslint/parser': 7.8.0(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/parser': 7.9.0(eslint@8.56.0)(typescript@5.4.5) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - eslint-plugin-n@16.6.2(eslint@8.57.0): + eslint-plugin-n@16.6.2(eslint@8.55.0): + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.55.0) + builtins: 5.0.1 + eslint: 8.55.0 + eslint-plugin-es-x: 7.5.0(eslint@8.55.0) + get-tsconfig: 4.7.2 + globals: 13.24.0 + ignore: 5.3.1 + is-builtin-module: 3.2.1 + is-core-module: 2.14.0 + minimatch: 3.1.2 + resolve: 1.22.8 + semver: 7.6.3 + + eslint-plugin-n@16.6.2(eslint@8.56.0): dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) - builtins: 5.1.0 - eslint: 8.57.0 - eslint-plugin-es-x: 7.6.0(eslint@8.57.0) - get-tsconfig: 4.7.4 + '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0) + builtins: 5.0.1 + eslint: 8.56.0 + eslint-plugin-es-x: 7.5.0(eslint@8.56.0) + get-tsconfig: 4.7.2 globals: 13.24.0 ignore: 5.3.1 is-builtin-module: 3.2.1 is-core-module: 2.13.1 minimatch: 3.1.2 resolve: 1.22.8 - semver: 7.6.2 + semver: 7.6.3 + + eslint-plugin-node@11.1.0(eslint@8.55.0): + dependencies: + eslint: 8.55.0 + eslint-plugin-es: 3.0.1(eslint@8.55.0) + eslint-utils: 2.1.0 + ignore: 5.3.1 + minimatch: 3.1.2 + resolve: 1.22.8 + semver: 6.3.1 - eslint-plugin-node@11.1.0(eslint@8.57.0): + eslint-plugin-node@11.1.0(eslint@8.56.0): dependencies: - eslint: 8.57.0 - eslint-plugin-es: 3.0.1(eslint@8.57.0) + eslint: 8.56.0 + eslint-plugin-es: 3.0.1(eslint@8.56.0) eslint-utils: 2.1.0 ignore: 5.3.1 minimatch: 3.1.2 resolve: 1.22.8 semver: 6.3.1 - eslint-plugin-prettier@5.1.3(@types/eslint@8.56.10)(eslint-config-prettier@9.1.0(eslint@8.57.0))(eslint@8.57.0)(prettier@3.2.5): + eslint-plugin-prettier@5.1.3(@types/eslint@8.56.10)(eslint-config-prettier@9.1.0(eslint@8.55.0))(eslint@8.55.0)(prettier@3.2.5): + dependencies: + eslint: 8.55.0 + prettier: 3.2.5 + prettier-linter-helpers: 1.0.0 + synckit: 0.8.6 + optionalDependencies: + '@types/eslint': 8.56.10 + eslint-config-prettier: 9.1.0(eslint@8.55.0) + + eslint-plugin-prettier@5.1.3(@types/eslint@8.56.10)(eslint-config-prettier@9.1.0(eslint@8.56.0))(eslint@8.56.0)(prettier@3.2.5): dependencies: - eslint: 8.57.0 + eslint: 8.56.0 prettier: 3.2.5 prettier-linter-helpers: 1.0.0 - synckit: 0.8.8 + synckit: 0.8.6 optionalDependencies: '@types/eslint': 8.56.10 - eslint-config-prettier: 9.1.0(eslint@8.57.0) + eslint-config-prettier: 9.1.0(eslint@8.56.0) + + eslint-plugin-promise@6.1.1(eslint@8.55.0): + dependencies: + eslint: 8.55.0 + + eslint-plugin-promise@6.1.1(eslint@8.56.0): + dependencies: + eslint: 8.56.0 - eslint-plugin-promise@6.1.1(eslint@8.57.0): + eslint-plugin-simple-import-sort@12.0.0(eslint@8.56.0): dependencies: - eslint: 8.57.0 + eslint: 8.56.0 - eslint-plugin-simple-import-sort@12.1.0(eslint@8.57.0): + eslint-plugin-storybook@0.8.0(eslint@8.56.0)(typescript@5.4.3): dependencies: - eslint: 8.57.0 + '@storybook/csf': 0.0.1 + '@typescript-eslint/utils': 5.62.0(eslint@8.56.0)(typescript@5.4.3) + eslint: 8.56.0 + requireindex: 1.2.0 + ts-dedent: 2.2.0 + transitivePeerDependencies: + - supports-color + - typescript - eslint-plugin-storybook@0.8.0(eslint@8.57.0)(typescript@5.4.5): + eslint-plugin-storybook@0.8.0(eslint@8.56.0)(typescript@5.4.5): dependencies: '@storybook/csf': 0.0.1 - '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.4.5) - eslint: 8.57.0 + '@typescript-eslint/utils': 5.62.0(eslint@8.56.0)(typescript@5.4.5) + eslint: 8.56.0 requireindex: 1.2.0 ts-dedent: 2.2.0 transitivePeerDependencies: - supports-color - typescript - eslint-plugin-svelte@2.38.0(eslint@8.57.0)(svelte@4.2.16)(ts-node@10.9.2(@types/node@20.12.11)(typescript@5.4.5)): + eslint-plugin-svelte@2.38.0(eslint@8.56.0)(svelte@4.2.13)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.3)): + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0) + '@jridgewell/sourcemap-codec': 1.4.15 + debug: 4.3.4 + eslint: 8.56.0 + eslint-compat-utils: 0.5.0(eslint@8.56.0) + esutils: 2.0.3 + known-css-properties: 0.30.0 + postcss: 8.4.38 + postcss-load-config: 3.1.4(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.3)) + postcss-safe-parser: 6.0.0(postcss@8.4.38) + postcss-selector-parser: 6.0.16 + semver: 7.6.0 + svelte-eslint-parser: 0.35.0(svelte@4.2.13) + optionalDependencies: + svelte: 4.2.13 + transitivePeerDependencies: + - supports-color + - ts-node + + eslint-plugin-svelte@2.38.0(eslint@8.56.0)(svelte@4.2.17)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.3)): dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0) '@jridgewell/sourcemap-codec': 1.4.15 debug: 4.3.4 - eslint: 8.57.0 - eslint-compat-utils: 0.5.0(eslint@8.57.0) + eslint: 8.56.0 + eslint-compat-utils: 0.5.0(eslint@8.56.0) esutils: 2.0.3 known-css-properties: 0.30.0 postcss: 8.4.38 - postcss-load-config: 3.1.4(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.12.11)(typescript@5.4.5)) + postcss-load-config: 3.1.4(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.3)) postcss-safe-parser: 6.0.0(postcss@8.4.38) postcss-selector-parser: 6.0.16 - semver: 7.6.1 - svelte-eslint-parser: 0.36.0(svelte@4.2.16) + semver: 7.6.0 + svelte-eslint-parser: 0.35.0(svelte@4.2.17) optionalDependencies: - svelte: 4.2.16 + svelte: 4.2.17 transitivePeerDependencies: - supports-color - ts-node + eslint-plugin-svelte@2.38.0(eslint@8.56.0)(svelte@4.2.17)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.5)): + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0) + '@jridgewell/sourcemap-codec': 1.4.15 + debug: 4.3.4 + eslint: 8.56.0 + eslint-compat-utils: 0.5.0(eslint@8.56.0) + esutils: 2.0.3 + known-css-properties: 0.30.0 + postcss: 8.4.38 + postcss-load-config: 3.1.4(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.5)) + postcss-safe-parser: 6.0.0(postcss@8.4.38) + postcss-selector-parser: 6.0.16 + semver: 7.6.0 + svelte-eslint-parser: 0.35.0(svelte@4.2.17) + optionalDependencies: + svelte: 4.2.17 + transitivePeerDependencies: + - ts-node + eslint-scope@5.1.1: dependencies: esrecurse: 4.3.0 @@ -19466,14 +23462,14 @@ snapshots: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.3 - debug: 4.3.4 + debug: 4.3.7(supports-color@8.1.1) doctrine: 3.0.0 enquirer: 2.4.1 escape-string-regexp: 4.0.0 eslint-scope: 7.2.2 eslint-utils: 3.0.0(eslint@8.4.1) eslint-visitor-keys: 3.4.3 - espree: 9.6.1 + espree: 9.2.0 esquery: 1.5.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 @@ -19491,10 +23487,10 @@ snapshots: lodash.merge: 4.6.2 minimatch: 3.1.2 natural-compare: 1.4.0 - optionator: 0.9.4 + optionator: 0.9.3 progress: 2.0.3 regexpp: 3.2.0 - semver: 7.6.2 + semver: 7.6.3 strip-ansi: 6.0.1 strip-json-comments: 3.1.1 text-table: 0.2.0 @@ -19502,13 +23498,13 @@ snapshots: transitivePeerDependencies: - supports-color - eslint@8.57.0: + eslint@8.55.0: dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.55.0) '@eslint-community/regexpp': 4.10.0 '@eslint/eslintrc': 2.1.4 - '@eslint/js': 8.57.0 - '@humanwhocodes/config-array': 0.11.14 + '@eslint/js': 8.55.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 @@ -19527,6 +23523,49 @@ snapshots: file-entry-cache: 6.0.1 find-up: 5.0.0 glob-parent: 6.0.2 + globals: 13.23.0 + graphemer: 1.4.0 + ignore: 5.3.0 + 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 + + eslint@8.56.0: + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0) + '@eslint-community/regexpp': 4.10.0 + '@eslint/eslintrc': 2.1.4 + '@eslint/js': 8.56.0 + '@humanwhocodes/config-array': 0.11.14 + '@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.5 + 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.24.0 graphemer: 1.4.0 ignore: 5.3.1 @@ -19539,7 +23578,7 @@ snapshots: lodash.merge: 4.6.2 minimatch: 3.1.2 natural-compare: 1.4.0 - optionator: 0.9.4 + optionator: 0.9.3 strip-ansi: 6.0.1 text-table: 0.2.0 transitivePeerDependencies: @@ -19549,21 +23588,21 @@ snapshots: esniff@2.0.1: dependencies: - d: 1.0.2 + d: 1.0.1 es5-ext: 0.10.64 event-emitter: 0.3.5 - type: 2.7.2 + type: 2.7.3 espree@9.2.0: dependencies: - acorn: 8.11.3 - acorn-jsx: 5.3.2(acorn@8.11.3) + acorn: 8.12.0 + acorn-jsx: 5.3.2(acorn@8.12.0) eslint-visitor-keys: 3.4.3 espree@9.6.1: dependencies: - acorn: 8.11.3 - acorn-jsx: 5.3.2(acorn@8.11.3) + acorn: 8.12.0 + acorn-jsx: 5.3.2(acorn@8.12.0) eslint-visitor-keys: 3.4.3 esprima@4.0.1: {} @@ -19624,6 +23663,11 @@ snapshots: transitivePeerDependencies: - supports-color + eth-ens-namehash@2.0.8: + dependencies: + idna-uts46-hx: 2.3.1 + js-sha3: 0.5.7 + eth-json-rpc-filters@6.0.1: dependencies: '@metamask/safe-event-emitter': 3.1.1 @@ -19632,6 +23676,25 @@ snapshots: json-rpc-engine: 6.1.0 pify: 5.0.0 + eth-lib@0.1.29(bufferutil@4.0.8)(utf-8-validate@5.0.10): + dependencies: + bn.js: 4.12.0 + elliptic: 6.5.7 + nano-json-stream-parser: 0.1.2 + servify: 0.1.12 + ws: 3.3.3(bufferutil@4.0.8)(utf-8-validate@5.0.10) + xhr-request-promise: 0.1.3 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + eth-lib@0.2.8: + dependencies: + bn.js: 4.12.0 + elliptic: 6.5.7 + xhr-request-promise: 0.1.3 + eth-query@2.1.2: dependencies: json-rpc-random-id: 1.0.1 @@ -19645,9 +23708,9 @@ snapshots: dependencies: crypto-js: 3.3.0 - ethereum-bloom-filters@1.1.0: + ethereum-bloom-filters@1.0.10: dependencies: - '@noble/hashes': 1.4.0 + js-sha3: 0.8.0 ethereum-cryptography@0.1.3: dependencies: @@ -19674,12 +23737,27 @@ snapshots: '@scure/bip32': 1.1.5 '@scure/bip39': 1.1.1 - ethereum-cryptography@2.1.3: + ethereum-cryptography@2.2.1: dependencies: - '@noble/curves': 1.3.0 - '@noble/hashes': 1.3.3 - '@scure/bip32': 1.3.3 - '@scure/bip39': 1.2.2 + '@noble/curves': 1.4.2 + '@noble/hashes': 1.4.0 + '@scure/bip32': 1.4.0 + '@scure/bip39': 1.3.0 + + 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.7 + ethereum-cryptography: 0.1.3 + ethjs-util: 0.1.6 + rlp: 2.2.7 ethereumjs-util@7.1.5: dependencies: @@ -19689,7 +23767,7 @@ snapshots: ethereum-cryptography: 0.1.3 rlp: 2.2.7 - ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@6.0.3): + ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10): dependencies: '@ethersproject/abi': 5.7.0 '@ethersproject/abstract-provider': 5.7.0 @@ -19709,7 +23787,7 @@ snapshots: '@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@6.0.3) + '@ethersproject/providers': 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) '@ethersproject/random': 5.7.0 '@ethersproject/rlp': 5.7.0 '@ethersproject/sha2': 5.7.0 @@ -19725,20 +23803,40 @@ snapshots: - bufferutil - utf-8-validate + ethers@6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10): + dependencies: + '@adraffy/ens-normalize': 1.10.1 + '@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.17.1(bufferutil@4.0.8)(utf-8-validate@5.0.10) + 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-emitter@0.3.5: dependencies: - d: 1.0.2 + d: 1.0.1 es5-ext: 0.10.64 event-target-shim@5.0.1: {} eventemitter2@6.4.9: {} + eventemitter3@4.0.4: {} + eventemitter3@5.0.1: {} events@3.3.0: {} @@ -19760,6 +23858,18 @@ snapshots: signal-exit: 3.0.7 strip-final-newline: 2.0.0 + execa@7.2.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.2.0 + onetime: 6.0.0 + signal-exit: 3.0.7 + strip-final-newline: 3.0.0 + execa@8.0.1: dependencies: cross-spawn: 7.0.3 @@ -19767,7 +23877,7 @@ snapshots: human-signals: 5.0.0 is-stream: 3.0.0 merge-stream: 2.0.0 - npm-run-path: 5.3.0 + npm-run-path: 5.2.0 onetime: 6.0.0 signal-exit: 4.1.0 strip-final-newline: 3.0.0 @@ -19780,34 +23890,34 @@ snapshots: jest-message-util: 29.7.0 jest-util: 29.7.0 - express@4.19.2: + express@4.21.0: dependencies: accepts: 1.3.8 array-flatten: 1.1.1 - body-parser: 1.20.2 + body-parser: 1.20.3 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 + encodeurl: 2.0.0 escape-html: 1.0.3 etag: 1.8.1 - finalhandler: 1.2.0 + finalhandler: 1.3.1 fresh: 0.5.2 http-errors: 2.0.0 - merge-descriptors: 1.0.1 + merge-descriptors: 1.0.3 methods: 1.1.2 on-finished: 2.4.1 parseurl: 1.3.3 - path-to-regexp: 0.1.7 + path-to-regexp: 0.1.10 proxy-addr: 2.0.7 - qs: 6.11.0 + qs: 6.13.0 range-parser: 1.2.1 safe-buffer: 5.2.1 - send: 0.18.0 - serve-static: 1.15.0 + send: 0.19.0 + serve-static: 1.16.2 setprototypeof: 1.2.0 statuses: 2.0.1 type-is: 1.6.18 @@ -19816,16 +23926,16 @@ snapshots: transitivePeerDependencies: - supports-color - expressive-code@0.35.3: + expressive-code@0.35.6: dependencies: - '@expressive-code/core': 0.35.3 - '@expressive-code/plugin-frames': 0.35.3 - '@expressive-code/plugin-shiki': 0.35.3 - '@expressive-code/plugin-text-markers': 0.35.3 + '@expressive-code/core': 0.35.6 + '@expressive-code/plugin-frames': 0.35.6 + '@expressive-code/plugin-shiki': 0.35.6 + '@expressive-code/plugin-text-markers': 0.35.6 ext@1.7.0: dependencies: - type: 2.7.2 + type: 2.7.3 extend-shallow@2.0.1: dependencies: @@ -19833,11 +23943,31 @@ snapshots: extend@3.0.2: {} + extendable-error@0.1.7: {} + + extension-port-stream@2.1.1: + dependencies: + webextension-polyfill: 0.10.0 + extension-port-stream@3.0.0: dependencies: readable-stream: 3.6.2 webextension-polyfill: 0.10.0 + external-editor@3.1.0: + dependencies: + chardet: 0.7.0 + iconv-lite: 0.4.24 + tmp: 0.0.33 + + extsprintf@1.3.0: {} + + eyes@0.1.8: {} + + fast-base64-decode@1.0.0: {} + + fast-deep-equal@2.0.1: {} + fast-deep-equal@3.1.3: {} fast-diff@1.3.0: {} @@ -19850,13 +23980,13 @@ snapshots: '@nodelib/fs.walk': 1.2.8 glob-parent: 5.1.2 merge2: 1.4.1 - micromatch: 4.0.5 + micromatch: 4.0.7 fast-json-stable-stringify@2.1.0: {} fast-levenshtein@2.0.6: {} - fast-redact@3.5.0: {} + fast-redact@3.3.0: {} fast-safe-stringify@2.1.1: {} @@ -19864,7 +23994,7 @@ snapshots: dependencies: strnum: 1.0.5 - fast-xml-parser@4.3.6: + fast-xml-parser@4.3.4: dependencies: strnum: 1.0.5 @@ -19878,24 +24008,21 @@ snapshots: dependencies: bser: 2.1.1 - fetch-retry@5.0.6: {} + fdir@6.3.0(picomatch@3.0.1): + optionalDependencies: + picomatch: 3.0.1 file-entry-cache@6.0.1: dependencies: flat-cache: 3.2.0 - file-system-cache@2.3.0: - dependencies: - fs-extra: 11.1.1 - ramda: 0.29.0 + filesize@10.1.1: {} - filelist@1.0.4: + fill-range@7.1.1: dependencies: - minimatch: 5.1.6 - - filesize@10.1.1: {} + to-regex-range: 5.0.1 - fill-range@7.0.1: + fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 @@ -19913,10 +24040,10 @@ snapshots: transitivePeerDependencies: - supports-color - finalhandler@1.2.0: + finalhandler@1.3.1: dependencies: debug: 2.6.9 - encodeurl: 1.0.2 + encodeurl: 2.0.0 escape-html: 1.0.3 on-finished: 2.4.1 parseurl: 1.3.3 @@ -19937,6 +24064,14 @@ snapshots: make-dir: 3.1.0 pkg-dir: 4.2.0 + find-root@1.1.0: {} + + find-up-simple@1.0.0: {} + + find-up@2.1.0: + dependencies: + locate-path: 2.0.0 + find-up@3.0.0: dependencies: locate-path: 3.0.0 @@ -19958,12 +24093,12 @@ snapshots: find-yarn-workspace-root2@1.2.16: dependencies: - micromatch: 4.0.5 + micromatch: 4.0.8 pkg-dir: 4.2.0 flat-cache@3.2.0: dependencies: - flatted: 3.3.1 + flatted: 3.2.9 keyv: 4.5.4 rimraf: 3.0.2 @@ -19971,33 +24106,49 @@ snapshots: dependencies: is-buffer: 2.0.5 - flatted@3.3.1: {} + flat@5.0.2: {} + + flatted@3.2.9: {} flattie@1.1.1: {} flow-enums-runtime@0.0.6: {} - flow-parser@0.235.1: {} + flow-parser@0.206.0: {} - follow-redirects@1.15.6(debug@4.3.4): + follow-redirects@1.15.5(debug@4.3.4): optionalDependencies: debug: 4.3.4 + follow-redirects@1.15.9(debug@4.3.7): + optionalDependencies: + debug: 4.3.7(supports-color@8.1.1) + for-each@0.3.3: dependencies: is-callable: 1.2.7 - foreground-child@3.1.1: + foreground-child@3.2.1: dependencies: cross-spawn: 7.0.3 signal-exit: 4.1.0 + forever-agent@0.6.1: {} + forge-std@https://codeload.github.com/foundry-rs/forge-std/tar.gz/36c303b7ffdd842d06b1ec2744c9b9b5fb3083f3: {} - forge-std@https://codeload.github.com/foundry-rs/forge-std/tar.gz/52715a217dc51d0de15877878ab8213f6cbbbab5: {} + forge-std@https://codeload.github.com/foundry-rs/forge-std/tar.gz/8f24d6b04c92975e0795b5868aa0d783251cdeaa: {} + + form-data-encoder@1.7.1: {} form-data-encoder@2.1.4: {} + form-data@2.3.3: + 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 @@ -20006,23 +24157,29 @@ snapshots: forwarded@0.2.0: {} + fp-ts@1.19.3: {} + fraction.js@4.3.7: {} fresh@0.5.2: {} - fs-constants@1.0.0: {} - - fs-extra@11.1.1: + fs-extra@11.2.0: dependencies: graceful-fs: 4.2.11 jsonfile: 6.1.0 universalify: 2.0.1 - fs-extra@11.2.0: + fs-extra@4.0.3: dependencies: graceful-fs: 4.2.11 - jsonfile: 6.1.0 - universalify: 2.0.1 + jsonfile: 4.0.0 + universalify: 0.1.2 + + 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: @@ -20030,9 +24187,9 @@ snapshots: jsonfile: 4.0.0 universalify: 0.1.2 - fs-minipass@2.1.0: + fs-minipass@1.2.7: dependencies: - minipass: 3.3.6 + minipass: 2.9.0 fs.realpath@1.0.0: {} @@ -20048,7 +24205,7 @@ snapshots: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.22.3 functions-have-names: 1.2.3 functional-red-black-tree@1.0.1: {} @@ -20071,40 +24228,32 @@ snapshots: function-bind: 1.1.2 has-proto: 1.0.3 has-symbols: 1.0.3 - hasown: 2.0.2 + hasown: 2.0.1 get-iterator@1.0.2: {} - get-nonce@1.0.1: {} - - get-npm-tarball-url@2.1.0: {} - get-port-please@3.1.2: {} + get-stream@5.2.0: + dependencies: + pump: 3.0.0 + get-stream@6.0.1: {} get-stream@8.0.1: {} - get-symbol-description@1.0.2: + get-symbol-description@1.0.0: dependencies: call-bind: 1.0.7 - es-errors: 1.3.0 get-intrinsic: 1.2.4 - get-tsconfig@4.7.4: + get-tsconfig@4.7.2: dependencies: resolve-pkg-maps: 1.0.0 - giget@1.2.3: + getpass@0.1.7: dependencies: - citty: 0.1.6 - consola: 3.2.3 - defu: 6.1.4 - node-fetch-native: 1.6.4 - nypm: 0.3.8 - ohash: 1.1.3 - pathe: 1.1.2 - tar: 6.2.1 + assert-plus: 1.0.0 github-slugger@2.0.0: {} @@ -20116,15 +24265,31 @@ snapshots: dependencies: is-glob: 4.0.3 - glob-to-regexp@0.4.1: {} - - glob@10.3.12: + glob@10.3.10: dependencies: foreground-child: 3.1.1 jackspeak: 2.3.6 minimatch: 9.0.4 - minipass: 7.1.0 - path-scurry: 1.10.2 + minipass: 7.0.4 + path-scurry: 1.10.1 + + glob@11.0.0: + dependencies: + foreground-child: 3.1.1 + jackspeak: 4.0.1 + minimatch: 10.0.1 + minipass: 7.1.2 + package-json-from-dist: 1.0.0 + path-scurry: 2.0.0 + + 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: @@ -20140,19 +24305,27 @@ snapshots: fs.realpath: 1.0.0 inflight: 1.0.6 inherits: 2.0.4 - minimatch: 5.1.6 + minimatch: 5.0.1 once: 1.4.0 + global@4.4.0: + dependencies: + min-document: 2.19.0 + process: 0.11.10 + globals@11.12.0: {} + globals@13.23.0: + dependencies: + type-fest: 0.20.2 + globals@13.24.0: dependencies: type-fest: 0.20.2 - globalthis@1.0.4: + globalthis@1.0.3: dependencies: define-properties: 1.2.1 - gopd: 1.0.1 globalyzer@0.1.0: {} @@ -20173,21 +24346,42 @@ snapshots: merge2: 1.4.1 slash: 4.0.0 - globby@14.0.1: - dependencies: - '@sindresorhus/merge-streams': 2.3.0 - fast-glob: 3.3.2 - ignore: 5.3.1 - path-type: 5.0.0 - slash: 5.1.0 - unicorn-magic: 0.1.0 - globrex@0.1.2: {} gopd@1.0.1: dependencies: get-intrinsic: 1.2.4 + got@11.8.6: + 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 + + got@12.1.0: + dependencies: + '@sindresorhus/is': 4.6.0 + '@szmarczak/http-timer': 5.0.1 + '@types/cacheable-request': 6.0.3 + '@types/responselike': 1.0.3 + cacheable-lookup: 6.1.0 + cacheable-request: 7.0.4 + decompress-response: 6.0.0 + form-data-encoder: 1.7.1 + get-stream: 6.0.1 + http2-wrapper: 2.2.1 + lowercase-keys: 3.0.0 + p-cancelable: 3.0.0 + responselike: 2.0.1 + got@12.6.1: dependencies: '@sindresorhus/is': 5.6.0 @@ -20217,29 +24411,17 @@ snapshots: section-matter: 1.0.0 strip-bom-string: 1.0.0 - gunzip-maybe@1.4.2: + h3@1.10.2: dependencies: - browserify-zlib: 0.1.4 - is-deflate: 1.0.0 - is-gzip: 1.0.0 - peek-stream: 1.1.3 - pumpify: 1.5.1 - through2: 2.0.5 - - h3@1.11.1: - dependencies: - cookie-es: 1.1.0 - crossws: 0.2.4 + cookie-es: 1.0.0 defu: 6.1.4 destr: 2.0.3 - iron-webcrypto: 1.1.1 + iron-webcrypto: 1.0.0 ohash: 1.1.3 - radix3: 1.1.2 - ufo: 1.5.3 + radix3: 1.1.0 + ufo: 1.4.0 uncrypto: 0.1.3 unenv: 1.9.0 - transitivePeerDependencies: - - uWebSockets.js handlebars@4.7.8: dependencies: @@ -20248,7 +24430,69 @@ snapshots: source-map: 0.6.1 wordwrap: 1.0.0 optionalDependencies: - uglify-js: 3.17.4 + uglify-js: 3.19.3 + + har-schema@2.0.0: {} + + har-validator@5.1.5: + dependencies: + ajv: 6.12.6 + har-schema: 2.0.0 + + hardhat@2.22.13(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.3))(typescript@5.4.3)(utf-8-validate@5.0.10): + dependencies: + '@ethersproject/abi': 5.7.0 + '@metamask/eth-sig-util': 4.0.1 + '@nomicfoundation/edr': 0.6.3 + '@nomicfoundation/ethereumjs-common': 4.0.4 + '@nomicfoundation/ethereumjs-tx': 5.0.4 + '@nomicfoundation/ethereumjs-util': 9.0.4 + '@nomicfoundation/solidity-analyzer': 0.1.2 + '@sentry/node': 5.30.0 + '@types/bn.js': 5.1.5 + '@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: 4.0.0 + ci-info: 2.0.0 + debug: 4.3.7(supports-color@8.1.1) + enquirer: 2.4.1 + 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.3.7 + io-ts: 1.10.4 + json-stream-stringify: 3.1.6 + keccak: 3.0.4 + lodash: 4.17.21 + mnemonist: 0.38.5 + mocha: 10.7.3 + p-map: 4.0.0 + raw-body: 2.5.2 + resolve: 1.17.0 + semver: 6.3.1 + solc: 0.8.26(debug@4.3.7) + source-map-support: 0.5.21 + stacktrace-parser: 0.1.10 + tsort: 0.0.1 + undici: 5.28.3 + uuid: 8.3.2 + ws: 7.5.9(bufferutil@4.0.8)(utf-8-validate@5.0.10) + optionalDependencies: + ts-node: 10.9.2(@types/node@20.12.7)(typescript@5.4.3) + typescript: 5.4.3 + transitivePeerDependencies: + - bufferutil + - c-kzg + - supports-color + - utf-8-validate has-bigints@1.0.2: {} @@ -20264,7 +24508,7 @@ snapshots: has-symbols@1.0.3: {} - has-tostringtag@1.0.2: + has-tostringtag@1.0.0: dependencies: has-symbols: 1.0.3 @@ -20281,10 +24525,15 @@ snapshots: hashlru@2.3.0: {} - hasown@2.0.2: + hasown@2.0.1: dependencies: function-bind: 1.1.2 + hast-util-embedded@3.0.0: + dependencies: + '@types/hast': 3.0.4 + hast-util-is-element: 3.0.0 + hast-util-from-html@2.0.1: dependencies: '@types/hast': 3.0.4 @@ -20313,6 +24562,10 @@ snapshots: dependencies: '@types/hast': 3.0.4 + hast-util-is-body-ok-link@3.0.0: + dependencies: + '@types/hast': 3.0.4 + hast-util-is-element@3.0.0: dependencies: '@types/hast': 3.0.4 @@ -20321,6 +24574,14 @@ snapshots: dependencies: '@types/hast': 3.0.4 + hast-util-phrasing@3.0.1: + dependencies: + '@types/hast': 3.0.4 + hast-util-embedded: 3.0.0 + hast-util-has-property: 3.0.0 + hast-util-is-body-ok-link: 3.0.0 + hast-util-is-element: 3.0.0 + hast-util-raw@9.0.3: dependencies: '@types/hast': 3.0.4 @@ -20329,11 +24590,11 @@ snapshots: hast-util-from-parse5: 8.0.1 hast-util-to-parse5: 8.0.0 html-void-elements: 3.0.0 - mdast-util-to-hast: 13.1.0 + mdast-util-to-hast: 13.2.0 parse5: 7.1.2 unist-util-position: 5.0.0 unist-util-visit: 5.0.0 - vfile: 6.0.1 + vfile: 6.0.3 web-namespaces: 2.0.1 zwitch: 2.0.4 @@ -20383,7 +24644,21 @@ snapshots: '@types/unist': 3.0.2 ccount: 2.0.1 comma-separated-tokens: 2.0.3 - hast-util-raw: 9.0.3 + hast-util-raw: 9.0.4 + hast-util-whitespace: 3.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.2.0 + property-information: 6.5.0 + space-separated-tokens: 2.0.2 + stringify-entities: 4.0.4 + zwitch: 2.0.4 + + hast-util-to-html@9.0.2: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.2 + ccount: 2.0.1 + comma-separated-tokens: 2.0.3 hast-util-whitespace: 3.0.0 html-void-elements: 3.0.0 mdast-util-to-hast: 13.1.0 @@ -20453,23 +24728,25 @@ snapshots: property-information: 6.5.0 space-separated-tokens: 2.0.2 + he@1.2.0: {} + header-case@2.0.4: dependencies: capital-case: 1.0.4 tslib: 2.6.2 + hermes-estree@0.15.0: {} + hermes-estree@0.19.1: {} - hermes-estree@0.20.1: {} + hermes-parser@0.15.0: + dependencies: + hermes-estree: 0.15.0 hermes-parser@0.19.1: dependencies: hermes-estree: 0.19.1 - hermes-parser@0.20.1: - dependencies: - hermes-estree: 0.20.1 - hermes-profile-transformer@0.0.6: dependencies: source-map: 0.7.4 @@ -20482,7 +24759,9 @@ snapshots: minimalistic-assert: 1.0.1 minimalistic-crypto-utils: 1.0.1 - hosted-git-info@2.8.9: {} + hoist-non-react-statics@3.3.2: + dependencies: + react-is: 16.13.1 html-encoding-sniffer@4.0.0: dependencies: @@ -20498,6 +24777,8 @@ snapshots: html-void-elements@3.0.0: {} + html-whitespace-sensitive-tag-names@3.0.0: {} + htmlparser2-svelte@4.1.0: dependencies: domelementtype: 2.3.0 @@ -20515,38 +24796,70 @@ snapshots: statuses: 2.0.1 toidentifier: 1.0.1 + http-https@1.0.0: {} + http-proxy-agent@7.0.2: dependencies: - agent-base: 7.1.1 + agent-base: 7.1.0 debug: 4.3.4 transitivePeerDependencies: - supports-color http-shutdown@1.2.2: {} + http-signature@1.2.0: + dependencies: + assert-plus: 1.0.0 + jsprim: 1.4.2 + sshpk: 1.18.0 + + http2-wrapper@1.0.3: + dependencies: + quick-lru: 5.1.1 + resolve-alpn: 1.2.1 + http2-wrapper@2.2.1: dependencies: quick-lru: 5.1.1 resolve-alpn: 1.2.1 + https-proxy-agent@5.0.1: + dependencies: + agent-base: 6.0.2 + debug: 4.3.7(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + https-proxy-agent@7.0.4: dependencies: - agent-base: 7.1.1 + agent-base: 7.1.0 debug: 4.3.4 transitivePeerDependencies: - supports-color + human-id@1.0.2: {} + human-signals@2.1.0: {} + human-signals@4.3.1: {} + human-signals@5.0.0: {} i18next-browser-languagedetector@7.1.0: dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.23.9 + + i18next-browser-languagedetector@7.2.0: + dependencies: + '@babel/runtime': 7.23.9 i18next@22.5.1: dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.23.9 + + i18next@23.11.5: + dependencies: + '@babel/runtime': 7.23.9 iconv-lite@0.4.24: dependencies: @@ -20558,20 +24871,30 @@ snapshots: idb-keyval@6.2.1: {} + idna-uts46-hx@2.3.1: + dependencies: + punycode: 2.1.0 + ieee754@1.2.1: {} ignore-walk@5.0.1: dependencies: - minimatch: 5.1.6 + minimatch: 5.0.1 ignore@4.0.6: {} + ignore@5.3.0: {} + ignore@5.3.1: {} image-size@1.1.1: dependencies: queue: 6.0.2 + immediate@3.0.6: {} + + immutable@4.3.7: {} + import-fresh@2.0.0: dependencies: caller-path: 2.0.0 @@ -20582,6 +24905,8 @@ snapshots: parent-module: 1.0.1 resolve-from: 4.0.0 + import-meta-resolve@4.0.0: {} + import-meta-resolve@4.1.0: {} imurmurhash@0.1.4: {} @@ -20610,60 +24935,78 @@ snapshots: interface-datastore@8.2.11: dependencies: interface-store: 5.1.8 - uint8arrays: 5.0.3 + uint8arrays: 5.1.0 interface-store@3.0.4: {} interface-store@5.1.8: {} - internal-slot@1.0.7: + internal-slot@1.0.6: dependencies: - es-errors: 1.3.0 - hasown: 2.0.2 - side-channel: 1.0.6 + get-intrinsic: 1.2.4 + hasown: 2.0.1 + side-channel: 1.0.4 - intl-messageformat@10.5.12: + intl-messageformat@10.5.11: dependencies: - '@formatjs/ecma402-abstract': 1.18.2 + '@formatjs/ecma402-abstract': 2.0.0 '@formatjs/fast-memoize': 2.2.0 - '@formatjs/icu-messageformat-parser': 2.7.6 - tslib: 2.6.2 + '@formatjs/icu-messageformat-parser': 2.7.8 + tslib: 2.6.3 invariant@2.2.4: dependencies: loose-envify: 1.4.0 - ip@2.0.1: {} + io-ts@1.10.4: + dependencies: + fp-ts: 1.19.3 + + ioredis@5.3.2: + dependencies: + '@ioredis/commands': 1.2.0 + cluster-key-slot: 1.1.2 + debug: 4.3.7(supports-color@8.1.1) + denque: 2.1.0 + lodash.defaults: 4.2.0 + lodash.isarguments: 3.1.0 + redis-errors: 1.2.0 + redis-parser: 3.0.0 + standard-as-callback: 2.1.0 + transitivePeerDependencies: + - supports-color + + ip@1.1.9: {} ipaddr.js@1.9.1: {} ipfs-core-types@0.14.1: dependencies: - '@ipld/dag-pb': 4.1.0 + '@ipld/dag-pb': 4.1.2 '@libp2p/interface-keychain': 2.0.5 '@libp2p/interface-peer-id': 2.0.2 '@libp2p/interface-peer-info': 1.0.10 '@libp2p/interface-pubsub': 3.0.7 '@multiformats/multiaddr': 11.6.1 - '@types/node': 18.19.33 + '@types/node': 18.19.31 interface-datastore: 7.0.4 ipfs-unixfs: 9.0.1 multiformats: 11.0.2 transitivePeerDependencies: - supports-color - ipfs-core-utils@0.18.1(encoding@0.1.13): + ipfs-core-utils@0.18.1: dependencies: '@libp2p/logger': 2.1.1 '@multiformats/multiaddr': 11.6.1 '@multiformats/multiaddr-to-uri': 9.0.8 any-signal: 3.0.1 blob-to-it: 2.0.6 - browser-readablestream-to-it: 2.0.7 + browser-readablestream-to-it: 2.0.6 err-code: 3.0.1 ipfs-core-types: 0.14.1 ipfs-unixfs: 9.0.1 - ipfs-utils: 9.0.14(encoding@0.1.13) + ipfs-utils: 9.0.14 it-all: 2.0.1 it-map: 2.0.1 it-peekable: 2.0.1 @@ -20678,11 +25021,11 @@ snapshots: - encoding - supports-color - ipfs-http-client@60.0.1(encoding@0.1.13): + ipfs-http-client@60.0.1: dependencies: - '@ipld/dag-cbor': 9.2.0 - '@ipld/dag-json': 10.2.0 - '@ipld/dag-pb': 4.1.0 + '@ipld/dag-cbor': 9.2.1 + '@ipld/dag-json': 10.2.2 + '@ipld/dag-pb': 4.1.2 '@libp2p/logger': 2.1.1 '@libp2p/peer-id': 2.0.4 '@multiformats/multiaddr': 11.6.1 @@ -20690,8 +25033,8 @@ snapshots: dag-jose: 4.0.0 err-code: 3.0.1 ipfs-core-types: 0.14.1 - ipfs-core-utils: 0.18.1(encoding@0.1.13) - ipfs-utils: 9.0.14(encoding@0.1.13) + ipfs-core-utils: 0.18.1 + ipfs-utils: 9.0.14 it-first: 2.0.1 it-last: 2.0.1 merge-options: 3.0.4 @@ -20706,9 +25049,9 @@ snapshots: ipfs-unixfs@9.0.1: dependencies: err-code: 3.0.1 - protobufjs: 7.2.6 + protobufjs: 7.3.2 - ipfs-utils@9.0.14(encoding@0.1.13): + ipfs-utils@9.0.14: dependencies: any-signal: 3.0.1 browser-readablestream-to-it: 1.0.3 @@ -20722,14 +25065,14 @@ snapshots: it-to-stream: 1.0.0 merge-options: 3.0.4 nanoid: 3.3.7 - native-fetch: 3.0.0(node-fetch@2.7.0(encoding@0.1.13)) - node-fetch: 2.7.0(encoding@0.1.13) + native-fetch: 3.0.0(node-fetch@2.7.0) + node-fetch: 2.7.0 react-native-fetch-api: 3.0.0 stream-to-it: 0.2.4 transitivePeerDependencies: - encoding - iron-webcrypto@1.1.1: {} + iron-webcrypto@1.0.0: {} is-absolute-url@4.0.1: {} @@ -20743,12 +25086,13 @@ snapshots: is-arguments@1.1.1: dependencies: call-bind: 1.0.7 - has-tostringtag: 1.0.2 + has-tostringtag: 1.0.0 - is-array-buffer@3.0.4: + is-array-buffer@3.0.2: dependencies: call-bind: 1.0.7 get-intrinsic: 1.2.4 + is-typed-array: 1.1.12 is-arrayish@0.2.1: {} @@ -20760,12 +25104,12 @@ snapshots: is-binary-path@2.1.0: dependencies: - binary-extensions: 2.3.0 + binary-extensions: 2.2.0 is-boolean-object@1.1.2: dependencies: call-bind: 1.0.7 - has-tostringtag: 1.0.2 + has-tostringtag: 1.0.0 is-buffer@2.0.5: {} @@ -20775,22 +25119,16 @@ snapshots: is-callable@1.2.7: {} - is-core-module@2.13.1: - dependencies: - hasown: 2.0.2 - - is-data-view@1.0.1: + is-core-module@2.14.0: dependencies: - is-typed-array: 1.1.13 + hasown: 2.0.1 is-date-object@1.0.5: dependencies: - has-tostringtag: 1.0.2 + has-tostringtag: 1.0.0 is-decimal@2.0.1: {} - is-deflate@1.0.0: {} - is-directory@0.3.1: {} is-docker@2.2.1: {} @@ -20807,16 +25145,16 @@ snapshots: is-fullwidth-code-point@3.0.0: {} + is-function@1.0.2: {} + is-generator-function@1.0.10: dependencies: - has-tostringtag: 1.0.2 + has-tostringtag: 1.0.0 is-glob@4.0.3: dependencies: is-extglob: 2.1.1 - is-gzip@1.0.0: {} - is-hex-prefixed@1.0.0: {} is-hexadecimal@2.0.1: {} @@ -20829,23 +25167,14 @@ snapshots: is-interactive@2.0.0: {} - is-map@2.0.3: {} - - is-nan@1.3.2: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - - is-negative-zero@2.0.3: {} + is-negative-zero@2.0.2: {} is-number-object@1.0.7: dependencies: - has-tostringtag: 1.0.2 + has-tostringtag: 1.0.0 is-number@7.0.0: {} - is-path-cwd@2.2.0: {} - is-path-inside@3.0.3: {} is-plain-obj@2.1.0: {} @@ -20867,11 +25196,9 @@ snapshots: is-regex@1.1.4: dependencies: call-bind: 1.0.7 - has-tostringtag: 1.0.2 + has-tostringtag: 1.0.0 - is-set@2.0.3: {} - - is-shared-array-buffer@1.0.3: + is-shared-array-buffer@1.0.2: dependencies: call-bind: 1.0.7 @@ -20881,15 +25208,21 @@ snapshots: is-string@1.0.7: dependencies: - has-tostringtag: 1.0.2 + 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.13: + is-typed-array@1.1.12: dependencies: - which-typed-array: 1.1.15 + which-typed-array: 1.1.13 + + is-typedarray@1.0.0: {} is-unicode-supported@0.1.0: {} @@ -20897,16 +25230,11 @@ snapshots: is-unicode-supported@2.0.0: {} - is-weakmap@2.0.2: {} - is-weakref@1.0.2: dependencies: call-bind: 1.0.7 - is-weakset@2.0.3: - dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 + is-windows@1.0.2: {} is-wsl@1.1.0: {} @@ -20934,20 +25262,26 @@ snapshots: isobject@3.0.1: {} - isomorphic-unfetch@3.1.0(encoding@0.1.13): + isomorphic-unfetch@3.1.0: dependencies: - node-fetch: 2.7.0(encoding@0.1.13) + node-fetch: 2.7.0 unfetch: 4.2.0 transitivePeerDependencies: - encoding + isows@1.0.3(ws@8.13.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)): + dependencies: + ws: 8.13.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + isows@1.0.3(ws@8.13.0(bufferutil@4.0.8)(utf-8-validate@6.0.3)): dependencies: - ws: 8.13.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) + ws: 8.13.0 - isows@1.0.4(ws@8.13.0(bufferutil@4.0.8)(utf-8-validate@6.0.3)): + isows@1.0.4(ws@8.17.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)): dependencies: - ws: 8.13.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) + ws: 8.17.1(bufferutil@4.0.8)(utf-8-validate@5.0.10) + + isstream@0.1.2: {} istanbul-lib-coverage@3.2.2: {} @@ -20957,10 +25291,10 @@ snapshots: make-dir: 4.0.0 supports-color: 7.2.0 - istanbul-lib-source-maps@5.0.4: + istanbul-lib-source-maps@5.0.5: dependencies: '@jridgewell/trace-mapping': 0.3.25 - debug: 4.3.4 + debug: 4.3.5 istanbul-lib-coverage: 3.2.2 transitivePeerDependencies: - supports-color @@ -21004,18 +25338,17 @@ snapshots: p-fifo: 1.0.0 readable-stream: 3.6.2 - jackspeak@2.3.6: + jackspeak@3.4.0: dependencies: '@isaacs/cliui': 8.0.2 optionalDependencies: '@pkgjs/parseargs': 0.11.0 - jake@10.9.1: + jackspeak@4.0.1: dependencies: - async: 3.2.5 - chalk: 4.1.2 - filelist: 1.0.4 - minimatch: 3.1.2 + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 jest-diff@29.7.0: dependencies: @@ -21029,7 +25362,7 @@ snapshots: '@jest/environment': 29.7.0 '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.12.11 + '@types/node': 20.12.7 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -21044,12 +25377,12 @@ snapshots: jest-message-util@29.7.0: dependencies: - '@babel/code-frame': 7.24.2 + '@babel/code-frame': 7.24.7 '@jest/types': 29.6.3 '@types/stack-utils': 2.0.3 chalk: 4.1.2 graceful-fs: 4.2.11 - micromatch: 4.0.5 + micromatch: 4.0.7 pretty-format: 29.7.0 slash: 3.0.0 stack-utils: 2.0.6 @@ -21057,13 +25390,13 @@ snapshots: jest-mock@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 20.12.11 + '@types/node': 20.12.7 jest-util: 29.7.0 jest-util@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 20.12.11 + '@types/node': 20.12.7 chalk: 4.1.2 ci-info: 3.9.0 graceful-fs: 4.2.11 @@ -21080,14 +25413,14 @@ snapshots: jest-worker@29.7.0: dependencies: - '@types/node': 20.12.11 + '@types/node': 20.12.7 jest-util: 29.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 - jiti@1.21.0: {} + jiti@1.21.6: {} - joi@17.13.1: + joi@17.12.1: dependencies: '@hapi/hoek': 9.3.0 '@hapi/topo': 5.1.0 @@ -21095,11 +25428,15 @@ snapshots: '@sideway/formula': 3.0.1 '@sideway/pinpoint': 2.0.0 + js-cookie@2.2.1: {} + + js-sha3@0.5.7: {} + js-sha3@0.8.0: {} js-tokens@4.0.0: {} - js-tokens@9.0.0: {} + js-tokens@8.0.3: {} js-yaml@3.14.1: dependencies: @@ -21110,27 +25447,29 @@ snapshots: dependencies: argparse: 2.0.1 + jsbn@0.1.1: {} + jsc-android@250231.0.0: {} jsc-safe-url@0.2.4: {} - jscodeshift@0.14.0(@babel/preset-env@7.24.5(@babel/core@7.24.5)): - dependencies: - '@babel/core': 7.24.5 - '@babel/parser': 7.24.5 - '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.24.5) - '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.24.5) - '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.24.5) - '@babel/plugin-transform-modules-commonjs': 7.24.1(@babel/core@7.24.5) - '@babel/preset-env': 7.24.5(@babel/core@7.24.5) - '@babel/preset-flow': 7.24.1(@babel/core@7.24.5) - '@babel/preset-typescript': 7.24.1(@babel/core@7.24.5) - '@babel/register': 7.23.7(@babel/core@7.24.5) - babel-core: 7.0.0-bridge.0(@babel/core@7.24.5) + jscodeshift@0.14.0(@babel/preset-env@7.23.9(@babel/core@7.25.2)): + dependencies: + '@babel/core': 7.25.2 + '@babel/parser': 7.25.6 + '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.25.2) + '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.25.2) + '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.25.2) + '@babel/plugin-transform-modules-commonjs': 7.23.3(@babel/core@7.25.2) + '@babel/preset-env': 7.23.9(@babel/core@7.25.2) + '@babel/preset-flow': 7.23.3(@babel/core@7.25.2) + '@babel/preset-typescript': 7.23.3(@babel/core@7.25.2) + '@babel/register': 7.23.7(@babel/core@7.25.2) + babel-core: 7.0.0-bridge.0(@babel/core@7.25.2) chalk: 4.1.2 - flow-parser: 0.235.1 + flow-parser: 0.206.0 graceful-fs: 4.2.11 - micromatch: 4.0.5 + micromatch: 4.0.8 neo-async: 2.6.2 node-dir: 0.1.17 recast: 0.21.5 @@ -21139,34 +25478,35 @@ snapshots: transitivePeerDependencies: - supports-color - jscodeshift@0.15.2(@babel/preset-env@7.24.5(@babel/core@7.24.5)): + jsdom@24.0.0(bufferutil@4.0.8)(utf-8-validate@5.0.10): dependencies: - '@babel/core': 7.24.5 - '@babel/parser': 7.24.5 - '@babel/plugin-transform-class-properties': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-modules-commonjs': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-nullish-coalescing-operator': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-optional-chaining': 7.24.5(@babel/core@7.24.5) - '@babel/plugin-transform-private-methods': 7.24.1(@babel/core@7.24.5) - '@babel/preset-flow': 7.24.1(@babel/core@7.24.5) - '@babel/preset-typescript': 7.24.1(@babel/core@7.24.5) - '@babel/register': 7.23.7(@babel/core@7.24.5) - babel-core: 7.0.0-bridge.0(@babel/core@7.24.5) - chalk: 4.1.2 - flow-parser: 0.235.1 - graceful-fs: 4.2.11 - micromatch: 4.0.5 - neo-async: 2.6.2 - node-dir: 0.1.17 - recast: 0.23.7 - temp: 0.8.4 - write-file-atomic: 2.4.3 - optionalDependencies: - '@babel/preset-env': 7.24.5(@babel/core@7.24.5) + 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.2 + https-proxy-agent: 7.0.4 + 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.10) + xml-name-validator: 5.0.0 transitivePeerDependencies: + - bufferutil - supports-color + - utf-8-validate - jsdom@24.0.0(bufferutil@4.0.8)(utf-8-validate@6.0.3): + jsdom@24.1.0: dependencies: cssstyle: 4.0.1 data-urls: 5.0.0 @@ -21174,25 +25514,26 @@ snapshots: form-data: 4.0.0 html-encoding-sniffer: 4.0.0 http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.4 + https-proxy-agent: 7.0.5 is-potential-custom-element-name: 1.0.1 - nwsapi: 2.2.9 + nwsapi: 2.2.7 parse5: 7.1.2 - rrweb-cssom: 0.6.0 + rrweb-cssom: 0.7.1 saxes: 6.0.0 symbol-tree: 3.2.4 - tough-cookie: 4.1.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.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) + ws: 8.16.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) xml-name-validator: 5.0.0 transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate + optional: true jsesc@0.5.0: {} @@ -21209,14 +25550,26 @@ snapshots: '@metamask/safe-event-emitter': 2.0.0 eth-rpc-errors: 4.0.3 + json-rpc-middleware-stream@4.2.3: + dependencies: + '@metamask/safe-event-emitter': 3.1.1 + json-rpc-engine: 6.1.0 + readable-stream: 2.3.8 + json-rpc-random-id@1.0.1: {} json-schema-traverse@0.4.1: {} json-schema-traverse@1.0.0: {} + json-schema@0.4.0: {} + json-stable-stringify-without-jsonify@1.0.1: {} + json-stream-stringify@3.1.6: {} + + json-stringify-safe@5.0.1: {} + json-to-ast@2.1.0: dependencies: code-error-fragment: 0.0.230 @@ -21230,6 +25583,8 @@ snapshots: jsonc-parser@2.3.1: {} + jsonc-parser@3.2.0: {} + jsonfile@4.0.0: optionalDependencies: graceful-fs: 4.2.11 @@ -21242,10 +25597,30 @@ snapshots: jsonpointer@5.0.1: {} + jsprim@1.4.2: + dependencies: + assert-plus: 1.0.0 + extsprintf: 1.3.0 + json-schema: 0.4.0 + verror: 1.10.0 + + jszip@3.10.1: + dependencies: + lie: 3.3.0 + pako: 1.0.11 + readable-stream: 2.3.8 + setimmediate: 1.0.5 + + keccak256@1.0.6: + dependencies: + bn.js: 5.2.1 + buffer: 6.0.3 + keccak: 3.0.4 + keccak@3.0.4: dependencies: node-addon-api: 2.0.2 - node-gyp-build: 4.8.1 + node-gyp-build: 4.8.0 readable-stream: 3.6.2 keyv@4.5.4: @@ -21260,52 +25635,46 @@ snapshots: kleur@4.1.5: {} - known-css-properties@0.30.0: {} + known-css-properties@0.34.0: {} latest-version@7.0.0: dependencies: package-json: 8.1.1 - lazy-universal-dotenv@4.0.0: - dependencies: - app-root-dir: 1.0.2 - dotenv: 16.4.5 - dotenv-expand: 10.0.0 - lefthook-darwin-arm64@1.6.10: optional: true - lefthook-darwin-x64@1.6.10: + lefthook-darwin-x64@1.6.18: optional: true - lefthook-freebsd-arm64@1.6.10: + lefthook-freebsd-arm64@1.6.18: optional: true - lefthook-freebsd-x64@1.6.10: + lefthook-freebsd-x64@1.6.18: optional: true - lefthook-linux-arm64@1.6.10: + lefthook-linux-arm64@1.6.18: optional: true - lefthook-linux-x64@1.6.10: + lefthook-linux-x64@1.6.18: optional: true - lefthook-windows-arm64@1.6.10: + lefthook-windows-arm64@1.6.18: optional: true - lefthook-windows-x64@1.6.10: + lefthook-windows-x64@1.6.18: optional: true - lefthook@1.6.10: + lefthook@1.6.18: optionalDependencies: - lefthook-darwin-arm64: 1.6.10 - lefthook-darwin-x64: 1.6.10 - lefthook-freebsd-arm64: 1.6.10 - lefthook-freebsd-x64: 1.6.10 - lefthook-linux-arm64: 1.6.10 - lefthook-linux-x64: 1.6.10 - lefthook-windows-arm64: 1.6.10 - lefthook-windows-x64: 1.6.10 + lefthook-darwin-arm64: 1.6.18 + lefthook-darwin-x64: 1.6.18 + lefthook-freebsd-arm64: 1.6.18 + lefthook-freebsd-x64: 1.6.18 + lefthook-linux-arm64: 1.6.18 + lefthook-linux-x64: 1.6.18 + lefthook-windows-arm64: 1.6.18 + lefthook-windows-x64: 1.6.18 leven@3.1.0: {} @@ -21314,6 +25683,10 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 + lie@3.3.0: + dependencies: + immediate: 3.0.6 + lighthouse-logger@1.4.2: dependencies: debug: 2.6.9 @@ -21323,32 +25696,30 @@ snapshots: lilconfig@2.1.0: {} - lilconfig@3.1.1: {} + lilconfig@3.1.2: {} lines-and-columns@1.2.4: {} - listhen@1.7.2: + listhen@1.6.0: dependencies: - '@parcel/watcher': 2.4.1 - '@parcel/watcher-wasm': 2.4.1 + '@parcel/watcher': 2.4.0 + '@parcel/watcher-wasm': 2.4.0 citty: 0.1.6 clipboardy: 4.0.0 consola: 3.2.3 - crossws: 0.2.4 + crossws: 0.1.1 defu: 6.1.4 get-port-please: 3.1.2 - h3: 1.11.1 + h3: 1.10.2 http-shutdown: 1.2.2 jiti: 1.21.0 - mlly: 1.7.0 + mlly: 1.5.0 node-forge: 1.3.1 pathe: 1.1.2 std-env: 3.7.0 - ufo: 1.5.3 + ufo: 1.4.0 untun: 0.1.3 uqr: 0.1.2 - transitivePeerDependencies: - - uWebSockets.js lit-element@3.3.3: dependencies: @@ -21356,17 +25727,17 @@ snapshots: '@lit/reactive-element': 1.6.3 lit-html: 2.8.0 - lit-element@4.0.5: + lit-element@4.0.4: dependencies: '@lit-labs/ssr-dom-shim': 1.2.0 '@lit/reactive-element': 2.0.4 - lit-html: 3.1.3 + lit-html: 3.1.2 lit-html@2.8.0: dependencies: '@types/trusted-types': 2.0.7 - lit-html@3.1.3: + lit-html@3.1.2: dependencies: '@types/trusted-types': 2.0.7 @@ -21379,8 +25750,8 @@ snapshots: lit@3.1.0: dependencies: '@lit/reactive-element': 2.0.4 - lit-element: 4.0.5 - lit-html: 3.1.3 + lit-element: 4.0.4 + lit-html: 3.1.2 load-tsconfig@0.2.5: {} @@ -21393,11 +25764,16 @@ snapshots: local-pkg@0.5.0: dependencies: - mlly: 1.7.0 - pkg-types: 1.1.0 + mlly: 1.5.0 + pkg-types: 1.0.3 locate-character@3.0.0: {} + locate-path@2.0.0: + dependencies: + p-locate: 2.0.0 + path-exists: 3.0.0 + locate-path@3.0.0: dependencies: p-locate: 3.0.0 @@ -21417,10 +25793,16 @@ snapshots: lodash.debounce@4.0.8: {} + lodash.defaults@4.2.0: {} + + lodash.isarguments@3.1.0: {} + lodash.isequal@4.5.0: {} lodash.merge@4.6.2: {} + lodash.startcase@4.4.0: {} + lodash.throttle@4.1.1: {} lodash.truncate@4.4.2: {} @@ -21445,7 +25827,7 @@ snapshots: logkitty@0.7.1: dependencies: ansi-fragments: 0.2.1 - dayjs: 1.11.11 + dayjs: 1.11.10 yargs: 15.4.1 lokijs@1.5.12: {} @@ -21462,21 +25844,40 @@ snapshots: dependencies: get-func-name: 2.0.2 + loupe@3.1.1: + dependencies: + get-func-name: 2.0.2 + lower-case@2.0.2: dependencies: - tslib: 2.6.2 + tslib: 2.6.3 + + lowercase-keys@2.0.0: {} lowercase-keys@3.0.0: {} - lru-cache@10.2.2: {} + lru-cache@10.2.0: {} + + lru-cache@11.0.1: {} + + 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-queue@0.1.0: dependencies: - es5-ext: 0.10.64 + es5-ext: 0.10.62 + + lru_map@0.3.3: {} lz-string@1.5.0: {} @@ -21484,10 +25885,28 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.4.15 - magicast@0.3.4: + magic-string@0.30.11: dependencies: - '@babel/parser': 7.24.5 - '@babel/types': 7.24.5 + '@jridgewell/sourcemap-codec': 1.5.0 + + magic-string@0.30.7: + dependencies: + '@jridgewell/sourcemap-codec': 1.4.15 + + magic-string@0.30.9: + dependencies: + '@jridgewell/sourcemap-codec': 1.4.15 + + magicast@0.3.3: + dependencies: + '@babel/parser': 7.23.9 + '@babel/types': 7.23.9 + source-map-js: 1.2.0 + + magicast@0.3.5: + dependencies: + '@babel/parser': 7.25.6 + '@babel/types': 7.25.6 source-map-js: 1.2.0 make-dir@2.1.0: @@ -21501,7 +25920,7 @@ snapshots: make-dir@4.0.0: dependencies: - semver: 7.6.2 + semver: 7.6.3 make-error@1.3.6: {} @@ -21515,9 +25934,9 @@ snapshots: markdown-table@3.0.3: {} - markdown-to-jsx@7.3.2(react@18.3.1): + markdown-to-jsx@7.5.0(react@18.2.0): dependencies: - react: 18.3.1 + react: 18.2.0 marky@1.2.5: {} @@ -21538,7 +25957,7 @@ snapshots: '@types/mdast': 4.0.4 '@types/unist': 3.0.2 devlop: 1.1.0 - mdast-util-from-markdown: 2.0.0 + mdast-util-from-markdown: 2.0.1 mdast-util-to-markdown: 2.1.0 parse-entities: 4.0.1 stringify-entities: 4.0.4 @@ -21553,7 +25972,7 @@ snapshots: unist-util-is: 6.0.0 unist-util-visit-parents: 6.0.1 - mdast-util-from-markdown@2.0.0: + mdast-util-from-markdown@2.0.1: dependencies: '@types/mdast': 4.0.4 '@types/unist': 3.0.2 @@ -21582,7 +26001,7 @@ snapshots: dependencies: '@types/mdast': 4.0.4 devlop: 1.1.0 - mdast-util-from-markdown: 2.0.0 + mdast-util-from-markdown: 2.0.1 mdast-util-to-markdown: 2.1.0 micromark-util-normalize-identifier: 2.0.0 transitivePeerDependencies: @@ -21591,7 +26010,7 @@ snapshots: mdast-util-gfm-strikethrough@2.0.0: dependencies: '@types/mdast': 4.0.4 - mdast-util-from-markdown: 2.0.0 + mdast-util-from-markdown: 2.0.1 mdast-util-to-markdown: 2.1.0 transitivePeerDependencies: - supports-color @@ -21601,7 +26020,7 @@ snapshots: '@types/mdast': 4.0.4 devlop: 1.1.0 markdown-table: 3.0.3 - mdast-util-from-markdown: 2.0.0 + mdast-util-from-markdown: 2.0.1 mdast-util-to-markdown: 2.1.0 transitivePeerDependencies: - supports-color @@ -21610,14 +26029,14 @@ snapshots: dependencies: '@types/mdast': 4.0.4 devlop: 1.1.0 - mdast-util-from-markdown: 2.0.0 + mdast-util-from-markdown: 2.0.1 mdast-util-to-markdown: 2.1.0 transitivePeerDependencies: - supports-color mdast-util-gfm@3.0.0: dependencies: - mdast-util-from-markdown: 2.0.0 + mdast-util-from-markdown: 2.0.1 mdast-util-gfm-autolink-literal: 2.0.0 mdast-util-gfm-footnote: 2.0.0 mdast-util-gfm-strikethrough: 2.0.0 @@ -21633,7 +26052,7 @@ snapshots: '@types/hast': 3.0.4 '@types/mdast': 4.0.4 devlop: 1.1.0 - mdast-util-from-markdown: 2.0.0 + mdast-util-from-markdown: 2.0.1 mdast-util-to-markdown: 2.1.0 transitivePeerDependencies: - supports-color @@ -21646,7 +26065,7 @@ snapshots: '@types/unist': 3.0.2 ccount: 2.0.1 devlop: 1.1.0 - mdast-util-from-markdown: 2.0.0 + mdast-util-from-markdown: 2.0.1 mdast-util-to-markdown: 2.1.0 parse-entities: 4.0.1 stringify-entities: 4.0.4 @@ -21658,7 +26077,7 @@ snapshots: mdast-util-mdx@3.0.0: dependencies: - mdast-util-from-markdown: 2.0.0 + mdast-util-from-markdown: 2.0.1 mdast-util-mdx-expression: 2.0.0 mdast-util-mdx-jsx: 3.1.2 mdast-util-mdxjs-esm: 2.0.1 @@ -21672,7 +26091,7 @@ snapshots: '@types/hast': 3.0.4 '@types/mdast': 4.0.4 devlop: 1.1.0 - mdast-util-from-markdown: 2.0.0 + mdast-util-from-markdown: 2.0.1 mdast-util-to-markdown: 2.1.0 transitivePeerDependencies: - supports-color @@ -21682,7 +26101,7 @@ snapshots: '@types/mdast': 4.0.4 unist-util-is: 6.0.0 - mdast-util-to-hast@13.1.0: + mdast-util-to-hast@13.2.0: dependencies: '@types/hast': 3.0.4 '@types/mdast': 4.0.4 @@ -21692,7 +26111,7 @@ snapshots: trim-lines: 3.0.1 unist-util-position: 5.0.0 unist-util-visit: 5.0.0 - vfile: 6.0.1 + vfile: 6.0.3 mdast-util-to-markdown@2.1.0: dependencies: @@ -21715,16 +26134,16 @@ snapshots: memoize-one@5.2.1: {} - memoizee@0.4.15: + memoizee@0.4.17: dependencies: - d: 1.0.2 - es5-ext: 0.10.64 + d: 1.0.1 + es5-ext: 0.10.62 es6-weak-map: 2.0.3 event-emitter: 0.3.5 is-promise: 2.2.2 lru-queue: 0.1.0 next-tick: 1.1.0 - timers-ext: 0.1.7 + timers-ext: 0.1.8 memoizerific@1.11.3: dependencies: @@ -21732,7 +26151,7 @@ snapshots: memorystream@0.3.1: {} - merge-descriptors@1.0.1: {} + merge-descriptors@1.0.3: {} merge-options@3.0.4: dependencies: @@ -21742,7 +26161,7 @@ snapshots: merge2@1.4.1: {} - merkletreejs@0.3.11: + merkletreejs@0.4.0: dependencies: bignumber.js: 9.1.2 buffer-reverse: 1.0.1 @@ -21752,42 +26171,42 @@ snapshots: methods@1.1.2: {} - metro-babel-transformer@0.80.9: + metro-babel-transformer@0.80.6: dependencies: - '@babel/core': 7.24.5 - hermes-parser: 0.20.1 + '@babel/core': 7.25.2 + hermes-parser: 0.19.1 nullthrows: 1.1.1 transitivePeerDependencies: - supports-color - metro-cache-key@0.80.9: {} + metro-cache-key@0.80.6: {} - metro-cache@0.80.9: + metro-cache@0.80.6: dependencies: - metro-core: 0.80.9 + metro-core: 0.80.6 rimraf: 3.0.2 - metro-config@0.80.9(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.3): + metro-config@0.80.6(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10): dependencies: connect: 3.7.0 cosmiconfig: 5.2.1 jest-validate: 29.7.0 - metro: 0.80.9(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.3) - metro-cache: 0.80.9 - metro-core: 0.80.9 - metro-runtime: 0.80.9 + metro: 0.80.6(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) + metro-cache: 0.80.6 + metro-core: 0.80.6 + metro-runtime: 0.80.6 transitivePeerDependencies: - bufferutil - encoding - supports-color - utf-8-validate - metro-core@0.80.9: + metro-core@0.80.6: dependencies: lodash.throttle: 4.1.1 - metro-resolver: 0.80.9 + metro-resolver: 0.80.6 - metro-file-map@0.80.9: + metro-file-map@0.80.6: dependencies: anymatch: 3.1.3 debug: 2.6.9 @@ -21795,7 +26214,7 @@ snapshots: graceful-fs: 4.2.11 invariant: 2.2.4 jest-worker: 29.7.0 - micromatch: 4.0.5 + micromatch: 4.0.8 node-abort-controller: 3.1.1 nullthrows: 1.1.1 walker: 1.0.8 @@ -21804,33 +26223,33 @@ snapshots: transitivePeerDependencies: - supports-color - metro-minify-terser@0.80.9: + metro-minify-terser@0.80.6: dependencies: - terser: 5.31.0 + terser: 5.27.2 - metro-resolver@0.80.9: {} + metro-resolver@0.80.6: {} - metro-runtime@0.80.9: + metro-runtime@0.80.6: dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.23.9 - metro-source-map@0.80.9: + metro-source-map@0.80.6: dependencies: - '@babel/traverse': 7.24.5 - '@babel/types': 7.24.5 + '@babel/traverse': 7.25.6 + '@babel/types': 7.25.6 invariant: 2.2.4 - metro-symbolicate: 0.80.9 + metro-symbolicate: 0.80.6 nullthrows: 1.1.1 - ob1: 0.80.9 + ob1: 0.80.6 source-map: 0.5.7 vlq: 1.0.1 transitivePeerDependencies: - supports-color - metro-symbolicate@0.80.9: + metro-symbolicate@0.80.6: dependencies: invariant: 2.2.4 - metro-source-map: 0.80.9 + metro-source-map: 0.80.6 nullthrows: 1.1.1 source-map: 0.5.7 through2: 2.0.5 @@ -21838,29 +26257,29 @@ snapshots: transitivePeerDependencies: - supports-color - metro-transform-plugins@0.80.9: + metro-transform-plugins@0.80.6: dependencies: - '@babel/core': 7.24.5 - '@babel/generator': 7.24.5 - '@babel/template': 7.24.0 - '@babel/traverse': 7.24.5 + '@babel/core': 7.25.2 + '@babel/generator': 7.25.6 + '@babel/template': 7.25.0 + '@babel/traverse': 7.25.6 nullthrows: 1.1.1 transitivePeerDependencies: - supports-color - metro-transform-worker@0.80.9(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.3): - dependencies: - '@babel/core': 7.24.5 - '@babel/generator': 7.24.5 - '@babel/parser': 7.24.5 - '@babel/types': 7.24.5 - metro: 0.80.9(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.3) - metro-babel-transformer: 0.80.9 - metro-cache: 0.80.9 - metro-cache-key: 0.80.9 - metro-minify-terser: 0.80.9 - metro-source-map: 0.80.9 - metro-transform-plugins: 0.80.9 + metro-transform-worker@0.80.6(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10): + dependencies: + '@babel/core': 7.25.2 + '@babel/generator': 7.25.6 + '@babel/parser': 7.25.6 + '@babel/types': 7.25.6 + metro: 0.80.6(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) + metro-babel-transformer: 0.80.6 + metro-cache: 0.80.6 + metro-cache-key: 0.80.6 + metro-minify-terser: 0.80.6 + metro-source-map: 0.80.6 + metro-transform-plugins: 0.80.6 nullthrows: 1.1.1 transitivePeerDependencies: - bufferutil @@ -21868,15 +26287,15 @@ snapshots: - supports-color - utf-8-validate - metro@0.80.9(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.3): + metro@0.80.6(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10): dependencies: - '@babel/code-frame': 7.24.2 - '@babel/core': 7.24.5 - '@babel/generator': 7.24.5 - '@babel/parser': 7.24.5 - '@babel/template': 7.24.0 - '@babel/traverse': 7.24.5 - '@babel/types': 7.24.5 + '@babel/code-frame': 7.24.7 + '@babel/core': 7.25.2 + '@babel/generator': 7.25.6 + '@babel/parser': 7.25.6 + '@babel/template': 7.25.0 + '@babel/traverse': 7.25.6 + '@babel/types': 7.25.6 accepts: 1.3.8 chalk: 4.1.2 ci-info: 2.0.0 @@ -21885,33 +26304,33 @@ snapshots: denodeify: 1.2.1 error-stack-parser: 2.1.4 graceful-fs: 4.2.11 - hermes-parser: 0.20.1 + hermes-parser: 0.19.1 image-size: 1.1.1 invariant: 2.2.4 jest-worker: 29.7.0 jsc-safe-url: 0.2.4 lodash.throttle: 4.1.1 - metro-babel-transformer: 0.80.9 - metro-cache: 0.80.9 - metro-cache-key: 0.80.9 - metro-config: 0.80.9(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.3) - metro-core: 0.80.9 - metro-file-map: 0.80.9 - metro-resolver: 0.80.9 - metro-runtime: 0.80.9 - metro-source-map: 0.80.9 - metro-symbolicate: 0.80.9 - metro-transform-plugins: 0.80.9 - metro-transform-worker: 0.80.9(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.3) + metro-babel-transformer: 0.80.6 + metro-cache: 0.80.6 + metro-cache-key: 0.80.6 + metro-config: 0.80.6(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) + metro-core: 0.80.6 + metro-file-map: 0.80.6 + metro-resolver: 0.80.6 + metro-runtime: 0.80.6 + metro-source-map: 0.80.6 + metro-symbolicate: 0.80.6 + metro-transform-plugins: 0.80.6 + metro-transform-worker: 0.80.6(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) mime-types: 2.1.35 - node-fetch: 2.7.0(encoding@0.1.13) + node-fetch: 2.7.0 nullthrows: 1.1.1 rimraf: 3.0.2 serialize-error: 2.1.0 source-map: 0.5.7 strip-ansi: 6.0.1 throat: 5.0.0 - ws: 7.5.9(bufferutil@4.0.8)(utf-8-validate@6.0.3) + ws: 7.5.9(bufferutil@4.0.8)(utf-8-validate@5.0.10) yargs: 17.7.2 transitivePeerDependencies: - bufferutil @@ -22050,8 +26469,8 @@ snapshots: micromark-extension-mdxjs@3.0.0: dependencies: - acorn: 8.11.3 - acorn-jsx: 5.3.2(acorn@8.11.3) + acorn: 8.12.1 + acorn-jsx: 5.3.2(acorn@8.12.1) micromark-extension-mdx-expression: 3.0.0 micromark-extension-mdx-jsx: 3.0.0 micromark-extension-mdx-md: 2.0.0 @@ -22176,7 +26595,7 @@ snapshots: micromark@4.0.0: dependencies: '@types/debug': 4.1.12 - debug: 4.3.4 + debug: 4.3.7(supports-color@8.1.1) decode-named-character-reference: 1.0.2 devlop: 1.1.0 micromark-core-commonmark: 2.0.1 @@ -22195,9 +26614,14 @@ snapshots: transitivePeerDependencies: - supports-color - micromatch@4.0.5: + micromatch@4.0.7: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + micromatch@4.0.8: dependencies: - braces: 3.0.2 + braces: 3.0.3 picomatch: 2.3.1 mime-db@1.52.0: {} @@ -22216,10 +26640,18 @@ snapshots: mimic-fn@4.0.0: {} + mimic-function@5.0.1: {} + + mimic-response@1.0.1: {} + mimic-response@3.1.0: {} mimic-response@4.0.0: {} + min-document@2.19.0: + dependencies: + dom-walk: 0.1.2 + min-indent@1.0.1: {} minidenticons@4.2.1: {} @@ -22228,10 +26660,18 @@ snapshots: minimalistic-crypto-utils@1.0.1: {} + minimatch@10.0.1: + dependencies: + brace-expansion: 2.0.1 + minimatch@3.1.2: dependencies: brace-expansion: 1.1.11 + minimatch@5.0.1: + dependencies: + brace-expansion: 2.0.1 + minimatch@5.1.6: dependencies: brace-expansion: 2.0.1 @@ -22240,36 +26680,66 @@ snapshots: dependencies: brace-expansion: 2.0.1 + minimatch@9.0.3: + dependencies: + brace-expansion: 2.0.1 + minimatch@9.0.4: dependencies: brace-expansion: 2.0.1 minimist@1.2.8: {} - minipass@3.3.6: + minipass@2.9.0: dependencies: - yallist: 4.0.0 + safe-buffer: 5.2.1 + yallist: 3.1.1 - minipass@5.0.0: {} + minipass@7.0.4: {} - minipass@7.1.0: {} + minipass@7.1.2: {} - minizlib@2.1.2: + minizlib@1.3.3: dependencies: - minipass: 3.3.6 - yallist: 4.0.0 + minipass: 2.9.0 - mipd@0.0.5(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8): + mipd@0.0.5(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.22.4): dependencies: - viem: 1.21.4(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8) + viem: 1.21.4(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.22.4) optionalDependencies: - typescript: 5.4.5 + typescript: 5.4.3 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + - zod + + mipd@0.0.5(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.23.8): + dependencies: + viem: 1.21.4(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.23.8) + optionalDependencies: + typescript: 5.4.3 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + - zod + + mipd@0.0.5(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@6.0.3)(zod@3.23.8): + dependencies: + viem: 1.21.4(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@6.0.3)(zod@3.23.8) + optionalDependencies: + typescript: 5.4.3 transitivePeerDependencies: - bufferutil - utf-8-validate - zod - mkdirp-classic@0.5.3: {} + mipd@0.0.7(typescript@5.4.5): + optionalDependencies: + typescript: 5.4.5 + + mkdirp-promise@5.0.1: + dependencies: + mkdirp: 2.1.6 mkdirp@0.5.6: dependencies: @@ -22279,38 +26749,67 @@ snapshots: mkdirp@2.1.6: {} - mlly@1.7.0: + mlly@1.5.0: dependencies: - acorn: 8.11.3 + acorn: 8.12.0 pathe: 1.1.2 - pkg-types: 1.1.0 - ufo: 1.5.3 - - moralis@2.26.1(debug@4.3.4): - dependencies: - '@moralisweb3/api-utils': 2.26.1(debug@4.3.4) - '@moralisweb3/aptos-api': 2.26.1(debug@4.3.4) - '@moralisweb3/auth': 2.26.1(debug@4.3.4) - '@moralisweb3/common-aptos-utils': 2.26.1(debug@4.3.4) - '@moralisweb3/common-auth-utils': 2.26.1(debug@4.3.4) - '@moralisweb3/common-core': 2.26.1(debug@4.3.4) - '@moralisweb3/common-evm-utils': 2.26.1(debug@4.3.4) - '@moralisweb3/common-sol-utils': 2.26.1(debug@4.3.4) - '@moralisweb3/common-streams-utils': 2.26.1(debug@4.3.4) - '@moralisweb3/evm-api': 2.26.1(debug@4.3.4) - '@moralisweb3/sol-api': 2.26.1(debug@4.3.4) - '@moralisweb3/streams': 2.26.1(debug@4.3.4) + pkg-types: 1.0.3 + ufo: 1.4.0 + + mnemonist@0.38.5: + dependencies: + obliterator: 2.0.4 + + mocha@10.7.3: + dependencies: + ansi-colors: 4.1.3 + browser-stdout: 1.3.1 + chokidar: 3.6.0 + debug: 4.3.7(supports-color@8.1.1) + diff: 5.2.0 + escape-string-regexp: 4.0.0 + find-up: 5.0.0 + glob: 8.1.0 + he: 1.2.0 + js-yaml: 4.1.0 + log-symbols: 4.1.0 + minimatch: 5.1.6 + ms: 2.1.3 + serialize-javascript: 6.0.2 + strip-json-comments: 3.1.1 + supports-color: 8.1.1 + workerpool: 6.5.1 + yargs: 16.2.0 + yargs-parser: 20.2.9 + yargs-unparser: 2.0.0 + + mock-fs@4.14.0: {} + + moralis@2.26.2(debug@4.3.4): + dependencies: + '@moralisweb3/api-utils': 2.26.2(debug@4.3.4) + '@moralisweb3/aptos-api': 2.26.2(debug@4.3.4) + '@moralisweb3/auth': 2.26.2(debug@4.3.4) + '@moralisweb3/common-aptos-utils': 2.26.2(debug@4.3.4) + '@moralisweb3/common-auth-utils': 2.26.2(debug@4.3.4) + '@moralisweb3/common-core': 2.26.2(debug@4.3.4) + '@moralisweb3/common-evm-utils': 2.26.2(debug@4.3.4) + '@moralisweb3/common-sol-utils': 2.26.2(debug@4.3.4) + '@moralisweb3/common-streams-utils': 2.26.2(debug@4.3.4) + '@moralisweb3/evm-api': 2.26.2(debug@4.3.4) + '@moralisweb3/sol-api': 2.26.2(debug@4.3.4) + '@moralisweb3/streams': 2.26.2(debug@4.3.4) '@moralisweb3/streams-typings': 1.0.7 transitivePeerDependencies: - debug motion@10.16.2: dependencies: - '@motionone/animation': 10.17.0 - '@motionone/dom': 10.17.0 + '@motionone/animation': 10.16.3 + '@motionone/dom': 10.16.4 '@motionone/svelte': 10.16.4 - '@motionone/types': 10.17.0 - '@motionone/utils': 10.17.0 + '@motionone/types': 10.16.3 + '@motionone/utils': 10.16.3 '@motionone/vue': 10.16.4 mri@1.2.0: {} @@ -22325,33 +26824,62 @@ snapshots: muggle-string@0.4.1: {} + multibase@0.6.1: + dependencies: + base-x: 3.0.9 + buffer: 5.7.1 + + multibase@0.7.0: + dependencies: + base-x: 3.0.9 + buffer: 5.7.1 + + multicodec@0.5.7: + dependencies: + varint: 5.0.2 + + multicodec@1.0.4: + dependencies: + buffer: 5.7.1 + varint: 5.0.2 + multiformats@11.0.2: {} multiformats@12.1.3: {} - multiformats@13.1.0: {} + multiformats@13.1.3: {} multiformats@9.9.0: {} + multihashes@0.4.21: + dependencies: + buffer: 5.7.1 + multibase: 0.7.0 + varint: 5.0.2 + murky@https://codeload.github.com/dmfxyz/murky/tar.gz/5feccd1253d7da820f7cccccdedf64471025455d: {} + mute-stream@0.0.8: {} + mz@2.7.0: dependencies: any-promise: 1.3.0 object-assign: 4.1.1 thenify-all: 1.6.0 + nano-json-stream-parser@0.1.2: {} + nanoid@3.3.7: {} nanoid@4.0.2: {} - native-fetch@3.0.0(node-fetch@2.7.0(encoding@0.1.13)): + native-fetch@3.0.0(node-fetch@2.7.0): dependencies: - node-fetch: 2.7.0(encoding@0.1.13) + node-fetch: 2.7.0 - native-fetch@4.0.2(undici@5.28.4): + native-fetch@4.0.2(undici@5.28.3): dependencies: - undici: 5.28.4 + undici: 5.28.3 natural-compare@1.4.0: {} @@ -22359,16 +26887,22 @@ snapshots: neo-async@2.6.2: {} + neotraverse@0.6.18: {} + next-tick@1.1.0: {} - nlcst-to-string@3.1.1: + nlcst-to-string@4.0.0: dependencies: - '@types/nlcst': 1.0.4 + '@types/nlcst': 2.0.3 + + nlcst-to-string@4.0.0: + dependencies: + '@types/nlcst': 2.0.3 no-case@3.0.4: dependencies: lower-case: 2.0.2 - tslib: 2.6.2 + tslib: 2.6.3 nocache@3.0.4: {} @@ -22384,36 +26918,31 @@ snapshots: dependencies: minimatch: 3.1.2 - node-fetch-native@1.6.4: {} + node-fetch-native@1.6.2: {} - node-fetch@2.7.0(encoding@0.1.13): + node-fetch@2.7.0: dependencies: whatwg-url: 5.0.0 - optionalDependencies: - encoding: 0.1.13 node-forge@1.3.1: {} - node-gyp-build@4.8.1: {} + node-gyp-build@4.8.0: {} node-int64@0.4.0: {} node-releases@2.0.14: {} - node-stream-zip@1.15.0: {} + node-releases@2.0.18: {} - normalize-package-data@2.5.0: - dependencies: - hosted-git-info: 2.8.9 - resolve: 1.22.8 - semver: 5.7.2 - validate-npm-package-license: 3.0.4 + node-stream-zip@1.15.0: {} normalize-path@3.0.0: {} normalize-range@0.1.2: {} - normalize-url@8.0.1: {} + normalize-url@6.1.0: {} + + normalize-url@8.0.0: {} not@0.1.0: {} @@ -22434,7 +26963,7 @@ snapshots: dependencies: path-key: 3.1.1 - npm-run-path@5.3.0: + npm-run-path@5.2.0: dependencies: path-key: 4.0.0 @@ -22449,17 +26978,11 @@ snapshots: bn.js: 4.11.6 strip-hex-prefix: 1.0.0 - nwsapi@2.2.9: {} + nwsapi@2.2.7: {} - nypm@0.3.8: - dependencies: - citty: 0.1.6 - consola: 3.2.3 - execa: 8.0.1 - pathe: 1.1.2 - ufo: 1.5.3 + oauth-sign@0.9.0: {} - ob1@0.80.9: {} + ob1@0.80.6: {} obj-multiplex@1.0.0: dependencies: @@ -22471,12 +26994,7 @@ snapshots: object-hash@3.0.0: {} - object-inspect@1.13.1: {} - - object-is@1.1.6: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 + object-inspect@1.13.2: {} object-keys@1.1.1: {} @@ -22487,30 +27005,36 @@ snapshots: has-symbols: 1.0.3 object-keys: 1.1.1 - object.fromentries@2.0.8: + object.fromentries@2.0.7: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.23.3 - es-object-atoms: 1.0.0 + es-abstract: 1.22.3 - object.groupby@1.0.3: + object.groupby@1.0.1: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.22.3 + get-intrinsic: 1.2.4 - object.values@1.2.0: + object.values@1.1.7: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-object-atoms: 1.0.0 + es-abstract: 1.22.3 + + obliterator@2.0.4: {} + + oboe@2.1.5: + dependencies: + http-https: 1.0.0 - ofetch@1.3.4: + ofetch@1.3.3: dependencies: destr: 2.0.3 - node-fetch-native: 1.6.4 - ufo: 1.5.3 + node-fetch-native: 1.6.2 + ufo: 1.4.0 ohash@1.1.3: {} @@ -22538,6 +27062,14 @@ snapshots: dependencies: mimic-fn: 4.0.0 + onetime@7.0.0: + dependencies: + mimic-function: 5.0.1 + + oniguruma-to-js@0.4.3: + dependencies: + regex: 4.3.2 + open@6.4.0: dependencies: is-wsl: 1.1.0 @@ -22553,16 +27085,27 @@ snapshots: is-docker: 2.2.1 is-wsl: 2.2.0 + open@9.1.0: + dependencies: + default-browser: 4.0.0 + define-lazy-prop: 3.0.0 + is-inside-container: 1.0.0 + is-wsl: 2.2.0 + openapi-types@12.1.3: {} - optionator@0.9.4: + optimism@https://codeload.github.com/ethereum-optimism/optimism/tar.gz/ab3a54febb36398539fd3b849c222b7e70169dc8: + dependencies: + '@changesets/cli': 2.27.8 + + 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 - word-wrap: 1.2.5 ora@5.4.1: dependencies: @@ -22588,20 +27131,24 @@ snapshots: strip-ansi: 7.1.0 wcwidth: 1.0.1 - ora@8.0.1: + ora@8.1.0: dependencies: chalk: 5.3.0 - cli-cursor: 4.0.0 + cli-cursor: 5.0.0 cli-spinners: 2.9.2 is-interactive: 2.0.0 is-unicode-supported: 2.0.0 log-symbols: 6.0.0 stdin-discarder: 0.2.2 - string-width: 7.1.0 + string-width: 7.2.0 strip-ansi: 7.1.0 os-tmpdir@1.0.2: {} + outdent@0.5.0: {} + + p-cancelable@2.1.1: {} + p-cancelable@3.0.0: {} p-defer@3.0.0: {} @@ -22613,6 +27160,14 @@ snapshots: fast-fifo: 1.3.2 p-defer: 3.0.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 @@ -22623,11 +27178,19 @@ snapshots: p-limit@4.0.0: dependencies: - yocto-queue: 1.0.0 + yocto-queue: 1.1.1 p-limit@5.0.0: dependencies: - yocto-queue: 1.0.0 + yocto-queue: 1.1.1 + + p-limit@6.1.0: + dependencies: + yocto-queue: 1.1.1 + + p-locate@2.0.0: + dependencies: + p-limit: 1.3.0 p-locate@3.0.0: dependencies: @@ -22645,6 +27208,8 @@ snapshots: dependencies: p-limit: 4.0.0 + p-map@2.1.0: {} + p-map@4.0.0: dependencies: aggregate-error: 3.1.0 @@ -22658,10 +27223,14 @@ snapshots: p-timeout@6.1.2: {} + p-try@1.0.0: {} + p-try@2.2.0: {} p256-verifier#v0.1.0@https://codeload.github.com/taikoxyz/p256-verifier/tar.gz/6ef45b117642786b08a37b4c37c6a6ce151166da: {} + package-json-from-dist@1.0.0: {} + package-json@8.1.1: dependencies: got: 12.6.1 @@ -22669,6 +27238,8 @@ snapshots: registry-url: 6.0.1 semver: 7.6.2 + package-manager-detector@0.2.0: {} + pagefind@1.1.0: optionalDependencies: '@pagefind/darwin-arm64': 1.1.0 @@ -22677,12 +27248,7 @@ snapshots: '@pagefind/linux-x64': 1.1.0 '@pagefind/windows-x64': 1.1.0 - pako@0.2.9: {} - - param-case@3.0.4: - dependencies: - dot-case: 3.0.4 - tslib: 2.6.2 + pako@1.0.11: {} parent-module@1.0.1: dependencies: @@ -22701,6 +27267,8 @@ snapshots: is-decimal: 2.0.1 is-hexadecimal: 2.0.1 + parse-headers@2.0.5: {} + parse-json@4.0.0: dependencies: error-ex: 1.3.2 @@ -22708,16 +27276,28 @@ snapshots: parse-json@5.2.0: dependencies: - '@babel/code-frame': 7.24.2 + '@babel/code-frame': 7.23.5 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 - parse-latin@5.0.1: + parse-latin@7.0.0: dependencies: - nlcst-to-string: 3.1.1 - unist-util-modify-children: 3.1.1 - unist-util-visit-children: 2.0.2 + '@types/nlcst': 2.0.3 + '@types/unist': 3.0.2 + nlcst-to-string: 4.0.0 + unist-util-modify-children: 4.0.0 + unist-util-visit-children: 3.0.0 + vfile: 6.0.3 + + parse-latin@7.0.0: + dependencies: + '@types/nlcst': 2.0.3 + '@types/unist': 3.0.2 + nlcst-to-string: 4.0.0 + unist-util-modify-children: 4.0.0 + unist-util-visit-children: 3.0.0 + vfile: 6.0.1 parse5@7.1.2: dependencies: @@ -22728,14 +27308,9 @@ snapshots: pascal-case@3.1.2: dependencies: no-case: 3.0.4 - tslib: 2.6.2 - - path-browserify@1.0.1: {} - - path-case@3.0.4: - dependencies: - dot-case: 3.0.4 - tslib: 2.6.2 + tslib: 2.6.3 + + path-browserify@1.0.1: {} path-exists@3.0.0: {} @@ -22751,23 +27326,28 @@ snapshots: path-parse@1.0.7: {} - path-scurry@1.10.2: + path-scurry@1.10.1: + dependencies: + lru-cache: 10.2.0 + minipass: 7.0.4 + + path-scurry@2.0.0: dependencies: - lru-cache: 10.2.2 - minipass: 7.1.0 + lru-cache: 11.0.1 + minipass: 7.1.2 - path-to-regexp@0.1.7: {} + path-to-regexp@0.1.10: {} path-to-regexp@6.2.2: {} path-type@4.0.0: {} - path-type@5.0.0: {} - pathe@1.1.2: {} pathval@1.1.1: {} + pathval@2.0.0: {} + pbkdf2@3.1.2: dependencies: create-hash: 1.2.0 @@ -22776,11 +27356,7 @@ snapshots: safe-buffer: 5.2.1 sha.js: 2.4.11 - peek-stream@1.1.3: - dependencies: - buffer-from: 1.1.2 - duplexify: 3.7.1 - through2: 2.0.5 + performance-now@2.1.0: {} periscopic@3.1.0: dependencies: @@ -22788,10 +27364,14 @@ snapshots: estree-walker: 3.0.3 is-reference: 3.0.2 - picocolors@1.0.0: {} + picocolors@1.0.1: {} + + picocolors@1.1.0: {} picomatch@2.3.1: {} + picomatch@3.0.1: {} + pify@2.3.0: {} pify@3.0.0: {} @@ -22802,7 +27382,7 @@ snapshots: pino-abstract-transport@0.5.0: dependencies: - duplexify: 4.1.3 + duplexify: 4.1.2 split2: 4.2.0 pino-std-serializers@4.0.0: {} @@ -22810,7 +27390,7 @@ snapshots: pino@7.11.0: dependencies: atomic-sleep: 1.0.0 - fast-redact: 3.5.0 + fast-redact: 3.3.0 on-exit-leak-free: 0.2.0 pino-abstract-transport: 0.5.0 pino-std-serializers: 4.0.0 @@ -22831,21 +27411,17 @@ snapshots: dependencies: find-up: 4.1.0 - pkg-dir@5.0.0: - dependencies: - find-up: 5.0.0 - - pkg-types@1.1.0: + pkg-types@1.0.3: dependencies: - confbox: 0.1.7 - mlly: 1.7.0 + jsonc-parser: 3.2.0 + mlly: 1.5.0 pathe: 1.1.2 - playwright-core@1.44.0: {} + playwright-core@1.43.1: {} - playwright@1.44.0: + playwright@1.43.1: dependencies: - playwright-core: 1.44.0 + playwright-core: 1.43.1 optionalDependencies: fsevents: 2.3.2 @@ -22855,71 +27431,105 @@ snapshots: polished@4.3.1: dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.23.9 - pony-cause@2.1.11: {} + pony-cause@2.1.10: {} - possible-typed-array-names@1.0.0: {} - - postcss-import@15.1.0(postcss@8.4.38): + postcss-import@15.1.0(postcss@8.4.39): dependencies: - postcss: 8.4.38 + postcss: 8.4.39 postcss-value-parser: 4.2.0 read-cache: 1.0.0 resolve: 1.22.8 - postcss-import@16.1.0(postcss@8.4.38): + postcss-import@16.1.0(postcss@8.4.39): dependencies: - postcss: 8.4.38 + postcss: 8.4.39 postcss-value-parser: 4.2.0 read-cache: 1.0.0 resolve: 1.22.8 - postcss-js@4.0.1(postcss@8.4.38): + postcss-js@4.0.1(postcss@8.4.39): + dependencies: + camelcase-css: 2.0.1 + postcss: 8.4.39 + + postcss-js@4.0.1(postcss@8.4.47): dependencies: camelcase-css: 2.0.1 + postcss: 8.4.47 + + postcss-load-config@3.1.4(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.3)): + dependencies: + lilconfig: 2.1.0 + postcss: 8.4.39 + yaml: 1.10.2 + optionalDependencies: postcss: 8.4.38 + ts-node: 10.9.2(@types/node@20.12.7)(typescript@5.4.3) - postcss-load-config@3.1.4(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.12.11)(typescript@5.4.5)): + postcss-load-config@3.1.4(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.5)): dependencies: lilconfig: 2.1.0 yaml: 1.10.2 optionalDependencies: postcss: 8.4.38 - ts-node: 10.9.2(@types/node@20.12.11)(typescript@5.4.5) + ts-node: 10.9.2(@types/node@20.12.7)(typescript@5.4.5) - postcss-load-config@4.0.2(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.12.11)(typescript@5.4.5)): + postcss-load-config@4.0.2(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.3)): dependencies: lilconfig: 3.1.1 - yaml: 2.4.2 + yaml: 2.3.4 optionalDependencies: postcss: 8.4.38 - ts-node: 10.9.2(@types/node@20.12.11)(typescript@5.4.5) + ts-node: 10.9.2(@types/node@20.12.7)(typescript@5.4.3) - postcss-nested@5.0.6(postcss@8.4.38): + postcss-load-config@4.0.2(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.5)): dependencies: + lilconfig: 3.1.1 + yaml: 2.3.4 + optionalDependencies: postcss: 8.4.38 - postcss-selector-parser: 6.0.16 + ts-node: 10.9.2(@types/node@20.12.7)(typescript@5.4.5) - postcss-nested@6.0.1(postcss@8.4.38): + postcss-load-config@4.0.2(postcss@8.4.47)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.5)): dependencies: - postcss: 8.4.38 - postcss-selector-parser: 6.0.16 + lilconfig: 3.1.1 + yaml: 2.3.4 + optionalDependencies: + postcss: 8.4.47 + ts-node: 10.9.2(@types/node@20.12.7)(typescript@5.4.5) + optional: true - postcss-nesting@12.1.2(postcss@8.4.38): + postcss-nested@5.0.6(postcss@8.4.39): dependencies: - '@csstools/selector-resolve-nested': 1.1.0(postcss-selector-parser@6.0.16) - '@csstools/selector-specificity': 3.0.3(postcss-selector-parser@6.0.16) - postcss: 8.4.38 - postcss-selector-parser: 6.0.16 + postcss: 8.4.39 + postcss-selector-parser: 6.1.0 - postcss-safe-parser@6.0.0(postcss@8.4.38): + postcss-nested@6.0.1(postcss@8.4.39): dependencies: - postcss: 8.4.38 + postcss: 8.4.39 + postcss-selector-parser: 6.1.0 - postcss-scss@4.0.9(postcss@8.4.38): + postcss-nesting@12.1.0(postcss@8.4.38): dependencies: + '@csstools/selector-resolve-nested': 1.1.0(postcss-selector-parser@6.0.15) + '@csstools/selector-specificity': 3.0.2(postcss-selector-parser@6.0.15) postcss: 8.4.38 + postcss-selector-parser: 6.0.15 + + postcss-safe-parser@6.0.0(postcss@8.4.39): + dependencies: + postcss: 8.4.39 + + postcss-scss@4.0.9(postcss@8.4.39): + dependencies: + postcss: 8.4.39 + + postcss-selector-parser@6.0.15: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 postcss-selector-parser@6.0.16: dependencies: @@ -22928,20 +27538,25 @@ snapshots: postcss-value-parser@4.2.0: {} - postcss@8.4.38: + postcss@8.4.39: dependencies: nanoid: 3.3.7 - picocolors: 1.0.0 + picocolors: 1.0.1 source-map-js: 1.2.0 - preact@10.21.0: {} + postcss@8.4.47: + dependencies: + nanoid: 3.3.7 + picocolors: 1.1.0 + source-map-js: 1.2.1 + + preact@10.19.5: {} - preferred-pm@3.1.3: + preferred-pm@4.0.0: dependencies: - find-up: 5.0.0 + find-up-simple: 1.0.0 find-yarn-workspace-root2: 1.2.16 - path-exists: 4.0.0 - which-pm: 2.0.0 + which-pm: 3.0.0 prelude-ls@1.2.1: {} @@ -22949,14 +27564,21 @@ snapshots: dependencies: fast-diff: 1.3.0 - prettier-plugin-svelte@3.2.3(prettier@3.2.5)(svelte@4.2.16): + prettier-plugin-svelte@3.2.2(prettier@3.2.5)(svelte@4.2.13): dependencies: prettier: 3.2.5 - svelte: 4.2.16 + svelte: 4.2.13 - prettier@2.8.8: + prettier-plugin-svelte@3.2.3(prettier@3.2.5)(svelte@4.2.17): + dependencies: + prettier: 3.2.5 + svelte: 4.2.17 + + prettier@2.8.7: optional: true + prettier@2.8.8: {} + prettier@3.2.5: {} pretty-format@26.6.2: @@ -22976,12 +27598,12 @@ snapshots: dependencies: '@jest/schemas': 29.6.3 ansi-styles: 5.2.0 - react-is: 18.3.1 - - pretty-hrtime@1.0.3: {} + react-is: 18.2.0 prismjs@1.29.0: {} + process-nextick-args@1.0.7: {} + process-nextick-args@2.0.1: {} process-warning@1.0.0: {} @@ -22996,16 +27618,30 @@ snapshots: dependencies: asap: 2.0.6 + prompt@1.3.0: + dependencies: + '@colors/colors': 1.5.0 + async: 3.2.3 + read: 1.0.7 + revalidator: 0.1.8 + winston: 2.4.7 + prompts@2.4.2: dependencies: kleur: 3.0.3 sisteransi: 1.0.5 + prop-types@15.8.1: + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + react-is: 16.13.1 + property-information@6.5.0: {} proto-list@1.2.4: {} - protobufjs@7.2.6: + protobufjs@7.3.2: dependencies: '@protobufjs/aspromise': 1.1.2 '@protobufjs/base64': 1.1.2 @@ -23017,7 +27653,7 @@ snapshots: '@protobufjs/path': 1.1.2 '@protobufjs/pool': 1.1.0 '@protobufjs/utf8': 1.1.0 - '@types/node': 20.12.11 + '@types/node': 20.12.7 long: 5.2.3 proxy-addr@2.0.7: @@ -23029,29 +27665,22 @@ snapshots: proxy-from-env@1.1.0: {} + pseudomap@1.0.2: {} + psl@1.9.0: {} publint@0.1.16: dependencies: npm-packlist: 5.1.3 - picocolors: 1.0.0 + picocolors: 1.0.1 sade: 1.8.1 - pump@2.0.1: - dependencies: - end-of-stream: 1.4.4 - once: 1.4.0 - pump@3.0.0: dependencies: end-of-stream: 1.4.4 once: 1.4.0 - pumpify@1.5.1: - dependencies: - duplexify: 3.7.1 - inherits: 2.0.4 - pump: 2.0.1 + punycode@2.1.0: {} punycode@2.3.1: {} @@ -23070,13 +27699,17 @@ snapshots: pngjs: 5.0.0 yargs: 15.4.1 - qs@6.11.0: + qs@6.13.0: dependencies: side-channel: 1.0.6 - qs@6.12.1: + qs@6.5.3: {} + + query-string@5.1.1: dependencies: - side-channel: 1.0.6 + decode-uri-component: 0.2.2 + object-assign: 4.1.1 + strict-uri-encode: 1.1.0 query-string@7.1.3: dependencies: @@ -23085,8 +27718,6 @@ snapshots: split-on-first: 1.1.0 strict-uri-encode: 2.0.0 - querystring@0.2.1: {} - querystringify@2.2.0: {} queue-microtask@1.2.3: {} @@ -23099,9 +27730,7 @@ snapshots: quick-lru@5.1.1: {} - radix3@1.1.2: {} - - ramda@0.29.0: {} + radix3@1.1.0: {} randombytes@2.1.0: dependencies: @@ -23123,97 +27752,98 @@ snapshots: minimist: 1.2.8 strip-json-comments: 2.0.1 - react-colorful@5.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + react-colorful@5.6.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) - react-confetti@6.1.0(react@18.3.1): + react-confetti@6.1.0(react@18.2.0): dependencies: - react: 18.3.1 + react: 18.2.0 tween-functions: 1.2.0 - react-devtools-core@5.2.0(bufferutil@4.0.8)(utf-8-validate@6.0.3): + react-devtools-core@4.28.5(bufferutil@4.0.8)(utf-8-validate@5.0.10): dependencies: shell-quote: 1.8.1 - ws: 7.5.9(bufferutil@4.0.8)(utf-8-validate@6.0.3) + ws: 7.5.9(bufferutil@4.0.8)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - utf-8-validate - react-dom@18.3.1(react@18.3.1): + react-dom@18.2.0(react@18.2.0): dependencies: loose-envify: 1.4.0 - react: 18.3.1 - scheduler: 0.23.2 + react: 18.2.0 + scheduler: 0.23.0 - react-i18next@13.5.0(i18next@22.5.1)(react-dom@18.3.1(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.3.2)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1): + react-i18next@13.5.0(i18next@22.5.1)(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))(react@18.2.0): dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.23.9 html-parse-stringify: 3.0.1 i18next: 22.5.1 - react: 18.3.1 + react: 18.2.0 optionalDependencies: - react-dom: 18.3.1(react@18.3.1) - react-native: 0.74.1(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.3.2)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3) + react-dom: 18.2.0(react@18.2.0) + react-native: 0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10) + + react-is@16.13.1: {} react-is@17.0.2: {} - react-is@18.3.1: {} + react-is@18.2.0: {} react-native-fetch-api@3.0.0: dependencies: p-defer: 3.0.0 - react-native-webview@11.26.1(react-native@0.74.1(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.3.2)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1): + react-native-webview@11.26.1(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10))(react@18.2.0): dependencies: escape-string-regexp: 2.0.0 invariant: 2.2.4 - react: 18.3.1 - react-native: 0.74.1(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.3.2)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3) + react: 18.2.0 + react-native: 0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10) - react-native@0.74.1(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.3.2)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3): + react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10): dependencies: '@jest/create-cache-key-function': 29.7.0 - '@react-native-community/cli': 13.6.6(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.3) - '@react-native-community/cli-platform-android': 13.6.6(encoding@0.1.13) - '@react-native-community/cli-platform-ios': 13.6.6(encoding@0.1.13) - '@react-native/assets-registry': 0.74.83 - '@react-native/codegen': 0.74.83(@babel/preset-env@7.24.5(@babel/core@7.24.5)) - '@react-native/community-cli-plugin': 0.74.83(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.3) - '@react-native/gradle-plugin': 0.74.83 - '@react-native/js-polyfills': 0.74.83 - '@react-native/normalize-colors': 0.74.83 - '@react-native/virtualized-lists': 0.74.83(@types/react@18.3.2)(react-native@0.74.1(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.3.2)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1) + '@react-native-community/cli': 12.3.2(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) + '@react-native-community/cli-platform-android': 12.3.2(encoding@0.1.13) + '@react-native-community/cli-platform-ios': 12.3.2(encoding@0.1.13) + '@react-native/assets-registry': 0.73.1 + '@react-native/codegen': 0.73.3(@babel/preset-env@7.23.9(@babel/core@7.25.2)) + '@react-native/community-cli-plugin': 0.73.16(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) + '@react-native/gradle-plugin': 0.73.4 + '@react-native/js-polyfills': 0.73.1 + '@react-native/normalize-colors': 0.73.2 + '@react-native/virtualized-lists': 0.73.4(react-native@0.73.4(@babel/core@7.25.2)(@babel/preset-env@7.23.9(@babel/core@7.25.2))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(utf-8-validate@5.0.10)) abort-controller: 3.0.0 anser: 1.4.10 ansi-regex: 5.0.1 base64-js: 1.5.1 chalk: 4.1.2 + deprecated-react-native-prop-types: 5.0.0 event-target-shim: 5.0.1 flow-enums-runtime: 0.0.6 invariant: 2.2.4 jest-environment-node: 29.7.0 jsc-android: 250231.0.0 memoize-one: 5.2.1 - metro-runtime: 0.80.9 - metro-source-map: 0.80.9 + metro-runtime: 0.80.6 + metro-source-map: 0.80.6 mkdirp: 0.5.6 nullthrows: 1.1.1 pretty-format: 26.6.2 promise: 8.3.0 - react: 18.3.1 - react-devtools-core: 5.2.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) - react-refresh: 0.14.2 - react-shallow-renderer: 16.15.0(react@18.3.1) + react: 18.2.0 + react-devtools-core: 4.28.5(bufferutil@4.0.8)(utf-8-validate@5.0.10) + react-refresh: 0.14.0 + react-shallow-renderer: 16.15.0(react@18.2.0) regenerator-runtime: 0.13.11 scheduler: 0.24.0-canary-efb381bbf-20230505 stacktrace-parser: 0.1.10 whatwg-fetch: 3.6.20 - ws: 6.2.2(bufferutil@4.0.8)(utf-8-validate@6.0.3) + ws: 6.2.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) yargs: 17.7.2 - optionalDependencies: - '@types/react': 18.3.2 transitivePeerDependencies: - '@babel/core' - '@babel/preset-env' @@ -23222,43 +27852,15 @@ snapshots: - supports-color - utf-8-validate - react-refresh@0.14.2: {} - - react-remove-scroll-bar@2.3.6(@types/react@18.3.2)(react@18.3.1): - dependencies: - react: 18.3.1 - react-style-singleton: 2.2.1(@types/react@18.3.2)(react@18.3.1) - tslib: 2.6.2 - optionalDependencies: - '@types/react': 18.3.2 - - react-remove-scroll@2.5.5(@types/react@18.3.2)(react@18.3.1): - dependencies: - react: 18.3.1 - react-remove-scroll-bar: 2.3.6(@types/react@18.3.2)(react@18.3.1) - react-style-singleton: 2.2.1(@types/react@18.3.2)(react@18.3.1) - tslib: 2.6.2 - use-callback-ref: 1.3.2(@types/react@18.3.2)(react@18.3.1) - use-sidecar: 1.1.2(@types/react@18.3.2)(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.2 + react-refresh@0.14.0: {} - react-shallow-renderer@16.15.0(react@18.3.1): + react-shallow-renderer@16.15.0(react@18.2.0): dependencies: object-assign: 4.1.1 - react: 18.3.1 - react-is: 18.3.1 - - react-style-singleton@2.2.1(@types/react@18.3.2)(react@18.3.1): - dependencies: - get-nonce: 1.0.1 - invariant: 2.2.4 - react: 18.3.1 - tslib: 2.6.2 - optionalDependencies: - '@types/react': 18.3.2 + react: 18.2.0 + react-is: 18.2.0 - react@18.3.1: + react@18.2.0: dependencies: loose-envify: 1.4.0 @@ -23266,18 +27868,26 @@ snapshots: dependencies: pify: 2.3.0 - read-pkg-up@7.0.1: + read-yaml-file@1.1.0: dependencies: - find-up: 4.1.0 - read-pkg: 5.2.0 - type-fest: 0.8.1 + graceful-fs: 4.2.11 + js-yaml: 3.14.1 + pify: 4.0.1 + strip-bom: 3.0.0 - read-pkg@5.2.0: + read@1.0.7: dependencies: - '@types/normalize-package-data': 2.4.4 - normalize-package-data: 2.5.0 - parse-json: 5.2.0 - type-fest: 0.6.0 + mute-stream: 0.0.8 + + readable-stream@2.3.3: + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 1.0.7 + safe-buffer: 5.1.2 + string_decoder: 1.0.3 + util-deprecate: 1.0.2 readable-stream@2.3.8: dependencies: @@ -23299,6 +27909,8 @@ snapshots: dependencies: picomatch: 2.3.1 + readdirp@4.0.1: {} + readline@1.3.0: {} real-require@0.1.0: {} @@ -23308,15 +27920,15 @@ snapshots: ast-types: 0.15.2 esprima: 4.0.1 source-map: 0.6.1 - tslib: 2.6.2 + tslib: 2.6.3 - recast@0.23.7: + recast@0.23.9: dependencies: ast-types: 0.16.1 esprima: 4.0.1 source-map: 0.6.1 tiny-invariant: 1.3.3 - tslib: 2.6.2 + tslib: 2.6.3 receptacle@1.3.2: dependencies: @@ -23327,6 +27939,12 @@ snapshots: indent-string: 4.0.0 strip-indent: 3.0.0 + redis-errors@1.2.0: {} + + redis-parser@3.0.0: + dependencies: + redis-errors: 1.2.0 + regenerate-unicode-properties@10.1.1: dependencies: regenerate: 1.4.2 @@ -23339,14 +27957,15 @@ snapshots: regenerator-transform@0.15.2: dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.23.9 + + regex@4.3.2: {} - regexp.prototype.flags@1.5.2: + regexp.prototype.flags@1.5.1: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-errors: 1.3.0 - set-function-name: 2.0.2 + set-function-name: 2.0.1 regexpp@3.2.0: {} @@ -23371,9 +27990,9 @@ snapshots: dependencies: jsesc: 0.5.0 - rehype-expressive-code@0.35.3: + rehype-expressive-code@0.35.6: dependencies: - expressive-code: 0.35.3 + expressive-code: 0.35.6 rehype-external-links@3.0.0: dependencies: @@ -23384,17 +28003,36 @@ snapshots: space-separated-tokens: 2.0.2 unist-util-visit: 5.0.0 + rehype-format@5.0.0: + dependencies: + '@types/hast': 3.0.4 + hast-util-embedded: 3.0.0 + hast-util-is-element: 3.0.0 + hast-util-phrasing: 3.0.1 + hast-util-whitespace: 3.0.0 + html-whitespace-sensitive-tag-names: 3.0.0 + rehype-minify-whitespace: 6.0.0 + unist-util-visit-parents: 6.0.1 + + rehype-minify-whitespace@6.0.0: + dependencies: + '@types/hast': 3.0.4 + hast-util-embedded: 3.0.0 + hast-util-is-element: 3.0.0 + hast-util-whitespace: 3.0.0 + unist-util-is: 6.0.0 + rehype-parse@9.0.0: dependencies: '@types/hast': 3.0.4 hast-util-from-html: 2.0.1 - unified: 11.0.4 + unified: 11.0.5 rehype-raw@7.0.0: dependencies: '@types/hast': 3.0.4 hast-util-raw: 9.0.3 - vfile: 6.0.1 + vfile: 6.0.3 rehype-slug@6.0.0: dependencies: @@ -23408,21 +28046,21 @@ snapshots: dependencies: '@types/hast': 3.0.4 hast-util-to-html: 9.0.1 - unified: 11.0.4 + unified: 11.0.5 rehype@13.0.1: dependencies: '@types/hast': 3.0.4 rehype-parse: 9.0.0 rehype-stringify: 10.0.0 - unified: 11.0.4 + unified: 11.0.5 remark-directive@3.0.0: dependencies: '@types/mdast': 4.0.4 mdast-util-directive: 3.0.0 micromark-extension-directive: 3.0.0 - unified: 11.0.4 + unified: 11.0.5 transitivePeerDependencies: - supports-color @@ -23433,7 +28071,7 @@ snapshots: micromark-extension-gfm: 3.0.0 remark-parse: 11.0.0 remark-stringify: 11.0.0 - unified: 11.0.4 + unified: 11.0.5 transitivePeerDependencies: - supports-color @@ -23447,9 +28085,9 @@ snapshots: remark-parse@11.0.0: dependencies: '@types/mdast': 4.0.4 - mdast-util-from-markdown: 2.0.0 + mdast-util-from-markdown: 2.0.1 micromark-util-types: 2.0.0 - unified: 11.0.4 + unified: 11.0.5 transitivePeerDependencies: - supports-color @@ -23458,23 +28096,56 @@ snapshots: '@types/hast': 3.0.4 '@types/mdast': 4.0.4 mdast-util-to-hast: 13.1.0 - unified: 11.0.4 - vfile: 6.0.1 + unified: 11.0.5 + vfile: 6.0.3 + + remark-smartypants@3.0.2: + dependencies: + retext: 9.0.0 + retext-smartypants: 6.1.1 + unified: 11.0.5 + unist-util-visit: 5.0.0 - remark-smartypants@2.1.0: + remark-smartypants@3.0.1: dependencies: - retext: 8.1.0 - retext-smartypants: 5.2.0 + retext: 9.0.0 + retext-smartypants: 6.1.0 + unified: 11.0.5 unist-util-visit: 5.0.0 remark-stringify@11.0.0: dependencies: '@types/mdast': 4.0.4 mdast-util-to-markdown: 2.1.0 - unified: 11.0.4 + unified: 11.0.5 + + request-light@0.5.8: {} request-light@0.7.0: {} + request@2.88.2: + dependencies: + aws-sign2: 0.7.0 + aws4: 1.13.2 + 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@2.0.2: {} @@ -23495,12 +28166,20 @@ snapshots: resolve-pkg-maps@1.0.0: {} + resolve@1.17.0: + dependencies: + path-parse: 1.0.7 + resolve@1.22.8: dependencies: - is-core-module: 2.13.1 + is-core-module: 2.14.0 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 + responselike@2.0.1: + dependencies: + lowercase-keys: 2.0.0 + responselike@3.0.0: dependencies: lowercase-keys: 3.0.0 @@ -23515,37 +28194,51 @@ snapshots: onetime: 5.1.2 signal-exit: 3.0.7 - retext-latin@3.1.0: + restore-cursor@5.1.0: + dependencies: + onetime: 7.0.0 + signal-exit: 4.1.0 + + retext-latin@4.0.0: dependencies: - '@types/nlcst': 1.0.4 - parse-latin: 5.0.1 - unherit: 3.0.1 - unified: 10.1.2 + '@types/nlcst': 2.0.3 + parse-latin: 7.0.0 + unified: 11.0.5 - retext-smartypants@5.2.0: + retext-smartypants@6.1.1: dependencies: - '@types/nlcst': 1.0.4 - nlcst-to-string: 3.1.1 - unified: 10.1.2 - unist-util-visit: 4.1.2 + '@types/nlcst': 2.0.3 + nlcst-to-string: 4.0.0 + unist-util-visit: 5.0.0 + + retext-stringify@4.0.0: + dependencies: + '@types/nlcst': 2.0.3 + nlcst-to-string: 4.0.0 + unified: 11.0.5 - retext-stringify@3.1.0: + retext@9.0.0: dependencies: - '@types/nlcst': 1.0.4 - nlcst-to-string: 3.1.1 - unified: 10.1.2 + '@types/nlcst': 2.0.3 + retext-latin: 4.0.0 + retext-stringify: 4.0.0 + unified: 11.0.5 - retext@8.1.0: + retext@9.0.0: dependencies: - '@types/nlcst': 1.0.4 - retext-latin: 3.1.0 - retext-stringify: 3.1.0 - unified: 10.1.2 + '@types/nlcst': 2.0.3 + retext-latin: 4.0.0 + retext-stringify: 4.0.0 + unified: 11.0.5 retimer@3.0.0: {} + retry@0.13.1: {} + reusify@1.0.4: {} + revalidator@0.1.8: {} + rimraf@2.6.3: dependencies: glob: 7.2.3 @@ -23558,52 +28251,103 @@ snapshots: dependencies: glob: 7.2.3 + rimraf@5.0.10: + dependencies: + glob: 10.3.10 + ripemd160@2.0.2: dependencies: hash-base: 3.1.0 inherits: 2.0.4 + risc0-ethereum#v1.1.2@https://codeload.github.com/risc0/risc0-ethereum/tar.gz/b8a14213d92fff07dacda993804e7edb7946ca58: {} + rlp@2.2.7: dependencies: bn.js: 5.2.1 - rollup-plugin-visualizer@5.12.0(rollup@4.17.2): + rollup-plugin-visualizer@5.12.0(rollup@4.21.3): dependencies: open: 8.4.2 picomatch: 2.3.1 source-map: 0.7.4 yargs: 17.7.2 optionalDependencies: - rollup: 4.17.2 + rollup: 4.21.3 rollup@3.29.4: optionalDependencies: fsevents: 2.3.3 + rollup@4.12.0: + dependencies: + '@types/estree': 1.0.5 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.12.0 + '@rollup/rollup-android-arm64': 4.12.0 + '@rollup/rollup-darwin-arm64': 4.12.0 + '@rollup/rollup-darwin-x64': 4.12.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.12.0 + '@rollup/rollup-linux-arm64-gnu': 4.12.0 + '@rollup/rollup-linux-arm64-musl': 4.12.0 + '@rollup/rollup-linux-riscv64-gnu': 4.12.0 + '@rollup/rollup-linux-x64-gnu': 4.12.0 + '@rollup/rollup-linux-x64-musl': 4.12.0 + '@rollup/rollup-win32-arm64-msvc': 4.12.0 + '@rollup/rollup-win32-ia32-msvc': 4.12.0 + '@rollup/rollup-win32-x64-msvc': 4.12.0 + fsevents: 2.3.3 + rollup@4.17.2: dependencies: '@types/estree': 1.0.5 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.17.2 - '@rollup/rollup-android-arm64': 4.17.2 - '@rollup/rollup-darwin-arm64': 4.17.2 - '@rollup/rollup-darwin-x64': 4.17.2 - '@rollup/rollup-linux-arm-gnueabihf': 4.17.2 - '@rollup/rollup-linux-arm-musleabihf': 4.17.2 - '@rollup/rollup-linux-arm64-gnu': 4.17.2 - '@rollup/rollup-linux-arm64-musl': 4.17.2 - '@rollup/rollup-linux-powerpc64le-gnu': 4.17.2 - '@rollup/rollup-linux-riscv64-gnu': 4.17.2 - '@rollup/rollup-linux-s390x-gnu': 4.17.2 - '@rollup/rollup-linux-x64-gnu': 4.17.2 - '@rollup/rollup-linux-x64-musl': 4.17.2 - '@rollup/rollup-win32-arm64-msvc': 4.17.2 - '@rollup/rollup-win32-ia32-msvc': 4.17.2 - '@rollup/rollup-win32-x64-msvc': 4.17.2 + '@rollup/rollup-android-arm-eabi': 4.18.0 + '@rollup/rollup-android-arm64': 4.18.0 + '@rollup/rollup-darwin-arm64': 4.18.0 + '@rollup/rollup-darwin-x64': 4.18.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.18.0 + '@rollup/rollup-linux-arm-musleabihf': 4.18.0 + '@rollup/rollup-linux-arm64-gnu': 4.18.0 + '@rollup/rollup-linux-arm64-musl': 4.18.0 + '@rollup/rollup-linux-powerpc64le-gnu': 4.18.0 + '@rollup/rollup-linux-riscv64-gnu': 4.18.0 + '@rollup/rollup-linux-s390x-gnu': 4.18.0 + '@rollup/rollup-linux-x64-gnu': 4.18.0 + '@rollup/rollup-linux-x64-musl': 4.18.0 + '@rollup/rollup-win32-arm64-msvc': 4.18.0 + '@rollup/rollup-win32-ia32-msvc': 4.18.0 + '@rollup/rollup-win32-x64-msvc': 4.18.0 + fsevents: 2.3.3 + + rollup@4.21.3: + dependencies: + '@types/estree': 1.0.5 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.21.3 + '@rollup/rollup-android-arm64': 4.21.3 + '@rollup/rollup-darwin-arm64': 4.21.3 + '@rollup/rollup-darwin-x64': 4.21.3 + '@rollup/rollup-linux-arm-gnueabihf': 4.21.3 + '@rollup/rollup-linux-arm-musleabihf': 4.21.3 + '@rollup/rollup-linux-arm64-gnu': 4.21.3 + '@rollup/rollup-linux-arm64-musl': 4.21.3 + '@rollup/rollup-linux-powerpc64le-gnu': 4.21.3 + '@rollup/rollup-linux-riscv64-gnu': 4.21.3 + '@rollup/rollup-linux-s390x-gnu': 4.21.3 + '@rollup/rollup-linux-x64-gnu': 4.21.3 + '@rollup/rollup-linux-x64-musl': 4.21.3 + '@rollup/rollup-win32-arm64-msvc': 4.21.3 + '@rollup/rollup-win32-ia32-msvc': 4.21.3 + '@rollup/rollup-win32-x64-msvc': 4.21.3 fsevents: 2.3.3 rrweb-cssom@0.6.0: {} + run-applescript@5.0.0: + dependencies: + execa: 5.1.1 + run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 @@ -23612,7 +28356,7 @@ snapshots: dependencies: mri: 1.2.0 - safe-array-concat@1.1.2: + safe-array-concat@1.0.1: dependencies: call-bind: 1.0.7 get-intrinsic: 1.2.4 @@ -23623,10 +28367,10 @@ snapshots: safe-buffer@5.2.1: {} - safe-regex-test@1.0.3: + safe-regex-test@1.0.0: dependencies: call-bind: 1.0.7 - es-errors: 1.3.0 + get-intrinsic: 1.2.4 is-regex: 1.1.4 safe-stable-stringify@2.4.3: {} @@ -23640,13 +28384,13 @@ snapshots: mkdirp: 0.5.6 rimraf: 2.7.1 - sax@1.3.0: {} + sax@1.4.1: {} saxes@6.0.0: dependencies: xmlchars: 2.2.0 - scheduler@0.23.2: + scheduler@0.23.0: dependencies: loose-envify: 1.4.0 @@ -23658,35 +28402,34 @@ snapshots: secp256k1@4.0.3: dependencies: - elliptic: 6.5.5 + elliptic: 6.5.7 node-addon-api: 2.0.2 - node-gyp-build: 4.8.1 + node-gyp-build: 4.8.0 secp256k1@5.0.0: dependencies: - elliptic: 6.5.5 + elliptic: 6.5.4 node-addon-api: 5.1.0 - node-gyp-build: 4.8.1 + node-gyp-build: 4.8.0 section-matter@1.0.0: dependencies: extend-shallow: 2.0.1 kind-of: 6.0.3 - selfsigned@2.4.1: - dependencies: - '@types/node-forge': 1.3.11 - node-forge: 1.3.1 - semver@5.7.2: {} semver@6.3.1: {} - semver@7.6.1: {} + semver@7.6.0: + dependencies: + lru-cache: 6.0.0 semver@7.6.2: {} - send@0.18.0: + semver@7.6.3: {} + + send@0.19.0: dependencies: debug: 2.6.9 depd: 2.0.0 @@ -23704,20 +28447,37 @@ snapshots: transitivePeerDependencies: - supports-color - sentence-case@3.0.4: - dependencies: - no-case: 3.0.4 - tslib: 2.6.2 - upper-case-first: 2.0.2 - serialize-error@2.1.0: {} - serve-static@1.15.0: + serialize-javascript@6.0.2: dependencies: - encodeurl: 1.0.2 + randombytes: 2.1.0 + + serve-static@1.16.2: + dependencies: + encodeurl: 2.0.0 escape-html: 1.0.3 parseurl: 1.3.3 - send: 0.18.0 + send: 0.19.0 + transitivePeerDependencies: + - supports-color + + serverless@4.4.3: + dependencies: + axios: 1.7.7 + axios-proxy-builder: 0.1.2 + rimraf: 5.0.10 + xml2js: 0.6.2 + transitivePeerDependencies: + - debug + + servify@0.1.12: + dependencies: + body-parser: 1.20.3 + cors: 2.8.5 + express: 4.21.0 + request: 2.88.2 + xhr: 2.6.0 transitivePeerDependencies: - supports-color @@ -23725,7 +28485,7 @@ snapshots: set-cookie-parser@2.6.0: {} - set-function-length@1.2.2: + set-function-length@1.2.1: dependencies: define-data-property: 1.1.4 es-errors: 1.3.0 @@ -23734,10 +28494,9 @@ snapshots: gopd: 1.0.1 has-property-descriptors: 1.0.2 - set-function-name@2.0.2: + set-function-name@2.0.1: dependencies: define-data-property: 1.1.4 - es-errors: 1.3.0 functions-have-names: 1.2.3 has-property-descriptors: 1.0.2 @@ -23754,14 +28513,14 @@ snapshots: dependencies: kind-of: 6.0.3 - sharp@0.33.3: + sharp@0.33.4: dependencies: color: 4.2.3 detect-libc: 2.0.3 - semver: 7.6.1 + semver: 7.6.0 optionalDependencies: - '@img/sharp-darwin-arm64': 0.33.3 - '@img/sharp-darwin-x64': 0.33.3 + '@img/sharp-darwin-arm64': 0.33.4 + '@img/sharp-darwin-x64': 0.33.4 '@img/sharp-libvips-darwin-arm64': 1.0.2 '@img/sharp-libvips-darwin-x64': 1.0.2 '@img/sharp-libvips-linux-arm': 1.0.2 @@ -23770,34 +28529,55 @@ snapshots: '@img/sharp-libvips-linux-x64': 1.0.2 '@img/sharp-libvips-linuxmusl-arm64': 1.0.2 '@img/sharp-libvips-linuxmusl-x64': 1.0.2 - '@img/sharp-linux-arm': 0.33.3 - '@img/sharp-linux-arm64': 0.33.3 - '@img/sharp-linux-s390x': 0.33.3 - '@img/sharp-linux-x64': 0.33.3 - '@img/sharp-linuxmusl-arm64': 0.33.3 - '@img/sharp-linuxmusl-x64': 0.33.3 - '@img/sharp-wasm32': 0.33.3 - '@img/sharp-win32-ia32': 0.33.3 - '@img/sharp-win32-x64': 0.33.3 + '@img/sharp-linux-arm': 0.33.4 + '@img/sharp-linux-arm64': 0.33.4 + '@img/sharp-linux-s390x': 0.33.4 + '@img/sharp-linux-x64': 0.33.4 + '@img/sharp-linuxmusl-arm64': 0.33.4 + '@img/sharp-linuxmusl-x64': 0.33.4 + '@img/sharp-wasm32': 0.33.4 + '@img/sharp-win32-ia32': 0.33.4 + '@img/sharp-win32-x64': 0.33.4 + + 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: {} shell-quote@1.8.1: {} - shiki@1.5.1: + shiki@1.17.6: dependencies: - '@shikijs/core': 1.5.1 + '@shikijs/core': 1.17.6 + '@shikijs/engine-javascript': 1.17.6 + '@shikijs/engine-oniguruma': 1.17.6 + '@shikijs/types': 1.17.6 + '@shikijs/vscode-textmate': 9.2.2 + '@types/hast': 3.0.4 + + shiki@1.5.2: + dependencies: + '@shikijs/core': 1.5.2 + + side-channel@1.0.4: + dependencies: + call-bind: 1.0.7 + get-intrinsic: 1.2.4 + object-inspect: 1.13.1 side-channel@1.0.6: dependencies: call-bind: 1.0.7 es-errors: 1.3.0 get-intrinsic: 1.2.4 - object-inspect: 1.13.1 + object-inspect: 1.13.2 siginfo@2.0.0: {} @@ -23805,31 +28585,37 @@ snapshots: signal-exit@4.1.0: {} + simple-concat@1.0.1: {} + + simple-get@2.8.2: + dependencies: + decompress-response: 3.3.0 + once: 1.4.0 + simple-concat: 1.0.1 + simple-swizzle@0.2.2: dependencies: is-arrayish: 0.3.2 sirv@2.0.4: dependencies: - '@polka/url': 1.0.0-next.25 + '@polka/url': 1.0.0-next.24 mrmime: 2.0.0 totalist: 3.0.1 sisteransi@1.0.5: {} - sitemap@7.1.1: + sitemap@7.1.2: dependencies: '@types/node': 17.0.45 '@types/sax': 1.2.7 arg: 5.0.2 - sax: 1.3.0 + sax: 1.4.1 slash@3.0.0: {} slash@4.0.0: {} - slash@5.1.0: {} - slice-ansi@2.1.0: dependencies: ansi-styles: 3.2.1 @@ -23847,10 +28633,21 @@ snapshots: dot-case: 3.0.4 tslib: 2.6.2 - socket.io-client@4.7.5(bufferutil@4.0.8)(utf-8-validate@6.0.3): + socket.io-client@4.7.4(bufferutil@4.0.8)(utf-8-validate@5.0.10): dependencies: - '@socket.io/component-emitter': 3.1.2 - debug: 4.3.4 + '@socket.io/component-emitter': 3.1.0 + debug: 4.3.7(supports-color@8.1.1) + engine.io-client: 6.5.3(bufferutil@4.0.8)(utf-8-validate@5.0.10) + socket.io-parser: 4.2.4 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + socket.io-client@4.7.4(bufferutil@4.0.8)(utf-8-validate@6.0.3): + dependencies: + '@socket.io/component-emitter': 3.1.0 + debug: 4.3.7(supports-color@8.1.1) engine.io-client: 6.5.3(bufferutil@4.0.8)(utf-8-validate@6.0.3) socket.io-parser: 4.2.4 transitivePeerDependencies: @@ -23860,34 +28657,73 @@ snapshots: socket.io-parser@4.2.4: dependencies: - '@socket.io/component-emitter': 3.1.2 - debug: 4.3.4 + '@socket.io/component-emitter': 3.1.0 + debug: 4.3.7(supports-color@8.1.1) transitivePeerDependencies: - supports-color + solady@https://codeload.github.com/Vectorized/solady/tar.gz/a12a2575c899a328c1bafdada632dabbff27cf6b: {} + solady@https://codeload.github.com/Vectorized/solady/tar.gz/de0f336d2033d04e0f77c923d639c7fbffd48b6d: {} solc@0.8.24: dependencies: command-exists: 1.2.9 commander: 8.3.0 - follow-redirects: 1.15.6(debug@4.3.4) + 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 + + solc@0.8.26(debug@4.3.7): + dependencies: + command-exists: 1.2.9 + commander: 8.3.0 + follow-redirects: 1.15.9(debug@4.3.7) js-sha3: 0.8.0 memorystream: 0.3.1 semver: 5.7.2 tmp: 0.0.33 transitivePeerDependencies: - - debug + - debug + + solhint@4.5.4(typescript@5.4.3): + dependencies: + '@solidity-parser/parser': 0.18.0 + ajv: 6.12.6 + antlr4: 4.13.1 + ast-parents: 0.0.1 + chalk: 4.1.2 + commander: 10.0.1 + cosmiconfig: 8.3.6(typescript@5.4.3) + fast-diff: 1.3.0 + glob: 8.1.0 + ignore: 5.3.1 + js-yaml: 4.1.0 + latest-version: 7.0.0 + lodash: 4.17.21 + pluralize: 8.0.0 + semver: 7.6.0 + strip-ansi: 6.0.1 + table: 6.8.1 + text-table: 0.2.0 + optionalDependencies: + prettier: 2.8.8 + transitivePeerDependencies: + - typescript solhint@4.5.4(typescript@5.4.5): dependencies: '@solidity-parser/parser': 0.18.0 ajv: 6.12.6 - antlr4: 4.13.1-patch-1 + antlr4: 4.13.1 ast-parents: 0.0.1 chalk: 4.1.2 commander: 10.0.1 - cosmiconfig: 8.3.6(typescript@5.4.5) + cosmiconfig: 8.3.6(typescript@5.5.3) fast-diff: 1.3.0 glob: 8.1.0 ignore: 5.3.1 @@ -23895,24 +28731,24 @@ snapshots: latest-version: 7.0.0 lodash: 4.17.21 pluralize: 8.0.0 - semver: 7.6.2 + semver: 7.6.0 strip-ansi: 6.0.1 - table: 6.8.2 + table: 6.8.1 text-table: 0.2.0 optionalDependencies: prettier: 2.8.8 transitivePeerDependencies: - typescript - solhint@5.0.1(typescript@5.4.5): + solhint@5.0.3(typescript@5.4.3): dependencies: '@solidity-parser/parser': 0.18.0 ajv: 6.12.6 - antlr4: 4.13.1-patch-1 + antlr4: 4.13.1 ast-parents: 0.0.1 chalk: 4.1.2 commander: 10.0.1 - cosmiconfig: 8.3.6(typescript@5.4.5) + cosmiconfig: 8.3.6(typescript@5.4.3) fast-diff: 1.3.0 glob: 8.1.0 ignore: 5.3.1 @@ -23922,28 +28758,38 @@ snapshots: pluralize: 8.0.0 semver: 7.6.2 strip-ansi: 6.0.1 - table: 6.8.2 + table: 6.8.1 text-table: 0.2.0 optionalDependencies: prettier: 2.8.8 transitivePeerDependencies: - typescript + solidity-ast@0.4.59: {} + + solidity-docgen@0.6.0-beta.36(hardhat@2.22.13(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.3))(typescript@5.4.3)(utf-8-validate@5.0.10)): + dependencies: + handlebars: 4.7.8 + hardhat: 2.22.13(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.3))(typescript@5.4.3)(utf-8-validate@5.0.10) + solidity-ast: 0.4.59 + solidity-stringutils@https://codeload.github.com/Arachnid/solidity-stringutils/tar.gz/4b2fcc43fa0426e19ce88b1f1ec16f5903a2e461: {} sonic-boom@2.8.0: dependencies: atomic-sleep: 1.0.0 - sorcery@0.11.0: + sorcery@0.11.1: dependencies: '@jridgewell/sourcemap-codec': 1.4.15 - buffer-crc32: 0.2.13 + buffer-crc32: 1.0.0 minimist: 1.2.8 sander: 0.5.1 source-map-js@1.2.0: {} + source-map-js@1.2.1: {} + source-map-support@0.5.21: dependencies: buffer-from: 1.1.2 @@ -23955,21 +28801,14 @@ snapshots: source-map@0.7.4: {} - space-separated-tokens@2.0.2: {} - - spdx-correct@3.2.0: - dependencies: - spdx-expression-parse: 3.0.1 - spdx-license-ids: 3.0.17 + sp1-contracts#v3.0.0@https://codeload.github.com/succinctlabs/sp1-contracts/tar.gz/1c4acaeab86789995ae5c6baced66f81e4a57f4d: {} - spdx-exceptions@2.5.0: {} + space-separated-tokens@2.0.2: {} - spdx-expression-parse@3.0.1: + spawndamnit@2.0.0: dependencies: - spdx-exceptions: 2.5.0 - spdx-license-ids: 3.0.17 - - spdx-license-ids@3.0.17: {} + cross-spawn: 5.1.0 + signal-exit: 3.0.7 split-on-first@1.1.0: {} @@ -23977,6 +28816,20 @@ snapshots: sprintf-js@1.0.3: {} + sshpk@1.18.0: + 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 + + stack-trace@0.0.10: {} + stack-utils@2.0.6: dependencies: escape-string-regexp: 2.0.0 @@ -23989,10 +28842,12 @@ snapshots: dependencies: type-fest: 0.7.1 - starlight-links-validator@0.8.0(@astrojs/starlight@0.22.2(astro@4.8.3(@types/node@20.12.11)(terser@5.31.0)(typescript@5.4.5)))(astro@4.8.3(@types/node@20.12.11)(terser@5.31.0)(typescript@5.4.5)): + standard-as-callback@2.1.0: {} + + starlight-links-validator@0.8.0(@astrojs/starlight@0.25.5(astro@4.15.6(@types/node@20.12.7)(rollup@4.21.3)(terser@5.27.2)(typescript@5.4.5)))(astro@4.15.6(@types/node@20.12.7)(rollup@4.21.3)(terser@5.27.2)(typescript@5.4.5)): dependencies: - '@astrojs/starlight': 0.22.2(astro@4.8.3(@types/node@20.12.11)(terser@5.31.0)(typescript@5.4.5)) - astro: 4.8.3(@types/node@20.12.11)(terser@5.31.0)(typescript@5.4.5) + '@astrojs/starlight': 0.25.5(astro@4.15.6(@types/node@20.12.7)(rollup@4.21.3)(terser@5.27.2)(typescript@5.4.5)) + astro: 4.15.6(@types/node@20.12.7)(rollup@4.21.3)(terser@5.27.2)(typescript@5.4.5) github-slugger: 2.0.0 hast-util-from-html: 2.0.1 hast-util-has-property: 3.0.0 @@ -24001,12 +28856,12 @@ snapshots: mdast-util-to-string: 4.0.0 unist-util-visit: 5.0.0 - starlight-openapi@0.6.3(@astrojs/markdown-remark@5.1.0)(@astrojs/starlight@0.22.2(astro@4.8.3(@types/node@20.12.11)(terser@5.31.0)(typescript@5.4.5)))(astro@4.8.3(@types/node@20.12.11)(terser@5.31.0)(typescript@5.4.5))(openapi-types@12.1.3): + starlight-openapi@0.6.3(@astrojs/markdown-remark@5.2.0)(@astrojs/starlight@0.25.5(astro@4.15.6(@types/node@20.12.7)(rollup@4.21.3)(terser@5.27.2)(typescript@5.4.5)))(astro@4.15.6(@types/node@20.12.7)(rollup@4.21.3)(terser@5.27.2)(typescript@5.4.5))(openapi-types@12.1.3): dependencies: - '@astrojs/markdown-remark': 5.1.0 - '@astrojs/starlight': 0.22.2(astro@4.8.3(@types/node@20.12.11)(terser@5.31.0)(typescript@5.4.5)) + '@astrojs/markdown-remark': 5.2.0 + '@astrojs/starlight': 0.25.5(astro@4.15.6(@types/node@20.12.7)(rollup@4.21.3)(terser@5.27.2)(typescript@5.4.5)) '@readme/openapi-parser': 2.5.0(openapi-types@12.1.3) - astro: 4.8.3(@types/node@20.12.11)(terser@5.31.0)(typescript@5.4.5) + astro: 4.15.6(@types/node@20.12.7)(rollup@4.21.3)(terser@5.27.2)(typescript@5.4.5) github-slugger: 2.0.0 transitivePeerDependencies: - openapi-types @@ -24023,21 +28878,11 @@ snapshots: stdin-discarder@0.2.2: {} - stop-iteration-iterator@1.0.0: - dependencies: - internal-slot: 1.0.7 - - store2@2.14.3: {} - - storybook@8.1.1(@babel/preset-env@7.24.5(@babel/core@7.24.5))(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(utf-8-validate@6.0.3): + storybook@8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3): dependencies: - '@storybook/cli': 8.1.1(@babel/preset-env@7.24.5(@babel/core@7.24.5))(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(utf-8-validate@6.0.3) + '@storybook/core': 8.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) transitivePeerDependencies: - - '@babel/preset-env' - bufferutil - - encoding - - react - - react-dom - supports-color - utf-8-validate @@ -24048,12 +28893,14 @@ snapshots: stream-replace-string@2.0.0: {} - stream-shift@1.0.3: {} + stream-shift@1.0.1: {} stream-to-it@0.2.4: dependencies: get-iterator: 1.0.2 + strict-uri-encode@1.1.0: {} + strict-uri-encode@2.0.0: {} string-width@4.2.3: @@ -24068,30 +28915,33 @@ snapshots: emoji-regex: 9.2.2 strip-ansi: 7.1.0 - string-width@7.1.0: + string-width@7.2.0: dependencies: emoji-regex: 10.3.0 get-east-asian-width: 1.2.0 strip-ansi: 7.1.0 - string.prototype.trim@1.2.9: + string.prototype.trim@1.2.8: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.23.3 - es-object-atoms: 1.0.0 + es-abstract: 1.22.3 - string.prototype.trimend@1.0.8: + string.prototype.trimend@1.0.7: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-object-atoms: 1.0.0 + es-abstract: 1.22.3 - string.prototype.trimstart@1.0.8: + string.prototype.trimstart@1.0.7: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-object-atoms: 1.0.0 + es-abstract: 1.22.3 + + string_decoder@1.0.3: + dependencies: + safe-buffer: 5.1.2 string_decoder@1.1.1: dependencies: @@ -24138,9 +28988,9 @@ snapshots: strip-json-comments@3.1.1: {} - strip-literal@2.1.0: + strip-literal@2.0.0: dependencies: - js-tokens: 9.0.0 + js-tokens: 8.0.3 strnum@1.0.5: {} @@ -24152,11 +29002,13 @@ snapshots: dependencies: inline-style-parser: 0.2.3 + stylis@4.2.0: {} + sucrase@3.35.0: dependencies: - '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/gen-mapping': 0.3.3 commander: 4.1.1 - glob: 10.3.12 + glob: 10.3.10 lines-and-columns: 1.2.4 mz: 2.7.0 pirates: 4.0.6 @@ -24164,7 +29016,7 @@ snapshots: sudo-prompt@9.2.1: {} - superstruct@1.0.4: {} + superstruct@1.0.3: {} supports-color@5.5.0: dependencies: @@ -24180,7 +29032,71 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} - svelte-check@3.7.1(@babel/core@7.24.5)(postcss-load-config@4.0.2(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.12.11)(typescript@5.4.5)))(postcss@8.4.38)(svelte@4.2.16): + svelte-check@3.7.1(@babel/core@7.25.2)(postcss-load-config@4.0.2(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.3)))(postcss@8.4.38)(svelte@4.2.13): + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + chokidar: 3.6.0 + picocolors: 1.0.1 + sade: 1.8.1 + svelte: 4.2.13 + svelte-preprocess: 5.1.3(@babel/core@7.25.2)(postcss-load-config@4.0.2(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.3)))(postcss@8.4.38)(svelte@4.2.13)(typescript@5.4.5) + typescript: 5.4.5 + transitivePeerDependencies: + - '@babel/core' + - coffeescript + - less + - postcss + - postcss-load-config + - pug + - sass + - stylus + - sugarss + + svelte-check@3.7.1(@babel/core@7.25.2)(postcss-load-config@4.0.2(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.3)))(postcss@8.4.38)(svelte@4.2.17): + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + chokidar: 3.6.0 + fast-glob: 3.3.2 + import-fresh: 3.3.0 + picocolors: 1.0.0 + sade: 1.8.1 + svelte: 4.2.17 + svelte-preprocess: 5.1.3(@babel/core@7.25.2)(postcss-load-config@4.0.2(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.3)))(postcss@8.4.38)(svelte@4.2.17)(typescript@5.4.5) + typescript: 5.4.5 + transitivePeerDependencies: + - '@babel/core' + - coffeescript + - less + - postcss + - postcss-load-config + - pug + - sass + - stylus + - sugarss + + svelte-check@3.7.1(@babel/core@7.25.2)(postcss-load-config@4.0.2(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.5)))(postcss@8.4.38)(svelte@4.2.17): + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + chokidar: 3.6.0 + fast-glob: 3.3.2 + import-fresh: 3.3.0 + picocolors: 1.0.0 + sade: 1.8.1 + svelte: 4.2.17 + svelte-preprocess: 5.1.3(@babel/core@7.25.2)(postcss-load-config@4.0.2(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.5)))(postcss@8.4.38)(svelte@4.2.17)(typescript@5.4.5) + typescript: 5.4.5 + transitivePeerDependencies: + - '@babel/core' + - coffeescript + - less + - postcss + - postcss-load-config + - pug + - sass + - stylus + - sugarss + + svelte-check@3.7.1(@babel/core@7.25.2)(postcss-load-config@4.0.2(postcss@8.4.47)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.5)))(postcss@8.4.47)(svelte@4.2.17): dependencies: '@jridgewell/trace-mapping': 0.3.25 chokidar: 3.6.0 @@ -24188,8 +29104,8 @@ snapshots: import-fresh: 3.3.0 picocolors: 1.0.0 sade: 1.8.1 - svelte: 4.2.16 - svelte-preprocess: 5.1.4(@babel/core@7.24.5)(postcss-load-config@4.0.2(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.12.11)(typescript@5.4.5)))(postcss@8.4.38)(svelte@4.2.16)(typescript@5.4.5) + svelte: 4.2.17 + svelte-preprocess: 5.1.3(@babel/core@7.25.2)(postcss-load-config@4.0.2(postcss@8.4.47)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.5)))(postcss@8.4.47)(svelte@4.2.17)(typescript@5.4.5) typescript: 5.4.5 transitivePeerDependencies: - '@babel/core' @@ -24202,11 +29118,25 @@ snapshots: - stylus - sugarss - svelte-copy@1.4.2(svelte@4.2.16): + svelte-copy@1.4.2(svelte@4.2.13): + dependencies: + svelte: 4.2.13 + + svelte-copy@1.4.2(svelte@4.2.17): + dependencies: + svelte: 4.2.17 + + svelte-eslint-parser@0.35.0(svelte@4.2.13): dependencies: - svelte: 4.2.16 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + postcss: 8.4.38 + postcss-scss: 4.0.9(postcss@8.4.38) + optionalDependencies: + svelte: 4.2.13 - svelte-eslint-parser@0.36.0(svelte@4.2.16): + svelte-eslint-parser@0.35.0(svelte@4.2.17): dependencies: eslint-scope: 7.2.2 eslint-visitor-keys: 3.4.3 @@ -24214,51 +29144,130 @@ snapshots: postcss: 8.4.38 postcss-scss: 4.0.9(postcss@8.4.38) optionalDependencies: - svelte: 4.2.16 + svelte: 4.2.17 + + svelte-hmr@0.16.0(svelte@4.2.13): + dependencies: + svelte: 4.2.13 + + svelte-hmr@0.16.0(svelte@4.2.17): + dependencies: + svelte: 4.2.17 - svelte-hmr@0.16.0(svelte@4.2.16): + svelte-i18n@4.0.0(svelte@4.2.13): dependencies: - svelte: 4.2.16 + cli-color: 2.0.3 + deepmerge: 4.3.1 + esbuild: 0.19.12 + estree-walker: 2.0.2 + intl-messageformat: 10.5.11 + sade: 1.8.1 + svelte: 4.2.13 + tiny-glob: 0.2.9 - svelte-i18n@4.0.0(svelte@4.2.16): + svelte-i18n@4.0.0(svelte@4.2.17): dependencies: - cli-color: 2.0.4 + cli-color: 2.0.3 deepmerge: 4.3.1 esbuild: 0.19.12 estree-walker: 2.0.2 - intl-messageformat: 10.5.12 + intl-messageformat: 10.5.11 sade: 1.8.1 - svelte: 4.2.16 + svelte: 4.2.17 tiny-glob: 0.2.9 - svelte-preprocess@5.1.4(@babel/core@7.24.5)(postcss-load-config@4.0.2(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.12.11)(typescript@5.4.5)))(postcss@8.4.38)(svelte@4.2.16)(typescript@5.4.5): + svelte-preprocess@5.1.3(@babel/core@7.25.2)(postcss-load-config@4.0.2(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.3)))(postcss@8.4.38)(svelte@4.2.13)(typescript@5.4.5): dependencies: + '@babel/core': 7.24.7 '@types/pug': 2.0.10 detect-indent: 6.1.0 - magic-string: 0.30.10 + magic-string: 0.30.9 + sorcery: 0.11.0 + strip-indent: 3.0.0 + svelte: 4.2.13 + optionalDependencies: + '@babel/core': 7.25.2 + postcss: 8.4.38 + postcss-load-config: 4.0.2(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.3)) + typescript: 5.4.5 + + svelte-preprocess@5.1.3(@babel/core@7.25.2)(postcss-load-config@4.0.2(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.3)))(postcss@8.4.38)(svelte@4.2.17)(typescript@5.4.5): + dependencies: + '@types/pug': 2.0.10 + detect-indent: 6.1.0 + magic-string: 0.30.9 + sorcery: 0.11.0 + strip-indent: 3.0.0 + svelte: 4.2.17 + optionalDependencies: + '@babel/core': 7.25.2 + postcss: 8.4.38 + postcss-load-config: 4.0.2(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.3)) + typescript: 5.4.5 + + svelte-preprocess@5.1.3(@babel/core@7.25.2)(postcss-load-config@4.0.2(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.5)))(postcss@8.4.38)(svelte@4.2.17)(typescript@5.4.5): + dependencies: + '@types/pug': 2.0.10 + detect-indent: 6.1.0 + magic-string: 0.30.9 sorcery: 0.11.0 strip-indent: 3.0.0 - svelte: 4.2.16 + svelte: 4.2.17 optionalDependencies: - '@babel/core': 7.24.5 + '@babel/core': 7.25.2 postcss: 8.4.38 - postcss-load-config: 4.0.2(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.12.11)(typescript@5.4.5)) + postcss-load-config: 4.0.2(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.5)) + typescript: 5.4.5 + + svelte-preprocess@5.1.3(@babel/core@7.25.2)(postcss-load-config@4.0.2(postcss@8.4.47)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.5)))(postcss@8.4.47)(svelte@4.2.17)(typescript@5.4.5): + dependencies: + '@types/pug': 2.0.10 + detect-indent: 6.1.0 + magic-string: 0.30.9 + sorcery: 0.11.0 + strip-indent: 3.0.0 + svelte: 4.2.17 + optionalDependencies: + '@babel/core': 7.25.2 + postcss: 8.4.47 + postcss-load-config: 4.0.2(postcss@8.4.47)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.5)) typescript: 5.4.5 - svelte-scrolling@1.4.0(svelte@4.2.16): + svelte-scrolling@1.4.0(svelte@4.2.13): + dependencies: + svelte: 4.2.13 + + svelte-scrolling@1.4.0(svelte@4.2.17): dependencies: - svelte: 4.2.16 + svelte: 4.2.17 - svelte2tsx@0.7.8(svelte@4.2.16)(typescript@5.4.5): + svelte2tsx@0.7.19(svelte@4.2.17)(typescript@5.4.5): dependencies: dedent-js: 1.0.1 pascal-case: 3.1.2 - svelte: 4.2.16 + svelte: 4.2.17 typescript: 5.4.5 - svelte@4.2.16: + svelte@4.2.13: + dependencies: + '@ampproject/remapping': 2.2.1 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.25 + '@types/estree': 1.0.5 + acorn: 8.12.0 + aria-query: 5.3.0 + axobject-query: 4.0.0 + code-red: 1.0.4 + css-tree: 2.3.1 + estree-walker: 3.0.3 + is-reference: 3.0.2 + locate-character: 3.0.0 + magic-string: 0.30.9 + periscopic: 3.1.0 + + svelte@4.2.17: dependencies: - '@ampproject/remapping': 2.3.0 + '@ampproject/remapping': 2.2.1 '@jridgewell/sourcemap-codec': 1.4.15 '@jridgewell/trace-mapping': 0.3.25 '@types/estree': 1.0.5 @@ -24270,7 +29279,7 @@ snapshots: estree-walker: 3.0.3 is-reference: 3.0.2 locate-character: 3.0.0 - magic-string: 0.30.10 + magic-string: 0.30.9 periscopic: 3.1.0 sveltedoc-parser@4.2.1: @@ -24281,18 +29290,36 @@ snapshots: transitivePeerDependencies: - supports-color + swarm-js@0.1.42(bufferutil@4.0.8)(utf-8-validate@5.0.10): + dependencies: + bluebird: 3.7.2 + buffer: 5.7.1 + eth-lib: 0.1.29(bufferutil@4.0.8)(utf-8-validate@5.0.10) + fs-extra: 4.0.3 + got: 11.8.6 + mime-types: 2.1.35 + mkdirp-promise: 5.0.1 + mock-fs: 4.14.0 + setimmediate: 1.0.5 + tar: 4.4.19 + xhr-request: 1.1.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + symbol-tree@3.2.4: {} - synckit@0.8.8: + synckit@0.8.6: dependencies: - '@pkgr/core': 0.1.1 + '@pkgr/utils': 2.4.2 tslib: 2.6.2 system-architecture@0.1.0: {} - table@6.8.2: + table@6.8.1: dependencies: - ajv: 8.13.0 + ajv: 8.12.0 lodash.truncate: 4.4.2 slice-ansi: 4.0.0 string-width: 4.2.3 @@ -24303,7 +29330,34 @@ snapshots: flat: 4.1.1 lodash: 4.17.21 - tailwindcss@3.4.3(ts-node@10.9.2(@types/node@20.12.11)(typescript@5.4.5)): + tailwindcss@3.4.3(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.3)): + dependencies: + '@alloc/quick-lru': 5.2.0 + arg: 5.0.2 + chokidar: 3.6.0 + didyoumean: 1.2.2 + dlv: 1.1.3 + fast-glob: 3.3.2 + glob-parent: 6.0.2 + is-glob: 4.0.3 + jiti: 1.21.6 + lilconfig: 2.1.0 + micromatch: 4.0.7 + normalize-path: 3.0.0 + object-hash: 3.0.0 + picocolors: 1.0.0 + postcss: 8.4.38 + postcss-import: 15.1.0(postcss@8.4.38) + postcss-js: 4.0.1(postcss@8.4.38) + postcss-load-config: 4.0.2(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.3)) + postcss-nested: 6.0.1(postcss@8.4.38) + postcss-selector-parser: 6.0.15 + resolve: 1.22.8 + sucrase: 3.35.0 + transitivePeerDependencies: + - ts-node + + tailwindcss@3.4.3(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.5)): dependencies: '@alloc/quick-lru': 5.2.0 arg: 5.0.2 @@ -24322,37 +29376,23 @@ snapshots: postcss: 8.4.38 postcss-import: 15.1.0(postcss@8.4.38) postcss-js: 4.0.1(postcss@8.4.38) - postcss-load-config: 4.0.2(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.12.11)(typescript@5.4.5)) + postcss-load-config: 4.0.2(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.5)) postcss-nested: 6.0.1(postcss@8.4.38) - postcss-selector-parser: 6.0.16 + postcss-selector-parser: 6.0.15 resolve: 1.22.8 sucrase: 3.35.0 transitivePeerDependencies: - ts-node - tar-fs@2.1.1: + tar@4.4.19: dependencies: chownr: 1.1.4 - mkdirp-classic: 0.5.3 - pump: 3.0.0 - tar-stream: 2.2.0 - - 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.2.1: - dependencies: - chownr: 2.0.0 - fs-minipass: 2.1.0 - minipass: 5.0.0 - minizlib: 2.1.2 - mkdirp: 1.0.4 - yallist: 4.0.0 + fs-minipass: 1.2.7 + minipass: 2.9.0 + minizlib: 1.3.3 + mkdirp: 0.5.6 + safe-buffer: 5.2.1 + yallist: 3.1.1 telejson@7.2.0: dependencies: @@ -24360,22 +29400,18 @@ snapshots: temp-dir@2.0.0: {} + temp-dir@3.0.0: {} + temp@0.8.4: dependencies: rimraf: 2.6.3 - tempy@1.0.1: - dependencies: - del: 6.1.1 - is-stream: 2.0.1 - temp-dir: 2.0.0 - type-fest: 0.16.0 - unique-string: 2.0.0 + term-size@2.2.1: {} - terser@5.31.0: + terser@5.27.2: dependencies: - '@jridgewell/source-map': 0.3.6 - acorn: 8.11.3 + '@jridgewell/source-map': 0.3.5 + acorn: 8.12.1 commander: 2.20.3 source-map-support: 0.5.21 @@ -24406,13 +29442,15 @@ snapshots: readable-stream: 2.3.8 xtend: 4.0.2 + timed-out@4.0.1: {} + timeout-abort-controller@3.0.0: dependencies: retimer: 3.0.0 - timers-ext@0.1.7: + timers-ext@0.1.8: dependencies: - es5-ext: 0.10.64 + es5-ext: 0.10.62 next-tick: 1.1.0 tiny-glob@0.2.9: @@ -24422,11 +29460,19 @@ snapshots: tiny-invariant@1.3.3: {} - tinybench@2.8.0: {} + tinybench@2.6.0: {} - tinypool@0.8.4: {} + tinyexec@0.3.0: {} - tinyspy@2.2.1: {} + tinypool@0.8.3: {} + + tinyrainbow@1.2.0: {} + + tinyspy@2.2.0: {} + + tinyspy@3.0.2: {} + + titleize@3.0.0: {} tmp@0.0.33: dependencies: @@ -24440,13 +29486,16 @@ snapshots: dependencies: is-number: 7.0.0 - tocbot@4.27.20: {} - toidentifier@1.0.1: {} totalist@3.0.1: {} - tough-cookie@4.1.4: + 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 @@ -24465,15 +29514,23 @@ snapshots: trough@2.2.0: {} + ts-api-utils@1.2.1(typescript@5.4.3): + dependencies: + typescript: 5.4.3 + + ts-api-utils@1.3.0(typescript@5.4.3): + dependencies: + typescript: 5.4.3 + ts-api-utils@1.3.0(typescript@5.4.5): dependencies: - typescript: 5.4.5 + typescript: 5.5.3 ts-dedent@2.2.0: {} - ts-essentials@9.4.2(typescript@5.4.5): + ts-essentials@9.4.1(typescript@5.4.3): optionalDependencies: - typescript: 5.4.5 + typescript: 5.4.3 ts-interface-checker@0.1.13: {} @@ -24482,29 +29539,55 @@ snapshots: '@ts-morph/common': 0.20.0 code-block-writer: 12.0.0 - ts-node@10.9.2(@types/node@20.12.11)(typescript@5.4.5): + ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.3): dependencies: '@cspotcode/source-map-support': 0.8.1 - '@tsconfig/node10': 1.0.11 + '@tsconfig/node10': 1.0.9 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 20.12.11 + '@types/node': 20.12.7 acorn: 8.11.3 acorn-walk: 8.3.2 arg: 4.1.3 create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 5.4.5 + typescript: 5.4.3 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + + ts-node@10.9.2(@types/node@20.12.7)(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.12.7 + acorn: 8.11.3 + acorn-walk: 8.3.2 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 5.5.3 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 + tsconfck@3.0.3(typescript@5.4.3): + optionalDependencies: + typescript: 5.4.3 + tsconfck@3.0.3(typescript@5.4.5): optionalDependencies: typescript: 5.4.5 - tsconfig-paths@3.15.0: + tsconfck@3.1.3(typescript@5.4.5): + optionalDependencies: + typescript: 5.4.5 + + tsconfig-paths@3.14.2: dependencies: '@types/json5': 0.0.29 json5: 1.0.2 @@ -24513,31 +29596,48 @@ snapshots: tslib@1.14.1: {} + tslib@2.4.0: {} + tslib@2.6.2: {} + tsort@0.0.1: {} + + tsutils@3.21.0(typescript@5.4.3): + dependencies: + tslib: 1.14.1 + typescript: 5.4.3 + tsutils@3.21.0(typescript@5.4.5): dependencies: tslib: 1.14.1 - typescript: 5.4.5 + typescript: 5.5.3 + + tunnel-agent@0.6.0: + dependencies: + safe-buffer: 5.2.1 + + tunnel@0.0.6: {} tween-functions@1.2.0: {} + 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.16.0: {} - type-fest@0.20.2: {} - type-fest@0.6.0: {} + type-fest@0.21.3: {} type-fest@0.7.1: {} - type-fest@0.8.1: {} - type-fest@2.19.0: {} type-is@1.6.18: @@ -24545,73 +29645,82 @@ snapshots: media-typer: 0.3.0 mime-types: 2.1.35 + type@1.2.0: {} + type@2.7.2: {} - typed-array-buffer@1.0.2: + typed-array-buffer@1.0.0: dependencies: call-bind: 1.0.7 - es-errors: 1.3.0 - is-typed-array: 1.1.13 + get-intrinsic: 1.2.4 + is-typed-array: 1.1.12 - typed-array-byte-length@1.0.1: + typed-array-byte-length@1.0.0: dependencies: call-bind: 1.0.7 for-each: 0.3.3 - gopd: 1.0.1 has-proto: 1.0.3 - is-typed-array: 1.1.13 + is-typed-array: 1.1.12 - typed-array-byte-offset@1.0.2: + typed-array-byte-offset@1.0.0: dependencies: - available-typed-arrays: 1.0.7 + available-typed-arrays: 1.0.5 call-bind: 1.0.7 for-each: 0.3.3 - gopd: 1.0.1 has-proto: 1.0.3 - is-typed-array: 1.1.13 + is-typed-array: 1.1.12 - typed-array-length@1.0.6: + typed-array-length@1.0.4: dependencies: call-bind: 1.0.7 for-each: 0.3.3 - gopd: 1.0.1 - has-proto: 1.0.3 - is-typed-array: 1.1.13 - possible-typed-array-names: 1.0.0 + is-typed-array: 1.1.12 + + typedarray-to-buffer@3.1.5: + dependencies: + is-typedarray: 1.0.0 typesafe-path@0.2.2: {} - typescript-auto-import-cache@0.3.2: + typescript-auto-import-cache@0.3.3: dependencies: - semver: 7.6.2 + semver: 7.6.3 - typescript@5.4.5: {} + typescript@5.4.3: {} - ufo@1.5.3: {} + typescript@5.5.3: {} - uglify-js@3.17.4: + ufo@1.4.0: {} + + uglify-js@3.19.3: optional: true uint8-varint@2.0.4: dependencies: uint8arraylist: 2.4.8 - uint8arrays: 5.0.3 + uint8arrays: 5.1.0 uint8arraylist@2.4.8: dependencies: - uint8arrays: 5.0.3 + uint8arrays: 5.1.0 uint8arrays@3.1.0: dependencies: multiformats: 9.9.0 + uint8arrays@3.1.1: + dependencies: + multiformats: 9.9.0 + uint8arrays@4.0.10: dependencies: multiformats: 12.1.3 - uint8arrays@5.0.3: + uint8arrays@5.1.0: dependencies: - multiformats: 13.1.0 + multiformats: 13.1.3 + + ultron@1.1.1: {} unbox-primitive@1.0.2: dependencies: @@ -24624,22 +29733,20 @@ snapshots: undici-types@5.26.5: {} - undici@5.28.4: + undici@5.28.3: dependencies: - '@fastify/busboy': 2.1.1 + '@fastify/busboy': 2.1.0 unenv@1.9.0: dependencies: consola: 3.2.3 defu: 6.1.4 mime: 3.0.0 - node-fetch-native: 1.6.4 + node-fetch-native: 1.6.2 pathe: 1.1.2 unfetch@4.2.0: {} - unherit@3.0.1: {} - unicode-canonical-property-names-ecmascript@2.0.0: {} unicode-match-property-ecmascript@2.0.0: @@ -24651,19 +29758,7 @@ snapshots: unicode-property-aliases-ecmascript@2.1.0: {} - unicorn-magic@0.1.0: {} - - unified@10.1.2: - dependencies: - '@types/unist': 2.0.10 - bail: 2.0.2 - extend: 3.0.2 - is-buffer: 2.0.5 - is-plain-obj: 4.1.0 - trough: 2.2.0 - vfile: 5.3.7 - - unified@11.0.4: + unified@11.0.5: dependencies: '@types/unist': 3.0.2 bail: 2.0.2 @@ -24671,28 +29766,25 @@ snapshots: extend: 3.0.2 is-plain-obj: 4.1.0 trough: 2.2.0 - vfile: 6.0.1 - - unique-string@2.0.0: - dependencies: - crypto-random-string: 2.0.0 + vfile: 6.0.3 unist-util-find-after@5.0.0: dependencies: '@types/unist': 3.0.2 unist-util-is: 6.0.0 - unist-util-is@5.2.1: + unist-util-is@6.0.0: dependencies: - '@types/unist': 2.0.10 + '@types/unist': 3.0.2 - unist-util-is@6.0.0: + unist-util-modify-children@4.0.0: dependencies: '@types/unist': 3.0.2 + array-iterate: 2.0.1 - unist-util-modify-children@3.1.1: + unist-util-modify-children@4.0.0: dependencies: - '@types/unist': 2.0.10 + '@types/unist': 3.0.2 array-iterate: 2.0.1 unist-util-position-from-estree@2.0.0: @@ -24708,34 +29800,19 @@ snapshots: '@types/unist': 3.0.2 unist-util-visit: 5.0.0 - unist-util-stringify-position@3.0.3: - dependencies: - '@types/unist': 2.0.10 - unist-util-stringify-position@4.0.0: dependencies: '@types/unist': 3.0.2 - unist-util-visit-children@2.0.2: + unist-util-visit-children@3.0.0: dependencies: - '@types/unist': 2.0.10 - - unist-util-visit-parents@5.1.3: - dependencies: - '@types/unist': 2.0.10 - unist-util-is: 5.2.1 + '@types/unist': 3.0.2 unist-util-visit-parents@6.0.1: dependencies: '@types/unist': 3.0.2 unist-util-is: 6.0.0 - unist-util-visit@4.1.2: - dependencies: - '@types/unist': 2.0.10 - unist-util-is: 5.2.1 - unist-util-visit-parents: 5.1.3 - unist-util-visit@5.0.0: dependencies: '@types/unist': 3.0.2 @@ -24750,29 +29827,28 @@ snapshots: unpipe@1.0.0: {} - unplugin@1.10.1: + unplugin@1.14.1: dependencies: - acorn: 8.11.3 - chokidar: 3.6.0 - webpack-sources: 3.2.3 - webpack-virtual-modules: 0.6.1 + acorn: 8.12.1 + webpack-virtual-modules: 0.6.2 - unstorage@1.10.2(idb-keyval@6.2.1): + unstorage@1.10.1(idb-keyval@6.2.1): dependencies: anymatch: 3.1.3 chokidar: 3.6.0 destr: 2.0.3 - h3: 1.11.1 - listhen: 1.7.2 - lru-cache: 10.2.2 + h3: 1.10.2 + ioredis: 5.3.2 + listhen: 1.6.0 + lru-cache: 10.2.0 mri: 1.2.0 - node-fetch-native: 1.6.4 - ofetch: 1.3.4 - ufo: 1.5.3 + node-fetch-native: 1.6.2 + ofetch: 1.3.3 + ufo: 1.4.0 optionalDependencies: idb-keyval: 6.2.1 transitivePeerDependencies: - - uWebSockets.js + - supports-color untildify@4.0.0: {} @@ -24782,12 +29858,18 @@ snapshots: consola: 3.2.3 pathe: 1.1.2 - update-browserslist-db@1.0.15(browserslist@4.23.0): + update-browserslist-db@1.0.13(browserslist@4.23.0): dependencies: - browserslist: 4.23.0 + browserslist: 4.23.1 escalade: 3.1.2 picocolors: 1.0.0 + update-browserslist-db@1.1.0(browserslist@4.23.3): + dependencies: + browserslist: 4.23.3 + escalade: 3.1.2 + picocolors: 1.1.0 + upper-case-first@2.0.2: dependencies: tslib: 2.6.2 @@ -24807,29 +29889,24 @@ snapshots: querystringify: 2.2.0 requires-port: 1.0.0 - use-callback-ref@1.3.2(@types/react@18.3.2)(react@18.3.1): - dependencies: - react: 18.3.1 - tslib: 2.6.2 - optionalDependencies: - '@types/react': 18.3.2 + url-set-query@1.0.0: {} - use-sidecar@1.1.2(@types/react@18.3.2)(react@18.3.1): + use-sync-external-store@1.2.0(react@18.2.0): dependencies: - detect-node-es: 1.1.0 - react: 18.3.1 - tslib: 2.6.2 - optionalDependencies: - '@types/react': 18.3.2 + react: 18.2.0 - use-sync-external-store@1.2.0(react@18.3.1): + utf-8-validate@5.0.10: dependencies: - react: 18.3.1 + node-gyp-build: 4.8.0 - utf-8-validate@6.0.3: + utf-8-validate@5.0.10: dependencies: node-gyp-build: 4.8.1 + utf-8-validate@6.0.4: + dependencies: + node-gyp-build: 4.8.0 + utf8@3.0.0: {} util-deprecate@1.0.2: {} @@ -24839,11 +29916,13 @@ snapshots: inherits: 2.0.4 is-arguments: 1.1.1 is-generator-function: 1.0.10 - is-typed-array: 1.1.13 - which-typed-array: 1.1.15 + is-typed-array: 1.1.12 + which-typed-array: 1.1.13 utils-merge@1.0.1: {} + uuid@3.4.0: {} + uuid@8.3.2: {} uuid@9.0.1: {} @@ -24852,78 +29931,133 @@ snapshots: v8-compile-cache@2.4.0: {} - validate-npm-package-license@3.0.4: + v8-to-istanbul@9.2.0: dependencies: - spdx-correct: 3.2.0 - spdx-expression-parse: 3.0.1 + '@jridgewell/trace-mapping': 0.3.25 + '@types/istanbul-lib-coverage': 2.0.6 + convert-source-map: 2.0.0 - valtio@1.11.2(@types/react@18.3.2)(react@18.3.1): + valtio@1.11.2(@types/react@18.3.5)(react@18.2.0): dependencies: proxy-compare: 2.5.1 - use-sync-external-store: 1.2.0(react@18.3.1) + use-sync-external-store: 1.2.0(react@18.2.0) optionalDependencies: - '@types/react': 18.3.2 - react: 18.3.1 + '@types/react': 18.3.5 + react: 18.2.0 + + varint@5.0.2: {} varint@6.0.0: {} vary@1.1.2: {} + verror@1.10.0: + dependencies: + assert-plus: 1.0.0 + core-util-is: 1.0.2 + extsprintf: 1.3.0 + vfile-location@5.0.2: dependencies: '@types/unist': 3.0.2 vfile: 6.0.1 - vfile-message@3.1.4: - dependencies: - '@types/unist': 2.0.10 - unist-util-stringify-position: 3.0.3 - vfile-message@4.0.2: dependencies: '@types/unist': 3.0.2 unist-util-stringify-position: 4.0.0 - vfile@5.3.7: - dependencies: - '@types/unist': 2.0.10 - is-buffer: 2.0.5 - unist-util-stringify-position: 3.0.3 - vfile-message: 3.1.4 - vfile@6.0.1: dependencies: '@types/unist': 3.0.2 unist-util-stringify-position: 4.0.0 vfile-message: 4.0.2 - viem@1.21.4(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8): + vfile@6.0.3: + dependencies: + '@types/unist': 3.0.2 + vfile-message: 4.0.2 + + viem@1.21.4(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(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: 0.9.8(typescript@5.4.5)(zod@3.23.8) - isows: 1.0.3(ws@8.13.0(bufferutil@4.0.8)(utf-8-validate@6.0.3)) - ws: 8.13.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) + abitype: 0.9.8(typescript@5.4.3)(zod@3.22.4) + isows: 1.0.3(ws@8.13.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)) + ws: 8.13.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) optionalDependencies: - typescript: 5.4.5 + typescript: 5.4.3 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + - zod + + viem@1.21.4(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.23.8): + 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.4.3)(zod@3.23.8) + isows: 1.0.3(ws@8.13.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)) + ws: 8.13.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + optionalDependencies: + typescript: 5.4.3 transitivePeerDependencies: - bufferutil - utf-8-validate - zod - viem@2.10.2(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8): + viem@1.21.4(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@6.0.3)(zod@3.23.8): 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.23.8) + abitype: 0.9.8(typescript@5.4.3)(zod@3.23.8) isows: 1.0.3(ws@8.13.0(bufferutil@4.0.8)(utf-8-validate@6.0.3)) ws: 8.13.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) + optionalDependencies: + typescript: 5.4.3 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + - zod + + viem@2.21.7(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.22.4): + dependencies: + '@adraffy/ens-normalize': 1.10.0 + '@noble/curves': 1.4.0 + '@noble/hashes': 1.4.0 + '@scure/bip32': 1.4.0 + '@scure/bip39': 1.4.0 + abitype: 1.0.5(typescript@5.4.3)(zod@3.22.4) + isows: 1.0.4(ws@8.17.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)) + webauthn-p256: 0.0.5 + ws: 8.17.1(bufferutil@4.0.8)(utf-8-validate@5.0.10) + optionalDependencies: + typescript: 5.4.3 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + - zod + + viem@2.21.7(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8): + dependencies: + '@adraffy/ens-normalize': 1.10.0 + '@noble/curves': 1.4.0 + '@noble/hashes': 1.4.0 + '@scure/bip32': 1.4.0 + '@scure/bip39': 1.4.0 + abitype: 1.0.5(typescript@5.4.5)(zod@3.23.8) + isows: 1.0.4(ws@8.17.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)) + webauthn-p256: 0.0.5 + ws: 8.17.1(bufferutil@4.0.8)(utf-8-validate@5.0.10) optionalDependencies: typescript: 5.4.5 transitivePeerDependencies: @@ -24931,30 +30065,81 @@ snapshots: - utf-8-validate - zod - viem@2.13.1(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8): + viem@2.9.29(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(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.3)(zod@3.22.4) + isows: 1.0.3(ws@8.13.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)) + ws: 8.13.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + optionalDependencies: + typescript: 5.4.3 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + - zod + + viem@2.9.29(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@5.0.10)(zod@3.23.8): + 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.3)(zod@3.23.8) + isows: 1.0.3(ws@8.13.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)) + ws: 8.13.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + optionalDependencies: + typescript: 5.4.3 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + - zod + + viem@2.9.29(bufferutil@4.0.8)(typescript@5.4.3)(utf-8-validate@6.0.3)(zod@3.23.8): 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.23.8) - isows: 1.0.4(ws@8.13.0(bufferutil@4.0.8)(utf-8-validate@6.0.3)) + abitype: 1.0.0(typescript@5.4.3)(zod@3.23.8) + isows: 1.0.3(ws@8.13.0(bufferutil@4.0.8)(utf-8-validate@6.0.3)) ws: 8.13.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) optionalDependencies: - typescript: 5.4.5 + typescript: 5.4.3 transitivePeerDependencies: - bufferutil - utf-8-validate - zod - vite-node@1.6.0(@types/node@20.12.11)(terser@5.31.0): + vite-node@1.5.0(@types/node@20.12.7)(terser@5.27.2): + dependencies: + cac: 6.7.14 + debug: 4.3.5 + pathe: 1.1.2 + picocolors: 1.0.0 + vite: 5.2.11(@types/node@20.12.7)(terser@5.27.2) + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + + vite-node@1.6.0(@types/node@20.12.7)(terser@5.27.2): dependencies: cac: 6.7.14 debug: 4.3.4 pathe: 1.1.2 picocolors: 1.0.0 - vite: 5.2.11(@types/node@20.12.11)(terser@5.31.0) + vite: 5.2.11(@types/node@20.12.7)(terser@5.27.2) transitivePeerDependencies: - '@types/node' - less @@ -24965,70 +30150,224 @@ snapshots: - supports-color - terser - vite-tsconfig-paths@4.3.2(typescript@5.4.5)(vite@4.5.3(@types/node@20.12.11)(terser@5.31.0)): + vite-tsconfig-paths@4.3.2(typescript@5.4.3)(vite@4.5.3(@types/node@20.12.7)(terser@5.27.2)): dependencies: debug: 4.3.4 globrex: 0.1.2 - tsconfck: 3.0.3(typescript@5.4.5) + tsconfck: 3.0.3(typescript@5.4.3) + optionalDependencies: + vite: 4.5.3(@types/node@20.12.7)(terser@5.27.2) + transitivePeerDependencies: + - supports-color + - typescript + + vite-tsconfig-paths@4.3.2(typescript@5.4.3)(vite@5.1.3(@types/node@20.12.7)(terser@5.27.2)): + dependencies: + debug: 4.3.4 + globrex: 0.1.2 + tsconfck: 3.0.3(typescript@5.4.3) optionalDependencies: - vite: 4.5.3(@types/node@20.12.11)(terser@5.31.0) + vite: 5.1.3(@types/node@20.12.7)(terser@5.27.2) transitivePeerDependencies: - supports-color - typescript - vite-tsconfig-paths@4.3.2(typescript@5.4.5)(vite@5.2.11(@types/node@20.12.11)(terser@5.31.0)): + vite-tsconfig-paths@4.3.2(typescript@5.4.3)(vite@5.2.11(@types/node@20.12.7)(terser@5.27.2)): dependencies: debug: 4.3.4 globrex: 0.1.2 + tsconfck: 3.0.3(typescript@5.4.3) + optionalDependencies: + vite: 5.2.11(@types/node@20.12.7)(terser@5.27.2) + transitivePeerDependencies: + - supports-color + - typescript + + vite-tsconfig-paths@4.3.2(typescript@5.4.5)(vite@5.2.11(@types/node@20.12.7)(terser@5.27.2)): + dependencies: + debug: 4.3.5 + globrex: 0.1.2 tsconfck: 3.0.3(typescript@5.4.5) optionalDependencies: - vite: 5.2.11(@types/node@20.12.11)(terser@5.31.0) + vite: 5.2.11(@types/node@20.12.7)(terser@5.27.2) transitivePeerDependencies: - supports-color - typescript - vite@4.5.3(@types/node@20.12.11)(terser@5.31.0): + vite@4.5.3(@types/node@20.12.7)(terser@5.27.2): dependencies: esbuild: 0.18.20 - postcss: 8.4.38 + postcss: 8.4.39 rollup: 3.29.4 optionalDependencies: - '@types/node': 20.12.11 + '@types/node': 20.12.7 + fsevents: 2.3.3 + terser: 5.27.2 + + vite@5.1.3(@types/node@20.12.7)(terser@5.27.2): + dependencies: + esbuild: 0.19.12 + postcss: 8.4.38 + rollup: 4.12.0 + optionalDependencies: + '@types/node': 20.12.7 fsevents: 2.3.3 - terser: 5.31.0 + terser: 5.27.2 + + vite@5.2.11(@types/node@20.12.7)(terser@5.27.2): + dependencies: + '@types/node': 20.14.9 + esbuild: 0.21.5 + postcss: 8.4.39 + rollup: 4.18.0 + optionalDependencies: + '@types/node': 20.12.7 + fsevents: 2.3.3 + terser: 5.27.2 + + vite@5.4.5(@types/node@20.12.7)(terser@5.27.2): + dependencies: + esbuild: 0.21.5 + postcss: 8.4.47 + rollup: 4.21.3 + optionalDependencies: + '@types/node': 20.12.7 + fsevents: 2.3.3 + terser: 5.27.2 + + vitefu@0.2.5(vite@4.5.3(@types/node@20.12.7)(terser@5.27.2)): + optionalDependencies: + vite: 4.5.3(@types/node@20.12.7)(terser@5.27.2) + + vitefu@0.2.5(vite@5.1.3(@types/node@20.12.7)(terser@5.27.2)): + optionalDependencies: + vite: 5.1.3(@types/node@20.12.7)(terser@5.27.2) + + vitefu@0.2.5(vite@5.2.11(@types/node@20.12.7)(terser@5.27.2)): + optionalDependencies: + vite: 5.2.11(@types/node@20.12.7)(terser@5.27.2) + + vitefu@1.0.2(vite@5.4.5(@types/node@20.12.7)(terser@5.27.2)): + optionalDependencies: + vite: 5.4.5(@types/node@20.12.7)(terser@5.27.2) + + vitest-fetch-mock@0.2.2(encoding@0.1.13)(vitest@1.6.0(@types/node@20.12.7)(jsdom@24.0.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(terser@5.27.2)): + dependencies: + cross-fetch: 3.1.8(encoding@0.1.13) + vitest: 1.6.0(@types/node@20.12.7)(jsdom@24.0.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(terser@5.27.2) + transitivePeerDependencies: + - encoding + + vitest-mock-extended@1.3.1(typescript@5.4.3)(vitest@1.6.0(@types/node@20.12.7)(jsdom@24.0.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(terser@5.27.2)): + dependencies: + ts-essentials: 9.4.1(typescript@5.4.3) + typescript: 5.4.3 + vitest: 1.6.0(@types/node@20.12.7)(jsdom@24.0.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(terser@5.27.2) + + vitest@1.5.0(@types/node@20.12.7)(jsdom@24.0.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(terser@5.27.2): + dependencies: + '@vitest/expect': 1.5.0 + '@vitest/runner': 1.5.0 + '@vitest/snapshot': 1.5.0 + '@vitest/spy': 1.5.0 + '@vitest/utils': 1.5.0 + acorn-walk: 8.3.2 + chai: 4.4.1 + debug: 4.3.4 + execa: 8.0.1 + local-pkg: 0.5.0 + magic-string: 0.30.9 + pathe: 1.1.2 + picocolors: 1.0.0 + std-env: 3.7.0 + strip-literal: 2.0.0 + tinybench: 2.6.0 + tinypool: 0.8.3 + vite: 5.1.3(@types/node@20.12.7)(terser@5.27.2) + vite-node: 1.5.0(@types/node@20.12.7)(terser@5.27.2) + why-is-node-running: 2.2.2 + optionalDependencies: + '@types/node': 20.12.7 + jsdom: 24.0.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + + vitest@1.5.0(@types/node@20.12.7)(jsdom@24.0.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))(terser@5.27.2): + dependencies: + '@vitest/expect': 1.5.0 + '@vitest/runner': 1.5.0 + '@vitest/snapshot': 1.5.0 + '@vitest/spy': 1.5.0 + '@vitest/utils': 1.5.0 + acorn-walk: 8.3.2 + chai: 4.4.1 + debug: 4.3.4 + execa: 8.0.1 + local-pkg: 0.5.0 + magic-string: 0.30.9 + pathe: 1.1.2 + picocolors: 1.0.0 + std-env: 3.7.0 + strip-literal: 2.0.0 + tinybench: 2.6.0 + tinypool: 0.8.3 + vite: 5.1.3(@types/node@20.12.7)(terser@5.27.2) + vite-node: 1.5.0(@types/node@20.12.7)(terser@5.27.2) + why-is-node-running: 2.2.2 + optionalDependencies: + '@types/node': 20.12.7 + jsdom: 24.0.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) + transitivePeerDependencies: + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser - vite@5.2.11(@types/node@20.12.11)(terser@5.31.0): + vitest@1.6.0(@types/node@20.12.7)(jsdom@24.0.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(terser@5.27.2): dependencies: - esbuild: 0.20.2 - postcss: 8.4.38 - rollup: 4.17.2 - optionalDependencies: - '@types/node': 20.12.11 - fsevents: 2.3.3 - terser: 5.31.0 - - vitefu@0.2.5(vite@4.5.3(@types/node@20.12.11)(terser@5.31.0)): - optionalDependencies: - vite: 4.5.3(@types/node@20.12.11)(terser@5.31.0) - - vitefu@0.2.5(vite@5.2.11(@types/node@20.12.11)(terser@5.31.0)): + '@vitest/expect': 1.6.0 + '@vitest/runner': 1.6.0 + '@vitest/snapshot': 1.6.0 + '@vitest/spy': 1.6.0 + '@vitest/utils': 1.6.0 + acorn-walk: 8.3.3 + chai: 4.4.1 + debug: 4.3.5 + execa: 8.0.1 + jsdom: 24.1.0 + local-pkg: 0.5.0 + magic-string: 0.30.10 + pathe: 1.1.2 + picocolors: 1.0.1 + std-env: 3.7.0 + strip-literal: 2.0.0 + tinybench: 2.6.0 + tinypool: 0.8.3 + vite: 5.2.11(@types/node@20.12.7)(terser@5.27.2) + vite-node: 1.6.0(@types/node@20.12.7)(terser@5.27.2) + why-is-node-running: 2.2.2 optionalDependencies: - vite: 5.2.11(@types/node@20.12.11)(terser@5.31.0) - - vitest-fetch-mock@0.2.2(encoding@0.1.13)(vitest@1.6.0(@types/node@20.12.11)(jsdom@24.0.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))(terser@5.31.0)): - dependencies: - cross-fetch: 3.1.8(encoding@0.1.13) - vitest: 1.6.0(@types/node@20.12.11)(jsdom@24.0.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))(terser@5.31.0) + '@types/node': 20.12.7 + jsdom: 24.0.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) transitivePeerDependencies: - - encoding - - vitest-mock-extended@1.3.1(typescript@5.4.5)(vitest@1.6.0(@types/node@20.12.11)(jsdom@24.0.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))(terser@5.31.0)): - dependencies: - ts-essentials: 9.4.2(typescript@5.4.5) - typescript: 5.4.5 - vitest: 1.6.0(@types/node@20.12.11)(jsdom@24.0.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))(terser@5.31.0) + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser - vitest@1.6.0(@types/node@20.12.11)(jsdom@24.0.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))(terser@5.31.0): + vitest@1.6.0(@types/node@20.12.7)(jsdom@24.0.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))(terser@5.27.2): dependencies: '@vitest/expect': 1.6.0 '@vitest/runner': 1.6.0 @@ -25044,14 +30383,14 @@ snapshots: pathe: 1.1.2 picocolors: 1.0.0 std-env: 3.7.0 - strip-literal: 2.1.0 - tinybench: 2.8.0 - tinypool: 0.8.4 - vite: 5.2.11(@types/node@20.12.11)(terser@5.31.0) - vite-node: 1.6.0(@types/node@20.12.11)(terser@5.31.0) + strip-literal: 2.0.0 + tinybench: 2.6.0 + tinypool: 0.8.3 + vite: 5.2.11(@types/node@20.12.7)(terser@5.27.2) + vite-node: 1.6.0(@types/node@20.12.7)(terser@5.27.2) why-is-node-running: 2.2.2 optionalDependencies: - '@types/node': 20.12.11 + '@types/node': 20.12.7 jsdom: 24.0.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) transitivePeerDependencies: - less @@ -25066,66 +30405,107 @@ snapshots: void-elements@3.1.0: {} - volar-service-css@0.0.43(@volar/language-service@2.2.2): + volar-service-css@0.0.61(@volar/language-service@2.4.5): dependencies: - vscode-css-languageservice: 6.2.14 + vscode-css-languageservice: 6.3.1 vscode-languageserver-textdocument: 1.0.11 vscode-uri: 3.0.8 optionalDependencies: - '@volar/language-service': 2.2.2 + '@volar/language-service': 2.4.5 - volar-service-emmet@0.0.43(@volar/language-service@2.2.2): + volar-service-emmet@0.0.61(@volar/language-service@2.4.5): dependencies: + '@emmetio/css-parser': 0.4.0 + '@emmetio/html-matcher': 1.3.0 '@vscode/emmet-helper': 2.9.3 - vscode-html-languageservice: '@johnsoncodehk/vscode-html-languageservice@5.2.0-34a5462' + vscode-uri: 3.0.8 optionalDependencies: - '@volar/language-service': 2.2.2 + '@volar/language-service': 2.4.5 - volar-service-html@0.0.43(@volar/language-service@2.2.2): + volar-service-html@0.0.61(@volar/language-service@2.4.5): dependencies: - vscode-html-languageservice: '@johnsoncodehk/vscode-html-languageservice@5.2.0-34a5462' + vscode-html-languageservice: 5.3.1 vscode-languageserver-textdocument: 1.0.11 vscode-uri: 3.0.8 optionalDependencies: - '@volar/language-service': 2.2.2 + '@volar/language-service': 2.4.5 - volar-service-prettier@0.0.43(@volar/language-service@2.2.2)(prettier@3.2.5): + volar-service-prettier@0.0.61(@volar/language-service@2.4.5)(prettier@3.2.5): dependencies: + '@volar/language-service': 2.2.5 + prettier: 3.3.2 vscode-uri: 3.0.8 optionalDependencies: - '@volar/language-service': 2.2.2 + '@volar/language-service': 2.4.5 prettier: 3.2.5 - volar-service-typescript-twoslash-queries@0.0.43(@volar/language-service@2.2.2): + volar-service-typescript-twoslash-queries@0.0.61(@volar/language-service@2.4.5): + dependencies: + vscode-uri: 3.0.8 optionalDependencies: - '@volar/language-service': 2.2.2 + '@volar/language-service': 2.4.5 + + volar-service-typescript@0.0.61(@volar/language-service@2.4.5): + dependencies: + '@volar/language-service': 2.2.5 - volar-service-typescript@0.0.43(@volar/language-service@2.2.2): + volar-service-typescript@0.0.45(@volar/language-service@2.2.5): dependencies: + '@volar/language-service': 2.2.5 path-browserify: 1.0.1 semver: 7.6.2 - typescript-auto-import-cache: 0.3.2 + typescript-auto-import-cache: 0.3.3 vscode-languageserver-textdocument: 1.0.11 vscode-nls: 5.2.0 + vscode-uri: 3.0.8 + optionalDependencies: + '@volar/language-service': 2.4.5 + + volar-service-yaml@0.0.61(@volar/language-service@2.4.5): + dependencies: + vscode-uri: 3.0.8 + yaml-language-server: 1.15.0 optionalDependencies: - '@volar/language-service': 2.2.2 + '@volar/language-service': 2.4.5 + + vscode-css-languageservice@6.3.1: + dependencies: + '@vscode/l10n': 0.0.18 + vscode-languageserver-textdocument: 1.0.12 + vscode-languageserver-types: 3.17.5 + vscode-uri: 3.0.8 - vscode-css-languageservice@6.2.14: + vscode-html-languageservice@5.3.0: dependencies: '@vscode/l10n': 0.0.18 vscode-languageserver-textdocument: 1.0.11 vscode-languageserver-types: 3.17.5 vscode-uri: 3.0.8 - vscode-html-languageservice@5.2.0: + vscode-html-languageservice@5.3.1: dependencies: '@vscode/l10n': 0.0.18 + vscode-languageserver-textdocument: 1.0.12 + vscode-languageserver-types: 3.17.5 + vscode-uri: 3.0.8 + + vscode-json-languageservice@4.1.8: + dependencies: + jsonc-parser: 3.2.0 vscode-languageserver-textdocument: 1.0.11 vscode-languageserver-types: 3.17.5 + vscode-nls: 5.2.0 vscode-uri: 3.0.8 + vscode-jsonrpc@6.0.0: {} + vscode-jsonrpc@8.2.0: {} + vscode-languageserver-protocol@3.16.0: + dependencies: + vscode-jsonrpc: 6.0.0 + vscode-languageserver-types: 3.16.0 + vscode-languageserver-protocol@3.17.5: dependencies: vscode-jsonrpc: 8.2.0 @@ -25133,8 +30513,16 @@ snapshots: vscode-languageserver-textdocument@1.0.11: {} + vscode-languageserver-textdocument@1.0.12: {} + + vscode-languageserver-types@3.16.0: {} + vscode-languageserver-types@3.17.5: {} + vscode-languageserver@7.0.0: + dependencies: + vscode-languageserver-protocol: 3.16.0 + vscode-languageserver@9.0.1: dependencies: vscode-languageserver-protocol: 3.17.5 @@ -25153,42 +30541,248 @@ snapshots: dependencies: makeerror: 1.0.12 - watchpack@2.4.1: - dependencies: - glob-to-regexp: 0.4.1 - graceful-fs: 4.2.11 - wcwidth@1.0.1: dependencies: defaults: 1.0.4 web-namespaces@2.0.1: {} + web3-bzz@1.10.4(bufferutil@4.0.8)(utf-8-validate@5.0.10): + dependencies: + '@types/node': 12.20.55 + got: 12.1.0 + swarm-js: 0.1.42(bufferutil@4.0.8)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + web3-core-helpers@1.10.4: + dependencies: + web3-eth-iban: 1.10.4 + web3-utils: 1.10.4 + + web3-core-method@1.10.4: + dependencies: + '@ethersproject/transactions': 5.7.0 + web3-core-helpers: 1.10.4 + web3-core-promievent: 1.10.4 + web3-core-subscriptions: 1.10.4 + web3-utils: 1.10.4 + + web3-core-promievent@1.10.4: + dependencies: + eventemitter3: 4.0.4 + + web3-core-requestmanager@1.10.4(encoding@0.1.13): + dependencies: + util: 0.12.5 + web3-core-helpers: 1.10.4 + web3-providers-http: 1.10.4(encoding@0.1.13) + web3-providers-ipc: 1.10.4 + web3-providers-ws: 1.10.4 + transitivePeerDependencies: + - encoding + - supports-color + + web3-core-subscriptions@1.10.4: + dependencies: + eventemitter3: 4.0.4 + web3-core-helpers: 1.10.4 + + web3-core@1.10.4(encoding@0.1.13): + dependencies: + '@types/bn.js': 5.1.5 + '@types/node': 12.20.55 + bignumber.js: 9.1.2 + web3-core-helpers: 1.10.4 + web3-core-method: 1.10.4 + web3-core-requestmanager: 1.10.4(encoding@0.1.13) + web3-utils: 1.10.4 + transitivePeerDependencies: + - encoding + - supports-color + web3-eth-abi@1.10.4: dependencies: '@ethersproject/abi': 5.7.0 web3-utils: 1.10.4 + web3-eth-accounts@1.10.4(encoding@0.1.13): + dependencies: + '@ethereumjs/common': 2.6.5 + '@ethereumjs/tx': 3.5.2 + '@ethereumjs/util': 8.1.0 + eth-lib: 0.2.8 + scrypt-js: 3.0.1 + uuid: 9.0.1 + web3-core: 1.10.4(encoding@0.1.13) + web3-core-helpers: 1.10.4 + web3-core-method: 1.10.4 + web3-utils: 1.10.4 + transitivePeerDependencies: + - encoding + - supports-color + + web3-eth-contract@1.10.4(encoding@0.1.13): + dependencies: + '@types/bn.js': 5.1.5 + web3-core: 1.10.4(encoding@0.1.13) + web3-core-helpers: 1.10.4 + web3-core-method: 1.10.4 + web3-core-promievent: 1.10.4 + web3-core-subscriptions: 1.10.4 + web3-eth-abi: 1.10.4 + web3-utils: 1.10.4 + transitivePeerDependencies: + - encoding + - supports-color + + web3-eth-ens@1.10.4(encoding@0.1.13): + dependencies: + content-hash: 2.5.2 + eth-ens-namehash: 2.0.8 + web3-core: 1.10.4(encoding@0.1.13) + web3-core-helpers: 1.10.4 + web3-core-promievent: 1.10.4 + web3-eth-abi: 1.10.4 + web3-eth-contract: 1.10.4(encoding@0.1.13) + web3-utils: 1.10.4 + transitivePeerDependencies: + - encoding + - supports-color + + web3-eth-iban@1.10.4: + dependencies: + bn.js: 5.2.1 + web3-utils: 1.10.4 + + web3-eth-personal@1.10.4(encoding@0.1.13): + dependencies: + '@types/node': 12.20.55 + web3-core: 1.10.4(encoding@0.1.13) + web3-core-helpers: 1.10.4 + web3-core-method: 1.10.4 + web3-net: 1.10.4(encoding@0.1.13) + web3-utils: 1.10.4 + transitivePeerDependencies: + - encoding + - supports-color + + web3-eth@1.10.4(encoding@0.1.13): + dependencies: + web3-core: 1.10.4(encoding@0.1.13) + web3-core-helpers: 1.10.4 + web3-core-method: 1.10.4 + web3-core-subscriptions: 1.10.4 + web3-eth-abi: 1.10.4 + web3-eth-accounts: 1.10.4(encoding@0.1.13) + web3-eth-contract: 1.10.4(encoding@0.1.13) + web3-eth-ens: 1.10.4(encoding@0.1.13) + web3-eth-iban: 1.10.4 + web3-eth-personal: 1.10.4(encoding@0.1.13) + web3-net: 1.10.4(encoding@0.1.13) + web3-utils: 1.10.4 + transitivePeerDependencies: + - encoding + - supports-color + + web3-net@1.10.4(encoding@0.1.13): + dependencies: + web3-core: 1.10.4(encoding@0.1.13) + web3-core-method: 1.10.4 + web3-utils: 1.10.4 + transitivePeerDependencies: + - encoding + - supports-color + + web3-providers-http@1.10.4(encoding@0.1.13): + dependencies: + abortcontroller-polyfill: 1.7.5 + cross-fetch: 4.0.0(encoding@0.1.13) + es6-promise: 4.2.8 + web3-core-helpers: 1.10.4 + transitivePeerDependencies: + - encoding + + web3-providers-ipc@1.10.4: + dependencies: + oboe: 2.1.5 + web3-core-helpers: 1.10.4 + + web3-providers-ws@1.10.4: + dependencies: + eventemitter3: 4.0.4 + web3-core-helpers: 1.10.4 + websocket: 1.0.35 + transitivePeerDependencies: + - supports-color + + web3-shh@1.10.4(encoding@0.1.13): + dependencies: + web3-core: 1.10.4(encoding@0.1.13) + web3-core-method: 1.10.4 + web3-core-subscriptions: 1.10.4 + web3-net: 1.10.4(encoding@0.1.13) + transitivePeerDependencies: + - encoding + - supports-color + web3-utils@1.10.4: dependencies: '@ethereumjs/util': 8.1.0 bn.js: 5.2.1 - ethereum-bloom-filters: 1.1.0 + ethereum-bloom-filters: 1.0.10 ethereum-cryptography: 2.1.3 ethjs-unit: 0.1.6 number-to-bn: 1.7.0 randombytes: 2.1.0 utf8: 3.0.0 + web3@1.10.4(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10): + dependencies: + web3-bzz: 1.10.4(bufferutil@4.0.8)(utf-8-validate@5.0.10) + web3-core: 1.10.4(encoding@0.1.13) + web3-eth: 1.10.4(encoding@0.1.13) + web3-eth-personal: 1.10.4(encoding@0.1.13) + web3-net: 1.10.4(encoding@0.1.13) + web3-shh: 1.10.4(encoding@0.1.13) + web3-utils: 1.10.4 + transitivePeerDependencies: + - bufferutil + - encoding + - supports-color + - utf-8-validate + + webauthn-p256@0.0.5: + dependencies: + '@noble/curves': 1.4.0 + '@noble/hashes': 1.4.0 + + webextension-polyfill-ts@0.25.0: + dependencies: + webextension-polyfill: 0.7.0 + webextension-polyfill@0.10.0: {} + webextension-polyfill@0.7.0: {} + webidl-conversions@3.0.1: {} webidl-conversions@7.0.0: {} - webpack-sources@3.2.3: {} + webpack-virtual-modules@0.6.2: {} - webpack-virtual-modules@0.6.1: {} + websocket@1.0.35: + dependencies: + bufferutil: 4.0.8 + debug: 2.6.9 + es5-ext: 0.10.64 + typedarray-to-buffer: 3.1.5 + utf-8-validate: 5.0.10 + yaeti: 0.0.6 + transitivePeerDependencies: + - supports-color whatwg-encoding@3.1.1: dependencies: @@ -25216,34 +30810,25 @@ snapshots: is-string: 1.0.7 is-symbol: 1.0.4 - which-collection@1.0.2: - dependencies: - is-map: 2.0.3 - is-set: 2.0.3 - is-weakmap: 2.0.2 - is-weakset: 2.0.3 - which-module@2.0.1: {} which-pm-runs@1.1.0: {} - which-pm@2.0.0: - dependencies: - load-yaml-file: 0.2.0 - path-exists: 4.0.0 - - which-pm@2.1.1: + which-pm@3.0.0: dependencies: load-yaml-file: 0.2.0 - path-exists: 4.0.0 - which-typed-array@1.1.15: + which-typed-array@1.1.13: dependencies: - available-typed-arrays: 1.0.7 + available-typed-arrays: 1.0.5 call-bind: 1.0.7 for-each: 0.3.3 gopd: 1.0.1 - has-tostringtag: 1.0.2 + has-tostringtag: 1.0.0 + + which@1.3.1: + dependencies: + isexe: 2.0.0 which@2.0.2: dependencies: @@ -25258,14 +30843,27 @@ snapshots: siginfo: 2.0.0 stackback: 0.0.2 + widest-line@3.1.0: + dependencies: + string-width: 4.2.3 + widest-line@4.0.1: dependencies: string-width: 5.1.2 - word-wrap@1.2.5: {} + winston@2.4.7: + dependencies: + async: 2.6.4 + colors: 1.0.3 + cycle: 1.0.3 + eyes: 0.1.8 + isstream: 0.1.2 + stack-trace: 0.0.10 wordwrap@1.0.0: {} + workerpool@6.5.1: {} + wrap-ansi@6.2.0: dependencies: ansi-styles: 4.3.0 @@ -25292,65 +30890,156 @@ snapshots: imurmurhash: 0.1.4 signal-exit: 3.0.7 - ws@6.2.2(bufferutil@4.0.8)(utf-8-validate@6.0.3): + ws@3.3.3(bufferutil@4.0.8)(utf-8-validate@5.0.10): + dependencies: + async-limiter: 1.0.1 + safe-buffer: 5.1.2 + ultron: 1.1.1 + optionalDependencies: + bufferutil: 4.0.8 + utf-8-validate: 5.0.10 + + ws@6.2.2(bufferutil@4.0.8)(utf-8-validate@5.0.10): dependencies: async-limiter: 1.0.1 optionalDependencies: bufferutil: 4.0.8 - utf-8-validate: 6.0.3 + utf-8-validate: 5.0.10 - ws@7.4.6(bufferutil@4.0.8)(utf-8-validate@6.0.3): + ws@7.4.6(bufferutil@4.0.8)(utf-8-validate@5.0.10): optionalDependencies: bufferutil: 4.0.8 - utf-8-validate: 6.0.3 + utf-8-validate: 5.0.10 - ws@7.5.9(bufferutil@4.0.8)(utf-8-validate@6.0.3): + ws@7.5.9(bufferutil@4.0.8)(utf-8-validate@5.0.10): optionalDependencies: bufferutil: 4.0.8 - utf-8-validate: 6.0.3 + utf-8-validate: 5.0.10 + + ws@8.11.0(bufferutil@4.0.8)(utf-8-validate@5.0.10): + optionalDependencies: + bufferutil: 4.0.8 + utf-8-validate: 5.0.10 ws@8.11.0(bufferutil@4.0.8)(utf-8-validate@6.0.3): optionalDependencies: bufferutil: 4.0.8 utf-8-validate: 6.0.3 + ws@8.13.0(bufferutil@4.0.8)(utf-8-validate@5.0.10): + optionalDependencies: + bufferutil: 4.0.8 + utf-8-validate: 5.0.10 + ws@8.13.0(bufferutil@4.0.8)(utf-8-validate@6.0.3): optionalDependencies: bufferutil: 4.0.8 utf-8-validate: 6.0.3 - ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.3): + ws@8.16.0(bufferutil@4.0.8)(utf-8-validate@5.0.10): + optionalDependencies: + bufferutil: 4.0.8 + utf-8-validate: 5.0.10 + + ws@8.16.0(bufferutil@4.0.8)(utf-8-validate@6.0.3): optionalDependencies: bufferutil: 4.0.8 utf-8-validate: 6.0.3 + ws@8.17.1(bufferutil@4.0.8)(utf-8-validate@5.0.10): + optionalDependencies: + bufferutil: 4.0.8 + utf-8-validate: 5.0.10 + + xhr-request-promise@0.1.3: + dependencies: + xhr-request: 1.1.0 + + xhr-request@1.1.0: + dependencies: + buffer-to-arraybuffer: 0.0.5 + object-assign: 4.1.1 + query-string: 5.1.1 + simple-get: 2.8.2 + timed-out: 4.0.1 + url-set-query: 1.0.0 + xhr: 2.6.0 + + xhr@2.6.0: + dependencies: + global: 4.4.0 + is-function: 1.0.2 + parse-headers: 2.0.5 + xtend: 4.0.2 + xml-name-validator@5.0.0: {} + xml2js@0.6.2: + dependencies: + sax: 1.3.0 + xmlbuilder: 11.0.1 + + xmlbuilder@11.0.1: {} + xmlchars@2.2.0: {} xmlhttprequest-ssl@2.0.0: {} xtend@4.0.2: {} + xxhash-wasm@1.0.2: {} + y18n@4.0.3: {} y18n@5.0.8: {} + yaeti@0.0.6: {} + + yallist@2.1.2: {} + yallist@3.1.1: {} yallist@4.0.0: {} + yaml-language-server@1.15.0: + dependencies: + ajv: 8.12.0 + lodash: 4.17.21 + request-light: 0.5.8 + vscode-json-languageservice: 4.1.8 + vscode-languageserver: 7.0.0 + vscode-languageserver-textdocument: 1.0.11 + vscode-languageserver-types: 3.17.5 + vscode-nls: 5.2.0 + vscode-uri: 3.0.8 + yaml: 2.2.2 + optionalDependencies: + prettier: 2.8.7 + yaml@1.10.2: {} - yaml@2.4.2: {} + yaml@2.2.2: {} + + yaml@2.3.4: {} + + yaml@2.5.1: {} yargs-parser@18.1.3: dependencies: camelcase: 5.3.1 decamelize: 1.2.0 + 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 @@ -25365,6 +31054,16 @@ snapshots: y18n: 4.0.3 yargs-parser: 18.1.3 + yargs@16.2.0: + dependencies: + cliui: 7.0.4 + escalade: 3.1.2 + 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 @@ -25379,21 +31078,28 @@ snapshots: yocto-queue@0.1.0: {} - yocto-queue@1.0.0: {} + yocto-queue@1.1.1: {} + + yocto-queue@1.1.1: {} + + zod-to-json-schema@3.23.3(zod@3.23.8): + dependencies: + zod: 3.23.8 - zod-to-json-schema@3.23.0(zod@3.23.8): + zod-to-ts@1.2.0(typescript@5.4.5)(zod@3.23.8): dependencies: + typescript: 5.4.5 zod: 3.23.8 zod@3.22.4: {} zod@3.23.8: {} - zustand@4.4.1(@types/react@18.3.2)(react@18.3.1): + zustand@4.4.1(@types/react@18.3.5)(react@18.2.0): dependencies: - use-sync-external-store: 1.2.0(react@18.3.1) + use-sync-external-store: 1.2.0(react@18.2.0) optionalDependencies: - '@types/react': 18.3.2 - react: 18.3.1 + '@types/react': 18.3.5 + react: 18.2.0 zwitch@2.0.4: {} diff --git a/release-please-config.json b/release-please-config.json index d1a14a8ec14..b32db2f415b 100644 --- a/release-please-config.json +++ b/release-please-config.json @@ -1,35 +1,40 @@ { + "$schema": "https://raw.githubusercontent.com/googleapis/release-please/main/schemas/config.json", + "release-type": "node", + "changelog-sections": [ + { "type": "feat", "section": "Features", "hidden": false }, + { "type": "fix", "section": "Bug Fixes", "hidden": false }, + { "type": "chore", "section": "Chores", "hidden": false }, + { "type": "docs", "section": "Documentation", "hidden": false }, + { "type": "style", "section": "Styles", "hidden": false }, + { "type": "refactor", "section": "Code Refactoring", "hidden": false }, + { "type": "perf", "section": "Performance Improvements", "hidden": false }, + { "type": "test", "section": "Tests", "hidden": false }, + { "type": "ci", "section": "Workflow", "hidden": false }, + { "type": "revert", "section": "Reverted Commits", "hidden": false }, + { "type": "build", "section": "Build", "hidden": false } + ], + "separate-pull-requests": true, "packages": { - "packages/branding": {}, "packages/bridge-ui": {}, "packages/docs-site": {}, "packages/eventindexer": {}, "packages/fork-diff": {}, "packages/guardian-prover-health-check": {}, "packages/guardian-prover-health-check-ui": {}, - "packages/protocol": {}, + "packages/protocol": { + "package-name": "taiko-alethia-protocol" + }, "packages/relayer": {}, - "packages/nfts": {}, - "packages/taikoon-ui": {}, - "packages/taiko-client": {}, - "packages/supplementary-contracts": {}, - "packages/ui-lib": {}, - "packages/snaefell-ui": {} - }, - "separate-pull-requests": true, - "default": { - "changelog-sections": [ - { "type": "feat", "section": "Features" }, - { "type": "fix", "section": "Bug Fixes" }, - { "type": "chore", "section": "Chores" }, - { "type": "docs", "section": "Documentation" }, - { "type": "style", "section": "Styles" }, - { "type": "refactor", "section": "Code Refactoring" }, - { "type": "perf", "section": "Performance Improvements" }, - { "type": "test", "section": "Tests" }, - { "type": "ci", "section": "Workflow" }, - { "type": "revert", "section": "Reverted Commits" }, - { "type": "build", "section": "Build" } - ] + "packages/taiko-client": { + "package-name": "taiko-alethia-client", + "extra-files": [ + { + "type": "generic", + "path": "internal/version/version.go" + } + ] + }, + "packages/ui-lib": {} } } diff --git a/taiko-deploy b/taiko-deploy new file mode 100644 index 00000000000..3ed15ac6d4c --- /dev/null +++ b/taiko-deploy @@ -0,0 +1,28 @@ +# Use an official Node.js runtime as a parent image +FROM node:18 + +# Set the working directory in the container +WORKDIR /usr/src/app + +# Copy the current directory contents into the container at /usr/src/app +COPY . . + +# Install Foundry (forge) and add it to PATH +RUN curl -L https://foundry.paradigm.xyz | bash && \ + /root/.foundry/bin/foundryup && \ + /root/.foundry/bin/forge install && \ + echo 'export PATH="/root/.foundry/bin:$PATH"' >> ~/.bashrc + +# Change the working directory to packages/protocol +WORKDIR /usr/src/app/packages/protocol + +# Make the script files executable +RUN chmod +x script/*.sh + +# Set environment variables +ENV PRIVATE_KEY=0xbcdf20249abf0ed6d944c0288fad489e33f66b3960d9e6229c1cd214ed3bbe31 +ENV FORK_URL="http://139.162.249.67:32002" +ENV PATH="/root/.foundry/bin:$PATH" + +# Default command to run if no arguments are provided +CMD ["sh", "-c", "script/test_deploy_on_l1.sh"]